This is scsireg_31.h in view mode; [Download] [Up]
/* @(#)scsireg.h 1.0 10/23/89 (c) 1989 NeXT */ /* * scsireg.h -- generic SCSI definitions * KERNEL VERSION * * HISTORY * 10-Feb-93 dmitch * Added generic endian/alignment #ifdef's. * 17-May-90 dmitch * Added SDIOCGETCAP * 30-Apr-90 dmitch * Added C6S_SS_START, C6S_SS_STOP, C6S_SS_EJECT, SR_IOST_VOLNA * 30-Oct-89 dmitch * Deleted private #defines (--> scsivar.h) * 25-Sep-89 dmitch at NeXT * Added scsi_req, support for sg and st drivers * 10-Sept-87 Mike DeMoney (mike) at NeXT * Created. */ /* Garance/mCD: Copied this to the mCD directory, as I'm developing mCD on a NS3.0 system but want to use the NS3.1 version of scsireg */ #ifndef _BSD_DEV_SCSIREG_ #define _BSD_DEV_SCSIREG_ #import <sys/ioctl.h> #import <sys/time.h> #import <kernserv/queue.h> #import <sys/types.h> /* * status byte definitions */ #define STAT_GOOD 0x00 /* cmd successfully completed */ #define STAT_CHECK 0x02 /* abnormal condition occurred */ #define STAT_CONDMET 0x04 /* condition met / good */ #define STAT_BUSY 0x08 /* target busy */ #define STAT_INTMGOOD 0x10 /* intermediate / good */ #define STAT_INTMCONDMET 0x14 /* intermediate / cond met / good */ #define STAT_RESERVED 0x18 /* reservation conflict */ #define STAT_MASK 0x1e /* clears vendor unique bits */ /* * SCSI command descriptor blocks * (Any device level driver doing fancy things will probably define * these locally and cast a pointer on top of the sd_cdb. We define * them here to reserve the appropriate space, driver level routines * can use them if they want.) * * 6 byte command descriptor block, random device */ typedef struct cdb_6 { #if __BIG_ENDIAN__ u_int c6_opcode:8, /* device command */ c6_lun:3, /* logical unit */ c6_lba:21; /* logical block number */ u_char c6_len; /* transfer length */ u_char c6_ctrl; /* control byte */ #elif __LITTLE_ENDIAN__ u_char c6_opcode; u_char c6_lba2 :5, c6_lun :3; u_char c6_lba1; u_char c6_lba0; u_char c6_len; u_char c6_ctrl; #else #error SCSI command / data structures are compiler sensitive #endif } cdb_6_t; #define CDB_6_MAX_LENGTH (255) /* max block count */ #define CDB_6_MAX_LBA ((1 << 21) - 1) /* max block address */ /* * 6 byte command descriptor block, sequential device */ typedef struct cdb_6s { #if __BIG_ENDIAN__ u_char c6s_opcode:8; /* device command */ u_char c6s_lun:3, /* logical unit */ c6s_spare:3, /* reserved */ c6s_opt:2; /* bits 1..0 - space type, fixed, * etc. */ u_int c6s_len:24, /* transfer length */ c6s_ctrl:8; /* control byte */ #elif __LITTLE_ENDIAN__ u_char c6s_opcode; u_char c6s_opt :2, c6s_spare :3, c6s_lun :3; u_char c6s_len2; u_char c6s_len1; u_char c6s_len0; u_char c6s_ctrl; #else #error SCSI command / data structures are compiler sensitive #endif } cdb_6s_t; /* * 10 byte command descriptor block * This definition is machine dependent due to an int on a short boundary. */ typedef struct cdb_10 { #if __BIG_ENDIAN__ #if __NATURAL_ALIGNMENT__ u_char c10_opcode; /* device command */ u_char c10_lun:3, /* logical unit */ c10_dp0:1, /* disable page out */ c10_fua:1, /* force unit access */ c10_mbz1:2, /* reserved: must be zero */ c10_reladr:1; /* addr relative to prev * linked cmd */ /* * Careful, this can't be an int due to natural alignment... */ u_char c10_lba[4]; /* logical block number */ u_char c10_mbz2:8; /* reserved: must be zero */ u_char c10_len[2]; /* transfer length */ u_char c10_ctrl; /* control byte */ #else __NATURAL_ALIGNMENT__ u_char c10_opcode; /* device command */ u_char c10_lun:3, /* logical unit */ c10_dp0:1, /* disable page out (cache control) */ c10_fua:1, /* force unit access (cache control) */ c10_mbz1:2, /* reserved: must be zero */ c10_reladr:1; /* addr relative to prev linked cmd */ u_int c10_lba; /* logical block number */ u_int c10_mbz2:8, /* reserved: must be zero */ c10_len:16, /* transfer length */ c10_ctrl:8; /* control byte */ #endif __NATURAL_ALIGNMENT__ #elif __LITTLE_ENDIAN__ u_char c10_opcode; u_char c10_reladr :1, c10_mbz1 :2, c10_fua :1, c10_dp0 :1, c10_lun :3; u_char c10_lba3; u_char c10_lba2; u_char c10_lba1; u_char c10_lba0; u_char c10_mbz2; u_char c10_len1; u_char c10_len0; u_char c10_ctrl; #else #error SCSI command / data structures are compiler sensitive #endif } cdb_10_t; /* * 12 byte command descriptor block * This definition is machine dependent due to an int on a short boundary. */ typedef struct cdb_12 { #if __BIG_ENDIAN__ #if __NATURAL_ALIGNMENT__ u_char c12_opcode; /* device command */ u_char c12_lun:3, /* logical unit */ c12_dp0:1, /* disable page out */ c12_fua:1, /* force unit access */ c12_mbz1:2, /* reserved: must be zero */ c12_reladr:1; /* addr relative to prev * linked cmd */ u_char c12_lba[4]; /* logical block number */ u_char c12_mbz2; /* reserved: must be zero */ u_char c12_mbz3; /* reserved: must be zero */ u_char c12_mbz4; /* reserved: must be zero */ u_char c12_len[2]; /* transfer length */ u_char c12_ctrl:8; /* control byte */ #else __NATURAL_ALIGNMENT__ u_char c12_opcode; /* device command */ u_char c12_lun:3, /* logical unit */ c12_dp0:1, /* disable page out (cache control) */ c12_fua:1, /* force unit access (cache control) */ c12_mbz1:2, /* reserved: must be zero */ c12_reladr:1; /* addr relative to prev linked cmd */ u_int c12_lba; /* logical block number */ u_char c12_mbz2; /* reserved: must be zero */ u_char c12_mbz3; /* reserved: must be zero */ u_int c12_mbz4:8, /* reserved: must be zero */ c12_len:16, /* transfer length */ c12_ctrl:8; /* control byte */ #endif __NATURAL_ALIGNMENT__ #elif __LITTLE_ENDIAN__ u_char c12_opcode; u_char c12_reladr :1, c12_mbz1 :2, c12_fua :1, c12_dp0 :1, c12_lun :3; u_char c12_lba3; u_char c12_lba2; u_char c12_lba1; u_char c12_lba0; u_char c12_mbz2; u_char c12_mbz3; u_char c12_mbz4; u_char c12_len1; u_char c12_len0; u_char c12_ctrl; #else #error SCSI command / data structures are compiler sensitive #endif } cdb_12_t; typedef union cdb { struct cdb_6 cdb_c6; struct cdb_6s cdb_c6s; struct cdb_10 cdb_c10; struct cdb_12 cdb_c12; } cdb_t; #define cdb_opcode cdb_c6.c6_opcode /* all opcodes in same place */ /* * control byte values */ #define CTRL_LINKFLAG 0x03 /* link and flag bits */ #define CTRL_LINK 0x01 /* link only */ #define CTRL_NOLINK 0x00 /* no command linking */ /* * six byte cdb opcodes * (Optional commands should only be used by formatters) */ #define C6OP_TESTRDY 0x00 /* test unit ready */ #define C6OP_REWIND 0x01 /* rewind */ #define C6OP_REQSENSE 0x03 /* request sense */ #define C6OP_FORMAT 0x04 /* format unit */ #define C6OP_REASSIGNBLK 0x07 /* OPT: reassign block */ #define C6OP_READ 0x08 /* read data */ #define C6OP_WRITE 0x0a /* write data */ #define C6OP_SEEK 0x0b /* seek */ #define C6OP_READREV 0x0F /* read reverse */ #define C6OP_WRTFM 0x10 /* write filemarks */ #define C6OP_SPACE 0x11 /* space records/filemarks */ #define C6OP_INQUIRY 0x12 /* get device specific info */ #define C6OP_VERIFY 0x13 /* sequential verify */ #define C6OP_MODESELECT 0x15 /* OPT: set device parameters */ #define C6OP_MODESENSE 0x1a /* OPT: get device parameters */ #define C6OP_STARTSTOP 0x1b /* OPT: start or stop device */ #define C6OP_SENDDIAG 0x1d /* send diagnostic */ /* * ten byte cdb opcodes */ #define C10OP_READCAPACITY 0x25 /* read capacity */ #define C10OP_READEXTENDED 0x28 /* read extended */ #define C10OP_WRITEEXTENDED 0x2a /* write extended */ #define C10OP_READDEFECTDATA 0x37 /* OPT: read media defect info */ /* * c6s_opt - options for 6-byte sequential device commands */ #define C6OPT_FIXED 0x01 /* fixed block transfer */ #define C6OPT_LONG 0x01 /* 1 = erase to EOT */ #define C6OPT_IMMED 0x01 /* immediate (for rewind, retension) */ #define C6OPT_BYTECMP 0x02 /* byte compare for C6OP_VERIFY */ #define C6OPT_SIL 0x02 /* suppress illegal length (Exabyte) */ #define C6OPT_SPACE_LB 0x00 /* space logical blocks */ #define C6OPT_SPACE_FM 0x01 /* space filemarks */ #define C6OPT_SPACE_SFM 0x02 /* space sequential filemarks */ #define C6OPT_SPACE_PEOD 0x03 /* space to physical end of data */ /* * other 6-byte sequential command constants */ #define C6S_MAXLEN 0xFFFFFF #define C6S_RETEN 0x02 /* byte 4 of load/unload - retension */ #define C6S_LOAD 0x01 /* byte 4 of load/unload - load */ /* * these go in the c6_len fields of start/stop command */ #define C6S_SS_START 0x01 /* start unit */ #define C6S_SS_STOP 0x00 /* stop unit */ #define C6S_SS_EJECT 0x02 /* eject disk */ /* * extended sense data * returned by C6OP_REQSENSE */ typedef struct esense_reply { #if __BIG_ENDIAN__ u_char er_ibvalid:1, /* information bytes valid */ er_class:3, /* error class */ er_code:4; /* error code */ u_char er_segment; /* segment number for copy cmd */ u_char er_filemark:1, /* file mark */ er_endofmedium:1, /* end-of-medium */ er_badlen:1, /* incorrect length */ er_rsvd2:1, /* reserved */ er_sensekey:4; /* sense key */ u_char er_infomsb; /* MSB of information byte */ u_int er_info:24, /* bits 23 - 0 of info "byte" */ er_addsenselen:8; /* additional sense length */ u_int er_rsvd8; /* copy status (unused) */ u_char er_addsensecode; /* additional sense code */ /* the following are used for tape only as of 27-Feb-89 */ u_char er_qualifier; /* sense code qualifier */ u_char er_rsvd_e; u_char er_rsvd_f; u_int er_err_count:24, /* three bytes of data error counter */ er_stat_13:8; /* byte 0x13 - discrete status bits */ u_char er_stat_14; /* byte 0x14 - discrete status bits */ u_char er_stat_15; /* byte 0x15 - discrete status bits */ #if __NATURAL_ALIGNMENT__ u_char er_rsvd_16; u_char er_remaining[3]; /* bytes 0x17..0x19 - remaining tape */ #else __NATURAL_ALIGNMENT__ u_int er_rsvd_16:8, er_remaining:24; /* bytes 0x17..0x19 - remaining tape */ #endif __NATURAL_ALIGNMENT__ #elif __LITTLE_ENDIAN__ u_char er_code :4, er_class :3, er_ibvalid :1; u_char er_segment; u_char er_sensekey :4, er_rsvd2 :1, er_badlen :1, er_endofmedium :1, er_filemark :1; u_char er_info3; u_char er_info2; u_char er_info1; u_char er_info0; u_char er_addsenselen; u_char er_rsvd8[4]; u_char er_addsensecode; u_char er_qualifier; u_char er_rsvd_e; u_char er_rsvd_f; u_char er_err_count2; u_char er_err_count1; u_char er_err_count0; u_char er_stat_13; u_char er_stat_14; u_char er_stat_15; u_char er_rsvd_16; u_char er_remaining2; u_char er_remaining1; u_char er_remaining0; #else #error SCSI command / data structures are compiler sensitive #endif /* technically, there can be additional bytes of sense info * here, but we don't check them, so we don't define them */ } esense_reply_t; /* * sense keys */ #define SENSE_NOSENSE 0x0 /* no error to report */ #define SENSE_RECOVERED 0x1 /* recovered error */ #define SENSE_NOTREADY 0x2 /* target not ready */ #define SENSE_MEDIA 0x3 /* media flaw */ #define SENSE_HARDWARE 0x4 /* hardware failure */ #define SENSE_ILLEGALREQUEST 0x5 /* illegal request */ #define SENSE_UNITATTENTION 0x6 /* drive attention */ #define SENSE_DATAPROTECT 0x7 /* drive access protected */ #define SENSE_ABORTEDCOMMAND 0xb /* target aborted command */ #define SENSE_VOLUMEOVERFLOW 0xd /* eom, some data not transfered */ #define SENSE_MISCOMPARE 0xe /* source/media data mismatch */ /* * inquiry data */ typedef struct inquiry_reply { #if __BIG_ENDIAN__ u_char ir_qual:3, /* qualifier */ ir_devicetype:5; /* device type, see below */ u_char ir_removable:1, /* removable media */ ir_typequalifier:7; /* device type qualifier */ u_char ir_isoversion:2, /* ISO version number */ ir_ecmaversion:3, /* ECMA version number */ ir_ansiversion:3; /* ANSI version number */ u_char ir_zero2:4, /* reserved */ ir_rspdatafmt:4; /* response data format */ u_char ir_addlistlen; /* additional list length */ u_char ir_zero3[2]; /* reserved */ u_char ir_reladr:1, /* relative addressing */ ir_wbus32:1, /* 32-bit wide data transfers */ ir_wbus16:1, /* 16-bit wide data transfers */ ir_sync:1, /* synchronous data transfers */ ir_linked:1, /* linked commands */ ir_zero4:1, /* reserved */ ir_cmdque:1, /* tagged command queuing */ ir_sftre:1; /* soft reset */ char ir_vendorid[8]; /* vendor name in ascii */ char ir_productid[16]; /* product name in ascii */ char ir_revision[4]; /* revision level info in ascii */ char ir_misc[28]; /* misc info */ char ir_endofid[1]; /* just a handle for end of id info */ #elif __LITTLE_ENDIAN__ u_char ir_devicetype :5, ir_qual :3; u_char ir_typequalifier:7, ir_removable :1; u_char ir_ansiversion :3, ir_ecmaversion :3, ir_isoversion :2; u_char ir_rspdatafmt :4, ir_zero2 :4; u_char ir_addlistlen; u_char ir_zero3[2]; u_char ir_sftre :1, ir_cmdque :1, ir_zero4 :1, ir_linked :1, ir_sync :1, ir_wbus16 :1, ir_wbus32 :1, ir_reladr :1; u_char ir_vendorid[8]; u_char ir_productid[16]; u_char ir_revision[4]; u_char ir_misc[28]; u_char ir_endofid[1]; #else #error SCSI command / data structures are compiler sensitive #endif } inquiry_reply_t; #define DEVQUAL_OK 0x00 /* device is connected to this lun */ #define DEVQUAL_MIA 0x01 /* device not connected to lun */ #define DEVQUAL_RSVD 0x02 /* reserved */ #define DEVQUAL_NODEV 0x03 /* target doesn't support dev on lun */ #define DEVQUAL_VUMASK 0x04 /* 1XXb is vendor specific */ #define DEVTYPE_DISK 0x00 /* read/write disks */ #define DEVTYPE_TAPE 0x01 /* tapes and other sequential devices*/ #define DEVTYPE_PRINTER 0x02 /* printers */ #define DEVTYPE_PROCESSOR 0x03 /* cpu's */ #define DEVTYPE_WORM 0x04 /* write-once optical disks */ #define DEVTYPE_CDROM 0x05 /* cd rom's, etc */ #define DEVTYPE_SCANNER 0x06 #define DEVTYPE_OPTICAL 0x07 /* other optical storage */ #define DEVTYPE_CHANGER 0x08 /* jukebox */ #define DEVTYPE_COMM 0x09 /* communication device */ #define DEVTYPE_GRAPH_A 0x0a /* ASC IT8 graphics */ #define DEVTYPE_GRAPH_B 0x0b /* ASC IT8 graphics */ #define DEVTYPE_NOTPRESENT 0x1f /* logical unit not present */ /* * read capacity reply */ typedef struct capacity_reply { #if __BIG_ENDIAN__ u_int cr_lastlba; /* last logical block address */ u_int cr_blklen; /* block length */ #elif __LITTLE_ENDIAN__ u_char cr_lastlba3; u_char cr_lastlba2; u_char cr_lastlba1; u_char cr_lastlba0; u_char cr_blklen3; u_char cr_blklen2; u_char cr_blklen1; u_char cr_blklen0; #else #error SCSI command / data structures are compiler sensitive #endif } capacity_reply_t; /* * Standard Mode Select/Mode Sense data structures */ typedef struct mode_sel_hdr { #if __BIG_ENDIAN__ u_char msh_sd_length_0; /* byte 0 - length (mode sense * only) */ u_char msh_med_type; /* medium type - random access * devices only */ u_char msh_wp:1, /* byte 2 bit 7 - write protect * mode sense only) */ msh_bufmode:3, /* buffered mode - sequential * access devices only */ msh_speed:4; /* speed - sequential access * devices only */ u_char msh_bd_length; /* block descriptor length */ #elif __LITTLE_ENDIAN__ u_char msh_sd_length_0; u_char msh_med_type; u_char msh_speed :4, msh_bufmode :3, msh_wp :1; u_char msh_bd_length; #else #error SCSI command / data structures are compiler sensitive #endif } mode_sel_hdr_t; typedef struct mode_sel_bd { /* block descriptor */ #if __BIG_ENDIAN__ u_int msbd_density:8, msbd_numblocks:24; u_int msbd_rsvd_0:8, /* byte 4 - reserved */ msbd_blocklength:24; #elif __LITTLE_ENDIAN__ u_char msbd_density; u_char msbd_numblocks2; u_char msbd_numblocks1; u_char msbd_numblocks0; u_char msbd_rsvd_0; u_char msbd_blocklength2; u_char msbd_blocklength1; u_char msbd_blocklength0; #else #error SCSI command / data structures are compiler sensitive #endif } mode_sel_bd_t; #define MODSEL_DATA_LEN 0x30 typedef struct mode_sel_data { /* transferred to/from target during mode select/mode sense */ struct mode_sel_hdr msd_header; struct mode_sel_bd msd_blockdescript; u_char msd_vudata[MODSEL_DATA_LEN]; /* for vendor unique data */ } mode_sel_data_t; /* * struct for MTIOCMODSEL/ MTIOCMODSEN */ typedef struct modesel_parms { struct mode_sel_data msp_data; int msp_bcount; /* # of bytes to DMA */ } modesel_parms_t; /* * Day-to-day constants in the SCSI world */ #define SCSI_NTARGETS 8 /* 0 - 7 for target numbers */ #define SCSI_NLUNS 8 /* 0 - 7 luns for each target */ /* * Defect list header * Used by FORMAT and REASSIGN BLOCK commands */ struct defect_header { #if __BIG_ENDIAN__ u_char dh_mbz1; u_char dh_fov:1, /* format options valid */ dh_dpry:1, /* disable primary */ dh_dcrt:1, /* disable certification */ dh_stpf:1, /* stop format */ dh_mbz2:4; u_short dh_len; /* items in defect list */ #elif __LITTLE_ENDIAN__ u_char dh_mbz1; u_char dh_mbz2 :4, dh_stpf :1, dh_dcrt :1, dh_dpry :1, dh_fov :1; u_char dh_len1; u_char dh_len0; #else #error SCSI command / data structures are compiler sensitive #endif }; /* * Status for scsi_req (see below). */ typedef enum { SR_IOST_GOOD = 0, /* successful */ SR_IOST_SELTO = 1, /* selection timeout */ SR_IOST_CHKSV = 2, /* check status, sr_esense */ /* valid */ SR_IOST_CHKSNV = 3, /* check status, sr_esense */ /* not valid */ SR_IOST_DMAOR = 4, /* target attempted to move */ /* more than sr_dma_max */ /* bytes */ SR_IOST_IOTO = 5, /* sr_ioto exceeded */ SR_IOST_BV = 6, /* SCSI Bus violation */ SR_IOST_CMDREJ = 7, /* command reject (by * driver) */ SR_IOST_MEMALL = 8, /* memory allocation failure */ SR_IOST_MEMF = 9, /* memory fault */ SR_IOST_PERM = 10, /* not super user */ SR_IOST_NOPEN = 11, /* device not open */ SR_IOST_TABT = 12, /* target aborted command */ ST_IOST_BADST = 13, /* bad SCSI status byte */ /* (other than check status)*/ #define SR_IOST_BADST ST_IOST_BADST ST_IOST_INT = 14, /* internal driver error */ #define SR_IOST_INT ST_IOST_INT SR_IOST_BCOUNT = 15, /* unexpected byte count */ /* seen on SCSI bus */ SR_IOST_VOLNA = 16, /* desired volume not available */ SR_IOST_WP = 17, /* Media Write Protected */ SR_IOST_ALIGN = 18, /* DMA alignment error */ SR_IOST_IPCFAIL = 19, /* Mach IPC failure */ SR_IOST_RESET = 20, /* bus was reset during * processing of command */ SR_IOST_PARITY = 21, /* SCSI Bus Parity Error */ SR_IOST_HW = 22, /* Gross Hardware Failure */ SR_IOST_DMA = 23, /* DMA error */ SR_IOST_INVALID = 100, /* should never be seen */ } sc_status_t; /* * DMA Direction. */ typedef enum { SR_DMA_RD = 0, /* DMA from device to host */ SR_DMA_WR = 1, /* DMA from host to device */ } sc_dma_dir_t; /* * SCSI Request used by sg driver via SGIOCREQ and internally in st driver */ typedef struct scsi_req { /*** inputs ***/ cdb_t sr_cdb; /* command descriptor block - * one of three formats */ sc_dma_dir_t sr_dma_dir; /* DMA direction */ caddr_t sr_addr; /* memory addr for data * transfers */ int sr_dma_max; /* maximum number of bytes to * transfer */ int sr_ioto; /* I/O timeout in seconds */ /*** outputs ***/ int sr_io_status; /* driver status */ u_char sr_scsi_status; /* SCSI status byte */ esense_reply_t sr_esense; /* extended sense in case of * check status */ int sr_dma_xfr; /* actual number of bytes * transferred by DMA */ struct timeval sr_exec_time; /* execution time in * microseconds */ /*** for driver's internal use ***/ u_char sr_flags; queue_chain_t sr_io_q; /* for linking onto sgdp-> * sdg_io_q */ } scsi_req_t; typedef struct scsi_adr { u_char sa_target; u_char sa_lun; } scsi_adr_t; /* * Generic SCSI ioctl requests */ #define SGIOCSTL _IOW ('s', 0, struct scsi_adr) /* set target/lun */ #define SGIOCREQ _IOWR('s', 1, struct scsi_req) /* cmd request */ #define SGIOCENAS _IO( 's', 2) /* enable autosense */ #define SGIOCDAS _IO( 's', 3) /* disable autosense */ #define SGIOCRST _IO( 's', 4) /* reset SCSI bus */ #define SGIOCCNTR _IOW( 's', 6, int) /* select controller */ /* * ioctl requests specific to SCSI disks */ #define SDIOCSRQ _IOWR('s', 1, struct scsi_req) /* cmd request using */ /* struct scsi_req */ #define SDIOCGETCAP _IOR ('s', 5, struct capacity_reply) /* Get Read * Capacity info */ /* * ioctl requests specific to SCSI tapes */ #define MTIOCFIXBLK _IOW('m', 5, int ) /* set fixed block mode */ #define MTIOCVARBLK _IO('m', 6) /* set variable block mode */ #define MTIOCMODSEL _IOW('m', 7, struct modesel_parms) /* mode select */ #define MTIOCMODSEN _IOWR('m',8, struct modesel_parms) /* mode sense */ #define MTIOCINILL _IO('m', 9) /* inhibit illegal length */ /* errors */ #define MTIOCALILL _IO('m', 10) /* allow illegal length */ /* errors */ #define MTIOCSRQ _IOWR('m', 11, struct scsi_req) /* cmd request using * struct scsi_req */ /* * constants used in scsi_req */ /*** sr_dma_dir ***/ #endif _BSD_DEV_SCSIREG_
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.