|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.