LSI/MPT target driver added
[mirror/scst/.git] / mpt / scsi3.h
1 /*
2  *  linux/drivers/message/fusion/scsi3.h
3  *      SCSI-3 definitions and macros.
4  *      (Ultimately) SCSI-3 definitions; for now, inheriting
5  *      SCSI-2 definitions.
6  *
7  *  Copyright (c) 1996-2004 Steven J. Ralston
8  *  Written By: Steven J. Ralston (19960517)
9  *  (mailto:sjralston1@netscape.net)
10  *  (mailto:mpt_linux_developer@lsil.com)
11  *
12  *  $Id: scst-0.9.5-lsi-2.6.15.patch,v 1.1 2006/12/02 23:40:42 ehabbinga Exp $
13  */
14
15 #ifndef SCSI3_H_INCLUDED
16 #define SCSI3_H_INCLUDED
17 /***************************************************************************/
18
19 /****************************************************************************
20  *
21  *  Includes
22  */
23 #ifdef __KERNEL__
24 #include <linux/types.h>
25 #else
26     #ifndef U_STUFF_DEFINED
27     #define U_STUFF_DEFINED
28     typedef unsigned char u8;
29     typedef unsigned short u16;
30     typedef unsigned int u32;
31     #endif
32 #endif
33
34 /****************************************************************************
35  *
36  *  Defines
37  */
38
39 /*
40  *    SCSI Commands
41  */
42 #define CMD_TestUnitReady      0x00
43 #define CMD_RezeroUnit         0x01  /* direct-access devices */
44 #define CMD_Rewind             0x01  /* sequential-access devices */
45 #define CMD_RequestSense       0x03
46 #define CMD_FormatUnit         0x04
47 #define CMD_ReassignBlock      0x07
48 #define CMD_Read6              0x08
49 #define CMD_Write6             0x0A
50 #define CMD_WriteFilemark      0x10
51 #define CMD_Space              0x11
52 #define CMD_Inquiry            0x12
53 #define CMD_ModeSelect6        0x15
54 #define CMD_ModeSense6         0x1A
55 #define CMD_Reserve6           0x16
56 #define CMD_Release6           0x17
57 #define CMD_Erase              0x19
58 #define CMD_StartStopUnit      0x1B  /* direct-access devices */
59 #define CMD_LoadUnload         0x1B  /* sequential-access devices */
60 #define CMD_ReceiveDiagnostic  0x1C
61 #define CMD_SendDiagnostic     0x1D
62 #define CMD_ReadCapacity       0x25
63 #define CMD_Read10             0x28
64 #define CMD_Write10            0x2A
65 #define CMD_WriteVerify        0x2E
66 #define CMD_Verify             0x2F
67 #define CMD_SynchronizeCache   0x35
68 #define CMD_ReadDefectData     0x37
69 #define CMD_WriteBuffer        0x3B
70 #define CMD_ReadBuffer         0x3C
71 #define CMD_ReadLong           0x3E
72 #define CMD_WriteLong          0x3F
73 #define CMD_WriteSame          0x41
74 #define CMD_LogSelect          0x4C
75 #define CMD_LogSense           0x4D
76 #define CMD_ModeSelect10       0x55
77 #define CMD_Reserve10          0x56
78 #define CMD_Release10          0x57
79 #define CMD_ModeSense10        0x5A
80 #define CMD_PersistReserveIn   0x5E
81 #define CMD_PersistReserveOut  0x5F
82 #define CMD_Read16             0x88
83 #define CMD_Write16            0x8A
84 #define CMD_WriteVerify16      0x8E
85 #define CMD_WriteSame16        0x93
86 #define CMD_ServiceActionIn    0x9E
87 #define CMD_ServiceActionOut   0x9F
88 #define CMD_ReportLuns         0xA0
89 #define CMD_Read12             0xA8
90 #define CMD_Write12            0xAA
91 #define CMD_WriteVerify12      0xAE
92
93 /*
94  *    Control byte field
95  */
96 #define CONTROL_BYTE_NACA_BIT  0x04
97 #define CONTROL_BYTE_Flag_BIT  0x02
98 #define CONTROL_BYTE_Link_BIT  0x01
99
100 /*
101  *    SCSI Messages
102  */
103 #define MSG_COMPLETE             0x00
104 #define MSG_EXTENDED             0x01
105 #define MSG_SAVE_POINTERS        0x02
106 #define MSG_RESTORE_POINTERS     0x03
107 #define MSG_DISCONNECT           0x04
108 #define MSG_IDERROR              0x05
109 #define MSG_ABORT                0x06
110 #define MSG_REJECT               0x07
111 #define MSG_NOP                  0x08
112 #define MSG_PARITY_ERROR         0x09
113 #define MSG_LINKED_CMD_COMPLETE  0x0a
114 #define MSG_LCMD_COMPLETE_W_FLG  0x0b
115 #define MSG_BUS_DEVICE_RESET     0x0c
116 #define MSG_ABORT_TAG            0x0d
117 #define MSG_CLEAR_QUEUE          0x0e
118 #define MSG_INITIATE_RECOVERY    0x0f
119
120 #define MSG_RELEASE_RECOVRY      0x10
121 #define MSG_TERMINATE_IO         0x11
122
123 #define MSG_SIMPLE_QUEUE         0x20
124 #define MSG_HEAD_OF_QUEUE        0x21
125 #define MSG_ORDERED_QUEUE        0x22
126 #define MSG_IGNORE_WIDE_RESIDUE  0x23
127
128 #define MSG_IDENTIFY             0x80
129 #define MSG_IDENTIFY_W_DISC      0xc0
130
131 /*
132  *    SCSI Phases
133  */
134 #define PHS_DATA_OUT  0x00
135 #define PHS_DATA_IN   0x01
136 #define PHS_COMMAND   0x02
137 #define PHS_STATUS    0x03
138 #define PHS_MSG_OUT   0x06
139 #define PHS_MSG_IN    0x07
140
141 /*
142  *    Statuses
143  */
144 #define STS_GOOD                        0x00
145 #define STS_CHECK_CONDITION             0x02
146 #define STS_CONDITION_MET               0x04
147 #define STS_BUSY                        0x08
148 #define STS_INTERMEDIATE                0x10
149 #define STS_INTERMEDIATE_CONDITION_MET  0x14
150 #define STS_RESERVATION_CONFLICT        0x18
151 #define STS_COMMAND_TERMINATED          0x22
152 #define STS_TASK_SET_FULL               0x28
153 #define    STS_QUEUE_FULL               0x28
154 #define STS_ACA_ACTIVE                  0x30
155
156 #define STS_VALID_MASK                  0x3e
157
158 #define SCSI_STATUS(x)  ((x) & STS_VALID_MASK)
159
160 /*
161  *    SCSI QTag Types
162  */
163 #define QTAG_SIMPLE     0x20
164 #define QTAG_HEAD_OF_Q  0x21
165 #define QTAG_ORDERED    0x22
166
167 /*
168  *    SCSI Sense Key Definitons
169  */
170 #define SK_NO_SENSE         0x00
171 #define SK_RECOVERED_ERROR  0x01
172 #define SK_NOT_READY        0x02
173 #define SK_MEDIUM_ERROR     0x03
174 #define SK_HARDWARE_ERROR   0x04
175 #define SK_ILLEGAL_REQUEST  0x05
176 #define SK_UNIT_ATTENTION   0x06
177 #define SK_DATA_PROTECT     0x07
178 #define SK_BLANK_CHECK      0x08
179 #define SK_VENDOR_SPECIFIC  0x09
180 #define SK_COPY_ABORTED     0x0a
181 #define SK_ABORTED_COMMAND  0x0b
182 #define SK_EQUAL            0x0c
183 #define SK_VOLUME_OVERFLOW  0x0d
184 #define SK_MISCOMPARE       0x0e
185 #define SK_RESERVED         0x0f
186
187
188
189 #define SCSI_MAX_INQUIRY_BYTES  96
190 #define SCSI_STD_INQUIRY_BYTES  36
191
192 #undef USE_SCSI_COMPLETE_INQDATA
193 /*
194  *      Structure definition for SCSI Inquiry Data
195  *
196  *  NOTE: The following structure is 96 bytes in size
197  *      iff USE_SCSI_COMPLETE_INQDATA IS defined above (i.e. w/ "#define").
198  *      If USE_SCSI_COMPLETE_INQDATA is NOT defined above (i.e. w/ "#undef")
199  *      then the following structure is only 36 bytes in size.
200  *  THE CHOICE IS YOURS!
201  */
202 typedef struct SCSI_Inquiry_Data
203 {
204 #ifdef USE_SCSI_COMPLETE_INQDATA
205     u8   InqByte[SCSI_MAX_INQUIRY_BYTES];
206 #else
207     u8   InqByte[SCSI_STD_INQUIRY_BYTES];
208 #endif
209
210 /*
211  * the following structure works only for little-endian (Intel,
212  * LSB first (1234) byte order) systems with 4-byte ints.
213  *
214         u32    Periph_Device_Type    : 5,
215                Periph_Qualifier      : 3,
216                Device_Type_Modifier  : 7,
217                Removable_Media       : 1,
218                ANSI_Version          : 3,
219                ECMA_Version          : 3,
220                ISO_Version           : 2,
221                Response_Data_Format  : 4,
222                reserved_0            : 3,
223                AERC                  : 1  ;
224         u32    Additional_Length     : 8,
225                reserved_1            :16,
226                SftReset              : 1,
227                CmdQue                : 1,
228                reserved_2            : 1,
229                Linked                : 1,
230                Sync                  : 1,
231                WBus16                : 1,
232                WBus32                : 1,
233                RelAdr                : 1  ;
234         u8     Vendor_ID[8];
235         u8     Product_ID[16];
236         u8     Revision_Level [4];
237 #ifdef USE_SCSI_COMPLETE_INQDATA
238         u8     Vendor_Specific[20];
239         u8     reserved_3[40];
240 #endif
241  *
242  */
243
244 } SCSI_Inquiry_Data_t;
245
246 #define INQ_PERIPHINFO_BYTE            0
247 #define   INQ_Periph_Qualifier_MASK      0xe0
248 #define   INQ_Periph_Device_Type_MASK    0x1f
249
250 #define INQ_Peripheral_Qualifier(inqp) \
251     (int)((*((u8*)(inqp)+INQ_PERIPHINFO_BYTE) & INQ_Periph_Qualifier_MASK) >> 5)
252 #define INQ_Peripheral_Device_Type(inqp) \
253     (int)(*((u8*)(inqp)+INQ_PERIPHINFO_BYTE) & INQ_Periph_Device_Type_MASK)
254
255
256 #define INQ_DEVTYPEMOD_BYTE            1
257 #define   INQ_RMB_BIT                    0x80
258 #define   INQ_Device_Type_Modifier_MASK  0x7f
259
260 #define INQ_Removable_Medium(inqp) \
261     (int)(*((u8*)(inqp)+INQ_DEVTYPEMOD_BYTE) & INQ_RMB_BIT)
262 #define INQ_Device_Type_Modifier(inqp) \
263     (int)(*((u8*)(inqp)+INQ_DEVTYPEMOD_BYTE) & INQ_Device_Type_Modifier_MASK)
264
265
266 #define INQ_VERSIONINFO_BYTE           2
267 #define   INQ_ISO_Version_MASK           0xc0
268 #define   INQ_ECMA_Version_MASK          0x38
269 #define   INQ_ANSI_Version_MASK          0x07
270
271 #define INQ_ISO_Version(inqp) \
272     (int)(*((u8*)(inqp)+INQ_VERSIONINFO_BYTE) & INQ_ISO_Version_MASK)
273 #define INQ_ECMA_Version(inqp) \
274     (int)(*((u8*)(inqp)+INQ_VERSIONINFO_BYTE) & INQ_ECMA_Version_MASK)
275 #define INQ_ANSI_Version(inqp) \
276     (int)(*((u8*)(inqp)+INQ_VERSIONINFO_BYTE) & INQ_ANSI_Version_MASK)
277
278
279 #define INQ_BYTE3                      3
280 #define   INQ_AERC_BIT                   0x80
281 #define   INQ_TrmTsk_BIT                 0x40
282 #define   INQ_NormACA_BIT                0x20
283 #define   INQ_RDF_MASK                   0x0F
284
285 #define INQ_AER_Capable(inqp) \
286     (int)(*((u8*)(inqp)+INQ_BYTE3) & INQ_AERC_BIT)
287 #define INQ_TrmTsk(inqp) \
288     (int)(*((u8*)(inqp)+INQ_BYTE3) & INQ_TrmTsk_BIT)
289 #define INQ_NormACA(inqp) \
290     (int)(*((u8*)(inqp)+INQ_BYTE3) & INQ_NormACA_BIT)
291 #define INQ_Response_Data_Format(inqp) \
292     (int)(*((u8*)(inqp)+INQ_BYTE3) & INQ_RDF_MASK)
293
294
295 #define INQ_CAPABILITY_BYTE            7
296 #define   INQ_RelAdr_BIT                 0x80
297 #define   INQ_WBus32_BIT                 0x40
298 #define   INQ_WBus16_BIT                 0x20
299 #define   INQ_Sync_BIT                   0x10
300 #define   INQ_Linked_BIT                 0x08
301   /*      INQ_Reserved BIT               0x40 */
302 #define   INQ_CmdQue_BIT                 0x02
303 #define   INQ_SftRe_BIT                  0x01
304
305 #define IS_RelAdr_DEV(inqp) \
306     (int)(*((u8*)(inqp)+INQ_CAPABILITY_BYTE) & INQ_RelAdr_BIT)
307 #define IS_WBus32_DEV(inqp) \
308     (int)(*((u8*)(inqp)+INQ_CAPABILITY_BYTE) & INQ_WBus32_BIT)
309 #define IS_WBus16_DEV(inqp) \
310     (int)(*((u8*)(inqp)+INQ_CAPABILITY_BYTE) & INQ_WBus16_BIT)
311 #define IS_Sync_DEV(inqp) \
312     (int)(*((u8*)(inqp)+INQ_CAPABILITY_BYTE) & INQ_Sync_BIT)
313 #define IS_Linked_DEV(inqp) \
314     (int)(*((u8*)(inqp)+INQ_CAPABILITY_BYTE) & INQ_Linked_BIT)
315 #define IS_CmdQue_DEV(inqp) \
316     (int)(*((u8*)(inqp)+INQ_CAPABILITY_BYTE) & INQ_CmdQue_BIT)
317 #define IS_SftRe_DEV(inqp) \
318     (int)(*((u8*)(inqp)+INQ_CAPABILITY_BYTE) & INQ_SftRe_BIT)
319
320 #define INQ_Width_BITS \
321     (INQ_WBus32_BIT | INQ_WBus16_BIT)
322 #define IS_Wide_DEV(inqp) \
323     (int)(*((u8*)(inqp)+INQ_CAPABILITY_BYTE) & INQ_Width_BITS)
324
325
326 /*
327  *      SCSI peripheral device types
328  */
329 #define SCSI_TYPE_DAD               0x00  /* Direct Access Device */
330 #define SCSI_TYPE_SAD               0x01  /* Sequential Access Device */
331 #define SCSI_TYPE_TAPE  SCSI_TYPE_SAD
332 #define SCSI_TYPE_PRT               0x02  /* Printer */
333 #define SCSI_TYPE_PROC              0x03  /* Processor */
334 #define SCSI_TYPE_WORM              0x04
335 #define SCSI_TYPE_CDROM             0x05
336 #define SCSI_TYPE_SCAN              0x06  /* Scanner */
337 #define SCSI_TYPE_OPTICAL           0x07  /* Magneto/Optical */
338 #define SCSI_TYPE_CHANGER           0x08
339 #define SCSI_TYPE_COMM              0x09  /* Communications device */
340 #define SCSI_TYPE_UNKNOWN           0x1f
341 #define SCSI_TYPE_UNCONFIGURED_LUN  0x7f
342
343 #define SCSI_TYPE_MAX_KNOWN         SCSI_TYPE_COMM
344
345 /*
346  *      Peripheral Qualifiers
347  */
348 #define DEVICE_PRESENT     0x00
349 #define LUN_NOT_PRESENT    0x01
350 #define LUN_NOT_SUPPORTED  0x03
351
352 /*
353  *      ANSI Versions
354  */
355 #ifndef SCSI_1
356 #define SCSI_1  0x01
357 #endif
358 #ifndef SCSI_2
359 #define SCSI_2  0x02
360 #endif
361 #ifndef SCSI_3
362 #define SCSI_3  0x03
363 #endif
364
365
366 #define SCSI_MAX_SENSE_BYTES  255
367 #define SCSI_STD_SENSE_BYTES   18
368 #define SCSI_PAD_SENSE_BYTES      (SCSI_MAX_SENSE_BYTES - SCSI_STD_SENSE_BYTES)
369
370 #undef USE_SCSI_COMPLETE_SENSE
371 /*
372  *      Structure definition for SCSI Sense Data
373  *
374  *  NOTE: The following structure is 255 bytes in size
375  *      iiff USE_SCSI_COMPLETE_SENSE IS defined above (i.e. w/ "#define").
376  *      If USE_SCSI_COMPLETE_SENSE is NOT defined above (i.e. w/ "#undef")
377  *      then the following structure is only 19 bytes in size.
378  *  THE CHOICE IS YOURS!
379  *
380  */
381 typedef struct SCSI_Sense_Data
382 {
383 #ifdef USE_SCSI_COMPLETE_SENSE
384     u8       SenseByte[SCSI_MAX_SENSE_BYTES];
385 #else
386     u8       SenseByte[SCSI_STD_SENSE_BYTES];
387 #endif
388
389 /*
390  * the following structure works only for little-endian (Intel,
391  * LSB first (1234) byte order) systems with 4-byte ints.
392  *
393     u8     Error_Code                :4,            // 0x00
394            Error_Class               :3,
395            Valid                     :1
396      ;
397     u8     Segment_Number                           // 0x01
398      ;
399     u8     Sense_Key                 :4,            // 0x02
400            Reserved                  :1,
401            Incorrect_Length_Indicator:1,
402            End_Of_Media              :1,
403            Filemark                  :1
404      ;
405     u8     Information_MSB;                         // 0x03
406     u8     Information_Byte2;                       // 0x04
407     u8     Information_Byte1;                       // 0x05
408     u8     Information_LSB;                         // 0x06
409     u8     Additional_Length;                       // 0x07
410
411     u32    Command_Specific_Information;            // 0x08 - 0x0b
412
413     u8     Additional_Sense_Code;                   // 0x0c
414     u8     Additional_Sense_Code_Qualifier;         // 0x0d
415     u8     Field_Replaceable_Unit_Code;             // 0x0e
416     u8     Illegal_Req_Bit_Pointer   :3,            // 0x0f
417            Illegal_Req_Bit_Valid     :1,
418            Illegal_Req_Reserved      :2,
419            Illegal_Req_Cmd_Data      :1,
420            Sense_Key_Specific_Valid  :1
421      ;
422     u16    Sense_Key_Specific_Data;                 // 0x10 - 0x11
423
424 #ifdef USE_SCSI_COMPLETE_SENSE
425     u8     Additional_Sense_Data[SCSI_PAD_SENSE_BYTES];
426 #else
427     u8     Additional_Sense_Data[1];
428 #endif
429  *
430  */
431
432 } SCSI_Sense_Data_t;
433
434
435 #define SD_ERRCODE_BYTE                0
436 #define   SD_Valid_BIT                   0x80
437 #define   SD_Error_Code_MASK             0x7f
438 #define SD_Valid(sdp) \
439     (int)(*((u8*)(sdp)+SD_ERRCODE_BYTE) & SD_Valid_BIT)
440 #define SD_Error_Code(sdp) \
441     (int)(*((u8*)(sdp)+SD_ERRCODE_BYTE) & SD_Error_Code_MASK)
442
443
444 #define SD_SEGNUM_BYTE                 1
445 #define SD_Segment_Number(sdp)  (int)(*((u8*)(sdp)+SD_SEGNUM_BYTE))
446
447
448 #define SD_SENSEKEY_BYTE               2
449 #define   SD_Filemark_BIT                0x80
450 #define   SD_EOM_BIT                     0x40
451 #define   SD_ILI_BIT                     0x20
452 #define   SD_Sense_Key_MASK              0x0f
453 #define SD_Filemark(sdp) \
454     (int)(*((u8*)(sdp)+SD_SENSEKEY_BYTE) & SD_Filemark_BIT)
455 #define SD_EOM(sdp) \
456     (int)(*((u8*)(sdp)+SD_SENSEKEY_BYTE) & SD_EOM_BIT)
457 #define SD_ILI(sdp) \
458     (int)(*((u8*)(sdp)+SD_SENSEKEY_BYTE) & SD_ILI_BIT)
459 #define SD_Sense_Key(sdp) \
460     (int)(*((u8*)(sdp)+SD_SENSEKEY_BYTE) & SD_Sense_Key_MASK)
461
462
463 #define SD_INFO3_BYTE                  3
464 #define SD_INFO2_BYTE                  4
465 #define SD_INFO1_BYTE                  5
466 #define SD_INFO0_BYTE                  6
467 #define SD_Information3(sdp)  (int)(*((u8*)(sdp)+SD_INFO3_BYTE))
468 #define SD_Information2(sdp)  (int)(*((u8*)(sdp)+SD_INFO2_BYTE))
469 #define SD_Information1(sdp)  (int)(*((u8*)(sdp)+SD_INFO1_BYTE))
470 #define SD_Information0(sdp)  (int)(*((u8*)(sdp)+SD_INFO0_BYTE))
471
472
473 #define SD_ADDL_LEN_BYTE               7
474 #define SD_Additional_Sense_Length(sdp) \
475     (int)(*((u8*)(sdp)+SD_ADDL_LEN_BYTE))
476 #define SD_Addl_Sense_Len  SD_Additional_Sense_Length
477
478
479 #define SD_CMD_SPECIFIC3_BYTE          8
480 #define SD_CMD_SPECIFIC2_BYTE          9
481 #define SD_CMD_SPECIFIC1_BYTE         10
482 #define SD_CMD_SPECIFIC0_BYTE         11
483 #define SD_Cmd_Specific_Info3(sdp)  (int)(*((u8*)(sdp)+SD_CMD_SPECIFIC3_BYTE))
484 #define SD_Cmd_Specific_Info2(sdp)  (int)(*((u8*)(sdp)+SD_CMD_SPECIFIC2_BYTE))
485 #define SD_Cmd_Specific_Info1(sdp)  (int)(*((u8*)(sdp)+SD_CMD_SPECIFIC1_BYTE))
486 #define SD_Cmd_Specific_Info0(sdp)  (int)(*((u8*)(sdp)+SD_CMD_SPECIFIC0_BYTE))
487
488
489 #define SD_ADDL_SENSE_CODE_BYTE       12
490 #define SD_Additional_Sense_Code(sdp) \
491     (int)(*((u8*)(sdp)+SD_ADDL_SENSE_CODE_BYTE))
492 #define SD_Addl_Sense_Code  SD_Additional_Sense_Code
493 #define SD_ASC  SD_Additional_Sense_Code
494
495
496 #define SD_ADDL_SENSE_CODE_QUAL_BYTE  13
497 #define SD_Additional_Sense_Code_Qualifier(sdp) \
498     (int)(*((u8*)(sdp)+SD_ADDL_SENSE_CODE_QUAL_BYTE))
499 #define SD_Addl_Sense_Code_Qual  SD_Additional_Sense_Code_Qualifier
500 #define SD_ASCQ  SD_Additional_Sense_Code_Qualifier
501
502
503 #define SD_FIELD_REPL_UNIT_CODE_BYTE  14
504 #define SD_Field_Replaceable_Unit_Code(sdp) \
505     (int)(*((u8*)(sdp)+SD_FIELD_REPL_UNIT_CODE_BYTE))
506 #define SD_Field_Repl_Unit_Code  SD_Field_Replaceable_Unit_Code
507 #define SD_FRUC  SD_Field_Replaceable_Unit_Code
508 #define SD_FRU  SD_Field_Replaceable_Unit_Code
509
510
511 /*
512  *  Sense-Key Specific offsets and macros.
513  */
514 #define SD_SKS2_BYTE                  15
515 #define   SD_SKS_Valid_BIT               0x80
516 #define   SD_SKS_Cmd_Data_BIT            0x40
517 #define   SD_SKS_Bit_Ptr_Valid_BIT       0x08
518 #define   SD_SKS_Bit_Ptr_MASK            0x07
519 #define SD_SKS1_BYTE                  16
520 #define SD_SKS0_BYTE                  17
521 #define SD_Sense_Key_Specific_Valid(sdp) \
522     (int)(*((u8*)(sdp)+SD_SKS2_BYTE) & SD_SKS_Valid_BIT)
523 #define SD_SKS_Valid  SD_Sense_Key_Specific_Valid
524 #define SD_SKS_CDB_Error(sdp)  \
525     (int)(*((u8*)(sdp)+SD_SKS2_BYTE) & SD_SKS_Cmd_Data_BIT)
526 #define SD_Was_Illegal_Request  SD_SKS_CDB_Error
527 #define SD_SKS_Bit_Pointer_Valid(sdp)  \
528     (int)(*((u8*)(sdp)+SD_SKS2_BYTE) & SD_SKS_Bit_Ptr_Valid_BIT)
529 #define SD_SKS_Bit_Pointer(sdp)  \
530     (int)(*((u8*)(sdp)+SD_SKS2_BYTE) & SD_SKS_Bit_Ptr_MASK)
531 #define SD_Field_Pointer(sdp)  \
532     (int)( ((u16)(*((u8*)(sdp)+SD_SKS1_BYTE)) << 8) \
533       + *((u8*)(sdp)+SD_SKS0_BYTE) )
534 #define SD_Bad_Byte  SD_Field_Pointer
535 #define SD_Actual_Retry_Count  SD_Field_Pointer
536 #define SD_Progress_Indication  SD_Field_Pointer
537
538 /*
539  *  Mode Sense Write Protect Mask
540  */
541 #define WRITE_PROTECT_MASK      0X80
542
543 /*
544  *  Medium Type Codes
545  */
546 #define OPTICAL_DEFAULT                 0x00
547 #define OPTICAL_READ_ONLY_MEDIUM        0x01
548 #define OPTICAL_WRITE_ONCE_MEDIUM       0x02
549 #define OPTICAL_READ_WRITABLE_MEDIUM    0x03
550 #define OPTICAL_RO_OR_WO_MEDIUM         0x04
551 #define OPTICAL_RO_OR_RW_MEDIUM         0x05
552 #define OPTICAL_WO_OR_RW_MEDIUM         0x06
553
554
555
556 /*
557  *    Structure definition for READ6, WRITE6 (6-byte CDB)
558  */
559 typedef struct SCSI_RW6_CDB
560 {
561     u32    OpCode      :8,
562            LBA_HI      :5,    /* 5 MSBit's of the LBA */
563            Lun         :3,
564            LBA_MID     :8,    /* NOTE: total of 21 bits in LBA */
565            LBA_LO      :8  ;  /* Max LBA = 0x001fffff          */
566     u8     BlockCount;
567     u8     Control;
568 } SCSI_RW6_t;
569
570 #define MAX_RW6_LBA  ((u32)0x001fffff)
571
572 /*
573  *  Structure definition for READ10, WRITE10 (10-byte CDB)
574  *
575  *    NOTE: ParityCheck bit is applicable only for VERIFY and WRITE VERIFY for
576  *    the ADP-92 DAC only.  In the SCSI2 spec. this same bit is defined as a
577  *    FUA (forced unit access) bit for READs and WRITEs.  Since this driver
578  *    does not use the FUA, this bit is defined as it is used by the ADP-92.
579  *    Also, for READ CAPACITY, only the OpCode field is used.
580  */
581 typedef struct SCSI_RW10_CDB
582 {
583     u8     OpCode;
584     u8     Reserved1;
585     u32    LBA;
586     u8     Reserved2;
587     u16    BlockCount;
588     u8     Control;
589 } SCSI_RW10_t;
590
591 #define PARITY_CHECK  0x08    /* parity check bit - byte[1], bit 3 */
592
593     /*
594      *  Structure definition for data returned by READ CAPACITY cmd;
595      *  READ CAPACITY data
596      */
597     typedef struct READ_CAP_DATA
598     {
599         u32    MaxLBA;
600         u32    BlockBytes;
601     } SCSI_READ_CAP_DATA_t, *pSCSI_READ_CAP_DATA_t;
602
603
604 /*
605  *  Structure definition for FORMAT UNIT CDB (6-byte CDB)
606  */
607 typedef struct _SCSI_FORMAT_UNIT
608 {
609     u8     OpCode;
610     u8     Reserved1;
611     u8     VendorSpecific;
612     u16    Interleave;
613     u8     Control;
614 } SCSI_FORMAT_UNIT_t;
615
616 /*
617  *    Structure definition for REQUEST SENSE (6-byte CDB)
618  */
619 typedef struct _SCSI_REQUEST_SENSE
620 {
621     u8     OpCode;
622     u8     Reserved1;
623     u8     Reserved2;
624     u8     Reserved3;
625     u8     AllocLength;
626     u8     Control;
627 } SCSI_REQ_SENSE_t;
628
629 /*
630  *  Structure definition for REPORT LUNS (12-byte CDB)
631  */
632 typedef struct _SCSI_REPORT_LUNS
633 {
634     u8     OpCode;
635     u8     Reserved1[5];
636     u32    AllocationLength;
637     u8     Reserved2;
638     u8     Control;
639 } SCSI_REPORT_LUNS_t, *pSCSI_REPORT_LUNS_t;
640
641     /*
642      *  (per-level) LUN information bytes
643      */
644 /*
645  *  Following doesn't work on ARMCC compiler
646  *  [apparently] because it pads every struct
647  *  to be multiple of 4 bytes!
648  *  So SCSI_LUN_LEVELS_t winds up being 16
649  *  bytes instead of 8!
650  *
651     typedef struct LUN_INFO
652     {
653         u8     AddrMethod_plus_LunOrBusNumber;
654         u8     LunOrTarget;
655     } SCSI_LUN_INFO_t, *pSCSI_LUN_INFO_t;
656
657     typedef struct LUN_LEVELS
658     {
659         SCSI_LUN_INFO_t  LUN_0;
660         SCSI_LUN_INFO_t  LUN_1;
661         SCSI_LUN_INFO_t  LUN_2;
662         SCSI_LUN_INFO_t  LUN_3;
663     } SCSI_LUN_LEVELS_t, *pSCSI_LUN_LEVELS_t;
664 */
665     /*
666      *  All 4 levels (8 bytes) of LUN information
667      */
668     typedef struct LUN_LEVELS
669     {
670         u8     LVL1_AddrMethod_plus_LunOrBusNumber;
671         u8     LVL1_LunOrTarget;
672         u8     LVL2_AddrMethod_plus_LunOrBusNumber;
673         u8     LVL2_LunOrTarget;
674         u8     LVL3_AddrMethod_plus_LunOrBusNumber;
675         u8     LVL3_LunOrTarget;
676         u8     LVL4_AddrMethod_plus_LunOrBusNumber;
677         u8     LVL4_LunOrTarget;
678     } SCSI_LUN_LEVELS_t, *pSCSI_LUN_LEVELS_t;
679
680     /*
681      *  Structure definition for data returned by REPORT LUNS cmd;
682      *  LUN reporting parameter list format
683      */
684     typedef struct LUN_REPORT
685     {
686         u32                LunListLength;
687         u32                Reserved;
688         SCSI_LUN_LEVELS_t  LunInfo[1];
689     } SCSI_LUN_REPORT_t, *pSCSI_LUN_REPORT_t;
690
691 /****************************************************************************
692  *
693  *  Externals
694  */
695
696 /****************************************************************************
697  *
698  *  Public Typedefs & Related Defines
699  */
700
701 /****************************************************************************
702  *
703  *  Macros (embedded, above)
704  */
705
706 /****************************************************************************
707  *
708  *  Public Variables
709  */
710
711 /****************************************************************************
712  *
713  *  Public Prototypes (module entry points)
714  */
715
716
717 /***************************************************************************/
718 #endif