home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Headers / bsd / dev / scsireg.h < prev    next >
Text File  |  1997-04-27  |  28KB  |  1,003 lines

  1. /*    @(#)scsireg.h    1.0    10/23/89    (c) 1989 NeXT    */
  2. /*
  3.  * scsireg.h -- generic SCSI definitions
  4.  * KERNEL VERSION
  5.  *
  6.  * HISTORY
  7.  * 13-Jun-95    dmitch at NeXT
  8.  *    Added SCSI-3 types.
  9.  * 10-Feb-93       dmitch
  10.  *    Added generic endian/alignment #ifdef's.
  11.  * 17-May-90    dmitch
  12.  *    Added SDIOCGETCAP
  13.  * 30-Apr-90    dmitch
  14.  *    Added C6S_SS_START, C6S_SS_STOP, C6S_SS_EJECT, SR_IOST_VOLNA
  15.  * 30-Oct-89    dmitch
  16.  *    Deleted private #defines (--> scsivar.h)
  17.  * 25-Sep-89    dmitch at NeXT
  18.  *    Added scsi_req, support for sg and st drivers
  19.  * 10-Sept-87      Mike DeMoney (mike) at NeXT
  20.  *    Created.
  21.  */
  22.  
  23. #ifndef _BSD_DEV_SCSIREG_
  24. #define    _BSD_DEV_SCSIREG_
  25.  
  26. #import <sys/ioctl.h>
  27. #import <sys/time.h>
  28. #import <kernserv/queue.h>
  29. #import <sys/types.h>
  30.  
  31. /*
  32.  * status byte definitions
  33.  */
  34. #define    STAT_GOOD        0x00    /* cmd successfully completed */
  35. #define    STAT_CHECK        0x02    /* abnormal condition occurred */
  36. #define    STAT_CONDMET        0x04    /* condition met / good */
  37. #define    STAT_BUSY        0x08    /* target busy */
  38. #define    STAT_INTMGOOD        0x10    /* intermediate / good */
  39. #define    STAT_INTMCONDMET    0x14    /* intermediate / cond met / good */
  40. #define    STAT_RESERVED        0x18    /* reservation conflict */
  41.  
  42. #define    STAT_MASK        0x1e    /* clears vendor unique bits */
  43.  
  44.  
  45. /*
  46.  * SCSI command descriptor blocks
  47.  * (Any device level driver doing fancy things will probably define
  48.  * these locally and cast a pointer on top of the sd_cdb.  We define
  49.  * them here to reserve the appropriate space, driver level routines
  50.  * can use them if they want.)
  51.  *
  52.  * 6 byte command descriptor block, random device
  53.  */
  54. typedef struct cdb_6 {
  55. #if    __BIG_ENDIAN__
  56.     u_int    c6_opcode:8,        /* device command */
  57.         c6_lun:3,        /* logical unit */
  58.         c6_lba:21;        /* logical block number */
  59.     u_char    c6_len;            /* transfer length */
  60.     u_char    c6_ctrl;        /* control byte */
  61.  
  62. #elif    __LITTLE_ENDIAN__
  63.     u_char    c6_opcode;
  64.     u_char    c6_lba2        :5,
  65.         c6_lun        :3;
  66.     u_char    c6_lba1;
  67.     u_char    c6_lba0;
  68.     u_char    c6_len;
  69.     u_char    c6_ctrl;
  70.  
  71. #else
  72. #error    SCSI command / data structures are compiler sensitive
  73. #endif
  74. } cdb_6_t;
  75.  
  76. #define CDB_6_MAX_LENGTH        (255)           /* max block count */
  77. #define CDB_6_MAX_LBA           ((1 << 21) - 1) /* max block address */
  78.  
  79. /*
  80.  * 6 byte command descriptor block, sequential device
  81.  */
  82. typedef struct cdb_6s {
  83. #if    __BIG_ENDIAN__
  84. #if    __NATURAL_ALIGNMENT__
  85.  
  86.     u_char    c6s_opcode:8;        /* device command */
  87.     u_char  c6s_lun:3,        /* logical unit */
  88.         c6s_spare:3,        /* reserved */
  89.         c6s_opt:2;        /* bits 1..0 - space type, fixed, 
  90.                      *    etc. */ 
  91.     /*
  92.      * Careful, natural alignment...
  93.      */
  94.     u_char     c6s_len[3];         /* transfer length */
  95.     u_char    c6s_ctrl;        /* control byte */
  96.  
  97. #else    __NATURAL_ALIGNMENT__
  98.  
  99.  
  100.     u_char    c6s_opcode:8;        /* device command */
  101.     u_char  c6s_lun:3,        /* logical unit */
  102.         c6s_spare:3,        /* reserved */
  103.         c6s_opt:2;        /* bits 1..0 - space type, fixed, 
  104.                      *    etc. */ 
  105.     u_int    c6s_len:24,        /* transfer length */
  106.         c6s_ctrl:8;        /* control byte */
  107. #endif    __NATURAL_ALIGNMENT__
  108.  
  109.  
  110. #elif    __LITTLE_ENDIAN__
  111.     u_char    c6s_opcode;
  112.     u_char    c6s_opt        :2,
  113.         c6s_spare    :3,
  114.         c6s_lun        :3;
  115.     u_char    c6s_len2;
  116.     u_char    c6s_len1;
  117.     u_char    c6s_len0;
  118.     u_char    c6s_ctrl;
  119.  
  120. #else    
  121. #error    SCSI command / data structures are compiler sensitive
  122. #endif
  123. } cdb_6s_t;
  124.  
  125.  
  126. /*
  127.  * 10 byte command descriptor block
  128.  * This definition is machine dependent due to an int on a short boundary.
  129.  */
  130. typedef struct cdb_10 {
  131. #if    __BIG_ENDIAN__
  132. #if    __NATURAL_ALIGNMENT__
  133.         u_char  c10_opcode;             /* device command */
  134.         u_char  c10_lun:3,              /* logical unit */
  135.                 c10_dp0:1,              /* disable page out */
  136.                 c10_fua:1,              /* force unit access */
  137.                 c10_mbz1:2,             /* reserved: must be zero */
  138.                 c10_reladr:1;           /* addr relative to prev 
  139.                             * linked cmd */
  140.     /*
  141.      * Careful, this can't be an int due to natural alignment...
  142.      */
  143.         u_char    c10_lba[4];             /* logical block number */
  144.         u_char    c10_mbz2:8;          /* reserved: must be zero */
  145.     u_char     c10_len[2];         /* transfer length */
  146.     u_char    c10_ctrl;        /* control byte */
  147.  
  148. #else    __NATURAL_ALIGNMENT__
  149.  
  150.     u_char    c10_opcode;        /* device command */
  151.     u_char    c10_lun:3,        /* logical unit */
  152.         c10_dp0:1,        /* disable page out (cache control) */
  153.         c10_fua:1,        /* force unit access (cache control) */
  154.         c10_mbz1:2,        /* reserved: must be zero */
  155.         c10_reladr:1;        /* addr relative to prev linked cmd */
  156.     u_int    c10_lba;        /* logical block number */
  157.     u_int    c10_mbz2:8,        /* reserved: must be zero */
  158.         c10_len:16,        /* transfer length */
  159.         c10_ctrl:8;        /* control byte */
  160.         
  161. #endif    __NATURAL_ALIGNMENT__
  162. #elif    __LITTLE_ENDIAN__
  163.  
  164.     u_char    c10_opcode;
  165.     u_char    c10_reladr    :1,
  166.         c10_mbz1    :2,
  167.         c10_fua        :1,
  168.         c10_dp0        :1,
  169.         c10_lun        :3;
  170.     u_char    c10_lba3;
  171.     u_char    c10_lba2;
  172.     u_char    c10_lba1;
  173.     u_char    c10_lba0;
  174.     u_char    c10_mbz2;
  175.     u_char    c10_len1;
  176.     u_char    c10_len0;
  177.     u_char    c10_ctrl;
  178.  
  179. #else
  180. #error    SCSI command / data structures are compiler sensitive
  181. #endif
  182. } cdb_10_t;
  183.  
  184. /*
  185.  * 12 byte command descriptor block
  186.  * This definition is machine dependent due to an int on a short boundary.
  187.  */
  188. typedef struct cdb_12 {
  189. #if    __BIG_ENDIAN__
  190. #if    __NATURAL_ALIGNMENT__
  191.  
  192.         u_char    c12_opcode;        /* device command */
  193.         u_char    c12_lun:3,        /* logical unit */
  194.         c12_dp0:1,              /* disable page out */
  195.         c12_fua:1,              /* force unit access */
  196.         c12_mbz1:2,             /* reserved: must be zero */
  197.         c12_reladr:1;           /* addr relative to prev 
  198.                      * linked cmd */
  199.         u_char    c12_lba[4];             /* logical block number */
  200.         u_char    c12_mbz2;         /* reserved: must be zero */
  201.         u_char    c12_mbz3;        /* reserved: must be zero */
  202.         u_char    c12_mbz4;         /* reserved: must be zero */
  203.         u_char    c12_len[2];        /* transfer length */
  204.         u_char    c12_ctrl:8;             /* control byte */
  205.  
  206. #else    __NATURAL_ALIGNMENT__
  207.  
  208.     u_char    c12_opcode;        /* device command */
  209.     u_char    c12_lun:3,        /* logical unit */
  210.         c12_dp0:1,        /* disable page out (cache control) */
  211.         c12_fua:1,        /* force unit access (cache control) */
  212.         c12_mbz1:2,        /* reserved: must be zero */
  213.         c12_reladr:1;        /* addr relative to prev linked cmd */
  214.     u_int    c12_lba;        /* logical block number */
  215.     u_char    c12_mbz2;        /* reserved: must be zero */
  216.     u_char    c12_mbz3;        /* reserved: must be zero */
  217.     u_int    c12_mbz4:8,        /* reserved: must be zero */
  218.         c12_len:16,        /* transfer length */
  219.         c12_ctrl:8;        /* control byte */
  220.  
  221. #endif    __NATURAL_ALIGNMENT__
  222. #elif    __LITTLE_ENDIAN__
  223.  
  224.     u_char    c12_opcode;
  225.     u_char    c12_reladr    :1,
  226.         c12_mbz1    :2,
  227.         c12_fua        :1,
  228.         c12_dp0        :1,
  229.         c12_lun        :3;
  230.     u_char    c12_lba3;
  231.     u_char    c12_lba2;
  232.     u_char    c12_lba1;
  233.     u_char    c12_lba0;
  234.     u_char    c12_mbz2;
  235.     u_char    c12_mbz3;
  236.     u_char    c12_mbz4;
  237.     u_char    c12_len1;
  238.     u_char    c12_len0;
  239.     u_char    c12_ctrl;
  240.  
  241. #else
  242. #error    SCSI command / data structures are compiler sensitive
  243. #endif
  244. } cdb_12_t;
  245.  
  246. /*
  247.  * 16 byte command descriptor block (SCSI-3 only)
  248.  * This definition is machine dependent due to an int on a short boundary.
  249.  */
  250. typedef struct cdb_16 {
  251. #if    __BIG_ENDIAN__
  252. #if    __NATURAL_ALIGNMENT__
  253.  
  254.         u_char    c16_opcode;        /* device command */
  255.         u_char    c16_mbz1;               /* reserved: must be zero */
  256.         u_char    c16_lba[4];             /* logical block number */
  257.     u_char    c16_addl0;
  258.     u_char    c16_addl1;
  259.     u_char    c16_addl2;
  260.     u_char    c16_addl3;
  261.         u_char    c16_len[4];        /* transfer length */
  262.         u_char    c16_mbz2;               /* reserved: must be zero */
  263.         u_char    c16_ctrl;                 /* control byte */
  264.  
  265. #else    __NATURAL_ALIGNMENT__
  266.  
  267.     u_char    c16_opcode;        /* device command */
  268.         u_char    c16_mbz1;               /* reserved: must be zero */
  269.     u_int    c16_lba;        /* logical block number */
  270.     u_char    c16_addl0;
  271.     u_char    c16_addl1;
  272.     u_char    c16_addl2;
  273.     u_char    c16_addl3;
  274.     u_int    c16_len;        /* transfer length */
  275.         u_char    c16_mbz2;               /* reserved: must be zero */
  276.         u_char    c16_ctrl;                 /* control byte */
  277.  
  278. #endif    __NATURAL_ALIGNMENT__
  279. #elif    __LITTLE_ENDIAN__
  280.  
  281.     u_char    c16_opcode;
  282.         u_char    c16_mbz1;               /* reserved: must be zero */
  283.     u_char    c16_lba3;
  284.     u_char    c16_lba2;
  285.     u_char    c16_lba1;
  286.     u_char    c16_lba0;
  287.     u_char    c16_addl0;
  288.     u_char    c16_addl1;
  289.     u_char    c16_addl2;
  290.     u_char    c16_addl3;
  291.     u_char    c16_len3;
  292.     u_char    c16_len2;
  293.     u_char    c16_len1;
  294.     u_char    c16_len0;
  295.         u_char    c16_mbz2;               /* reserved: must be zero */
  296.         u_char    c16_ctrl;                 /* control byte */
  297.  
  298. #else
  299. #error    SCSI command / data structures are compiler sensitive
  300. #endif
  301. } cdb_16_t;
  302.  
  303.  
  304. typedef union cdb {
  305.     struct    cdb_6    cdb_c6;
  306.     struct  cdb_6s  cdb_c6s;
  307.     struct    cdb_10    cdb_c10;
  308.     struct    cdb_12    cdb_c12;
  309. } cdb_t;
  310.  
  311. /*
  312.  * SCSI-3 CDB union.
  313.  */
  314. typedef union scsi3_cdb {
  315.     struct    cdb_6    cdb_c6;
  316.     struct  cdb_6s  cdb_c6s;
  317.     struct    cdb_10    cdb_c10;
  318.     struct    cdb_12    cdb_c12;
  319.     struct    cdb_16    cdb_c16;
  320. } scsi3_cdb_t;
  321.  
  322.  
  323. #define    cdb_opcode    cdb_c6.c6_opcode    /* all opcodes in same place */
  324.  
  325. /*
  326.  * control byte values
  327.  */
  328. #define    CTRL_LINKFLAG        0x03    /* link and flag bits */
  329. #define    CTRL_LINK        0x01    /* link only */
  330. #define    CTRL_NOLINK        0x00    /* no command linking */
  331.  
  332. /*
  333.  * six byte cdb opcodes
  334.  * (Optional commands should only be used by formatters)
  335.  */
  336. #define    C6OP_TESTRDY        0x00    /* test unit ready */
  337. #define C6OP_REWIND        0x01    /* rewind */
  338. #define    C6OP_REQSENSE        0x03    /* request sense */
  339. #define    C6OP_FORMAT        0x04    /* format unit */
  340. #define    C6OP_REASSIGNBLK    0x07    /* OPT: reassign block */
  341. #define    C6OP_READ        0x08    /* read data */
  342. #define    C6OP_WRITE        0x0a    /* write data */
  343. #define    C6OP_SEEK        0x0b    /* seek */
  344. #define C6OP_READREV        0x0F    /* read reverse */
  345. #define C6OP_WRTFM        0x10    /* write filemarks */
  346. #define C6OP_SPACE        0x11    /* space records/filemarks */
  347. #define    C6OP_INQUIRY        0x12    /* get device specific info */
  348. #define C6OP_VERIFY        0x13    /* sequential verify */
  349. #define    C6OP_MODESELECT        0x15    /* OPT: set device parameters */
  350. #define    C6OP_MODESENSE        0x1a    /* OPT: get device parameters */
  351. #define    C6OP_STARTSTOP        0x1b    /* OPT: start or stop device */
  352. #define    C6OP_SENDDIAG        0x1d    /* send diagnostic */
  353.  
  354. /*
  355.  * ten byte cdb opcodes
  356.  */
  357. #define    C10OP_READCAPACITY    0x25    /* read capacity */
  358. #define    C10OP_READEXTENDED    0x28    /* read extended */
  359. #define    C10OP_WRITEEXTENDED    0x2a    /* write extended */
  360. #define    C10OP_READDEFECTDATA    0x37    /* OPT: read media defect info */
  361.  
  362.  
  363. /*
  364.  *    c6s_opt - options for 6-byte sequential device commands 
  365.  */
  366.  
  367. #define C6OPT_FIXED        0x01    /* fixed block transfer */
  368. #define C6OPT_LONG        0x01    /* 1 = erase to EOT */
  369. #define C6OPT_IMMED        0x01    /* immediate (for rewind, retension) */
  370. #define C6OPT_BYTECMP        0x02    /* byte compare for C6OP_VERIFY */
  371. #define C6OPT_SIL        0x02    /* suppress illegal length (Exabyte) */
  372. #define C6OPT_SPACE_LB        0x00    /* space logical blocks */
  373. #define C6OPT_SPACE_FM        0x01    /* space filemarks */
  374. #define C6OPT_SPACE_SFM        0x02    /* space sequential filemarks */
  375. #define C6OPT_SPACE_PEOD    0x03    /* space to physical end of data */    
  376.  
  377. /*    
  378.  *    other 6-byte sequential command constants
  379.  */
  380.  
  381. #define C6S_MAXLEN        0xFFFFFF    
  382. #define C6S_RETEN        0x02    /* byte 4 of load/unload - retension */
  383. #define C6S_LOAD        0x01    /* byte 4 of load/unload - load */
  384.  
  385. /*
  386.  * these go in the c6_len fields of start/stop command
  387.  */
  388. #define C6S_SS_START        0x01    /* start unit */
  389. #define C6S_SS_STOP        0x00    /* stop unit */
  390. #define C6S_SS_EJECT        0x02    /* eject disk */
  391.  
  392. /*
  393.  * extended sense data
  394.  * returned by C6OP_REQSENSE
  395.  */
  396. typedef struct esense_reply {
  397. #if    __BIG_ENDIAN__
  398.  
  399.     u_char    er_ibvalid:1,        /* information bytes valid */
  400.         er_class:3,        /* error class */
  401.         er_code:4;        /* error code */
  402.     u_char    er_segment;        /* segment number for copy cmd */
  403.     u_char    er_filemark:1,        /* file mark */
  404.         er_endofmedium:1,    /* end-of-medium */
  405.         er_badlen:1,        /* incorrect length */
  406.         er_rsvd2:1,        /* reserved */
  407.         er_sensekey:4;        /* sense key */
  408.     u_char    er_infomsb;        /* MSB of information byte */
  409.     u_int    er_info:24,        /* bits 23 - 0 of info "byte" */
  410.         er_addsenselen:8;    /* additional sense length */
  411.     u_int    er_rsvd8;        /* copy status (unused) */
  412.     u_char    er_addsensecode;    /* additional sense code */
  413.     
  414.     /* the following are used for tape only as of 27-Feb-89 */
  415.     
  416.     u_char    er_qualifier;        /* sense code qualifier */
  417.     u_char  er_rsvd_e;
  418.     u_char  er_rsvd_f;
  419.     u_int   er_err_count:24,    /* three bytes of data error counter */
  420.         er_stat_13:8;        /* byte 0x13 - discrete status bits */
  421.     u_char  er_stat_14;        /* byte 0x14 - discrete status bits */
  422.     u_char  er_stat_15;        /* byte 0x15 - discrete status bits */
  423.     
  424. #if    __NATURAL_ALIGNMENT__
  425.  
  426.     u_char    er_rsvd_16;
  427.     u_char    er_remaining[3];    /* bytes 0x17..0x19 - remaining tape */
  428.  
  429. #else    __NATURAL_ALIGNMENT__
  430.  
  431.     u_int   er_rsvd_16:8,
  432.         er_remaining:24;    /* bytes 0x17..0x19 - remaining tape */
  433.  
  434. #endif    __NATURAL_ALIGNMENT__
  435.  
  436. #elif    __LITTLE_ENDIAN__
  437.  
  438.     u_char    er_code        :4,
  439.         er_class    :3,
  440.         er_ibvalid    :1;
  441.     u_char    er_segment;
  442.     u_char    er_sensekey    :4,
  443.         er_rsvd2    :1,
  444.         er_badlen    :1,
  445.         er_endofmedium    :1,
  446.         er_filemark    :1;
  447.     u_char    er_info3;
  448.     u_char    er_info2;
  449.     u_char    er_info1;
  450.     u_char    er_info0;
  451.     u_char    er_addsenselen;
  452.     u_char    er_rsvd8[4];
  453.     u_char    er_addsensecode;
  454.  
  455.     u_char    er_qualifier;
  456.     u_char    er_rsvd_e;
  457.     u_char    er_rsvd_f;
  458.     u_char    er_err_count2;
  459.     u_char    er_err_count1;
  460.     u_char    er_err_count0;
  461.     u_char    er_stat_13;
  462.     u_char    er_stat_14;
  463.     u_char    er_stat_15;
  464.     u_char    er_rsvd_16;
  465.     u_char    er_remaining2;
  466.     u_char    er_remaining1;
  467.     u_char    er_remaining0;
  468.  
  469. #else
  470. #error    SCSI command / data structures are compiler sensitive
  471. #endif
  472.         
  473.     /* technically, there can be additional bytes of sense info
  474.      * here, but we don't check them, so we don't define them
  475.      */
  476. } esense_reply_t;
  477.  
  478. /*
  479.  * sense keys
  480.  */
  481. #define    SENSE_NOSENSE        0x0    /* no error to report */
  482. #define    SENSE_RECOVERED        0x1    /* recovered error */
  483. #define    SENSE_NOTREADY        0x2    /* target not ready */
  484. #define    SENSE_MEDIA        0x3    /* media flaw */
  485. #define    SENSE_HARDWARE        0x4    /* hardware failure */
  486. #define    SENSE_ILLEGALREQUEST    0x5    /* illegal request */
  487. #define    SENSE_UNITATTENTION    0x6    /* drive attention */
  488. #define    SENSE_DATAPROTECT    0x7    /* drive access protected */
  489. #define    SENSE_ABORTEDCOMMAND    0xb    /* target aborted command */
  490. #define    SENSE_VOLUMEOVERFLOW    0xd    /* eom, some data not transfered */
  491. #define    SENSE_MISCOMPARE    0xe    /* source/media data mismatch */
  492.  
  493. /*
  494.  * inquiry data
  495.  */
  496. typedef struct inquiry_reply {
  497.  
  498. #if    __BIG_ENDIAN__
  499.  
  500.     u_char    ir_qual:3,        /* qualifier */
  501.         ir_devicetype:5;    /* device type, see below */
  502.     u_char    ir_removable:1,        /* removable media */
  503.         ir_typequalifier:7;    /* device type qualifier */
  504.     u_char    ir_isoversion:2,    /* ISO  version number */
  505.         ir_ecmaversion:3,    /* ECMA version number */
  506.         ir_ansiversion:3;    /* ANSI version number */
  507.     u_char    ir_aerc:1,        /* Async event reporting capability */
  508.         ir_trmtsk:1,        /* Terminate Task */
  509.         ir_normaca:1,        /* Normal ACA supported */
  510.         ir_zero2:1,        /* reserved */
  511.         ir_rspdatafmt:4;    /* response data format */
  512.     u_char    ir_addlistlen;        /* additional list length */
  513.     u_char    ir_zero3;        /* reserved */
  514.     u_char    ir_zero4:2,        /* reserved */
  515.         ir_port:1,        /* port A/B */
  516.         ir_dualPort:1,        /* dual port supported */
  517.         ir_mchngr:1,        /* medium changer */
  518.         ir_ackqreqq:1,        /* Q cable (SIP only) */
  519.         ir_addr32:1,        /* 32-bit addressing (SIP only) */
  520.         ir_addr16:1;        /* 16-bit addressing (SIP only) */
  521.     u_char    ir_reladr:1,        /* relative addressing */
  522.         ir_wbus32:1,        /* 32-bit wide data transfers */
  523.         ir_wbus16:1,        /* 16-bit wide data transfers */
  524.         ir_sync:1,        /* synchronous data transfers */
  525.         ir_linked:1,        /* linked commands */
  526.         ir_trandis:1,        /* transfer disable */
  527.         ir_cmdque:1,        /* tagged command queuing */
  528.         ir_sftre:1;        /* soft reset */
  529.     char    ir_vendorid[8];        /* vendor name in ascii */
  530.     char    ir_productid[16];    /* product name in ascii */
  531.     char    ir_revision[4];        /* revision level info in ascii */
  532.     char    ir_misc[28];        /* misc info */
  533.     char    ir_endofid[1];        /* just a handle for end of id info */
  534.  
  535. #elif    __LITTLE_ENDIAN__
  536.  
  537.     u_char    ir_devicetype    :5,
  538.         ir_qual        :3;
  539.     u_char    ir_typequalifier:7,
  540.         ir_removable    :1;
  541.     u_char    ir_ansiversion    :3,
  542.         ir_ecmaversion    :3,
  543.         ir_isoversion    :2;
  544.     u_char    ir_rspdatafmt    :4,
  545.         ir_zero2:1,        /* reserved */
  546.         ir_normaca:1,        /* Normal ACA supported */
  547.         ir_trmtsk:1,        /* Terminate Task */
  548.         ir_aerc:1;        /* Async event reporting capability */
  549.     u_char    ir_addlistlen;
  550.     u_char    ir_zero3;
  551.     u_char    ir_addr16:1,        /* 16-bit addressing (SIP only) */
  552.         ir_addr32:1,        /* 32-bit addressing (SIP only) */
  553.         ir_ackqreqq:1,        /* Q cable (SIP only) */
  554.         ir_mchngr:1,        /* medium changer */
  555.         ir_dualPort:1,        /* dual port supported */
  556.         ir_port:1,        /* port A/B */
  557.         ir_zero4:2;        /* reserved */
  558.     u_char    ir_sftre:1,
  559.         ir_cmdque:1,
  560.         ir_trandis:1,        /* transfer disable */
  561.         ir_linked:1,
  562.         ir_sync:1,
  563.         ir_wbus16:1,
  564.         ir_wbus32:1,
  565.         ir_reladr:1;
  566.     u_char    ir_vendorid[8];
  567.     u_char    ir_productid[16];
  568.     u_char    ir_revision[4];
  569.     u_char    ir_misc[28];
  570.     u_char    ir_endofid[1];
  571.  
  572. #else
  573. #error    SCSI command / data structures are compiler sensitive
  574. #endif
  575. } inquiry_reply_t;
  576.  
  577. #define    DEVQUAL_OK        0x00    /* device is connected to this lun */
  578. #define    DEVQUAL_MIA        0x01    /* device not connected to lun */
  579. #define    DEVQUAL_RSVD        0x02    /* reserved */
  580. #define    DEVQUAL_NODEV        0x03    /* target doesn't support dev on lun */
  581. #define    DEVQUAL_VUMASK        0x04    /* 1XXb is vendor specific */
  582.  
  583.  
  584. #define    DEVTYPE_DISK        0x00    /* read/write disks */
  585. #define    DEVTYPE_TAPE        0x01    /* tapes and other sequential devices*/
  586. #define    DEVTYPE_PRINTER        0x02    /* printers */
  587. #define    DEVTYPE_PROCESSOR    0x03    /* cpu's */
  588. #define    DEVTYPE_WORM        0x04    /* write-once optical disks */
  589. #define    DEVTYPE_CDROM        0x05    /* cd rom's, etc */
  590. #define DEVTYPE_SCANNER        0x06
  591. #define DEVTYPE_OPTICAL        0x07    /* other optical storage */
  592. #define DEVTYPE_CHANGER        0x08    /* jukebox */
  593. #define DEVTYPE_COMM        0x09    /* communication device */
  594. #define DEVTYPE_GRAPH_A        0x0a    /* ASC IT8 graphics */
  595. #define DEVTYPE_GRAPH_B        0x0b    /* ASC IT8 graphics */
  596. #define DEVTYPE_RAID        0x0c    /* RAID controller */
  597. #define DEVTYPE_NOTPRESENT      0x1f    /* logical unit not present */
  598.  
  599. /*
  600.  * read capacity reply
  601.  */
  602. typedef struct capacity_reply {
  603.  
  604. #if    __BIG_ENDIAN__
  605.  
  606.     u_int    cr_lastlba;        /* last logical block address */
  607.     u_int    cr_blklen;        /* block length */
  608.  
  609. #elif    __LITTLE_ENDIAN__
  610.  
  611.     u_char    cr_lastlba3;
  612.     u_char    cr_lastlba2;
  613.     u_char    cr_lastlba1;
  614.     u_char    cr_lastlba0;
  615.  
  616.     u_char    cr_blklen3;
  617.     u_char    cr_blklen2;
  618.     u_char    cr_blklen1;
  619.     u_char    cr_blklen0;
  620.  
  621. #else
  622. #error    SCSI command / data structures are compiler sensitive
  623. #endif
  624. } capacity_reply_t;
  625.  
  626. /*
  627.  * Standard Mode Select/Mode Sense data structures
  628.  */
  629.  
  630. typedef struct mode_sel_hdr {
  631.  
  632. #if    __BIG_ENDIAN__
  633.  
  634.     u_char         msh_sd_length_0;    /* byte 0 - length (mode sense
  635.                          *    only)  */
  636.     u_char        msh_med_type;        /* medium type - random access
  637.                          *   devices only */
  638.     u_char        msh_wp:1,        /* byte 2 bit 7 - write protect
  639.                          *   mode sense only) */
  640.             msh_bufmode:3,        /* buffered mode - sequential
  641.                          *   access devices only */
  642.             msh_speed:4;        /* speed - sequential access
  643.                          *   devices only */
  644.     u_char        msh_bd_length;        /* block descriptor length */
  645.  
  646. #elif    __LITTLE_ENDIAN__
  647.  
  648.     u_char        msh_sd_length_0;
  649.     u_char        msh_med_type;
  650.     u_char        msh_speed    :4,
  651.             msh_bufmode    :3,
  652.             msh_wp        :1;
  653.     u_char        msh_bd_length;
  654.  
  655. #else
  656. #error    SCSI command / data structures are compiler sensitive
  657. #endif
  658. } mode_sel_hdr_t;
  659.  
  660. typedef struct mode_sel_bd {                /* block descriptor */
  661.  
  662. #if    __BIG_ENDIAN__
  663.  
  664.     u_int        msbd_density:8,
  665.             msbd_numblocks:24;
  666.     u_int        msbd_rsvd_0:8,        /* byte 4 - reserved */
  667.             msbd_blocklength:24;
  668.  
  669. #elif    __LITTLE_ENDIAN__
  670.  
  671.     u_char        msbd_density;
  672.     u_char        msbd_numblocks2;
  673.     u_char        msbd_numblocks1;
  674.     u_char        msbd_numblocks0;
  675.     u_char        msbd_rsvd_0;
  676.     u_char        msbd_blocklength2;
  677.     u_char        msbd_blocklength1;
  678.     u_char        msbd_blocklength0;
  679.  
  680. #else
  681. #error    SCSI command / data structures are compiler sensitive
  682. #endif
  683. } mode_sel_bd_t;
  684.  
  685. #define MODSEL_DATA_LEN    0x30
  686.  
  687. typedef struct mode_sel_data {
  688.  
  689.     /* transferred to/from target during mode select/mode sense */
  690.     struct mode_sel_hdr msd_header;
  691.     struct mode_sel_bd  msd_blockdescript;
  692.     u_char msd_vudata[MODSEL_DATA_LEN];    /* for vendor unique data */
  693. } mode_sel_data_t;
  694.  
  695. /* 
  696.  * struct for MTIOCMODSEL/ MTIOCMODSEN
  697.  */
  698. typedef struct modesel_parms {
  699.     struct mode_sel_data    msp_data;
  700.     int            msp_bcount;    /* # of bytes to DMA */
  701. } modesel_parms_t;
  702.  
  703. /*
  704.  * Day-to-day constants in the SCSI world
  705.  */
  706. #define    SCSI_NTARGETS    8        /* 0 - 7 for target numbers */
  707. #define    SCSI_NLUNS    8        /* 0 - 7 luns for each target */
  708.  
  709. /*
  710.  * For SCSI-3 Wide.
  711.  */
  712. #define    SCSI3_NTARGETS    32
  713.  
  714. /*
  715.  * Defect list header
  716.  * Used by FORMAT and REASSIGN BLOCK commands
  717.  */
  718. struct defect_header {
  719.  
  720. #if    __BIG_ENDIAN__
  721.  
  722.     u_char    dh_mbz1;
  723.     u_char    dh_fov:1,        /* format options valid */
  724.         dh_dpry:1,        /* disable primary */
  725.         dh_dcrt:1,        /* disable certification */
  726.         dh_stpf:1,        /* stop format */
  727.         dh_mbz2:4;
  728.     u_short    dh_len;            /* items in defect list */
  729.  
  730. #elif    __LITTLE_ENDIAN__
  731.  
  732.     u_char    dh_mbz1;
  733.     u_char    dh_mbz2        :4,
  734.         dh_stpf        :1,
  735.         dh_dcrt        :1,
  736.         dh_dpry        :1,
  737.         dh_fov        :1;
  738.     u_char    dh_len1;
  739.     u_char    dh_len0;
  740.  
  741. #else
  742. #error    SCSI command / data structures are compiler sensitive
  743. #endif
  744. };
  745.  
  746. /*
  747.  * Status for scsi_req (see below).
  748.  */
  749. typedef enum {
  750.     
  751.     SR_IOST_GOOD    = 0,        /* successful */
  752.     SR_IOST_SELTO    = 1,        /* selection timeout */
  753.     SR_IOST_CHKSV    = 2,        /* check status, sr_esense */
  754.                     /*    valid */
  755.     SR_IOST_CHKSNV    = 3,        /* check status, sr_esense */
  756.                     /*    not valid */
  757.     SR_IOST_DMAOR    = 4,        /* target attempted to move */
  758.                     /*    more than sr_dma_max */
  759.                     /*    bytes */
  760.     SR_IOST_IOTO    = 5,        /* sr_ioto exceeded */
  761.     SR_IOST_BV    = 6,        /* SCSI Bus violation */
  762.     SR_IOST_CMDREJ    = 7,        /* command reject (by 
  763.                      *    driver) */
  764.     SR_IOST_MEMALL    = 8,        /* memory allocation failure */
  765.     SR_IOST_MEMF    = 9,        /* memory fault */
  766.     SR_IOST_PERM    = 10,        /* not super user */
  767.     SR_IOST_NOPEN    = 11,        /* device not open */
  768.     SR_IOST_TABT    = 12,        /* target aborted command */
  769.     ST_IOST_BADST    = 13,        /* bad SCSI status byte  */
  770.                     /*  (other than check status)*/
  771. #define    SR_IOST_BADST    ST_IOST_BADST
  772.     ST_IOST_INT    = 14,        /* internal driver error */
  773. #define    SR_IOST_INT    ST_IOST_INT
  774.     SR_IOST_BCOUNT    = 15,        /* unexpected byte count */
  775.                     /* seen on SCSI bus */ 
  776.     SR_IOST_VOLNA    = 16,        /* desired volume not available */
  777.     SR_IOST_WP    = 17,        /* Media Write Protected */
  778.     SR_IOST_ALIGN    = 18,        /* DMA alignment error */
  779.     SR_IOST_IPCFAIL = 19,        /* Mach IPC failure */
  780.     SR_IOST_RESET    = 20,        /* bus was reset during 
  781.                      * processing of command */
  782.     SR_IOST_PARITY    = 21,        /* SCSI Bus Parity Error */
  783.     SR_IOST_HW    = 22,        /* Gross Hardware Failure */
  784.     SR_IOST_DMA    = 23,        /* DMA error */
  785.     SR_IOST_INVALID    = 100,        /* should never be seen */
  786. } sc_status_t;
  787.  
  788. /*
  789.  * DMA Direction.
  790.  */
  791. typedef enum {
  792.     SR_DMA_RD = 0,            /* DMA from device to host */
  793.     SR_DMA_WR = 1,            /* DMA from host to device */
  794. } sc_dma_dir_t;
  795.  
  796. /*
  797.  * SCSI Request used by sg driver via SGIOCREQ and internally in st driver
  798.  */
  799.  
  800. typedef struct scsi_req {
  801.  
  802.     /*** inputs ***/
  803.     
  804.     cdb_t            sr_cdb;        /* command descriptor block - 
  805.                          * one of four formats */
  806.     sc_dma_dir_t        sr_dma_dir;    /* DMA direction */
  807.     caddr_t            sr_addr;    /* memory addr for data 
  808.                          * transfers */
  809.     int            sr_dma_max;    /* maximum number of bytes to
  810.                          * transfer */
  811.     int            sr_ioto;    /* I/O timeout in seconds */
  812.                          
  813.     /*** outputs ***/
  814.     
  815.     int            sr_io_status;    /* driver status */
  816.     u_char            sr_scsi_status;    /* SCSI status byte */
  817.     esense_reply_t         sr_esense;    /* extended sense in case of
  818.                          * check status */
  819.     int            sr_dma_xfr;    /* actual number of bytes 
  820.                          * transferred by DMA */
  821.     struct    timeval        sr_exec_time;    /* execution time in 
  822.                          * microseconds */
  823.                          
  824. #if    m68k
  825.  
  826.     /*** for driver's internal use ***/
  827.     
  828.     u_char            sr_flags;
  829.     queue_chain_t        sr_io_q;    /* for linking onto sgdp->
  830.                          *    sdg_io_q */
  831. #else    m68k
  832.  
  833.     u_char            sr_cdb_length;    /* length of CDB bytes 
  834.                          *    (optional) */
  835.  
  836.     /*
  837.      * Flags to disable disconnect, command queueing, synchronous 
  838.      * transfer negotiation. Add one bit to allow chk. cond. to be 
  839.      * ignored. 
  840.      */
  841.  
  842.     u_char            sr_discon_disable:1,
  843.                 sr_cmd_queue_disable:1,
  844.                 sr_sync_disable:1,
  845.                 sr_ignore_chkcond:1,    /* to disable issuing 
  846.                                of chk.cond. cmd  - 
  847.                                specifically used 
  848.                                for MTIOCSRQ 
  849.                                requests. */
  850.                 
  851.                 sr_pad1:4;    
  852.  
  853.     u_char            sr_pad2;
  854.                     
  855.     u_char            sr_flags;    /* driver private */
  856.     queue_chain_t        sr_io_q;
  857.     
  858. #endif    m68k
  859.  
  860. } scsi_req_t;
  861.  
  862. /*
  863.  * SCSI Request, with capability of 16-byte CDB
  864.  */
  865.  
  866. typedef struct scsi3_req {
  867.  
  868.     /*** inputs ***/
  869.     
  870.     scsi3_cdb_t        s3r_cdb;    /* command descriptor block -                          
  871.                          * one of five formats */
  872.     sc_dma_dir_t        s3r_dma_dir;    /* DMA direction */
  873.     caddr_t            s3r_addr;    /* memory addr for data 
  874.                          * transfers */
  875.     int            s3r_dma_max;    /* maximum number of bytes to
  876.                          * transfer */
  877.     int            s3r_ioto;    /* I/O timeout in seconds */
  878.                          
  879.     /*** outputs ***/
  880.     
  881.     int            s3r_io_status;    /* driver status */
  882.     u_char            s3r_scsi_status; /* SCSI status byte */
  883.     esense_reply_t         s3r_esense;    /* extended sense in case of
  884.                          * check status */
  885.     int            s3r_dma_xfr;    /* actual number of bytes 
  886.                          * transferred by DMA */
  887.     struct    timeval        s3r_exec_time;    /* execution time in 
  888.                          * microseconds */
  889.                          
  890. #if    m68k
  891.  
  892.     /*** for driver's internal use ***/
  893.     
  894.     u_char            s3r_flags;
  895.     queue_chain_t        s3r_io_q;    /* for linking onto sgdp->
  896.                          *    sdg_io_q */
  897. #else    m68k
  898.  
  899.     u_char            s3r_cdb_length;    /* length of CDB bytes 
  900.                          *    (optional) */
  901.  
  902.     /*
  903.      * Flags to disable disconnect, command queueing, synchronous transfer
  904.      * negotiation.
  905.      */
  906.     u_char            s3r_discon_disable:1,
  907.                 s3r_cmd_queue_disable:1,
  908.                 s3r_sync_disable:1,
  909.                 s3r_pad1:5;
  910.     u_char            s3r_pad2;
  911.                     
  912.     u_char            s3r_flags;    /* driver private */
  913.     queue_chain_t        s3r_io_q;
  914.     
  915. #endif    m68k
  916.  
  917. } scsi3_req_t;
  918.  
  919. /*
  920.  * SCSI-2 address specifier.
  921.  */
  922. typedef struct scsi_adr {
  923.  
  924.     u_char            sa_target;
  925.     u_char            sa_lun;
  926.     
  927. } scsi_adr_t;
  928.  
  929. /*
  930.  * SCSI-3 address specifier.
  931.  */
  932. typedef struct scsi3_adr {
  933.  
  934.     unsigned long long    s3a_target;
  935.     unsigned long long    s3a_lun;
  936.     
  937. } scsi3_adr_t;
  938.  
  939.  
  940. /*
  941.  *    Generic SCSI ioctl requests
  942.  */
  943.  
  944. #define SGIOCSTL    _IOW ('s', 0, struct scsi_adr)    /* set target/lun */
  945. #define    SGIOCREQ    _IOWR('s', 1, struct scsi_req)     /* cmd request */
  946. #define SGIOCENAS    _IO(  's', 2)             /* enable autosense */
  947. #define SGIOCDAS    _IO(  's', 3)            /* disable autosense */
  948. #define SGIOCRST    _IO(  's', 4)            /* reset SCSI bus */
  949. #define SGIOCCNTR       _IOW( 's', 6, int)              /* select controller */
  950. #define SGIOCGAS    _IOR( 's', 7, int)        /* get autosense */
  951. #define SGIOCMAXDMA    _IOR( 's', 8, int)        /* max DMA size */
  952. #define SGIOCNUMTARGS    _IOR( 's', 9, int)        /* # of targets/bus */
  953.  
  954. /*
  955.  *    ioctl requests specific to SCSI disks
  956.  */
  957. #define    SDIOCSRQ    _IOWR('s', 1, struct scsi_req)     /* cmd request using */
  958.                             /* struct scsi_req */
  959.  
  960. #define SDIOCGETCAP    _IOR  ('s', 5, struct capacity_reply)
  961.                             /* Get Read 
  962.                              * Capacity info */
  963.  
  964. /* 
  965.  *    ioctl requests specific to SCSI tapes 
  966.  */
  967.  
  968. #define    MTIOCFIXBLK    _IOW('m', 5, int )    /* set fixed block mode */
  969. #define MTIOCVARBLK     _IO('m',  6)        /* set variable block mode */
  970. #define MTIOCMODSEL    _IOW('m', 7, struct modesel_parms)    
  971.                         /* mode select */
  972. #define MTIOCMODSEN    _IOWR('m',8, struct modesel_parms)    
  973.                         /* mode sense */
  974. #define MTIOCINILL    _IO('m',  9)        /* inhibit illegal length */
  975.                         /*    errors */
  976. #define MTIOCALILL    _IO('m',  10)        /* allow illegal length */
  977.                         /*    errors */
  978. #define    MTIOCSRQ    _IOWR('m', 11, struct scsi_req)     
  979.                         /* cmd request using 
  980.                          * struct scsi_req */
  981.  
  982. /*
  983.  * SCSI-3 ioctl requests
  984.  *
  985.  * Generic SCSI:
  986.  */
  987. #define SGIOCSTL3    _IOW ('s', 12, struct scsi3_adr) /* set target/lun */
  988. #define SGIOCGTL3    _IOR ('s', 13, struct scsi3_adr) /* get target/lun */
  989. #define    SGIOCREQ3    _IOWR('s', 14, struct scsi3_req) /* cmd request */
  990.  
  991. /*
  992.  * Disk
  993.  */
  994. #define    SDIOCSRQ3    _IOWR('s', 15, struct scsi3_req) /* cmd request */
  995.  
  996. /*
  997.  * Tape
  998.  */
  999. #define    MTIOCSRQ3    _IOWR('m', 15, struct scsi3_req) /* cmd request */
  1000.  
  1001. #endif _BSD_DEV_SCSIREG_
  1002.  
  1003.