|
|
1.1 ! root 1: /* ! 2: * Mach Operating System ! 3: * Copyright (c) 1991,1990 Carnegie Mellon University ! 4: * All Rights Reserved. ! 5: * ! 6: * Permission to use, copy, modify and distribute this software and its ! 7: * documentation is hereby granted, provided that both the copyright ! 8: * notice and this permission notice appear in all copies of the ! 9: * software, derivative works or modified versions, and any portions ! 10: * thereof, and that both notices appear in supporting documentation. ! 11: * ! 12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 15: * ! 16: * Carnegie Mellon requests users of this software to return to ! 17: * ! 18: * Software Distribution Coordinator or [email protected] ! 19: * School of Computer Science ! 20: * Carnegie Mellon University ! 21: * Pittsburgh PA 15213-3890 ! 22: * ! 23: * any improvements or extensions that they make and grant Carnegie Mellon ! 24: * the rights to redistribute these changes. ! 25: */ ! 26: /* ! 27: * File: scsi.h ! 28: * Author: Alessandro Forin, Carnegie Mellon University ! 29: * Date: 9/90 ! 30: * ! 31: * Definitions of the SCSI-1 Standard ! 32: */ ! 33: ! 34: #ifndef _SCSI_SCSI_H_ ! 35: #define _SCSI_SCSI_H_ ! 36: ! 37: #include <nscsi.h> ! 38: #include <scsi/scsi_endian.h> ! 39: ! 40: /* ! 41: * Bus phases ! 42: */ ! 43: ! 44: #define SCSI_IO 0x01 /* Input/Output */ ! 45: #define SCSI_CD 0x02 /* Command/Data */ ! 46: #define SCSI_MSG 0x04 /* Message */ ! 47: ! 48: #define SCSI_PHASE_MASK 0x07 ! 49: #define SCSI_PHASE(x) ((x)&SCSI_PHASE_MASK) ! 50: ! 51: #define SCSI_PHASE_DATAO 0x00 /* 0 */ ! 52: #define SCSI_PHASE_DATAI SCSI_IO /* 1 */ ! 53: #define SCSI_PHASE_CMD SCSI_CD /* 2 */ ! 54: #define SCSI_PHASE_STATUS (SCSI_CD|SCSI_IO) /* 3 */ ! 55: /* 4..5 ANSI reserved */ ! 56: #define SCSI_PHASE_MSG_OUT (SCSI_MSG|SCSI_CD) /* 6 */ ! 57: #define SCSI_PHASE_MSG_IN (SCSI_MSG|SCSI_CD|SCSI_IO) /* 7 */ ! 58: ! 59: /* ! 60: * Single byte messages ! 61: * ! 62: * originator: I-nitiator T-arget ! 63: * T-support: M-andatory O-ptional ! 64: */ ! 65: ! 66: #define SCSI_COMMAND_COMPLETE 0x00 /* M T */ ! 67: #define SCSI_EXTENDED_MESSAGE 0x01 /* IT */ ! 68: #define SCSI_SAVE_DATA_POINTER 0x02 /* O T */ ! 69: #define SCSI_RESTORE_POINTERS 0x03 /* O T */ ! 70: #define SCSI_DISCONNECT 0x04 /* O T */ ! 71: #define SCSI_I_DETECTED_ERROR 0x05 /* M I */ ! 72: #define SCSI_ABORT 0x06 /* M I */ ! 73: #define SCSI_MESSAGE_REJECT 0x07 /* M IT */ ! 74: #define SCSI_NOP 0x08 /* M I */ ! 75: #define SCSI_MSG_PARITY_ERROR 0x09 /* M I */ ! 76: #define SCSI_LNKD_CMD_COMPLETE 0x0a /* O T */ ! 77: #define SCSI_LNKD_CMD_COMPLETE_F 0x0b /* O T */ ! 78: #define SCSI_BUS_DEVICE_RESET 0x0c /* M I */ ! 79: /* 0x0d..0x11 scsi2 */ ! 80: /* 0x12..0x1f reserved */ ! 81: #define SCSI_IDENTIFY 0x80 /* IT */ ! 82: # define SCSI_IFY_ENABLE_DISCONNECT 0x40 /* I */ ! 83: # define SCSI_IFY_LUNTAR 0x20 /* IT */ ! 84: # define SCSI_IFY_LUN_MASK 0x07 /* IT */ ! 85: ! 86: ! 87: /* Message codes 0x30..0x7f are reserved */ ! 88: ! 89: /* ! 90: * Extended messages, codes and formats ! 91: */ ! 92: ! 93: #define SCSI_MODIFY_DATA_PTR 0x00 /* T */ ! 94: typedef struct { ! 95: unsigned char xtn_msg_tag; /* const 0x01 */ ! 96: unsigned char xtn_msg_len; /* const 0x05 */ ! 97: unsigned char xtn_msg_code; /* const 0x00 */ ! 98: unsigned char xtn_msg_arg_1000; /* MSB, signed 2cmpl */ ! 99: unsigned char xtn_msg_arg_0200; ! 100: unsigned char xtn_msg_arg_0030; ! 101: unsigned char xtn_msg_arg_0004; /* LSB */ ! 102: } scsi_mod_ptr_t; ! 103: ! 104: #define SCSI_SYNC_XFER_REQUEST 0x01 /* IT */ ! 105: typedef struct { ! 106: unsigned char xtn_msg_tag; /* const 0x01 */ ! 107: unsigned char xtn_msg_len; /* const 0x03 */ ! 108: unsigned char xtn_msg_code; /* const 0x01 */ ! 109: unsigned char xtn_msg_xfer_period; /* times 4nsecs */ ! 110: unsigned char xtn_msg_xfer_offset; /* pending ack window */ ! 111: #define SCSI_SYNCH_XFER_OFFANY 0xff /* T unlimited */ ! 112: } scsi_synch_xfer_req_t; ! 113: ! 114: #define SCSI_XTN_IDENTIFY 0x02 /* IT -2 */ ! 115: typedef struct { ! 116: unsigned char xtn_msg_tag; /* const 0x01 */ ! 117: unsigned char xtn_msg_len; /* const 0x02 */ ! 118: unsigned char xtn_msg_code; /* const 0x02 */ ! 119: unsigned char xtn_msg_sublun; ! 120: } scsi_xtn_identify_t; ! 121: ! 122: /* 0x03..0x7f reserved */ ! 123: ! 124: #define SCSI_XTN_VENDOR_UQE 0x80 /* vendor unique bit */ ! 125: typedef struct { ! 126: unsigned char xtn_msg_tag; /* const 0x01 */ ! 127: unsigned char xtn_msg_len; /* args' len+1 (0-->256)*/ ! 128: unsigned char xtn_msg_code; /* const 0x80..0xff */ ! 129: unsigned char xtn_msg_args[1]; /* 0..255 bytes */ ! 130: } scsi_xtn_vedor_unique_t; ! 131: ! 132: ! 133: /* ! 134: * Commands, generic structures ! 135: */ ! 136: ! 137: /* SIX byte commands */ ! 138: typedef struct { ! 139: unsigned char scsi_cmd_code; /* group(7..5) and command(4..1) */ ! 140: #define SCSI_CODE_GROUP 0xe0 ! 141: #define SCSI_CODE_CMD 0x1f ! 142: unsigned char scsi_cmd_lun_and_lba1; /* lun(7..5) and block# msb[20..16] */ ! 143: #define SCSI_LUN_MASK 0xe0 ! 144: #define SCSI_LBA_MASK 0x1f ! 145: #define SCSI_LUN_SHIFT 5 ! 146: unsigned char scsi_cmd_lba2; /* block#[15.. 8] */ ! 147: unsigned char scsi_cmd_lba3; /* block#[ 7.. 0] */ ! 148: unsigned char scsi_cmd_xfer_len; /* if required */ ! 149: unsigned char scsi_cmd_ctrl_byte; /* contains: */ ! 150: #define SCSI_CTRL_VUQ 0xc0 /* vendor unique bits */ ! 151: #define SCSI_CTRL_RESVD 0x3c /* reserved, mbz */ ! 152: #define SCSI_CTRL_FLAG 0x02 /* send a complete_with_flag at end */ ! 153: #define SCSI_CTRL_LINK 0x01 /* link this command with next */ ! 154: } scsi_command_group_0; ! 155: ! 156: /* TEN byte commands */ ! 157: typedef struct { ! 158: unsigned char scsi_cmd_code; /* group(7..5) and command(4..1) */ ! 159: unsigned char scsi_cmd_lun_and_relbit;/* lun(7..5) and RelAdr(0) */ ! 160: #define SCSI_RELADR 0x01 ! 161: unsigned char scsi_cmd_lba1; /* block#[31..24] */ ! 162: unsigned char scsi_cmd_lba2; /* block#[23..16] */ ! 163: unsigned char scsi_cmd_lba3; /* block#[15.. 8] */ ! 164: unsigned char scsi_cmd_lba4; /* block#[ 7.. 0] */ ! 165: unsigned char scsi_cmd_xxx; /* reserved, mbz */ ! 166: unsigned char scsi_cmd_xfer_len_1; /* if required */ ! 167: unsigned char scsi_cmd_xfer_len_2; /* if required */ ! 168: unsigned char scsi_cmd_ctrl_byte; /* see above */ ! 169: } scsi_command_group_1, ! 170: scsi_command_group_2; ! 171: ! 172: /* TWELVE byte commands */ ! 173: typedef struct { ! 174: unsigned char scsi_cmd_code; /* group(7..5) and command(4..1) */ ! 175: unsigned char scsi_cmd_lun_and_relbit;/* lun(7..5) and RelAdr(0) */ ! 176: unsigned char scsi_cmd_lba1; /* block#[31..24] */ ! 177: unsigned char scsi_cmd_lba2; /* block#[23..16] */ ! 178: unsigned char scsi_cmd_lba3; /* block#[15.. 8] */ ! 179: unsigned char scsi_cmd_lba4; /* block#[ 7.. 0] */ ! 180: unsigned char scsi_cmd_xfer_len_1; /* if required */ ! 181: unsigned char scsi_cmd_xfer_len_2; /* if required */ ! 182: unsigned char scsi_cmd_xfer_len_3; /* if required */ ! 183: unsigned char scsi_cmd_xfer_len_4; /* if required */ ! 184: unsigned char scsi_cmd_xxx1; /* reserved, mbz */ ! 185: unsigned char scsi_cmd_ctrl_byte; /* see above */ ! 186: } scsi_command_group_5; ! 187: ! 188: ! 189: /* ! 190: * Commands, codes and aliases ! 191: */ ! 192: ! 193: /* GROUP 0 */ ! 194: #define SCSI_CMD_TEST_UNIT_READY 0x00 /* O all 2M all */ ! 195: #define scsi_cmd_test_unit_ready_t scsi_command_group_0 ! 196: ! 197: #define SCSI_CMD_REZERO_UNIT 0x01 /* O disk worm rom */ ! 198: #define SCSI_CMD_REWIND 0x01 /* M tape */ ! 199: #define scsi_cmd_rewind_t scsi_command_group_0 ! 200: #define scsi_cmd_rezero_t scsi_command_group_0 ! 201: # define SCSI_CMD_REW_IMMED 0x01 ! 202: ! 203: /* 0x02 vendor unique */ ! 204: ! 205: #define SCSI_CMD_REQUEST_SENSE 0x03 /* M all */ ! 206: #define scsi_cmd_request_sense_t scsi_command_group_0 ! 207: # define scsi_cmd_allocation_length scsi_cmd_xfer_len ! 208: ! 209: #define SCSI_CMD_FORMAT_UNIT 0x04 /* M disk O prin */ ! 210: #define scsi_cmd_format_t scsi_command_group_0 ! 211: # define SCSI_CMD_FMT_FMTDATA 0x10 ! 212: # define SCSI_CMD_FMT_CMPLIST 0x08 ! 213: # define SCSI_CMD_FMT_LIST_TYPE 0x07 ! 214: # define scsi_cmd_intleave1 scsi_cmd_lba3 ! 215: # define scsi_cmd_intleave2 scsi_cmd_xfer_len ! 216: ! 217: #define SCSI_CMD_READ_BLOCK_LIMITS 0x05 /* E tape */ ! 218: #define scsi_cmd_block_limits_t scsi_command_group_0 ! 219: ! 220: /* 0x06 vendor unique */ ! 221: ! 222: #define SCSI_CMD_REASSIGN_BLOCKS 0x07 /* O disk worm */ ! 223: #define scsi_cmd_reassign_blocks_t scsi_command_group_0 ! 224: ! 225: #define SCSI_CMD_READ 0x08 /* M disk tape O worm rom */ ! 226: #define SCSI_CMD_RECEIVE 0x08 /* O proc */ ! 227: #define SCSI_CMD_GET_MESSAGE 0x08 /* M comm */ ! 228: #define scsi_cmd_read_t scsi_command_group_0 ! 229: # define SCSI_CMD_TP_FIXED 0x01 /* tape */ ! 230: # define scsi_cmd_tp_len1 scsi_cmd_lba2 ! 231: # define scsi_cmd_tp_len2 scsi_cmd_lba3 ! 232: # define scsi_cmd_tp_len3 scsi_cmd_xfer_len ! 233: /* largest addressable blockno */ ! 234: #define SCSI_CMD_READ_MAX_LBA ((1 << 21) - 1) ! 235: ! 236: /* 0x09 vendor unique */ ! 237: ! 238: #define SCSI_CMD_WRITE 0x0a /* M disk tape O worm */ ! 239: #define SCSI_CMD_PRINT 0x0a /* M prin */ ! 240: #define SCSI_CMD_SEND 0x0a /* M proc */ ! 241: #define SCSI_CMD_SEND_MESSAGE 0x0a /* M comm */ ! 242: #define scsi_cmd_write_t scsi_command_group_0 ! 243: ! 244: #define SCSI_CMD_SEEK 0x0b /* O disk worm rom */ ! 245: #define SCSI_CMD_TRACK_SELECT 0x0b /* O tape */ ! 246: #define SCSI_CMD_SLEW_AND_PRINT 0x0b /* O prin */ ! 247: #define scsi_cmd_seek_t scsi_command_group_0 ! 248: # define SCSI_CMD_SLW_CHANNEL 0x01 ! 249: # define scsi_cmd_tp_trackno scsi_cmd_xfer_len ! 250: # define scsi_cmd_slew_value scsi_cmd_lba2 ! 251: ! 252: /* 0x0c..0x0e vendor unique */ ! 253: ! 254: #define SCSI_CMD_READ_REVERSE 0x0f /* O tape */ ! 255: #define scsi_cmd_rev_read_t scsi_command_group_0 ! 256: ! 257: #define SCSI_CMD_WRITE_FILEMARKS 0x10 /* M tape */ ! 258: #define SCSI_CMD_FLUSH_BUFFER 0x10 /* M prin */ ! 259: #define scsi_cmd_write_fil_t scsi_command_group_0 ! 260: ! 261: #define SCSI_CMD_SPACE 0x11 /* O tape */ ! 262: #define scsi_cmd_space_t scsi_command_group_0 ! 263: # define SCSI_CMD_SP_BLOCKS 0x00 ! 264: # define SCSI_CMD_SP_FIL 0x01 ! 265: # define SCSI_CMD_SP_SEQ_FIL 0x02 ! 266: # define SCSI_CMD_SP_EOT 0x03 ! 267: ! 268: #define SCSI_CMD_INQUIRY 0x12 /* E all (2M all) */ ! 269: #define scsi_cmd_inquiry_t scsi_command_group_0 ! 270: # define SCSI_CMD_INQ_EVPD 0x01 /* 2 */ ! 271: # define scsi_cmd_page_code scsi_cmd_lba2 /* 2 */ ! 272: ! 273: #define SCSI_CMD_VERIFY_0 0x13 /* O tape */ ! 274: #define scsi_cmd_verify_t scsi_command_group_0 ! 275: # define SCSI_CMD_VFY_BYTCMP 0x02 ! 276: ! 277: #define SCSI_CMD_RECOVER_BUFFERED_DATA 0x14 /* O tape prin */ ! 278: #define scsi_cmd_recover_buffer_t scsi_command_group_0 ! 279: ! 280: #define SCSI_CMD_MODE_SELECT 0x15 /* O disk tape prin worm rom */ ! 281: # define SCSI_CMD_MSL_PF 0x10 ! 282: # define SCSI_CMD_MSL_SP 0x01 ! 283: #define scsi_cmd_mode_select_t scsi_command_group_0 ! 284: ! 285: #define SCSI_CMD_RESERVE 0x16 /* O disk tape prin worm rom */ ! 286: #define scsi_cmd_reserve_t scsi_command_group_0 ! 287: # define SCSI_CMD_RES_3RDPTY 0x10 ! 288: # define SCSI_CMD_RES_3RDPTY_DEV 0x0e ! 289: # define SCSI_CMD_RES_EXTENT 0x01 ! 290: # define scsi_cmd_reserve_id scsi_cmd_lba2 ! 291: # define scsi_cmd_extent_llen1 scsi_cmd_lba3 ! 292: # define scsi_cmd_extent_llen2 scsi_cmd_xfer_len ! 293: ! 294: #define SCSI_CMD_RELEASE 0x17 /* O disk tape prin worm rom */ ! 295: #define scsi_cmd_release_t scsi_command_group_0 ! 296: ! 297: #define SCSI_CMD_COPY 0x18 /* O all */ ! 298: #define scsi_cmd_copy_t scsi_command_group_0 ! 299: # define SCSI_CMD_CPY_PAD 0x01 /* 2 */ ! 300: # define scsi_cmd_paraml_len0 scsi_cmd_lba2 ! 301: # define scsi_cmd_paraml_len1 scsi_cmd_lba3 ! 302: # define scsi_cmd_paraml_len2 scsi_cmd_xfer_len ! 303: ! 304: #define SCSI_CMD_ERASE 0x19 /* O tape */ ! 305: #define scsi_cmd_erase_t scsi_command_group_0 ! 306: # define SCSI_CMD_ER_LONG 0x01 ! 307: ! 308: #define SCSI_CMD_MODE_SENSE 0x1a /* O disk tape prin worm rom */ ! 309: #define scsi_cmd_mode_sense_t scsi_command_group_0 ! 310: # define scsi_cmd_ms_pagecode scsi_cmd_lba2 ! 311: ! 312: #define SCSI_CMD_START_STOP_UNIT 0x1b /* O disk prin worm rom */ ! 313: #define SCSI_CMD_LOAD_UNLOAD 0x1b /* O tape */ ! 314: #define scsi_cmd_start_t scsi_command_group_0 ! 315: # define SCSI_CMD_SS_IMMED 0x01 ! 316: # define scsi_cmd_ss_flags scsi_cmd_xfer_len ! 317: # define SCSI_CMD_SS_START 0x01 ! 318: # define SCSI_CMD_SS_RETEN 0x02 ! 319: # define SCSI_CMD_SS_RETAIN 0x01 ! 320: # define SCSI_CMD_SS_EJECT 0x02 ! 321: ! 322: #define SCSI_CMD_RECEIVE_DIAG_RESULTS 0x1c /* O all */ ! 323: #define scsi_cmd_receive_diag_t scsi_command_group_0 ! 324: # define scsi_cmd_allocation_length1 scsi_cmd_lba3 ! 325: # define scsi_cmd_allocation_length2 scsi_cmd_xfer_len ! 326: ! 327: #define SCSI_CMD_SEND_DIAGNOSTICS 0x1d /* O all */ ! 328: #define scsi_cmd_send_diag_t scsi_command_group_0 ! 329: # define SCSI_CMD_DIAG_SELFTEST 0x04 ! 330: # define SCSI_CMD_DIAG_DEVOFFL 0x02 ! 331: # define SCSI_CMD_DIAG_UNITOFFL 0x01 ! 332: ! 333: #define SCSI_CMD_PREVENT_ALLOW_REMOVAL 0x1e /* O disk tape worm rom */ ! 334: #define scsi_cmd_medium_removal_t scsi_command_group_0 ! 335: # define scsi_cmd_pa_prevent scsi_cmd_xfer_len /* 0x1 */ ! 336: ! 337: /* 0x1f reserved */ ! 338: ! 339: /* GROUP 1 */ ! 340: /* 0x20..0x24 vendor unique */ ! 341: ! 342: #define SCSI_CMD_READ_CAPACITY 0x25 /* E disk worm rom */ ! 343: #define scsi_cmd_read_capacity_t scsi_command_group_1 ! 344: # define scsi_cmd_rcap_flags scsi_cmd_xfer_len_2 ! 345: # define SCSI_CMD_RCAP_PMI 0x01 ! 346: ! 347: /* 0x26..0x27 vendor unique */ ! 348: ! 349: #define SCSI_CMD_LONG_READ 0x28 /* E disk M worm rom */ ! 350: #define scsi_cmd_long_read_t scsi_command_group_1 ! 351: ! 352: /* 0x29 vendor unique */ ! 353: ! 354: #define SCSI_CMD_LONG_WRITE 0x2a /* E disk M worm */ ! 355: #define scsi_cmd_long_write_t scsi_command_group_1 ! 356: ! 357: #define SCSI_CMD_LONG_SEEK 0x2b /* O disk worm rom */ ! 358: #define scsi_cmd_long_seek_t scsi_command_group_1 ! 359: ! 360: /* 0x2c..0x2d vendor unique */ ! 361: ! 362: #define SCSI_CMD_WRITE_AND_VERIFY 0x2e /* O disk worm */ ! 363: #define scsi_cmd_write_vfy_t scsi_command_group_1 ! 364: # define SCSI_CMD_VFY_BYTCHK 0x02 ! 365: ! 366: #define SCSI_CMD_VERIFY_1 0x2f /* O disk worm rom */ ! 367: #define scsi_cmd_verify_long_t scsi_command_group_1 ! 368: # define SCSI_CMD_VFY_BLKVFY 0x04 ! 369: ! 370: #define SCSI_CMD_SEARCH_HIGH 0x30 /* O disk worm rom */ ! 371: #define scsi_cmd_search_t scsi_command_group_1 ! 372: # define SCSI_CMD_SRCH_INVERT 0x10 ! 373: # define SCSI_CMD_SRCH_SPNDAT 0x02 ! 374: ! 375: #define SCSI_CMD_SEARCH_EQUAL 0x31 /* O disk worm rom */ ! 376: #define SCSI_CMD_SEARCH_LOW 0x32 /* O disk worm rom */ ! 377: ! 378: #define SCSI_CMD_SET_LIMITS 0x33 /* O disk worm rom */ ! 379: #define scsi_cmd_set_limits_t scsi_command_group_1 ! 380: # define SCSI_CMD_SL_RDINH 0x02 ! 381: # define SCSI_CMD_SL_WRINH 0x01 ! 382: ! 383: /* 0x34..0x38 reserved */ ! 384: ! 385: #define SCSI_CMD_COMPARE 0x39 /* O all */ ! 386: #define scsi_cmd_compare_t scsi_command_group_1 ! 387: # define scsi_cmd_1_paraml1 scsi_cmd_lba2 ! 388: # define scsi_cmd_1_paraml2 scsi_cmd_lba3 ! 389: # define scsi_cmd_1_paraml3 scsi_cmd_lba4 ! 390: ! 391: #define SCSI_CMD_COPY_AND_VERIFY 0x3a /* O all */ ! 392: #define scsi_cmd_copy_vfy_t scsi_command_group_1 ! 393: # define SCSI_CMD_CPY_BYTCHK 0x02 ! 394: ! 395: /* 0x3b..0x3f reserved */ ! 396: ! 397: /* GROUP 2 */ ! 398: /* 0x40..0x5f reserved */ ! 399: ! 400: /* GROUP 3 */ ! 401: /* 0x60..0x7f reserved */ ! 402: ! 403: /* GROUP 4 */ ! 404: /* 0x80..0x9f reserved */ ! 405: ! 406: /* GROUP 5 */ ! 407: /* 0xa0..0xaf vendor unique */ ! 408: /* 0xb0..0xbf reserved */ ! 409: ! 410: /* GROUP 6 */ ! 411: /* 0xc0..0xdf vendor unique */ ! 412: ! 413: /* GROUP 7 */ ! 414: /* 0xe0..0xff vendor unique */ ! 415: ! 416: ! 417: /* ! 418: * Command-specific results and definitions ! 419: */ ! 420: ! 421: /* inquiry data */ ! 422: typedef struct { ! 423: unsigned char periph_type; ! 424: #define SCSI_DISK 0x00 ! 425: #define SCSI_TAPE 0x01 ! 426: #define SCSI_PRINTER 0x02 ! 427: #define SCSI_CPU 0x03 ! 428: #define SCSI_WORM 0x04 ! 429: #define SCSI_CDROM 0x05 ! 430: ! 431: BITFIELD_2( unsigned char, ! 432: device_type : 7, ! 433: rmb : 1); ! 434: BITFIELD_3( unsigned char, ! 435: ansi : 3, ! 436: ecma : 3, ! 437: iso : 2); ! 438: unsigned char reserved; ! 439: unsigned char length; ! 440: unsigned char param[1]; ! 441: } scsi_inquiry_data_t; ! 442: ! 443: #define SCSI_INQ_STD_DATA -1 ! 444: ! 445: /* request sense data */ ! 446: #define SCSI_SNS_NOSENSE 0x0 ! 447: #define SCSI_SNS_RECOVERED 0x1 ! 448: #define SCSI_SNS_NOTREADY 0x2 ! 449: #define SCSI_SNS_MEDIUM_ERR 0x3 ! 450: #define SCSI_SNS_HW_ERR 0x4 ! 451: #define SCSI_SNS_ILLEGAL_REQ 0x5 ! 452: #define SCSI_SNS_UNIT_ATN 0x6 ! 453: #define SCSI_SNS_PROTECT 0x7 ! 454: #define SCSI_SNS_BLANK_CHK 0x8 ! 455: #define SCSI_SNS_VUQE 0x9 ! 456: #define SCSI_SNS_COPY_ABRT 0xa ! 457: #define SCSI_SNS_ABORTED 0xb ! 458: #define SCSI_SNS_EQUAL 0xc ! 459: #define SCSI_SNS_VOLUME_OVFL 0xd ! 460: #define SCSI_SNS_MISCOMPARE 0xe ! 461: #define SCSI_SNS_RESERVED 0xf ! 462: ! 463: typedef struct { ! 464: BITFIELD_3( unsigned char, ! 465: error_code : 4, ! 466: error_class : 3, ! 467: addr_valid : 1); ! 468: # define SCSI_SNS_XTENDED_SENSE_DATA 0x7 /* e.g. error_class=7 */ ! 469: union { ! 470: struct { ! 471: BITFIELD_2(unsigned char, ! 472: lba_msb : 5, ! 473: vuqe : 3); ! 474: unsigned char lba; ! 475: unsigned char lba_lsb; ! 476: } non_xtnded; ! 477: struct { ! 478: unsigned char segment_number; ! 479: BITFIELD_5(unsigned char, ! 480: sense_key : 4, ! 481: res : 1, ! 482: ili : 1, ! 483: eom : 1, ! 484: fm : 1); ! 485: unsigned char info0; ! 486: unsigned char info1; ! 487: unsigned char info2; ! 488: unsigned char info3; ! 489: unsigned char add_len; ! 490: unsigned char add_bytes[1];/* VARSIZE */ ! 491: } xtended; ! 492: } u; ! 493: } scsi_sense_data_t; ! 494: ! 495: ! 496: /* mode select params */ ! 497: typedef struct { ! 498: unsigned char reserved1; ! 499: unsigned char medium_type; ! 500: BITFIELD_3(unsigned char, ! 501: speed:4, /* special for tapes, reserved in SCSI-1 */ ! 502: buffer_mode:3, ! 503: reserved2:1); ! 504: unsigned char desc_len; ! 505: struct scsi_mode_parm_blockdesc { ! 506: unsigned char density_code; ! 507: unsigned char nblocks1; ! 508: unsigned char nblocks2; ! 509: unsigned char nblocks3; ! 510: unsigned char reserved; ! 511: unsigned char reclen1; ! 512: unsigned char reclen2; ! 513: unsigned char reclen3; ! 514: } descs[1]; /* VARSIZE, really */ ! 515: } scsi_mode_select_param_t; ! 516: ! 517: /* mode sense data (TAPE) */ ! 518: typedef struct { ! 519: unsigned char data_len; ! 520: unsigned char medium_type; ! 521: BITFIELD_3(unsigned char, ! 522: speed : 4, ! 523: buffered_mode : 3, ! 524: wp : 1); ! 525: unsigned char bdesc_len; ! 526: struct { ! 527: unsigned char density_code; ! 528: unsigned char no_blks_msb; ! 529: unsigned char no_blks; ! 530: unsigned char no_blks_lsb; ! 531: unsigned char reserved; ! 532: unsigned char blen_msb; ! 533: unsigned char blen; ! 534: unsigned char blen_lsb; ! 535: } bdesc[1]; /* VARSIZE */ ! 536: /* vuqe data might follow */ ! 537: } scsi_mode_sense_data_t; ! 538: ! 539: /* read capacity data */ ! 540: typedef struct { ! 541: unsigned char lba1; ! 542: unsigned char lba2; ! 543: unsigned char lba3; ! 544: unsigned char lba4; ! 545: unsigned char blen1; ! 546: unsigned char blen2; ! 547: unsigned char blen3; ! 548: unsigned char blen4; ! 549: } scsi_rcap_data_t; ! 550: ! 551: /* defect list(s) */ ! 552: typedef struct { ! 553: unsigned char res1; ! 554: unsigned char res2; ! 555: unsigned char list_len_msb; ! 556: unsigned char list_len_lsb; ! 557: struct { ! 558: unsigned char blockno_msb; ! 559: unsigned char blockno_sb1; ! 560: unsigned char blockno_sb2; ! 561: unsigned char blockno_lsb; ! 562: } defects[1]; /* VARSIZE */ ! 563: } scsi_Ldefect_data_t; ! 564: ! 565: /* block limits (tape) */ ! 566: typedef struct { ! 567: unsigned char res1; ! 568: unsigned char maxlen_msb; ! 569: unsigned char maxlen_sb; ! 570: unsigned char maxlen_lsb; ! 571: unsigned char minlen_msb; ! 572: unsigned char minlen_lsb; ! 573: } scsi_blimits_data_t; ! 574: ! 575: /* ! 576: * Status byte (a-la scsi1) ! 577: */ ! 578: ! 579: typedef union { ! 580: struct { ! 581: BITFIELD_4( unsigned char, ! 582: scsi_status_vendor_uqe1:1, ! 583: scsi_status_code:4, ! 584: scsi_status_vendor_uqe:2, ! 585: scsi_status_reserved:1); ! 586: # define SCSI_ST_GOOD 0x00 /* scsi_status_code values */ ! 587: # define SCSI_ST_CHECK_CONDITION 0x01 ! 588: # define SCSI_ST_CONDITION_MET 0x02 ! 589: # define SCSI_ST_BUSY 0x04 ! 590: # define SCSI_ST_INT_GOOD 0x08 ! 591: # define SCSI_ST_INT_MET 0x0a ! 592: # define SCSI_ST_RES_CONFLICT 0x0c ! 593: /* anything else is reserved */ ! 594: } st; ! 595: unsigned char bits; ! 596: } scsi_status_byte_t; ! 597: ! 598: ! 599: #endif _SCSI_SCSI_H_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.