scsi3.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:21k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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