Annotation of researchv10dc/lsys/sys/mscp.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * DSA Mass Storage Control Protocol packet formats
                      3:  */
                      4: 
                      5: typedef union {
                      6:        long    SL_l;
                      7:        short   SL_s[2];
                      8: } _SL;
                      9: 
                     10: /*
                     11:  * arbitrary (port specific) buffer descriptor
                     12:  * this is arranged for the convenience of non-buffer-using packets
                     13:  * specific port drivers should cast it into whatever
                     14:  * their particular addressing structure requires
                     15:  */
                     16: 
                     17: typedef union {
                     18:        long    BD_l[3];
                     19:        short   BD_s[6];
                     20:        struct {
                     21:                long BD_pl;
                     22:                long BD_q[2];   /* quadword at the end */
                     23:        } BD_x;
                     24: } BUFDESC;
                     25: 
                     26: /*
                     27:  * command packet
                     28:  */
                     29: 
                     30: struct mscmd {
                     31:        long    m_crf;          /* reference number */
                     32:        short   m_unit;         /* device unit number */
                     33:        short   m__r0;
                     34:        char    m_opcd;         /* command opcode */
                     35:        char    m__r1;
                     36:        short   m_mod;          /* modifiers to opcode */
                     37:        _SL     m__u0;
                     38: #define        m_bcnt  m__u0.SL_l      /* byte count */
                     39: #define        m_otrf  m_bcnt          /* or, outstanding reference number */
                     40: #define        m_rbn   m_bcnt          /* or, replacement block number */
                     41: #define        m_vrsn  m__u0.SL_s[0]   /* or, mscp version number */
                     42: #define        m_cntf  m__u0.SL_s[1]   /* and controller flags */
                     43: #define        m_rcnt  m__u0.SL_l      /* or, record count */
                     44: #define        m_unfl  m__u0.SL_s[1]   /* unit flags */
                     45:        BUFDESC m_buff;         /* buffer descriptor */
                     46: #define        m_htmo  m_buff.BD_s[0]  /* or, host timeout interval */
                     47: #define        m_time  m_buff.BD_x.BD_q        /* and two longwords of time */
                     48: #define        m_fcnt  m_buff.BD_l[0]  /* or, file count */
                     49:        long    m_lbn;          /* block number */
                     50: #define        m_dvpm  m_lbn           /* device dependent online parameters */
                     51:        short   m_fmt;          /* tmscp device format */
                     52: };
                     53: 
                     54: /*
                     55:  * end/attn message
                     56:  */
                     57: 
                     58: struct msend {
                     59:        long    m_crf;          /* reference number */
                     60:        short   m_unit;         /* device unit number */
                     61:        short   m__r0;
                     62:        char    m_opcd;         /* endcode */
                     63:        char    m_flgs;         /* end message flags */
                     64:        short   m_sts;          /* status bits */
                     65:        _SL     m__u0;
                     66: #define        m_bcnt  m__u0.SL_l      /* byte count */
                     67: #define        m_otfl  m__u0.SL_l      /* or, outstanding cmd ref number */
                     68: #define        m_vrsn  m__u0.SL_s[0]   /* or, mscp version number */
                     69: #define        m_cntf  m__u0.SL_s[1]   /* and controller flags */
                     70: #define        m_mlun  m__u0.SL_s[0]   /* or, multi-unit code */
                     71: #define        m_unfl  m__u0.SL_s[1]   /* and unit flags */
                     72:        BUFDESC m_buff;         /* buffer descriptor */
                     73: #define        m_cmst  m_buff.BD_l[0]  /* or, command status */
                     74: #define        m_unti  m_buff.BD_x.BD_q        /* and quadword unit id */
                     75: #define        m_cnti  m_buff.BD_x.BD_q        /* or quadword controller id */
                     76: #define        m_ctmo  m_buff.BD_s[0]  /* or, controller timeout */
                     77:        long    m_fbbk;         /* first bad block encountered */
                     78: #define        m_medi  m_fbbk          /* or, media type id */
                     79:        short   m_shun;         /* shadow unit */
                     80:        short   m__r2;
                     81:        _SL     m__u1;
                     82: #define        m_unsz  m__u1.SL_l      /* unit size */
                     83: #define        m_trck  m__u1.SL_s[0]   /* or, track size */
                     84: #define        m_grp   m__u1.SL_s[1]   /* and group size */
                     85: #define        m_menu  m__u1.SL_s[0]   /* or, format menu (and group size?) */
                     86:        _SL     m__u2;
                     87: #define        m_vser  m__u2.SL_l      /* volume serial number */
                     88: #define        m_cyl   m__u2.SL_s[0]   /* or, cylinder size */
                     89:        short   m_rcts;         /* size of RCT */
                     90:        char    m_rbns;         /* replacement blocks per track */
                     91:        char    m_rctc;         /* number of copies of replacement table */
                     92: };
                     93: 
                     94: /*
                     95:  * opcodes
                     96:  */
                     97: 
                     98: #define        OPGUS   03      /* get unit status */
                     99: #define        OPSCC   04      /* set controller characteristics */
                    100: #define        OPSEX   07      /* serious exception */
                    101: #define        OPAVL   010     /* available */
                    102: #define        OPONL   011     /* online */
                    103: #define        OPSUC   012     /* set unit characteristics */
                    104: #define        OPFLS   023     /* flush cache ? */
                    105: #define        OPRPL   024     /* replace bad block */
                    106: #define        OPRD    041     /* read */
                    107: #define        OPWR    042     /* write */
                    108: #define        OPWRM   044     /* write tape mark */
                    109: #define        OPPOS   045     /* reposition tape */
                    110: #define        OPAVA   0100    /* available attn */
                    111: #define        OPEND   0200    /* end flag */
                    112: 
                    113: #define        MDPRI   01      /* OPRPL: primary replacement block */
                    114: #define        MDSPD   01      /* OPAVL: spin down */
                    115: #define        MDREW   02      /* OPAVL: rewind */
                    116: #define        MDOBJ   04      /* OPPOS: object count */
                    117: #define        MDREV   010     /* OPPOS: reverse */
                    118: #define        MDUNL   020     /* OPPOS: unload */
                    119: #define        MDXCL   040     /* OPONL: exclusive access */
                    120: #define        MDIMM   0100    /* some TMSCP: do it now */
                    121: #define        MDCSX   020000  /* any: clear serious exception */
                    122: #define        MDCDL   010000  /* many: clear cache data loss woe */
                    123: 
                    124: /*
                    125:  * status codes
                    126:  */
                    127: 
                    128: #define        STMSK   037     /* mask for generic status code */
                    129: #define        STSUC   0       /* success */
                    130: #define        STCMD   1       /* invalid command */
                    131: #define        STABO   2       /* aborted */
                    132: #define        STOFL   3       /* unit offline */
                    133: #define        STAVL   4       /* unit available */
                    134: #define        STMFE   5       /* media format error */
                    135: #define        STWPR   6       /* write protected */
                    136: #define        STCMP   7       /* compare error */
                    137: #define        STDAT   010     /* data error */
                    138: #define        STHST   011     /* host data access error */
                    139: #define        STCNT   012     /* controller error */
                    140: #define        STDRV   013     /* drive error */
                    141: #define        STTPM   016     /* tape mark encountered */
                    142: #define        STRDT   020     /* tape record truncated */
                    143: #define        STPL    021     /* tape position lost */
                    144: #define        STSEX   022     /* serious exception */
                    145: #define        STDIA   037     /* internal diagnostic message */
                    146: 
                    147: #define        STRST   0377    /* our software only -- controller reset */
                    148: #define        STBCK   STDAT   /* us design optical disk: blank check */
                    149: #define        STBK2   0x48    /* someone else's blank check */
                    150: 
                    151: /*
                    152:  * end message flags
                    153:  */
                    154: 
                    155: #define        EFCDL   02      /* TMSCP: cached data lost */
                    156: #define        EFEOT   010     /* TMSCP: encountered end-of-tape */
                    157: 
                    158: #define        MSCPVER 0       /* MSCP version number */
                    159: 
                    160: /*
                    161:  * controller flags
                    162:  */
                    163: 
                    164: #define        CFATN   0200    /* enable attention messages */
                    165: #define        CFMSC   0100    /* enable misc error log messages */
                    166: #define        CFOTH   040     /* enable other hosts' errors */
                    167: #define        CFTHS   020     /* enable this host's errors */
                    168: 
                    169: /*
                    170:  * unit flags
                    171:  */
                    172: 
                    173: #define        UFWBK   0100    /* tape: enable write-back */
                    174: #define        UFWPH   020000  /* write-protected in hardware */
                    175: 
                    176: /*
                    177:  * TMSCP densities
                    178:  * m_fmt
                    179:  */
                    180: 
                    181: #define        TFMASK  0377    /* mask for all tape format bits, without device type */
                    182: 
                    183: /*
                    184:  * error log packet
                    185:  */
                    186: 
                    187: struct mserl {
                    188:        long    l_crf;          /* command reference number */
                    189:        short   l_unit;         /* unit number */
                    190:        short   l_seq;          /* error sequence number */
                    191:        char    l_fmt;          /* format of packet */
                    192:        char    l_flgs;
                    193:        short   l_evnt;         /* event code */
                    194:        long    l_cnti[2];      /* controller id */
                    195:        char    l_csvr;         /* ctl software version */
                    196:        char    l_chvr;         /* ctl hardware version */
                    197:        short   l_mlun;         /* multi-unit code */
                    198:        long    l_unti[2];      /* unit id */
                    199: #define        l_badr  l_unti[0]       /* or, bad memory address */
                    200:        char    l_usvr;         /* unit software version */
                    201:        char    l_uhvr;         /* unit hardware version */
                    202:        char    l_lvl;          /* transfer error level */
                    203:        char    l_rtry;         /* transfer error retry */
                    204:        long    l_vser;         /* volume serial number */
                    205:        long    l_hdcd;         /* header code */
                    206:        long    l_sdi[3];       /* sdi info */
                    207: };
                    208: 
                    209: /*
                    210:  * format codes (l_fmt)
                    211:  */
                    212: 
                    213: #define        FMCNT   0       /* controller error */
                    214: #define        FMBAD   1       /* host buffer address error */
                    215: #define        FMDSK   2       /* disk transfer error */
                    216: #define        FMSDI   3       /* SDI error */
                    217: #define        FMSMD   4       /* small disk error */
                    218: #define        FMTAPE  5       /* tape transfer error */
                    219: #define        FMSTC   6       /* STI communication error */
                    220: #define        FMSTD   7       /* STI drive error */
                    221: #define        FMSTF   8       /* STI formatter error */
                    222: #define        FMRPL   9       /* bad block replacement by controller */
                    223: 
                    224: /*
                    225:  * flags
                    226:  */
                    227: 
                    228: #define        LFSUC   0200    /* operation successful */
                    229: #define        LFCON   0100    /* operation continuing */
                    230: #define        LFRPR   040     /* bad block replacement required */
                    231: #define        LFRPE   020     /* error during bad block replacement */
                    232: #define        LFSNR   01      /* sequence number reset */
                    233: 
                    234: /*
                    235:  * purely software things:
                    236:  * table of entry points for a port driver
                    237:  *
                    238:  * the idea is
                    239:  *     call init at open time
                    240:  *     to do io, call get to get a packet; fill it in;
                    241:  *     call map to set up io mapping if it's a read or write;
                    242:  *     call send to send the mscp packet to the controller.
                    243:  *     if there's no map associated, that's it;
                    244:  *     the packet is freed when the controller takes it.
                    245:  *     if there's a map, the packet isn't freed until unmap is called
                    246:  *     to flush and free up the map too
                    247:  */
                    248: 
                    249: struct msportsw {
                    250:        int (*mp_init)();               /* init the port, if needed */
                    251:        struct mscmd *(*mp_get)();      /* get a packet */
                    252:        int (*mp_map)();                /* store mapping into packet */
                    253:        int (*mp_send)();               /* send packet */
                    254:        int (*mp_unmap)();              /* free mapping resources and packet */
                    255: };
                    256: 
                    257: #ifdef KERNEL
                    258: extern struct msportsw *msportsw[];
                    259: extern int nmsport;
                    260: #endif
                    261: 
                    262: /*
                    263:  * address token for class drivers;
                    264:  * indexed by (minor device) unit number
                    265:  */
                    266: 
                    267: struct msaddr {
                    268:        char ctl;       /* which controller */
                    269:        char ctype;     /* type of controller */
                    270:        short unit;     /* MSCP unit number thereon */
                    271: };
                    272: 
                    273: #define        MSMAXID 2       /* number of connection IDs */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.