1139743Simp/*- 239213Sgibbs * Largely written by Julian Elischer (julian@tfs.com) 339213Sgibbs * for TRW Financial Systems. 439213Sgibbs * 539213Sgibbs * TRW Financial Systems, in accordance with their agreement with Carnegie 639213Sgibbs * Mellon University, makes this software available to CMU to distribute 739213Sgibbs * or use in any manner that they see fit as long as this message is kept with 839213Sgibbs * the software. For this reason TFS also grants any other persons or 939213Sgibbs * organisations permission to use or modify this software. 1039213Sgibbs * 1139213Sgibbs * TFS supplies this software to be publicly redistributed 1239213Sgibbs * on the understanding that TFS is not responsible for the correct 1339213Sgibbs * functioning of this software in any circumstances. 1439213Sgibbs * 1539213Sgibbs * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 1639213Sgibbs * 1750477Speter * $FreeBSD$ 1839213Sgibbs */ 1939213Sgibbs 2039213Sgibbs/* 2139213Sgibbs * SCSI general interface description 2239213Sgibbs */ 2339213Sgibbs 2439213Sgibbs#ifndef _SCSI_SCSI_ALL_H 25208905Smjacob#define _SCSI_SCSI_ALL_H 1 2639213Sgibbs 2739213Sgibbs#include <sys/cdefs.h> 28225950Sken#include <machine/stdarg.h> 2939213Sgibbs 3055205Speter#ifdef _KERNEL 3139213Sgibbs/* 3247413Sgibbs * This is the number of seconds we wait for devices to settle after a SCSI 3347413Sgibbs * bus reset. 3447413Sgibbs */ 35102862Sbrooksextern int scsi_delay; 3655205Speter#endif /* _KERNEL */ 3747413Sgibbs 3847413Sgibbs/* 3939213Sgibbs * SCSI command format 4039213Sgibbs */ 4139213Sgibbs 4239213Sgibbs/* 4339213Sgibbs * Define dome bits that are in ALL (or a lot of) scsi commands 4439213Sgibbs */ 45208905Smjacob#define SCSI_CTL_LINK 0x01 46208905Smjacob#define SCSI_CTL_FLAG 0x02 47208905Smjacob#define SCSI_CTL_VENDOR 0xC0 4839213Sgibbs#define SCSI_CMD_LUN 0xA0 /* these two should not be needed */ 4939213Sgibbs#define SCSI_CMD_LUN_SHIFT 5 /* LUN in the cmd is no longer SCSI */ 5039213Sgibbs 51208905Smjacob#define SCSI_MAX_CDBLEN 16 /* 5239213Sgibbs * 16 byte commands are in the 5339213Sgibbs * SCSI-3 spec 5439213Sgibbs */ 5539213Sgibbs#if defined(CAM_MAX_CDBLEN) && (CAM_MAX_CDBLEN < SCSI_MAX_CDBLEN) 5639213Sgibbs#error "CAM_MAX_CDBLEN cannot be less than SCSI_MAX_CDBLEN" 5739213Sgibbs#endif 5839213Sgibbs 5963171Smjacob/* 6byte CDBs special case 0 length to be 256 */ 60208905Smjacob#define SCSI_CDB6_LEN(len) ((len) == 0 ? 256 : len) 6163171Smjacob 6239213Sgibbs/* 6339213Sgibbs * This type defines actions to be taken when a particular sense code is 6439213Sgibbs * received. Right now, these flags are only defined to take up 16 bits, 6539213Sgibbs * but can be expanded in the future if necessary. 6639213Sgibbs */ 6739213Sgibbstypedef enum { 6839213Sgibbs SS_NOP = 0x000000, /* Do nothing */ 6939213Sgibbs SS_RETRY = 0x010000, /* Retry the command */ 7039213Sgibbs SS_FAIL = 0x020000, /* Bail out */ 7139213Sgibbs SS_START = 0x030000, /* Send a Start Unit command to the device, 7239213Sgibbs * then retry the original command. 7339213Sgibbs */ 7439213Sgibbs SS_TUR = 0x040000, /* Send a Test Unit Ready command to the 7539213Sgibbs * device, then retry the original command. 7639213Sgibbs */ 7739213Sgibbs SS_MASK = 0xff0000 7839213Sgibbs} scsi_sense_action; 7939213Sgibbs 8039213Sgibbstypedef enum { 8139213Sgibbs SSQ_NONE = 0x0000, 8239213Sgibbs SSQ_DECREMENT_COUNT = 0x0100, /* Decrement the retry count */ 8339213Sgibbs SSQ_MANY = 0x0200, /* send lots of recovery commands */ 8439213Sgibbs SSQ_RANGE = 0x0400, /* 8574840Sken * This table entry represents the 8674840Sken * end of a range of ASCQs that 8774840Sken * have identical error actions 8874840Sken * and text. 8939213Sgibbs */ 9039213Sgibbs SSQ_PRINT_SENSE = 0x0800, 91253322Smav SSQ_UA = 0x1000, /* Broadcast UA. */ 92253322Smav SSQ_RESCAN = 0x2000, /* Rescan target for LUNs. */ 93253322Smav SSQ_LOST = 0x4000, /* Destroy the LUNs. */ 9439213Sgibbs SSQ_MASK = 0xff00 9539213Sgibbs} scsi_sense_action_qualifier; 9639213Sgibbs 9739213Sgibbs/* Mask for error status values */ 98208905Smjacob#define SS_ERRMASK 0xff 9939213Sgibbs 10074840Sken/* The default, retyable, error action */ 101208905Smjacob#define SS_RDEF SS_RETRY|SSQ_DECREMENT_COUNT|SSQ_PRINT_SENSE|EIO 10239213Sgibbs 10374840Sken/* The retyable, error action, with table specified error code */ 104208905Smjacob#define SS_RET SS_RETRY|SSQ_DECREMENT_COUNT|SSQ_PRINT_SENSE 10539213Sgibbs 10674840Sken/* Fatal error action, with table specified error code */ 107208905Smjacob#define SS_FATAL SS_FAIL|SSQ_PRINT_SENSE 10839213Sgibbs 10939213Sgibbsstruct scsi_generic 11039213Sgibbs{ 11139213Sgibbs u_int8_t opcode; 11239213Sgibbs u_int8_t bytes[11]; 11339213Sgibbs}; 11439213Sgibbs 11539213Sgibbsstruct scsi_request_sense 11639213Sgibbs{ 11739213Sgibbs u_int8_t opcode; 11839213Sgibbs u_int8_t byte2; 119223081Sgibbs#define SRS_DESC 0x01 12039213Sgibbs u_int8_t unused[2]; 12139213Sgibbs u_int8_t length; 12239213Sgibbs u_int8_t control; 12339213Sgibbs}; 12439213Sgibbs 12539213Sgibbsstruct scsi_test_unit_ready 12639213Sgibbs{ 12739213Sgibbs u_int8_t opcode; 12839213Sgibbs u_int8_t byte2; 12939213Sgibbs u_int8_t unused[3]; 13039213Sgibbs u_int8_t control; 13139213Sgibbs}; 13239213Sgibbs 133223081Sgibbsstruct scsi_receive_diag { 134223081Sgibbs uint8_t opcode; 135223081Sgibbs uint8_t byte2; 136223081Sgibbs#define SRD_PCV 0x01 137223081Sgibbs uint8_t page_code; 138223081Sgibbs uint8_t length[2]; 139223081Sgibbs uint8_t control; 14039213Sgibbs}; 14139213Sgibbs 142223081Sgibbsstruct scsi_send_diag { 143223081Sgibbs uint8_t opcode; 144223081Sgibbs uint8_t byte2; 145223081Sgibbs#define SSD_UNITOFFL 0x01 146223081Sgibbs#define SSD_DEVOFFL 0x02 147223081Sgibbs#define SSD_SELFTEST 0x04 148223081Sgibbs#define SSD_PF 0x10 149223081Sgibbs#define SSD_SELF_TEST_CODE_MASK 0xE0 150223081Sgibbs#define SSD_SELF_TEST_CODE_SHIFT 5 151223081Sgibbs#define SSD_SELF_TEST_CODE_NONE 0x00 152223081Sgibbs#define SSD_SELF_TEST_CODE_BG_SHORT 0x01 153223081Sgibbs#define SSD_SELF_TEST_CODE_BG_EXTENDED 0x02 154223081Sgibbs#define SSD_SELF_TEST_CODE_BG_ABORT 0x04 155223081Sgibbs#define SSD_SELF_TEST_CODE_FG_SHORT 0x05 156223081Sgibbs#define SSD_SELF_TEST_CODE_FG_EXTENDED 0x06 157223081Sgibbs uint8_t reserved; 158223081Sgibbs uint8_t length[2]; 159223081Sgibbs uint8_t control; 160223081Sgibbs}; 161223081Sgibbs 16239213Sgibbsstruct scsi_sense 16339213Sgibbs{ 16439213Sgibbs u_int8_t opcode; 16539213Sgibbs u_int8_t byte2; 16639213Sgibbs u_int8_t unused[2]; 16739213Sgibbs u_int8_t length; 16839213Sgibbs u_int8_t control; 16939213Sgibbs}; 17039213Sgibbs 17139213Sgibbsstruct scsi_inquiry 17239213Sgibbs{ 17339213Sgibbs u_int8_t opcode; 17439213Sgibbs u_int8_t byte2; 175225950Sken#define SI_EVPD 0x01 176225950Sken#define SI_CMDDT 0x02 17739213Sgibbs u_int8_t page_code; 178229997Sken u_int8_t length[2]; 17939213Sgibbs u_int8_t control; 18039213Sgibbs}; 18139213Sgibbs 18239213Sgibbsstruct scsi_mode_sense_6 18339213Sgibbs{ 18439213Sgibbs u_int8_t opcode; 18539213Sgibbs u_int8_t byte2; 18639213Sgibbs#define SMS_DBD 0x08 18739213Sgibbs u_int8_t page; 18839213Sgibbs#define SMS_PAGE_CODE 0x3F 189208905Smjacob#define SMS_VENDOR_SPECIFIC_PAGE 0x00 190208905Smjacob#define SMS_DISCONNECT_RECONNECT_PAGE 0x02 191208905Smjacob#define SMS_FORMAT_DEVICE_PAGE 0x03 192208905Smjacob#define SMS_GEOMETRY_PAGE 0x04 193208905Smjacob#define SMS_CACHE_PAGE 0x08 194208905Smjacob#define SMS_PERIPHERAL_DEVICE_PAGE 0x09 195208905Smjacob#define SMS_CONTROL_MODE_PAGE 0x0A 196208905Smjacob#define SMS_PROTO_SPECIFIC_PAGE 0x19 197208905Smjacob#define SMS_INFO_EXCEPTIONS_PAGE 0x1C 198208905Smjacob#define SMS_ALL_PAGES_PAGE 0x3F 19939213Sgibbs#define SMS_PAGE_CTRL_MASK 0xC0 20039213Sgibbs#define SMS_PAGE_CTRL_CURRENT 0x00 20139213Sgibbs#define SMS_PAGE_CTRL_CHANGEABLE 0x40 20239213Sgibbs#define SMS_PAGE_CTRL_DEFAULT 0x80 20339213Sgibbs#define SMS_PAGE_CTRL_SAVED 0xC0 204225950Sken u_int8_t subpage; 205225950Sken#define SMS_SUBPAGE_PAGE_0 0x00 206225950Sken#define SMS_SUBPAGE_ALL 0xff 20739213Sgibbs u_int8_t length; 20839213Sgibbs u_int8_t control; 20939213Sgibbs}; 21039213Sgibbs 21139213Sgibbsstruct scsi_mode_sense_10 21239213Sgibbs{ 21339213Sgibbs u_int8_t opcode; 21439213Sgibbs u_int8_t byte2; /* same bits as small version */ 215225950Sken#define SMS10_LLBAA 0x10 21639213Sgibbs u_int8_t page; /* same bits as small version */ 217225950Sken u_int8_t subpage; 218225950Sken u_int8_t unused[3]; 21939213Sgibbs u_int8_t length[2]; 22039213Sgibbs u_int8_t control; 22139213Sgibbs}; 22239213Sgibbs 22339213Sgibbsstruct scsi_mode_select_6 22439213Sgibbs{ 22539213Sgibbs u_int8_t opcode; 22639213Sgibbs u_int8_t byte2; 22739213Sgibbs#define SMS_SP 0x01 22839213Sgibbs#define SMS_PF 0x10 22939213Sgibbs u_int8_t unused[2]; 23039213Sgibbs u_int8_t length; 23139213Sgibbs u_int8_t control; 23239213Sgibbs}; 23339213Sgibbs 23439213Sgibbsstruct scsi_mode_select_10 23539213Sgibbs{ 23639213Sgibbs u_int8_t opcode; 23739213Sgibbs u_int8_t byte2; /* same bits as small version */ 23839213Sgibbs u_int8_t unused[5]; 23939213Sgibbs u_int8_t length[2]; 24039213Sgibbs u_int8_t control; 24139213Sgibbs}; 24239213Sgibbs 24339213Sgibbs/* 24439213Sgibbs * When sending a mode select to a tape drive, the medium type must be 0. 24539213Sgibbs */ 24639213Sgibbsstruct scsi_mode_hdr_6 24739213Sgibbs{ 24839213Sgibbs u_int8_t datalen; 24939213Sgibbs u_int8_t medium_type; 25039213Sgibbs u_int8_t dev_specific; 25139213Sgibbs u_int8_t block_descr_len; 25239213Sgibbs}; 25339213Sgibbs 25439213Sgibbsstruct scsi_mode_hdr_10 25539213Sgibbs{ 25639213Sgibbs u_int8_t datalen[2]; 25739213Sgibbs u_int8_t medium_type; 25839213Sgibbs u_int8_t dev_specific; 25939213Sgibbs u_int8_t reserved[2]; 26039213Sgibbs u_int8_t block_descr_len[2]; 26139213Sgibbs}; 26239213Sgibbs 26339213Sgibbsstruct scsi_mode_block_descr 26439213Sgibbs{ 26539213Sgibbs u_int8_t density_code; 26639213Sgibbs u_int8_t num_blocks[3]; 26739213Sgibbs u_int8_t reserved; 26839213Sgibbs u_int8_t block_len[3]; 26939213Sgibbs}; 27039213Sgibbs 271225950Skenstruct scsi_per_res_in 272225950Sken{ 273225950Sken u_int8_t opcode; 274225950Sken u_int8_t action; 275225950Sken#define SPRI_RK 0x00 276225950Sken#define SPRI_RR 0x01 277225950Sken#define SPRI_RC 0x02 278225950Sken#define SPRI_RS 0x03 279225950Sken u_int8_t reserved[5]; 280225950Sken u_int8_t length[2]; 281268700Smav#define SPRI_MAX_LEN 0xffff 282225950Sken u_int8_t control; 283225950Sken}; 284225950Sken 285225950Skenstruct scsi_per_res_in_header 286225950Sken{ 287225950Sken u_int8_t generation[4]; 288225950Sken u_int8_t length[4]; 289225950Sken}; 290225950Sken 291225950Skenstruct scsi_per_res_key 292225950Sken{ 293225950Sken u_int8_t key[8]; 294225950Sken}; 295225950Sken 296225950Skenstruct scsi_per_res_in_keys 297225950Sken{ 298225950Sken struct scsi_per_res_in_header header; 299225950Sken struct scsi_per_res_key keys[0]; 300225950Sken}; 301225950Sken 302225950Skenstruct scsi_per_res_cap 303225950Sken{ 304225950Sken uint8_t length[2]; 305225950Sken uint8_t flags1; 306268700Smav#define SPRI_RLR_C 0x80 307268700Smav#define SPRI_CRH 0x10 308268700Smav#define SPRI_SIP_C 0x08 309268700Smav#define SPRI_ATP_C 0x04 310268700Smav#define SPRI_PTPL_C 0x01 311225950Sken uint8_t flags2; 312268700Smav#define SPRI_TMV 0x80 313268700Smav#define SPRI_ALLOW_CMD_MASK 0x70 314268700Smav#define SPRI_ALLOW_CMD_SHIFT 4 315268700Smav#define SPRI_ALLOW_NA 0x00 316268700Smav#define SPRI_ALLOW_1 0x10 317268700Smav#define SPRI_ALLOW_2 0x20 318268700Smav#define SPRI_ALLOW_3 0x30 319268700Smav#define SPRI_ALLOW_4 0x40 320268700Smav#define SPRI_PTPL_A 0x01 321225950Sken uint8_t type_mask[2]; 322225950Sken#define SPRI_TM_WR_EX_AR 0x8000 323225950Sken#define SPRI_TM_EX_AC_RO 0x4000 324225950Sken#define SPRI_TM_WR_EX_RO 0x2000 325225950Sken#define SPRI_TM_EX_AC 0x0800 326225950Sken#define SPRI_TM_WR_EX 0x0200 327225950Sken#define SPRI_TM_EX_AC_AR 0x0001 328225950Sken uint8_t reserved[2]; 329225950Sken}; 330225950Sken 331225950Skenstruct scsi_per_res_in_rsrv_data 332225950Sken{ 333225950Sken uint8_t reservation[8]; 334268700Smav uint8_t scope_addr[4]; 335225950Sken uint8_t reserved; 336225950Sken uint8_t scopetype; 337225950Sken#define SPRT_WE 0x01 338225950Sken#define SPRT_EA 0x03 339225950Sken#define SPRT_WERO 0x05 340225950Sken#define SPRT_EARO 0x06 341225950Sken#define SPRT_WEAR 0x07 342225950Sken#define SPRT_EAAR 0x08 343268700Smav uint8_t extent_length[2]; 344225950Sken}; 345225950Sken 346225950Skenstruct scsi_per_res_in_rsrv 347225950Sken{ 348225950Sken struct scsi_per_res_in_header header; 349225950Sken struct scsi_per_res_in_rsrv_data data; 350225950Sken}; 351225950Sken 352268700Smavstruct scsi_per_res_in_full_desc 353268700Smav{ 354268700Smav struct scsi_per_res_key res_key; 355268700Smav uint8_t reserved1[4]; 356268700Smav uint8_t flags; 357268700Smav#define SPRI_FULL_ALL_TG_PT 0x02 358268700Smav#define SPRI_FULL_R_HOLDER 0x01 359268700Smav uint8_t scopetype; 360268700Smav uint8_t reserved2[4]; 361268700Smav uint8_t rel_trgt_port_id[2]; 362268700Smav uint8_t additional_length[4]; 363268700Smav uint8_t transport_id[]; 364268700Smav}; 365268700Smav 366268700Smavstruct scsi_per_res_in_full 367268700Smav{ 368268700Smav struct scsi_per_res_in_header header; 369268700Smav struct scsi_per_res_in_full_desc desc[]; 370268700Smav}; 371268700Smav 372225950Skenstruct scsi_per_res_out 373225950Sken{ 374225950Sken u_int8_t opcode; 375225950Sken u_int8_t action; 376225950Sken#define SPRO_REGISTER 0x00 377225950Sken#define SPRO_RESERVE 0x01 378225950Sken#define SPRO_RELEASE 0x02 379225950Sken#define SPRO_CLEAR 0x03 380225950Sken#define SPRO_PREEMPT 0x04 381225950Sken#define SPRO_PRE_ABO 0x05 382225950Sken#define SPRO_REG_IGNO 0x06 383225950Sken#define SPRO_REG_MOVE 0x07 384268700Smav#define SPRO_REPL_LOST_RES 0x08 385225950Sken#define SPRO_ACTION_MASK 0x1f 386225950Sken u_int8_t scope_type; 387225950Sken#define SPR_SCOPE_MASK 0xf0 388268700Smav#define SPR_SCOPE_SHIFT 4 389225950Sken#define SPR_LU_SCOPE 0x00 390268700Smav#define SPR_EXTENT_SCOPE 0x10 391268700Smav#define SPR_ELEMENT_SCOPE 0x20 392225950Sken#define SPR_TYPE_MASK 0x0f 393268700Smav#define SPR_TYPE_RD_SHARED 0x00 394225950Sken#define SPR_TYPE_WR_EX 0x01 395268700Smav#define SPR_TYPE_RD_EX 0x02 396225950Sken#define SPR_TYPE_EX_AC 0x03 397268700Smav#define SPR_TYPE_SHARED 0x04 398225950Sken#define SPR_TYPE_WR_EX_RO 0x05 399225950Sken#define SPR_TYPE_EX_AC_RO 0x06 400225950Sken#define SPR_TYPE_WR_EX_AR 0x07 401225950Sken#define SPR_TYPE_EX_AC_AR 0x08 402225950Sken u_int8_t reserved[2]; 403225950Sken u_int8_t length[4]; 404225950Sken u_int8_t control; 405225950Sken}; 406225950Sken 407225950Skenstruct scsi_per_res_out_parms 408225950Sken{ 409225950Sken struct scsi_per_res_key res_key; 410225950Sken u_int8_t serv_act_res_key[8]; 411268700Smav u_int8_t scope_spec_address[4]; 412225950Sken u_int8_t flags; 413225950Sken#define SPR_SPEC_I_PT 0x08 414225950Sken#define SPR_ALL_TG_PT 0x04 415225950Sken#define SPR_APTPL 0x01 416225950Sken u_int8_t reserved1; 417268700Smav u_int8_t extent_length[2]; 418268700Smav u_int8_t transport_id_list[]; 419225950Sken}; 420225950Sken 421268700Smavstruct scsi_per_res_out_trans_ids { 422268700Smav u_int8_t additional_length[4]; 423268700Smav u_int8_t transport_ids[]; 424268700Smav}; 425225950Sken 426268700Smav/* 427268700Smav * Used with REGISTER AND MOVE serivce action of the PERSISTENT RESERVE OUT 428268700Smav * command. 429268700Smav */ 430268700Smavstruct scsi_per_res_reg_move 431268700Smav{ 432268700Smav struct scsi_per_res_key res_key; 433268700Smav u_int8_t serv_act_res_key[8]; 434268700Smav u_int8_t reserved; 435268700Smav u_int8_t flags; 436268700Smav#define SPR_REG_MOVE_UNREG 0x02 437268700Smav#define SPR_REG_MOVE_APTPL 0x01 438268700Smav u_int8_t rel_trgt_port_id[2]; 439268700Smav u_int8_t transport_id_length[4]; 440268700Smav u_int8_t transport_id[]; 441268700Smav}; 442268700Smav 443268700Smavstruct scsi_transportid_header 444268700Smav{ 445268700Smav uint8_t format_protocol; 446268700Smav#define SCSI_TRN_FORMAT_MASK 0xc0 447268700Smav#define SCSI_TRN_FORMAT_SHIFT 6 448268700Smav#define SCSI_TRN_PROTO_MASK 0x0f 449268700Smav}; 450268700Smav 451268700Smavstruct scsi_transportid_fcp 452268700Smav{ 453268700Smav uint8_t format_protocol; 454268700Smav#define SCSI_TRN_FCP_FORMAT_DEFAULT 0x00 455268700Smav uint8_t reserved1[7]; 456268700Smav uint8_t n_port_name[8]; 457268700Smav uint8_t reserved2[8]; 458268700Smav}; 459268700Smav 460268700Smavstruct scsi_transportid_spi 461268700Smav{ 462268700Smav uint8_t format_protocol; 463268700Smav#define SCSI_TRN_SPI_FORMAT_DEFAULT 0x00 464268700Smav uint8_t reserved1; 465268700Smav uint8_t scsi_addr[2]; 466268700Smav uint8_t obsolete[2]; 467268700Smav uint8_t rel_trgt_port_id[2]; 468268700Smav uint8_t reserved2[16]; 469268700Smav}; 470268700Smav 471268700Smavstruct scsi_transportid_1394 472268700Smav{ 473268700Smav uint8_t format_protocol; 474268700Smav#define SCSI_TRN_1394_FORMAT_DEFAULT 0x00 475268700Smav uint8_t reserved1[7]; 476268700Smav uint8_t eui64[8]; 477268700Smav uint8_t reserved2[8]; 478268700Smav}; 479268700Smav 480268700Smavstruct scsi_transportid_rdma 481268700Smav{ 482268700Smav uint8_t format_protocol; 483268700Smav#define SCSI_TRN_RDMA_FORMAT_DEFAULT 0x00 484268700Smav uint8_t reserved[7]; 485268700Smav#define SCSI_TRN_RDMA_PORT_LEN 16 486268700Smav uint8_t initiator_port_id[SCSI_TRN_RDMA_PORT_LEN]; 487268700Smav}; 488268700Smav 489268700Smavstruct scsi_transportid_iscsi_device 490268700Smav{ 491268700Smav uint8_t format_protocol; 492268700Smav#define SCSI_TRN_ISCSI_FORMAT_DEVICE 0x00 493268700Smav uint8_t reserved; 494268700Smav uint8_t additional_length[2]; 495268700Smav uint8_t iscsi_name[]; 496268700Smav}; 497268700Smav 498268700Smavstruct scsi_transportid_iscsi_port 499268700Smav{ 500268700Smav uint8_t format_protocol; 501268700Smav#define SCSI_TRN_ISCSI_FORMAT_PORT 0x40 502268700Smav uint8_t reserved; 503268700Smav uint8_t additional_length[2]; 504268700Smav uint8_t iscsi_name[]; 505268700Smav /* 506268700Smav * Followed by a separator and iSCSI initiator session ID 507268700Smav */ 508268700Smav}; 509268700Smav 510268700Smavstruct scsi_transportid_sas 511268700Smav{ 512268700Smav uint8_t format_protocol; 513268700Smav#define SCSI_TRN_SAS_FORMAT_DEFAULT 0x00 514268700Smav uint8_t reserved1[3]; 515268700Smav uint8_t sas_address[8]; 516268700Smav uint8_t reserved2[12]; 517268700Smav}; 518268700Smav 519268700Smavstruct scsi_sop_routing_id_norm { 520268700Smav uint8_t bus; 521268700Smav uint8_t devfunc; 522268700Smav#define SCSI_TRN_SOP_BUS_MAX 0xff 523268700Smav#define SCSI_TRN_SOP_DEV_MAX 0x1f 524268700Smav#define SCSI_TRN_SOP_DEV_MASK 0xf8 525268700Smav#define SCSI_TRN_SOP_DEV_SHIFT 3 526268700Smav#define SCSI_TRN_SOP_FUNC_NORM_MASK 0x07 527268700Smav#define SCSI_TRN_SOP_FUNC_NORM_MAX 0x07 528268700Smav}; 529268700Smav 530268700Smavstruct scsi_sop_routing_id_alt { 531268700Smav uint8_t bus; 532268700Smav uint8_t function; 533268700Smav#define SCSI_TRN_SOP_FUNC_ALT_MAX 0xff 534268700Smav}; 535268700Smav 536268700Smavstruct scsi_transportid_sop 537268700Smav{ 538268700Smav uint8_t format_protocol; 539268700Smav#define SCSI_TRN_SOP_FORMAT_DEFAULT 0x00 540268700Smav uint8_t reserved1; 541268700Smav uint8_t routing_id[2]; 542268700Smav uint8_t reserved2[20]; 543268700Smav}; 544268700Smav 54582384Skbyancstruct scsi_log_sense 54682384Skbyanc{ 54782384Skbyanc u_int8_t opcode; 54882384Skbyanc u_int8_t byte2; 54982384Skbyanc#define SLS_SP 0x01 55082384Skbyanc#define SLS_PPC 0x02 55182384Skbyanc u_int8_t page; 55282384Skbyanc#define SLS_PAGE_CODE 0x3F 55382384Skbyanc#define SLS_ALL_PAGES_PAGE 0x00 55482384Skbyanc#define SLS_OVERRUN_PAGE 0x01 55582384Skbyanc#define SLS_ERROR_WRITE_PAGE 0x02 55682384Skbyanc#define SLS_ERROR_READ_PAGE 0x03 55782384Skbyanc#define SLS_ERROR_READREVERSE_PAGE 0x04 55882384Skbyanc#define SLS_ERROR_VERIFY_PAGE 0x05 55982384Skbyanc#define SLS_ERROR_NONMEDIUM_PAGE 0x06 56082384Skbyanc#define SLS_ERROR_LASTN_PAGE 0x07 561208905Smjacob#define SLS_SELF_TEST_PAGE 0x10 562208905Smjacob#define SLS_IE_PAGE 0x2f 56382384Skbyanc#define SLS_PAGE_CTRL_MASK 0xC0 56482384Skbyanc#define SLS_PAGE_CTRL_THRESHOLD 0x00 56582384Skbyanc#define SLS_PAGE_CTRL_CUMULATIVE 0x40 56682384Skbyanc#define SLS_PAGE_CTRL_THRESH_DEFAULT 0x80 56782384Skbyanc#define SLS_PAGE_CTRL_CUMUL_DEFAULT 0xC0 56882384Skbyanc u_int8_t reserved[2]; 56982384Skbyanc u_int8_t paramptr[2]; 57082384Skbyanc u_int8_t length[2]; 57182384Skbyanc u_int8_t control; 57282384Skbyanc}; 57382384Skbyanc 57482384Skbyancstruct scsi_log_select 57582384Skbyanc{ 57682384Skbyanc u_int8_t opcode; 57782384Skbyanc u_int8_t byte2; 57882384Skbyanc/* SLS_SP 0x01 */ 57982384Skbyanc#define SLS_PCR 0x02 58082384Skbyanc u_int8_t page; 58182384Skbyanc/* SLS_PAGE_CTRL_MASK 0xC0 */ 58282384Skbyanc/* SLS_PAGE_CTRL_THRESHOLD 0x00 */ 58382384Skbyanc/* SLS_PAGE_CTRL_CUMULATIVE 0x40 */ 58482384Skbyanc/* SLS_PAGE_CTRL_THRESH_DEFAULT 0x80 */ 58582384Skbyanc/* SLS_PAGE_CTRL_CUMUL_DEFAULT 0xC0 */ 58682384Skbyanc u_int8_t reserved[4]; 58782384Skbyanc u_int8_t length[2]; 58882384Skbyanc u_int8_t control; 58982384Skbyanc}; 59082384Skbyanc 59182384Skbyancstruct scsi_log_header 59282384Skbyanc{ 59382384Skbyanc u_int8_t page; 59482384Skbyanc u_int8_t reserved; 59582384Skbyanc u_int8_t datalen[2]; 59682384Skbyanc}; 59782384Skbyanc 59882384Skbyancstruct scsi_log_param_header { 59982384Skbyanc u_int8_t param_code[2]; 60082384Skbyanc u_int8_t param_control; 60182384Skbyanc#define SLP_LP 0x01 60282384Skbyanc#define SLP_LBIN 0x02 60382384Skbyanc#define SLP_TMC_MASK 0x0C 60482384Skbyanc#define SLP_TMC_ALWAYS 0x00 60582384Skbyanc#define SLP_TMC_EQUAL 0x04 60682384Skbyanc#define SLP_TMC_NOTEQUAL 0x08 60782384Skbyanc#define SLP_TMC_GREATER 0x0C 60882384Skbyanc#define SLP_ETC 0x10 60982384Skbyanc#define SLP_TSD 0x20 61082384Skbyanc#define SLP_DS 0x40 61182384Skbyanc#define SLP_DU 0x80 61282384Skbyanc u_int8_t param_len; 61382384Skbyanc}; 61482384Skbyanc 61539213Sgibbsstruct scsi_control_page { 61639213Sgibbs u_int8_t page_code; 61739213Sgibbs u_int8_t page_length; 61839213Sgibbs u_int8_t rlec; 619225950Sken#define SCP_RLEC 0x01 /*Report Log Exception Cond*/ 620225950Sken#define SCP_GLTSD 0x02 /*Global Logging target 621225950Sken save disable */ 622225950Sken#define SCP_DSENSE 0x04 /*Descriptor Sense */ 623225950Sken#define SCP_DPICZ 0x08 /*Disable Prot. Info Check 624225950Sken if Prot. Field is Zero */ 625225950Sken#define SCP_TMF_ONLY 0x10 /*TM Functions Only*/ 626225950Sken#define SCP_TST_MASK 0xE0 /*Task Set Type Mask*/ 627225950Sken#define SCP_TST_ONE 0x00 /*One Task Set*/ 628225950Sken#define SCP_TST_SEPARATE 0x20 /*Separate Task Sets*/ 62939213Sgibbs u_int8_t queue_flags; 630208905Smjacob#define SCP_QUEUE_ALG_MASK 0xF0 631208905Smjacob#define SCP_QUEUE_ALG_RESTRICTED 0x00 632208905Smjacob#define SCP_QUEUE_ALG_UNRESTRICTED 0x10 633268697Smav#define SCP_NUAR 0x08 /*No UA on release*/ 634208905Smjacob#define SCP_QUEUE_ERR 0x02 /*Queued I/O aborted for CACs*/ 635208905Smjacob#define SCP_QUEUE_DQUE 0x01 /*Queued I/O disabled*/ 63639213Sgibbs u_int8_t eca_and_aen; 637208905Smjacob#define SCP_EECA 0x80 /*Enable Extended CA*/ 638268697Smav#define SCP_RAC 0x40 /*Report a check*/ 639268697Smav#define SCP_SWP 0x08 /*Software Write Protect*/ 640208905Smjacob#define SCP_RAENP 0x04 /*Ready AEN Permission*/ 641208905Smjacob#define SCP_UAAENP 0x02 /*UA AEN Permission*/ 642208905Smjacob#define SCP_EAENP 0x01 /*Error AEN Permission*/ 643268697Smav u_int8_t flags4; 644268697Smav#define SCP_ATO 0x80 /*Application tag owner*/ 645268697Smav#define SCP_TAS 0x40 /*Task aborted status*/ 646268697Smav#define SCP_ATMPE 0x20 /*Application tag mode page*/ 647268697Smav#define SCP_RWWP 0x10 /*Reject write without prot*/ 64839213Sgibbs u_int8_t aen_holdoff_period[2]; 649268697Smav u_int8_t busy_timeout_period[2]; 650268697Smav u_int8_t extended_selftest_completion_time[2]; 65139213Sgibbs}; 65239213Sgibbs 653172605Sscottlstruct scsi_cache_page { 654172605Sscottl u_int8_t page_code; 655208905Smjacob#define SCHP_PAGE_SAVABLE 0x80 /* Page is savable */ 656172605Sscottl u_int8_t page_length; 657172605Sscottl u_int8_t cache_flags; 658208905Smjacob#define SCHP_FLAGS_WCE 0x04 /* Write Cache Enable */ 659208905Smjacob#define SCHP_FLAGS_MF 0x02 /* Multiplication factor */ 660208905Smjacob#define SCHP_FLAGS_RCD 0x01 /* Read Cache Disable */ 661172605Sscottl u_int8_t rw_cache_policy; 662172605Sscottl u_int8_t dis_prefetch[2]; 663172605Sscottl u_int8_t min_prefetch[2]; 664172605Sscottl u_int8_t max_prefetch[2]; 665172605Sscottl u_int8_t max_prefetch_ceil[2]; 666172605Sscottl}; 667172605Sscottl 668225950Sken/* 669225950Sken * XXX KDM 670225950Sken * Updated version of the cache page, as of SBC. Update this to SBC-3 and 671225950Sken * rationalize the two. 672225950Sken */ 673225950Skenstruct scsi_caching_page { 674225950Sken uint8_t page_code; 675225950Sken#define SMS_CACHING_PAGE 0x08 676225950Sken uint8_t page_length; 677225950Sken uint8_t flags1; 678225950Sken#define SCP_IC 0x80 679225950Sken#define SCP_ABPF 0x40 680225950Sken#define SCP_CAP 0x20 681225950Sken#define SCP_DISC 0x10 682225950Sken#define SCP_SIZE 0x08 683225950Sken#define SCP_WCE 0x04 684225950Sken#define SCP_MF 0x02 685225950Sken#define SCP_RCD 0x01 686225950Sken uint8_t ret_priority; 687225950Sken uint8_t disable_pf_transfer_len[2]; 688225950Sken uint8_t min_prefetch[2]; 689225950Sken uint8_t max_prefetch[2]; 690225950Sken uint8_t max_pf_ceiling[2]; 691225950Sken uint8_t flags2; 692225950Sken#define SCP_FSW 0x80 693225950Sken#define SCP_LBCSS 0x40 694225950Sken#define SCP_DRA 0x20 695225950Sken#define SCP_VS1 0x10 696225950Sken#define SCP_VS2 0x08 697225950Sken uint8_t cache_segments; 698225950Sken uint8_t cache_seg_size[2]; 699225950Sken uint8_t reserved; 700225950Sken uint8_t non_cache_seg_size[3]; 701225950Sken}; 702225950Sken 703229997Sken/* 704229997Sken * XXX KDM move this off to a vendor shim. 705229997Sken */ 706229997Skenstruct copan_power_subpage { 707229997Sken uint8_t page_code; 708229997Sken#define PWR_PAGE_CODE 0x00 709229997Sken uint8_t subpage; 710229997Sken#define PWR_SUBPAGE_CODE 0x02 711229997Sken uint8_t page_length[2]; 712229997Sken uint8_t page_version; 713229997Sken#define PWR_VERSION 0x01 714229997Sken uint8_t total_luns; 715229997Sken uint8_t max_active_luns; 716229997Sken#define PWR_DFLT_MAX_LUNS 0x07 717229997Sken uint8_t reserved[25]; 718229997Sken}; 719229997Sken 720229997Sken/* 721229997Sken * XXX KDM move this off to a vendor shim. 722229997Sken */ 723229997Skenstruct copan_aps_subpage { 724229997Sken uint8_t page_code; 725229997Sken#define APS_PAGE_CODE 0x00 726229997Sken uint8_t subpage; 727229997Sken#define APS_SUBPAGE_CODE 0x03 728229997Sken uint8_t page_length[2]; 729229997Sken uint8_t page_version; 730229997Sken#define APS_VERSION 0x00 731229997Sken uint8_t lock_active; 732229997Sken#define APS_LOCK_ACTIVE 0x01 733229997Sken#define APS_LOCK_INACTIVE 0x00 734229997Sken uint8_t reserved[26]; 735229997Sken}; 736229997Sken 737229997Sken/* 738229997Sken * XXX KDM move this off to a vendor shim. 739229997Sken */ 740229997Skenstruct copan_debugconf_subpage { 741229997Sken uint8_t page_code; 742229997Sken#define DBGCNF_PAGE_CODE 0x00 743229997Sken uint8_t subpage; 744229997Sken#define DBGCNF_SUBPAGE_CODE 0xF0 745229997Sken uint8_t page_length[2]; 746229997Sken uint8_t page_version; 747229997Sken#define DBGCNF_VERSION 0x00 748229997Sken uint8_t ctl_time_io_secs[2]; 749229997Sken}; 750229997Sken 751229997Sken 752172605Sscottlstruct scsi_info_exceptions_page { 753172605Sscottl u_int8_t page_code; 754208905Smjacob#define SIEP_PAGE_SAVABLE 0x80 /* Page is savable */ 755172605Sscottl u_int8_t page_length; 756172605Sscottl u_int8_t info_flags; 757208905Smjacob#define SIEP_FLAGS_PERF 0x80 758208905Smjacob#define SIEP_FLAGS_EBF 0x20 759208905Smjacob#define SIEP_FLAGS_EWASC 0x10 760208905Smjacob#define SIEP_FLAGS_DEXCPT 0x08 761208905Smjacob#define SIEP_FLAGS_TEST 0x04 762208905Smjacob#define SIEP_FLAGS_EBACKERR 0x02 763208905Smjacob#define SIEP_FLAGS_LOGERR 0x01 764172605Sscottl u_int8_t mrie; 765172605Sscottl u_int8_t interval_timer[4]; 766172605Sscottl u_int8_t report_count[4]; 767172605Sscottl}; 768172605Sscottl 769268700Smav/* 770268700Smav * SCSI protocol identifier values, current as of SPC4r36l. 771268700Smav */ 772268700Smav#define SCSI_PROTO_FC 0x00 /* Fibre Channel */ 773268700Smav#define SCSI_PROTO_SPI 0x01 /* Parallel SCSI */ 774268700Smav#define SCSI_PROTO_SSA 0x02 /* Serial Storage Arch. */ 775268700Smav#define SCSI_PROTO_1394 0x03 /* IEEE 1394 (Firewire) */ 776268700Smav#define SCSI_PROTO_RDMA 0x04 /* SCSI RDMA Protocol */ 777268700Smav#define SCSI_PROTO_ISCSI 0x05 /* Internet SCSI */ 778268700Smav#define SCSI_PROTO_iSCSI 0x05 /* Internet SCSI */ 779268700Smav#define SCSI_PROTO_SAS 0x06 /* SAS Serial SCSI Protocol */ 780268700Smav#define SCSI_PROTO_ADT 0x07 /* Automation/Drive Int. Trans. Prot.*/ 781268700Smav#define SCSI_PROTO_ADITP 0x07 /* Automation/Drive Int. Trans. Prot.*/ 782268700Smav#define SCSI_PROTO_ATA 0x08 /* AT Attachment Interface */ 783268700Smav#define SCSI_PROTO_UAS 0x09 /* USB Atached SCSI */ 784268700Smav#define SCSI_PROTO_SOP 0x0a /* SCSI over PCI Express */ 785268700Smav#define SCSI_PROTO_NONE 0x0f /* No specific protocol */ 786268700Smav 787172605Sscottlstruct scsi_proto_specific_page { 788172605Sscottl u_int8_t page_code; 789208905Smjacob#define SPSP_PAGE_SAVABLE 0x80 /* Page is savable */ 790172605Sscottl u_int8_t page_length; 791172605Sscottl u_int8_t protocol; 792268700Smav#define SPSP_PROTO_FC SCSI_PROTO_FC 793268700Smav#define SPSP_PROTO_SPI SCSI_PROTO_SPI 794268700Smav#define SPSP_PROTO_SSA SCSI_PROTO_SSA 795268700Smav#define SPSP_PROTO_1394 SCSI_PROTO_1394 796268700Smav#define SPSP_PROTO_RDMA SCSI_PROTO_RDMA 797268700Smav#define SPSP_PROTO_ISCSI SCSI_PROTO_ISCSI 798268700Smav#define SPSP_PROTO_SAS SCSI_PROTO_SAS 799268700Smav#define SPSP_PROTO_ADT SCSI_PROTO_ADITP 800268700Smav#define SPSP_PROTO_ATA SCSI_PROTO_ATA 801268700Smav#define SPSP_PROTO_UAS SCSI_PROTO_UAS 802268700Smav#define SPSP_PROTO_SOP SCSI_PROTO_SOP 803268700Smav#define SPSP_PROTO_NONE SCSI_PROTO_NONE 804172605Sscottl}; 805172605Sscottl 80639213Sgibbsstruct scsi_reserve 80739213Sgibbs{ 80839213Sgibbs u_int8_t opcode; 80939213Sgibbs u_int8_t byte2; 810225950Sken#define SR_EXTENT 0x01 811225950Sken#define SR_ID_MASK 0x0e 812225950Sken#define SR_3RDPTY 0x10 813225950Sken#define SR_LUN_MASK 0xe0 814225950Sken u_int8_t resv_id; 815225950Sken u_int8_t length[2]; 81639213Sgibbs u_int8_t control; 81739213Sgibbs}; 81839213Sgibbs 819225950Skenstruct scsi_reserve_10 { 820225950Sken uint8_t opcode; 821225950Sken uint8_t byte2; 822225950Sken#define SR10_3RDPTY 0x10 823225950Sken#define SR10_LONGID 0x02 824225950Sken#define SR10_EXTENT 0x01 825225950Sken uint8_t resv_id; 826225950Sken uint8_t thirdparty_id; 827225950Sken uint8_t reserved[3]; 828225950Sken uint8_t length[2]; 829225950Sken uint8_t control; 830225950Sken}; 831225950Sken 832225950Sken 83339213Sgibbsstruct scsi_release 83439213Sgibbs{ 83539213Sgibbs u_int8_t opcode; 83639213Sgibbs u_int8_t byte2; 837225950Sken u_int8_t resv_id; 838225950Sken u_int8_t unused[1]; 83939213Sgibbs u_int8_t length; 84039213Sgibbs u_int8_t control; 84139213Sgibbs}; 84239213Sgibbs 843225950Skenstruct scsi_release_10 { 844225950Sken uint8_t opcode; 845225950Sken uint8_t byte2; 846225950Sken uint8_t resv_id; 847225950Sken uint8_t thirdparty_id; 848225950Sken uint8_t reserved[3]; 849225950Sken uint8_t length[2]; 850225950Sken uint8_t control; 851225950Sken}; 852225950Sken 85339213Sgibbsstruct scsi_prevent 85439213Sgibbs{ 85539213Sgibbs u_int8_t opcode; 85639213Sgibbs u_int8_t byte2; 85739213Sgibbs u_int8_t unused[2]; 85839213Sgibbs u_int8_t how; 85939213Sgibbs u_int8_t control; 86039213Sgibbs}; 86139213Sgibbs#define PR_PREVENT 0x01 862208905Smjacob#define PR_ALLOW 0x00 86339213Sgibbs 86439213Sgibbsstruct scsi_sync_cache 86539213Sgibbs{ 86639213Sgibbs u_int8_t opcode; 86739213Sgibbs u_int8_t byte2; 868225950Sken#define SSC_IMMED 0x02 869225950Sken#define SSC_RELADR 0x01 87039213Sgibbs u_int8_t begin_lba[4]; 87139213Sgibbs u_int8_t reserved; 87239213Sgibbs u_int8_t lb_count[2]; 87339213Sgibbs u_int8_t control; 87439213Sgibbs}; 87539213Sgibbs 876225950Skenstruct scsi_sync_cache_16 877225950Sken{ 878225950Sken uint8_t opcode; 879225950Sken uint8_t byte2; 880225950Sken uint8_t begin_lba[8]; 881225950Sken uint8_t lb_count[4]; 882225950Sken uint8_t reserved; 883225950Sken uint8_t control; 884225950Sken}; 88539213Sgibbs 886225950Skenstruct scsi_format { 887225950Sken uint8_t opcode; 888225950Sken uint8_t byte2; 889225950Sken#define SF_LONGLIST 0x20 890225950Sken#define SF_FMTDATA 0x10 891225950Sken#define SF_CMPLIST 0x08 892225950Sken#define SF_FORMAT_MASK 0x07 893225950Sken#define SF_FORMAT_BLOCK 0x00 894225950Sken#define SF_FORMAT_LONG_BLOCK 0x03 895225950Sken#define SF_FORMAT_BFI 0x04 896225950Sken#define SF_FORMAT_PHYS 0x05 897225950Sken uint8_t vendor; 898225950Sken uint8_t interleave[2]; 899225950Sken uint8_t control; 900225950Sken}; 901225950Sken 902225950Skenstruct scsi_format_header_short { 903225950Sken uint8_t reserved; 904225950Sken#define SF_DATA_FOV 0x80 905225950Sken#define SF_DATA_DPRY 0x40 906225950Sken#define SF_DATA_DCRT 0x20 907225950Sken#define SF_DATA_STPF 0x10 908225950Sken#define SF_DATA_IP 0x08 909225950Sken#define SF_DATA_DSP 0x04 910225950Sken#define SF_DATA_IMMED 0x02 911225950Sken#define SF_DATA_VS 0x01 912225950Sken uint8_t byte2; 913225950Sken uint8_t defect_list_len[2]; 914225950Sken}; 915225950Sken 916225950Skenstruct scsi_format_header_long { 917225950Sken uint8_t reserved; 918225950Sken uint8_t byte2; 919225950Sken uint8_t reserved2[2]; 920225950Sken uint8_t defect_list_len[4]; 921225950Sken}; 922225950Sken 92339213Sgibbsstruct scsi_changedef 92439213Sgibbs{ 92539213Sgibbs u_int8_t opcode; 92639213Sgibbs u_int8_t byte2; 92739213Sgibbs u_int8_t unused1; 92839213Sgibbs u_int8_t how; 92939213Sgibbs u_int8_t unused[4]; 93039213Sgibbs u_int8_t datalen; 93139213Sgibbs u_int8_t control; 93239213Sgibbs}; 93339213Sgibbs 93439213Sgibbsstruct scsi_read_buffer 93539213Sgibbs{ 93639213Sgibbs u_int8_t opcode; 93739213Sgibbs u_int8_t byte2; 938268551Smav#define RWB_MODE 0x1F 93939213Sgibbs#define RWB_MODE_HDR_DATA 0x00 940225950Sken#define RWB_MODE_VENDOR 0x01 94139213Sgibbs#define RWB_MODE_DATA 0x02 942268551Smav#define RWB_MODE_DESCR 0x03 94339213Sgibbs#define RWB_MODE_DOWNLOAD 0x04 94439213Sgibbs#define RWB_MODE_DOWNLOAD_SAVE 0x05 945268551Smav#define RWB_MODE_ECHO 0x0A 946268551Smav#define RWB_MODE_ECHO_DESCR 0x0B 947268551Smav#define RWB_MODE_ERROR_HISTORY 0x1C 94839213Sgibbs u_int8_t buffer_id; 94939213Sgibbs u_int8_t offset[3]; 95039213Sgibbs u_int8_t length[3]; 95139213Sgibbs u_int8_t control; 95239213Sgibbs}; 95339213Sgibbs 95439213Sgibbsstruct scsi_write_buffer 95539213Sgibbs{ 95639213Sgibbs u_int8_t opcode; 95739213Sgibbs u_int8_t byte2; 95839213Sgibbs u_int8_t buffer_id; 95939213Sgibbs u_int8_t offset[3]; 96039213Sgibbs u_int8_t length[3]; 96139213Sgibbs u_int8_t control; 96239213Sgibbs}; 96339213Sgibbs 96439466Skenstruct scsi_rw_6 96539466Sken{ 96639466Sken u_int8_t opcode; 96739466Sken u_int8_t addr[3]; 96839466Sken/* only 5 bits are valid in the MSB address byte */ 96939466Sken#define SRW_TOPADDR 0x1F 97039466Sken u_int8_t length; 97139466Sken u_int8_t control; 97239466Sken}; 97339466Sken 97439466Skenstruct scsi_rw_10 97539466Sken{ 97639466Sken u_int8_t opcode; 97739466Sken#define SRW10_RELADDR 0x01 978114261Sken/* EBP defined for WRITE(10) only */ 979114261Sken#define SRW10_EBP 0x04 980114261Sken#define SRW10_FUA 0x08 98139466Sken#define SRW10_DPO 0x10 98239466Sken u_int8_t byte2; 98339466Sken u_int8_t addr[4]; 98439466Sken u_int8_t reserved; 98539466Sken u_int8_t length[2]; 98639466Sken u_int8_t control; 98739466Sken}; 98839466Sken 98939466Skenstruct scsi_rw_12 99039466Sken{ 99139466Sken u_int8_t opcode; 99239466Sken#define SRW12_RELADDR 0x01 993208905Smjacob#define SRW12_FUA 0x08 99439466Sken#define SRW12_DPO 0x10 99539466Sken u_int8_t byte2; 99639466Sken u_int8_t addr[4]; 997104681Sken u_int8_t length[4]; 99839466Sken u_int8_t reserved; 99939466Sken u_int8_t control; 100039466Sken}; 100139466Sken 1002114261Skenstruct scsi_rw_16 1003114261Sken{ 1004114261Sken u_int8_t opcode; 1005114261Sken#define SRW16_RELADDR 0x01 1006114261Sken#define SRW16_FUA 0x08 1007114261Sken#define SRW16_DPO 0x10 1008114261Sken u_int8_t byte2; 1009114261Sken u_int8_t addr[8]; 1010114261Sken u_int8_t length[4]; 1011114261Sken u_int8_t reserved; 1012114261Sken u_int8_t control; 1013114261Sken}; 1014114261Sken 1015230053Smavstruct scsi_write_same_10 1016230053Smav{ 1017230053Smav uint8_t opcode; 1018230053Smav uint8_t byte2; 1019230053Smav#define SWS_LBDATA 0x02 1020230053Smav#define SWS_PBDATA 0x04 1021230053Smav#define SWS_UNMAP 0x08 1022230053Smav#define SWS_ANCHOR 0x10 1023230053Smav uint8_t addr[4]; 1024230053Smav uint8_t group; 1025230053Smav uint8_t length[2]; 1026230053Smav uint8_t control; 1027230053Smav}; 1028230053Smav 1029230053Smavstruct scsi_write_same_16 1030230053Smav{ 1031230053Smav uint8_t opcode; 1032230053Smav uint8_t byte2; 1033230053Smav uint8_t addr[8]; 1034230053Smav uint8_t length[4]; 1035230053Smav uint8_t group; 1036230053Smav uint8_t control; 1037230053Smav}; 1038230053Smav 1039230053Smavstruct scsi_unmap 1040230053Smav{ 1041230053Smav uint8_t opcode; 1042230053Smav uint8_t byte2; 1043230053Smav#define SU_ANCHOR 0x01 1044230053Smav uint8_t reserved[4]; 1045230053Smav uint8_t group; 1046230053Smav uint8_t length[2]; 1047230053Smav uint8_t control; 1048230053Smav}; 1049230053Smav 1050265634Smavstruct scsi_unmap_header 1051265634Smav{ 1052265634Smav uint8_t length[2]; 1053265634Smav uint8_t desc_length[2]; 1054265634Smav uint8_t reserved[4]; 1055265634Smav}; 1056265634Smav 1057265634Smavstruct scsi_unmap_desc 1058265634Smav{ 1059265634Smav uint8_t lba[8]; 1060265634Smav uint8_t length[4]; 1061265634Smav uint8_t reserved[4]; 1062265634Smav}; 1063265634Smav 1064225950Skenstruct scsi_write_verify_10 1065225950Sken{ 1066225950Sken uint8_t opcode; 1067225950Sken uint8_t byte2; 1068225950Sken#define SWV_BYTCHK 0x02 1069225950Sken#define SWV_DPO 0x10 1070225950Sken#define SWV_WRPROECT_MASK 0xe0 1071225950Sken uint8_t addr[4]; 1072225950Sken uint8_t group; 1073225950Sken uint8_t length[2]; 1074225950Sken uint8_t control; 1075225950Sken}; 1076225950Sken 1077225950Skenstruct scsi_write_verify_12 1078225950Sken{ 1079225950Sken uint8_t opcode; 1080225950Sken uint8_t byte2; 1081225950Sken uint8_t addr[4]; 1082225950Sken uint8_t length[4]; 1083225950Sken uint8_t group; 1084225950Sken uint8_t control; 1085225950Sken}; 1086225950Sken 1087225950Skenstruct scsi_write_verify_16 1088225950Sken{ 1089225950Sken uint8_t opcode; 1090225950Sken uint8_t byte2; 1091225950Sken uint8_t addr[8]; 1092225950Sken uint8_t length[4]; 1093225950Sken uint8_t group; 1094225950Sken uint8_t control; 1095225950Sken}; 1096225950Sken 1097225950Sken 109839466Skenstruct scsi_start_stop_unit 109939466Sken{ 110039466Sken u_int8_t opcode; 110139466Sken u_int8_t byte2; 110239466Sken#define SSS_IMMED 0x01 110339466Sken u_int8_t reserved[2]; 110439466Sken u_int8_t how; 110539466Sken#define SSS_START 0x01 110639466Sken#define SSS_LOEJ 0x02 1107225950Sken#define SSS_PC_MASK 0xf0 1108225950Sken#define SSS_PC_START_VALID 0x00 1109225950Sken#define SSS_PC_ACTIVE 0x10 1110225950Sken#define SSS_PC_IDLE 0x20 1111225950Sken#define SSS_PC_STANDBY 0x30 1112225950Sken#define SSS_PC_LU_CONTROL 0x70 1113225950Sken#define SSS_PC_FORCE_IDLE_0 0xa0 1114225950Sken#define SSS_PC_FORCE_STANDBY_0 0xb0 111539466Sken u_int8_t control; 111639466Sken}; 111739466Sken 1118172605Sscottlstruct ata_pass_12 { 1119172605Sscottl u_int8_t opcode; 1120172605Sscottl u_int8_t protocol; 1121248992Ssmh#define AP_PROTO_HARD_RESET (0x00 << 1) 1122248992Ssmh#define AP_PROTO_SRST (0x01 << 1) 1123248992Ssmh#define AP_PROTO_NON_DATA (0x03 << 1) 1124248992Ssmh#define AP_PROTO_PIO_IN (0x04 << 1) 1125248992Ssmh#define AP_PROTO_PIO_OUT (0x05 << 1) 1126248992Ssmh#define AP_PROTO_DMA (0x06 << 1) 1127248992Ssmh#define AP_PROTO_DMA_QUEUED (0x07 << 1) 1128248992Ssmh#define AP_PROTO_DEVICE_DIAG (0x08 << 1) 1129248992Ssmh#define AP_PROTO_DEVICE_RESET (0x09 << 1) 1130252045Ssmh#define AP_PROTO_UDMA_IN (0x0a << 1) 1131252045Ssmh#define AP_PROTO_UDMA_OUT (0x0b << 1) 1132252045Ssmh#define AP_PROTO_FPDMA (0x0c << 1) 1133252045Ssmh#define AP_PROTO_RESP_INFO (0x0f << 1) 1134208905Smjacob#define AP_MULTI 0xe0 1135172605Sscottl u_int8_t flags; 1136208905Smjacob#define AP_T_LEN 0x03 1137208905Smjacob#define AP_BB 0x04 1138208905Smjacob#define AP_T_DIR 0x08 1139208905Smjacob#define AP_CK_COND 0x20 1140208905Smjacob#define AP_OFFLINE 0x60 1141172605Sscottl u_int8_t features; 1142172605Sscottl u_int8_t sector_count; 1143172605Sscottl u_int8_t lba_low; 1144172605Sscottl u_int8_t lba_mid; 1145172605Sscottl u_int8_t lba_high; 1146172605Sscottl u_int8_t device; 1147172605Sscottl u_int8_t command; 1148172605Sscottl u_int8_t reserved; 1149172605Sscottl u_int8_t control; 1150172605Sscottl}; 1151172605Sscottl 1152225950Skenstruct scsi_maintenance_in 1153225950Sken{ 1154225950Sken uint8_t opcode; 1155225950Sken uint8_t byte2; 1156225950Sken#define SERVICE_ACTION_MASK 0x1f 1157225950Sken#define SA_RPRT_TRGT_GRP 0x0a 1158225950Sken uint8_t reserved[4]; 1159225950Sken uint8_t length[4]; 1160225950Sken uint8_t reserved1; 1161225950Sken uint8_t control; 1162225950Sken}; 1163225950Sken 1164268674Smavstruct scsi_report_supported_opcodes 1165268674Smav{ 1166268674Smav uint8_t opcode; 1167268674Smav uint8_t service_action; 1168268674Smav uint8_t options; 1169268674Smav#define RSO_RCTD 0x80 1170268674Smav#define RSO_OPTIONS_MASK 0x07 1171268674Smav#define RSO_OPTIONS_ALL 0x00 1172268674Smav#define RSO_OPTIONS_OC 0x01 1173268674Smav#define RSO_OPTIONS_OC_SA 0x02 1174268674Smav uint8_t requested_opcode; 1175268674Smav uint8_t requested_service_action[2]; 1176268674Smav uint8_t length[4]; 1177268674Smav uint8_t reserved1; 1178268674Smav uint8_t control; 1179268674Smav}; 1180268674Smav 1181268674Smavstruct scsi_report_supported_opcodes_timeout 1182268674Smav{ 1183268674Smav uint8_t length[2]; 1184268674Smav uint8_t reserved; 1185268674Smav uint8_t cmd_specific; 1186268674Smav uint8_t nominal_time[4]; 1187268674Smav uint8_t recommended_time[4]; 1188268674Smav}; 1189268674Smav 1190268674Smavstruct scsi_report_supported_opcodes_descr 1191268674Smav{ 1192268674Smav uint8_t opcode; 1193268674Smav uint8_t reserved; 1194268674Smav uint8_t service_action[2]; 1195268674Smav uint8_t reserved2; 1196268674Smav uint8_t flags; 1197268674Smav#define RSO_SERVACTV 0x01 1198268674Smav#define RSO_CTDP 0x02 1199268674Smav uint8_t cdb_length[2]; 1200268674Smav struct scsi_report_supported_opcodes_timeout timeout[0]; 1201268674Smav}; 1202268674Smav 1203268674Smavstruct scsi_report_supported_opcodes_all 1204268674Smav{ 1205268674Smav uint8_t length[4]; 1206268674Smav struct scsi_report_supported_opcodes_descr descr[0]; 1207268674Smav}; 1208268674Smav 1209268674Smavstruct scsi_report_supported_opcodes_one 1210268674Smav{ 1211268674Smav uint8_t reserved; 1212268674Smav uint8_t support; 1213268674Smav#define RSO_ONE_CTDP 0x80 1214268674Smav uint8_t cdb_length[2]; 1215268674Smav uint8_t cdb_usage[]; 1216268674Smav}; 1217268674Smav 1218268674Smavstruct scsi_report_supported_tmf 1219268674Smav{ 1220268674Smav uint8_t opcode; 1221268674Smav uint8_t service_action; 1222268674Smav uint8_t reserved[4]; 1223268674Smav uint8_t length[4]; 1224268674Smav uint8_t reserved1; 1225268674Smav uint8_t control; 1226268674Smav}; 1227268674Smav 1228268674Smavstruct scsi_report_supported_tmf_data 1229268674Smav{ 1230268674Smav uint8_t byte1; 1231268674Smav#define RST_WAKES 0x01 1232268674Smav#define RST_TRS 0x02 1233268674Smav#define RST_QTS 0x04 1234268674Smav#define RST_LURS 0x08 1235268674Smav#define RST_CTSS 0x10 1236268674Smav#define RST_CACAS 0x20 1237268674Smav#define RST_ATSS 0x40 1238268674Smav#define RST_ATS 0x80 1239268674Smav uint8_t byte2; 1240268674Smav#define RST_ITNRS 0x01 1241268674Smav#define RST_QTSS 0x02 1242268674Smav#define RST_QAES 0x04 1243268674Smav uint8_t reserved[2]; 1244268674Smav}; 1245268674Smav 1246268675Smavstruct scsi_report_timestamp 1247268675Smav{ 1248268675Smav uint8_t opcode; 1249268675Smav uint8_t service_action; 1250268675Smav uint8_t reserved[4]; 1251268675Smav uint8_t length[4]; 1252268675Smav uint8_t reserved1; 1253268675Smav uint8_t control; 1254268675Smav}; 1255268675Smav 1256268675Smavstruct scsi_report_timestamp_data 1257268675Smav{ 1258268675Smav uint8_t length[2]; 1259268675Smav uint8_t origin; 1260268675Smav#define RTS_ORIG_MASK 0x00 1261268675Smav#define RTS_ORIG_ZERO 0x00 1262268675Smav#define RTS_ORIG_SET 0x02 1263268675Smav#define RTS_ORIG_OUTSIDE 0x03 1264268675Smav uint8_t reserved; 1265268675Smav uint8_t timestamp[6]; 1266268675Smav uint8_t reserve2[2]; 1267268675Smav}; 1268268675Smav 1269269296Smavstruct scsi_receive_copy_status_lid1 1270269296Smav{ 1271269296Smav uint8_t opcode; 1272269296Smav uint8_t service_action; 1273269296Smav#define RCS_RCS_LID1 0x00 1274269296Smav uint8_t list_identifier; 1275269296Smav uint8_t reserved[7]; 1276269296Smav uint8_t length[4]; 1277269296Smav uint8_t reserved1; 1278269296Smav uint8_t control; 1279269296Smav}; 1280269296Smav 1281269296Smavstruct scsi_receive_copy_status_lid1_data 1282269296Smav{ 1283269296Smav uint8_t available_data[4]; 1284269296Smav uint8_t copy_command_status; 1285269296Smav#define RCS_CCS_INPROG 0x00 1286269296Smav#define RCS_CCS_COMPLETED 0x01 1287269296Smav#define RCS_CCS_ERROR 0x02 1288269296Smav uint8_t segments_processed[2]; 1289269296Smav uint8_t transfer_count_units; 1290269296Smav#define RCS_TC_BYTES 0x00 1291269296Smav#define RCS_TC_KBYTES 0x01 1292269296Smav#define RCS_TC_MBYTES 0x02 1293269296Smav#define RCS_TC_GBYTES 0x03 1294269296Smav#define RCS_TC_TBYTES 0x04 1295269296Smav#define RCS_TC_PBYTES 0x05 1296269296Smav#define RCS_TC_EBYTES 0x06 1297269296Smav#define RCS_TC_LBAS 0xf1 1298269296Smav uint8_t transfer_count[4]; 1299269296Smav}; 1300269296Smav 1301269296Smavstruct scsi_receive_copy_failure_details 1302269296Smav{ 1303269296Smav uint8_t opcode; 1304269296Smav uint8_t service_action; 1305269296Smav#define RCS_RCFD 0x04 1306269296Smav uint8_t list_identifier; 1307269296Smav uint8_t reserved[7]; 1308269296Smav uint8_t length[4]; 1309269296Smav uint8_t reserved1; 1310269296Smav uint8_t control; 1311269296Smav}; 1312269296Smav 1313269296Smavstruct scsi_receive_copy_failure_details_data 1314269296Smav{ 1315269296Smav uint8_t available_data[4]; 1316269296Smav uint8_t reserved[52]; 1317269296Smav uint8_t copy_command_status; 1318269296Smav uint8_t reserved2; 1319269296Smav uint8_t sense_data_length[2]; 1320269296Smav uint8_t sense_data[]; 1321269296Smav}; 1322269296Smav 1323269296Smavstruct scsi_receive_copy_status_lid4 1324269296Smav{ 1325269296Smav uint8_t opcode; 1326269296Smav uint8_t service_action; 1327269296Smav#define RCS_RCS_LID4 0x05 1328269296Smav uint8_t list_identifier[4]; 1329269296Smav uint8_t reserved[4]; 1330269296Smav uint8_t length[4]; 1331269296Smav uint8_t reserved1; 1332269296Smav uint8_t control; 1333269296Smav}; 1334269296Smav 1335269296Smavstruct scsi_receive_copy_status_lid4_data 1336269296Smav{ 1337269296Smav uint8_t available_data[4]; 1338269296Smav uint8_t response_to_service_action; 1339269296Smav uint8_t copy_command_status; 1340269296Smav#define RCS_CCS_COMPLETED_PROD 0x03 1341269296Smav#define RCS_CCS_COMPLETED_RESID 0x04 1342269296Smav#define RCS_CCS_INPROG_FGBG 0x10 1343269296Smav#define RCS_CCS_INPROG_FG 0x11 1344269296Smav#define RCS_CCS_INPROG_BG 0x12 1345269296Smav#define RCS_CCS_ABORTED 0x60 1346269296Smav uint8_t operation_counter[2]; 1347269296Smav uint8_t estimated_status_update_delay[4]; 1348269296Smav uint8_t extended_copy_completion_status; 1349269296Smav uint8_t length_of_the_sense_data_field; 1350269296Smav uint8_t sense_data_length; 1351269296Smav uint8_t transfer_count_units; 1352269296Smav uint8_t transfer_count[8]; 1353269296Smav uint8_t segments_processed[2]; 1354270106Smav uint8_t reserved[6]; 1355269296Smav uint8_t sense_data[]; 1356269296Smav}; 1357269296Smav 1358269296Smavstruct scsi_receive_copy_operating_parameters 1359269296Smav{ 1360269296Smav uint8_t opcode; 1361269296Smav uint8_t service_action; 1362269296Smav#define RCS_RCOP 0x03 1363269296Smav uint8_t reserved[8]; 1364269296Smav uint8_t length[4]; 1365269296Smav uint8_t reserved1; 1366269296Smav uint8_t control; 1367269296Smav}; 1368269296Smav 1369269296Smavstruct scsi_receive_copy_operating_parameters_data 1370269296Smav{ 1371269296Smav uint8_t length[4]; 1372269296Smav uint8_t snlid; 1373269296Smav#define RCOP_SNLID 0x01 1374269296Smav uint8_t reserved[3]; 1375269296Smav uint8_t maximum_cscd_descriptor_count[2]; 1376269296Smav uint8_t maximum_segment_descriptor_count[2]; 1377269296Smav uint8_t maximum_descriptor_list_length[4]; 1378269296Smav uint8_t maximum_segment_length[4]; 1379269296Smav uint8_t maximum_inline_data_length[4]; 1380269296Smav uint8_t held_data_limit[4]; 1381269296Smav uint8_t maximum_stream_device_transfer_size[4]; 1382269296Smav uint8_t reserved2[2]; 1383269296Smav uint8_t total_concurrent_copies[2]; 1384269296Smav uint8_t maximum_concurrent_copies; 1385269296Smav uint8_t data_segment_granularity; 1386269296Smav uint8_t inline_data_granularity; 1387269296Smav uint8_t held_data_granularity; 1388269296Smav uint8_t reserved3[3]; 1389269296Smav uint8_t implemented_descriptor_list_length; 1390269296Smav uint8_t list_of_implemented_descriptor_type_codes[0]; 1391269296Smav}; 1392269296Smav 1393269296Smavstruct scsi_extended_copy 1394269296Smav{ 1395269296Smav uint8_t opcode; 1396269296Smav uint8_t service_action; 1397269296Smav#define EC_EC_LID1 0x00 1398269296Smav#define EC_EC_LID4 0x01 1399269296Smav uint8_t reserved[8]; 1400269296Smav uint8_t length[4]; 1401269296Smav uint8_t reserved1; 1402269296Smav uint8_t control; 1403269296Smav}; 1404269296Smav 1405269296Smavstruct scsi_ec_cscd_dtsp 1406269296Smav{ 1407269296Smav uint8_t flags; 1408269296Smav#define EC_CSCD_FIXED 0x01 1409269296Smav#define EC_CSCD_PAD 0x04 1410269296Smav uint8_t block_length[3]; 1411269296Smav}; 1412269296Smav 1413269296Smavstruct scsi_ec_cscd 1414269296Smav{ 1415269296Smav uint8_t type_code; 1416269296Smav#define EC_CSCD_EXT 0xff 1417269296Smav uint8_t luidt_pdt; 1418269296Smav#define EC_LUIDT_MASK 0xc0 1419269296Smav#define EC_LUIDT_LUN 0x00 1420269296Smav#define EC_LUIDT_PROXY_TOKEN 0x40 1421269296Smav uint8_t relative_initiator_port[2]; 1422269296Smav uint8_t cscd_params[24]; 1423269296Smav struct scsi_ec_cscd_dtsp dtsp; 1424269296Smav}; 1425269296Smav 1426269296Smavstruct scsi_ec_cscd_id 1427269296Smav{ 1428269296Smav uint8_t type_code; 1429269296Smav#define EC_CSCD_ID 0xe4 1430269296Smav uint8_t luidt_pdt; 1431269296Smav uint8_t relative_initiator_port[2]; 1432269296Smav uint8_t codeset; 1433269296Smav uint8_t id_type; 1434269296Smav uint8_t reserved; 1435269296Smav uint8_t length; 1436269296Smav uint8_t designator[20]; 1437269296Smav struct scsi_ec_cscd_dtsp dtsp; 1438269296Smav}; 1439269296Smav 1440269296Smavstruct scsi_ec_segment 1441269296Smav{ 1442269296Smav uint8_t type_code; 1443269296Smav uint8_t flags; 1444269296Smav#define EC_SEG_DC 0x02 1445269296Smav#define EC_SEG_CAT 0x01 1446269296Smav uint8_t descr_length[2]; 1447269296Smav uint8_t params[]; 1448269296Smav}; 1449269296Smav 1450269296Smavstruct scsi_ec_segment_b2b 1451269296Smav{ 1452269296Smav uint8_t type_code; 1453269296Smav#define EC_SEG_B2B 0x02 1454269296Smav uint8_t flags; 1455269296Smav uint8_t descr_length[2]; 1456269296Smav uint8_t src_cscd[2]; 1457269296Smav uint8_t dst_cscd[2]; 1458269296Smav uint8_t reserved[2]; 1459269296Smav uint8_t number_of_blocks[2]; 1460269296Smav uint8_t src_lba[8]; 1461269296Smav uint8_t dst_lba[8]; 1462269296Smav}; 1463269296Smav 1464269296Smavstruct scsi_ec_segment_verify 1465269296Smav{ 1466269296Smav uint8_t type_code; 1467269296Smav#define EC_SEG_VERIFY 0x07 1468269296Smav uint8_t reserved; 1469269296Smav uint8_t descr_length[2]; 1470269296Smav uint8_t src_cscd[2]; 1471269296Smav uint8_t reserved2[2]; 1472269296Smav uint8_t tur; 1473269296Smav uint8_t reserved3[3]; 1474269296Smav}; 1475269296Smav 1476269296Smavstruct scsi_ec_segment_register_key 1477269296Smav{ 1478269296Smav uint8_t type_code; 1479269296Smav#define EC_SEG_REGISTER_KEY 0x14 1480269296Smav uint8_t reserved; 1481269296Smav uint8_t descr_length[2]; 1482269296Smav uint8_t reserved2[2]; 1483269296Smav uint8_t dst_cscd[2]; 1484269296Smav uint8_t res_key[8]; 1485269296Smav uint8_t sa_res_key[8]; 1486269296Smav uint8_t reserved3[4]; 1487269296Smav}; 1488269296Smav 1489269296Smavstruct scsi_extended_copy_lid1_data 1490269296Smav{ 1491269296Smav uint8_t list_identifier; 1492269296Smav uint8_t flags; 1493269296Smav#define EC_PRIORITY 0x07 1494269296Smav#define EC_LIST_ID_USAGE_MASK 0x18 1495269296Smav#define EC_LIST_ID_USAGE_FULL 0x08 1496269296Smav#define EC_LIST_ID_USAGE_NOHOLD 0x10 1497269296Smav#define EC_LIST_ID_USAGE_NONE 0x18 1498269296Smav#define EC_STR 0x20 1499269296Smav uint8_t cscd_list_length[2]; 1500269296Smav uint8_t reserved[4]; 1501269296Smav uint8_t segment_list_length[4]; 1502269296Smav uint8_t inline_data_length[4]; 1503269296Smav uint8_t data[]; 1504269296Smav}; 1505269296Smav 1506269296Smavstruct scsi_extended_copy_lid4_data 1507269296Smav{ 1508269296Smav uint8_t list_format; 1509269296Smav#define EC_LIST_FORMAT 0x01 1510269296Smav uint8_t flags; 1511269296Smav uint8_t header_cscd_list_length[2]; 1512269296Smav uint8_t reserved[11]; 1513269296Smav uint8_t flags2; 1514269296Smav#define EC_IMMED 0x01 1515269296Smav#define EC_G_SENSE 0x02 1516269296Smav uint8_t header_cscd_type_code; 1517269296Smav uint8_t reserved2[3]; 1518269296Smav uint8_t list_identifier[4]; 1519269296Smav uint8_t reserved3[18]; 1520269296Smav uint8_t cscd_list_length[2]; 1521269296Smav uint8_t segment_list_length[2]; 1522269296Smav uint8_t inline_data_length[2]; 1523269296Smav uint8_t data[]; 1524269296Smav}; 1525269296Smav 1526269296Smavstruct scsi_copy_operation_abort 1527269296Smav{ 1528269296Smav uint8_t opcode; 1529269296Smav uint8_t service_action; 1530269296Smav#define EC_COA 0x1c 1531269296Smav uint8_t list_identifier[4]; 1532269296Smav uint8_t reserved[9]; 1533269296Smav uint8_t control; 1534269296Smav}; 1535269296Smav 1536270106Smavstruct scsi_populate_token 1537270106Smav{ 1538270106Smav uint8_t opcode; 1539270106Smav uint8_t service_action; 1540270106Smav#define EC_PT 0x10 1541270106Smav uint8_t reserved[4]; 1542270106Smav uint8_t list_identifier[4]; 1543270106Smav uint8_t length[4]; 1544270106Smav uint8_t group_number; 1545270106Smav uint8_t control; 1546270106Smav}; 1547270106Smav 1548270106Smavstruct scsi_range_desc 1549270106Smav{ 1550270106Smav uint8_t lba[8]; 1551270106Smav uint8_t length[4]; 1552270106Smav uint8_t reserved[4]; 1553270106Smav}; 1554270106Smav 1555270106Smavstruct scsi_populate_token_data 1556270106Smav{ 1557270106Smav uint8_t length[2]; 1558270106Smav uint8_t flags; 1559270106Smav#define EC_PT_IMMED 0x01 1560270106Smav#define EC_PT_RTV 0x02 1561270106Smav uint8_t reserved; 1562270106Smav uint8_t inactivity_timeout[4]; 1563270106Smav uint8_t rod_type[4]; 1564270106Smav uint8_t reserved2[2]; 1565270106Smav uint8_t range_descriptor_length[2]; 1566270106Smav struct scsi_range_desc desc[]; 1567270106Smav}; 1568270106Smav 1569270106Smavstruct scsi_write_using_token 1570270106Smav{ 1571270106Smav uint8_t opcode; 1572270106Smav uint8_t service_action; 1573270106Smav#define EC_WUT 0x11 1574270106Smav uint8_t reserved[4]; 1575270106Smav uint8_t list_identifier[4]; 1576270106Smav uint8_t length[4]; 1577270106Smav uint8_t group_number; 1578270106Smav uint8_t control; 1579270106Smav}; 1580270106Smav 1581270106Smavstruct scsi_write_using_token_data 1582270106Smav{ 1583270106Smav uint8_t length[2]; 1584270106Smav uint8_t flags; 1585270106Smav#define EC_WUT_IMMED 0x01 1586270106Smav#define EC_WUT_DEL_TKN 0x02 1587270106Smav uint8_t reserved[5]; 1588270106Smav uint8_t offset_into_rod[8]; 1589270106Smav uint8_t rod_token[512]; 1590270106Smav uint8_t reserved2[6]; 1591270106Smav uint8_t range_descriptor_length[2]; 1592270106Smav struct scsi_range_desc desc[]; 1593270106Smav}; 1594270106Smav 1595270106Smavstruct scsi_receive_rod_token_information 1596270106Smav{ 1597270106Smav uint8_t opcode; 1598270106Smav uint8_t service_action; 1599270106Smav#define RCS_RRTI 0x07 1600270106Smav uint8_t list_identifier[4]; 1601270106Smav uint8_t reserved[4]; 1602270106Smav uint8_t length[4]; 1603270106Smav uint8_t reserved2; 1604270106Smav uint8_t control; 1605270106Smav}; 1606270106Smav 1607270106Smavstruct scsi_token 1608270106Smav{ 1609270106Smav uint8_t type[4]; 1610270106Smav#define ROD_TYPE_INTERNAL 0x00000000 1611271903Smav#define ROD_TYPE_AUR 0x00010000 1612271903Smav#define ROD_TYPE_PIT_DEF 0x00800000 1613271903Smav#define ROD_TYPE_PIT_VULN 0x00800001 1614271903Smav#define ROD_TYPE_PIT_PERS 0x00800002 1615271903Smav#define ROD_TYPE_PIT_ANY 0x0080FFFF 1616270106Smav#define ROD_TYPE_BLOCK_ZERO 0xFFFF0001 1617270106Smav uint8_t reserved[2]; 1618270106Smav uint8_t length[2]; 1619270106Smav uint8_t body[0]; 1620270106Smav}; 1621270106Smav 1622270106Smavstruct scsi_report_all_rod_tokens 1623270106Smav{ 1624270106Smav uint8_t opcode; 1625270106Smav uint8_t service_action; 1626270106Smav#define RCS_RART 0x08 1627270106Smav uint8_t reserved[8]; 1628270106Smav uint8_t length[4]; 1629270106Smav uint8_t reserved2; 1630270106Smav uint8_t control; 1631270106Smav}; 1632270106Smav 1633270106Smavstruct scsi_report_all_rod_tokens_data 1634270106Smav{ 1635270106Smav uint8_t available_data[4]; 1636270106Smav uint8_t reserved[4]; 1637270106Smav uint8_t rod_management_token_list[]; 1638270106Smav}; 1639270106Smav 1640172605Sscottlstruct ata_pass_16 { 1641172605Sscottl u_int8_t opcode; 1642172605Sscottl u_int8_t protocol; 1643208905Smjacob#define AP_EXTEND 0x01 1644172605Sscottl u_int8_t flags; 1645248992Ssmh#define AP_FLAG_TLEN_NO_DATA (0 << 0) 1646248992Ssmh#define AP_FLAG_TLEN_FEAT (1 << 0) 1647248992Ssmh#define AP_FLAG_TLEN_SECT_CNT (2 << 0) 1648248992Ssmh#define AP_FLAG_TLEN_STPSIU (3 << 0) 1649248992Ssmh#define AP_FLAG_BYT_BLOK_BYTES (0 << 2) 1650248992Ssmh#define AP_FLAG_BYT_BLOK_BLOCKS (1 << 2) 1651248992Ssmh#define AP_FLAG_TDIR_TO_DEV (0 << 3) 1652248992Ssmh#define AP_FLAG_TDIR_FROM_DEV (1 << 3) 1653248992Ssmh#define AP_FLAG_CHK_COND (1 << 5) 1654172605Sscottl u_int8_t features_ext; 1655172605Sscottl u_int8_t features; 1656172605Sscottl u_int8_t sector_count_ext; 1657172605Sscottl u_int8_t sector_count; 1658172605Sscottl u_int8_t lba_low_ext; 1659172605Sscottl u_int8_t lba_low; 1660172605Sscottl u_int8_t lba_mid_ext; 1661172605Sscottl u_int8_t lba_mid; 1662172605Sscottl u_int8_t lba_high_ext; 1663172605Sscottl u_int8_t lba_high; 1664172605Sscottl u_int8_t device; 1665172605Sscottl u_int8_t command; 1666172605Sscottl u_int8_t control; 1667172605Sscottl}; 1668172605Sscottl 1669208905Smjacob#define SC_SCSI_1 0x01 1670208905Smjacob#define SC_SCSI_2 0x03 167139213Sgibbs 167239213Sgibbs/* 167339213Sgibbs * Opcodes 167439213Sgibbs */ 167539213Sgibbs 167639213Sgibbs#define TEST_UNIT_READY 0x00 1677208905Smjacob#define REQUEST_SENSE 0x03 167839466Sken#define READ_6 0x08 1679208905Smjacob#define WRITE_6 0x0A 1680208905Smjacob#define INQUIRY 0x12 1681208905Smjacob#define MODE_SELECT_6 0x15 1682208905Smjacob#define MODE_SENSE_6 0x1A 1683208905Smjacob#define START_STOP_UNIT 0x1B 1684208905Smjacob#define START_STOP 0x1B 1685208905Smjacob#define RESERVE 0x16 1686208905Smjacob#define RELEASE 0x17 1687208905Smjacob#define RECEIVE_DIAGNOSTIC 0x1C 1688208905Smjacob#define SEND_DIAGNOSTIC 0x1D 1689208905Smjacob#define PREVENT_ALLOW 0x1E 169039213Sgibbs#define READ_CAPACITY 0x25 169139466Sken#define READ_10 0x28 1692208905Smjacob#define WRITE_10 0x2A 1693208905Smjacob#define POSITION_TO_ELEMENT 0x2B 1694225950Sken#define WRITE_VERIFY_10 0x2E 1695239212Smjacob#define VERIFY_10 0x2F 169639213Sgibbs#define SYNCHRONIZE_CACHE 0x35 1697172605Sscottl#define READ_DEFECT_DATA_10 0x37 1698208905Smjacob#define WRITE_BUFFER 0x3B 1699208905Smjacob#define READ_BUFFER 0x3C 170039213Sgibbs#define CHANGE_DEFINITION 0x40 1701230053Smav#define WRITE_SAME_10 0x41 1702230053Smav#define UNMAP 0x42 1703208905Smjacob#define LOG_SELECT 0x4C 1704208905Smjacob#define LOG_SENSE 0x4D 170539213Sgibbs#define MODE_SELECT_10 0x55 1706225950Sken#define RESERVE_10 0x56 1707225950Sken#define RELEASE_10 0x57 170839213Sgibbs#define MODE_SENSE_10 0x5A 1709225950Sken#define PERSISTENT_RES_IN 0x5E 1710225950Sken#define PERSISTENT_RES_OUT 0x5F 1711269296Smav#define EXTENDED_COPY 0x83 1712269296Smav#define RECEIVE_COPY_STATUS 0x84 1713172605Sscottl#define ATA_PASS_16 0x85 1714114261Sken#define READ_16 0x88 1715268151Smav#define COMPARE_AND_WRITE 0x89 1716208905Smjacob#define WRITE_16 0x8A 1717225950Sken#define WRITE_VERIFY_16 0x8E 1718268151Smav#define VERIFY_16 0x8F 1719225950Sken#define SYNCHRONIZE_CACHE_16 0x91 1720230053Smav#define WRITE_SAME_16 0x93 1721208905Smjacob#define SERVICE_ACTION_IN 0x9E 172297825Smjacob#define REPORT_LUNS 0xA0 1723208905Smjacob#define ATA_PASS_12 0xA1 1724208905Smjacob#define MAINTENANCE_IN 0xA3 1725208905Smjacob#define MAINTENANCE_OUT 0xA4 1726208905Smjacob#define MOVE_MEDIUM 0xA5 1727208905Smjacob#define READ_12 0xA8 1728208905Smjacob#define WRITE_12 0xAA 1729225950Sken#define WRITE_VERIFY_12 0xAE 1730268151Smav#define VERIFY_12 0xAF 1731208905Smjacob#define READ_ELEMENT_STATUS 0xB8 1732228808Smav#define READ_CD 0xBE 173339213Sgibbs 1734208905Smjacob/* Maintenance In Service Action Codes */ 1735208905Smjacob#define REPORT_IDENTIFYING_INFRMATION 0x05 1736208905Smjacob#define REPORT_TARGET_PORT_GROUPS 0x0A 1737208905Smjacob#define REPORT_ALIASES 0x0B 1738208905Smjacob#define REPORT_SUPPORTED_OPERATION_CODES 0x0C 1739208905Smjacob#define REPORT_SUPPORTED_TASK_MANAGEMENT_FUNCTIONS 0x0D 1740208905Smjacob#define REPORT_PRIORITY 0x0E 1741208905Smjacob#define REPORT_TIMESTAMP 0x0F 1742208905Smjacob#define MANAGEMENT_PROTOCOL_IN 0x10 1743208905Smjacob/* Maintenance Out Service Action Codes */ 1744208905Smjacob#define SET_IDENTIFY_INFORMATION 0x06 1745208905Smjacob#define SET_TARGET_PORT_GROUPS 0x0A 1746208905Smjacob#define CHANGE_ALIASES 0x0B 1747208905Smjacob#define SET_PRIORITY 0x0E 1748208905Smjacob#define SET_TIMESTAMP 0x0F 1749208905Smjacob#define MANGAEMENT_PROTOCOL_OUT 0x10 175039213Sgibbs 175139213Sgibbs/* 175239213Sgibbs * Device Types 175339213Sgibbs */ 1754181381Sjkim#define T_DIRECT 0x00 1755181381Sjkim#define T_SEQUENTIAL 0x01 1756181381Sjkim#define T_PRINTER 0x02 1757181381Sjkim#define T_PROCESSOR 0x03 1758181381Sjkim#define T_WORM 0x04 1759181381Sjkim#define T_CDROM 0x05 1760181381Sjkim#define T_SCANNER 0x06 1761181381Sjkim#define T_OPTICAL 0x07 1762181381Sjkim#define T_CHANGER 0x08 1763181381Sjkim#define T_COMM 0x09 1764181381Sjkim#define T_ASC0 0x0a 1765181381Sjkim#define T_ASC1 0x0b 176639213Sgibbs#define T_STORARRAY 0x0c 176739213Sgibbs#define T_ENCLOSURE 0x0d 176856147Smjacob#define T_RBC 0x0e 176956147Smjacob#define T_OCRW 0x0f 1770181381Sjkim#define T_OSD 0x11 1771181381Sjkim#define T_ADC 0x12 1772181381Sjkim#define T_NODEVICE 0x1f 1773181381Sjkim#define T_ANY 0xff /* Used in Quirk table matches */ 177439213Sgibbs 1775208905Smjacob#define T_REMOV 1 177639213Sgibbs#define T_FIXED 0 177739213Sgibbs 177857349Sken/* 177957349Sken * This length is the initial inquiry length used by the probe code, as 1780248992Ssmh * well as the length necessary for scsi_print_inquiry() to function 178157349Sken * correctly. If either use requires a different length in the future, 178257349Sken * the two values should be de-coupled. 178357349Sken */ 178456147Smjacob#define SHORT_INQUIRY_LENGTH 36 178556147Smjacob 178639213Sgibbsstruct scsi_inquiry_data 178739213Sgibbs{ 178839213Sgibbs u_int8_t device; 178939213Sgibbs#define SID_TYPE(inq_data) ((inq_data)->device & 0x1f) 179039213Sgibbs#define SID_QUAL(inq_data) (((inq_data)->device & 0xE0) >> 5) 179174840Sken#define SID_QUAL_LU_CONNECTED 0x00 /* 179274840Sken * The specified peripheral device 179339213Sgibbs * type is currently connected to 179439213Sgibbs * logical unit. If the target cannot 179539213Sgibbs * determine whether or not a physical 179639213Sgibbs * device is currently connected, it 179739213Sgibbs * shall also use this peripheral 179839213Sgibbs * qualifier when returning the INQUIRY 179939213Sgibbs * data. This peripheral qualifier 180039213Sgibbs * does not mean that the device is 180139213Sgibbs * ready for access by the initiator. 180239213Sgibbs */ 180374840Sken#define SID_QUAL_LU_OFFLINE 0x01 /* 180474840Sken * The target is capable of supporting 180539213Sgibbs * the specified peripheral device type 180639213Sgibbs * on this logical unit; however, the 180739213Sgibbs * physical device is not currently 180839213Sgibbs * connected to this logical unit. 180939213Sgibbs */ 1810208905Smjacob#define SID_QUAL_RSVD 0x02 181174840Sken#define SID_QUAL_BAD_LU 0x03 /* 181274840Sken * The target is not capable of 181339213Sgibbs * supporting a physical device on 181439213Sgibbs * this logical unit. For this 181539213Sgibbs * peripheral qualifier the peripheral 181639213Sgibbs * device type shall be set to 1Fh to 181739213Sgibbs * provide compatibility with previous 181839213Sgibbs * versions of SCSI. All other 181939213Sgibbs * peripheral device type values are 182039213Sgibbs * reserved for this peripheral 182139213Sgibbs * qualifier. 182239213Sgibbs */ 182339213Sgibbs#define SID_QUAL_IS_VENDOR_UNIQUE(inq_data) ((SID_QUAL(inq_data) & 0x08) != 0) 182439213Sgibbs u_int8_t dev_qual2; 182539213Sgibbs#define SID_QUAL2 0x7F 1826269296Smav#define SID_LU_CONG 0x40 1827269296Smav#define SID_RMB 0x80 1828269296Smav#define SID_IS_REMOVABLE(inq_data) (((inq_data)->dev_qual2 & SID_RMB) != 0) 182939213Sgibbs u_int8_t version; 1830208905Smjacob#define SID_ANSI_REV(inq_data) ((inq_data)->version & 0x07) 183141542Smjacob#define SCSI_REV_0 0 183241542Smjacob#define SCSI_REV_CCS 1 183341542Smjacob#define SCSI_REV_2 2 183474840Sken#define SCSI_REV_SPC 3 183556147Smjacob#define SCSI_REV_SPC2 4 1836208905Smjacob#define SCSI_REV_SPC3 5 1837208905Smjacob#define SCSI_REV_SPC4 6 183841542Smjacob 1839208905Smjacob#define SID_ECMA 0x38 1840208905Smjacob#define SID_ISO 0xC0 184139213Sgibbs u_int8_t response_format; 1842208905Smjacob#define SID_AENC 0x80 1843208905Smjacob#define SID_TrmIOP 0x40 1844225950Sken#define SID_NormACA 0x20 1845225950Sken#define SID_HiSup 0x10 184639213Sgibbs u_int8_t additional_length; 1847164894Smjacob#define SID_ADDITIONAL_LENGTH(iqd) \ 1848164894Smjacob ((iqd)->additional_length + \ 1849225950Sken __offsetof(struct scsi_inquiry_data, additional_length) + 1) 1850208905Smjacob u_int8_t spc3_flags; 1851208905Smjacob#define SPC3_SID_PROTECT 0x01 1852208905Smjacob#define SPC3_SID_3PC 0x08 1853208905Smjacob#define SPC3_SID_TPGS_MASK 0x30 1854208905Smjacob#define SPC3_SID_TPGS_IMPLICIT 0x10 1855208905Smjacob#define SPC3_SID_TPGS_EXPLICIT 0x20 1856208905Smjacob#define SPC3_SID_ACC 0x40 1857208905Smjacob#define SPC3_SID_SCCS 0x80 1858159086Smjacob u_int8_t spc2_flags; 1859225950Sken#define SPC2_SID_ADDR16 0x01 1860208905Smjacob#define SPC2_SID_MChngr 0x08 1861208905Smjacob#define SPC2_SID_MultiP 0x10 1862208905Smjacob#define SPC2_SID_EncServ 0x40 1863208905Smjacob#define SPC2_SID_BQueue 0x80 1864159086Smjacob 1865208905Smjacob#define INQ_DATA_TQ_ENABLED(iqd) \ 1866159086Smjacob ((SID_ANSI_REV(iqd) < SCSI_REV_SPC2)? ((iqd)->flags & SID_CmdQue) : \ 1867159086Smjacob (((iqd)->flags & SID_CmdQue) && !((iqd)->spc2_flags & SPC2_SID_BQueue)) || \ 1868159086Smjacob (!((iqd)->flags & SID_CmdQue) && ((iqd)->spc2_flags & SPC2_SID_BQueue))) 1869159086Smjacob 187039213Sgibbs u_int8_t flags; 187139213Sgibbs#define SID_SftRe 0x01 187239213Sgibbs#define SID_CmdQue 0x02 187339213Sgibbs#define SID_Linked 0x08 187439213Sgibbs#define SID_Sync 0x10 187539213Sgibbs#define SID_WBus16 0x20 187639213Sgibbs#define SID_WBus32 0x40 187739213Sgibbs#define SID_RelAdr 0x80 1878208905Smjacob#define SID_VENDOR_SIZE 8 187939213Sgibbs char vendor[SID_VENDOR_SIZE]; 1880208905Smjacob#define SID_PRODUCT_SIZE 16 188139213Sgibbs char product[SID_PRODUCT_SIZE]; 1882208905Smjacob#define SID_REVISION_SIZE 4 188339213Sgibbs char revision[SID_REVISION_SIZE]; 188456147Smjacob /* 188556147Smjacob * The following fields were taken from SCSI Primary Commands - 2 188656147Smjacob * (SPC-2) Revision 14, Dated 11 November 1999 188756147Smjacob */ 188856147Smjacob#define SID_VENDOR_SPECIFIC_0_SIZE 20 188956147Smjacob u_int8_t vendor_specific0[SID_VENDOR_SPECIFIC_0_SIZE]; 189056147Smjacob /* 189156147Smjacob * An extension of SCSI Parallel Specific Values 189256147Smjacob */ 189356147Smjacob#define SID_SPI_IUS 0x01 189456147Smjacob#define SID_SPI_QAS 0x02 189556147Smjacob#define SID_SPI_CLOCK_ST 0x00 189656147Smjacob#define SID_SPI_CLOCK_DT 0x04 189756147Smjacob#define SID_SPI_CLOCK_DT_ST 0x0C 189874840Sken#define SID_SPI_MASK 0x0F 189956147Smjacob u_int8_t spi3data; 190056147Smjacob u_int8_t reserved2; 190156147Smjacob /* 190256147Smjacob * Version Descriptors, stored 2 byte values. 190356147Smjacob */ 190456147Smjacob u_int8_t version1[2]; 190556147Smjacob u_int8_t version2[2]; 190656147Smjacob u_int8_t version3[2]; 190756147Smjacob u_int8_t version4[2]; 190856147Smjacob u_int8_t version5[2]; 190956147Smjacob u_int8_t version6[2]; 191056147Smjacob u_int8_t version7[2]; 191156147Smjacob u_int8_t version8[2]; 191256147Smjacob 191356147Smjacob u_int8_t reserved3[22]; 191456147Smjacob 191556593Smjacob#define SID_VENDOR_SPECIFIC_1_SIZE 160 191656147Smjacob u_int8_t vendor_specific1[SID_VENDOR_SPECIFIC_1_SIZE]; 191739213Sgibbs}; 191839213Sgibbs 1919225950Sken/* 1920225950Sken * This structure is more suited to initiator operation, because the 1921225950Sken * maximum number of supported pages is already allocated. 1922225950Sken */ 1923172605Sscottlstruct scsi_vpd_supported_page_list 1924172605Sscottl{ 1925172605Sscottl u_int8_t device; 1926172605Sscottl u_int8_t page_code; 1927216088Sken#define SVPD_SUPPORTED_PAGE_LIST 0x00 1928216088Sken#define SVPD_SUPPORTED_PAGES_HDR_LEN 4 1929172605Sscottl u_int8_t reserved; 1930172605Sscottl u_int8_t length; /* number of VPD entries */ 1931208905Smjacob#define SVPD_SUPPORTED_PAGES_SIZE 251 1932172605Sscottl u_int8_t list[SVPD_SUPPORTED_PAGES_SIZE]; 1933172605Sscottl}; 1934172605Sscottl 1935216088Sken/* 1936216088Sken * This structure is more suited to target operation, because the 1937216088Sken * number of supported pages is left to the user to allocate. 1938216088Sken */ 1939216088Skenstruct scsi_vpd_supported_pages 1940216088Sken{ 1941216088Sken u_int8_t device; 1942216088Sken u_int8_t page_code; 1943216088Sken u_int8_t reserved; 1944216088Sken#define SVPD_SUPPORTED_PAGES 0x00 1945216088Sken u_int8_t length; 1946216088Sken u_int8_t page_list[0]; 1947216088Sken}; 1948216088Sken 1949216088Sken 195039213Sgibbsstruct scsi_vpd_unit_serial_number 195139213Sgibbs{ 195239213Sgibbs u_int8_t device; 195339213Sgibbs u_int8_t page_code; 1954208905Smjacob#define SVPD_UNIT_SERIAL_NUMBER 0x80 195539213Sgibbs u_int8_t reserved; 195639213Sgibbs u_int8_t length; /* serial number length */ 1957208905Smjacob#define SVPD_SERIAL_NUM_SIZE 251 195856147Smjacob u_int8_t serial_num[SVPD_SERIAL_NUM_SIZE]; 195939213Sgibbs}; 196039213Sgibbs 1961216088Skenstruct scsi_vpd_device_id 1962216088Sken{ 1963216088Sken u_int8_t device; 1964216088Sken u_int8_t page_code; 1965216088Sken#define SVPD_DEVICE_ID 0x83 1966225950Sken#define SVPD_DEVICE_ID_MAX_SIZE 252 1967225950Sken#define SVPD_DEVICE_ID_HDR_LEN \ 1968225950Sken __offsetof(struct scsi_vpd_device_id, desc_list) 1969216088Sken u_int8_t length[2]; 1970225950Sken u_int8_t desc_list[]; 1971216088Sken}; 1972216088Sken 1973216088Skenstruct scsi_vpd_id_descriptor 1974216088Sken{ 1975216088Sken u_int8_t proto_codeset; 1976268700Smav /* 1977268700Smav * See the SCSI_PROTO definitions above for the protocols. 1978268700Smav */ 1979216088Sken#define SVPD_ID_PROTO_SHIFT 4 1980216088Sken#define SVPD_ID_CODESET_BINARY 0x01 1981216088Sken#define SVPD_ID_CODESET_ASCII 0x02 1982251654Smav#define SVPD_ID_CODESET_UTF8 0x03 1983225950Sken#define SVPD_ID_CODESET_MASK 0x0f 1984216088Sken u_int8_t id_type; 1985216088Sken#define SVPD_ID_PIV 0x80 1986216088Sken#define SVPD_ID_ASSOC_LUN 0x00 1987216088Sken#define SVPD_ID_ASSOC_PORT 0x10 1988216088Sken#define SVPD_ID_ASSOC_TARGET 0x20 1989225950Sken#define SVPD_ID_ASSOC_MASK 0x30 1990216088Sken#define SVPD_ID_TYPE_VENDOR 0x00 1991216088Sken#define SVPD_ID_TYPE_T10 0x01 1992216088Sken#define SVPD_ID_TYPE_EUI64 0x02 1993216088Sken#define SVPD_ID_TYPE_NAA 0x03 1994216088Sken#define SVPD_ID_TYPE_RELTARG 0x04 1995216088Sken#define SVPD_ID_TYPE_TPORTGRP 0x05 1996216088Sken#define SVPD_ID_TYPE_LUNGRP 0x06 1997216088Sken#define SVPD_ID_TYPE_MD5_LUN_ID 0x07 1998216088Sken#define SVPD_ID_TYPE_SCSI_NAME 0x08 1999216088Sken#define SVPD_ID_TYPE_MASK 0x0f 2000216088Sken u_int8_t reserved; 2001216088Sken u_int8_t length; 2002225950Sken#define SVPD_DEVICE_ID_DESC_HDR_LEN \ 2003225950Sken __offsetof(struct scsi_vpd_id_descriptor, identifier) 2004225950Sken u_int8_t identifier[]; 2005216088Sken}; 2006216088Sken 2007216088Skenstruct scsi_vpd_id_t10 2008216088Sken{ 2009216088Sken u_int8_t vendor[8]; 2010216088Sken u_int8_t vendor_spec_id[0]; 2011216088Sken}; 2012216088Sken 2013216088Skenstruct scsi_vpd_id_eui64 2014216088Sken{ 2015216088Sken u_int8_t ieee_company_id[3]; 2016216088Sken u_int8_t extension_id[5]; 2017216088Sken}; 2018216088Sken 2019216088Skenstruct scsi_vpd_id_naa_basic 2020216088Sken{ 2021216088Sken uint8_t naa; 2022216088Sken /* big endian, packed: 2023216088Sken uint8_t naa : 4; 2024216088Sken uint8_t naa_desig : 4; 2025216088Sken */ 2026223081Sgibbs#define SVPD_ID_NAA_NAA_SHIFT 4 2027216088Sken#define SVPD_ID_NAA_IEEE_EXT 0x02 2028216088Sken#define SVPD_ID_NAA_LOCAL_REG 0x03 2029216088Sken#define SVPD_ID_NAA_IEEE_REG 0x05 2030216088Sken#define SVPD_ID_NAA_IEEE_REG_EXT 0x06 2031223081Sgibbs uint8_t naa_data[]; 2032216088Sken}; 2033216088Sken 2034216088Skenstruct scsi_vpd_id_naa_ieee_extended_id 2035216088Sken{ 2036216088Sken uint8_t naa; 2037216088Sken uint8_t vendor_specific_id_a; 2038216088Sken uint8_t ieee_company_id[3]; 2039216088Sken uint8_t vendor_specific_id_b[4]; 2040216088Sken}; 2041216088Sken 2042216088Skenstruct scsi_vpd_id_naa_local_reg 2043216088Sken{ 2044216088Sken uint8_t naa; 2045216088Sken uint8_t local_value[7]; 2046216088Sken}; 2047216088Sken 2048216088Skenstruct scsi_vpd_id_naa_ieee_reg 2049216088Sken{ 2050216088Sken uint8_t naa; 2051216088Sken uint8_t reg_value[7]; 2052216088Sken /* big endian, packed: 2053216088Sken uint8_t naa_basic : 4; 2054216088Sken uint8_t ieee_company_id_0 : 4; 2055216088Sken uint8_t ieee_company_id_1[2]; 2056216088Sken uint8_t ieee_company_id_2 : 4; 2057216088Sken uint8_t vendor_specific_id_0 : 4; 2058216088Sken uint8_t vendor_specific_id_1[4]; 2059216088Sken */ 2060216088Sken}; 2061216088Sken 2062216088Skenstruct scsi_vpd_id_naa_ieee_reg_extended 2063216088Sken{ 2064216088Sken uint8_t naa; 2065216088Sken uint8_t reg_value[15]; 2066216088Sken /* big endian, packed: 2067216088Sken uint8_t naa_basic : 4; 2068216088Sken uint8_t ieee_company_id_0 : 4; 2069216088Sken uint8_t ieee_company_id_1[2]; 2070216088Sken uint8_t ieee_company_id_2 : 4; 2071216088Sken uint8_t vendor_specific_id_0 : 4; 2072216088Sken uint8_t vendor_specific_id_1[4]; 2073216088Sken uint8_t vendor_specific_id_ext[8]; 2074216088Sken */ 2075216088Sken}; 2076216088Sken 2077216088Skenstruct scsi_vpd_id_rel_trgt_port_id 2078216088Sken{ 2079216088Sken uint8_t obsolete[2]; 2080216088Sken uint8_t rel_trgt_port_id[2]; 2081216088Sken}; 2082216088Sken 2083216088Skenstruct scsi_vpd_id_trgt_port_grp_id 2084216088Sken{ 2085216088Sken uint8_t reserved[2]; 2086216088Sken uint8_t trgt_port_grp[2]; 2087216088Sken}; 2088216088Sken 2089216088Skenstruct scsi_vpd_id_lun_grp_id 2090216088Sken{ 2091216088Sken uint8_t reserved[2]; 2092216088Sken uint8_t log_unit_grp[2]; 2093216088Sken}; 2094216088Sken 2095216088Skenstruct scsi_vpd_id_md5_lun_id 2096216088Sken{ 2097216088Sken uint8_t lun_id[16]; 2098216088Sken}; 2099216088Sken 2100216088Skenstruct scsi_vpd_id_scsi_name 2101216088Sken{ 2102216088Sken uint8_t name_string[256]; 2103216088Sken}; 2104216088Sken 2105225950Skenstruct scsi_service_action_in 2106225950Sken{ 2107225950Sken uint8_t opcode; 2108225950Sken uint8_t service_action; 2109225950Sken uint8_t action_dependent[13]; 2110225950Sken uint8_t control; 2111225950Sken}; 2112225950Sken 2113235897Smavstruct scsi_diag_page { 2114235897Smav uint8_t page_code; 2115235897Smav uint8_t page_specific_flags; 2116235897Smav uint8_t length[2]; 2117235897Smav uint8_t params[0]; 2118235897Smav}; 2119235897Smav 2120268687Smavstruct scsi_vpd_port_designation 2121268687Smav{ 2122268687Smav uint8_t reserved[2]; 2123268687Smav uint8_t relative_port_id[2]; 2124268687Smav uint8_t reserved2[2]; 2125268687Smav uint8_t initiator_transportid_length[2]; 2126268687Smav uint8_t initiator_transportid[0]; 2127268687Smav}; 2128268687Smav 2129268687Smavstruct scsi_vpd_port_designation_cont 2130268687Smav{ 2131268687Smav uint8_t reserved[2]; 2132268687Smav uint8_t target_port_descriptors_length[2]; 2133268687Smav struct scsi_vpd_id_descriptor target_port_descriptors[0]; 2134268687Smav}; 2135268687Smav 2136268687Smavstruct scsi_vpd_scsi_ports 2137268687Smav{ 2138268687Smav u_int8_t device; 2139268687Smav u_int8_t page_code; 2140268687Smav#define SVPD_SCSI_PORTS 0x88 2141268687Smav u_int8_t page_length[2]; 2142268687Smav struct scsi_vpd_port_designation design[]; 2143268687Smav}; 2144268687Smav 2145249933Ssmh/* 2146250181Ssmh * ATA Information VPD Page based on 2147250181Ssmh * T10/2126-D Revision 04 2148250181Ssmh */ 2149250181Ssmh#define SVPD_ATA_INFORMATION 0x89 2150250181Ssmh 2151269296Smav 2152269296Smavstruct scsi_vpd_tpc_descriptor 2153269296Smav{ 2154269296Smav uint8_t desc_type[2]; 2155269296Smav uint8_t desc_length[2]; 2156269296Smav uint8_t parameters[]; 2157269296Smav}; 2158269296Smav 2159270106Smavstruct scsi_vpd_tpc_descriptor_bdrl 2160270106Smav{ 2161270106Smav uint8_t desc_type[2]; 2162270106Smav#define SVPD_TPC_BDRL 0x0000 2163270106Smav uint8_t desc_length[2]; 2164270106Smav uint8_t vendor_specific[6]; 2165270106Smav uint8_t maximum_ranges[2]; 2166270106Smav uint8_t maximum_inactivity_timeout[4]; 2167270106Smav uint8_t default_inactivity_timeout[4]; 2168270106Smav uint8_t maximum_token_transfer_size[8]; 2169270106Smav uint8_t optimal_transfer_count[8]; 2170270106Smav}; 2171270106Smav 2172269296Smavstruct scsi_vpd_tpc_descriptor_sc_descr 2173269296Smav{ 2174269296Smav uint8_t opcode; 2175269296Smav uint8_t sa_length; 2176269296Smav uint8_t supported_service_actions[0]; 2177269296Smav}; 2178269296Smav 2179269296Smavstruct scsi_vpd_tpc_descriptor_sc 2180269296Smav{ 2181269296Smav uint8_t desc_type[2]; 2182269296Smav#define SVPD_TPC_SC 0x0001 2183269296Smav uint8_t desc_length[2]; 2184269296Smav uint8_t list_length; 2185269296Smav struct scsi_vpd_tpc_descriptor_sc_descr descr[]; 2186269296Smav}; 2187269296Smav 2188269296Smavstruct scsi_vpd_tpc_descriptor_pd 2189269296Smav{ 2190269296Smav uint8_t desc_type[2]; 2191269296Smav#define SVPD_TPC_PD 0x0004 2192269296Smav uint8_t desc_length[2]; 2193269296Smav uint8_t reserved[4]; 2194269296Smav uint8_t maximum_cscd_descriptor_count[2]; 2195269296Smav uint8_t maximum_segment_descriptor_count[2]; 2196269296Smav uint8_t maximum_descriptor_list_length[4]; 2197269296Smav uint8_t maximum_inline_data_length[4]; 2198269296Smav uint8_t reserved2[12]; 2199269296Smav}; 2200269296Smav 2201269296Smavstruct scsi_vpd_tpc_descriptor_sd 2202269296Smav{ 2203269296Smav uint8_t desc_type[2]; 2204269296Smav#define SVPD_TPC_SD 0x0008 2205269296Smav uint8_t desc_length[2]; 2206269296Smav uint8_t list_length; 2207269296Smav uint8_t supported_descriptor_codes[]; 2208269296Smav}; 2209269296Smav 2210269296Smavstruct scsi_vpd_tpc_descriptor_sdid 2211269296Smav{ 2212269296Smav uint8_t desc_type[2]; 2213269296Smav#define SVPD_TPC_SDID 0x000C 2214269296Smav uint8_t desc_length[2]; 2215269296Smav uint8_t list_length[2]; 2216269296Smav uint8_t supported_descriptor_ids[]; 2217269296Smav}; 2218269296Smav 2219270106Smavstruct scsi_vpd_tpc_descriptor_rtf_block 2220270106Smav{ 2221270106Smav uint8_t type_format; 2222270106Smav#define SVPD_TPC_RTF_BLOCK 0x00 2223270106Smav uint8_t reserved; 2224270106Smav uint8_t desc_length[2]; 2225270106Smav uint8_t reserved2[2]; 2226270106Smav uint8_t optimal_length_granularity[2]; 2227270106Smav uint8_t maximum_bytes[8]; 2228270106Smav uint8_t optimal_bytes[8]; 2229270106Smav uint8_t optimal_bytes_to_token_per_segment[8]; 2230270106Smav uint8_t optimal_bytes_from_token_per_segment[8]; 2231270106Smav uint8_t reserved3[8]; 2232270106Smav}; 2233270106Smav 2234270106Smavstruct scsi_vpd_tpc_descriptor_rtf 2235270106Smav{ 2236270106Smav uint8_t desc_type[2]; 2237270106Smav#define SVPD_TPC_RTF 0x0106 2238270106Smav uint8_t desc_length[2]; 2239270106Smav uint8_t remote_tokens; 2240270106Smav uint8_t reserved[11]; 2241270106Smav uint8_t minimum_token_lifetime[4]; 2242270106Smav uint8_t maximum_token_lifetime[4]; 2243270106Smav uint8_t maximum_token_inactivity_timeout[4]; 2244270106Smav uint8_t reserved2[18]; 2245270106Smav uint8_t type_specific_features_length[2]; 2246270106Smav uint8_t type_specific_features[0]; 2247270106Smav}; 2248270106Smav 2249270106Smavstruct scsi_vpd_tpc_descriptor_srtd 2250270106Smav{ 2251270106Smav uint8_t rod_type[4]; 2252270106Smav uint8_t flags; 2253270106Smav#define SVPD_TPC_SRTD_TOUT 0x01 2254270106Smav#define SVPD_TPC_SRTD_TIN 0x02 2255270106Smav#define SVPD_TPC_SRTD_ECPY 0x80 2256270106Smav uint8_t reserved; 2257270106Smav uint8_t preference_indicator[2]; 2258270106Smav uint8_t reserved2[56]; 2259270106Smav}; 2260270106Smav 2261270106Smavstruct scsi_vpd_tpc_descriptor_srt 2262270106Smav{ 2263270106Smav uint8_t desc_type[2]; 2264270106Smav#define SVPD_TPC_SRT 0x0108 2265270106Smav uint8_t desc_length[2]; 2266270106Smav uint8_t reserved[2]; 2267270106Smav uint8_t rod_type_descriptors_length[2]; 2268270106Smav uint8_t rod_type_descriptors[0]; 2269270106Smav}; 2270270106Smav 2271269296Smavstruct scsi_vpd_tpc_descriptor_gco 2272269296Smav{ 2273269296Smav uint8_t desc_type[2]; 2274269296Smav#define SVPD_TPC_GCO 0x8001 2275269296Smav uint8_t desc_length[2]; 2276269296Smav uint8_t total_concurrent_copies[4]; 2277269296Smav uint8_t maximum_identified_concurrent_copies[4]; 2278269296Smav uint8_t maximum_segment_length[4]; 2279269296Smav uint8_t data_segment_granularity; 2280269296Smav uint8_t inline_data_granularity; 2281269296Smav uint8_t reserved[18]; 2282269296Smav}; 2283269296Smav 2284269296Smavstruct scsi_vpd_tpc 2285269296Smav{ 2286269296Smav uint8_t device; 2287269296Smav uint8_t page_code; 2288269296Smav#define SVPD_SCSI_TPC 0x8F 2289269296Smav uint8_t page_length[2]; 2290269296Smav struct scsi_vpd_tpc_descriptor descr[]; 2291269296Smav}; 2292269296Smav 2293250181Ssmh/* 2294249941Ssmh * Block Device Characteristics VPD Page based on 2295249941Ssmh * T10/1799-D Revision 31 2296249941Ssmh */ 2297249941Ssmhstruct scsi_vpd_block_characteristics 2298249941Ssmh{ 2299249941Ssmh u_int8_t device; 2300249941Ssmh u_int8_t page_code; 2301249941Ssmh#define SVPD_BDC 0xB1 2302249941Ssmh u_int8_t page_length[2]; 2303249941Ssmh u_int8_t medium_rotation_rate[2]; 2304249941Ssmh#define SVPD_BDC_RATE_NOT_REPORTED 0x00 2305271238Ssmh#define SVPD_BDC_RATE_NON_ROTATING 0x01 2306249941Ssmh u_int8_t reserved1; 2307249941Ssmh u_int8_t nominal_form_factor; 2308249941Ssmh#define SVPD_BDC_FORM_NOT_REPORTED 0x00 2309249941Ssmh#define SVPD_BDC_FORM_5_25INCH 0x01 2310249941Ssmh#define SVPD_BDC_FORM_3_5INCH 0x02 2311249941Ssmh#define SVPD_BDC_FORM_2_5INCH 0x03 2312249941Ssmh#define SVPD_BDC_FORM_1_5INCH 0x04 2313249941Ssmh#define SVPD_BDC_FORM_LESSTHAN_1_5INCH 0x05 2314249941Ssmh u_int8_t reserved2[56]; 2315249941Ssmh}; 2316249941Ssmh 2317249941Ssmh/* 2318270108Smav * Block Device Characteristics VPD Page 2319270108Smav */ 2320270108Smavstruct scsi_vpd_block_device_characteristics 2321270108Smav{ 2322270108Smav uint8_t device; 2323270108Smav uint8_t page_code; 2324270108Smav#define SVPD_BDC 0xB1 2325270108Smav uint8_t page_length[2]; 2326270108Smav uint8_t medium_rotation_rate[2]; 2327270108Smav#define SVPD_NOT_REPORTED 0x0000 2328270108Smav#define SVPD_NON_ROTATING 0x0001 2329270108Smav uint8_t product_type; 2330270108Smav uint8_t wab_wac_ff; 2331270108Smav uint8_t flags; 2332270108Smav#define SVPD_VBULS 0x01 2333270108Smav#define SVPD_FUAB 0x02 2334270108Smav#define SVPD_HAW_ZBC 0x10 2335270108Smav uint8_t reserved[55]; 2336270108Smav}; 2337270108Smav 2338270108Smav/* 2339249933Ssmh * Logical Block Provisioning VPD Page based on 2340249933Ssmh * T10/1799-D Revision 31 2341249933Ssmh */ 2342249933Ssmhstruct scsi_vpd_logical_block_prov 2343249933Ssmh{ 2344249933Ssmh u_int8_t device; 2345249933Ssmh u_int8_t page_code; 2346249933Ssmh#define SVPD_LBP 0xB2 2347249933Ssmh u_int8_t page_length[2]; 2348249933Ssmh#define SVPD_LBP_PL_BASIC 0x04 2349249933Ssmh u_int8_t threshold_exponent; 2350249933Ssmh u_int8_t flags; 2351249933Ssmh#define SVPD_LBP_UNMAP 0x80 2352249933Ssmh#define SVPD_LBP_WS16 0x40 2353249933Ssmh#define SVPD_LBP_WS10 0x20 2354249933Ssmh#define SVPD_LBP_RZ 0x04 2355249933Ssmh#define SVPD_LBP_ANC_SUP 0x02 2356249933Ssmh#define SVPD_LBP_DP 0x01 2357249933Ssmh u_int8_t prov_type; 2358249933Ssmh#define SVPD_LBP_RESOURCE 0x01 2359249933Ssmh#define SVPD_LBP_THIN 0x02 2360249933Ssmh u_int8_t reserved; 2361249933Ssmh /* 2362249933Ssmh * Provisioning Group Descriptor can be here if SVPD_LBP_DP is set 2363249933Ssmh * Its size can be determined from page_length - 4 2364249933Ssmh */ 2365249933Ssmh}; 2366249933Ssmh 2367249933Ssmh/* 2368249933Ssmh * Block Limits VDP Page based on 2369249933Ssmh * T10/1799-D Revision 31 2370249933Ssmh */ 2371249933Ssmhstruct scsi_vpd_block_limits 2372249933Ssmh{ 2373249933Ssmh u_int8_t device; 2374249933Ssmh u_int8_t page_code; 2375249933Ssmh#define SVPD_BLOCK_LIMITS 0xB0 2376249933Ssmh u_int8_t page_length[2]; 2377249933Ssmh#define SVPD_BL_PL_BASIC 0x10 2378249933Ssmh#define SVPD_BL_PL_TP 0x3C 2379249933Ssmh u_int8_t reserved1; 2380249933Ssmh u_int8_t max_cmp_write_len; 2381249933Ssmh u_int8_t opt_txfer_len_grain[2]; 2382249933Ssmh u_int8_t max_txfer_len[4]; 2383249933Ssmh u_int8_t opt_txfer_len[4]; 2384249933Ssmh u_int8_t max_prefetch[4]; 2385249933Ssmh u_int8_t max_unmap_lba_cnt[4]; 2386249933Ssmh u_int8_t max_unmap_blk_cnt[4]; 2387249933Ssmh u_int8_t opt_unmap_grain[4]; 2388249933Ssmh u_int8_t unmap_grain_align[4]; 2389249933Ssmh u_int8_t max_write_same_length[8]; 2390249933Ssmh u_int8_t reserved2[20]; 2391249933Ssmh}; 2392249933Ssmh 239339213Sgibbsstruct scsi_read_capacity 239439213Sgibbs{ 239539213Sgibbs u_int8_t opcode; 239639213Sgibbs u_int8_t byte2; 2397225950Sken#define SRC_RELADR 0x01 239839213Sgibbs u_int8_t addr[4]; 2399225950Sken u_int8_t unused[2]; 2400225950Sken u_int8_t pmi; 2401225950Sken#define SRC_PMI 0x01 240239213Sgibbs u_int8_t control; 240339213Sgibbs}; 240439213Sgibbs 2405114261Skenstruct scsi_read_capacity_16 2406114261Sken{ 2407114261Sken uint8_t opcode; 2408114261Sken#define SRC16_SERVICE_ACTION 0x10 2409114261Sken uint8_t service_action; 2410114261Sken uint8_t addr[8]; 2411114261Sken uint8_t alloc_len[4]; 2412114261Sken#define SRC16_PMI 0x01 2413114261Sken#define SRC16_RELADR 0x02 2414114261Sken uint8_t reladr; 2415114261Sken uint8_t control; 2416114261Sken}; 2417114261Sken 241839213Sgibbsstruct scsi_read_capacity_data 241939213Sgibbs{ 242039213Sgibbs u_int8_t addr[4]; 242139213Sgibbs u_int8_t length[4]; 242239213Sgibbs}; 242339213Sgibbs 2424114261Skenstruct scsi_read_capacity_data_long 2425114261Sken{ 2426114261Sken uint8_t addr[8]; 2427114261Sken uint8_t length[4]; 2428228846Smav#define SRC16_PROT_EN 0x01 2429228846Smav#define SRC16_P_TYPE 0x0e 2430230590Sken#define SRC16_PTYPE_1 0x00 2431230590Sken#define SRC16_PTYPE_2 0x02 2432230590Sken#define SRC16_PTYPE_3 0x04 2433228846Smav uint8_t prot; 2434228846Smav#define SRC16_LBPPBE 0x0f 2435228846Smav#define SRC16_PI_EXPONENT 0xf0 2436228846Smav#define SRC16_PI_EXPONENT_SHIFT 4 2437228846Smav uint8_t prot_lbppbe; 2438230590Sken#define SRC16_LALBA 0x3f 2439230590Sken#define SRC16_LBPRZ 0x40 2440230590Sken#define SRC16_LBPME 0x80 2441230590Sken/* 2442230590Sken * Alternate versions of these macros that are intended for use on a 16-bit 2443230590Sken * version of the lalba_lbp field instead of the array of 2 8 bit numbers. 2444230590Sken */ 2445230590Sken#define SRC16_LALBA_A 0x3fff 2446230590Sken#define SRC16_LBPRZ_A 0x4000 2447230590Sken#define SRC16_LBPME_A 0x8000 2448228846Smav uint8_t lalba_lbp[2]; 2449230590Sken uint8_t reserved[16]; 2450114261Sken}; 2451114261Sken 245297825Smjacobstruct scsi_report_luns 245397825Smjacob{ 2454161506Sken uint8_t opcode; 2455161506Sken uint8_t reserved1; 2456161506Sken#define RPL_REPORT_DEFAULT 0x00 2457161506Sken#define RPL_REPORT_WELLKNOWN 0x01 2458161506Sken#define RPL_REPORT_ALL 0x02 2459161506Sken uint8_t select_report; 2460161506Sken uint8_t reserved2[3]; 2461161506Sken uint8_t length[4]; 2462161506Sken uint8_t reserved3; 2463161506Sken uint8_t control; 246497825Smjacob}; 246597825Smjacob 2466225950Skenstruct scsi_report_luns_lundata { 2467225950Sken uint8_t lundata[8]; 2468161506Sken#define RPL_LUNDATA_PERIPH_BUS_MASK 0x3f 2469161506Sken#define RPL_LUNDATA_FLAT_LUN_MASK 0x3f 2470225950Sken#define RPL_LUNDATA_FLAT_LUN_BITS 0x06 2471161506Sken#define RPL_LUNDATA_LUN_TARG_MASK 0x3f 2472161506Sken#define RPL_LUNDATA_LUN_BUS_MASK 0xe0 2473161506Sken#define RPL_LUNDATA_LUN_LUN_MASK 0x1f 2474161506Sken#define RPL_LUNDATA_EXT_LEN_MASK 0x30 2475161506Sken#define RPL_LUNDATA_EXT_EAM_MASK 0x0f 2476161506Sken#define RPL_LUNDATA_EXT_EAM_WK 0x01 2477161506Sken#define RPL_LUNDATA_EXT_EAM_NOT_SPEC 0x0f 247897825Smjacob#define RPL_LUNDATA_ATYP_MASK 0xc0 /* MBZ for type 0 lun */ 2479161506Sken#define RPL_LUNDATA_ATYP_PERIPH 0x00 2480161506Sken#define RPL_LUNDATA_ATYP_FLAT 0x40 2481161506Sken#define RPL_LUNDATA_ATYP_LUN 0x80 2482161506Sken#define RPL_LUNDATA_ATYP_EXTLUN 0xc0 2483225950Sken}; 248497825Smjacob 2485225950Skenstruct scsi_report_luns_data { 2486225950Sken u_int8_t length[4]; /* length of LUN inventory, in bytes */ 2487225950Sken u_int8_t reserved[4]; /* unused */ 2488225950Sken /* 2489225950Sken * LUN inventory- we only support the type zero form for now. 2490225950Sken */ 2491225950Sken struct scsi_report_luns_lundata luns[0]; 2492225950Sken}; 2493225950Sken 2494208905Smjacobstruct scsi_target_group 2495208905Smjacob{ 2496208905Smjacob uint8_t opcode; 2497208905Smjacob uint8_t service_action; 2498268687Smav#define STG_PDF_MASK 0xe0 2499208905Smjacob#define STG_PDF_LENGTH 0x00 2500268687Smav#define STG_PDF_EXTENDED 0x20 2501208918Smjacob uint8_t reserved1[4]; 2502208905Smjacob uint8_t length[4]; 2503208905Smjacob uint8_t reserved2; 2504208905Smjacob uint8_t control; 2505208905Smjacob}; 250697825Smjacob 2507208905Smjacobstruct scsi_target_port_descriptor { 2508208905Smjacob uint8_t reserved[2]; 2509208905Smjacob uint8_t relative_target_port_identifier[2]; 2510209188Sken uint8_t desc_list[]; 2511208905Smjacob}; 2512208905Smjacob 2513208905Smjacobstruct scsi_target_port_group_descriptor { 2514208905Smjacob uint8_t pref_state; 2515208905Smjacob#define TPG_PRIMARY 0x80 2516208905Smjacob#define TPG_ASYMMETRIC_ACCESS_STATE_MASK 0xf 2517208905Smjacob#define TPG_ASYMMETRIC_ACCESS_OPTIMIZED 0x0 2518208905Smjacob#define TPG_ASYMMETRIC_ACCESS_NONOPTIMIZED 0x1 2519208905Smjacob#define TPG_ASYMMETRIC_ACCESS_STANDBY 0x2 2520208905Smjacob#define TPG_ASYMMETRIC_ACCESS_UNAVAILABLE 0x3 2521208905Smjacob#define TPG_ASYMMETRIC_ACCESS_LBA_DEPENDENT 0x4 2522208905Smjacob#define TPG_ASYMMETRIC_ACCESS_OFFLINE 0xE 2523208905Smjacob#define TPG_ASYMMETRIC_ACCESS_TRANSITIONING 0xF 2524208905Smjacob uint8_t support; 2525208905Smjacob#define TPG_AO_SUP 0x01 2526208905Smjacob#define TPG_AN_SUP 0x02 2527208905Smjacob#define TPG_S_SUP 0x04 2528208905Smjacob#define TPG_U_SUP 0x08 2529208905Smjacob#define TPG_LBD_SUP 0x10 2530208905Smjacob#define TPG_O_SUP 0x40 2531208905Smjacob#define TPG_T_SUP 0x80 2532208905Smjacob uint8_t target_port_group[2]; 2533208905Smjacob uint8_t reserved; 2534208905Smjacob uint8_t status; 2535225950Sken#define TPG_UNAVLBL 0 2536225950Sken#define TPG_SET_BY_STPG 0x01 2537225950Sken#define TPG_IMPLICIT 0x02 2538208905Smjacob uint8_t vendor_specific; 2539208905Smjacob uint8_t target_port_count; 2540209188Sken struct scsi_target_port_descriptor descriptors[]; 2541208905Smjacob}; 2542208905Smjacob 2543208905Smjacobstruct scsi_target_group_data { 2544208905Smjacob uint8_t length[4]; /* length of returned data, in bytes */ 2545209188Sken struct scsi_target_port_group_descriptor groups[]; 2546208905Smjacob}; 2547208905Smjacob 2548208905Smjacobstruct scsi_target_group_data_extended { 2549208905Smjacob uint8_t length[4]; /* length of returned data, in bytes */ 2550268687Smav uint8_t format_type; /* STG_PDF_LENGTH or STG_PDF_EXTENDED */ 2551208905Smjacob uint8_t implicit_transition_time; 2552208905Smjacob uint8_t reserved[2]; 2553209188Sken struct scsi_target_port_group_descriptor groups[]; 2554208905Smjacob}; 2555208905Smjacob 2556208905Smjacob 2557225950Skentypedef enum { 2558225950Sken SSD_TYPE_NONE, 2559225950Sken SSD_TYPE_FIXED, 2560225950Sken SSD_TYPE_DESC 2561225950Sken} scsi_sense_data_type; 2562225950Sken 2563225950Skentypedef enum { 2564225950Sken SSD_ELEM_NONE, 2565225950Sken SSD_ELEM_SKIP, 2566225950Sken SSD_ELEM_DESC, 2567225950Sken SSD_ELEM_SKS, 2568225950Sken SSD_ELEM_COMMAND, 2569225950Sken SSD_ELEM_INFO, 2570225950Sken SSD_ELEM_FRU, 2571225950Sken SSD_ELEM_STREAM, 2572225950Sken SSD_ELEM_MAX 2573225950Sken} scsi_sense_elem_type; 2574225950Sken 2575225950Sken 257639213Sgibbsstruct scsi_sense_data 257739213Sgibbs{ 2578225950Sken uint8_t error_code; 2579225950Sken /* 2580225950Sken * SPC-4 says that the maximum length of sense data is 252 bytes. 2581225950Sken * So this structure is exactly 252 bytes log. 2582225950Sken */ 2583225950Sken#define SSD_FULL_SIZE 252 2584225950Sken uint8_t sense_buf[SSD_FULL_SIZE - 1]; 2585225950Sken /* 2586225950Sken * XXX KDM is this still a reasonable minimum size? 2587225950Sken */ 2588225950Sken#define SSD_MIN_SIZE 18 2589225950Sken /* 2590225950Sken * Maximum value for the extra_len field in the sense data. 2591225950Sken */ 2592225950Sken#define SSD_EXTRA_MAX 244 2593225950Sken}; 2594225950Sken 2595225950Sken/* 2596225950Sken * Fixed format sense data. 2597225950Sken */ 2598225950Skenstruct scsi_sense_data_fixed 2599225950Sken{ 260039213Sgibbs u_int8_t error_code; 260139213Sgibbs#define SSD_ERRCODE 0x7F 260239213Sgibbs#define SSD_CURRENT_ERROR 0x70 260339213Sgibbs#define SSD_DEFERRED_ERROR 0x71 260439213Sgibbs#define SSD_ERRCODE_VALID 0x80 260539213Sgibbs u_int8_t segment; 260639213Sgibbs u_int8_t flags; 260739213Sgibbs#define SSD_KEY 0x0F 260839213Sgibbs#define SSD_KEY_NO_SENSE 0x00 260939213Sgibbs#define SSD_KEY_RECOVERED_ERROR 0x01 261039213Sgibbs#define SSD_KEY_NOT_READY 0x02 261139213Sgibbs#define SSD_KEY_MEDIUM_ERROR 0x03 261239213Sgibbs#define SSD_KEY_HARDWARE_ERROR 0x04 261339213Sgibbs#define SSD_KEY_ILLEGAL_REQUEST 0x05 261439213Sgibbs#define SSD_KEY_UNIT_ATTENTION 0x06 261539213Sgibbs#define SSD_KEY_DATA_PROTECT 0x07 261639213Sgibbs#define SSD_KEY_BLANK_CHECK 0x08 261739213Sgibbs#define SSD_KEY_Vendor_Specific 0x09 261839213Sgibbs#define SSD_KEY_COPY_ABORTED 0x0a 261939213Sgibbs#define SSD_KEY_ABORTED_COMMAND 0x0b 262039213Sgibbs#define SSD_KEY_EQUAL 0x0c 262139213Sgibbs#define SSD_KEY_VOLUME_OVERFLOW 0x0d 262239213Sgibbs#define SSD_KEY_MISCOMPARE 0x0e 2623225950Sken#define SSD_KEY_COMPLETED 0x0f 262439213Sgibbs#define SSD_ILI 0x20 262539213Sgibbs#define SSD_EOM 0x40 262639213Sgibbs#define SSD_FILEMARK 0x80 262739213Sgibbs u_int8_t info[4]; 262839213Sgibbs u_int8_t extra_len; 262939213Sgibbs u_int8_t cmd_spec_info[4]; 263039213Sgibbs u_int8_t add_sense_code; 263139213Sgibbs u_int8_t add_sense_code_qual; 263239213Sgibbs u_int8_t fru; 263339213Sgibbs u_int8_t sense_key_spec[3]; 263439213Sgibbs#define SSD_SCS_VALID 0x80 2635208905Smjacob#define SSD_FIELDPTR_CMD 0x40 2636208905Smjacob#define SSD_BITPTR_VALID 0x08 2637208905Smjacob#define SSD_BITPTR_VALUE 0x07 263839213Sgibbs u_int8_t extra_bytes[14]; 2639225950Sken#define SSD_FIXED_IS_PRESENT(sense, length, field) \ 2640225950Sken ((length >= (offsetof(struct scsi_sense_data_fixed, field) + \ 2641225950Sken sizeof(sense->field))) ? 1 :0) 2642225950Sken#define SSD_FIXED_IS_FILLED(sense, field) \ 2643225950Sken ((((offsetof(struct scsi_sense_data_fixed, field) + \ 2644225950Sken sizeof(sense->field)) - \ 2645225950Sken (offsetof(struct scsi_sense_data_fixed, extra_len) + \ 2646225950Sken sizeof(sense->extra_len))) <= sense->extra_len) ? 1 : 0) 264739213Sgibbs}; 264839213Sgibbs 2649225950Sken/* 2650225950Sken * Descriptor format sense data definitions. 2651225950Sken * Introduced in SPC-3. 2652225950Sken */ 2653225950Skenstruct scsi_sense_data_desc 2654225950Sken{ 2655225950Sken uint8_t error_code; 2656225950Sken#define SSD_DESC_CURRENT_ERROR 0x72 2657225950Sken#define SSD_DESC_DEFERRED_ERROR 0x73 2658225950Sken uint8_t sense_key; 2659225950Sken uint8_t add_sense_code; 2660225950Sken uint8_t add_sense_code_qual; 2661225950Sken uint8_t reserved[3]; 2662225950Sken /* 2663225950Sken * Note that SPC-4, section 4.5.2.1 says that the extra_len field 2664225950Sken * must be less than or equal to 244. 2665225950Sken */ 2666225950Sken uint8_t extra_len; 2667225950Sken uint8_t sense_desc[0]; 2668225950Sken#define SSD_DESC_IS_PRESENT(sense, length, field) \ 2669225950Sken ((length >= (offsetof(struct scsi_sense_data_desc, field) + \ 2670225950Sken sizeof(sense->field))) ? 1 :0) 2671225950Sken}; 2672225950Sken 2673225950Skenstruct scsi_sense_desc_header 2674225950Sken{ 2675225950Sken uint8_t desc_type; 2676225950Sken uint8_t length; 2677225950Sken}; 2678225950Sken/* 2679225950Sken * The information provide in the Information descriptor is device type or 2680225950Sken * command specific information, and defined in a command standard. 2681225950Sken * 2682225950Sken * Note that any changes to the field names or positions in this structure, 2683225950Sken * even reserved fields, should be accompanied by an examination of the 2684225950Sken * code in ctl_set_sense() that uses them. 2685225950Sken * 2686225950Sken * Maximum descriptors allowed: 1 (as of SPC-4) 2687225950Sken */ 2688225950Skenstruct scsi_sense_info 2689225950Sken{ 2690225950Sken uint8_t desc_type; 2691225950Sken#define SSD_DESC_INFO 0x00 2692225950Sken uint8_t length; 2693225950Sken uint8_t byte2; 2694225950Sken#define SSD_INFO_VALID 0x80 2695225950Sken uint8_t reserved; 2696225950Sken uint8_t info[8]; 2697225950Sken}; 2698225950Sken 2699225950Sken/* 2700225950Sken * Command-specific information depends on the command for which the 2701225950Sken * reported condition occured. 2702225950Sken * 2703225950Sken * Note that any changes to the field names or positions in this structure, 2704225950Sken * even reserved fields, should be accompanied by an examination of the 2705225950Sken * code in ctl_set_sense() that uses them. 2706225950Sken * 2707225950Sken * Maximum descriptors allowed: 1 (as of SPC-4) 2708225950Sken */ 2709225950Skenstruct scsi_sense_command 2710225950Sken{ 2711225950Sken uint8_t desc_type; 2712225950Sken#define SSD_DESC_COMMAND 0x01 2713225950Sken uint8_t length; 2714225950Sken uint8_t reserved[2]; 2715225950Sken uint8_t command_info[8]; 2716225950Sken}; 2717225950Sken 2718225950Sken/* 2719225950Sken * Sense key specific descriptor. The sense key specific data format 2720225950Sken * depends on the sense key in question. 2721225950Sken * 2722225950Sken * Maximum descriptors allowed: 1 (as of SPC-4) 2723225950Sken */ 2724225950Skenstruct scsi_sense_sks 2725225950Sken{ 2726225950Sken uint8_t desc_type; 2727225950Sken#define SSD_DESC_SKS 0x02 2728225950Sken uint8_t length; 2729225950Sken uint8_t reserved1[2]; 2730225950Sken uint8_t sense_key_spec[3]; 2731225950Sken#define SSD_SKS_VALID 0x80 2732225950Sken uint8_t reserved2; 2733225950Sken}; 2734225950Sken 2735225950Sken/* 2736225950Sken * This is used for the Illegal Request sense key (0x05) only. 2737225950Sken */ 2738225950Skenstruct scsi_sense_sks_field 2739225950Sken{ 2740225950Sken uint8_t byte0; 2741225950Sken#define SSD_SKS_FIELD_VALID 0x80 2742225950Sken#define SSD_SKS_FIELD_CMD 0x40 2743225950Sken#define SSD_SKS_BPV 0x08 2744225950Sken#define SSD_SKS_BIT_VALUE 0x07 2745225950Sken uint8_t field[2]; 2746225950Sken}; 2747225950Sken 2748225950Sken 2749225950Sken/* 2750225950Sken * This is used for the Hardware Error (0x04), Medium Error (0x03) and 2751225950Sken * Recovered Error (0x01) sense keys. 2752225950Sken */ 2753225950Skenstruct scsi_sense_sks_retry 2754225950Sken{ 2755225950Sken uint8_t byte0; 2756225950Sken#define SSD_SKS_RETRY_VALID 0x80 2757225950Sken uint8_t actual_retry_count[2]; 2758225950Sken}; 2759225950Sken 2760225950Sken/* 2761225950Sken * Used with the NO Sense (0x00) or Not Ready (0x02) sense keys. 2762225950Sken */ 2763225950Skenstruct scsi_sense_sks_progress 2764225950Sken{ 2765225950Sken uint8_t byte0; 2766225950Sken#define SSD_SKS_PROGRESS_VALID 0x80 2767225950Sken uint8_t progress[2]; 2768225950Sken#define SSD_SKS_PROGRESS_DENOM 0x10000 2769225950Sken}; 2770225950Sken 2771225950Sken/* 2772225950Sken * Used with the Copy Aborted (0x0a) sense key. 2773225950Sken */ 2774225950Skenstruct scsi_sense_sks_segment 2775225950Sken{ 2776225950Sken uint8_t byte0; 2777225950Sken#define SSD_SKS_SEGMENT_VALID 0x80 2778225950Sken#define SSD_SKS_SEGMENT_SD 0x20 2779225950Sken#define SSD_SKS_SEGMENT_BPV 0x08 2780225950Sken#define SSD_SKS_SEGMENT_BITPTR 0x07 2781225950Sken uint8_t field[2]; 2782225950Sken}; 2783225950Sken 2784225950Sken/* 2785225950Sken * Used with the Unit Attention (0x06) sense key. 2786225950Sken * 2787225950Sken * This is currently used to indicate that the unit attention condition 2788225950Sken * queue has overflowed (when the overflow bit is set). 2789225950Sken */ 2790225950Skenstruct scsi_sense_sks_overflow 2791225950Sken{ 2792225950Sken uint8_t byte0; 2793225950Sken#define SSD_SKS_OVERFLOW_VALID 0x80 2794225950Sken#define SSD_SKS_OVERFLOW_SET 0x01 2795225950Sken uint8_t reserved[2]; 2796225950Sken}; 2797225950Sken 2798225950Sken/* 2799225950Sken * This specifies which component is associated with the sense data. There 2800225950Sken * is no standard meaning for the fru value. 2801225950Sken * 2802225950Sken * Maximum descriptors allowed: 1 (as of SPC-4) 2803225950Sken */ 2804225950Skenstruct scsi_sense_fru 2805225950Sken{ 2806225950Sken uint8_t desc_type; 2807225950Sken#define SSD_DESC_FRU 0x03 2808225950Sken uint8_t length; 2809225950Sken uint8_t reserved; 2810225950Sken uint8_t fru; 2811225950Sken}; 2812225950Sken 2813225950Sken/* 2814225950Sken * Used for Stream commands, defined in SSC-4. 2815225950Sken * 2816225950Sken * Maximum descriptors allowed: 1 (as of SPC-4) 2817225950Sken */ 2818225950Sken 2819225950Skenstruct scsi_sense_stream 2820225950Sken{ 2821225950Sken uint8_t desc_type; 2822225950Sken#define SSD_DESC_STREAM 0x04 2823225950Sken uint8_t length; 2824225950Sken uint8_t reserved; 2825225950Sken uint8_t byte3; 2826225950Sken#define SSD_DESC_STREAM_FM 0x80 2827225950Sken#define SSD_DESC_STREAM_EOM 0x40 2828225950Sken#define SSD_DESC_STREAM_ILI 0x20 2829225950Sken}; 2830225950Sken 2831225950Sken/* 2832225950Sken * Used for Block commands, defined in SBC-3. 2833225950Sken * 2834225950Sken * This is currently (as of SBC-3) only used for the Incorrect Length 2835225950Sken * Indication (ILI) bit, which says that the data length requested in the 2836225950Sken * READ LONG or WRITE LONG command did not match the length of the logical 2837225950Sken * block. 2838225950Sken * 2839225950Sken * Maximum descriptors allowed: 1 (as of SPC-4) 2840225950Sken */ 2841225950Skenstruct scsi_sense_block 2842225950Sken{ 2843225950Sken uint8_t desc_type; 2844225950Sken#define SSD_DESC_BLOCK 0x05 2845225950Sken uint8_t length; 2846225950Sken uint8_t reserved; 2847225950Sken uint8_t byte3; 2848225950Sken#define SSD_DESC_BLOCK_ILI 0x20 2849225950Sken}; 2850225950Sken 2851225950Sken/* 2852225950Sken * Used for Object-Based Storage Devices (OSD-3). 2853225950Sken * 2854225950Sken * Maximum descriptors allowed: 1 (as of SPC-4) 2855225950Sken */ 2856225950Skenstruct scsi_sense_osd_objid 2857225950Sken{ 2858225950Sken uint8_t desc_type; 2859225950Sken#define SSD_DESC_OSD_OBJID 0x06 2860225950Sken uint8_t length; 2861225950Sken uint8_t reserved[6]; 2862225950Sken /* 2863225950Sken * XXX KDM provide the bit definitions here? There are a lot of 2864225950Sken * them, and we don't have an OSD driver yet. 2865225950Sken */ 2866225950Sken uint8_t not_init_cmds[4]; 2867225950Sken uint8_t completed_cmds[4]; 2868225950Sken uint8_t partition_id[8]; 2869225950Sken uint8_t object_id[8]; 2870225950Sken}; 2871225950Sken 2872225950Sken/* 2873225950Sken * Used for Object-Based Storage Devices (OSD-3). 2874225950Sken * 2875225950Sken * Maximum descriptors allowed: 1 (as of SPC-4) 2876225950Sken */ 2877225950Skenstruct scsi_sense_osd_integrity 2878225950Sken{ 2879225950Sken uint8_t desc_type; 2880225950Sken#define SSD_DESC_OSD_INTEGRITY 0x07 2881225950Sken uint8_t length; 2882225950Sken uint8_t integ_check_val[32]; 2883225950Sken}; 2884225950Sken 2885225950Sken/* 2886225950Sken * Used for Object-Based Storage Devices (OSD-3). 2887225950Sken * 2888225950Sken * Maximum descriptors allowed: 1 (as of SPC-4) 2889225950Sken */ 2890225950Skenstruct scsi_sense_osd_attr_id 2891225950Sken{ 2892225950Sken uint8_t desc_type; 2893225950Sken#define SSD_DESC_OSD_ATTR_ID 0x08 2894225950Sken uint8_t length; 2895225950Sken uint8_t reserved[2]; 2896225950Sken uint8_t attr_desc[0]; 2897225950Sken}; 2898225950Sken 2899225950Sken/* 2900225950Sken * Used with Sense keys No Sense (0x00) and Not Ready (0x02). 2901225950Sken * 2902225950Sken * Maximum descriptors allowed: 32 (as of SPC-4) 2903225950Sken */ 2904225950Skenstruct scsi_sense_progress 2905225950Sken{ 2906225950Sken uint8_t desc_type; 2907225950Sken#define SSD_DESC_PROGRESS 0x0a 2908225950Sken uint8_t length; 2909225950Sken uint8_t sense_key; 2910225950Sken uint8_t add_sense_code; 2911225950Sken uint8_t add_sense_code_qual; 2912225950Sken uint8_t reserved; 2913225950Sken uint8_t progress[2]; 2914225950Sken}; 2915225950Sken 2916225950Sken/* 2917225950Sken * This is typically forwarded as the result of an EXTENDED COPY command. 2918225950Sken * 2919225950Sken * Maximum descriptors allowed: 2 (as of SPC-4) 2920225950Sken */ 2921225950Skenstruct scsi_sense_forwarded 2922225950Sken{ 2923225950Sken uint8_t desc_type; 2924225950Sken#define SSD_DESC_FORWARDED 0x0c 2925225950Sken uint8_t length; 2926225950Sken uint8_t byte2; 2927225950Sken#define SSD_FORWARDED_FSDT 0x80 2928225950Sken#define SSD_FORWARDED_SDS_MASK 0x0f 2929225950Sken#define SSD_FORWARDED_SDS_UNK 0x00 2930225950Sken#define SSD_FORWARDED_SDS_EXSRC 0x01 2931225950Sken#define SSD_FORWARDED_SDS_EXDST 0x02 2932225950Sken}; 2933225950Sken 2934225950Sken/* 2935225950Sken * Vendor-specific sense descriptor. The desc_type field will be in the 2936225950Sken * range bewteen MIN and MAX inclusive. 2937225950Sken */ 2938225950Skenstruct scsi_sense_vendor 2939225950Sken{ 2940225950Sken uint8_t desc_type; 2941225950Sken#define SSD_DESC_VENDOR_MIN 0x80 2942225950Sken#define SSD_DESC_VENDOR_MAX 0xff 2943225950Sken uint8_t length; 2944225950Sken uint8_t data[0]; 2945225950Sken}; 2946225950Sken 294739213Sgibbsstruct scsi_mode_header_6 294839213Sgibbs{ 294939213Sgibbs u_int8_t data_length; /* Sense data length */ 295039213Sgibbs u_int8_t medium_type; 295139213Sgibbs u_int8_t dev_spec; 295239213Sgibbs u_int8_t blk_desc_len; 295339213Sgibbs}; 295439213Sgibbs 295539213Sgibbsstruct scsi_mode_header_10 295639213Sgibbs{ 295739213Sgibbs u_int8_t data_length[2];/* Sense data length */ 295839213Sgibbs u_int8_t medium_type; 295939213Sgibbs u_int8_t dev_spec; 296039213Sgibbs u_int8_t unused[2]; 296139213Sgibbs u_int8_t blk_desc_len[2]; 296239213Sgibbs}; 296339213Sgibbs 296464382Skbyancstruct scsi_mode_page_header 296539213Sgibbs{ 296664382Skbyanc u_int8_t page_code; 2967225950Sken#define SMPH_PS 0x80 2968225950Sken#define SMPH_SPF 0x40 2969225950Sken#define SMPH_PC_MASK 0x3f 297064382Skbyanc u_int8_t page_length; 297164382Skbyanc}; 297264382Skbyanc 2973225950Skenstruct scsi_mode_page_header_sp 2974225950Sken{ 2975225950Sken uint8_t page_code; 2976225950Sken uint8_t subpage; 2977225950Sken uint8_t page_length[2]; 2978225950Sken}; 2979225950Sken 2980225950Sken 298164382Skbyancstruct scsi_mode_blk_desc 298264382Skbyanc{ 298339213Sgibbs u_int8_t density; 298439213Sgibbs u_int8_t nblocks[3]; 298539213Sgibbs u_int8_t reserved; 298639213Sgibbs u_int8_t blklen[3]; 298739213Sgibbs}; 298839213Sgibbs 298941542Smjacob#define SCSI_DEFAULT_DENSITY 0x00 /* use 'default' density */ 299041542Smjacob#define SCSI_SAME_DENSITY 0x7f /* use 'same' density- >= SCSI-2 only */ 299197825Smjacob 299297825Smjacob 299339213Sgibbs/* 299439213Sgibbs * Status Byte 299539213Sgibbs */ 299639213Sgibbs#define SCSI_STATUS_OK 0x00 299739213Sgibbs#define SCSI_STATUS_CHECK_COND 0x02 299839213Sgibbs#define SCSI_STATUS_COND_MET 0x04 299939213Sgibbs#define SCSI_STATUS_BUSY 0x08 3000208905Smjacob#define SCSI_STATUS_INTERMED 0x10 3001208905Smjacob#define SCSI_STATUS_INTERMED_COND_MET 0x14 3002208905Smjacob#define SCSI_STATUS_RESERV_CONFLICT 0x18 3003208905Smjacob#define SCSI_STATUS_CMD_TERMINATED 0x22 /* Obsolete in SAM-2 */ 3004208905Smjacob#define SCSI_STATUS_QUEUE_FULL 0x28 3005208905Smjacob#define SCSI_STATUS_ACA_ACTIVE 0x30 3006208905Smjacob#define SCSI_STATUS_TASK_ABORTED 0x40 300739213Sgibbs 300839213Sgibbsstruct scsi_inquiry_pattern { 300939213Sgibbs u_int8_t type; 301039213Sgibbs u_int8_t media_type; 301139213Sgibbs#define SIP_MEDIA_REMOVABLE 0x01 301239213Sgibbs#define SIP_MEDIA_FIXED 0x02 301339213Sgibbs const char *vendor; 301439213Sgibbs const char *product; 301539213Sgibbs const char *revision; 301639213Sgibbs}; 301739213Sgibbs 301839213Sgibbsstruct scsi_static_inquiry_pattern { 301939213Sgibbs u_int8_t type; 302039213Sgibbs u_int8_t media_type; 302139213Sgibbs char vendor[SID_VENDOR_SIZE+1]; 302239213Sgibbs char product[SID_PRODUCT_SIZE+1]; 302339213Sgibbs char revision[SID_REVISION_SIZE+1]; 302439213Sgibbs}; 302539213Sgibbs 302639213Sgibbsstruct scsi_sense_quirk_entry { 302739213Sgibbs struct scsi_inquiry_pattern inq_pat; 302874840Sken int num_sense_keys; 302939213Sgibbs int num_ascs; 303074840Sken struct sense_key_table_entry *sense_key_info; 303139213Sgibbs struct asc_table_entry *asc_info; 303239213Sgibbs}; 303339213Sgibbs 303474840Skenstruct sense_key_table_entry { 303574840Sken u_int8_t sense_key; 303674840Sken u_int32_t action; 303774840Sken const char *desc; 303874840Sken}; 303974840Sken 304039213Sgibbsstruct asc_table_entry { 304139213Sgibbs u_int8_t asc; 304239213Sgibbs u_int8_t ascq; 304339213Sgibbs u_int32_t action; 304439213Sgibbs const char *desc; 304539213Sgibbs}; 304639213Sgibbs 304739213Sgibbsstruct op_table_entry { 304839213Sgibbs u_int8_t opcode; 3049181381Sjkim u_int32_t opmask; 305039213Sgibbs const char *desc; 305139213Sgibbs}; 305239213Sgibbs 305339213Sgibbsstruct scsi_op_quirk_entry { 305439213Sgibbs struct scsi_inquiry_pattern inq_pat; 305539213Sgibbs int num_ops; 305639213Sgibbs struct op_table_entry *op_table; 305739213Sgibbs}; 305839213Sgibbs 305974840Skentypedef enum { 306074840Sken SSS_FLAG_NONE = 0x00, 306174840Sken SSS_FLAG_PRINT_COMMAND = 0x01 306274840Sken} scsi_sense_string_flags; 306339213Sgibbs 3064268700Smavstruct scsi_nv { 3065268700Smav const char *name; 3066268700Smav uint64_t value; 3067268700Smav}; 3068268700Smav 3069268700Smavtypedef enum { 3070268700Smav SCSI_NV_FOUND, 3071268700Smav SCSI_NV_AMBIGUOUS, 3072268700Smav SCSI_NV_NOT_FOUND 3073268700Smav} scsi_nv_status; 3074268700Smav 3075268700Smavtypedef enum { 3076268700Smav SCSI_NV_FLAG_NONE = 0x00, 3077268700Smav SCSI_NV_FLAG_IG_CASE = 0x01 /* Case insensitive comparison */ 3078268700Smav} scsi_nv_flags; 3079268700Smav 308039213Sgibbsstruct ccb_scsiio; 308139213Sgibbsstruct cam_periph; 308239213Sgibbsunion ccb; 308355205Speter#ifndef _KERNEL 308439213Sgibbsstruct cam_device; 308539213Sgibbs#endif 308639213Sgibbs 308739213Sgibbsextern const char *scsi_sense_key_text[]; 308839213Sgibbs 308974840Skenstruct sbuf; 309074840Sken 309139213Sgibbs__BEGIN_DECLS 309274840Skenvoid scsi_sense_desc(int sense_key, int asc, int ascq, 309374840Sken struct scsi_inquiry_data *inq_data, 309474840Sken const char **sense_key_desc, const char **asc_desc); 309574840Skenscsi_sense_action scsi_error_action(struct ccb_scsiio* csio, 309674840Sken struct scsi_inquiry_data *inq_data, 309774840Sken u_int32_t sense_flags); 309874840Skenconst char * scsi_status_string(struct ccb_scsiio *csio); 3099225950Sken 3100225950Skenvoid scsi_desc_iterate(struct scsi_sense_data_desc *sense, u_int sense_len, 3101225950Sken int (*iter_func)(struct scsi_sense_data_desc *sense, 3102225950Sken u_int, struct scsi_sense_desc_header *, 3103225950Sken void *), void *arg); 3104225950Skenuint8_t *scsi_find_desc(struct scsi_sense_data_desc *sense, u_int sense_len, 3105225950Sken uint8_t desc_type); 3106225950Skenvoid scsi_set_sense_data(struct scsi_sense_data *sense_data, 3107225950Sken scsi_sense_data_type sense_format, int current_error, 3108225950Sken int sense_key, int asc, int ascq, ...) ; 3109225950Skenvoid scsi_set_sense_data_va(struct scsi_sense_data *sense_data, 3110225950Sken scsi_sense_data_type sense_format, 3111225950Sken int current_error, int sense_key, int asc, 3112225950Sken int ascq, va_list ap); 3113225950Skenint scsi_get_sense_info(struct scsi_sense_data *sense_data, u_int sense_len, 3114225950Sken uint8_t info_type, uint64_t *info, 3115225950Sken int64_t *signed_info); 3116225950Skenint scsi_get_sks(struct scsi_sense_data *sense_data, u_int sense_len, 3117225950Sken uint8_t *sks); 3118225950Skenint scsi_get_block_info(struct scsi_sense_data *sense_data, u_int sense_len, 3119225950Sken struct scsi_inquiry_data *inq_data, 3120225950Sken uint8_t *block_bits); 3121225950Skenint scsi_get_stream_info(struct scsi_sense_data *sense_data, u_int sense_len, 3122225950Sken struct scsi_inquiry_data *inq_data, 3123225950Sken uint8_t *stream_bits); 3124225950Skenvoid scsi_info_sbuf(struct sbuf *sb, uint8_t *cdb, int cdb_len, 3125225950Sken struct scsi_inquiry_data *inq_data, uint64_t info); 3126225950Skenvoid scsi_command_sbuf(struct sbuf *sb, uint8_t *cdb, int cdb_len, 3127225950Sken struct scsi_inquiry_data *inq_data, uint64_t csi); 3128225950Skenvoid scsi_progress_sbuf(struct sbuf *sb, uint16_t progress); 3129225950Skenint scsi_sks_sbuf(struct sbuf *sb, int sense_key, uint8_t *sks); 3130225950Skenvoid scsi_fru_sbuf(struct sbuf *sb, uint64_t fru); 3131225950Skenvoid scsi_stream_sbuf(struct sbuf *sb, uint8_t stream_bits, uint64_t info); 3132225950Skenvoid scsi_block_sbuf(struct sbuf *sb, uint8_t block_bits, uint64_t info); 3133225950Skenvoid scsi_sense_info_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, 3134225950Sken u_int sense_len, uint8_t *cdb, int cdb_len, 3135225950Sken struct scsi_inquiry_data *inq_data, 3136225950Sken struct scsi_sense_desc_header *header); 3137225950Sken 3138225950Skenvoid scsi_sense_command_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, 3139225950Sken u_int sense_len, uint8_t *cdb, int cdb_len, 3140225950Sken struct scsi_inquiry_data *inq_data, 3141225950Sken struct scsi_sense_desc_header *header); 3142225950Skenvoid scsi_sense_sks_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, 3143225950Sken u_int sense_len, uint8_t *cdb, int cdb_len, 3144225950Sken struct scsi_inquiry_data *inq_data, 3145225950Sken struct scsi_sense_desc_header *header); 3146225950Skenvoid scsi_sense_fru_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, 3147225950Sken u_int sense_len, uint8_t *cdb, int cdb_len, 3148225950Sken struct scsi_inquiry_data *inq_data, 3149225950Sken struct scsi_sense_desc_header *header); 3150225950Skenvoid scsi_sense_stream_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, 3151225950Sken u_int sense_len, uint8_t *cdb, int cdb_len, 3152225950Sken struct scsi_inquiry_data *inq_data, 3153225950Sken struct scsi_sense_desc_header *header); 3154225950Skenvoid scsi_sense_block_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, 3155225950Sken u_int sense_len, uint8_t *cdb, int cdb_len, 3156225950Sken struct scsi_inquiry_data *inq_data, 3157225950Sken struct scsi_sense_desc_header *header); 3158225950Skenvoid scsi_sense_progress_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, 3159225950Sken u_int sense_len, uint8_t *cdb, int cdb_len, 3160225950Sken struct scsi_inquiry_data *inq_data, 3161225950Sken struct scsi_sense_desc_header *header); 3162225950Skenvoid scsi_sense_generic_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, 3163225950Sken u_int sense_len, uint8_t *cdb, int cdb_len, 3164225950Sken struct scsi_inquiry_data *inq_data, 3165225950Sken struct scsi_sense_desc_header *header); 3166225950Skenvoid scsi_sense_desc_sbuf(struct sbuf *sb, struct scsi_sense_data *sense, 3167225950Sken u_int sense_len, uint8_t *cdb, int cdb_len, 3168225950Sken struct scsi_inquiry_data *inq_data, 3169225950Sken struct scsi_sense_desc_header *header); 3170225950Skenscsi_sense_data_type scsi_sense_type(struct scsi_sense_data *sense_data); 3171225950Sken 3172225950Skenvoid scsi_sense_only_sbuf(struct scsi_sense_data *sense, u_int sense_len, 3173225950Sken struct sbuf *sb, char *path_str, 3174225950Sken struct scsi_inquiry_data *inq_data, uint8_t *cdb, 3175225950Sken int cdb_len); 3176225950Sken 317755205Speter#ifdef _KERNEL 317874840Skenint scsi_command_string(struct ccb_scsiio *csio, struct sbuf *sb); 317974840Skenint scsi_sense_sbuf(struct ccb_scsiio *csio, struct sbuf *sb, 318074840Sken scsi_sense_string_flags flags); 318174840Skenchar * scsi_sense_string(struct ccb_scsiio *csio, 318274840Sken char *str, int str_len); 318339213Sgibbsvoid scsi_sense_print(struct ccb_scsiio *csio); 3184249937Ssmhint scsi_vpd_supported_page(struct cam_periph *periph, 3185249937Ssmh uint8_t page_id); 318674840Sken#else /* _KERNEL */ 318774840Skenint scsi_command_string(struct cam_device *device, 318874840Sken struct ccb_scsiio *csio, struct sbuf *sb); 318974840Skenint scsi_sense_sbuf(struct cam_device *device, 319074840Sken struct ccb_scsiio *csio, struct sbuf *sb, 319174840Sken scsi_sense_string_flags flags); 319239213Sgibbschar * scsi_sense_string(struct cam_device *device, 319339213Sgibbs struct ccb_scsiio *csio, 319439213Sgibbs char *str, int str_len); 319539213Sgibbsvoid scsi_sense_print(struct cam_device *device, 319639213Sgibbs struct ccb_scsiio *csio, FILE *ofile); 319755205Speter#endif /* _KERNEL */ 319839213Sgibbs 319939213Sgibbsconst char * scsi_op_desc(u_int16_t opcode, 320039213Sgibbs struct scsi_inquiry_data *inq_data); 320140401Skenchar * scsi_cdb_string(u_int8_t *cdb_ptr, char *cdb_string, 320240401Sken size_t len); 320339213Sgibbs 320439213Sgibbsvoid scsi_print_inquiry(struct scsi_inquiry_data *inq_data); 3205257049Smavvoid scsi_print_inquiry_short(struct scsi_inquiry_data *inq_data); 320639213Sgibbs 320739213Sgibbsu_int scsi_calc_syncsrate(u_int period_factor); 320839213Sgibbsu_int scsi_calc_syncparam(u_int period); 3209216088Sken 3210223081Sgibbstypedef int (*scsi_devid_checkfn_t)(uint8_t *); 3211223081Sgibbsint scsi_devid_is_naa_ieee_reg(uint8_t *bufp); 3212223081Sgibbsint scsi_devid_is_sas_target(uint8_t *bufp); 3213251654Smavint scsi_devid_is_lun_eui64(uint8_t *bufp); 3214251654Smavint scsi_devid_is_lun_naa(uint8_t *bufp); 3215251654Smavint scsi_devid_is_lun_name(uint8_t *bufp); 3216251654Smavint scsi_devid_is_lun_t10(uint8_t *bufp); 3217251654Smavstruct scsi_vpd_id_descriptor * 3218251654Smav scsi_get_devid(struct scsi_vpd_device_id *id, uint32_t len, 3219223081Sgibbs scsi_devid_checkfn_t ck_fn); 3220270106Smavstruct scsi_vpd_id_descriptor * 3221270106Smav scsi_get_devid_desc(struct scsi_vpd_id_descriptor *desc, uint32_t len, 3222270106Smav scsi_devid_checkfn_t ck_fn); 3223223081Sgibbs 3224268700Smavint scsi_transportid_sbuf(struct sbuf *sb, 3225268700Smav struct scsi_transportid_header *hdr, 3226268700Smav uint32_t valid_len); 3227268700Smav 3228268700Smavconst char * scsi_nv_to_str(struct scsi_nv *table, int num_table_entries, 3229268700Smav uint64_t value); 3230268700Smav 3231268700Smavscsi_nv_status scsi_get_nv(struct scsi_nv *table, int num_table_entries, 3232268700Smav char *name, int *table_entry, scsi_nv_flags flags); 3233268700Smav 3234268700Smavint scsi_parse_transportid_64bit(int proto_id, char *id_str, 3235268700Smav struct scsi_transportid_header **hdr, 3236268700Smav unsigned int *alloc_len, 3237268700Smav#ifdef _KERNEL 3238268700Smav struct malloc_type *type, int flags, 3239268700Smav#endif 3240268700Smav char *error_str, int error_str_len); 3241268700Smav 3242268700Smavint scsi_parse_transportid_spi(char *id_str, 3243268700Smav struct scsi_transportid_header **hdr, 3244268700Smav unsigned int *alloc_len, 3245268700Smav#ifdef _KERNEL 3246268700Smav struct malloc_type *type, int flags, 3247268700Smav#endif 3248268700Smav char *error_str, int error_str_len); 3249268700Smav 3250268700Smavint scsi_parse_transportid_rdma(char *id_str, 3251268700Smav struct scsi_transportid_header **hdr, 3252268700Smav unsigned int *alloc_len, 3253268700Smav#ifdef _KERNEL 3254268700Smav struct malloc_type *type, int flags, 3255268700Smav#endif 3256268700Smav char *error_str, int error_str_len); 3257268700Smav 3258268700Smavint scsi_parse_transportid_iscsi(char *id_str, 3259268700Smav struct scsi_transportid_header **hdr, 3260268700Smav unsigned int *alloc_len, 3261268700Smav#ifdef _KERNEL 3262268700Smav struct malloc_type *type, int flags, 3263268700Smav#endif 3264268700Smav char *error_str,int error_str_len); 3265268700Smav 3266268700Smavint scsi_parse_transportid_sop(char *id_str, 3267268700Smav struct scsi_transportid_header **hdr, 3268268700Smav unsigned int *alloc_len, 3269268700Smav#ifdef _KERNEL 3270268700Smav struct malloc_type *type, int flags, 3271268700Smav#endif 3272268700Smav char *error_str,int error_str_len); 3273268700Smav 3274268700Smavint scsi_parse_transportid(char *transportid_str, 3275268700Smav struct scsi_transportid_header **hdr, 3276268700Smav unsigned int *alloc_len, 3277268700Smav#ifdef _KERNEL 3278268700Smav struct malloc_type *type, int flags, 3279268700Smav#endif 3280268700Smav char *error_str, int error_str_len); 3281268700Smav 328239213Sgibbsvoid scsi_test_unit_ready(struct ccb_scsiio *csio, u_int32_t retries, 328339213Sgibbs void (*cbfcnp)(struct cam_periph *, 328439213Sgibbs union ccb *), 328539213Sgibbs u_int8_t tag_action, 328639213Sgibbs u_int8_t sense_len, u_int32_t timeout); 328739213Sgibbs 328839213Sgibbsvoid scsi_request_sense(struct ccb_scsiio *csio, u_int32_t retries, 328939213Sgibbs void (*cbfcnp)(struct cam_periph *, 329039213Sgibbs union ccb *), 329139213Sgibbs void *data_ptr, u_int8_t dxfer_len, 329239213Sgibbs u_int8_t tag_action, u_int8_t sense_len, 329339213Sgibbs u_int32_t timeout); 329439213Sgibbs 329539213Sgibbsvoid scsi_inquiry(struct ccb_scsiio *csio, u_int32_t retries, 329639213Sgibbs void (*cbfcnp)(struct cam_periph *, union ccb *), 329739213Sgibbs u_int8_t tag_action, u_int8_t *inq_buf, 329839213Sgibbs u_int32_t inq_len, int evpd, u_int8_t page_code, 329939213Sgibbs u_int8_t sense_len, u_int32_t timeout); 330039213Sgibbs 330139213Sgibbsvoid scsi_mode_sense(struct ccb_scsiio *csio, u_int32_t retries, 330239213Sgibbs void (*cbfcnp)(struct cam_periph *, 330339213Sgibbs union ccb *), 330439213Sgibbs u_int8_t tag_action, int dbd, 330539213Sgibbs u_int8_t page_code, u_int8_t page, 330639213Sgibbs u_int8_t *param_buf, u_int32_t param_len, 330739213Sgibbs u_int8_t sense_len, u_int32_t timeout); 330839213Sgibbs 3309111206Skenvoid scsi_mode_sense_len(struct ccb_scsiio *csio, u_int32_t retries, 3310111206Sken void (*cbfcnp)(struct cam_periph *, 3311111206Sken union ccb *), 3312111206Sken u_int8_t tag_action, int dbd, 3313111206Sken u_int8_t page_code, u_int8_t page, 3314111206Sken u_int8_t *param_buf, u_int32_t param_len, 3315111206Sken int minimum_cmd_size, u_int8_t sense_len, 3316111206Sken u_int32_t timeout); 3317111206Sken 331839213Sgibbsvoid scsi_mode_select(struct ccb_scsiio *csio, u_int32_t retries, 331939213Sgibbs void (*cbfcnp)(struct cam_periph *, 332039213Sgibbs union ccb *), 332139213Sgibbs u_int8_t tag_action, int scsi_page_fmt, 332239213Sgibbs int save_pages, u_int8_t *param_buf, 332339213Sgibbs u_int32_t param_len, u_int8_t sense_len, 332439213Sgibbs u_int32_t timeout); 332539213Sgibbs 3326111206Skenvoid scsi_mode_select_len(struct ccb_scsiio *csio, u_int32_t retries, 3327111206Sken void (*cbfcnp)(struct cam_periph *, 3328111206Sken union ccb *), 3329111206Sken u_int8_t tag_action, int scsi_page_fmt, 3330111206Sken int save_pages, u_int8_t *param_buf, 3331111206Sken u_int32_t param_len, int minimum_cmd_size, 3332111206Sken u_int8_t sense_len, u_int32_t timeout); 3333111206Sken 333482384Skbyancvoid scsi_log_sense(struct ccb_scsiio *csio, u_int32_t retries, 333582384Skbyanc void (*cbfcnp)(struct cam_periph *, union ccb *), 333682384Skbyanc u_int8_t tag_action, u_int8_t page_code, 333782384Skbyanc u_int8_t page, int save_pages, int ppc, 333882384Skbyanc u_int32_t paramptr, u_int8_t *param_buf, 333982384Skbyanc u_int32_t param_len, u_int8_t sense_len, 334082384Skbyanc u_int32_t timeout); 334182384Skbyanc 334282384Skbyancvoid scsi_log_select(struct ccb_scsiio *csio, u_int32_t retries, 334382384Skbyanc void (*cbfcnp)(struct cam_periph *, 334482384Skbyanc union ccb *), u_int8_t tag_action, 334582384Skbyanc u_int8_t page_code, int save_pages, 334682384Skbyanc int pc_reset, u_int8_t *param_buf, 334782384Skbyanc u_int32_t param_len, u_int8_t sense_len, 334882384Skbyanc u_int32_t timeout); 334982384Skbyanc 335097825Smjacobvoid scsi_prevent(struct ccb_scsiio *csio, u_int32_t retries, 335197825Smjacob void (*cbfcnp)(struct cam_periph *, union ccb *), 335297825Smjacob u_int8_t tag_action, u_int8_t action, 335397825Smjacob u_int8_t sense_len, u_int32_t timeout); 335497825Smjacob 335539213Sgibbsvoid scsi_read_capacity(struct ccb_scsiio *csio, u_int32_t retries, 335639213Sgibbs void (*cbfcnp)(struct cam_periph *, 335739213Sgibbs union ccb *), u_int8_t tag_action, 335897825Smjacob struct scsi_read_capacity_data *, 335939213Sgibbs u_int8_t sense_len, u_int32_t timeout); 3360114261Skenvoid scsi_read_capacity_16(struct ccb_scsiio *csio, uint32_t retries, 3361114261Sken void (*cbfcnp)(struct cam_periph *, 3362114261Sken union ccb *), uint8_t tag_action, 3363114261Sken uint64_t lba, int reladr, int pmi, 3364230590Sken uint8_t *rcap_buf, int rcap_buf_len, 3365230590Sken uint8_t sense_len, uint32_t timeout); 336639213Sgibbs 336797825Smjacobvoid scsi_report_luns(struct ccb_scsiio *csio, u_int32_t retries, 3368161506Sken void (*cbfcnp)(struct cam_periph *, 3369161506Sken union ccb *), u_int8_t tag_action, 3370161506Sken u_int8_t select_report, 3371161506Sken struct scsi_report_luns_data *rpl_buf, 3372161506Sken u_int32_t alloc_len, u_int8_t sense_len, 3373161506Sken u_int32_t timeout); 337439213Sgibbs 3375208905Smjacobvoid scsi_report_target_group(struct ccb_scsiio *csio, u_int32_t retries, 3376208905Smjacob void (*cbfcnp)(struct cam_periph *, 3377208905Smjacob union ccb *), u_int8_t tag_action, 3378208905Smjacob u_int8_t pdf, 3379208905Smjacob void *buf, 3380208905Smjacob u_int32_t alloc_len, u_int8_t sense_len, 3381208905Smjacob u_int32_t timeout); 3382208905Smjacob 3383208905Smjacobvoid scsi_set_target_group(struct ccb_scsiio *csio, u_int32_t retries, 3384208905Smjacob void (*cbfcnp)(struct cam_periph *, 3385208905Smjacob union ccb *), u_int8_t tag_action, void *buf, 3386208905Smjacob u_int32_t alloc_len, u_int8_t sense_len, 3387208905Smjacob u_int32_t timeout); 3388208905Smjacob 338939213Sgibbsvoid scsi_synchronize_cache(struct ccb_scsiio *csio, 339039213Sgibbs u_int32_t retries, 339139213Sgibbs void (*cbfcnp)(struct cam_periph *, 339239213Sgibbs union ccb *), u_int8_t tag_action, 339339213Sgibbs u_int32_t begin_lba, u_int16_t lb_count, 339439213Sgibbs u_int8_t sense_len, u_int32_t timeout); 339539213Sgibbs 3396223081Sgibbsvoid scsi_receive_diagnostic_results(struct ccb_scsiio *csio, u_int32_t retries, 3397223081Sgibbs void (*cbfcnp)(struct cam_periph *, 3398223081Sgibbs union ccb*), 3399223081Sgibbs uint8_t tag_action, int pcv, 3400223081Sgibbs uint8_t page_code, uint8_t *data_ptr, 3401223081Sgibbs uint16_t allocation_length, 3402223081Sgibbs uint8_t sense_len, uint32_t timeout); 3403223081Sgibbs 3404223081Sgibbsvoid scsi_send_diagnostic(struct ccb_scsiio *csio, u_int32_t retries, 3405223081Sgibbs void (*cbfcnp)(struct cam_periph *, union ccb *), 3406223081Sgibbs uint8_t tag_action, int unit_offline, 3407223081Sgibbs int device_offline, int self_test, int page_format, 3408223081Sgibbs int self_test_code, uint8_t *data_ptr, 3409223081Sgibbs uint16_t param_list_length, uint8_t sense_len, 3410223081Sgibbs uint32_t timeout); 3411223081Sgibbs 3412235897Smavvoid scsi_read_buffer(struct ccb_scsiio *csio, u_int32_t retries, 3413235897Smav void (*cbfcnp)(struct cam_periph *, union ccb*), 3414235897Smav uint8_t tag_action, int mode, 3415235897Smav uint8_t buffer_id, u_int32_t offset, 3416235897Smav uint8_t *data_ptr, uint32_t allocation_length, 3417235897Smav uint8_t sense_len, uint32_t timeout); 3418235897Smav 3419235897Smavvoid scsi_write_buffer(struct ccb_scsiio *csio, u_int32_t retries, 3420235897Smav void (*cbfcnp)(struct cam_periph *, union ccb *), 3421235897Smav uint8_t tag_action, int mode, 3422235897Smav uint8_t buffer_id, u_int32_t offset, 3423235897Smav uint8_t *data_ptr, uint32_t param_list_length, 3424235897Smav uint8_t sense_len, uint32_t timeout); 3425235897Smav 3426248519Skib#define SCSI_RW_READ 0x0001 3427248519Skib#define SCSI_RW_WRITE 0x0002 3428248519Skib#define SCSI_RW_DIRMASK 0x0003 3429248519Skib#define SCSI_RW_BIO 0x1000 343039466Skenvoid scsi_read_write(struct ccb_scsiio *csio, u_int32_t retries, 343139466Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 343239466Sken u_int8_t tag_action, int readop, u_int8_t byte2, 3433114261Sken int minimum_cmd_size, u_int64_t lba, 343439466Sken u_int32_t block_count, u_int8_t *data_ptr, 343539466Sken u_int32_t dxfer_len, u_int8_t sense_len, 343639466Sken u_int32_t timeout); 343739466Sken 3438230053Smavvoid scsi_write_same(struct ccb_scsiio *csio, u_int32_t retries, 3439230053Smav void (*cbfcnp)(struct cam_periph *, union ccb *), 3440230053Smav u_int8_t tag_action, u_int8_t byte2, 3441230053Smav int minimum_cmd_size, u_int64_t lba, 3442230053Smav u_int32_t block_count, u_int8_t *data_ptr, 3443230053Smav u_int32_t dxfer_len, u_int8_t sense_len, 3444230053Smav u_int32_t timeout); 3445230053Smav 3446249933Ssmhvoid scsi_ata_identify(struct ccb_scsiio *csio, u_int32_t retries, 3447249933Ssmh void (*cbfcnp)(struct cam_periph *, union ccb *), 3448249933Ssmh u_int8_t tag_action, u_int8_t *data_ptr, 3449249933Ssmh u_int16_t dxfer_len, u_int8_t sense_len, 3450249933Ssmh u_int32_t timeout); 3451249933Ssmh 3452249933Ssmhvoid scsi_ata_trim(struct ccb_scsiio *csio, u_int32_t retries, 3453249933Ssmh void (*cbfcnp)(struct cam_periph *, union ccb *), 3454249933Ssmh u_int8_t tag_action, u_int16_t block_count, 3455249933Ssmh u_int8_t *data_ptr, u_int16_t dxfer_len, 3456249933Ssmh u_int8_t sense_len, u_int32_t timeout); 3457249933Ssmh 3458248992Ssmhvoid scsi_ata_pass_16(struct ccb_scsiio *csio, u_int32_t retries, 3459248992Ssmh void (*cbfcnp)(struct cam_periph *, union ccb *), 3460248992Ssmh u_int32_t flags, u_int8_t tag_action, 3461248992Ssmh u_int8_t protocol, u_int8_t ata_flags, u_int16_t features, 3462248992Ssmh u_int16_t sector_count, uint64_t lba, u_int8_t command, 3463248992Ssmh u_int8_t control, u_int8_t *data_ptr, u_int16_t dxfer_len, 3464248992Ssmh u_int8_t sense_len, u_int32_t timeout); 3465248992Ssmh 3466230053Smavvoid scsi_unmap(struct ccb_scsiio *csio, u_int32_t retries, 3467230053Smav void (*cbfcnp)(struct cam_periph *, union ccb *), 3468230053Smav u_int8_t tag_action, u_int8_t byte2, 3469230053Smav u_int8_t *data_ptr, u_int16_t dxfer_len, 3470230053Smav u_int8_t sense_len, u_int32_t timeout); 3471230053Smav 347239466Skenvoid scsi_start_stop(struct ccb_scsiio *csio, u_int32_t retries, 347339466Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 347439466Sken u_int8_t tag_action, int start, int load_eject, 347539466Sken int immediate, u_int8_t sense_len, u_int32_t timeout); 347639466Sken 3477268700Smavvoid scsi_persistent_reserve_in(struct ccb_scsiio *csio, uint32_t retries, 3478268700Smav void (*cbfcnp)(struct cam_periph *,union ccb *), 3479268700Smav uint8_t tag_action, int service_action, 3480268700Smav uint8_t *data_ptr, uint32_t dxfer_len, 3481268700Smav int sense_len, int timeout); 3482268700Smav 3483268700Smavvoid scsi_persistent_reserve_out(struct ccb_scsiio *csio, uint32_t retries, 3484268700Smav void (*cbfcnp)(struct cam_periph *, 3485268700Smav union ccb *), 3486268700Smav uint8_t tag_action, int service_action, 3487268700Smav int scope, int res_type, uint8_t *data_ptr, 3488268700Smav uint32_t dxfer_len, int sense_len, 3489268700Smav int timeout); 3490268700Smav 349139213Sgibbsint scsi_inquiry_match(caddr_t inqbuffer, caddr_t table_entry); 349239213Sgibbsint scsi_static_inquiry_match(caddr_t inqbuffer, 349339213Sgibbs caddr_t table_entry); 3494223081Sgibbsint scsi_devid_match(uint8_t *rhs, size_t rhs_len, 3495223081Sgibbs uint8_t *lhs, size_t lhs_len); 349639213Sgibbs 3497225950Skenvoid scsi_extract_sense(struct scsi_sense_data *sense, int *error_code, 3498225950Sken int *sense_key, int *asc, int *ascq); 3499237478Smavint scsi_extract_sense_ccb(union ccb *ccb, int *error_code, int *sense_key, 3500237478Smav int *asc, int *ascq); 3501225950Skenvoid scsi_extract_sense_len(struct scsi_sense_data *sense, 3502225950Sken u_int sense_len, int *error_code, int *sense_key, 3503225950Sken int *asc, int *ascq, int show_errors); 3504225950Skenint scsi_get_sense_key(struct scsi_sense_data *sense, u_int sense_len, 3505225950Sken int show_errors); 3506225950Skenint scsi_get_asc(struct scsi_sense_data *sense, u_int sense_len, 3507225950Sken int show_errors); 3508225950Skenint scsi_get_ascq(struct scsi_sense_data *sense, u_int sense_len, 3509225950Sken int show_errors); 351039213Sgibbsstatic __inline void scsi_ulto2b(u_int32_t val, u_int8_t *bytes); 351139213Sgibbsstatic __inline void scsi_ulto3b(u_int32_t val, u_int8_t *bytes); 351239213Sgibbsstatic __inline void scsi_ulto4b(u_int32_t val, u_int8_t *bytes); 3513114261Skenstatic __inline void scsi_u64to8b(u_int64_t val, u_int8_t *bytes); 3514225950Skenstatic __inline uint32_t scsi_2btoul(const uint8_t *bytes); 3515225950Skenstatic __inline uint32_t scsi_3btoul(const uint8_t *bytes); 3516225950Skenstatic __inline int32_t scsi_3btol(const uint8_t *bytes); 3517225950Skenstatic __inline uint32_t scsi_4btoul(const uint8_t *bytes); 3518225950Skenstatic __inline uint64_t scsi_8btou64(const uint8_t *bytes); 351939885Skenstatic __inline void *find_mode_page_6(struct scsi_mode_header_6 *mode_header); 352039885Skenstatic __inline void *find_mode_page_10(struct scsi_mode_header_10 *mode_header); 352139213Sgibbs 352239213Sgibbsstatic __inline void 352339213Sgibbsscsi_ulto2b(u_int32_t val, u_int8_t *bytes) 352439213Sgibbs{ 352539213Sgibbs 352639213Sgibbs bytes[0] = (val >> 8) & 0xff; 352739213Sgibbs bytes[1] = val & 0xff; 352839213Sgibbs} 352939213Sgibbs 353039213Sgibbsstatic __inline void 353139213Sgibbsscsi_ulto3b(u_int32_t val, u_int8_t *bytes) 353239213Sgibbs{ 353339213Sgibbs 353439213Sgibbs bytes[0] = (val >> 16) & 0xff; 353539213Sgibbs bytes[1] = (val >> 8) & 0xff; 353639213Sgibbs bytes[2] = val & 0xff; 353739213Sgibbs} 353839213Sgibbs 353939213Sgibbsstatic __inline void 354039213Sgibbsscsi_ulto4b(u_int32_t val, u_int8_t *bytes) 354139213Sgibbs{ 354239213Sgibbs 354339213Sgibbs bytes[0] = (val >> 24) & 0xff; 354439213Sgibbs bytes[1] = (val >> 16) & 0xff; 354539213Sgibbs bytes[2] = (val >> 8) & 0xff; 354639213Sgibbs bytes[3] = val & 0xff; 354739213Sgibbs} 354839213Sgibbs 3549114261Skenstatic __inline void 3550114261Skenscsi_u64to8b(u_int64_t val, u_int8_t *bytes) 3551114261Sken{ 3552114261Sken 3553114261Sken bytes[0] = (val >> 56) & 0xff; 3554114261Sken bytes[1] = (val >> 48) & 0xff; 3555114261Sken bytes[2] = (val >> 40) & 0xff; 3556114261Sken bytes[3] = (val >> 32) & 0xff; 3557114261Sken bytes[4] = (val >> 24) & 0xff; 3558114261Sken bytes[5] = (val >> 16) & 0xff; 3559114261Sken bytes[6] = (val >> 8) & 0xff; 3560114261Sken bytes[7] = val & 0xff; 3561114261Sken} 3562114261Sken 3563225950Skenstatic __inline uint32_t 3564225950Skenscsi_2btoul(const uint8_t *bytes) 356539213Sgibbs{ 3566225950Sken uint32_t rv; 356739213Sgibbs 356839213Sgibbs rv = (bytes[0] << 8) | 356939213Sgibbs bytes[1]; 357039213Sgibbs return (rv); 357139213Sgibbs} 357239213Sgibbs 3573225950Skenstatic __inline uint32_t 3574225950Skenscsi_3btoul(const uint8_t *bytes) 357539213Sgibbs{ 3576225950Sken uint32_t rv; 357739213Sgibbs 357839213Sgibbs rv = (bytes[0] << 16) | 357939213Sgibbs (bytes[1] << 8) | 358039213Sgibbs bytes[2]; 358139213Sgibbs return (rv); 358239213Sgibbs} 358339213Sgibbs 358439213Sgibbsstatic __inline int32_t 3585225950Skenscsi_3btol(const uint8_t *bytes) 358639213Sgibbs{ 3587225950Sken uint32_t rc = scsi_3btoul(bytes); 358839213Sgibbs 358939213Sgibbs if (rc & 0x00800000) 359039213Sgibbs rc |= 0xff000000; 359139213Sgibbs 359239213Sgibbs return (int32_t) rc; 359339213Sgibbs} 359439213Sgibbs 3595225950Skenstatic __inline uint32_t 3596225950Skenscsi_4btoul(const uint8_t *bytes) 359739213Sgibbs{ 3598225950Sken uint32_t rv; 359939213Sgibbs 360039213Sgibbs rv = (bytes[0] << 24) | 360139213Sgibbs (bytes[1] << 16) | 360239213Sgibbs (bytes[2] << 8) | 360339213Sgibbs bytes[3]; 360439213Sgibbs return (rv); 360539213Sgibbs} 360639885Sken 3607114261Skenstatic __inline uint64_t 3608225950Skenscsi_8btou64(const uint8_t *bytes) 3609114261Sken{ 3610114261Sken uint64_t rv; 3611114261Sken 3612114261Sken rv = (((uint64_t)bytes[0]) << 56) | 3613114261Sken (((uint64_t)bytes[1]) << 48) | 3614114261Sken (((uint64_t)bytes[2]) << 40) | 3615114261Sken (((uint64_t)bytes[3]) << 32) | 3616114261Sken (((uint64_t)bytes[4]) << 24) | 3617114261Sken (((uint64_t)bytes[5]) << 16) | 3618114261Sken (((uint64_t)bytes[6]) << 8) | 3619114261Sken bytes[7]; 3620114261Sken return (rv); 3621114261Sken} 3622114261Sken 362339885Sken/* 362439885Sken * Given the pointer to a returned mode sense buffer, return a pointer to 362539885Sken * the start of the first mode page. 362639885Sken */ 362739885Skenstatic __inline void * 362839885Skenfind_mode_page_6(struct scsi_mode_header_6 *mode_header) 362939885Sken{ 363039885Sken void *page_start; 363139885Sken 363239885Sken page_start = (void *)((u_int8_t *)&mode_header[1] + 363339885Sken mode_header->blk_desc_len); 363439885Sken 363539885Sken return(page_start); 363639885Sken} 363739885Sken 363839885Skenstatic __inline void * 363939885Skenfind_mode_page_10(struct scsi_mode_header_10 *mode_header) 364039885Sken{ 364139885Sken void *page_start; 364239885Sken 3643173639Sscottl page_start = (void *)((u_int8_t *)&mode_header[1] + 364439885Sken scsi_2btoul(mode_header->blk_desc_len)); 364539885Sken 364639885Sken return(page_start); 364739885Sken} 364839885Sken 364939213Sgibbs__END_DECLS 365039213Sgibbs 365139213Sgibbs#endif /*_SCSI_SCSI_ALL_H*/ 3652