Annotation of kernel/bsd/dev/scsireg.h, revision 1.1

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

unix.superglobalmegacorp.com

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