scsi3.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:21k
源码类别:

Linux/Unix编程

开发平台:

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