scsi2Lib.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:55k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* scsi2Lib.h - SCSI library header file */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 04o,18oct01,pmr  setting SCSI_SYNC_XFER_MIN_PERIOD to 1 so that highest speed
  7.                  is negotiated (SPR 71337).
  8. 04n,08oct01,rcs  added SCSI_ADD_SENSE_NO_MEDIUM SPR# 32203
  9. 04m,10jul97,dds  added new fields to SCSI_CTRL structure.
  10. 04l,28mar97,dds  SPR 8220: added new event type SCSI_EVENT_PARITY_ERR.
  11. 04k,06mar97,dds  SPR 8120: changed declaration for scsiRdTape.
  12. 04j,13sep96,dds  added declarations required by scsiMgrLib.c and scsiCtrlLib.c
  13. 04i,29jul96,jds  added hardware cache snooping support
  14. 04h,15apr96,jds  added WIDE data transfer support
  15. 04g,20jul95,jds  added scsiSeqStatusCheck as a global function
  16. 04f,24jul95,jds  added some additional sense key macros; added pointer to
  17.  SEQ_DEV in SCSI_PHYS_DEV
  18. 04e,28apr95,jds  integrated into WRS tree; added backward compatability 
  19. 04d,24mar95,ihw  added "identMsg" field in SCSI_EVENT structure
  20. 04c,07oct94,ihw  added errno's for reaching max threads, bad sense data
  21. 04b,27may94,ihw  documented prior to release
  22. 04a,30mar94,ihw  modified for enhanced SCSI library: tagged command queueing
  23.                  removed redundant "pAddLengthByte" field from SCSI_PHYS_DEV
  24.  added definitions for proper handling of max length ext msgs
  25. 03a,12jan94,ihw  modified for enhanced SCSI library: multiple initiators,
  26.               disconnect/reconnect and synchronous transfer supported
  27. 02j,11jan93,ccc  added #ifndef _ASMLANGUAGE.
  28. 02i,30sep92,ccc  added two new errno's.
  29. 02h,24sep92,ccc  removed timeout parameter to scsiAutoConfig().
  30. 02g,22sep92,rrr  added support for c++
  31. 02f,27aug92,ccc  added timeout to SCSI_TRANSACTION structure.
  32. 02e,26jul92,rrr  Removed decl of scsiSyncTarget, it was made LOCAL.
  33. 02d,20jul92,eve  Remove conditional compilation.
  34. 02c,14jul92,eve  added a pScsiXaction info in SCSI_PHYS_DEV structure to
  35.  maintain the data direction information to support
  36.  cache coherency in drivers.
  37. 02b,06jul92,eve  added declaration for extended sync functionalities.
  38. 02a,04jul92,jcf  cleaned up.
  39. 01l,26may92,rrr  the tree shuffle
  40. 01k,07apr92,yao  changed BYTE_ORDER to _BYTE_ORDER, BIG_ENDIAN to _BIG_ENDIAN.
  41. 01j,04oct91,rrr  passed through the ansification filter
  42.   -fixed #else and #endif
  43.   -changed READ, WRITE and UPDATE to O_RDONLY O_WRONLY O_RDWR
  44.   -changed VOID to void
  45.   -changed copyright notice
  46. 01i,07mar91,jcc  added SCSI_BLK_DEV_LIST and SCSI_BLK_DEV_NODE definitions;
  47.            added SCSI_SWAB macro. added a few error codes.
  48. 01h,05oct90,shl  added ANSI function prototypes.
  49.                  added copyright notice.
  50. 01g,02oct90,jcc  changed SEM_ID's to SEMAPHORE's in SCSI_PHYS_DEV and SCSI_CTRL
  51.  structures; modified structures to return variable length
  52.  REQUEST SENSE data; miscellaneous.
  53. 01f,20aug90,jcc  added conditional defines and typedefs for 4.0.2 compatibility.
  54. 01e,10aug90,dnw  changed scsiBusReset and scsiSelTimeOutCvt to VOIDFUNCPTR.
  55. 01d,07aug90,shl  moved function declarations to end of file.
  56. 01c,12jul90,jcc  misc. enhancements and changes.
  57. 01b,08jun90,jcc  added scsiMsgInAck to SCSI_CTRL, which routine is invoked
  58.  to accept incoming messages.
  59. 01a,17apr89,jcc  written.
  60. */
  61. #ifndef __INCscsi2Libh
  62. #define __INCscsi2Libh
  63. #ifndef _ASMLANGUAGE
  64. #ifdef __cplusplus
  65. extern "C" {
  66. #endif
  67. #include "vwModNum.h"
  68. #include "blkIo.h"
  69. #include "seqIo.h"
  70. #include "semLib.h"
  71. #include "lstLib.h"
  72. #include "msgQLib.h"
  73. #include "rngLib.h"
  74. #include "taskLib.h"
  75. #include "wdLib.h"
  76. /* SCSI direct-access device and general purpose command opcodes are enumerated.
  77.  * NOTE: Some commands are optional and may not be supported by all devices.
  78.  */
  79. #define SCSI_OPCODE_TEST_UNIT_READY     ((UINT8) 0x00)  /* test unit ready */
  80. #define SCSI_OPCODE_REZERO_UNIT         ((UINT8) 0x01)  /* rezero unit */
  81. #define SCSI_OPCODE_REWIND ((UINT8) 0x01)  /* rewind */
  82. #define SCSI_OPCODE_REQUEST_SENSE       ((UINT8) 0x03)  /* request sense */
  83. #define SCSI_OPCODE_FORMAT_UNIT         ((UINT8) 0x04)  /* format unit */
  84. #define SCSI_OPCODE_READ_BLOCK_LIMITS ((UINT8) 0x05)  /* read block limits */
  85. #define SCSI_OPCODE_REASSIGN_BLOCKS     ((UINT8) 0x07)  /* reassign blocks */
  86. #define SCSI_OPCODE_READ                ((UINT8) 0x08)  /* read */
  87. #define SCSI_OPCODE_RECEIVE ((UINT8) 0x08)  /* receive */
  88. #define SCSI_OPCODE_WRITE               ((UINT8) 0x0a)  /* write */
  89. #define SCSI_OPCODE_PRINT               ((UINT8) 0x0a)  /* print */
  90. #define SCSI_OPCODE_SEND ((UINT8) 0x0a)  /* send */
  91. #define SCSI_OPCODE_SEEK                ((UINT8) 0x0b)  /* seek */
  92. #define SCSI_OPCODE_TRACK_SELECT ((UINT8) 0x0b)  /* track select */
  93. #define SCSI_OPCODE_SLEW_AND_PRINT ((UINT8) 0x0b)  /* slew and print */
  94. #define SCSI_OPCODE_READ_REVERSE ((UINT8) 0x0f)  /* read reverse */
  95. #define SCSI_OPCODE_WRITE_FILEMARKS ((UINT8) 0x10)  /* write filemarks */
  96. #define SCSI_OPCODE_FLUSH_BUFFER ((UINT8) 0x10)  /* flush buffer */
  97. #define SCSI_OPCODE_SPACE ((UINT8) 0x11)  /* space */
  98. #define SCSI_OPCODE_INQUIRY             ((UINT8) 0x12)  /* inquiry */
  99. #define SCSI_OPCODE_VERIFY_SEQ ((UINT8) 0x13)  /* seq. access verify */
  100. #define SCSI_OPCODE_RECOVER_BUF_DATA ((UINT8) 0x14)  /* rec. buffered data */
  101. #define SCSI_OPCODE_MODE_SELECT         ((UINT8) 0x15)  /* mode select */
  102. #define SCSI_OPCODE_RESERVE             ((UINT8) 0x16)  /* reserve */
  103. #define SCSI_OPCODE_RELEASE             ((UINT8) 0x17)  /* release */
  104. #define SCSI_OPCODE_COPY ((UINT8) 0x18)  /* copy */
  105. #define SCSI_OPCODE_ERASE ((UINT8) 0x19)  /* erase */
  106. #define SCSI_OPCODE_MODE_SENSE          ((UINT8) 0x1a)  /* mode sense */
  107. #define SCSI_OPCODE_START_STOP_UNIT     ((UINT8) 0x1b)  /* start/stop unit */
  108. #define SCSI_OPCODE_LOAD_UNLOAD ((UINT8) 0x1b)  /* load/unload */
  109. #define SCSI_OPCODE_STOP_PRINT ((UINT8) 0x1b)  /* stop print */
  110. #define SCSI_OPCODE_RECV_DIAG_RESULTS ((UINT8) 0x1c)  /* recv diag results */
  111. #define SCSI_OPCODE_SEND_DIAGNOSTIC     ((UINT8) 0x1d)  /* send diagnostic */
  112. #define SCSI_OPCODE_CTRL_MEDIUM_REMOVAL ((UINT8) 0x1e)  /* ctrl med. removal */
  113. #define SCSI_OPCODE_READ_CAPACITY       ((UINT8) 0x25)  /* read capacity */
  114. #define SCSI_OPCODE_READ_EXT ((UINT8) 0x28)  /* read extended */
  115. #define SCSI_OPCODE_WRITE_EXT       ((UINT8) 0x2a)  /* write extended */
  116. #define SCSI_OPCODE_SEEK_EXT        ((UINT8) 0x2b)  /* seek extended */
  117. #define SCSI_OPCODE_WRITE_AND_VERIFY    ((UINT8) 0x2e)  /* write and verify */
  118. #define SCSI_OPCODE_VERIFY              ((UINT8) 0x2f)  /* verify */
  119. #define SCSI_OPCODE_SEARCH_DATA_HIGH ((UINT8) 0x30)  /* search data high */
  120. #define SCSI_OPCODE_SEARCH_DATA_EQUAL ((UINT8) 0x31)  /* search data equal */
  121. #define SCSI_OPCODE_SEARCH_DATA_LOW ((UINT8) 0x32)  /* search data low */
  122. #define SCSI_OPCODE_SET_LIMITS ((UINT8) 0x33)  /* set limits */
  123. #define SCSI_OPCODE_READ_DEFECT_DATA    ((UINT8) 0x37)  /* read defect data */
  124. #define SCSI_OPCODE_COMPARE     ((UINT8) 0x39)  /* compare */
  125. #define SCSI_OPCODE_COPY_AND_VERIFY ((UINT8) 0x3a)  /* copy and verify */
  126. #define SCSI_OPCODE_WRITE_BUFFER        ((UINT8) 0x3b)  /* write buffer */
  127. #define SCSI_OPCODE_READ_BUFFER         ((UINT8) 0x3c)  /* read buffer */
  128. /* SCSI general purpose sense keys are enumerated.
  129.  * NOTE: Some sense keys are optional and may not be supported by all devices.
  130. */
  131. #define SCSI_SENSE_KEY_NO_SENSE         0x00  /* no sense sense key */
  132. #define SCSI_SENSE_KEY_RECOVERED_ERROR  0x01  /* recovered error sense key */
  133. #define SCSI_SENSE_KEY_NOT_READY        0x02  /* not ready sense key */
  134. #define SCSI_SENSE_KEY_MEDIUM_ERROR     0x03  /* medium error sense key */
  135. #define SCSI_SENSE_KEY_HARDWARE_ERROR   0x04  /* hardware error sense key */
  136. #define SCSI_SENSE_KEY_ILLEGAL_REQUEST  0x05  /* illegal request sense key */
  137. #define SCSI_SENSE_KEY_UNIT_ATTENTION   0x06  /* unit attention sense key */
  138. #define SCSI_SENSE_KEY_DATA_PROTECT     0x07  /* data protect sense key */
  139. #define SCSI_SENSE_KEY_BLANK_CHECK      0x08  /* blank check sense key */
  140. #define SCSI_SENSE_KEY_VENDOR_UNIQUE    0x09  /* vendor unique sense key */
  141. #define SCSI_SENSE_KEY_COPY_ABORTED     0x0a  /* copy aborted sense key */
  142. #define SCSI_SENSE_KEY_ABORTED_COMMAND  0x0b  /* aborted command sense key */
  143. #define SCSI_SENSE_KEY_EQUAL            0x0c  /* key equal sense key */
  144. #define SCSI_SENSE_KEY_VOLUME_OVERFLOW  0x0d  /* volume overflow sense key */
  145. #define SCSI_SENSE_KEY_MISCOMPARE       0x0e  /* miscompare sense key */
  146. #define SCSI_SENSE_KEY_RESERVED         0x0f  /* reserved sense key */
  147. /* SCSI additional sense keys */
  148. #define SCSI_ADD_SENSE_MEDIUM_CHANGED  0x28  /* medium may have changed */
  149. #define SCSI_ADD_SENSE_DEVICE_RESET     0x29  /* hardware or bus device reset */
  150. #define SCSI_ADD_SENSE_WRITE_PROTECTED  0x27  /* write protected medium */
  151. #define SCSI_ADD_SENSE_NO_MEDIUM  0x3a  /* medium not present */
  152. /* SCSI MODE header parameters */
  153. #define SCSI_MODE_DEV_SPECIFIC_PARAM   0x2   /* device specific parameter */
  154. #define SCSI_DEV_SPECIFIC_WP_MASK 0x80  /* Write protect bit */
  155. /* SCSI status byte codes are enumerated.
  156.  * NOTE: Some status codes are optional and may not be supported by all devices.
  157. */
  158. #define SCSI_STATUS_MASK            ((UINT8) 0x3e) /* mask vend uniq status */
  159. #define SCSI_STATUS_GOOD            ((UINT8) 0x00) /* good status */
  160. #define SCSI_STATUS_CHECK_CONDITION ((UINT8) 0x02) /* check condition status */
  161. #define SCSI_STATUS_CONDITION_MET   ((UINT8) 0x04) /* condition met/good stat */
  162. #define SCSI_STATUS_BUSY            ((UINT8) 0x08) /* busy status */
  163. #define SCSI_STATUS_INTMED_GOOD     ((UINT8) 0x10) /* intermediate/good stat */
  164. #define SCSI_STATUS_INTMED_COND_MET ((UINT8) 0x14) /* interm./cond. met stat */
  165. #define SCSI_STATUS_RESERV_CONFLICT ((UINT8) 0x18) /* reservation conflict */
  166. #define SCSI_STATUS_CMD_TERMINATED  ((UINT8) 0x22) /* command terminated */
  167. #define SCSI_STATUS_QUEUE_FULL      ((UINT8) 0x28) /* queue full status */
  168. /* SCSI message codes are enumerated.
  169.  * NOTE: Some message codes are optional and may not be supported by all
  170.  *       devices.
  171. */
  172. #define SCSI_MSG_COMMAND_COMPLETE   ((UINT8) 0x00) /* command complete msg. */
  173. #define SCSI_MSG_EXTENDED_MESSAGE   ((UINT8) 0x01) /* extended message msg. */
  174. #define SCSI_MSG_SAVE_DATA_POINTER  ((UINT8) 0x02) /* save data pointer msg. */
  175. #define SCSI_MSG_RESTORE_POINTERS   ((UINT8) 0x03) /* restore pointers msg. */
  176. #define SCSI_MSG_DISCONNECT         ((UINT8) 0x04) /* disconnect msg. */
  177. #define SCSI_MSG_INITOR_DETECT_ERR  ((UINT8) 0x05) /* initor. detect err msg. */
  178. #define SCSI_MSG_ABORT              ((UINT8) 0x06) /* abort msg. */
  179. #define SCSI_MSG_MESSAGE_REJECT     ((UINT8) 0x07) /* message reject msg. */
  180. #define SCSI_MSG_NO_OP              ((UINT8) 0x08) /* no operation msg. */
  181. #define SCSI_MSG_MSG_PARITY_ERR     ((UINT8) 0x09) /* message parity err msg. */
  182. #define SCSI_MSG_LINK_CMD_COMPLETE  ((UINT8) 0x0a) /* linked cmd. comp. msg. */
  183. #define SCSI_MSG_LINK_CMD_FLAG_COMP ((UINT8) 0x0b) /* link cmd w/flag comp. */
  184. #define SCSI_MSG_BUS_DEVICE_RESET   ((UINT8) 0x0c) /* bus device reset msg. */
  185. #define SCSI_MSG_ABORT_TAG       ((UINT8) 0x0d) /* abort tag msg. */
  186. #define SCSI_MSG_CLEAR_QUEUE     ((UINT8) 0x0e) /* clear queue msg. */
  187. #define SCSI_MSG_INITIATE_RECOVERY  ((UINT8) 0x0f) /* initiate recovery msg. */
  188. #define SCSI_MSG_RELEASE_RECOVERY   ((UINT8) 0x10) /* release recovery msg. */
  189. #define SCSI_MSG_TERMINATE_PROCESS  ((UINT8) 0x11) /* terminate i/o process */
  190. #define SCSI_MSG_IDENTIFY      ((UINT8) 0x80) /* identify msg bit mask */
  191. #define SCSI_MSG_IDENT_DISCONNECT   ((UINT8) 0x40) /* identify disconnect bit */
  192. #define SCSI_MSG_IDENT_LUN_MASK     ((UINT8) 0x07) /* identify bit mask for LUN */
  193. /* SCSI two-byte message codes */
  194. #define SCSI_MSG_SIMPLE_Q_TAG     ((UINT8) 0x20) /* simple queue tag    */
  195. #define SCSI_MSG_HEAD_OF_Q_TAG     ((UINT8) 0x21) /* head of queue tag   */
  196. #define SCSI_MSG_ORDERED_Q_TAG     ((UINT8) 0x22) /* ordered queue tag   */
  197. #define SCSI_MSG_IGNORE_WIDE_RESIDUE ((UINT8)0x23) /* ignore wide residue */
  198. #define SCSI_IS_TWO_BYTE_MSG(m)     ((0x20 <= (m)) && ((m) < 0x30))
  199. /* SCSI extended message codes */
  200. #define SCSI_EXT_MSG_MODIFY_DATA_PTR ((UINT8) 0x00)  /* modify data pointer */
  201. #define SCSI_EXT_MSG_SYNC_XFER_REQ   ((UINT8) 0x01)  /* sync. data xfer. req. */
  202. #define SCSI_EXT_MSG_EXT_IDENTIFY    ((UINT8) 0x02)  /* extended identify */
  203. #define SCSI_EXT_MSG_WIDE_XFER_REQ   ((UINT8) 0x03)  /* wide data xfer req. */
  204. /* SCSI extended message lengths */
  205. #define SCSI_EXT_MSG_HDR_LENGTH       2  /* generic part of ext msg */
  206. #define SCSI_MODIFY_DATA_PTR_MSG_LENGTH  5  /* modify data pointer */
  207. #define SCSI_SYNC_XFER_REQ_MSG_LENGTH    3  /* sync. data xfer. req. */
  208. #define SCSI_WIDE_XFER_REQ_MSG_LENGTH    2  /* wide data xfer req. */
  209. #define SCSI_EXT_MSG_MAX_LENGTH        256  /* max. possible length */
  210. /* byte offsets within SCSI extended messages */
  211. #define SCSI_EXT_MSG_LENGTH_BYTE     1   /* # bytes to follow         */
  212. #define SCSI_EXT_MSG_TYPE_BYTE       2   /* defines type of ext. msg. */
  213. #define SCSI_MODIFY_DATA_PTR_UU      3   /* argument (MSB) */
  214. #define SCSI_MODIFY_DATA_PTR_UM      4
  215. #define SCSI_MODIFY_DATA_PTR_LM      5
  216. #define SCSI_MODIFY_DATA_PTR_LL      6   /* argument (LSB) */
  217. #define SCSI_SYNC_XFER_MSG_PERIOD    3   /* min xfer period (x 4 ns) */
  218. #define SCSI_SYNC_XFER_MSG_OFFSET    4   /* max req/ack offset       */
  219. #define SCSI_WIDE_XFER_MSG_WIDTH     3   /* wide data transfer width */
  220. #define SCSI_EXT_IDENTIFY_SUB_LUN    3   /* sub-logical unit number */
  221. /* the largest SCSI ID and LUN a target drive can have */
  222. #define SCSI_MIN_BUS_ID 0 /* min. bus ID under SCSI */
  223. #define SCSI_MAX_BUS_ID 7 /* max. bus ID under SCSI */
  224. #define SCSI_MIN_LUN 0 /* min. logical unit number */
  225. #define SCSI_MAX_LUN 7 /* max. logical unit number */
  226. #define SCSI_MAX_TARGETS          8
  227. #define SCSI_MAX_LUNS_PER_TARGET     8
  228. #define SCSI_MAX_PHYS_DEVS (SCSI_MAX_TARGETS *      
  229.  SCSI_MAX_LUNS_PER_TARGET)
  230. /* byte offsets and bitmasks within the data returned by an INQUIRY command */
  231. #define SCSI_INQUIRY_DEV_TYPE     0     /* device type and qualifier   */
  232. #define SCSI_INQUIRY_DEV_MODIFIER   1     /* type modifier, removable    */
  233. #define SCSI_INQUIRY_VERSION     2     /* ISO, ECMA and ANSI versions */
  234. #define SCSI_INQUIRY_FORMAT      3     /* reponse format, etc.        */
  235. #define SCSI_INQUIRY_ADD_LENGTH     4     /* additional length byte      */
  236. #define SCSI_INQUIRY_FLAGS       7     /* miscellaneous flags (below) */
  237. #define SCSI_INQUIRY_VENDOR_ID     8     /* vendor ID                   */
  238. #define SCSI_INQUIRY_PRODUCT_ID     16     /* product ID                  */
  239. #define SCSI_INQUIRY_REV_LEVEL      32     /* product revision level      */
  240. #define SCSI_INQUIRY_DEV_TYPE_MASK  0x1f    /* mask for device type (byte 0) */
  241. #define SCSI_INQUIRY_REMOVABLE_MASK 0x80    /* removable media flag (byte 1) */
  242. #define SCSI_INQUIRY_ANSI_VSN_MASK  0x07    /* ANSI version         (byte 2) */
  243. #define SCSI_INQUIRY_FORMAT_MASK    0x0f    /* response data format (byte 3) */
  244. #define SCSI_INQUIRY_CMD_QUEUE_MASK 0x02    /* command queuing flag (byte 7) */
  245. #define SCSI_INQUIRY_WIDE_32_MASK   0x40    /* wide bus 32 flag     (byte 7) */
  246. #define SCSI_INQUIRY_WIDE_16_MASK   0x20    /* wide bus 16 flag     (byte 7) */
  247. #define SCSI_INQUIRY_SYNC_XFER_MASK 0x10    /* synch. xfer flag     (byte 7) */
  248. #define SCSI_INQUIRY_VENDOR_ID_LENGTH       8
  249. #define SCSI_INQUIRY_PRODUCT_ID_LENGTH      16
  250. #define SCSI_INQUIRY_REV_LEVEL_LENGTH     4
  251. /* device type enumeration */
  252. #define SCSI_DEV_DIR_ACCESS ((UINT8) 0x00) /* direct-access dev (disk) */
  253. #define SCSI_DEV_SEQ_ACCESS ((UINT8) 0x01) /* sequent'l-access dev (tape) */
  254. #define SCSI_DEV_PRINTER ((UINT8) 0x02) /* printer dev */
  255. #define SCSI_DEV_PROCESSOR ((UINT8) 0x03) /* processor dev */
  256. #define SCSI_DEV_WORM ((UINT8) 0x04) /* write-once read-mult dev */
  257. #define SCSI_DEV_RO_DIR_ACCESS ((UINT8) 0x05) /* read-only direct-access dev */
  258. #define SCSI_LUN_NOT_PRESENT ((UINT8) 0x7f) /* logical unit not present */
  259. /* miscellaneous SCSI constants, etc. */
  260. #define SCSI_SYNC_XFER_MAX_OFFSET    0xff /* in sync xfer request msg  */
  261. #define SCSI_SYNC_XFER_MIN_PERIOD    1   /* shoot for highest speed   */
  262. #define SCSI_SYNC_XFER_ASYNC_OFFSET 0    /* special value for async.  */
  263. #define SCSI_SYNC_XFER_ASYNC_PERIOD 0    /* (irrelevant for async.)   */
  264. #define SCSI_WIDE_XFER_SIZE_DEFAULT     1 /* 16 bit default wide width */
  265. #define SCSI_WIDE_XFER_SIZE_NARROW      0  /* 8 bit narrow width        */
  266. #define SCSI_MAX_MSG_IN_BYTES (2 + SCSI_EXT_MSG_MAX_LENGTH)
  267. #define SCSI_MAX_MSG_OUT_BYTES (2 + SCSI_EXT_MSG_MAX_LENGTH)
  268. #define SCSI_MAX_IDENT_MSG_LENGTH    (1 + 2) /* IDENTIFY + QUEUE TAG msg */
  269. #define SCSI_MAX_TAGS           256  /* tags numbered 0 - 255 */
  270. /* definitions relating to SCSI commands */
  271. #define SCSI_MAX_CMD_LENGTH 12  /* maximum length in bytes of a SCSI command */
  272. typedef UINT8 SCSI_COMMAND [SCSI_MAX_CMD_LENGTH];
  273. #define SCSI_GROUP_0_CMD_LENGTH  6
  274. #define SCSI_GROUP_1_CMD_LENGTH 10
  275. #define SCSI_GROUP_5_CMD_LENGTH 12
  276. /* some useful defines and structures for CCS commands */
  277. #define SCSI_FORMAT_DATA_BIT ((UINT8) 0x10)
  278. #define SCSI_COMPLETE_LIST_BIT ((UINT8) 0x08)
  279. #define DEFAULT_INQUIRY_DATA_LENGTH 36
  280. #define REQ_SENSE_ADD_LENGTH_BYTE 7
  281. #define INQUIRY_ADD_LENGTH_BYTE 4
  282. #define MODE_SENSE_ADD_LENGTH_BYTE 0
  283. #define NON_EXT_SENSE_DATA_LENGTH 4
  284. #define SCSI_SENSE_DATA_CLASS 0x70
  285. #define SCSI_SENSE_DATA_CODE 0x0f
  286. #define SCSI_SENSE_KEY_MASK 0x0f
  287. #define SCSI_EXT_SENSE_CLASS 0x70
  288. #define SCSI_EXT_SENSE_CODE 0x00
  289. #define SPACE_CODE_DATABLK      0x00     /* space data blocks  */
  290. #define SPACE_CODE_FILEMARK     0x01     /* space file-marks   */
  291. /* scsiLib errno's */
  292. #define S_scsiLib_DEV_NOT_READY (M_scsiLib | 1)
  293. #define S_scsiLib_WRITE_PROTECTED (M_scsiLib | 2)
  294. #define S_scsiLib_MEDIUM_ERROR (M_scsiLib | 3)
  295. #define S_scsiLib_HARDWARE_ERROR (M_scsiLib | 4)
  296. #define S_scsiLib_ILLEGAL_REQUEST (M_scsiLib | 5)
  297. #define S_scsiLib_BLANK_CHECK (M_scsiLib | 6)
  298. #define S_scsiLib_ABORTED_COMMAND (M_scsiLib | 7)
  299. #define S_scsiLib_VOLUME_OVERFLOW (M_scsiLib | 8)
  300. #define S_scsiLib_UNIT_ATTENTION (M_scsiLib | 9)
  301. #define S_scsiLib_SELECT_TIMEOUT (M_scsiLib | 10)
  302. #define S_scsiLib_LUN_NOT_PRESENT (M_scsiLib | 11)
  303. #define S_scsiLib_ILLEGAL_BUS_ID (M_scsiLib | 12)
  304. #define S_scsiLib_NO_CONTROLLER (M_scsiLib | 13)
  305. #define S_scsiLib_REQ_SENSE_ERROR (M_scsiLib | 14)
  306. #define S_scsiLib_DEV_UNSUPPORTED (M_scsiLib | 15)
  307. #define S_scsiLib_ILLEGAL_PARAMETER (M_scsiLib | 16)
  308. #define S_scsiLib_INVALID_PHASE (M_scsiLib | 17)
  309. #define S_scsiLib_ABORTED    (M_scsiLib | 18)
  310. #define S_scsiLib_ILLEGAL_OPERATION (M_scsiLib | 19)
  311. #define S_scsiLib_DEVICE_EXIST      (M_scsiLib | 20)
  312. #define S_scsiLib_DISCONNECTED      (M_scsiLib | 21)
  313. #define S_scsiLib_BUS_RESET      (M_scsiLib | 22)
  314. #define S_scsiLib_INVALID_TAG_TYPE   (M_scsiLib | 23)
  315. #define S_scsiLib_SOFTWARE_ERROR     (M_scsiLib | 24)
  316. #define S_scsiLib_NO_MORE_THREADS    (M_scsiLib | 25)
  317. #define S_scsiLib_UNKNOWN_SENSE_DATA (M_scsiLib | 26)
  318. #define S_scsiLib_INVALID_BLOCK_SIZE (M_scsiLib | 27)
  319. /* default select timeout (usec) */
  320. #define SCSI_DEF_SELECT_TIMEOUT ((UINT) 250000)
  321. /* default auto-config timeout (usec) */
  322. #define SCSI_DEF_CONFIG_TIMEOUT ((UINT) 1000)
  323. #define SCSI_TIMEOUT_5SEC ((UINT) 5000000)
  324. #define SCSI_TIMEOUT_1SEC ((UINT) 1000000)
  325. #define SCSI_TIMEOUT_FULL ((UINT) 0xffffffff)
  326. #define SCSI_DEF_MIN_TIMEOUT      SCSI_TIMEOUT_1SEC
  327. #define SCSI_DEF_MAX_TIMEOUT      SCSI_TIMEOUT_FULL
  328.  
  329. /* default bus ID for a vxWorks SCSI port */
  330. #define SCSI_DEF_CTRL_BUS_ID 7
  331. /* parameters for SCSI manager task (also see specific controller drivers) */
  332. #define SCSI_DEF_TASK_NAME          "tScsiTask"
  333. #define SCSI_DEF_TASK_OPTIONS        VX_UNBREAKABLE
  334. #define SCSI_DEF_TASK_STACK_SIZE 4000
  335. #define SCSI_DEF_TASK_PRIORITY      5
  336. /* parameters for SCSI manager queues, thread allocation, etc. */
  337. #define SCSI_DEF_MAX_THREADS      64  /* max total # threads allowed */
  338. #define SCSI_DEF_ALLOC_THREADS      16  /* # threads allocated at once */
  339. #define SCSI_DEF_EVENT_Q_SIZE      8   /* 2 should normally be enough ! */
  340. #define SCSI_DEF_REQUEST_Q_SIZE      SCSI_DEF_MAX_THREADS
  341. #define SCSI_DEF_REPLY_Q_SIZE      SCSI_DEF_MAX_THREADS
  342. #define SCSI_DEF_TIMEOUT_Q_SIZE      SCSI_DEF_MAX_THREADS
  343. /*
  344.  *  Cache flush threshold - the entire data cache will be cleared (read)
  345.  *  or flushed (write) if the data buffer used for a SCSI command is this
  346.  *  size or bigger.  Otherwise, just the buffer will be cleared/flushed.
  347.  */
  348. #define SCSI_DEF_CACHE_FLUSH_THRESHOLD 2048
  349. /* SCSI bus information transfer phases (MCI codes) */
  350. #define SCSI_NUM_XFER_PHASE       8
  351. #define SCSI_DATA_OUT_PHASE 0x0
  352. #define SCSI_DATA_IN_PHASE 0x1
  353. #define SCSI_COMMAND_PHASE 0x2
  354. #define SCSI_STATUS_PHASE 0x3
  355. #define SCSI_MSG_OUT_PHASE 0x6
  356. #define SCSI_MSG_IN_PHASE 0x7
  357. /*
  358.  *  Structure to pass to ioctl call to execute an SCSI command
  359.  */
  360. /* SCSI command priority */
  361. typedef UINT SCSI_PRIORITY;
  362. #define SCSI_THREAD_TASK_PRIORITY   ((UINT)-1) /* use current task priority */
  363.  
  364. #define SCSI_THREAD_MIN_PRIORITY    255     /* same as min task priority */
  365. #define SCSI_THREAD_MAX_PRIORITY    0     /* same as max task priority */
  366. #define SCSI_IS_HIGHER_PRIORITY(x,y) (x < y)     /* numerically lower  */
  367. #define SCSI_IS_LOWER_PRIORITY(x,y)  (x > y)     /* numerically higher */
  368. /* SCSI tag type enumeration */
  369. typedef enum           /* SCSI_TAG_TYPE */
  370.     {
  371.     SCSI_TAG_DEFAULT  = -1, /* use default for device                */
  372.     SCSI_TAG_UNTAGGED = 0,   /* untagged command                      */
  373.     SCSI_TAG_SENSE_RECOVERY, /* untagged, even if tagged cmds present */
  374.     SCSI_TAG_SIMPLE,      /* tagged with simple  queue tag         */
  375.     SCSI_TAG_ORDERED,      /* tagged with ordered queue tag         */
  376.     SCSI_TAG_HEAD_OF_Q      /* tagged with head-of-queue tag         */
  377.     } SCSI_TAG_TYPE;
  378. /* default tag type (all targets use this by default) */
  379. #define SCSI_DEF_TAG_TYPE    SCSI_TAG_SIMPLE
  380. /* SCSI transation structure */
  381. typedef struct  /* SCSI_TRANSACTION - information about a SCSI transaction */
  382.     {
  383.     UINT8 * cmdAddress; /* address of SCSI command bytes             */
  384.     int     cmdLength; /* length of command in bytes                */
  385.     UINT8 * dataAddress; /* address of data buffer                    */
  386.     int     dataDirection; /* direction of data transfer: O_{RD,WR}ONLY */
  387.     int     dataLength; /* length of data buffer in bytes (0 = none) */
  388.     int     addLengthByte;      /* no longer used                            */
  389.     UINT8   statusByte; /* status byte returned from target          */
  390.     UINT    cmdTimeout; /* number of usec for this command timeout   */
  391.     SCSI_TAG_TYPE tagType;   /* tag type to use for this command          */
  392.     SCSI_PRIORITY priority;  /* priority of this transaction              */
  393.     } SCSI_TRANSACTION;
  394. /*
  395.  *  Data structure and constants for "scsiTargetOptionsSet()"
  396.  */
  397. #define SCSI_SET_OPT_ALL_TARGETS    ((UINT) -1)
  398. #define SCSI_SET_OPT_BITMASK     0x003f  /* mask for valid option bits   */
  399. #define SCSI_SET_OPT_TIMEOUT     0x0001  /* bit values to select options */
  400. #define SCSI_SET_OPT_MESSAGES     0x0002
  401. #define SCSI_SET_OPT_DISCONNECT     0x0004
  402. #define SCSI_SET_OPT_XFER_PARAMS    0x0008
  403. #define SCSI_SET_OPT_TAG_PARAMS     0x0010
  404. #define SCSI_SET_OPT_WIDE_PARAMS    0x0020
  405. typedef struct           /* SCSI_OPTIONS - programmable options */
  406.     {
  407.     UINT          selTimeOut; /* device select time-out (us)             */
  408.     BOOL          messages;  /* FALSE => do not use SCSI messages       */
  409.     BOOL          disconnect; /* FALSE => do not use disconnect          */
  410.     UINT8         maxOffset; /* max sync xfer offset (0 => async.)      */
  411.     UINT8         minPeriod; /* min sync xfer period (x 4 ns)           */
  412.     SCSI_TAG_TYPE tagType;   /* default tag type (see SCSI_TRANSACTION) */
  413.     UINT          maxTags;   /* max cmd tags available (0 => untagged)  */
  414.     UINT8       xferWidth; /* wide data transfer width in SCSI units  */
  415.     } SCSI_OPTIONS;
  416. /*
  417.  *  Structure for results of READ CAPACITY command
  418.  */
  419. typedef struct  /* RD_CAP_DATA - results from READ CAPACITY */
  420.     {
  421.     int lastLogBlkAdrs; /* address of last logical block on device */
  422.     int blkLength; /* block length of last logical block */
  423.     } RD_CAP_DATA;
  424. typedef struct  /* RD_BLOCK_LIMIT_DATA - results from READ BLOCK LIMITS */
  425.     {
  426.     int maxBlockLength;         /* maximum block length limit */
  427.     UINT16 minBlockLength;      /* minimum block length limit */
  428.     } RD_BLOCK_LIMIT_DATA;
  429. /* HIDDEN */
  430. /*
  431.  *  SCSI Target and related structures
  432.  */
  433. typedef enum /* Synchronous transfer state  */
  434.     {
  435.     SYNC_XFER_NOT_NEGOTIATED = 0, /* no negotiation ever started */
  436.     SYNC_XFER_REQUEST_PENDING, /* attempting to send request  */
  437.     SYNC_XFER_REQUEST_SENT, /* waiting for target's reply  */
  438.     SYNC_XFER_REPLY_PENDING, /* attempting to send reply    */
  439.     SYNC_XFER_NEGOTIATION_COMPLETE /* all done (at least once)    */
  440.     } SCSI_SYNC_XFER_STATE;
  441. typedef enum /* Synchronous transfer event      */
  442.     {
  443.     SYNC_XFER_RESET = 1, /* reset synchronous transfer fsm  */
  444.     SYNC_XFER_NEW_THREAD, /* new thread is being activated   */
  445.     SYNC_XFER_MSG_IN, /* target has sent message in      */
  446.     SYNC_XFER_MSG_OUT, /* target has rcvd message out     */
  447.     SYNC_XFER_MSG_REJECTED /* target has rejected message out */
  448.     } SCSI_SYNC_XFER_EVENT;
  449. typedef enum /* Wide data transfer state     */
  450.     {
  451.     WIDE_XFER_NOT_NEGOTIATED = 0, /* no negotiation ever stared     */
  452.     WIDE_XFER_REQUEST_PENDING, /* attempting to send wide request */
  453.     WIDE_XFER_REQUEST_SENT, /* waiting for target's reply      */
  454.     WIDE_XFER_REPLY_PENDING, /* attempting to send reply    */
  455.     WIDE_XFER_NEGOTIATION_COMPLETE /* negotiations done (min. once)   */
  456.     } SCSI_WIDE_XFER_STATE;
  457. typedef enum /* Wide data transfer event        */
  458.     {
  459.     WIDE_XFER_RESET = 1, /* reset wide transfer    */
  460.     WIDE_XFER_NEW_THREAD, /* new thread is being activated   */
  461.     WIDE_XFER_MSG_IN, /* target has sent message in      */
  462.     WIDE_XFER_MSG_OUT, /* target has received message out */
  463.     WIDE_XFER_MSG_REJECTED /* target has rejected message out */
  464.     } SCSI_WIDE_XFER_EVENT;
  465. typedef struct /* SCSI_TARGET - SCSI target information   */
  466.     {
  467.     int           scsiDevBusId; /* device's address on SCSI bus            */
  468.     UINT          selTimeOut; /* device select time-out (us)             */
  469.     BOOL          messages;  /* FALSE => do not use SCSI messages       */
  470.     BOOL          disconnect; /* FALSE => do not use disconnect          */
  471.     SCSI_TAG_TYPE tagType;   /* default tag type (cmds may override)    */
  472.     UINT          maxTags; /* max cmd tags available (0 => untagged)  */
  473.     UINT8         maxOffset; /* maximum sync xfer offset (0 => async.)  */
  474.     UINT8         minPeriod; /* minimum sync xfer period (x 4 ns)       */
  475.     UINT8         xferOffset; /* current sync xfer offset (0 => async.)  */
  476.     UINT8         xferPeriod; /* current sync xfer period (x 4 ns)       */
  477.     UINT8    xferWidth; /* width in bits of the wide transfer      */
  478.     UINT8         syncSupport;  /* supports synchronous transfers          */
  479.     UINT8         wideSupport;  /* supports synchronous transfers          */ 
  480.     SCSI_SYNC_XFER_STATE syncXferState; /* state of sync xfer negotiation  */
  481.     SCSI_WIDE_XFER_STATE wideXferState; /* state of wide xfer negotiation  */
  482.     } SCSI_TARGET;
  483. /*
  484.  *  Structures and definitions related to SCSI tags
  485.  */
  486. typedef UINT SCSI_TAG;      /* has the values [0..255] or SCSI_TAG_NONE */
  487. #define SCSI_TAG_NONE ((SCSI_TAG) NONE)
  488. typedef struct scsiTagInfo
  489.     {
  490.     UINT8 inUse;       /* actually a BOOL (but want to save space) */
  491.     } SCSI_TAG_INFO;
  492. /*
  493.  *  SCSI Physical Device and related structures
  494.  */
  495. typedef enum scsiDevEvent    /* SCSI phys dev event type enumeration     */
  496.     {
  497.     SCSI_DEV_ACTIVATED = 1,  /* thread using this dev has been activated */
  498.     SCSI_DEV_DISCONNECTED,   /* thread using this dev has disconnected   */
  499.     SCSI_DEV_RECONNECTED,    /* thread using this dev has reconnected    */
  500.     SCSI_DEV_COMPLETED      /* thread using this dev has completed      */
  501.     } SCSI_DEV_EVENT_TYPE;
  502. typedef enum           /* SCSI nexus type enumeration */
  503.     {
  504.     SCSI_NEXUS_NONE = 0,     /* no         nexus */
  505.     SCSI_NEXUS_IT,      /* an I-T     nexus */
  506.     SCSI_NEXUS_ITL,      /* an I-T-L   nexus */
  507.     SCSI_NEXUS_ITLQ      /* an I-T-L-Q nexus */
  508.     } SCSI_NEXUS_TYPE;
  509. typedef struct  /* SCSI_PHYS_DEV - SCSI physical device info */
  510.     {
  511.     SEM_ID       mutexSem; /* semaphore for access to blk dev list      */
  512.     struct scsiCtrl *pScsiCtrl; /* ptr to dev's SCSI controller info         */
  513.     SCSI_TARGET *pScsiTarget; /* ptr to data for corresponding SCSI target */
  514.     int          scsiDevLUN; /* device's logical unit number              */
  515.     UINT8        scsiDevType; /* SCSI device type                          */
  516.     BOOL         resetFlag; /* set TRUE when dev reset sensed            */
  517.                     /* product info from INQUIRY command         */
  518.     char devVendorID  [SCSI_INQUIRY_VENDOR_ID_LENGTH  + 1];
  519.     char devProductID [SCSI_INQUIRY_PRODUCT_ID_LENGTH + 1];
  520.     char devRevLevel  [SCSI_INQUIRY_REV_LEVEL_LENGTH  + 1];
  521.     BOOL  removable; /* whether medium is removable               */
  522.     SCSI_TAG_TYPE tagType;   /* default tag type: cmds may over-ride      */
  523.     UINT  nTags;      /* total number of tags for device           */
  524.     UINT8 lastSenseKey; /* last sense key returned by dev            */
  525.     UINT8 lastAddSenseCode; /* last additional sense code returned       */
  526.     int   controlByte; /* vendor unique control byte for commands   */
  527.     int   numBlocks; /* number of blocks on the physical device   */
  528.     int   blockSize; /* size of an SCSI disk sector               */
  529.     int   maxVarBlockLimit;     /* maximum size of a variable block: seq dev */
  530.     BOOL  extendedSense; /* whether device returns extended sense     */
  531.     UINT8 *pReqSenseData; /* ptr to last REQ SENSE data returned       */
  532.     int   reqSenseDataLength; /* size of REQ SENSE data array              */
  533.     LIST  blkDevList; /* list of block devs created on device      */
  534.     struct scsiSeqDev *pScsiSeqDev;/* ptr to SCSI seq dev; one per phys dev  */
  535.     SCSI_NEXUS_TYPE nexus;   /* type of current nexuses in progress       */
  536.     UINT nTaggedNexus;      /* number of tagged nexuses in progress      */
  537.     BOOL connected;       /* currently connected to SCSI bus ?         */
  538.     BOOL pendingCA;         /* contingent allegiance condition pending ? */
  539.     SCSI_NEXUS_TYPE savedNexus; /* type of nexus prior to CA recovery        */
  540.     LIST waitingThreads;     /* list of threads waiting for device        */
  541.     LIST activeThreads;      /* list of threads active on device          */
  542.     SCSI_TAG curTag;       /* currently-connected tag (or NONE)         */
  543.     SCSI_TAG nextTag;      /* next free tag number (if any)             */
  544.     UINT nFreeTags;       /* number of free tags (if tags supported)   */
  545.     SCSI_TAG_INFO   untagged;  /* "tag" info for a single untagged thread   */
  546.     SCSI_TAG_INFO * pTagInfo; /* ptr to tag info table for tagged threads  */
  547.     } SCSI_PHYS_DEV;
  548. typedef SCSI_PHYS_DEV *SCSI_PHYS_DEV_ID;
  549. /* SCSI Sequential device */
  550. typedef struct scsiSeqDev /* SCSI_SEQ_DEV - 
  551.    SCSI logical sequential device info */
  552.     {
  553.     SEQ_DEV seqDev; /*  generic logical sequential device info */
  554.     SCSI_PHYS_DEV *pScsiPhysDev;/* ptr to SCSI physical device info */
  555.     } SCSI_SEQ_DEV;
  556. /*
  557.  *  SCSI Block Device and related structures
  558.  */
  559. typedef struct scsiBlkDev /* SCSI_BLK_DEV -
  560.    SCSI logical block device info */
  561.     {
  562.     BLK_DEV blkDev; /* generic logical block device info */
  563.     SCSI_PHYS_DEV *pScsiPhysDev;/* ptr to SCSI physical device info */
  564.     int numBlocks; /* number of blocks on the logical device */
  565.     int blockOffset; /* address of first block on logical device */
  566.     } SCSI_BLK_DEV;
  567. typedef SCSI_BLK_DEV *SCSI_BLK_DEV_ID;
  568. typedef struct scsiBlkDevNode
  569.     {
  570.     NODE blkDevNode;
  571.     SCSI_BLK_DEV scsiBlkDev;
  572.     } SCSI_BLK_DEV_NODE;
  573. /*
  574.  *  SCSI Controller and related structures
  575.  */
  576. typedef enum /* Message In state                 */
  577.     {
  578.     SCSI_MSG_IN_NONE = 0, /* no message in being assembled    */
  579.     SCSI_MSG_IN_SECOND_BYTE,      /* next byte in is second of two    */
  580.     SCSI_MSG_IN_EXT_MSG_LEN, /* next byte in is ext msg length   */
  581.     SCSI_MSG_IN_EXT_MSG_DATA /* next byte(s) in are ext msg data */
  582.     } SCSI_MSG_IN_STATE;
  583. typedef enum /* Message Out state        */
  584.     {
  585.     SCSI_MSG_OUT_NONE = 0, /* no message out available */
  586.     SCSI_MSG_OUT_PENDING, /* message out not yet sent */
  587.     SCSI_MSG_OUT_SENT /* message out already sent */
  588.     } SCSI_MSG_OUT_STATE;
  589. typedef enum                /* Identification In state          */
  590.     {
  591.     SCSI_IDENT_IN_NONE = 0,       /* no identification in progress    */
  592.     SCSI_IDENT_IN_IDENT,          /* next byte in is IDENTIFY msg     */
  593.     SCSI_IDENT_IN_QUEUE_TAG /* next bytes in are QUEUE TAG msg  */
  594.     } SCSI_IDENT_IN_STATE;
  595. typedef enum scsiCacheAction /* Cache management actions         */
  596.     {
  597.     SCSI_CACHE_PRE_COMMAND = 0, /* flush/invalidate before command  */
  598.     SCSI_CACHE_POST_COMMAND /* flush/invalidate after  command  */
  599.     } SCSI_CACHE_ACTION;
  600. #define SCSI_BUS_NEGATE_ACK  0x0001 /* bitmasks for scsiBusControl() */
  601. #define SCSI_BUS_ASSERT_ATN  0x0002
  602. #define SCSI_BUS_DISCONNECT  0x0004
  603. #define SCSI_BUS_RESET      0x0008
  604. typedef struct scsiCtrl /* SCSI_CTRL - generic SCSI controller info  */
  605.     {
  606.     SEM_ID  mutexSem; /* semaphore for exclusive access            */
  607.     SEM_ID  actionSem;     /* sync with controller events or clients    */
  608.     RING_ID eventQ;      /* ring buffer for controller events         */
  609.     RING_ID timeoutQ;      /* ring buffer for request timeouts          */
  610.     RING_ID requestQ;      /* ring buffer for client requests           */
  611.     RING_ID replyQ; /* ring buffer for client replies            */
  612.     int     scsiMgrId;     /* SCSI manager task ID                      */
  613.     FUNCPTR scsiTransact; /* function for managing a SCSI transaction  */
  614.     VOIDFUNCPTR scsiEventProc;  /* function for processing controller events */
  615.     FUNCPTR scsiThreadInit;  /* function for initializing a new thread    */
  616.     FUNCPTR scsiThreadActivate; /* function for (re)activating a thread      */
  617.     FUNCPTR scsiThreadAbort; /* function for aborting a thread            */
  618.     FUNCPTR scsiDevSelect; /* function for selecting a SCSI device      */
  619.     FUNCPTR scsiBusControl; /* function for misc SCSI bus control        */
  620.     FUNCPTR scsiInfoXfer; /* function for SCSI input/output transfers  */
  621.     FUNCPTR scsiXferParamsQuery;/* function for getting sync xfer params     */
  622.     FUNCPTR scsiXferParamsSet;  /* function for setting sync xfer params     */
  623.     FUNCPTR scsiWideXferParamsSet;/* function for setting wide xfer params   */
  624.     FUNCPTR scsiWideXferParamsQuery;/* function for getting Wide xfer params */
  625.     UINT    maxBytesPerXfer; /* upper bound of ctrl. transfer counter     */
  626.     int     eventSize;      /* sizeof event msg (0 = use default)        */
  627.     int     threadSize;      /* sizeof thread    (0 = use default)        */
  628.     int     scsiCtrlBusId; /* SCSI bus ID of this SCSI controller       */
  629.     BOOL    disconnect;         /* globally enable / disable disconnect      */
  630.     BOOL    syncXfer; /* globally enable / disable sync xfer.      */
  631.     BOOL    wideXfer; /* globally enable / disable wide xfer.      */
  632.     BOOL    active;       /* there is an active SCSI thread            */
  633.     int     peerBusId;      /* ID of connected SCSI peer device          */
  634.     UINT    nThreads;      /* total number of threads in existence      */
  635.     LIST    freeThreads;    /* list (set) of free threads                */
  636.     UINT    nextDev;      /* phys dev index for round-robin scheduling */
  637.     struct scsiThread * pIdentThread; /* reserved identification thread    */
  638.     struct scsiThread * pThread;     /* currently active thread           */
  639.     UINT               msgInLength; /* message in bytes read so far      */
  640.     UINT               msgOutLength; /* pending message out length        */
  641.     SCSI_MSG_IN_STATE  msgInState;   /* status of incoming message        */
  642.     SCSI_MSG_OUT_STATE msgOutState; /* status of outgoing message        */
  643.     UINT8 identBuf  [SCSI_MAX_IDENT_MSG_LENGTH];/* incoming ident msg buffer */
  644.     UINT8 msgInBuf  [SCSI_MAX_MSG_IN_BYTES];  /* incoming message buffer   */
  645.     UINT8 msgOutBuf [SCSI_MAX_MSG_OUT_BYTES]; /* outgoing message buffer   */
  646.     SCSI_TARGET    targetArr  [SCSI_MAX_TARGETS];   /* attached SCSI targets */
  647.     SCSI_PHYS_DEV *physDevArr [SCSI_MAX_PHYS_DEVS]; /* attached phys. devs.  */
  648.     BOOL           cacheSnooping; /* is hardware snooping enabled      */
  649.     FUNCPTR scsiSpecialHandler;  /* negotiate transfer paramaters            */
  650.     } SCSI_CTRL;
  651. /*
  652.  *  SCSI thread and related structures
  653.  */
  654. typedef enum           /* event types for "scsiMgrThreadEvent()"  */
  655.     {
  656.     SCSI_THREAD_EVENT_ACTIVATED = 1, /* thread has been activated       */
  657.     SCSI_THREAD_EVENT_DISCONNECTED,  /* thread has disconnected         */
  658.     SCSI_THREAD_EVENT_RECONNECTED,   /* thread has reconnected          */
  659.     SCSI_THREAD_EVENT_COMPLETED,     /* thread has completed            */
  660.     SCSI_THREAD_EVENT_DEFERRED      /* thread has been deferred        */
  661.     } SCSI_THREAD_EVENT_TYPE;
  662. typedef enum           /* SCSI thread state enumeration             */
  663.     {
  664.     SCSI_THREAD_INACTIVE = 0,   /* thread is not doing anything              */
  665.     SCSI_THREAD_WAITING,     /* thread is waiting for access to phys dev  */
  666.     SCSI_THREAD_DISCONNECTED, /* thread is disconnected from SCSI bus      */
  667.     SCSI_THREAD_CONNECTING,   /* thread is selecting target device         */
  668.     SCSI_THREAD_IDENT_IN,    /* thread is receiving identification msg(s) */
  669.     SCSI_THREAD_IDENT_OUT,    /* thread is sending identification msg(s)   */
  670.     SCSI_THREAD_ESTABLISHED, /* thread has established a SCSI nexus       */
  671.     SCSI_THREAD_WAIT_DISCONNECT,/* thread is waiting for disconnection       */
  672.     SCSI_THREAD_WAIT_COMPLETE,  /* thread is waiting for final disconnection */
  673.     SCSI_THREAD_ABORTING,    /* thread is aborting a normal connection    */
  674.     SCSI_THREAD_IDENT_ABORTING, /* thread is aborting identification msg in  */
  675.     SCSI_THREAD_WAIT_ABORT     /* thread has been aborted                   */
  676.     } SCSI_THREAD_STATE;
  677. typedef enum /* status of incoming identification         */
  678.     {
  679.     SCSI_IDENT_INCOMPLETE,   /* identification message not yet complete   */
  680.     SCSI_IDENT_COMPLETE,     /* identification successfully completed     */
  681.     SCSI_IDENT_FAILED      /* identification incorrect: to be rejected  */
  682.     } SCSI_IDENT_STATUS;
  683. typedef enum           /* SCSI role type enumeration        */
  684.     {
  685.     SCSI_ROLE_INITIATOR = 0, /* initiating a SCSI transaction     */
  686.     SCSI_ROLE_TARGET,      /* target for a SCSI transaction     */
  687.     SCSI_ROLE_IDENT_INIT,    /* identifying a reselecting target  */
  688.     SCSI_ROLE_IDENT_TARG     /* identifying a selecting initiator */
  689.     } SCSI_ROLE;
  690. typedef struct scsiThread /* SCSI_THREAD */
  691.     {
  692.     NODE           lstNode;  /* node to support lists of threads         */
  693.     SCSI_CTRL     *pScsiCtrl; /* SCSI controller thread is using          */
  694.     SCSI_TARGET   *pScsiTarget; /* SCSI target device thread is using       */
  695.     SCSI_PHYS_DEV *pScsiPhysDev;/* SCSI physical device thread is using     */
  696.     MSG_Q_ID       replyQ; /* reply from thread manager                */
  697.     WDOG_ID       wdog;     /* request timeout watchdog                 */
  698.     SCSI_THREAD_STATE state; /* thread's current state                   */
  699.     SCSI_ROLE      role;     /* SCSI role (initiator/target/ident)       */
  700.     STATUS         status;   /* completion status for thread request     */
  701.     int            errNum;      /* error code for thread request            */
  702.     UINT           tagNumber; /* tag number used by this thread           */
  703.     SCSI_TAG_TYPE  tagType;  /* tag type used by this thread             */
  704.     UINT           timeout;  /* timeout period (ticks)                   */
  705.     SCSI_PRIORITY  priority; /* thread priority: 0 highest, 255 lowest   */
  706.     int            dataDirection;   /* data direction: O_{RDONLY,WRONLY}    */
  707. /* identification msg to be sent (if any)   */
  708.     UINT8  identMsg[SCSI_MAX_IDENT_MSG_LENGTH];
  709.     UINT   identMsgLength;     /* number of identification bytes to send   */
  710.     UINT8 *cmdAddress;      /* SCSI command pointer                     */
  711.     UINT   cmdLength;        /* number of command bytes to transfer      */
  712.     UINT8 *statusAddress;     /* buffer for SCSI status byte              */
  713.     UINT   statusLength;     /* number of status bytes to transfer       */
  714.     UINT8 *dataAddress;      /* SCSI data pointer         (init'l value) */
  715.     UINT   dataLength;    /* remaining data byte count (init'l value) */
  716.     UINT8 *activeDataAddress; /* SCSI data pointer         (active value) */
  717.     UINT   activeDataLength;    /* remaining data byte count (active value) */
  718.     UINT8 *savedDataAddress;    /* SCSI data pointer         (saved value)  */
  719.     UINT   savedDataLength; /* remaining data byte count (saved value)  */
  720.     UINT   nBytesIdent;      /* number of ident bytes sent/received      */
  721.     } SCSI_THREAD;
  722. /*
  723.  *  Structures used by clients to communicate with the SCSI manager task
  724.  */
  725. typedef enum /* requests to SCSI manager      */
  726.     {
  727.     SCSI_REQUEST_ACTIVATE = 0, /* activate initiator thread        */
  728.     SCSI_REQUEST_WAIT_ACTIVATION, /* wait activation of target thread */
  729.     SCSI_REQUEST_TRANSFER,        /* transfer data on target thread   */
  730.     SCSI_REQUEST_DEACTIVATE, /* deactivate target thread         */
  731.     SCSI_REQUEST_REACTIVATE, /* reactivate target thread         */
  732.     SCSI_REQUEST_COMPLETE        /* complete target thread           */
  733.     } SCSI_REQUEST_TYPE;
  734. typedef struct scsiRequest        /* request message to SCSI manager  */
  735.     {
  736.     SCSI_REQUEST_TYPE type;       /* type of request: as above        */
  737.     SCSI_THREAD *     thread;      /* thread request corresponds to    */
  738.     } SCSI_REQUEST;
  739. typedef enum                /* replies from SCSI manager        */
  740.     {
  741.     SCSI_REPLY_COMPLETE = 0      /* thread has completed (or failed) */
  742.     } SCSI_REPLY_TYPE;
  743. typedef struct scsiReply          /* reply message from SCSI manager  */
  744.     {
  745.     SCSI_REPLY_TYPE type;         /* type of reply: as above          */
  746.     SCSI_THREAD *   thread;       /* thread reply corresponds to      */
  747.     STATUS          status;       /* status of last request           */
  748.     int             errNum;       /* errno, if status == ERROR        */
  749.     } SCSI_REPLY;
  750. /*
  751.  *  SCSI manager timeout message structure
  752.  */
  753. typedef struct scsiTimeout
  754.     {
  755.     SCSI_THREAD * thread;
  756.     } SCSI_TIMEOUT;
  757. /*
  758.  *  SCSI Controller Event message structure
  759.  */
  760. typedef enum           /* SCSI controller event enumeration         */
  761.     {
  762.     SCSI_EVENT_CONNECTED = 1, /* (re)select cmd has successfully completed */
  763.     SCSI_EVENT_DISCONNECTED, /* target device has disconnected            */
  764.     SCSI_EVENT_RESELECTED,  /* controller has been reselected            */
  765.     SCSI_EVENT_SELECTED,  /* controller has been selected              */
  766.     SCSI_EVENT_XFER_REQUEST, /* target device has requested info xfer     */
  767.     SCSI_EVENT_TIMEOUT,     /* (re)selection or info xfer timed out      */
  768.     SCSI_EVENT_BUS_RESET,    /* the SCSI bus has been reset               */
  769.     SCSI_EVENT_PARITY_ERR    /* parity error detected                     */
  770.     } SCSI_EVENT_TYPE;
  771. typedef struct scsiEvent     /* SCSI_EVENT */
  772.     {
  773.     /*
  774.      * Note: some fields may not be used, depending on the event type.
  775.      * If this structure gets much bigger, it should probably be made into
  776.      * a tagged union.
  777.      */
  778.     SCSI_EVENT_TYPE type;    /* type of event: as above                */
  779.     int   busId;        /* bus ID of SCSI peer (con, resel, sel)  */
  780.     int   nBytesIdent;      /* # bytes ident in/out (con, resel, sel) */
  781.     UINT8 identMsg [SCSI_MAX_IDENT_MSG_LENGTH]; /* ident msg (resel, sel) */
  782.     int   phase;          /* requested SCSI bus phase  (xfer req)   */
  783.     } SCSI_EVENT;
  784.     
  785. /* END_HIDDEN */
  786. /* external variable declarations */
  787. IMPORT BOOL scsiDebug;
  788. IMPORT BOOL scsiIntsDebug;
  789. IMPORT SCSI_CTRL *pSysScsiCtrl;
  790. /* macros */
  791. #define SCSI_MSG
  792. logMsg  
  793. #define SCSI_ERROR_MSG                              
  794.     if (scsiErrors || scsiDebug)                        
  795.      SCSI_MSG
  796.     
  797. #define SCSI_DEBUG_MSG
  798.     if (scsiDebug)
  799. SCSI_MSG  
  800. #define SCSI_INT_DEBUG_MSG
  801.     if (scsiIntsDebug)
  802. logMsg  
  803. /*******************************************************************************
  804. *
  805. * SCSI_SWAB - swap bytes on little-endian machines
  806. *
  807. * All fields which are defined as integers (short or long) by the SCSI spec
  808. * and which are passed during the data phase should be pre- or post-processed
  809. * by this macro. The macro does nothing on big-endian machines, but swaps
  810. * bytes for little-endian machines. All SCSI quantities are big-endian.
  811. *
  812. * NOMANUAL
  813. */
  814. #if (_BYTE_ORDER == _BIG_ENDIAN)
  815. #define SCSI_SWAB(pBuffer, bufLength)
  816. #else
  817. #define SCSI_SWAB(pBuffer, bufLength)
  818.     do
  819. {
  820. char temp;
  821. char *pHead = (char *) pBuffer;
  822. char *pTail = (char *) pBuffer + bufLength - 1;
  823. while (pHead < pTail)
  824.     {
  825.     temp = *pTail;
  826.     *pTail-- = *pHead;
  827.     *pHead++ = temp;
  828.     }
  829. } while (FALSE)
  830. #endif
  831. /* global variables */
  832. extern SCSI_FUNC_TBL * pScsiIfTbl;      /* scsiLib interface function table */
  833. extern BOOL scsiErrors;                 /* enable SCSI error messages */
  834. extern int scsiMgrActionSemOptions;
  835. extern int scsiThreadReplyQOptions;
  836. extern int scsiMgrEventQSize;
  837. extern int scsiMgrTimeoutQSize;
  838. extern int scsiMgrRequestQSize;
  839. extern int scsiMgrReplyQSize;
  840. /* function declarations */
  841. #if defined(__STDC__) || defined(__cplusplus)
  842. extern void   scsi2IfInit ();
  843. /* SCSI block device driver functions */
  844. extern BLK_DEV *scsiBlkDevCreate (SCSI_PHYS_DEV *pScsiPhysDev, int numBlocks,
  845.   int blockOffset);
  846. extern void  scsiBlkDevInit   (SCSI_BLK_DEV *pScsiBlkDev, int blksPerTrack,
  847.   int nHeads);
  848. extern void  scsiBlkDevShow   (SCSI_PHYS_DEV *pScsiPhysDev);
  849. extern STATUS  scsiRdSecs       (SCSI_BLK_DEV *pScsiBlkDev, int sector,
  850.   int numSecs, char *buffer);
  851. extern STATUS  scsiWrtSecs      (SCSI_BLK_DEV *pScsiBlkDev, int sector,
  852.   int numSecs, char *buffer);
  853. /* general SCSI functions */
  854. extern SCSI_PHYS_DEV *scsiPhysDevCreate (SCSI_CTRL *pScsiCtrl, int devBusId,
  855.  int devLUN, int reqSenseLength,
  856.  int devType, BOOL removable,
  857.  int numBlocks, int blockSize);
  858. extern SCSI_PHYS_DEV *scsiPhysDevIdGet (SCSI_CTRL *pScsiCtrl, int devBusId,
  859.         int devLUN);
  860. extern STATUS  scsiPhysDevDelete (SCSI_PHYS_DEV *pScsiPhysDev);
  861. extern STATUS  scsiAutoConfig (SCSI_CTRL *pScsiCtrl);
  862. extern STATUS  scsiBusReset (SCSI_CTRL *pScsiCtrl);
  863. extern STATUS  scsiCmdBuild (SCSI_COMMAND scsiCmd, int *pCmdLength,
  864.       UINT8 opCode, int LUN, BOOL relAdrs,
  865.       int logBlockAdrs, int xferLength,
  866.       UINT8 controlByte);
  867. extern STATUS  scsiCtrlInit (SCSI_CTRL *pScsiCtrl);
  868. extern SCSI_THREAD * scsiCtrlIdentThreadCreate (SCSI_CTRL *pScsiCtrl);
  869. extern STATUS        scsiCtrlThreadInit        (SCSI_CTRL   * pScsiCtrl,
  870. SCSI_THREAD * pThread);
  871. extern STATUS        scsiCtrlThreadActivate    (SCSI_CTRL   * pScsiCtrl,
  872. SCSI_THREAD * pThread);
  873. extern void          scsiCtrlEvent             (SCSI_CTRL   * pScsiCtrl,
  874. SCSI_EVENT  * pEvent);
  875. extern BOOL          scsiCtrlThreadAbort       (SCSI_CTRL   * pScsiCtrl,
  876. SCSI_THREAD * pThread);
  877. extern STATUS  scsiIoctl (SCSI_PHYS_DEV *pScsiPhysDev, int function, int arg);
  878. extern STATUS  scsiShow (SCSI_CTRL *pScsiCtrl);
  879. extern STATUS  scsiTransact (SCSI_PHYS_DEV *pScsiPhysDev,
  880.       SCSI_TRANSACTION *pScsiXaction);
  881. extern STATUS   scsiTargetOptionsSet (SCSI_CTRL *pScsiCtrl, int devBusId,
  882.       SCSI_OPTIONS *pOptions, UINT which);
  883. extern STATUS   scsiTargetOptionsGet (SCSI_CTRL *pScsiCtrl, int devBusId,
  884.       SCSI_OPTIONS *pOptions);
  885. extern void     scsiTargetReset (SCSI_CTRL * pScsiCtrl, UINT busId);
  886. extern void     scsiThreadListShow   (LIST * pList);
  887. extern void     scsiThreadListIdShow (LIST * pList);
  888. extern void     scsiPhysDevShow (SCSI_PHYS_DEV * pScsiPhysDev, 
  889.  BOOL showThreads, BOOL noHeader);
  890. extern char * scsiPhaseNameGet (int scsiPhase);
  891. extern void     scsiCacheSnoopEnable (SCSI_CTRL * pScsiCtrl);
  892. extern void     scsiCacheSnoopDisable (SCSI_CTRL * pScsiCtrl);
  893. /* functions to execute specific SCSI commands */
  894. extern STATUS  scsiFormatUnit   (SCSI_PHYS_DEV *pScsiPhysDev,
  895.   BOOL cmpDefectList, int defListFormat,
  896.   int vendorUnique,   int interleave,
  897.   char *buffer,       int bufLength);
  898. extern STATUS  scsiInquiry      (SCSI_PHYS_DEV *pScsiPhysDev, char *buffer,
  899.           int bufLength);
  900. extern STATUS  scsiModeSelect   (SCSI_PHYS_DEV *pScsiPhysDev, int pageFormat,
  901.   int saveParams, char *buffer, int bufLength);
  902. extern STATUS  scsiModeSense    (SCSI_PHYS_DEV *pScsiPhysDev, int pageControl,
  903.           int pageCode, char *buffer, int bufLength);
  904. extern STATUS  scsiReadCapacity (SCSI_PHYS_DEV *pScsiPhysDev, int *pLastLBA,
  905.   int *pBlkLength);
  906. extern STATUS  scsiReqSense     (SCSI_PHYS_DEV *pScsiPhysDev, char *buffer,
  907.           int bufLength);
  908. extern STATUS  scsiTestUnitRdy  (SCSI_PHYS_DEV *pScsiPhysDev);
  909. extern STATUS  scsiStartStopUnit(SCSI_PHYS_DEV *pScsiPhysDev,  BOOL start);
  910. extern STATUS  scsiRelease      (SCSI_PHYS_DEV * pScsiPhysDev);
  911. extern STATUS  scsiReserve      (SCSI_PHYS_DEV * pScsiPhysDev);
  912. /* Functions to execute SCSI sequential access commands */
  913. extern SEQ_DEV *scsiSeqDevCreate (SCSI_PHYS_DEV *pScsiPhysDev);
  914. extern STATUS scsiErase (SCSI_PHYS_DEV *pScsiPhysDev, BOOL longErase);
  915. extern STATUS scsiTapeModeSelect (SCSI_PHYS_DEV *pScsiPhysDev, int pageFormat, 
  916.           int saveParams, char *buffer, int bufLength);
  917. extern STATUS scsiTapeModeSense (SCSI_PHYS_DEV *pScsiPhysDev, int pageControl,
  918.          int pageCode, char *buffer, int bufLength);
  919. extern STATUS scsiReadBlockLimits (SCSI_PHYS_DEV *pScsiPhysDev, 
  920.    int *pMaxBlockLength, 
  921.    UINT16 *pMinBlockLength);
  922. extern STATUS scsiSeqReadBlockLimits (SCSI_SEQ_DEV *pScsiSeqDev, 
  923.    int *pMaxBlockLength, 
  924.    UINT16 *pMinBlockLength);
  925. extern int scsiRdTape (SCSI_SEQ_DEV *pScsiSeqDev, UINT numBytes, 
  926.   char *buffer, BOOL fixedSize);
  927. extern STATUS scsiWrtTape (SCSI_SEQ_DEV *pScsiSeqDev, int numBytes, 
  928.    char *buffer, BOOL fixedSize);
  929. extern STATUS scsiRewind (SCSI_SEQ_DEV *pScsiSeqDev);
  930. extern STATUS scsiReserveUnit (SCSI_SEQ_DEV *pScsiSeqDev);
  931. extern STATUS scsiReleaseUnit (SCSI_SEQ_DEV *pScsiSeqDev);
  932. extern STATUS scsiLoadUnit (SCSI_SEQ_DEV *pScsiSeqDev, BOOL load, BOOL reten,
  933.      BOOL eot);
  934. extern STATUS scsiWrtFileMarks (SCSI_SEQ_DEV *pScsiSeqDev, int numMarks, 
  935.         BOOL shortMark);
  936. extern STATUS scsiSpace (SCSI_SEQ_DEV *pScsiSeqDev, int count, int spaceCode);
  937. extern STATUS scsiSeqStatusCheck (SCSI_SEQ_DEV *pScsiSeqDev);
  938. STATUS scsiSeqIoctl (SCSI_SEQ_DEV * pScsiSeqDev, int function, int arg);
  939. /* SCSI controller driver support functions (not callable by applications) */
  940. extern int               scsiIdentMsgBuild (UINT8         *msg,
  941.             SCSI_PHYS_DEV *pScsiPhysDev,
  942.             SCSI_TAG_TYPE  tagType,
  943.             SCSI_TAG       tagNumber);
  944. extern SCSI_IDENT_STATUS scsiIdentMsgParse (SCSI_CTRL      *pScsiCtrl,
  945.     UINT8          *msg,
  946.     int             msgLength,
  947.     SCSI_PHYS_DEV **ppScsiPhysDev,
  948.     SCSI_TAG       *pTagNum);
  949. extern STATUS scsiMsgInComplete  (SCSI_CTRL *pScsiCtrl, SCSI_THREAD *pThread);
  950. extern STATUS scsiMsgOutComplete (SCSI_CTRL *pScsiCtrl, SCSI_THREAD *pThread);
  951. extern void   scsiMsgOutReject   (SCSI_CTRL *pScsiCtrl, SCSI_THREAD *pThread);
  952. extern void   scsiSyncXferNegotiate (SCSI_CTRL           *pScsiCtrl,
  953.                          SCSI_TARGET         *pScsiTarget,
  954.                          SCSI_SYNC_XFER_EVENT eventType);
  955. extern void   scsiWideXferNegotiate (SCSI_CTRL  *pScsiCtrl,
  956.                          SCSI_TARGET         *pScsiTarget,
  957.                          SCSI_WIDE_XFER_EVENT eventType);
  958. extern void   scsiMgr (SCSI_CTRL *pScsiCtrl);
  959. extern STATUS scsiMgrEventNotify (SCSI_CTRL  *pScsiCtrl,
  960.   SCSI_EVENT *pEvent,
  961.   int         eventSize);
  962. extern void   scsiMgrCtrlEvent (SCSI_CTRL *pScsiCtrl, SCSI_EVENT_TYPE type);
  963. extern void   scsiMgrBusReset  (SCSI_CTRL   *pScsiCtrl);
  964. extern void   scsiMgrThreadEvent (SCSI_THREAD *pThread,
  965.   SCSI_THREAD_EVENT_TYPE type);
  966. extern SCSI_THREAD * scsiMgrPhysDevActiveThreadFind (SCSI_PHYS_DEV *pScsiPhysDev,
  967.                      SCSI_TAG       tagNumber);
  968. extern STATUS       scsiMgrRequestExecute  (SCSI_CTRL    * pScsiCtrl,
  969.                                             SCSI_REQUEST * pRequest,
  970.                                             SCSI_REPLY   * pReply);
  971. extern void         scsiMgrPhysDevTagInit  (SCSI_PHYS_DEV * pScsiPhysDev);
  972. extern void   scsiBusResetNotify (SCSI_CTRL *pScsiCtrl);
  973. extern STATUS scsiThreadInit (SCSI_THREAD *pThread);
  974. extern void   scsiCacheSynchronize (SCSI_THREAD *pThread,
  975.     SCSI_CACHE_ACTION action);
  976. #else /* __STDC__ */
  977. /* SCSI block device driver functions */
  978. extern BLK_DEV * scsiBlkDevCreate ();
  979. extern void   scsiBlkDevInit ();
  980. extern void   scsiBlkDevShow ();
  981. extern STATUS   scsiRdSecs ();
  982. extern STATUS   scsiWrtSecs ();
  983. /* general SCSI functions */
  984. extern SCSI_PHYS_DEV * scsiPhysDevCreate ();
  985. extern SCSI_PHYS_DEV * scsiPhysDevIdGet ();
  986. extern STATUS  scsiPhysDevDelete ();
  987. extern STATUS  scsiAutoConfig ();
  988. extern STATUS  scsiBusReset ();
  989. extern STATUS  scsiCmdBuild ();
  990. extern STATUS  scsiCtrlInit ();
  991. extern SCSI_THREAD * scsiCtrlIdentThreadCreate ();
  992. extern STATUS        scsiCtrlThreadInit ();
  993. extern STATUS        scsiCtrlThreadActivate ();
  994. extern void          scsiCtrlEvent ();
  995. extern BOOL          scsiCtrlThreadAbort ();
  996. extern STATUS  scsiIoctl ();
  997. extern STATUS  scsiShow ();
  998. extern STATUS  scsiTransact ();
  999. extern STATUS   scsiTargetOptionsSet ();
  1000. extern STATUS   scsiTargetOptionsGet ();
  1001. extern void     scsiTargetReset ();
  1002. extern void     scsiThreadListShow ();
  1003. extern void     scsiThreadListIdShow ();
  1004. extern void     scsiPhysDevShow ();
  1005. extern char * scsiPhaseNameGet ();
  1006. extern void     scsiCacheSnoopEnable ();
  1007. extern void     scsiCacheSnoopDisable ();
  1008. /* functions to execute specific SCSI commands */
  1009. extern STATUS  scsiFormatUnit ();
  1010. extern STATUS  scsiInquiry ();
  1011. extern STATUS  scsiModeSelect ();
  1012. extern STATUS  scsiModeSense ();
  1013. extern STATUS  scsiReadCapacity ();
  1014. extern STATUS  scsiReqSense ();
  1015. extern STATUS  scsiTestUnitRdy ();
  1016. /* SCSI controller driver support functions (not callable by applications) */
  1017. extern int               scsiIdentMsgBuild ();
  1018. extern SCSI_IDENT_STATUS scsiIdentMsgParse ();
  1019. extern STATUS  scsiMsgInComplete ();
  1020. extern STATUS  scsiMsgOutComplete ();
  1021. extern void    scsiMsgOutReject ();
  1022. extern void    scsiSyncXferNegotiate ();
  1023. extern void    scsiWideXferNegotiate ();
  1024. extern void    scsiMgr ();
  1025. extern STATUS  scsiMgrEventNotify ();
  1026. extern void    scsiMgrCtrlEvent ();
  1027. extern void    scsiMgrBusReset ();
  1028. extern void    scsiMgrThreadEvent ();
  1029. extern STATUS  scsiMgrRequestExecute ();
  1030. extern void    scsiMgrPhysDevTagInit ();
  1031. extern SCSI_THREAD *scsiMgrPhysDevActiveThreadFind ();
  1032. extern void    scsiBusResetNotify ();
  1033. extern STATUS  scsiThreadInit ();
  1034. extern void    scsiCacheSynchronize ();
  1035. #endif /* __STDC__ */
  1036. #ifdef __cplusplus
  1037. }
  1038. #endif
  1039. #endif /* _ASMLANGUAGE */
  1040. #endif /* __INCscsi2Libh */