| 1 |
|
| 2 | #ifndef _SCSI_GENERIC_H
|
| 3 | #define _SCSI_GENERIC_H
|
| 4 |
|
| 5 | #include <linux/compiler.h>
|
| 6 |
|
| 7 | |
| 8 | * History:
|
| 9 | * Started: Aug 9 by Lawrence Foard ([email protected]), to allow user
|
| 10 | * process control of SCSI devices.
|
| 11 | * Development Sponsored by Killy Corp. NY NY
|
| 12 | *
|
| 13 | * Original driver (sg.h):
|
| 14 | * Copyright (C) 1992 Lawrence Foard
|
| 15 | * Version 2 and 3 extensions to driver:
|
| 16 | * Copyright (C) 1998 - 2014 Douglas Gilbert
|
| 17 | *
|
| 18 | * Version: 3.5.36 (20140603)
|
| 19 | * This version is for 2.6 and 3 series kernels.
|
| 20 | *
|
| 21 | * Documentation
|
| 22 | * =============
|
| 23 | * A web site for the SG device driver can be found at:
|
| 24 | * http://sg.danny.cz/sg [alternatively check the MAINTAINERS file]
|
| 25 | * The documentation for the sg version 3 driver can be found at:
|
| 26 | * http://sg.danny.cz/sg/p/sg_v3_ho.html
|
| 27 | * Also see: <kernel_source>/Documentation/scsi/scsi-generic.rst
|
| 28 | *
|
| 29 | * For utility and test programs see: http://sg.danny.cz/sg/sg3_utils.html
|
| 30 |
|
| 31 |
|
| 32 |
|
| 33 | typedef struct sg_iovec
|
| 34 | {
|
| 35 | void __user *iov_base;
|
| 36 | size_t iov_len;
|
| 37 | } sg_iovec_t;
|
| 38 |
|
| 39 |
|
| 40 | typedef struct sg_io_hdr
|
| 41 | {
|
| 42 | int interface_id;
|
| 43 | int dxfer_direction;
|
| 44 | unsigned char cmd_len;
|
| 45 | unsigned char mx_sb_len;
|
| 46 | unsigned short iovec_count;
|
| 47 | unsigned int dxfer_len;
|
| 48 | void __user *dxferp; |
| 49 | or scatter gather list
|
| 50 | unsigned char __user *cmdp;
|
| 51 | void __user *sbp;
|
| 52 | unsigned int timeout;
|
| 53 | unsigned int flags;
|
| 54 | int pack_id;
|
| 55 | void __user * usr_ptr;
|
| 56 | unsigned char status;
|
| 57 | unsigned char masked_status;
|
| 58 | unsigned char msg_status;
|
| 59 | unsigned char sb_len_wr;
|
| 60 | unsigned short host_status;
|
| 61 | unsigned short driver_status;
|
| 62 | int resid;
|
| 63 | unsigned int duration;
|
| 64 | unsigned int info;
|
| 65 | } sg_io_hdr_t;
|
| 66 |
|
| 67 | #if defined(__KERNEL__)
|
| 68 | #include <linux/compat.h>
|
| 69 |
|
| 70 | struct compat_sg_io_hdr {
|
| 71 | compat_int_t interface_id;
|
| 72 | compat_int_t dxfer_direction;
|
| 73 | unsigned char cmd_len;
|
| 74 | unsigned char mx_sb_len;
|
| 75 | unsigned short iovec_count;
|
| 76 | compat_uint_t dxfer_len;
|
| 77 | compat_uint_t dxferp; |
| 78 | or scatter gather list
|
| 79 | compat_uptr_t cmdp;
|
| 80 | compat_uptr_t sbp;
|
| 81 | compat_uint_t timeout;
|
| 82 | compat_uint_t flags;
|
| 83 | compat_int_t pack_id;
|
| 84 | compat_uptr_t usr_ptr;
|
| 85 | unsigned char status;
|
| 86 | unsigned char masked_status;
|
| 87 | unsigned char msg_status;
|
| 88 | unsigned char sb_len_wr;
|
| 89 | unsigned short host_status;
|
| 90 | unsigned short driver_status;
|
| 91 | compat_int_t resid;
|
| 92 | compat_uint_t duration;
|
| 93 | compat_uint_t info;
|
| 94 | };
|
| 95 | #endif
|
| 96 |
|
| 97 | #define SG_INTERFACE_ID_ORIG 'S'
|
| 98 |
|
| 99 |
|
| 100 | #define SG_DXFER_NONE (-1)
|
| 101 | #define SG_DXFER_TO_DEV (-2)
|
| 102 | #define SG_DXFER_FROM_DEV (-3)
|
| 103 | #define SG_DXFER_TO_FROM_DEV (-4) |
| 104 | additional property than during indirect
|
| 105 | IO the user buffer is copied into the
|
| 106 | kernel buffers before the transfer
|
| 107 | #define SG_DXFER_UNKNOWN (-5)
|
| 108 |
|
| 109 |
|
| 110 | #define SG_FLAG_DIRECT_IO 1
|
| 111 | #define SG_FLAG_UNUSED_LUN_INHIBIT 2
|
| 112 |
|
| 113 | #define SG_FLAG_MMAP_IO 4
|
| 114 | #define SG_FLAG_NO_DXFER 0x10000
|
| 115 |
|
| 116 |
|
| 117 | #define SG_FLAG_Q_AT_TAIL 0x10
|
| 118 | #define SG_FLAG_Q_AT_HEAD 0x20
|
| 119 |
|
| 120 |
|
| 121 | #define SG_INFO_OK_MASK 0x1
|
| 122 | #define SG_INFO_OK 0x0
|
| 123 | #define SG_INFO_CHECK 0x1
|
| 124 |
|
| 125 | #define SG_INFO_DIRECT_IO_MASK 0x6
|
| 126 | #define SG_INFO_INDIRECT_IO 0x0
|
| 127 | #define SG_INFO_DIRECT_IO 0x2
|
| 128 | #define SG_INFO_MIXED_IO 0x4
|
| 129 |
|
| 130 | |
| 131 | * Obsolete DRIVER_SENSE driver byte
|
| 132 | *
|
| 133 | * Originally the SCSI midlayer would set the DRIVER_SENSE driver byte when
|
| 134 | * a sense code was generated and a sense buffer was allocated.
|
| 135 | * However, as nowadays every scsi command has a sense code allocated this
|
| 136 | * distinction became moot as one could check the sense buffer directly.
|
| 137 | * Consequently this byte is not set anymore from the midlayer, but SG will
|
| 138 | * keep setting this byte to be compatible with previous releases.
|
| 139 |
|
| 140 | #define DRIVER_SENSE 0x08
|
| 141 |
|
| 142 | #define driver_byte(result) (((result) >> 24) & 0xff)
|
| 143 |
|
| 144 | |
| 145 | * Original linux SCSI Status codes. They are shifted 1 bit right
|
| 146 | * from those found in the SCSI standards.
|
| 147 |
|
| 148 |
|
| 149 | #define GOOD 0x00
|
| 150 | #define CHECK_CONDITION 0x01
|
| 151 | #define CONDITION_GOOD 0x02
|
| 152 | #define BUSY 0x04
|
| 153 | #define INTERMEDIATE_GOOD 0x08
|
| 154 | #define INTERMEDIATE_C_GOOD 0x0a
|
| 155 | #define RESERVATION_CONFLICT 0x0c
|
| 156 | #define COMMAND_TERMINATED 0x11
|
| 157 | #define QUEUE_FULL 0x14
|
| 158 | #define ACA_ACTIVE 0x18
|
| 159 | #define TASK_ABORTED 0x20
|
| 160 |
|
| 161 |
|
| 162 | #define sg_status_byte(result) (((result) >> 1) & 0x7f)
|
| 163 |
|
| 164 | typedef struct sg_scsi_id {
|
| 165 | int host_no;
|
| 166 | int channel;
|
| 167 | int scsi_id;
|
| 168 | int lun;
|
| 169 | int scsi_type;
|
| 170 | short h_cmd_per_lun;
|
| 171 | short d_queue_depth;
|
| 172 | int unused[2];
|
| 173 | } sg_scsi_id_t;
|
| 174 |
|
| 175 | typedef struct sg_req_info {
|
| 176 | char req_state;
|
| 177 | char orphan;
|
| 178 | char sg_io_owned;
|
| 179 | char problem;
|
| 180 | int pack_id;
|
| 181 | void __user *usr_ptr;
|
| 182 | unsigned int duration; |
| 183 | or request duration (req_state==2)
|
| 184 | int unused;
|
| 185 | } sg_req_info_t;
|
| 186 |
|
| 187 |
|
| 188 | |
| 189 | [Those that only apply to the SG 2.x drivers are at the end of the file.]
|
| 190 | (_GET_s yield result via 'int *' 3rd argument unless otherwise indicated)
|
| 191 |
|
| 192 | #define SG_EMULATED_HOST 0x2203
|
| 193 |
|
| 194 |
|
| 195 |
|
| 196 | #define SG_SET_TRANSFORM 0x2204
|
| 197 |
|
| 198 | #define SG_GET_TRANSFORM 0x2205
|
| 199 |
|
| 200 | #define SG_SET_RESERVED_SIZE 0x2275
|
| 201 | #define SG_GET_RESERVED_SIZE 0x2272
|
| 202 |
|
| 203 |
|
| 204 | #define SG_GET_SCSI_ID 0x2276
|
| 205 |
|
| 206 |
|
| 207 |
|
| 208 | #define SG_SET_FORCE_LOW_DMA 0x2279
|
| 209 | #define SG_GET_LOW_DMA 0x227a
|
| 210 |
|
| 211 | |
| 212 | tries to fetch a packet with a matching pack_id, waits, or returns EAGAIN.
|
| 213 | If pack_id is -1 then read oldest waiting. When ...FORCE_PACK_ID set to 0
|
| 214 | then pack_id ignored by read() and oldest readable fetched.
|
| 215 | #define SG_SET_FORCE_PACK_ID 0x227b
|
| 216 | #define SG_GET_PACK_ID 0x227c
|
| 217 |
|
| 218 | #define SG_GET_NUM_WAITING 0x227d
|
| 219 |
|
| 220 |
|
| 221 | #define SG_GET_SG_TABLESIZE 0x227F
|
| 222 |
|
| 223 | #define SG_GET_VERSION_NUM 0x2282
|
| 224 |
|
| 225 |
|
| 226 | #define SG_SCSI_RESET 0x2284
|
| 227 | |
| 228 | * SG_SCSI_RESET_NO_ESCALATE may be OR-ed to the _DEVICE, _TARGET, _BUS
|
| 229 | * or _HOST reset value so only that action is attempted.
|
| 230 | #define SG_SCSI_RESET_NOTHING 0
|
| 231 | #define SG_SCSI_RESET_DEVICE 1
|
| 232 | #define SG_SCSI_RESET_BUS 2
|
| 233 | #define SG_SCSI_RESET_HOST 3
|
| 234 | #define SG_SCSI_RESET_TARGET 4
|
| 235 | #define SG_SCSI_RESET_NO_ESCALATE 0x100
|
| 236 |
|
| 237 |
|
| 238 | #define SG_IO 0x2285
|
| 239 |
|
| 240 | #define SG_GET_REQUEST_TABLE 0x2286
|
| 241 |
|
| 242 |
|
| 243 | #define SG_SET_KEEP_ORPHAN 0x2287
|
| 244 | #define SG_GET_KEEP_ORPHAN 0x2288
|
| 245 |
|
| 246 |
|
| 247 | #define SG_GET_ACCESS_COUNT 0x2289
|
| 248 |
|
| 249 |
|
| 250 | #define SG_SCATTER_SZ (8 * 4096)
|
| 251 | |
| 252 | The value used by the driver is 'max(SG_SCATTER_SZ, PAGE_SIZE)'.
|
| 253 | This value should be a power of 2 (and may be rounded up internally).
|
| 254 | If scatter-gather is not supported by adapter then this value is the
|
| 255 | largest data block that can be read/written by a single scsi command.
|
| 256 |
|
| 257 | #define SG_DEFAULT_RETRIES 0
|
| 258 |
|
| 259 |
|
| 260 | #define SG_DEF_FORCE_PACK_ID 0
|
| 261 | #define SG_DEF_KEEP_ORPHAN 0
|
| 262 | #define SG_DEF_RESERVED_SIZE SG_SCATTER_SZ
|
| 263 |
|
| 264 |
|
| 265 | #define SG_MAX_QUEUE 16
|
| 266 |
|
| 267 | #define SG_BIG_BUFF SG_DEF_RESERVED_SIZE
|
| 268 |
|
| 269 |
|
| 270 | typedef struct sg_io_hdr Sg_io_hdr;
|
| 271 | typedef struct sg_io_vec Sg_io_vec;
|
| 272 | typedef struct sg_scsi_id Sg_scsi_id;
|
| 273 | typedef struct sg_req_info Sg_req_info;
|
| 274 |
|
| 275 |
|
| 276 |
|
| 277 |
|
| 278 |
|
| 279 |
|
| 280 | #define SG_MAX_SENSE 16
|
| 281 |
|
| 282 | struct sg_header
|
| 283 | {
|
| 284 | int pack_len;
|
| 285 | int reply_len;
|
| 286 | int pack_id;
|
| 287 | int result;
|
| 288 | unsigned int twelve_byte:1;
|
| 289 |
|
| 290 | unsigned int target_status:5;
|
| 291 | unsigned int host_status:8;
|
| 292 | unsigned int driver_status:8;
|
| 293 | unsigned int other_flags:10;
|
| 294 | unsigned char sense_buffer[SG_MAX_SENSE]; |
| 295 | when target_status is CHECK_CONDITION or
|
| 296 | when target_status is COMMAND_TERMINATED or
|
| 297 | when (driver_status & DRIVER_SENSE) is true.
|
| 298 | };
|
| 299 |
|
| 300 |
|
| 301 | |
| 302 | interface is used. They are kept for backward compatibility with
|
| 303 | the original and version 2 drivers.
|
| 304 |
|
| 305 | #define SG_SET_TIMEOUT 0x2201
|
| 306 | #define SG_GET_TIMEOUT 0x2202
|
| 307 |
|
| 308 | |
| 309 | Each time a sg_io_hdr_t object is seen on this file descriptor, this
|
| 310 | command queuing flag is set on (overriding the previous setting).
|
| 311 | #define SG_GET_COMMAND_Q 0x2270
|
| 312 | #define SG_SET_COMMAND_Q 0x2271
|
| 313 |
|
| 314 | |
| 315 | Try using: "# cat /proc/scsi/sg/debug" instead in the v3 driver
|
| 316 | #define SG_SET_DEBUG 0x227e
|
| 317 |
|
| 318 | #define SG_NEXT_CMD_LEN 0x2283 |
| 319 | number on the next write() on this file descriptor
|
| 320 |
|
| 321 |
|
| 322 |
|
| 323 | #ifdef __KERNEL__
|
| 324 | #define SG_DEFAULT_TIMEOUT_USER (60*USER_HZ)
|
| 325 | #else
|
| 326 | #define SG_DEFAULT_TIMEOUT (60*HZ)
|
| 327 | #endif
|
| 328 |
|
| 329 | #define SG_DEF_COMMAND_Q 0 |
| 330 | the new interface is used
|
| 331 | #define SG_DEF_UNDERRUN_FLAG 0
|
| 332 |
|
| 333 | #endif
|