home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.0 / NeXTSTEP3.0.iso / NextDeveloper / Headers / bsd / dev / scsireg.h < prev    next >
Text File  |  1992-07-29  |  15KB  |  481 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.  * 17-May-90    dmitch
  8.  *    Added SDIOCGETCAP
  9.  * 30-Apr-90    dmitch
  10.  *    Added C6S_SS_START, C6S_SS_STOP, C6S_SS_EJECT, SR_IOST_VOLNA
  11.  * 30-Oct-89    dmitch
  12.  *    Deleted private #defines (--> scsivar.h)
  13.  * 25-Sep-89    dmitch at NeXT
  14.  *    Added scsi_req, support for sg and st drivers
  15.  * 10-Sept-87      Mike DeMoney (mike) at NeXT
  16.  *    Created.
  17.  */
  18.  
  19. #ifndef _BSD_DEV_SCSIREG_
  20. #define    _BSD_DEV_SCSIREG_
  21.  
  22. #import <sys/ioctl.h>
  23. #import <sys/time.h>
  24. #import <kernserv/queue.h>
  25.  
  26. /*
  27.  * status byte definitions
  28.  */
  29. #define    STAT_GOOD        0x00    /* cmd successfully completed */
  30. #define    STAT_CHECK        0x02    /* abnormal condition occurred */
  31. #define    STAT_CONDMET        0x04    /* condition met / good */
  32. #define    STAT_BUSY        0x08    /* target busy */
  33. #define    STAT_INTMGOOD        0x10    /* intermediate / good */
  34. #define    STAT_INTMCONDMET    0x14    /* intermediate / cond met / good */
  35. #define    STAT_RESERVED        0x18    /* reservation conflict */
  36.  
  37. #define    STAT_MASK        0x1e    /* clears vendor unique bits */
  38.  
  39.  
  40. /*
  41.  * SCSI command descriptor blocks
  42.  * (Any device level driver doing fancy things will probably define
  43.  * these locally and cast a pointer on top of the sd(C.  We define
  44.  * them here to reserve the appropriate space, driver level routines
  45.  * can use them if they want.)
  46.  *
  47.  * 6 byte command descriptor block, random device
  48.  */
  49. struct cdb_6 {
  50.     u_int    c6_opcode:8,        /* device command */
  51.         c6_lun:3,        /* logical unit */
  52.         c6_lba:21;        /* logical block number */
  53.     u_char    c6_len;            /* transfer length */
  54.     u_char    c6_ctrl;        /* control byte */
  55. };
  56.  
  57. /*
  58.  * 6 byte command descriptor block, sequential device
  59.  */
  60. struct cdb_6s {
  61.     u_char    c6s_opcode:8;        /* device command */
  62.     u_char  c6s_lun:3,        /* logical unit */
  63.         c6s_spare:3,        /* reserved */
  64.         c6s_opt:2;        /* bits 1..0 - space type, fixed, 
  65.                      *    etc. */ 
  66.     u_int    c6s_len:24,        /* transfer length */
  67.         c6s_ctrl:8;        /* control byte */
  68. };
  69.  
  70.  
  71. /*
  72.  * 10 byte command descriptor block
  73.  * BEWARE: this definition is compiler sensitive due to int on
  74.  * short boundry!
  75.  */
  76. struct cdb_10 {
  77.     u_char    c10_opcode;        /* device command */
  78.     u_char    c10_lun:3,        /* logical unit */
  79.         c10_dp0:1,        /* disable page out (cache control) */
  80.         c10_fua:1,        /* force unit access (cache control) */
  81.         c10_mbz1:2,        /* reserved: must be zero */
  82.         c10_reladr:1;        /* addr relative to prev linked cmd */
  83.     u_int    c10_lba;        /* logical block number */
  84.     u_int    c10_mbz2:8,        /* reserved: must be zero */
  85.         c10_len:16,        /* transfer length */
  86.         c10_ctrl:8;        /* control byte */
  87. };
  88.  
  89. /*
  90.  * 12 byte command descriptor block
  91.  * BEWARE: this definition is compiler sensitive due to int on
  92.  * short boundry!
  93.  */
  94. struct cdb_12 {
  95.     u_char    c12_opcode;        /* device command */
  96.     u_char    c12_lun:3,        /* logical unit */
  97.         c12_dp0:1,        /* disable page out (cache control) */
  98.         c12_fua:1,        /* force unit access (cache control) */
  99.         c12_mbz1:2,        /* reserved: must be zero */
  100.         c12_reladr:1;        /* addr relative to prev linked cmd */
  101.     u_int    c12_lba;        /* logical block number */
  102.     u_char    c12_mbz2;        /* reserved: must be zero */
  103.     u_char    c12_mbz3;        /* reserved: must be zero */
  104.     u_int    c12_mbz4:8,        /* reserved: must be zero */
  105.         c12_len:16,        /* transfer length */
  106.         c12_ctrl:8;        /* control byte */
  107. };
  108.     
  109. union cdb {
  110.     struct    cdb_6    cdb_c6;
  111.     struct  cdb_6s  cdb_c6s;
  112.     struct    cdb_10    cdb_c10;
  113.     struct    cdb_12    cdb_c12;
  114. };
  115.  
  116. #define    cdb_opcode    cdb_c6.c6_opcode    /* all opcodes in same place */
  117.  
  118. /*
  119.  * control byte values
  120.  */
  121. #define    CTRL_LINKFLAG        0x03    /* link and flag bits */
  122. #define    CTRL_LINK        0x01    /* link only */
  123. #define    CTRL_NOLINK        0x00    /* no (Dand linking */
  124.  
  125. /*
  126.  * six byte cdb opcodes
  127.  * (Optional commands should only be used by formatters)
  128.  */
  129. #define    C6OP_TESTRDY        0x00    /* test unit ready */
  130. #define C6OP_REWIND        0x01    /* rewind */
  131. #define    C6OP_REQSENSE        0x03    /* request sense */
  132. #define    C6OP_FORMAT        0x04    /* format unit */
  133. #define    C6OP_REASSIGNBLK    0x07    /* OPT: reassign block */
  134. #define    C6OP_READ        0x08    /* read data */
  135. #define    C6OP_WRITE        0x0a    /* write data */
  136. #define    C6OP_SEEK        0x0b    /* seek */
  137. #define C6OP_READREV        0x0F    /* read reverse */
  138. #define C6OP_WRTFM        0x10    /* write filemarks */
  139. #define C6OP_SPACE        0x11    /* space records/filemarks */
  140. #define    C6OP_INQUIRY        0x12    /* get device specific info */
  141. #define C6OP_VERIFY        0x13    /* sequential verify */
  142. #define    C6OP_MODESELECT        0x15    /* OPT: set device parameters */
  143. #define    C6OP_MODESENSE        0x1a    /* OPT: get device parameters */
  144. #define    C6OP_STARTSTOP        0x1b    /* OPT: start or stop device */
  145. #define    C6OP_SENDDIAG        0x1d    /* send diagnostic */
  146.  
  147. /*
  148.  * ten byte cdb opcodes
  149.  */
  150. #define    C10OP_READCAPACITY    0x25    /* read capacity */
  151. #define    C10OP_READEXTENDED    0x28    /* read extended */
  152. #define    C10OP_WRITEEXTENDED    0x2a    /* write extended */
  153. #define    C10OP_READDEFECTDATA    0x37    /* OPT: read media defect info */
  154.  
  155.  
  156. /*
  157.  *    c6s_opt - options for 6-byte sequential device commands 
  158.  */
  159.  
  160. #define C6OPT_FIXED        0x01    /* fixed block transfer */
  161. #define C6OPT_LONG        0x01    /* 1 = erase to EOT */
  162. #define C6OPT_IMMED        0x01    /* immediate (for rewind, retension) */
  163. #define C6OPT_BYTECMP        0x02    /* byte compare for C6OP_VERIFY */
  164. #define C6OPT_SIL        0x02    /* suppress illegal length (Exabyte) */
  165. #define C6OPT_SPACE_LB        0x00    /* space logical blocks */
  166. #define C6OPT_SPACE_FM        0x01    /* space filemarks */
  167. #define C6OPT_SPACE_SFM        0x02    /* space sequential filemarks */
  168. #define C6OPT_SPACE_PEOD    0x03    /* space to physical end of data */    
  169.  
  170. /*    
  171.  *    other 6-byte sequential command constants
  172.  */
  173.  
  174. #define C6S_MAXLEN        0xFFFFFF    
  175. #define C6S_RETEN        0x02    /* byte 4 of load/unload - retension */
  176. #define C6S_LOAD        0x01    /* byte 4 of load/unload - load */
  177.  
  178. /*
  179.  * these go in the c6_len fields of start/stop command
  180.  */
  181. #define C6S_SS_START        0x01    /* start unit */
  182. #define C6S_SS_STOP        0x00    /* stop unit */
  183. #define C6S_SS_EJECT        0x02    /* eject disk */
  184.  
  185. /*
  186.  * extended sense data
  187.  * returned by C6OP_REQSENSE
  188.  */
  189. struct esense_reply {
  190.     u_char    er_ibvalid:1,        /* information bytes valid */
  191.         e(Eass:3,        /* error class */
  192.         er_code:4;        /* error code */
  193.     u_char    er_segment;        /* segment number for copy cmd */
  194.     u_char    er_filemark:1,        /* file mark */
  195.         er_endofmedium:1,    /* end-of-medium */
  196.         er_badlen:1,        /* incorrect length */
  197.         er_rsvd2:1,        /* reserved */
  198.         er_sensekey:4;        /* sense key */
  199.     u_char    er_infomsb;        /* MSB of information byte */
  200.     u_int    er_info:24,        /* bits 23 - 0 of info "byte" */
  201.         er_addsenselen:8;    /* additional sense length */
  202.     u_int    er_rsvd8;        /* copy status (unused) */
  203.     u_char    er_addsensecode;    /* additional sense code */
  204.     
  205.     /* the following are used for tape only as of 27-Feb-89 */
  206.     
  207.     u_char    er_qualifier;        /* sense code qualifier */
  208.     u_char  er_rsvd_e;
  209.     u_char  er_rsvd_f;
  210.     u_int   er_err_count:24,    /* three bytes of data error counter */
  211.         er_stat_13:8;        /* byte 0x13 - discrete status bits */
  212.     u_char  er_stat_14;        /* byte 0x14 - discrete status bits */
  213.     u_char  er_stat_15;        /* byte 0x15 - discrete status bits */
  214.     u_int   er_rsvd_16:8,
  215.         er_remaining:24;    /* bytes 0x17..0x19 - remaining tape */
  216.         
  217.     /* technically, there can be additional bytes of sense info
  218.      * here, but we don't check them, so we don't define them
  219.      */
  220. };
  221.  
  222. /*
  223.  * sense keys
  224.  */
  225. #define    SENSE_NOSENSE        0x0    /* no error to report */
  226. #define    SENSE_RECOVERED        0x1    /* recovered error */
  227. #define    SENSE_NOTREADY        0x2    /* target not ready */
  228. #define    SENSE_MEDIA        0x3    /* media flaw */
  229. #define    SENSE_HARDWARE        0x4    /* hardware failure */
  230. #define    SENSE_ILLEGALREQUEST    0x5    /* illegal request */
  231. #define    SENSE_UNITATTENTION    0x6    /* drive attention */
  232. #define    SENSE_DATAPROTECT    0x7    /* drive access protected */
  233. #define    SENSE_ABORTEDCOMMAND    0xb    /* target aborted command */
  234. #define    SENSE_VOLUMEOVERFLOW    0xd    /* eom, some data not transfered */
  235. #define    SENSE_MISCOMPARE    0xe    /* source/media data mismatch */
  236.  
  237. /*
  238.  * inquiry data
  239.  */
  240. struct inquiry_reply {
  241.     u_char    ir_qual:3,        /* qualifier */
  242.         ir_devicetype:5;    /* device type, see below */
  243.     u_char    ir_removable:1,        /* removable media */
  244.         ir_typequalifier:7;    /* device type qualifier */
  245.     u_char    ir_isoversion:2,    /* ISO  version number */
  246.         ir_ecmaversion:3,    /* ECMA version number */
  247.         ir_ansiversion:3;    /* ANSI version number */
  248.     u_char    ir_zero2:4,        /* reserved */
  249.         ir_rspdatafmt:4;    /* response data format */
  250.     u_char    ir_addlistlen;        /* additional list length */
  251.     u_char    ir_zero3[2];        /* reserved */
  252.     u_char    ir_reladr(F    /* relative addressing */
  253.         ir_wbus32:1,        /* 32-bit wide data transfers */
  254.         ir_wbus16:1,        /* 16-bit wide data transfers */
  255.         ir_sync:1,        /* synchronous data transfers */
  256.         ir_linked:1,        /* linked commands */
  257.         ir_zero4:1,        /* reserved */
  258.         ir_cmdque:1,        /* tagged command queuing */
  259.         ir_sftre:1;        /* soft reset */
  260.     char    ir_vendorid[8];        /* vendor name in ascii */
  261.     char    ir_productid[16];    /* product name in ascii */
  262.     char    ir_revision[4];        /* revision level info in ascii */
  263.     char    ir_misc[28];        /* misc info */
  264.     char    ir_endofid[1];        /* just a handle for end of id info */
  265. };
  266.  
  267. #define    DEVQUAL_OK        0x00    /* device is connected to this lun */
  268. #define    DEVQUAL_MIA        0x01    /* device not connected to lun */
  269. #define    DEVQUAL_RSVD        0x02    /* reserved */
  270. #define    DEVQUAL_NODEV        0x03    /* target doesn't support dev on lun */
  271. #define    DEVQUAL_VUMASK        0x04    /* 1XXb is vendor specific */
  272.  
  273.  
  274. #define    DEVTYPE_DISK        0x00    /* read/write disks */
  275. #define    DEVTYPE_TAPE        0x01    /* tapes and other sequential devices*/
  276. #define    DEVTYPE_PRINTER        0x02    /* printers */
  277. #define    DEVTYPE_PROCESSOR    0x03    /* cpu's */
  278. #define    DEVTYPE_WORM        0x04    /* write-once optical disks */
  279. #define    DEVTYPE_CDROM        0x05    /* cd rom's, etc */
  280. #define DEVTYPE_SCANNER        0x06
  281. #define DEVTYPE_OPTICAL        0x07    /* other optical storage */
  282. #define DEVTYPE_CHANGER        0x08    /* jukebox */
  283. #define DEVTYPE_COMM        0x09    /* communication device */
  284. #define DEVTYPE_GRAPH_A        0x0a    /* ASC IT8 graphics */
  285. #define DEVTYPE_GRAPH_B        0x0b    /* ASC IT8 graphics */
  286. #define DEVTYPE_NOTPRESENT      0x1f    /* logical unit not present */
  287.  
  288. /*
  289.  * read capacity reply
  290.  */
  291. struct capacity_reply {
  292.     u_int    cr_lastlba;        /* last logical block address */
  293.     u_int    cr_blklen;        /* block length */
  294. };
  295.  
  296. /*
  297.  * Standard Mode Select/Mode Sense data structures
  298.  */
  299.  
  300. struct mode_sel_hdr {
  301.  
  302.     u_char         msh_sd_length_0;    /* byte 0 - length (mode sense
  303.                          *    only)  */
  304.     u_char        msh_med_type;        /* medium type - random access
  305.                          *   devices only */
  306.     u_char        msh_wp:1,        /* byte 2 bit 7 - write protect
  307.                          *   mode sense only) */
  308.             msh_bufmode:3,        /* buffered mode - sequential
  309.                          *   access devices only */
  310.             msh_speed:4;        /* speed - sequential access
  311.                          *   devices only */
  312.     u_char        msh_bd_length;        /* block descriptor length */
  313. };
  314.  
  315. struct mode_sel_bd {                /* block descriptor */
  316.  
  317.     u_int        msbd_density:8,
  318.             msbd_numblocks:24;
  319.     u_int        msbd_rs(G:8,        /* byte 4 - reserved */
  320.             msbd_blocklength:24;    
  321. };
  322.  
  323. #define MODSEL_DATA_LEN    0x30
  324.  
  325. struct mode_sel_data {
  326.  
  327.     /* transferred to/from target during mode select/mode sense */
  328.     struct mode_sel_hdr msd_header;
  329.     struct mode_sel_bd  msd_blockdescript;
  330.     u_char msd_vudata[MODSEL_DATA_LEN];    /* for vendor unique data */
  331. };
  332.  
  333. /* 
  334.  * struct for MTIOCMODSEL/ MTIOCMODSEN
  335.  */
  336. struct modesel_parms {
  337.     struct mode_sel_data    msp_data;
  338.     int            msp_bcount;    /* # of bytes to DMA */
  339. };
  340.  
  341. /*
  342.  * Day-to-day constants in the SCSI world
  343.  */
  344. #define    SCSI_NTARGETS    8        /* 0 - 7 for target numbers */
  345. #define    SCSI_NLUNS    8        /* 0 - 7 luns for each target */
  346.  
  347. /*
  348.  * Defect list header
  349.  * Used by FORMAT and REASSIGN BLOCK commands
  350.  */
  351. struct defect_header {
  352.     u_char    dh_mbz1;
  353.     u_char    dh_fov:1,        /* format options valid */
  354.         dh_dpry:1,        /* disable primary */
  355.         dh_dcrt:1,        /* disable certification */
  356.         dh_stpf:1,        /* stop format */
  357.         dh_mbz2:4;
  358.     u_short    dh_len;            /* items in defect list */
  359. };
  360.  
  361. /*
  362.  * SCSI Request used by sg driver via SGIOCREQ and internally in st driver
  363.  */
  364.  
  365. struct scsi_req {
  366.  
  367.     /*** inputs ***/
  368.     
  369.     union cdb        sr_cdb;        /* command descriptor block - 
  370.                          * one of three formats */
  371.     int             sr_dma_dir;    /* SR_DMA_RD / SR_DMA_WR */
  372.     caddr_t            sr_addr;    /* memory addr for data 
  373.                          * transfers */
  374.     int            sr_dma_max;    /* maximum number of bytes to
  375.                          * transfer */
  376.     int            sr_ioto;    /* I/O timeout in seconds */
  377.                          
  378.     /*** outputs ***/
  379.     
  380.     int            sr_io_status;    /* driver status */
  381.     u_char            sr_scsi_status;    /* SCSI status byte */
  382.     struct esense_reply     sr_esense;    /* extended sense in case of
  383.                          * check status */
  384.     int            sr_dma_xfr;    /* actual number of bytes 
  385.                          * transferred by DMA */
  386.     struct    timeval        sr_exec_time;    /* execution time in 
  387.                          * microseconds */
  388.     /*** for driver's internal use ***/
  389.     
  390.     u_char            sr_flags;
  391.     queue_chain_t        sr_io_q;    /* for linking onto sgdp->
  392.                          *    sdg_io_q */
  393. }; /* scsi_req */
  394.  
  395. struct scsi_adr {
  396.  
  397.     u_char            sa_target;
  398.     u_char            sa_lun;
  399.     
  400. }; /* scsi_adr */
  401.  
  402.  
  403. /*
  404.  *    Generic SCSI ioctl requests
  405.  */
  406.  
  407. #define SGIOCSTL    _IOW ('s', 0, struct scsi_adr)    /* set target/lun */
  408. #define    SGIOCREQ    _IOWR('s', 1, struct scsi_req)     /* cmd request */
  409. #define SGIOCENAS    _IO(  's', 2)             /* enable autosense */
  410. #define SGIOCDAS    _IO(  's', 3)            /* disable autosense */
  411. #define SGIOCRST    _IO(  's', 4)            /* reset SCSI bus */
  412.  
  413. /*
  414. (Hoctl requests specific to SCSI disks
  415.  */
  416. #define    SDIOCSRQ    _IOWR('s', 1, struct scsi_req)     /* cmd request using */
  417.                             /* struct scsi_req */
  418.  
  419. #define SDIOCGETCAP    _IOR  ('s', 5, struct capacity_reply)
  420.                             /* Get Read 
  421.                              * Capacity info */
  422.  
  423. /* 
  424.  *    ioctl requests specific to SCSI tapes 
  425.  */
  426.  
  427. #define    MTIOCFIXBLK    _IOW('m', 5, int )    /* set fixed block mode */
  428. #define MTIOCVARBLK     _IO('m',  6)        /* set variable block mode */
  429. #define MTIOCMODSEL    _IOW('m', 7, struct modesel_parms)    
  430.                         /* mode select */
  431. #define MTIOCMODSEN    _IOWR('m',8, struct modesel_parms)    
  432.                         /* mode sense */
  433. #define MTIOCINILL    _IO('m',  9)        /* inhibit illegal length */
  434.                         /*    errors */
  435. #define MTIOCALILL    _IO('m',  10)        /* allow illegal length */
  436.                         /*    errors */
  437. #define    MTIOCSRQ    _IOWR('m', 11, struct scsi_req)     
  438.                         /* cmd request using 
  439.                          * struct scsi_req */
  440.  
  441.  
  442. /*
  443.  *    constants used in scsi_req
  444.  */
  445.  
  446.      /*** sr_dma_dir ***/
  447.     
  448. #define     SR_DMA_RD    0        /* DMA from device to host */
  449. #define     SR_DMA_WR    1        /* DMA from host to device */
  450.  
  451.     /*** sr_io_status ***/
  452.     
  453. #define     SR_IOST_GOOD    0        /* successful */
  454. #define        SR_IOST_SELTO    1        /* selection timeout */
  455. #define        SR_IOST_CHKSV    2        /* check status, sr_esense */
  456.                         /*    valid */
  457. #define        SR_IOST_CHKSNV    3        /* check status, sr_esense */
  458.                         /*    not valid */
  459. #define        SR_IOST_DMAOR    4        /* target attempted to move */
  460.                         /*    more than sr_dma_max */
  461.                         /*    bytes */
  462. #define        SR_IOST_IOTO    5        /* sr_ioto exceeded */
  463. #define        SR_IOST_BV    6        /* SCSI Bus violation */
  464. #define        SR_IOST_CMDREJ    7        /* command reject (by 
  465.                          *    driver) */
  466. #define     SR_IOST_MEMALL    8        /* memory allocation failure */
  467. #define        SR_IOST_MEMF    9        /* memory fault */
  468. #define        SR_IOST_PERM    10        /* not super user */
  469. #define     SR_IOST_NOPEN    11        /* device not open */
  470. #define        SR_IOST_TABT    12        /* target aborted command */
  471. #define        ST_IOST_BADST    13        /* bad SCSI status byte  */
  472.                         /*  (other than check status)*/
  473. #define        ST_IOST_INT    14        /* internal driver error */
  474. #define     SR_IOST_BCOUNT    15        /* unexpected byte count */
  475.                         /* seen on SCSI bus */ 
  476. #define     SR_IOST_VOLNA    16        /* desired volume not available
  477.                          */
  478. #define     SR_IOST_WP    17        /* Media Write Protected */
  479.  
  480. #endif _BSD_DEV_SCSIREG_
  481.