1
2
3
4
5
6#ifndef _SCSI_SCSI_H
7#define _SCSI_SCSI_H
8
9#include <linux/types.h>
10#include <linux/scatterlist.h>
11#include <linux/kernel.h>
12#include <scsi/scsi_common.h>
13#include <scsi/scsi_proto.h>
14#include <scsi/scsi_status.h>
15
16struct scsi_cmnd;
17
18enum scsi_timeouts {
19 SCSI_DEFAULT_EH_TIMEOUT = 10 * HZ,
20};
21
22
23
24
25
26#define SCSI_MAX_PROT_SG_SEGMENTS 0xFFFF
27
28
29
30
31
32#define SCAN_WILD_CARD ~0
33
34
35
36
37
38struct ccs_modesel_head {
39 __u8 _r1;
40 __u8 medium;
41 __u8 _r2;
42 __u8 block_desc_length;
43 __u8 density;
44 __u8 number_blocks_hi;
45 __u8 number_blocks_med;
46 __u8 number_blocks_lo;
47 __u8 _r3;
48 __u8 block_length_hi;
49 __u8 block_length_med;
50 __u8 block_length_lo;
51};
52
53
54
55
56#define SCSI_W_LUN_BASE 0xc100
57#define SCSI_W_LUN_REPORT_LUNS (SCSI_W_LUN_BASE + 1)
58#define SCSI_W_LUN_ACCESS_CONTROL (SCSI_W_LUN_BASE + 2)
59#define SCSI_W_LUN_TARGET_LOG_PAGE (SCSI_W_LUN_BASE + 3)
60
61static inline int scsi_is_wlun(u64 lun)
62{
63 return (lun & 0xff00) == SCSI_W_LUN_BASE;
64}
65
66
67
68
69
70
71
72
73
74static inline int scsi_status_is_check_condition(int status)
75{
76 if (status < 0)
77 return false;
78 status &= 0xfe;
79 return status == SAM_STAT_CHECK_CONDITION;
80}
81
82
83
84
85#define EXTENDED_MODIFY_DATA_POINTER 0x00
86#define EXTENDED_SDTR 0x01
87#define EXTENDED_EXTENDED_IDENTIFY 0x02
88#define EXTENDED_WDTR 0x03
89#define EXTENDED_PPR 0x04
90#define EXTENDED_MODIFY_BIDI_DATA_PTR 0x05
91
92
93
94
95enum scsi_disposition {
96 NEEDS_RETRY = 0x2001,
97 SUCCESS = 0x2002,
98 FAILED = 0x2003,
99 QUEUED = 0x2004,
100 SOFT_ERROR = 0x2005,
101 ADD_TO_MLQUEUE = 0x2006,
102 TIMEOUT_ERROR = 0x2007,
103 SCSI_RETURN_NOT_HANDLED = 0x2008,
104 FAST_IO_FAIL = 0x2009,
105};
106
107
108
109
110#define SCSI_MLQUEUE_HOST_BUSY 0x1055
111#define SCSI_MLQUEUE_DEVICE_BUSY 0x1056
112#define SCSI_MLQUEUE_EH_RETRY 0x1057
113#define SCSI_MLQUEUE_TARGET_BUSY 0x1058
114
115
116
117
118
119
120
121
122
123
124#define host_byte(result) (((result) >> 16) & 0xff)
125
126#define sense_class(sense) (((sense) >> 4) & 0x7)
127#define sense_error(sense) ((sense) & 0xf)
128#define sense_valid(sense) ((sense) & 0x80)
129
130
131
132
133#define FORMAT_UNIT_TIMEOUT (2 * 60 * 60 * HZ)
134#define START_STOP_TIMEOUT (60 * HZ)
135#define MOVE_MEDIUM_TIMEOUT (5 * 60 * HZ)
136#define READ_ELEMENT_STATUS_TIMEOUT (5 * 60 * HZ)
137#define READ_DEFECT_DATA_TIMEOUT (60 * HZ )
138
139
140#define IDENTIFY_BASE 0x80
141#define IDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\
142 ((can_disconnect) ? 0x40 : 0) |\
143 ((lun) & 0x07))
144
145
146
147
148
149
150
151
152#define SCSI_UNKNOWN 0
153#define SCSI_1 1
154#define SCSI_1_CCS 2
155#define SCSI_2 3
156#define SCSI_3 4
157#define SCSI_SPC_2 5
158#define SCSI_SPC_3 6
159
160
161
162
163#define SCSI_INQ_PQ_CON 0x00
164#define SCSI_INQ_PQ_NOT_CON 0x01
165#define SCSI_INQ_PQ_NOT_CAP 0x03
166
167
168
169
170
171
172
173
174
175#define SCSI_IOCTL_GET_IDLUN 0x5382
176
177
178
179
180#define SCSI_IOCTL_PROBE_HOST 0x5385
181
182
183#define SCSI_IOCTL_GET_BUS_NUMBER 0x5386
184
185
186#define SCSI_IOCTL_GET_PCI 0x5387
187
188
189
190
191
192
193
194
195
196static inline bool scsi_status_is_good(int status)
197{
198 if (status < 0)
199 return false;
200
201 if (host_byte(status) == DID_NO_CONNECT)
202 return false;
203
204
205
206
207
208
209 status &= 0xfe;
210 return ((status == SAM_STAT_GOOD) ||
211 (status == SAM_STAT_CONDITION_MET) ||
212
213 (status == SAM_STAT_INTERMEDIATE) ||
214 (status == SAM_STAT_INTERMEDIATE_CONDITION_MET) ||
215
216 (status == SAM_STAT_COMMAND_TERMINATED));
217}
218
219#endif
220