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