1
2
3
4
5
6
7
8#ifndef _SCSI_SCSI_H
9#define _SCSI_SCSI_H
10
11#include <linux/types.h>
12#include <scsi/scsi_cmnd.h>
13
14
15
16
17
18
19
20
21#define SCSI_MAX_SG_SEGMENTS 128
22
23
24
25
26
27#ifdef ARCH_HAS_SG_CHAIN
28#define SCSI_MAX_SG_CHAIN_SEGMENTS 2048
29#else
30#define SCSI_MAX_SG_CHAIN_SEGMENTS SCSI_MAX_SG_SEGMENTS
31#endif
32
33
34
35
36
37#define SCAN_WILD_CARD ~0
38
39
40
41
42
43#define TEST_UNIT_READY 0x00
44#define REZERO_UNIT 0x01
45#define REQUEST_SENSE 0x03
46#define FORMAT_UNIT 0x04
47#define READ_BLOCK_LIMITS 0x05
48#define REASSIGN_BLOCKS 0x07
49#define INITIALIZE_ELEMENT_STATUS 0x07
50#define READ_6 0x08
51#define WRITE_6 0x0a
52#define SEEK_6 0x0b
53#define READ_REVERSE 0x0f
54#define WRITE_FILEMARKS 0x10
55#define SPACE 0x11
56#define INQUIRY 0x12
57#define RECOVER_BUFFERED_DATA 0x14
58#define MODE_SELECT 0x15
59#define RESERVE 0x16
60#define RELEASE 0x17
61#define COPY 0x18
62#define ERASE 0x19
63#define MODE_SENSE 0x1a
64#define START_STOP 0x1b
65#define RECEIVE_DIAGNOSTIC 0x1c
66#define SEND_DIAGNOSTIC 0x1d
67#define ALLOW_MEDIUM_REMOVAL 0x1e
68
69#define SET_WINDOW 0x24
70#define READ_CAPACITY 0x25
71#define READ_10 0x28
72#define WRITE_10 0x2a
73#define SEEK_10 0x2b
74#define POSITION_TO_ELEMENT 0x2b
75#define WRITE_VERIFY 0x2e
76#define VERIFY 0x2f
77#define SEARCH_HIGH 0x30
78#define SEARCH_EQUAL 0x31
79#define SEARCH_LOW 0x32
80#define SET_LIMITS 0x33
81#define PRE_FETCH 0x34
82#define READ_POSITION 0x34
83#define SYNCHRONIZE_CACHE 0x35
84#define LOCK_UNLOCK_CACHE 0x36
85#define READ_DEFECT_DATA 0x37
86#define MEDIUM_SCAN 0x38
87#define COMPARE 0x39
88#define COPY_VERIFY 0x3a
89#define WRITE_BUFFER 0x3b
90#define READ_BUFFER 0x3c
91#define UPDATE_BLOCK 0x3d
92#define READ_LONG 0x3e
93#define WRITE_LONG 0x3f
94#define CHANGE_DEFINITION 0x40
95#define WRITE_SAME 0x41
96#define READ_TOC 0x43
97#define LOG_SELECT 0x4c
98#define LOG_SENSE 0x4d
99#define XDWRITEREAD_10 0x53
100#define MODE_SELECT_10 0x55
101#define RESERVE_10 0x56
102#define RELEASE_10 0x57
103#define MODE_SENSE_10 0x5a
104#define PERSISTENT_RESERVE_IN 0x5e
105#define PERSISTENT_RESERVE_OUT 0x5f
106#define VARIABLE_LENGTH_CMD 0x7f
107#define REPORT_LUNS 0xa0
108#define MAINTENANCE_IN 0xa3
109#define MAINTENANCE_OUT 0xa4
110#define MOVE_MEDIUM 0xa5
111#define EXCHANGE_MEDIUM 0xa6
112#define READ_12 0xa8
113#define WRITE_12 0xaa
114#define WRITE_VERIFY_12 0xae
115#define SEARCH_HIGH_12 0xb0
116#define SEARCH_EQUAL_12 0xb1
117#define SEARCH_LOW_12 0xb2
118#define READ_ELEMENT_STATUS 0xb8
119#define SEND_VOLUME_TAG 0xb6
120#define WRITE_LONG_2 0xea
121#define READ_16 0x88
122#define WRITE_16 0x8a
123#define VERIFY_16 0x8f
124#define SERVICE_ACTION_IN 0x9e
125
126#define SAI_READ_CAPACITY_16 0x10
127
128#define MI_REPORT_TARGET_PGS 0x0a
129
130#define MO_SET_TARGET_PGS 0x0a
131
132
133#define ATA_16 0x85
134#define ATA_12 0xa1
135
136
137
138
139
140#define SCSI_MAX_VARLEN_CDB_SIZE 260
141
142
143struct scsi_varlen_cdb_hdr {
144 u8 opcode;
145 u8 control;
146 u8 misc[5];
147 u8 additional_cdb_length;
148 __be16 service_action;
149
150};
151
152static inline unsigned
153scsi_varlen_cdb_length(const void *hdr)
154{
155 return ((struct scsi_varlen_cdb_hdr *)hdr)->additional_cdb_length + 8;
156}
157
158extern const unsigned char scsi_command_size_tbl[8];
159#define COMMAND_SIZE(opcode) scsi_command_size_tbl[((opcode) >> 5) & 7]
160
161static inline unsigned
162scsi_command_size(const unsigned char *cmnd)
163{
164 return (cmnd[0] == VARIABLE_LENGTH_CMD) ?
165 scsi_varlen_cdb_length(cmnd) : COMMAND_SIZE(cmnd[0]);
166}
167
168
169
170
171
172#define SAM_STAT_GOOD 0x00
173#define SAM_STAT_CHECK_CONDITION 0x02
174#define SAM_STAT_CONDITION_MET 0x04
175#define SAM_STAT_BUSY 0x08
176#define SAM_STAT_INTERMEDIATE 0x10
177#define SAM_STAT_INTERMEDIATE_CONDITION_MET 0x14
178#define SAM_STAT_RESERVATION_CONFLICT 0x18
179#define SAM_STAT_COMMAND_TERMINATED 0x22
180#define SAM_STAT_TASK_SET_FULL 0x28
181#define SAM_STAT_ACA_ACTIVE 0x30
182#define SAM_STAT_TASK_ABORTED 0x40
183
184
185
186
187
188
189
190
191
192static inline int scsi_status_is_good(int status)
193{
194
195
196
197
198
199 status &= 0xfe;
200 return ((status == SAM_STAT_GOOD) ||
201 (status == SAM_STAT_INTERMEDIATE) ||
202 (status == SAM_STAT_INTERMEDIATE_CONDITION_MET) ||
203
204 (status == SAM_STAT_COMMAND_TERMINATED));
205}
206
207
208
209
210
211
212
213
214#define GOOD 0x00
215#define CHECK_CONDITION 0x01
216#define CONDITION_GOOD 0x02
217#define BUSY 0x04
218#define INTERMEDIATE_GOOD 0x08
219#define INTERMEDIATE_C_GOOD 0x0a
220#define RESERVATION_CONFLICT 0x0c
221#define COMMAND_TERMINATED 0x11
222#define QUEUE_FULL 0x14
223#define ACA_ACTIVE 0x18
224#define TASK_ABORTED 0x20
225
226#define STATUS_MASK 0xfe
227
228
229
230
231
232#define NO_SENSE 0x00
233#define RECOVERED_ERROR 0x01
234#define NOT_READY 0x02
235#define MEDIUM_ERROR 0x03
236#define HARDWARE_ERROR 0x04
237#define ILLEGAL_REQUEST 0x05
238#define UNIT_ATTENTION 0x06
239#define DATA_PROTECT 0x07
240#define BLANK_CHECK 0x08
241#define COPY_ABORTED 0x0a
242#define ABORTED_COMMAND 0x0b
243#define VOLUME_OVERFLOW 0x0d
244#define MISCOMPARE 0x0e
245
246
247
248
249
250
251
252#define TYPE_DISK 0x00
253#define TYPE_TAPE 0x01
254#define TYPE_PRINTER 0x02
255#define TYPE_PROCESSOR 0x03
256#define TYPE_WORM 0x04
257#define TYPE_ROM 0x05
258#define TYPE_SCANNER 0x06
259#define TYPE_MOD 0x07
260
261#define TYPE_MEDIUM_CHANGER 0x08
262#define TYPE_COMM 0x09
263#define TYPE_RAID 0x0c
264#define TYPE_ENCLOSURE 0x0d
265#define TYPE_RBC 0x0e
266#define TYPE_NO_LUN 0x7f
267
268
269enum scsi_protocol {
270 SCSI_PROTOCOL_FCP = 0,
271 SCSI_PROTOCOL_SPI = 1,
272 SCSI_PROTOCOL_SSA = 2,
273 SCSI_PROTOCOL_SBP = 3,
274 SCSI_PROTOCOL_SRP = 4,
275 SCSI_PROTOCOL_ISCSI = 5,
276 SCSI_PROTOCOL_SAS = 6,
277 SCSI_PROTOCOL_ADT = 7,
278 SCSI_PROTOCOL_ATA = 8,
279 SCSI_PROTOCOL_UNSPEC = 0xf,
280};
281
282
283extern const char * scsi_device_type(unsigned type);
284
285
286
287
288
289struct ccs_modesel_head {
290 __u8 _r1;
291 __u8 medium;
292 __u8 _r2;
293 __u8 block_desc_length;
294 __u8 density;
295 __u8 number_blocks_hi;
296 __u8 number_blocks_med;
297 __u8 number_blocks_lo;
298 __u8 _r3;
299 __u8 block_length_hi;
300 __u8 block_length_med;
301 __u8 block_length_lo;
302};
303
304
305
306
307struct scsi_lun {
308 __u8 scsi_lun[8];
309};
310
311
312
313
314#define SCSI_W_LUN_BASE 0xc100
315#define SCSI_W_LUN_REPORT_LUNS (SCSI_W_LUN_BASE + 1)
316#define SCSI_W_LUN_ACCESS_CONTROL (SCSI_W_LUN_BASE + 2)
317#define SCSI_W_LUN_TARGET_LOG_PAGE (SCSI_W_LUN_BASE + 3)
318
319static inline int scsi_is_wlun(unsigned int lun)
320{
321 return (lun & 0xff00) == SCSI_W_LUN_BASE;
322}
323
324
325
326
327
328
329#define COMMAND_COMPLETE 0x00
330#define EXTENDED_MESSAGE 0x01
331#define EXTENDED_MODIFY_DATA_POINTER 0x00
332#define EXTENDED_SDTR 0x01
333#define EXTENDED_EXTENDED_IDENTIFY 0x02
334#define EXTENDED_WDTR 0x03
335#define EXTENDED_PPR 0x04
336#define EXTENDED_MODIFY_BIDI_DATA_PTR 0x05
337#define SAVE_POINTERS 0x02
338#define RESTORE_POINTERS 0x03
339#define DISCONNECT 0x04
340#define INITIATOR_ERROR 0x05
341#define ABORT_TASK_SET 0x06
342#define MESSAGE_REJECT 0x07
343#define NOP 0x08
344#define MSG_PARITY_ERROR 0x09
345#define LINKED_CMD_COMPLETE 0x0a
346#define LINKED_FLG_CMD_COMPLETE 0x0b
347#define TARGET_RESET 0x0c
348#define ABORT_TASK 0x0d
349#define CLEAR_TASK_SET 0x0e
350#define INITIATE_RECOVERY 0x0f
351#define RELEASE_RECOVERY 0x10
352#define CLEAR_ACA 0x16
353#define LOGICAL_UNIT_RESET 0x17
354#define SIMPLE_QUEUE_TAG 0x20
355#define HEAD_OF_QUEUE_TAG 0x21
356#define ORDERED_QUEUE_TAG 0x22
357#define IGNORE_WIDE_RESIDUE 0x23
358#define ACA 0x24
359#define QAS_REQUEST 0x55
360
361
362#define BUS_DEVICE_RESET TARGET_RESET
363#define ABORT ABORT_TASK_SET
364
365
366
367
368
369#define DID_OK 0x00
370#define DID_NO_CONNECT 0x01
371#define DID_BUS_BUSY 0x02
372#define DID_TIME_OUT 0x03
373#define DID_BAD_TARGET 0x04
374#define DID_ABORT 0x05
375#define DID_PARITY 0x06
376#define DID_ERROR 0x07
377#define DID_RESET 0x08
378#define DID_BAD_INTR 0x09
379#define DID_PASSTHROUGH 0x0a
380#define DID_SOFT_ERROR 0x0b
381#define DID_IMM_RETRY 0x0c
382#define DID_REQUEUE 0x0d
383
384#define DID_TRANSPORT_DISRUPTED 0x0e
385
386
387
388#define DID_TRANSPORT_FAILFAST 0x0f
389#define DRIVER_OK 0x00
390
391
392
393
394
395#define DRIVER_BUSY 0x01
396#define DRIVER_SOFT 0x02
397#define DRIVER_MEDIA 0x03
398#define DRIVER_ERROR 0x04
399
400#define DRIVER_INVALID 0x05
401#define DRIVER_TIMEOUT 0x06
402#define DRIVER_HARD 0x07
403#define DRIVER_SENSE 0x08
404
405#define SUGGEST_RETRY 0x10
406#define SUGGEST_ABORT 0x20
407#define SUGGEST_REMAP 0x30
408#define SUGGEST_DIE 0x40
409#define SUGGEST_SENSE 0x80
410#define SUGGEST_IS_OK 0xff
411
412#define DRIVER_MASK 0x0f
413#define SUGGEST_MASK 0xf0
414
415
416
417
418
419#define NEEDS_RETRY 0x2001
420#define SUCCESS 0x2002
421#define FAILED 0x2003
422#define QUEUED 0x2004
423#define SOFT_ERROR 0x2005
424#define ADD_TO_MLQUEUE 0x2006
425#define TIMEOUT_ERROR 0x2007
426#define SCSI_RETURN_NOT_HANDLED 0x2008
427
428
429
430
431#define SCSI_MLQUEUE_HOST_BUSY 0x1055
432#define SCSI_MLQUEUE_DEVICE_BUSY 0x1056
433#define SCSI_MLQUEUE_EH_RETRY 0x1057
434#define SCSI_MLQUEUE_TARGET_BUSY 0x1058
435
436
437
438
439
440
441
442
443
444
445
446#define status_byte(result) (((result) >> 1) & 0x7f)
447#define msg_byte(result) (((result) >> 8) & 0xff)
448#define host_byte(result) (((result) >> 16) & 0xff)
449#define driver_byte(result) (((result) >> 24) & 0xff)
450#define suggestion(result) (driver_byte(result) & SUGGEST_MASK)
451
452static inline void set_msg_byte(struct scsi_cmnd *cmd, char status)
453{
454 cmd->result |= status << 8;
455}
456
457static inline void set_host_byte(struct scsi_cmnd *cmd, char status)
458{
459 cmd->result |= status << 16;
460}
461
462static inline void set_driver_byte(struct scsi_cmnd *cmd, char status)
463{
464 cmd->result |= status << 24;
465}
466
467
468#define sense_class(sense) (((sense) >> 4) & 0x7)
469#define sense_error(sense) ((sense) & 0xf)
470#define sense_valid(sense) ((sense) & 0x80);
471
472
473
474
475#define FORMAT_UNIT_TIMEOUT (2 * 60 * 60 * HZ)
476#define START_STOP_TIMEOUT (60 * HZ)
477#define MOVE_MEDIUM_TIMEOUT (5 * 60 * HZ)
478#define READ_ELEMENT_STATUS_TIMEOUT (5 * 60 * HZ)
479#define READ_DEFECT_DATA_TIMEOUT (60 * HZ )
480
481
482#define IDENTIFY_BASE 0x80
483#define IDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\
484 ((can_disconnect) ? 0x40 : 0) |\
485 ((lun) & 0x07))
486
487
488
489
490
491
492
493
494#define SCSI_UNKNOWN 0
495#define SCSI_1 1
496#define SCSI_1_CCS 2
497#define SCSI_2 3
498#define SCSI_3 4
499#define SCSI_SPC_2 5
500#define SCSI_SPC_3 6
501
502
503
504
505#define SCSI_INQ_PQ_CON 0x00
506#define SCSI_INQ_PQ_NOT_CON 0x01
507#define SCSI_INQ_PQ_NOT_CAP 0x03
508
509
510
511
512
513
514
515
516
517#define SCSI_IOCTL_GET_IDLUN 0x5382
518
519
520
521
522#define SCSI_IOCTL_PROBE_HOST 0x5385
523
524
525#define SCSI_IOCTL_GET_BUS_NUMBER 0x5386
526
527
528#define SCSI_IOCTL_GET_PCI 0x5387
529
530
531static inline __u32 scsi_to_u32(__u8 *ptr)
532{
533 return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3];
534}
535
536#endif
537