blob: 3d9a829b29687b1d61c811dbc569072363003337 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
|
/*
* HISTORY
* $Log: scsi_all.h,v $
* Revision 1.1.1.1 1993/06/12 14:57:27 rgrimes
* Initial import, 0.1 + pk 0.2.4-B1
*
* Revision 1.2 1992/11/20 23:07:13 julian
* add a definition for device type T_NODEVICE
*
* Revision 1.1 1992/09/26 22:14:02 julian
* Initial revision
*
*
*/
/*
* SCSI general interface description
*/
/*
* Largely written by Julian Elischer (julian@tfs.com)
* for TRW Financial Systems.
*
* TRW Financial Systems, in accordance with their agreement with Carnegie
* Mellon University, makes this software available to CMU to distribute
* or use in any manner that they see fit as long as this message is kept with
* the software. For this reason TFS also grants any other persons or
* organisations permission to use or modify this software.
*
* TFS supplies this software to be publicly redistributed
* on the understanding that TFS is not responsible for the correct
* functioning of this software in any circumstances.
*
*/
/*
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
*/
/*
* SCSI command format
*/
struct scsi_generic
{
u_char opcode;
u_char bytes[11];
};
struct scsi_test_unit_ready
{
u_char op_code;
u_char :5;
u_char lun:3;
u_char unused[3];
u_char link:1;
u_char flag:4;
u_char :3;
};
struct scsi_send_diag
{
u_char op_code;
u_char uol:1;
u_char dol:1;
u_char selftest:1;
u_char :1;
u_char pf:1;
u_char lun:3;
u_char unused[1];
u_char paramlen[2];
u_char link:1;
u_char flag:4;
u_char :3;
};
struct scsi_sense
{
u_char op_code;
u_char :5;
u_char lun:3;
u_char unused[2];
u_char length;
u_char link:1;
u_char flag:1;
u_char :6;
};
struct scsi_inquiry
{
u_char op_code;
u_char :5;
u_char lun:3;
u_char unused[2];
u_char length;
u_char link:1;
u_char flag:1;
u_char :6;
};
struct scsi_mode_sense
{
u_char op_code;
u_char :3;
u_char dbd:1;
u_char rsvd:1;
u_char lun:3;
u_char page_code:6;
u_char page_ctrl:2;
u_char unused;
u_char length;
u_char link:1;
u_char flag:1;
u_char :6;
};
struct scsi_mode_sense_big
{
u_char op_code;
u_char :3;
u_char dbd:1;
u_char rsvd:1;
u_char lun:3;
u_char page_code:6;
u_char page_ctrl:2;
u_char unused[4];
u_char length[2];
u_char link:1;
u_char flag:1;
u_char :6;
};
struct scsi_mode_select
{
u_char op_code;
u_char sp:1;
u_char :3;
u_char pf:1;
u_char lun:3;
u_char unused[2];
u_char length;
u_char link:1;
u_char flag:1;
u_char :6;
};
struct scsi_mode_select_big
{
u_char op_code;
u_char sp:1;
u_char :3;
u_char pf:1;
u_char lun:3;
u_char unused[5];
u_char length[2];
u_char link:1;
u_char flag:1;
u_char :6;
};
struct scsi_reserve
{
u_char op_code;
u_char :5;
u_char lun:3;
u_char unused[2];
u_char length;
u_char link:1;
u_char flag:1;
u_char :6;
};
struct scsi_release
{
u_char op_code;
u_char :5;
u_char lun:3;
u_char unused[2];
u_char length;
u_char link:1;
u_char flag:1;
u_char :6;
};
struct scsi_prevent
{
u_char op_code;
u_char :5;
u_char lun:3;
u_char unused[2];
u_char prevent:1;
u_char :7;
u_char link:1;
u_char flag:1;
u_char :6;
};
#define PR_PREVENT 1
#define PR_ALLOW 0
/*
* Opcodes
*/
#define TEST_UNIT_READY 0x00
#define REQUEST_SENSE 0x03
#define INQUIRY 0x12
#define MODE_SELECT 0x15
#define MODE_SENSE 0x1a
#define START_STOP 0x1b
#define RESERVE 0x16
#define RELEASE 0x17
#define PREVENT_ALLOW 0x1e
#define POSITION_TO_ELEMENT 0x2b
#define MODE_SENSE_BIG 0x54
#define MODE_SELECT_BIG 0x55
#define MOVE_MEDIUM 0xa5
#define READ_ELEMENT_STATUS 0xb8
/*
* sense data format
*/
#define T_DIRECT 0
#define T_SEQUENTIAL 1
#define T_PRINTER 2
#define T_PROCESSOR 3
#define T_WORM 4
#define T_READONLY 5
#define T_SCANNER 6
#define T_OPTICAL 7
#define T_NODEVICE 0x1F
#define T_CHANGER 8
#define T_COMM 9
#define T_REMOV 1
#define T_FIXED 0
struct scsi_inquiry_data
{
u_char device_type:5;
u_char device_qualifier:3;
u_char dev_qual2:7;
u_char removable:1;
u_char ansii_version:3;
u_char :5;
u_char response_format;
u_char additional_length;
u_char unused[2];
u_char :3;
u_char can_link:1;
u_char can_sync:1;
u_char :3;
char vendor[8];
char product[16];
char revision[4];
u_char extra[8];
};
struct scsi_sense_data
{
u_char error_code:4;
u_char error_class:3;
u_char valid:1;
union
{
struct
{
u_char blockhi:5;
u_char vendor:3;
u_char blockmed;
u_char blocklow;
} unextended;
struct
{
u_char segment;
u_char sense_key:4;
u_char :1;
u_char ili:1;
u_char eom:1;
u_char filemark:1;
u_char info[4];
u_char extra_len;
/* allocate enough room to hold new stuff
u_char cmd_spec_info[4];
u_char add_sense_code;
u_char add_sense_code_qual;
u_char fru;
u_char sense_key_spec_1:7;
u_char sksv:1;
u_char sense_key_spec_2;
u_char sense_key_spec_3;
( by increasing 16 to 26 below) */
u_char extra_bytes[26];
} extended;
}ext;
};
struct scsi_sense_data_new
{
u_char error_code:7;
u_char valid:1;
union
{
struct
{
u_char blockhi:5;
u_char vendor:3;
u_char blockmed;
u_char blocklow;
} unextended;
struct
{
u_char segment;
u_char sense_key:4;
u_char :1;
u_char ili:1;
u_char eom:1;
u_char filemark:1;
u_char info[4];
u_char extra_len;
u_char cmd_spec_info[4];
u_char add_sense_code;
u_char add_sense_code_qual;
u_char fru;
u_char sense_key_spec_1:7;
u_char sksv:1;
u_char sense_key_spec_2;
u_char sense_key_spec_3;
u_char extra_bytes[16];
} extended;
}ext;
};
struct blk_desc
{
u_char density;
u_char nblocks[3];
u_char reserved;
u_char blklen[3];
};
struct scsi_mode_header
{
u_char data_length; /* Sense data length */
u_char medium_type;
u_char dev_spec;
u_char blk_desc_len;
};
struct scsi_mode_header_big
{
u_char data_length[2]; /* Sense data length */
u_char medium_type;
u_char dev_spec;
u_char unused[2];
u_char blk_desc_len[2];
};
/*
* Status Byte
*/
#define SCSI_OK 0x00
#define SCSI_CHECK 0x02
#define SCSI_BUSY 0x08
#define SCSI_INTERM 0x10
|