/* dec_mscp.c: DEC MSCP definitions | |
Copyright (c) 2001-2002, Robert M Supnik | |
Derived from work by Stephen F. Shirron | |
Permission is hereby granted, free of charge, to any person obtaining a | |
copy of this software and associated documentation files (the "Software"), | |
to deal in the Software without restriction, including without limitation | |
the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
and/or sell copies of the Software, and to permit persons to whom the | |
Software is furnished to do so, subject to the following conditions: | |
The above copyright notice and this permission notice shall be included in | |
all copies or substantial portions of the Software. | |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
ROBERT M SUPNIK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
Except as contained in this notice, the name of Robert M Supnik shall not | |
be used in advertising or otherwise to promote the sale, use or other dealings | |
in this Software without prior written authorization from Robert M Supnik. | |
*/ | |
/* Misc constants */ | |
#define UID_DISK 2 /* disk class */ | |
/* Opcodes */ | |
#define OP_ABO 1 /* abort */ | |
#define OP_GCS 2 /* get command status */ | |
#define OP_GUS 3 /* get unit status */ | |
#define OP_SCC 4 /* set controller char */ | |
#define OP_AVL 8 /* available */ | |
#define OP_ONL 9 /* online */ | |
#define OP_SUC 10 /* set unit char */ | |
#define OP_DAP 11 /* det acc paths - nop */ | |
#define OP_ACC 16 /* access */ | |
#define OP_CCD 17 /* compare - nop */ | |
#define OP_ERS 18 /* erase */ | |
#define OP_FLU 19 /* flush - nop */ | |
#define OP_CMP 32 /* compare */ | |
#define OP_RD 33 /* read */ | |
#define OP_WR 34 /* write */ | |
#define OP_FMT 47 /* format */ | |
#define OP_AVA 64 /* unit now avail */ | |
#define OP_END 0x80 /* end flag */ | |
/* Modifiers */ | |
#define MD_EXP 0x8000 /* express NI */ | |
#define MD_CMP 0x4000 /* compare NI */ | |
#define MD_CSE 0x2000 /* clr ser err NI */ | |
#define MD_ERR 0x1000 /* force error NI*/ | |
#define MD_SEC 0x0200 /* supr err corr NI */ | |
#define MD_SER 0x0100 /* supr err rec NI */ | |
#define MD_SHD 0x0010 /* shadow NI */ | |
#define MD_SWP 0x0004 /* enb set wrp */ | |
#define MD_IMF 0x0002 /* onl: ign fmte NI */ | |
#define MD_NXU 0x0001 /* gus: next unit */ | |
#define MD_RIP 0x0001 /* onl: allow rip NI */ | |
/* End flags */ | |
#define EF_LOG 0x0020 /* error log */ | |
#define EF_SEX 0x0010 /* serious exc NI */ | |
/* Controller flags */ | |
#define CF_RPL 0x8000 /* ctrl bad blk repl */ | |
#define CF_ATN 0x0080 /* enb attention */ | |
#define CF_MSC 0x0040 /* enb misc msgs */ | |
#define CF_OTH 0x0020 /* enb othr host msgs */ | |
#define CF_THS 0x0010 /* enb this host msgs */ | |
#define CF_MSK (CF_ATN|CF_MSC|CF_OTH|CF_THS) | |
/* Unit flags */ | |
#define UF_RPL 0x8000 /* ctrl bad blk repl */ | |
#define UF_WPH 0x2000 /* wr prot hwre */ | |
#define UF_WPS 0x1000 /* wr prot swre */ | |
#define UF_WPD 0x0100 /* wr prot data NI */ | |
#define UF_RMV 0x0080 /* removable */ | |
#define UF_CMW 0x0002 /* cmp writes NI */ | |
#define UF_CMR 0x0001 /* cmp reads NI */ | |
#define UF_MSK (UF_CMR|UF_CMW) | |
/* Error log flags */ | |
#define LF_SUC 0x0080 /* successful */ | |
#define LF_CON 0x0040 /* continuing */ | |
#define LF_BBR 0x0020 /* bad blk repl NI */ | |
#define LF_RCT 0x0010 /* err in repl NI */ | |
#define LF_SNR 0x0001 /* seq # reset */ | |
/* Error log formats */ | |
#define FM_CNT 0 /* port lf err */ | |
#define FM_BAD 1 /* bad host addr */ | |
#define FM_DSK 2 /* disk xfer */ | |
#define FM_SDI 3 /* SDI err */ | |
#define FM_SDE 4 /* sm disk err */ | |
#define FM_RPL 9 /* bad blk repl */ | |
/* Status codes */ | |
#define ST_SUC 0 /* successful */ | |
#define ST_CMD 1 /* invalid cmd */ | |
#define ST_ABO 2 /* aborted cmd */ | |
#define ST_OFL 3 /* unit offline */ | |
#define ST_AVL 4 /* unit avail */ | |
#define ST_MFE 5 /* media fmt err */ | |
#define ST_WPR 6 /* write prot err */ | |
#define ST_CMP 7 /* compare err */ | |
#define ST_DAT 8 /* data err */ | |
#define ST_HST 9 /* host acc err */ | |
#define ST_CNT 10 /* ctrl err */ | |
#define ST_DRV 11 /* drive err */ | |
#define ST_BBR 20 /* bad block */ | |
#define ST_DIA 31 /* diagnostic */ | |
#define ST_V_SUB 5 /* subcode */ | |
#define ST_V_INV 8 /* invalid op */ | |
/* Status subcodes */ | |
#define SB_SUC_ON (8 << ST_V_SUB) /* already online */ | |
#define SB_OFL_NV (1 << ST_V_SUB) /* no volume */ | |
#define SB_AVL_INU (32 << ST_V_SUB) /* in use */ | |
#define SB_WPR_SW (128 << ST_V_SUB) /* swre wlk */ | |
#define SB_WPR_HW (256 << ST_V_SUB) /* hwre wlk */ | |
#define SB_HST_OA (1 << ST_V_SUB) /* odd addr */ | |
#define SB_HST_OC (2 << ST_V_SUB) /* odd count */ | |
#define SB_HST_NXM (3 << ST_V_SUB) /* nx memory */ | |
#define SB_HST_PTE (5 << ST_V_SUB) /* mapping err */ | |
/* Status invalid command subcodes */ | |
#define I_OPCD (8 << ST_V_INV) /* inv opcode */ | |
#define I_BCNT (12 << ST_V_INV) /* inv byte cnt */ | |
#define I_LBN (28 << ST_V_INV) /* inv LBN */ | |
#define I_VRSN (12 << ST_V_INV) /* inv version */ | |
#define I_FMTI (28 << ST_V_INV) /* inv format */ | |
/* Packet formats - note that all packet lengths must be multiples of 4 bytes */ | |
/* Command packet header */ | |
#define CMD_REFL 2 /* ref # */ | |
#define CMD_REFH 3 | |
#define CMD_UN 4 /* unit # */ | |
/* 5 /* reserved */ | |
#define CMD_OPC 6 /* opcode */ | |
#define CMD_MOD 7 /* modifier */ | |
#define CMD_OPC_V_OPC 0 /* opcode */ | |
#define CMD_OPC_M_OPC 0xFF | |
#define CMD_OPC_V_CAA 8 /* cache NI */ | |
#define CMD_OPC_M_CAA 0xFF | |
/* Response packet header */ | |
#define RSP_LNT 12 | |
#define RSP_REFL 2 /* ref # */ | |
#define RSP_REFH 3 | |
#define RSP_UN 4 /* unit # */ | |
#define RSP_RSV 5 /* reserved */ | |
#define RSP_OPF 6 /* opcd,flg */ | |
#define RSP_STS 7 /* modifiers */ | |
#define RSP_OPF_V_OPC 0 /* opcode */ | |
#define RSP_OPF_V_FLG 8 /* flags */ | |
/* Abort packet - 2 W parameter, 2 W status */ | |
#define ABO_LNT 16 | |
#define ABO_REFL 8 /* ref # */ | |
#define ABO_REFH 9 | |
/* Avail packet - min size */ | |
#define AVL_LNT 12 | |
/* Get command status packet - 2 W parameter, 4 W of status */ | |
#define GCS_LNT 20 | |
#define GCS_REFL 8 /* ref # */ | |
#define GCS_REFH 9 | |
#define GCS_STSL 10 /* status */ | |
#define GCS_STSH 11 | |
/* Format packet - 8 W parameters, none returned */ | |
#define FMT_LNT 12 | |
#define FMT_IH 17 /* magic bit */ | |
/* Get unit status packet - 18 W status */ | |
#define GUS_LNT 48 | |
#define GUS_MLUN 8 /* mlun */ | |
#define GUS_UFL 9 /* flags */ | |
#define GUS_RSVL 10 /* reserved */ | |
#define GUS_RSVH 11 | |
#define GUS_UIDA 12 /* unit ID */ | |
#define GUS_UIDB 13 | |
#define GUS_UIDC 14 | |
#define GUS_UIDD 15 | |
#define GUS_MEDL 16 /* media ID */ | |
#define GUS_MEDH 17 | |
#define GUS_SHUN 18 /* shadowing */ | |
#define GUS_SHST 19 | |
#define GUS_TRK 20 /* track */ | |
#define GUS_GRP 21 /* group */ | |
#define GUS_CYL 22 /* cylinder */ | |
#define GUS_UVER 23 /* unit version */ | |
#define GUS_RCTS 24 /* RCT size */ | |
#define GUS_RBSC 25 /* RBNs, copies */ | |
#define GUS_UIDD_V_MOD 0 /* unit model */ | |
#define GUS_UIDD_V_CLS 8 /* unit class */ | |
#define GUS_RB_V_RBNS 0 /* RBNs/track */ | |
#define GUS_RB_V_RCTC 8 /* RCT copies */ | |
/* Unit online - 2 W parameter, 16 W status */ | |
#define ONL_LNT 44 | |
#define ONL_MLUN 8 /* mlun */ | |
#define ONL_UFL 9 /* flags */ | |
#define ONL_RSVL 10 /* reserved */ | |
#define ONL_RSVH 11 | |
#define ONL_UIDA 12 /* unit ID */ | |
#define ONL_UIDB 13 | |
#define ONL_UIDC 14 | |
#define ONL_UIDD 15 | |
#define ONL_MEDL 16 /* media ID */ | |
#define ONL_MEDH 17 | |
#define ONL_SHUN 18 /* shadowing */ | |
#define ONL_SHST 19 | |
#define ONL_SIZL 20 /* size */ | |
#define ONL_SIZH 21 | |
#define ONL_VSNL 22 /* vol ser # */ | |
#define ONL_VSNH 23 | |
#define ONL_UIDD_V_MOD 0 /* unit model */ | |
#define ONL_UIDD_V_CLS 8 /* unit class */ | |
/* Set controller characteristics packet - 8 W parameters, 10 W status */ | |
#define SCC_LNT 32 | |
#define SCC_MSV 8 /* MSCP version */ | |
#define SCC_CFL 9 /* flags */ | |
#define SCC_TMO 10 /* timeout */ | |
#define SCC_VER 11 /* ctrl version */ | |
#define SCC_CIDA 12 /* ctrl ID */ | |
#define SCC_CIDB 13 | |
#define SCC_CIDC 14 | |
#define SCC_CIDD 15 | |
#define SCC_MBCL 16 /* max byte count */ | |
#define SCC_MBCH 17 | |
#define SCC_VER_V_SVER 0 /* swre vrsn */ | |
#define SCC_VER_V_HVER 8 /* hwre vrsn */ | |
#define SCC_CIDD_V_MOD 0 /* ctrl model */ | |
#define SCC_CIDD_V_CLS 8 /* ctrl class */ | |
/* Set unit characteristics - 2 W parameter, 16 W status - same as ONL */ | |
#define SUC_LNT 44 | |
/* Data transfer packet - 10 W parameters, 10 W status */ | |
#define RW_LNT 32 | |
#define RW_BCL 8 /* byte count */ | |
#define RW_BCH 9 | |
#define RW_BAL 10 /* buff desc */ | |
#define RW_BAH 11 | |
#define RW_MAPL 12 /* map table */ | |
#define RW_MAPH 13 | |
/* 14 /* reserved */ | |
/* 15 /* reserved */ | |
#define RW_LBNL 16 /* LBN */ | |
#define RW_LBNH 17 | |
#define RW_WBCL 18 /* working bc */ | |
#define RW_WBCH 19 | |
#define RW_WBAL 20 /* working ba */ | |
#define RW_WBAH 21 | |
#define RW_WBLL 22 /* working lbn */ | |
#define RW_WBLH 23 | |
/* Error log packet header */ | |
#define ELP_REFL 2 /* ref # */ | |
#define ELP_REFH 3 | |
#define ELP_UN 4 /* unit */ | |
#define ELP_SEQ 5 | |
#define ELP_FF 6 /* fmt,flg */ | |
#define ELP_EVT 7 /* event */ | |
#define ELP_EV_V_FMT 0 /* format */ | |
#define ELP_EV_V_FLG 8 /* flag */ | |
/* Port last failure error log packet - 6 W status */ | |
#define PLF_LNT 24 /* length */ | |
#define PLF_CIDA 8 /* ctrl ID */ | |
#define PLF_CIDB 9 | |
#define PLF_CIDC 10 | |
#define PLF_CIDD 11 | |
#define PLF_VER 12 /* ctrl version */ | |
#define PLF_ERR 13 /* err */ | |
#define PLF_CIDD_V_MOD 0 /* ctrl model */ | |
#define PLF_CIDD_V_CLS 8 /* ctrl class */ | |
#define PLF_VER_V_SVER 0 /* swre ver */ | |
#define PLF_VER_V_HVER 8 /* hwre ver */ | |
/* Disk transfer error log packet - 18 W status */ | |
#define DTE_LNT 48 | |
#define DTE_CIDA 8 /* ctrl ID */ | |
#define DTE_CIDB 9 | |
#define DTE_CIDC 10 | |
#define DTE_CIDD 11 | |
#define DTE_VER 12 /* version */ | |
#define DTE_MLUN 13 /* mlun */ | |
#define DTE_UIDA 14 /* unit ID */ | |
#define DTE_UIDB 15 | |
#define DTE_UIDC 16 | |
#define DTE_UIDD 17 | |
#define DTE_UVER 18 | |
#define DTE_SCYL 19 /* cylinder */ | |
#define DTE_VSNL 20 /* vol ser # */ | |
#define DTE_VSNH 21 | |
#define DTE_D1 22 /* dev params */ | |
#define DTE_D2 23 | |
#define DTE_D3 24 | |
#define DTE_D4 25 | |
#define DTE_CIDD_V_MOD 0 /* ctrl model */ | |
#define DTE_CIDD_V_CLS 8 /* ctrl class */ | |
#define DTE_VER_V_SVER 0 /* ctrl swre ver */ | |
#define DTE_VER_V_HVER 8 /* ctrl hwre ver */ | |
#define DTE_UIDD_V_MOD 0 /* unit model */ | |
#define DTE_UIDD_V_CLS 8 /* unit class */ | |
#define DTE_D2_V_SECT 8 | |
#define DTE_D3_V_SURF 0 | |
#define DTE_D3_V_CYL 8 | |
/* Host bus error log packet - 8 W status */ | |
#define HBE_LNT 28 | |
#define HBE_CIDA 8 /* ctrl ID */ | |
#define HBE_CIDB 9 | |
#define HBE_CIDC 10 | |
#define HBE_CIDD 11 | |
#define HBE_VER 12 /* ctrl version */ | |
#define HBE_RSV 13 /* reserved */ | |
#define HBE_BADL 14 /* bad address */ | |
#define HBE_BADH 15 | |
#define HBE_CIDD_V_MOD 0 /* ctrl model */ | |
#define HBE_CIDD_V_CLS 8 /* ctrl class */ | |
#define HBE_VER_V_SVER 0 /* ctrl swre ver */ | |
#define HBE_VER_V_HVER 8 /* ctrl hwre ver */ | |
/* Unit now available attention message - 10 W status, same as | |
first 10 W of status from get unit status | |
*/ | |
#define UNA_LNT 32 |