1/* 2 * Structures and definitions for SCSI commands to the SG passthrough device. 3 */ 4 5#ifndef _SCSI_SG_H 6#define _SCSI_SG_H 7 8#define SGIOC '"' 9#define SG_SET_TIMEOUT _IOW(SGIOC, 0x01, u_int) 10#define SG_GET_TIMEOUT _IO(SGIOC, 0x02) 11#define SG_EMULATED_HOST _IOR(SGIOC, 0x03, int) 12#define SG_SET_TRANSFORM _IO(SGIOC, 0x04) 13#define SG_GET_TRANSFORM _IO(SGIOC, 0x05) 14#define SG_GET_COMMAND_Q _IOW(SGIOC, 0x70, int) 15#define SG_SET_COMMAND_Q _IOR(SGIOC, 0x71, int) 16#define SG_GET_RESERVED_SIZE _IOR(SGIOC, 0x72, int) 17#define SG_SET_RESERVED_SIZE _IOW(SGIOC, 0x75, int) 18#define SG_GET_SCSI_ID _IOR(SGIOC, 0x76, struct sg_scsi_id) 19#define SG_SET_FORCE_LOW_DMA _IOW(SGIOC, 0x79, int) 20#define SG_GET_LOW_DMA _IOR(SGIOC, 0x7a, int) 21#define SG_SET_FORCE_PACK_ID _IOW(SGIOC, 0x7b, int) 22#define SG_GET_PACK_ID _IOR(SGIOC, 0x7c, int) 23#define SG_GET_NUM_WAITING _IOR(SGIOC, 0x7d, int) 24#define SG_SET_DEBUG _IOW(SGIOC, 0x7e, int) 25#define SG_GET_SG_TABLESIZE _IOR(SGIOC, 0x7f, int) 26#define SG_GET_VERSION_NUM _IOR(SGIOC, 0x82, int) 27#define SG_NEXT_CMD_LEN _IOW(SGIOC, 0x83, int) 28#define SG_SCSI_RESET _IOW(SGIOC, 0x84, int) 29#define SG_IO _IOWR(SGIOC, 0x85, struct sg_io_hdr) 30#define SG_GET_REQUEST_TABLE _IO(SGIOC, 0x86) 31#define SG_SET_KEEP_ORPHAN _IOW(SGIOC, 0x87, int) 32#define SG_GET_KEEP_ORPHAN _IOR(SGIOC, 0x88, int) 33#define SG_GET_ACCESS_COUNT _IOR(SGIOC, 0x89, int) 34 35struct sg_io_hdr { 36 int interface_id; 37 int dxfer_direction; 38 u_char cmd_len; 39 u_char mx_sb_len; 40 u_short iovec_count; 41 u_int dxfer_len; 42 void *dxferp; 43 u_char *cmdp; 44 u_char *sbp; 45 u_int timeout; 46 u_int flags; 47 int pack_id; 48 void *usr_ptr; 49 u_char status; 50 u_char masked_status; 51 u_char msg_status; 52 u_char sb_len_wr; 53 u_short host_status; 54 u_short driver_status; 55 int resid; 56 u_int duration; 57 u_int info; 58}; 59 60struct sg_io_hdr32 { 61 int interface_id; 62 int dxfer_direction; 63 u_char cmd_len; 64 u_char mx_sb_len; 65 u_short iovec_count; 66 u_int dxfer_len; 67 uint32_t dxferp; 68 uint32_t cmdp; 69 uint32_t sbp; 70 u_int timeout; 71 u_int flags; 72 int pack_id; 73 uint32_t usr_ptr; 74 u_char status; 75 u_char masked_status; 76 u_char msg_status; 77 u_char sb_len_wr; 78 u_short host_status; 79 u_short driver_status; 80 int resid; 81 u_int duration; 82 u_int info; 83}; 84 85#define SG_DXFER_NONE -1 86#define SG_DXFER_TO_DEV -2 87#define SG_DXFER_FROM_DEV -3 88#define SG_DXFER_TO_FROM_DEV -4 89#define SG_DXFER_UNKNOWN -5 90 91#define SG_MAX_SENSE 16 92struct sg_header { 93 int pack_len; 94 int reply_len; 95 int pack_id; 96 int result; 97 u_int twelve_byte:1; 98 u_int target_status:5; 99 u_int host_status:8; 100 u_int driver_status:8; 101 u_int other_flags:10; 102 u_char sense_buffer[SG_MAX_SENSE]; 103}; 104 105struct sg_scsi_id { 106 int host_no; 107 int channel; 108 int scsi_id; 109 int lun; 110 int scsi_type; 111 short h_cmd_per_lun; 112 short d_queue_depth; 113 int unused[2]; 114}; 115 116struct scsi_idlun { 117 uint32_t dev_id; 118 uint32_t host_unique_id; 119}; 120 121/* 122 * Host codes 123 */ 124#define DID_OK 0x00 /* OK */ 125#define DID_NO_CONNECT 0x01 /* timeout during connect */ 126#define DID_BUS_BUSY 0x02 /* timeout during command */ 127#define DID_TIME_OUT 0x03 /* other timeout */ 128#define DID_BAD_TARGET 0x04 /* bad target */ 129#define DID_ABORT 0x05 /* abort */ 130#define DID_PARITY 0x06 /* parity error */ 131#define DID_ERROR 0x07 /* internal error */ 132#define DID_RESET 0x08 /* reset by somebody */ 133#define DID_BAD_INTR 0x09 /* unexpected interrupt */ 134#define DID_PASSTHROUGH 0x0a /* passthrough */ 135#define DID_SOFT_ERROR 0x0b /* low driver wants retry */ 136#define DID_IMM_RETRY 0x0c /* retry without decreasing retrycnt */ 137 138/* 139 * Driver codes 140 */ 141#define DRIVER_OK 0x00 142#define DRIVER_BUSY 0x01 143#define DRIVER_SOFT 0x02 144#define DRIVER_MEDIA 0x03 145#define DRIVER_ERROR 0x04 146 147#define DRIVER_INVALID 0x05 148#define DRIVER_TIMEOUT 0x06 149#define DRIVER_HARD 0x07 150#define DRIVER_SENSE 0x08 151 152#define SUGGEST_RETRY 0x10 153#define SUGGEST_ABORT 0x20 154#define SUGGEST_REMAP 0x30 155#define SUGGEST_DIE 0x40 156#define SUGGEST_SENSE 0x80 157#define SUGGEST_IS_OK 0xff 158 159#define DRIVER_MASK 0x0f 160#define SUGGEST_MASK 0xf0 161 162/* Other definitions */ 163/* HZ isn't always available, so simulate it */ 164#define SG_DEFAULT_HZ 1000 165#define SG_DEFAULT_TIMEOUT (60*SG_DEFAULT_HZ) 166 167#endif /* !_SCSI_SG_H */ 168