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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.   FlashPoint.c -- FlashPoint SCCB Manager for Linux
  3.   This file contains the FlashPoint SCCB Manager from BusLogic's FlashPoint
  4.   Driver Developer's Kit, with minor modifications by Leonard N. Zubkoff for
  5.   Linux compatibility.  It was provided by BusLogic in the form of 16 separate
  6.   source files, which would have unnecessarily cluttered the scsi directory, so
  7.   the individual files have been combined into this single file.
  8.   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  9.   This file is available under both the GNU General Public License
  10.   and a BSD-style copyright; see LICENSE.FlashPoint for details.
  11. */
  12. #include <linux/config.h>
  13. #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
  14. #define UNIX
  15. #define FW_TYPE _SCCB_MGR_
  16. #define MAX_CARDS 8
  17. #undef BUSTYPE_PCI
  18. #define OS_InPortByte(port) inb(port)
  19. #define OS_InPortWord(port) inw(port)
  20. #define OS_InPortLong(port) inl(port)
  21. #define OS_OutPortByte(port, value) outb(value, port)
  22. #define OS_OutPortWord(port, value) outw(value, port)
  23. #define OS_OutPortLong(port, value) outl(value, port)
  24. #define OS_Lock(x)
  25. #define OS_UnLock(x)
  26. /*
  27.   Define name replacements for compatibility with the Linux BusLogic Driver.
  28. */
  29. #define SccbMgr_sense_adapter FlashPoint_ProbeHostAdapter
  30. #define SccbMgr_config_adapter FlashPoint_HardwareResetHostAdapter
  31. #define SccbMgr_unload_card FlashPoint_ReleaseHostAdapter
  32. #define SccbMgr_start_sccb FlashPoint_StartCCB
  33. #define SccbMgr_abort_sccb FlashPoint_AbortCCB
  34. #define SccbMgr_my_int FlashPoint_InterruptPending
  35. #define SccbMgr_isr FlashPoint_HandleInterrupt
  36. /*
  37.   Define name replacements to avoid kernel namespace pollution.
  38. */
  39. #define BL_Card FPT_BL_Card
  40. #define BusMasterInit FPT_BusMasterInit
  41. #define CalcCrc16 FPT_CalcCrc16
  42. #define CalcLrc FPT_CalcLrc
  43. #define ChkIfChipInitialized FPT_ChkIfChipInitialized
  44. #define DiagBusMaster FPT_DiagBusMaster
  45. #define DiagEEPROM FPT_DiagEEPROM
  46. #define DiagXbow FPT_DiagXbow
  47. #define GetTarLun FPT_GetTarLun
  48. #define RNVRamData FPT_RNVRamData
  49. #define RdStack FPT_RdStack
  50. #define SccbMgrTableInitAll FPT_SccbMgrTableInitAll
  51. #define SccbMgrTableInitCard FPT_SccbMgrTableInitCard
  52. #define SccbMgrTableInitTarget FPT_SccbMgrTableInitTarget
  53. #define SccbMgr_bad_isr FPT_SccbMgr_bad_isr
  54. #define SccbMgr_scsi_reset FPT_SccbMgr_scsi_reset
  55. #define SccbMgr_timer_expired FPT_SccbMgr_timer_expired
  56. #define SendMsg FPT_SendMsg
  57. #define Wait FPT_Wait
  58. #define Wait1Second FPT_Wait1Second
  59. #define WrStack FPT_WrStack
  60. #define XbowInit FPT_XbowInit
  61. #define autoCmdCmplt FPT_autoCmdCmplt
  62. #define autoLoadDefaultMap FPT_autoLoadDefaultMap
  63. #define busMstrDataXferStart FPT_busMstrDataXferStart
  64. #define busMstrSGDataXferStart FPT_busMstrSGDataXferStart
  65. #define busMstrTimeOut FPT_busMstrTimeOut
  66. #define dataXferProcessor FPT_dataXferProcessor
  67. #define default_intena FPT_default_intena
  68. #define hostDataXferAbort FPT_hostDataXferAbort
  69. #define hostDataXferRestart FPT_hostDataXferRestart
  70. #define inisci FPT_inisci
  71. #define mbCards FPT_mbCards
  72. #define nvRamInfo FPT_nvRamInfo
  73. #define phaseBusFree FPT_phaseBusFree
  74. #define phaseChkFifo FPT_phaseChkFifo
  75. #define phaseCommand FPT_phaseCommand
  76. #define phaseDataIn FPT_phaseDataIn
  77. #define phaseDataOut FPT_phaseDataOut
  78. #define phaseDecode FPT_phaseDecode
  79. #define phaseIllegal FPT_phaseIllegal
  80. #define phaseMsgIn FPT_phaseMsgIn
  81. #define phaseMsgOut FPT_phaseMsgOut
  82. #define phaseStatus FPT_phaseStatus
  83. #define queueAddSccb FPT_queueAddSccb
  84. #define queueCmdComplete FPT_queueCmdComplete
  85. #define queueDisconnect FPT_queueDisconnect
  86. #define queueFindSccb FPT_queueFindSccb
  87. #define queueFlushSccb FPT_queueFlushSccb
  88. #define queueFlushTargSccb FPT_queueFlushTargSccb
  89. #define queueSearchSelect FPT_queueSearchSelect
  90. #define queueSelectFail FPT_queueSelectFail
  91. #define s_PhaseTbl FPT_s_PhaseTbl
  92. #define scamHAString FPT_scamHAString
  93. #define scamInfo FPT_scamInfo
  94. #define scarb FPT_scarb
  95. #define scasid FPT_scasid
  96. #define scbusf FPT_scbusf
  97. #define sccbMgrTbl FPT_sccbMgrTbl
  98. #define schkdd FPT_schkdd
  99. #define scini FPT_scini
  100. #define sciso FPT_sciso
  101. #define scmachid FPT_scmachid
  102. #define scsavdi FPT_scsavdi
  103. #define scsel FPT_scsel
  104. #define scsell FPT_scsell
  105. #define scsendi FPT_scsendi
  106. #define scvalq FPT_scvalq
  107. #define scwirod FPT_scwirod
  108. #define scwiros FPT_scwiros
  109. #define scwtsel FPT_scwtsel
  110. #define scxferc FPT_scxferc
  111. #define sdecm FPT_sdecm
  112. #define sfm FPT_sfm
  113. #define shandem FPT_shandem
  114. #define sinits FPT_sinits
  115. #define sisyncn FPT_sisyncn
  116. #define sisyncr FPT_sisyncr
  117. #define siwidn FPT_siwidn
  118. #define siwidr FPT_siwidr
  119. #define sres FPT_sres
  120. #define sresb FPT_sresb
  121. #define ssel FPT_ssel
  122. #define ssenss FPT_ssenss
  123. #define sssyncv FPT_sssyncv
  124. #define stsyncn FPT_stsyncn
  125. #define stwidn FPT_stwidn
  126. #define sxfrp FPT_sxfrp
  127. #define utilEERead FPT_utilEERead
  128. #define utilEEReadOrg FPT_utilEEReadOrg
  129. #define utilEESendCmdAddr FPT_utilEESendCmdAddr
  130. #define utilEEWrite FPT_utilEEWrite
  131. #define utilEEWriteOnOff FPT_utilEEWriteOnOff
  132. #define utilUpdateResidual FPT_utilUpdateResidual
  133. /*----------------------------------------------------------------------
  134.  *
  135.  *
  136.  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  137.  *
  138.  *   This file is available under both the GNU General Public License
  139.  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
  140.  *
  141.  *   $Workfile:   globals.h  $
  142.  *
  143.  *   Description:  Common shared global defines.
  144.  *
  145.  *   $Date: 1996/09/04 01:26:13 $
  146.  *
  147.  *   $Revision: 1.11 $
  148.  *
  149.  *----------------------------------------------------------------------*/
  150. #ifndef __GLOBALS_H__
  151. #define __GLOBALS_H__
  152. #define _UCB_MGR_  1
  153. #define _SCCB_MGR_ 2
  154. /*#include <osflags.h>*/
  155. #define MAX_CDBLEN  12
  156. #define SCAM_LEV_2 1
  157. #define CRCMASK 0xA001
  158. /*  In your osflags.h file, please ENSURE that only ONE OS FLAG 
  159.     is on at a time !!! Also, please make sure you turn set the 
  160.    variable FW_TYPE to either _UCB_MGR_ or _SCCB_MGR_  !!! */
  161. #if defined(DOS) || defined(WIN95_16) || defined(OS2) || defined(OTHER_16)
  162.    #define       COMPILER_16_BIT 1
  163. #elif defined(NETWARE) || defined(NT) || defined(WIN95_32) || defined(UNIX) || defined(OTHER_32) || defined(SOLARIS_REAL_MODE)
  164.    #define       COMPILER_32_BIT 1
  165. #endif
  166. #define     BL_VENDOR_ID      0x104B
  167. #define     FP_DEVICE_ID      0x8130
  168. #define     MM_DEVICE_ID      0x1040
  169. #ifndef FALSE
  170. #define FALSE           0
  171. #endif
  172. #ifndef TRUE
  173. #define TRUE            (!(FALSE))
  174. #endif
  175. #ifndef NULL
  176. #define NULL            0
  177. #endif
  178. #define FAILURE         0xFFFFFFFFL
  179. typedef unsigned char   UCHAR;
  180. typedef unsigned short  USHORT;
  181. typedef unsigned int    UINT;
  182. typedef unsigned long   ULONG;
  183. typedef unsigned char * PUCHAR;
  184. typedef unsigned short* PUSHORT;
  185. typedef unsigned long * PULONG;
  186. typedef void *          PVOID;
  187. #if defined(COMPILER_16_BIT)
  188. typedef unsigned char far       * uchar_ptr;
  189. typedef unsigned short far      * ushort_ptr;
  190. typedef unsigned long far       * ulong_ptr;
  191. #endif  /* 16_BIT_COMPILER */
  192. #if defined(COMPILER_32_BIT)
  193. typedef unsigned char           * uchar_ptr;
  194. typedef unsigned short          * ushort_ptr;
  195. typedef unsigned long           * ulong_ptr;
  196. #endif  /* 32_BIT_COMPILER */
  197. /*   NEW TYPE DEFINITIONS (shared with Mylex North)
  198. **  Use following type defines to avoid confusion in 16 and 32-bit
  199. **  environments.  Avoid using 'int' as it denotes 16 bits in 16-bit
  200. **  environment and 32 in 32-bit environments.
  201. */
  202. #define s08bits char
  203. #define s16bits  short
  204. #define s32bits long
  205. #define u08bits unsigned s08bits
  206. #define u16bits unsigned s16bits
  207. #define u32bits unsigned s32bits
  208. #if defined(COMPILER_16_BIT)
  209. typedef u08bits far  * pu08bits;
  210. typedef u16bits far  * pu16bits;
  211. typedef u32bits far * pu32bits;
  212. #endif /* COMPILER_16_BIT */
  213. #if defined(COMPILER_32_BIT)
  214. typedef u08bits  * pu08bits;
  215. typedef u16bits  * pu16bits;
  216. typedef u32bits  * pu32bits;
  217. #endif /* COMPILER_32_BIT */
  218. #define BIT(x)          ((UCHAR)(1<<(x)))    /* single-bit mask in bit position x */
  219. #define BITW(x)          ((USHORT)(1<<(x)))  /* single-bit mask in bit position x */
  220. #if defined(DOS)
  221. /*#include <dos.h>*/
  222. #undef inportb          /* undefine for Borland Lib */
  223. #undef inport           /* they may have define I/O function in LIB */
  224. #undef outportb
  225. #undef outport
  226. #define OS_InPortByte(ioport)  inportb(ioport)
  227. #define OS_InPortWord(ioport)  inport(ioport)
  228. #define OS_InPortLong(ioport) inportq(ioport, val)
  229. #define OS_OutPortByte(ioport, val) outportb(ioport, val)
  230. #define OS_OutPortWord(ioport, val) outport(ioport, val)
  231. #define OS_OutPortLong(ioport) outportq(ioport, val)
  232. #endif /* DOS */
  233. #if defined(NETWARE) || defined(OTHER_32) ||  defined(OTHER_16)
  234. extern u08bits OS_InPortByte(u32bits ioport);
  235. extern u16bits OS_InPortWord(u32bits ioport);
  236. extern u32bits OS_InPortLong(u32bits ioport);
  237. extern OS_InPortByteBuffer(u32bits ioport, pu08bits buffer, u32bits count);
  238. extern OS_InPortWordBuffer(u32bits ioport, pu16bits buffer, u32bits count);
  239. extern OS_OutPortByte(u32bits ioport, u08bits val);
  240. extern OS_OutPortWord(u32bits ioport, u16bits val);
  241. extern OS_OutPortLong(u32bits ioport, u32bits val);
  242. extern OS_OutPortByteBuffer(u32bits ioport, pu08bits buffer, u32bits count);
  243. extern OS_OutPortWordBuffer(u32bits ioport, pu16bits buffer, u32bits count);
  244. #endif /* NETWARE || OTHER_32 || OTHER_16 */
  245. #if defined (NT) || defined(WIN95_32) || defined(WIN95_16)
  246. #if defined(NT)
  247. extern __declspec(dllimport) u08bits ScsiPortReadPortUchar(pu08bits ioport);
  248. extern __declspec(dllimport) u16bits ScsiPortReadPortUshort(pu16bits ioport);
  249. extern __declspec(dllimport) u32bits ScsiPortReadPortUlong(pu32bits ioport);
  250. extern __declspec(dllimport) void ScsiPortWritePortUchar(pu08bits ioport, u08bits val);
  251. extern __declspec(dllimport) void ScsiPortWritePortUshort(pu16bits port, u16bits val);
  252. extern __declspec(dllimport) void ScsiPortWritePortUlong(pu32bits port, u32bits val);
  253. #else
  254. extern u08bits ScsiPortReadPortUchar(pu08bits ioport);
  255. extern u16bits ScsiPortReadPortUshort(pu16bits ioport);
  256. extern u32bits ScsiPortReadPortUlong(pu32bits ioport);
  257. extern void ScsiPortWritePortUchar(pu08bits ioport, u08bits val);
  258. extern void ScsiPortWritePortUshort(pu16bits port, u16bits val);
  259. extern void ScsiPortWritePortUlong(pu32bits port, u32bits val);
  260. #endif
  261. #define OS_InPortByte(ioport) ScsiPortReadPortUchar((pu08bits) ioport)
  262. #define OS_InPortWord(ioport) ScsiPortReadPortUshort((pu16bits) ioport)
  263. #define OS_InPortLong(ioport) ScsiPortReadPortUlong((pu32bits) ioport)
  264. #define OS_OutPortByte(ioport, val) ScsiPortWritePortUchar((pu08bits) ioport, (u08bits) val)
  265. #define OS_OutPortWord(ioport, val) ScsiPortWritePortUshort((pu16bits) ioport, (u16bits) val)
  266. #define OS_OutPortLong(ioport, val) ScsiPortWritePortUlong((pu32bits) ioport, (u32bits) val)
  267. #define OS_OutPortByteBuffer(ioport, buffer, count) 
  268. ScsiPortWritePortBufferUchar((pu08bits)&port, (pu08bits) buffer, (u32bits) count)
  269. #define OS_OutPortWordBuffer(ioport, buffer, count) 
  270. ScsiPortWritePortBufferUshort((pu16bits)&port, (pu16bits) buffer, (u32bits) count)
  271. #define OS_Lock(x)
  272. #define OS_UnLock(x)
  273. #endif /* NT || WIN95_32 || WIN95_16 */
  274. #if defined (UNIX) && !defined(OS_InPortByte)
  275. #define OS_InPortByte(ioport)    inb((u16bits)ioport)
  276. #define OS_InPortWord(ioport)    inw((u16bits)ioport)
  277. #define OS_InPortLong(ioport)    inl((u16bits)ioport)
  278. #define OS_OutPortByte(ioport,val)  outb((u16bits)ioport, (u08bits)val)
  279. #define OS_OutPortWord(ioport,val)  outw((u16bits)ioport, (u16bits)val)
  280. #define OS_OutPortLong(ioport,val)  outl((u16bits)ioport, (u32bits)val)
  281. #define OS_Lock(x)
  282. #define OS_UnLock(x)
  283. #endif /* UNIX */
  284. #if defined(OS2)
  285. extern u08bits inb(u32bits ioport);
  286. extern u16bits inw(u32bits ioport);
  287. extern void outb(u32bits ioport, u08bits val);
  288. extern void outw(u32bits ioport, u16bits val);
  289. #define OS_InPortByte(ioport) inb(ioport)
  290. #define OS_InPortWord(ioport) inw(ioport)
  291. #define OS_OutPortByte(ioport, val) outb(ioport, val)
  292. #define OS_OutPortWord(ioport, val) outw(ioport, val)
  293. extern u32bits OS_InPortLong(u32bits ioport);
  294. extern void OS_OutPortLong(u32bits ioport, u32bits val);
  295. #define OS_Lock(x)
  296. #define OS_UnLock(x)
  297. #endif /* OS2 */
  298. #if defined(SOLARIS_REAL_MODE)
  299. extern unsigned char    inb(unsigned long ioport);
  300. extern unsigned short   inw(unsigned long ioport);
  301. #define OS_InPortByte(ioport)    inb(ioport)
  302. #define OS_InPortWord(ioport)    inw(ioport)
  303. extern void OS_OutPortByte(unsigned long ioport, unsigned char val);
  304. extern void OS_OutPortWord(unsigned long ioport, unsigned short val);
  305. extern unsigned long  OS_InPortLong(unsigned long ioport);
  306. extern void     OS_OutPortLong(unsigned long ioport, unsigned long val);
  307. #define OS_Lock(x)
  308. #define OS_UnLock(x)
  309. #endif  /* SOLARIS_REAL_MODE */
  310. #endif  /* __GLOBALS_H__ */
  311. /*----------------------------------------------------------------------
  312.  *
  313.  *
  314.  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  315.  *
  316.  *   This file is available under both the GNU General Public License
  317.  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
  318.  *
  319.  *   $Workfile:   sccbmgr.h  $
  320.  *
  321.  *   Description:  Common shared SCCB Interface defines and SCCB 
  322.  *  Manager specifics defines.
  323.  *
  324.  *   $Date: 1996/10/24 23:09:33 $
  325.  *
  326.  *   $Revision: 1.14 $
  327.  *
  328.  *----------------------------------------------------------------------*/
  329. #ifndef __SCCB_H__
  330. #define __SCCB_H__
  331. /*#include <osflags.h>*/
  332. /*#include <globals.h>*/
  333. #if defined(BUGBUG)
  334. #define debug_size 32
  335. #endif
  336. #if defined(DOS)
  337.    typedef struct _SCCB near *PSCCB;
  338. #if (FW_TYPE == _SCCB_MGR_)
  339.     typedef void (*CALL_BK_FN)(PSCCB);
  340. #endif
  341. #elif defined(OS2)
  342.    typedef struct _SCCB far *PSCCB;
  343. #if (FW_TYPE == _SCCB_MGR_)
  344.     typedef void (far *CALL_BK_FN)(PSCCB);
  345. #endif
  346. #else
  347.    typedef struct _SCCB *PSCCB;
  348. #if (FW_TYPE == _SCCB_MGR_)
  349.     typedef void (*CALL_BK_FN)(PSCCB);
  350. #endif
  351. #endif
  352. typedef struct SCCBMgr_info {
  353.    ULONG    si_baseaddr;
  354.    UCHAR    si_present;
  355.    UCHAR    si_intvect;
  356.    UCHAR    si_id;
  357.    UCHAR    si_lun;
  358.    USHORT   si_fw_revision;
  359.    USHORT   si_per_targ_init_sync;
  360.    USHORT   si_per_targ_fast_nego;
  361.    USHORT   si_per_targ_ultra_nego;
  362.    USHORT   si_per_targ_no_disc;
  363.    USHORT   si_per_targ_wide_nego;
  364.    USHORT   si_flags;
  365.    UCHAR    si_card_family;
  366.    UCHAR    si_bustype;
  367.    UCHAR    si_card_model[3];
  368.    UCHAR    si_relative_cardnum;
  369.    UCHAR    si_reserved[4];
  370.    ULONG    si_OS_reserved;
  371.    UCHAR    si_XlatInfo[4];
  372.    ULONG    si_reserved2[5];
  373.    ULONG    si_secondary_range;
  374. } SCCBMGR_INFO;
  375. #if defined(DOS)
  376.    typedef SCCBMGR_INFO *      PSCCBMGR_INFO;
  377. #else
  378.    #if defined (COMPILER_16_BIT)
  379.    typedef SCCBMGR_INFO far *  PSCCBMGR_INFO;
  380.    #else
  381.    typedef SCCBMGR_INFO *      PSCCBMGR_INFO;
  382.    #endif
  383. #endif // defined(DOS)
  384. #if (FW_TYPE==_SCCB_MGR_)
  385. #define SCSI_PARITY_ENA   0x0001
  386. #define LOW_BYTE_TERM   0x0010
  387. #define HIGH_BYTE_TERM   0x0020
  388. #define BUSTYPE_PCI   0x3
  389. #endif
  390. #define SUPPORT_16TAR_32LUN   0x0002
  391. #define SOFT_RESET   0x0004
  392. #define EXTENDED_TRANSLATION   0x0008
  393. #define POST_ALL_UNDERRRUNS   0x0040
  394. #define FLAG_SCAM_ENABLED   0x0080
  395. #define FLAG_SCAM_LEVEL2   0x0100
  396. #define HARPOON_FAMILY        0x02
  397. #define ISA_BUS_CARD          0x01
  398. #define EISA_BUS_CARD         0x02
  399. #define PCI_BUS_CARD          0x03
  400. #define VESA_BUS_CARD         0x04
  401. /* SCCB struc used for both SCCB and UCB manager compiles! 
  402.  * The UCB Manager treats the SCCB as it's 'native hardware structure' 
  403.  */
  404. #pragma pack(1)
  405. typedef struct _SCCB {
  406.    UCHAR OperationCode;
  407.    UCHAR ControlByte;
  408.    UCHAR CdbLength;
  409.    UCHAR RequestSenseLength;
  410.    ULONG DataLength;
  411.    ULONG DataPointer;
  412.    UCHAR CcbRes[2];
  413.    UCHAR HostStatus;
  414.    UCHAR TargetStatus;
  415.    UCHAR TargID;
  416.    UCHAR Lun;
  417.    UCHAR Cdb[12];
  418.    UCHAR CcbRes1;
  419.    UCHAR Reserved1;
  420.    ULONG Reserved2;
  421.    ULONG SensePointer;
  422.    CALL_BK_FN SccbCallback;                  /* VOID (*SccbCallback)(); */
  423.    ULONG  SccbIOPort;                        /* Identifies board base port */
  424.    UCHAR  SccbStatus;
  425.    UCHAR  SCCBRes2;
  426.    USHORT SccbOSFlags;
  427.    ULONG   Sccb_XferCnt;            /* actual transfer count */
  428.    ULONG   Sccb_ATC;
  429.    ULONG   SccbVirtDataPtr;         /* virtual addr for OS/2 */
  430.    ULONG   Sccb_res1;
  431.    USHORT  Sccb_MGRFlags;
  432.    USHORT  Sccb_sgseg;
  433.    UCHAR   Sccb_scsimsg;            /* identify msg for selection */
  434.    UCHAR   Sccb_tag;
  435.    UCHAR   Sccb_scsistat;
  436.    UCHAR   Sccb_idmsg;              /* image of last msg in */
  437.    PSCCB   Sccb_forwardlink;
  438.    PSCCB   Sccb_backlink;
  439.    ULONG   Sccb_savedATC;
  440.    UCHAR   Save_Cdb[6];
  441.    UCHAR   Save_CdbLen;
  442.    UCHAR   Sccb_XferState;
  443.    ULONG   Sccb_SGoffset;
  444. #if (FW_TYPE == _UCB_MGR_)
  445.    PUCB    Sccb_ucb_ptr;
  446. #endif
  447.    } SCCB;
  448. #define SCCB_SIZE sizeof(SCCB)
  449. #pragma pack()
  450. #define SCSI_INITIATOR_COMMAND    0x00
  451. #define TARGET_MODE_COMMAND       0x01
  452. #define SCATTER_GATHER_COMMAND    0x02
  453. #define RESIDUAL_COMMAND          0x03
  454. #define RESIDUAL_SG_COMMAND       0x04
  455. #define RESET_COMMAND             0x81
  456. #define F_USE_CMD_Q              0x20     /*Inidcates TAGGED command. */
  457. #define TAG_TYPE_MASK            0xC0     /*Type of tag msg to send. */
  458. #define TAG_Q_MASK               0xE0
  459. #define SCCB_DATA_XFER_OUT       0x10     /* Write */
  460. #define SCCB_DATA_XFER_IN        0x08     /* Read */
  461. #define FOURTEEN_BYTES           0x00     /* Request Sense Buffer size */
  462. #define NO_AUTO_REQUEST_SENSE    0x01     /* No Request Sense Buffer */
  463. #define BUS_FREE_ST     0       
  464. #define SELECT_ST       1
  465. #define SELECT_BDR_ST   2     /* Select w Bus Device Reset */
  466. #define SELECT_SN_ST    3     /* Select w Sync Nego */
  467. #define SELECT_WN_ST    4     /* Select w Wide Data Nego */
  468. #define SELECT_Q_ST     5     /* Select w Tagged Q'ing */
  469. #define COMMAND_ST      6
  470. #define DATA_OUT_ST     7
  471. #define DATA_IN_ST      8
  472. #define DISCONNECT_ST   9
  473. #define STATUS_ST       10
  474. #define ABORT_ST        11
  475. #define MESSAGE_ST      12
  476. #define F_HOST_XFER_DIR                0x01
  477. #define F_ALL_XFERRED                  0x02
  478. #define F_SG_XFER                      0x04
  479. #define F_AUTO_SENSE                   0x08
  480. #define F_ODD_BALL_CNT                 0x10
  481. #define F_NO_DATA_YET                  0x80
  482. #define F_STATUSLOADED                 0x01
  483. #define F_MSGLOADED                    0x02
  484. #define F_DEV_SELECTED                 0x04
  485. #define SCCB_COMPLETE               0x00  /* SCCB completed without error */
  486. #define SCCB_DATA_UNDER_RUN         0x0C
  487. #define SCCB_SELECTION_TIMEOUT      0x11  /* Set SCSI selection timed out */
  488. #define SCCB_DATA_OVER_RUN          0x12
  489. #define SCCB_UNEXPECTED_BUS_FREE    0x13  /* Target dropped SCSI BSY */
  490. #define SCCB_PHASE_SEQUENCE_FAIL    0x14  /* Target bus phase sequence failure */
  491. #define SCCB_INVALID_OP_CODE        0x16  /* SCCB invalid operation code */
  492. #define SCCB_INVALID_SCCB           0x1A  /* Invalid SCCB - bad parameter */
  493. #define SCCB_GROSS_FW_ERR           0x27  /* Major problem! */
  494. #define SCCB_BM_ERR                 0x30  /* BusMaster error. */
  495. #define SCCB_PARITY_ERR             0x34  /* SCSI parity error */
  496. #if (FW_TYPE==_UCB_MGR_)  
  497.    #define  HBA_AUTO_SENSE_FAIL        0x1B  
  498.    #define  HBA_TQ_REJECTED            0x1C  
  499.    #define  HBA_UNSUPPORTED_MSG         0x1D  
  500.    #define  HBA_HW_ERROR               0x20  
  501.    #define  HBA_ATN_NOT_RESPONDED      0x21  
  502.    #define  HBA_SCSI_RESET_BY_ADAPTER  0x22
  503.    #define  HBA_SCSI_RESET_BY_TARGET   0x23
  504.    #define  HBA_WRONG_CONNECTION       0x24
  505.    #define  HBA_BUS_DEVICE_RESET       0x25
  506.    #define  HBA_ABORT_QUEUE            0x26
  507. #else // these are not defined in BUDI/UCB
  508.    #define SCCB_INVALID_DIRECTION      0x18  /* Invalid target direction */
  509.    #define SCCB_DUPLICATE_SCCB         0x19  /* Duplicate SCCB */
  510.    #define SCCB_SCSI_RST               0x35  /* SCSI RESET detected. */
  511. #endif // (FW_TYPE==_UCB_MGR_)  
  512. #define SCCB_IN_PROCESS            0x00
  513. #define SCCB_SUCCESS               0x01
  514. #define SCCB_ABORT                 0x02
  515. #define SCCB_NOT_FOUND             0x03
  516. #define SCCB_ERROR                 0x04
  517. #define SCCB_INVALID               0x05
  518. #define SCCB_SIZE sizeof(SCCB)
  519. #if (FW_TYPE == _UCB_MGR_)
  520. void SccbMgr_start_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb);
  521. s32bits SccbMgr_abort_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb);
  522. u08bits SccbMgr_my_int(CARD_HANDLE pCurrCard);
  523. s32bits SccbMgr_isr(CARD_HANDLE pCurrCard);
  524. void SccbMgr_scsi_reset(CARD_HANDLE pCurrCard);
  525. void SccbMgr_timer_expired(CARD_HANDLE pCurrCard);
  526. void SccbMgr_unload_card(CARD_HANDLE pCurrCard);
  527. void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard);
  528. void SccbMgr_restore_native_state(CARD_HANDLE pCurrCard);
  529. void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo);
  530. #endif
  531. #if (FW_TYPE == _SCCB_MGR_)
  532.  #if defined (DOS)
  533. int    SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo);
  534. USHORT SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo);
  535. void  SccbMgr_start_sccb(USHORT pCurrCard, PSCCB p_SCCB);
  536. int   SccbMgr_abort_sccb(USHORT pCurrCard, PSCCB p_SCCB);
  537. UCHAR SccbMgr_my_int(USHORT pCurrCard);
  538. int   SccbMgr_isr(USHORT pCurrCard);
  539. void  SccbMgr_scsi_reset(USHORT pCurrCard);
  540. void  SccbMgr_timer_expired(USHORT pCurrCard);
  541. USHORT SccbMgr_status(USHORT pCurrCard);
  542. void SccbMgr_unload_card(USHORT pCurrCard);
  543.  #else    //non-DOS
  544. int   SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo);
  545. ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo);
  546. void  SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_SCCB);
  547. int   SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_SCCB);
  548. UCHAR SccbMgr_my_int(ULONG pCurrCard);
  549. int   SccbMgr_isr(ULONG pCurrCard);
  550. void  SccbMgr_scsi_reset(ULONG pCurrCard);
  551. void  SccbMgr_enable_int(ULONG pCurrCard);
  552. void  SccbMgr_disable_int(ULONG pCurrCard);
  553. void  SccbMgr_timer_expired(ULONG pCurrCard);
  554. void SccbMgr_unload_card(ULONG pCurrCard);
  555.   #endif
  556. #endif  // (FW_TYPE == _SCCB_MGR_)
  557. #endif  /* __SCCB_H__ */
  558. /*----------------------------------------------------------------------
  559.  *
  560.  *
  561.  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  562.  *
  563.  *   This file is available under both the GNU General Public License
  564.  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
  565.  *
  566.  *   $Workfile:   blx30.h  $
  567.  *
  568.  *   Description: This module contains SCCB/UCB Manager implementation
  569.  *                specific stuff.
  570.  *
  571.  *   $Date: 1996/11/13 18:34:22 $
  572.  *
  573.  *   $Revision: 1.10 $
  574.  *
  575.  *----------------------------------------------------------------------*/
  576. #ifndef __blx30_H__
  577. #define __blx30_H__
  578. /*#include <globals.h>*/
  579. #define  ORION_FW_REV      3110
  580. #define HARP_REVD    1
  581. #if defined(DOS)
  582. #define QUEUE_DEPTH     8+1            /*1 for Normal disconnect 0 for Q'ing. */
  583. #else
  584. #define QUEUE_DEPTH     254+1            /*1 for Normal disconnect 32 for Q'ing. */
  585. #endif   // defined(DOS)
  586. #define MAX_MB_CARDS 4 /* Max. no of cards suppoerted on Mother Board */
  587. #define WIDE_SCSI       1
  588. #if defined(WIDE_SCSI)
  589.    #if defined(DOS)
  590.       #define MAX_SCSI_TAR    16
  591.       #define MAX_LUN         8
  592. #define LUN_MASK 0x07
  593.    #else
  594.       #define MAX_SCSI_TAR    16
  595.       #define MAX_LUN         32
  596. #define LUN_MASK 0x1f
  597.    #endif
  598. #else
  599.    #define MAX_SCSI_TAR    8
  600.    #define MAX_LUN         8
  601. #define LUN_MASK 0x07
  602. #endif 
  603. #if defined(HARP_REVA)
  604. #define SG_BUF_CNT      15             /*Number of prefetched elements. */
  605. #else
  606. #define SG_BUF_CNT      16             /*Number of prefetched elements. */
  607. #endif
  608. #define SG_ELEMENT_SIZE 8              /*Eight byte per element. */
  609. #define SG_LOCAL_MASK   0x00000000L
  610. #define SG_ELEMENT_MASK 0xFFFFFFFFL
  611. #if (FW_TYPE == _UCB_MGR_)
  612. #define OPC_DECODE_NORMAL       0x0f7f
  613. #endif   // _UCB_MGR_
  614. #if defined(DOS)
  615. /*#include <dos.h>*/
  616. #define RD_HARPOON(ioport)          (OS_InPortByte(ioport))
  617. #define RDW_HARPOON(ioport)         (OS_InPortWord(ioport))
  618. #define WR_HARPOON(ioport,val)      (OS_OutPortByte(ioport,val))
  619. #define WRW_HARPOON(ioport,val)     (OS_OutPortWord(ioport,val))
  620. #define RD_HARP32(port,offset,data)  asm{db 66h;         
  621.                                        push ax;             
  622.                                        mov dx,port;         
  623.                                        add dx, offset;      
  624.                                        db 66h;              
  625.                                        in ax,dx;            
  626.                                        db 66h;              
  627.                                        mov word ptr data,ax;
  628.                                        db 66h;              
  629.                                        pop ax}
  630. #define WR_HARP32(port,offset,data) asm{db 66h;          
  631.                                        push ax;             
  632.                                        mov dx,port;         
  633.                                        add dx, offset;      
  634.                                        db 66h;              
  635.                                        mov ax,word ptr data;
  636.                                        db 66h;              
  637.                                        out dx,ax;           
  638.                                        db 66h;              
  639.                                        pop ax}
  640. #endif /* DOS */
  641. #if defined(NETWARE) || defined(OTHER_32) ||  defined(OTHER_16)
  642. #define RD_HARPOON(ioport)     OS_InPortByte((unsigned long)ioport)
  643. #define RDW_HARPOON(ioport)    OS_InPortWord((unsigned long)ioport)
  644. #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong(ioport + offset))
  645. #define WR_HARPOON(ioport,val) OS_OutPortByte((ULONG)ioport,(UCHAR) val)
  646. #define WRW_HARPOON(ioport,val)  OS_OutPortWord((ULONG)ioport,(USHORT)val)
  647. #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ioport + offset), data)
  648. #endif /* NETWARE || OTHER_32 || OTHER_16 */
  649. #if defined(NT) || defined(WIN95_32) || defined(WIN95_16)
  650. #define RD_HARPOON(ioport)          OS_InPortByte((ULONG)ioport)
  651. #define RDW_HARPOON(ioport)         OS_InPortWord((ULONG)ioport)
  652. #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
  653. #define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
  654. #define WRW_HARPOON(ioport,val)     OS_OutPortWord((ULONG)ioport,(USHORT)val)
  655. #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ULONG)(ioport + offset), data)
  656. #endif /* NT || WIN95_32 || WIN95_16 */
  657. #if defined (UNIX)
  658. #define RD_HARPOON(ioport)          OS_InPortByte((u32bits)ioport)
  659. #define RDW_HARPOON(ioport)         OS_InPortWord((u32bits)ioport)
  660. #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((u32bits)(ioport + offset)))
  661. #define WR_HARPOON(ioport,val)      OS_OutPortByte((u32bits)ioport,(u08bits) val)
  662. #define WRW_HARPOON(ioport,val)       OS_OutPortWord((u32bits)ioport,(u16bits)val)
  663. #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((u32bits)(ioport + offset), data)
  664. #endif /* UNIX */
  665. #if defined(OS2)
  666. #define RD_HARPOON(ioport)          OS_InPortByte((unsigned long)ioport)
  667. #define RDW_HARPOON(ioport)         OS_InPortWord((unsigned long)ioport)
  668. #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
  669. #define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
  670. #define WRW_HARPOON(ioport,val)       OS_OutPortWord((ULONG)ioport,(USHORT)val)
  671. #define WR_HARP32(ioport,offset,data)  OS_OutPortLong(((ULONG)(ioport + offset)), data)
  672. #endif /* OS2 */
  673. #if defined(SOLARIS_REAL_MODE)
  674. #define RD_HARPOON(ioport)          OS_InPortByte((unsigned long)ioport)
  675. #define RDW_HARPOON(ioport)         OS_InPortWord((unsigned long)ioport)
  676. #define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
  677. #define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
  678. #define WRW_HARPOON(ioport,val)       OS_OutPortWord((ULONG)ioport,(USHORT)val)
  679. #define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ULONG)(ioport + offset), (ULONG)data)
  680. #endif  /* SOLARIS_REAL_MODE */
  681. #endif  /* __BLX30_H__ */
  682. /*----------------------------------------------------------------------
  683.  * 
  684.  *
  685.  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  686.  *
  687.  *   This file is available under both the GNU General Public License
  688.  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
  689.  *
  690.  *   $Workfile:   target.h  $
  691.  *
  692.  *   Description:  Definitions for Target related structures
  693.  *
  694.  *   $Date: 1996/12/11 22:06:20 $
  695.  *
  696.  *   $Revision: 1.9 $
  697.  *
  698.  *----------------------------------------------------------------------*/
  699. #ifndef __TARGET__
  700. #define __TARGET__
  701. /*#include <globals.h>*/
  702. /*#include <blx30.h>*/
  703. #define  TAR_SYNC_MASK     (BIT(7)+BIT(6))
  704. #define  SYNC_UNKNOWN      0x00
  705. #define  SYNC_TRYING               BIT(6)
  706. #define  SYNC_SUPPORTED    (BIT(7)+BIT(6))
  707. #define  TAR_WIDE_MASK     (BIT(5)+BIT(4))
  708. #define  WIDE_DISABLED     0x00
  709. #define  WIDE_ENABLED              BIT(4)
  710. #define  WIDE_NEGOCIATED   BIT(5)
  711. #define  TAR_TAG_Q_MASK    (BIT(3)+BIT(2))
  712. #define  TAG_Q_UNKNOWN     0x00
  713. #define  TAG_Q_TRYING              BIT(2)
  714. #define  TAG_Q_REJECT      BIT(3)
  715. #define  TAG_Q_SUPPORTED   (BIT(3)+BIT(2))
  716. #define  TAR_ALLOW_DISC    BIT(0)
  717. #define  EE_SYNC_MASK      (BIT(0)+BIT(1))
  718. #define  EE_SYNC_ASYNC     0x00
  719. #define  EE_SYNC_5MB       BIT(0)
  720. #define  EE_SYNC_10MB      BIT(1)
  721. #define  EE_SYNC_20MB      (BIT(0)+BIT(1))
  722. #define  EE_ALLOW_DISC     BIT(6)
  723. #define  EE_WIDE_SCSI      BIT(7)
  724. #if defined(DOS)
  725.    typedef struct SCCBMgr_tar_info near *PSCCBMgr_tar_info;
  726. #elif defined(OS2)
  727.    typedef struct SCCBMgr_tar_info far *PSCCBMgr_tar_info;
  728. #else
  729.    typedef struct SCCBMgr_tar_info *PSCCBMgr_tar_info;
  730. #endif
  731. typedef struct SCCBMgr_tar_info {
  732.    PSCCB    TarSelQ_Head;
  733.    PSCCB    TarSelQ_Tail;
  734.    UCHAR    TarLUN_CA;        /*Contingent Allgiance */
  735.    UCHAR    TarTagQ_Cnt;
  736.    UCHAR    TarSelQ_Cnt;
  737.    UCHAR    TarStatus;
  738.    UCHAR    TarEEValue;
  739.    UCHAR  TarSyncCtrl;
  740.    UCHAR  TarReserved[2]; /* for alignment */ 
  741.    UCHAR  LunDiscQ_Idx[MAX_LUN];
  742.    UCHAR    TarLUNBusy[MAX_LUN];
  743. } SCCBMGR_TAR_INFO;
  744. typedef struct NVRAMInfo {
  745. UCHAR niModel; /* Model No. of card */
  746. UCHAR niCardNo; /* Card no. */
  747. #if defined(DOS)
  748. USHORT niBaseAddr; /* Port Address of card */
  749. #else
  750. ULONG niBaseAddr; /* Port Address of card */
  751. #endif
  752. UCHAR niSysConf; /* Adapter Configuration byte - Byte 16 of eeprom map */
  753. UCHAR niScsiConf; /* SCSI Configuration byte - Byte 17 of eeprom map */
  754. UCHAR niScamConf; /* SCAM Configuration byte - Byte 20 of eeprom map */
  755. UCHAR niAdapId; /* Host Adapter ID - Byte 24 of eerpom map */
  756. UCHAR niSyncTbl[MAX_SCSI_TAR / 2]; /* Sync/Wide byte of targets */
  757. UCHAR niScamTbl[MAX_SCSI_TAR][4]; /* Compressed Scam name string of Targets */
  758. }NVRAMINFO;
  759. #if defined(DOS)
  760. typedef NVRAMINFO near *PNVRamInfo;
  761. #elif defined (OS2)
  762. typedef NVRAMINFO far *PNVRamInfo;
  763. #else
  764. typedef NVRAMINFO *PNVRamInfo;
  765. #endif
  766. #define MODEL_LT 1
  767. #define MODEL_DL 2
  768. #define MODEL_LW 3
  769. #define MODEL_DW 4
  770. typedef struct SCCBcard {
  771.    PSCCB currentSCCB;
  772. #if (FW_TYPE==_SCCB_MGR_)
  773.    PSCCBMGR_INFO cardInfo;
  774. #else
  775.    PADAPTER_INFO cardInfo;
  776. #endif
  777. #if defined(DOS)
  778.    USHORT ioPort;
  779. #else
  780.    ULONG ioPort;
  781. #endif
  782.    USHORT cmdCounter;
  783.    UCHAR  discQCount;
  784.    UCHAR  tagQ_Lst; 
  785.    UCHAR cardIndex;
  786.    UCHAR scanIndex;
  787.    UCHAR globalFlags;
  788.    UCHAR ourId;
  789.    PNVRamInfo pNvRamInfo;
  790.    PSCCB discQ_Tbl[QUEUE_DEPTH]; 
  791.       
  792. }SCCBCARD;
  793. #if defined(DOS)
  794. typedef struct SCCBcard near *PSCCBcard;
  795. #elif defined (OS2)
  796. typedef struct SCCBcard far *PSCCBcard;
  797. #else
  798. typedef struct SCCBcard *PSCCBcard;
  799. #endif
  800. #define F_TAG_STARTED 0x01
  801. #define F_CONLUN_IO 0x02
  802. #define F_DO_RENEGO 0x04
  803. #define F_NO_FILTER 0x08
  804. #define F_GREEN_PC 0x10
  805. #define F_HOST_XFER_ACT 0x20
  806. #define F_NEW_SCCB_CMD 0x40
  807. #define F_UPDATE_EEPROM 0x80
  808. #define  ID_STRING_LENGTH  32
  809. #define  TYPE_CODE0        0x63           /*Level2 Mstr (bits 7-6),  */
  810. #define  TYPE_CODE1        00             /*No ID yet */
  811. #define  SLV_TYPE_CODE0    0xA3           /*Priority Bit set (bits 7-6),  */
  812. #define  ASSIGN_ID   0x00
  813. #define  SET_P_FLAG  0x01
  814. #define  CFG_CMPLT   0x03
  815. #define  DOM_MSTR    0x0F
  816. #define  SYNC_PTRN   0x1F
  817. #define  ID_0_7      0x18
  818. #define  ID_8_F      0x11
  819. #define  ID_10_17    0x12
  820. #define  ID_18_1F    0x0B
  821. #define  MISC_CODE   0x14
  822. #define  CLR_P_FLAG  0x18
  823. #define  LOCATE_ON   0x12
  824. #define  LOCATE_OFF  0x0B
  825. #define  LVL_1_MST   0x00
  826. #define  LVL_2_MST   0x40
  827. #define  DOM_LVL_2   0xC0
  828. #define  INIT_SELTD  0x01
  829. #define  LEVEL2_TAR  0x02
  830. enum scam_id_st { ID0,ID1,ID2,ID3,ID4,ID5,ID6,ID7,ID8,ID9,ID10,ID11,ID12,
  831.                   ID13,ID14,ID15,ID_UNUSED,ID_UNASSIGNED,ID_ASSIGNED,LEGACY,
  832.                   CLR_PRIORITY,NO_ID_AVAIL };
  833. typedef struct SCCBscam_info {
  834.    UCHAR    id_string[ID_STRING_LENGTH];
  835.    enum scam_id_st state;
  836.     
  837. } SCCBSCAM_INFO, *PSCCBSCAM_INFO;
  838. #endif
  839. /*----------------------------------------------------------------------
  840.  *
  841.  *
  842.  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  843.  *
  844.  *   This file is available under both the GNU General Public License
  845.  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
  846.  *
  847.  *   $Workfile:   scsi2.h  $
  848.  *
  849.  *   Description:  Register definitions for HARPOON ASIC.
  850.  *
  851.  *   $Date: 1996/11/13 18:32:57 $
  852.  *
  853.  *   $Revision: 1.4 $
  854.  *
  855.  *----------------------------------------------------------------------*/
  856. #ifndef __SCSI_H__
  857. #define __SCSI_H__
  858. #define  SCSI_TEST_UNIT_READY    0x00
  859. #define  SCSI_REZERO_UNIT        0x01
  860. #define  SCSI_REQUEST_SENSE      0x03
  861. #define  SCSI_FORMAT_UNIT        0x04
  862. #define  SCSI_REASSIGN           0x07
  863. #define  SCSI_READ               0x08
  864. #define  SCSI_WRITE              0x0A
  865. #define  SCSI_SEEK               0x0B
  866. #define  SCSI_INQUIRY            0x12
  867. #define  SCSI_MODE_SELECT        0x15
  868. #define  SCSI_RESERVE_UNIT       0x16
  869. #define  SCSI_RELEASE_UNIT       0x17
  870. #define  SCSI_MODE_SENSE         0x1A
  871. #define  SCSI_START_STOP_UNIT    0x1B
  872. #define  SCSI_SEND_DIAGNOSTIC    0x1D
  873. #define  SCSI_READ_CAPACITY      0x25
  874. #define  SCSI_READ_EXTENDED      0x28
  875. #define  SCSI_WRITE_EXTENDED     0x2A
  876. #define  SCSI_SEEK_EXTENDED      0x2B
  877. #define  SCSI_WRITE_AND_VERIFY   0x2E
  878. #define  SCSI_VERIFY             0x2F
  879. #define  SCSI_READ_DEFECT_DATA   0x37
  880. #define  SCSI_WRITE_BUFFER       0x3B
  881. #define  SCSI_READ_BUFFER        0x3C
  882. #define  SCSI_RECV_DIAGNOSTIC    0x1C
  883. #define  SCSI_READ_LONG          0x3E
  884. #define  SCSI_WRITE_LONG         0x3F
  885. #define  SCSI_LAST_SCSI_CMND     SCSI_WRITE_LONG
  886. #define  SCSI_INVALID_CMND       0xFF
  887. #define  SSGOOD                  0x00
  888. #define  SSCHECK                 0x02
  889. #define  SSCOND_MET              0x04
  890. #define  SSBUSY                  0x08
  891. #define  SSRESERVATION_CONFLICT  0x18
  892. #define  SSCMD_TERM              0x22
  893. #define  SSQ_FULL                0x28
  894. #define  SKNO_SEN                0x00
  895. #define  SKRECOV_ERR             0x01
  896. #define  SKNOT_RDY               0x02
  897. #define  SKMED_ERR               0x03
  898. #define  SKHW_ERR                0x04
  899. #define  SKILL_REQ               0x05
  900. #define  SKUNIT_ATTN             0x06
  901. #define  SKDATA_PROTECT          0x07
  902. #define  SKBLNK_CHK              0x08
  903. #define  SKCPY_ABORT             0x0A
  904. #define  SKABORT_CMD             0x0B
  905. #define  SKEQUAL                 0x0C
  906. #define  SKVOL_OVF               0x0D
  907. #define  SKMIS_CMP               0x0E
  908. #define  SMCMD_COMP              0x00
  909. #define  SMEXT                   0x01
  910. #define  SMSAVE_DATA_PTR         0x02
  911. #define  SMREST_DATA_PTR         0x03
  912. #define  SMDISC                  0x04
  913. #define  SMINIT_DETEC_ERR        0x05
  914. #define  SMABORT                 0x06
  915. #define  SMREJECT                0x07
  916. #define  SMNO_OP                 0x08
  917. #define  SMPARITY                0x09
  918. #define  SMDEV_RESET             0x0C
  919. #define SMABORT_TAG 0x0D
  920. #define SMINIT_RECOVERY 0x0F
  921. #define SMREL_RECOVERY 0x10
  922. #define  SMIDENT                 0x80
  923. #define  DISC_PRIV               0x40
  924. #define  SMSYNC                  0x01
  925. #define  SM10MBS                 0x19     /* 100ns           */
  926. #define  SM5MBS                  0x32     /* 200ns           */
  927. #define  SMOFFSET                0x0F     /* Maxoffset value */
  928. #define  SMWDTR                  0x03
  929. #define  SM8BIT                  0x00
  930. #define  SM16BIT                 0x01
  931. #define  SM32BIT                 0x02
  932. #define  SMIGNORWR               0x23     /* Ignore Wide Residue */
  933. #define  ARBITRATION_DELAY       0x01     /* 2.4us using a 40Mhz clock */
  934. #define  BUS_SETTLE_DELAY        0x01     /* 400ns */
  935. #define  BUS_CLEAR_DELAY         0x01     /* 800ns */
  936. #define  SPHASE_TO               0x0A  /* 10 second timeout waiting for */
  937. #define  SCMD_TO                 0x0F  /* Overall command timeout */
  938. #define  SIX_BYTE_CMD            0x06
  939. #define  TEN_BYTE_CMD            0x0A
  940. #define  TWELVE_BYTE_CMD         0x0C
  941. #define  ASYNC                   0x00
  942. #define  PERI25NS                0x06  /* 25/4ns to next clock for xbow. */
  943. #define  SYNC10MBS               0x19
  944. #define  SYNC5MBS                0x32
  945. #define  MAX_OFFSET              0x0F  /* Maxbyteoffset for Sync Xfers */
  946. #endif
  947. /*----------------------------------------------------------------------
  948.  *  
  949.  *
  950.  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  951.  *
  952.  *   This file is available under both the GNU General Public License
  953.  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
  954.  *
  955.  *   $Workfile:   eeprom.h  $
  956.  *
  957.  *   Description:  Definitions for EEPROM related structures
  958.  *
  959.  *   $Date: 1996/11/13 18:28:39 $
  960.  *
  961.  *   $Revision: 1.4 $
  962.  *
  963.  *----------------------------------------------------------------------*/
  964. #ifndef __EEPROM__
  965. #define __EEPROM__
  966. /*#include <globals.h>*/
  967. #define  EEPROM_WD_CNT     256
  968. #define  EEPROM_CHECK_SUM  0
  969. #define  FW_SIGNATURE      2
  970. #define  MODEL_NUMB_0      4
  971. #define  MODEL_NUMB_1      5
  972. #define  MODEL_NUMB_2      6
  973. #define  MODEL_NUMB_3      7
  974. #define  MODEL_NUMB_4      8
  975. #define  MODEL_NUMB_5      9
  976. #define  IO_BASE_ADDR      10
  977. #define  IRQ_NUMBER        12
  978. #define  PCI_INT_PIN       13
  979. #define  BUS_DELAY         14       /*On time in byte 14 off delay in 15 */
  980. #define  SYSTEM_CONFIG     16
  981. #define  SCSI_CONFIG       17
  982. #define  BIOS_CONFIG       18
  983. #define  SPIN_UP_DELAY     19
  984. #define  SCAM_CONFIG       20
  985. #define  ADAPTER_SCSI_ID   24
  986. #define  IGNORE_B_SCAN     32
  987. #define  SEND_START_ENA    34
  988. #define  DEVICE_ENABLE     36
  989. #define  SYNC_RATE_TBL     38
  990. #define  SYNC_RATE_TBL01   38
  991. #define  SYNC_RATE_TBL23   40
  992. #define  SYNC_RATE_TBL45   42
  993. #define  SYNC_RATE_TBL67   44
  994. #define  SYNC_RATE_TBL89   46
  995. #define  SYNC_RATE_TBLab   48
  996. #define  SYNC_RATE_TBLcd   50
  997. #define  SYNC_RATE_TBLef   52
  998. #define  EE_SCAMBASE      256 
  999.    #define  DOM_MASTER     (BIT(0) + BIT(1))
  1000.    #define  SCAM_ENABLED   BIT(2)
  1001.    #define  SCAM_LEVEL2    BIT(3)
  1002. #define RENEGO_ENA BITW(10)
  1003. #define CONNIO_ENA BITW(11)
  1004.    #define  GREEN_PC_ENA   BITW(12)
  1005.    #define  AUTO_RATE_00   00
  1006.    #define  AUTO_RATE_05   01
  1007.    #define  AUTO_RATE_10   02
  1008.    #define  AUTO_RATE_20   03
  1009.    #define  WIDE_NEGO_BIT     BIT(7)
  1010.    #define  DISC_ENABLE_BIT   BIT(6)
  1011. #endif
  1012. /*----------------------------------------------------------------------
  1013.  *
  1014.  *
  1015.  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  1016.  *
  1017.  *   This file is available under both the GNU General Public License
  1018.  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
  1019.  *
  1020.  *   $Workfile:   harpoon.h  $
  1021.  *
  1022.  *   Description:  Register definitions for HARPOON ASIC.
  1023.  *
  1024.  *   $Date: 1997/07/09 21:44:36 $
  1025.  *
  1026.  *   $Revision: 1.9 $
  1027.  *
  1028.  *----------------------------------------------------------------------*/
  1029. /*#include <globals.h>*/
  1030. #ifndef __HARPOON__
  1031. #define __HARPOON__
  1032.    #define  hp_vendor_id_0       0x00 /* LSB */
  1033.       #define  ORION_VEND_0   0x4B
  1034.  
  1035.    #define  hp_vendor_id_1       0x01 /* MSB */
  1036.       #define  ORION_VEND_1   0x10
  1037.    #define  hp_device_id_0       0x02 /* LSB */
  1038.       #define  ORION_DEV_0    0x30 
  1039.    #define  hp_device_id_1       0x03 /* MSB */
  1040.       #define  ORION_DEV_1    0x81 
  1041. /* Sub Vendor ID and Sub Device ID only available in
  1042. Harpoon Version 2 and higher */
  1043.    #define  hp_sub_vendor_id_0   0x04 /* LSB */
  1044.    #define  hp_sub_vendor_id_1   0x05 /* MSB */
  1045.    #define  hp_sub_device_id_0   0x06 /* LSB */
  1046.    #define  hp_sub_device_id_1   0x07 /* MSB */
  1047.    #define  hp_dual_addr_lo      0x08
  1048.    #define  hp_dual_addr_lmi     0x09
  1049.    #define  hp_dual_addr_hmi     0x0A
  1050.    #define  hp_dual_addr_hi      0x0B
  1051.    #define  hp_semaphore         0x0C
  1052.       #define SCCB_MGR_ACTIVE    BIT(0)
  1053.       #define TICKLE_ME          BIT(1)
  1054.       #define SCCB_MGR_PRESENT   BIT(3)
  1055.       #define BIOS_IN_USE        BIT(4)
  1056.    #define  hp_user_defined_D    0x0D
  1057.    #define  hp_reserved_E        0x0E
  1058.    #define  hp_sys_ctrl          0x0F
  1059.       #define  STOP_CLK          BIT(0)      /*Turn off BusMaster Clock */
  1060.       #define  DRVR_RST          BIT(1)      /*Firmware Reset to 80C15 chip */
  1061.       #define  HALT_MACH         BIT(3)      /*Halt State Machine      */
  1062.       #define  HARD_ABORT        BIT(4)      /*Hard Abort              */
  1063.       #define  DIAG_MODE         BIT(5)      /*Diagnostic Mode         */
  1064.       #define  BM_ABORT_TMOUT    0x50        /*Halt State machine time out */
  1065.    #define  hp_sys_cfg           0x10
  1066.       #define  DONT_RST_FIFO     BIT(7)      /*Don't reset FIFO      */
  1067.    #define  hp_host_ctrl0        0x11
  1068.       #define  DUAL_ADDR_MODE    BIT(0)   /*Enable 64-bit addresses */
  1069.       #define  IO_MEM_SPACE      BIT(1)   /*I/O Memory Space    */
  1070.       #define  RESOURCE_LOCK     BIT(2)   /*Enable Resource Lock */
  1071.       #define  IGNOR_ACCESS_ERR  BIT(3)   /*Ignore Access Error */
  1072.       #define  HOST_INT_EDGE     BIT(4)   /*Host interrupt level/edge mode sel */
  1073.       #define  SIX_CLOCKS        BIT(5)   /*6 Clocks between Strobe   */
  1074.       #define  DMA_EVEN_PARITY   BIT(6)   /*Enable DMA Enen Parity */
  1075. /*
  1076.       #define  BURST_MODE        BIT(0)
  1077. */
  1078.    #define  hp_reserved_12       0x12
  1079.    #define  hp_host_blk_cnt      0x13
  1080.       #define  XFER_BLK1         0x00     /*     0 0 0  1 byte per block*/
  1081.       #define  XFER_BLK2         0x01     /*     0 0 1  2 byte per block*/
  1082.       #define  XFER_BLK4         0x02     /*     0 1 0  4 byte per block*/
  1083.       #define  XFER_BLK8         0x03     /*     0 1 1  8 byte per block*/
  1084.       #define  XFER_BLK16        0x04     /*     1 0 0 16 byte per block*/
  1085.       #define  XFER_BLK32        0x05     /*     1 0 1 32 byte per block*/
  1086.       #define  XFER_BLK64        0x06     /*     1 1 0 64 byte per block*/
  1087.    
  1088.       #define  BM_THRESHOLD      0x40     /* PCI mode can only xfer 16 bytes*/
  1089.    #define  hp_reserved_14       0x14
  1090.    #define  hp_reserved_15       0x15
  1091.    #define  hp_reserved_16       0x16
  1092.    #define  hp_int_mask          0x17
  1093.       #define  INT_CMD_COMPL     BIT(0)   /* DMA command complete   */
  1094.       #define  INT_EXT_STATUS    BIT(1)   /* Extended Status Set    */
  1095.       #define  INT_SCSI          BIT(2)   /* Scsi block interrupt   */
  1096.       #define  INT_FIFO_RDY      BIT(4)   /* FIFO data ready        */
  1097.    #define  hp_xfer_cnt_lo       0x18
  1098.    #define  hp_xfer_cnt_mi       0x19
  1099.    #define  hp_xfer_cnt_hi       0x1A
  1100.    #define  hp_xfer_cmd          0x1B
  1101.       #define  XFER_HOST_DMA     0x00     /*     0 0 0 Transfer Host -> DMA */
  1102.       #define  XFER_DMA_HOST     0x01     /*     0 0 1 Transfer DMA  -> Host */
  1103.       #define  XFER_HOST_MPU     0x02     /*     0 1 0 Transfer Host -> MPU  */
  1104.       #define  XFER_MPU_HOST     0x03     /*     0 1 1 Transfer MPU  -> Host */
  1105.       #define  XFER_DMA_MPU      0x04     /*     1 0 0 Transfer DMA  -> MPU  */
  1106.       #define  XFER_MPU_DMA      0x05     /*     1 0 1 Transfer MPU  -> DMA  */
  1107.       #define  SET_SEMAPHORE     0x06     /*     1 1 0 Set Semaphore         */
  1108.       #define  XFER_NOP          0x07     /*     1 1 1 Transfer NOP          */
  1109.       #define  XFER_MB_MPU       0x06     /*     1 1 0 Transfer MB -> MPU */
  1110.       #define  XFER_MB_DMA       0x07     /*     1 1 1 Transfer MB -> DMA */
  1111.       #define  XFER_HOST_AUTO    0x00     /*     0 0 Auto Transfer Size   */
  1112.       #define  XFER_HOST_8BIT    0x08     /*     0 1 8 BIT Transfer Size  */
  1113.       #define  XFER_HOST_16BIT   0x10     /*     1 0 16 BIT Transfer Size */
  1114.       #define  XFER_HOST_32BIT   0x18     /*     1 1 32 BIT Transfer Size */
  1115.       #define  XFER_DMA_8BIT     0x20     /*     0 1 8 BIT  Transfer Size */
  1116.       #define  XFER_DMA_16BIT    0x40     /*     1 0 16 BIT Transfer Size */
  1117.       #define  DISABLE_INT       BIT(7)   /*Do not interrupt at end of cmd. */
  1118.       #define  HOST_WRT_CMD      ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT))
  1119.       #define  HOST_RD_CMD       ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT))
  1120.       #define  WIDE_HOST_WRT_CMD ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_16BIT))
  1121.       #define  WIDE_HOST_RD_CMD  ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_16BIT))
  1122.    #define  hp_host_addr_lo      0x1C
  1123.    #define  hp_host_addr_lmi     0x1D
  1124.    #define  hp_host_addr_hmi     0x1E
  1125.    #define  hp_host_addr_hi      0x1F
  1126.    #define  hp_pio_data          0x20
  1127.    #define  hp_reserved_21       0x21
  1128.    #define  hp_ee_ctrl           0x22
  1129.       #define  EXT_ARB_ACK       BIT(7)
  1130.       #define  SCSI_TERM_ENA_H   BIT(6)   /* SCSI high byte terminator */
  1131.       #define  SEE_MS            BIT(5)
  1132.       #define  SEE_CS            BIT(3)
  1133.       #define  SEE_CLK           BIT(2)
  1134.       #define  SEE_DO            BIT(1)
  1135.       #define  SEE_DI            BIT(0)
  1136.       #define  EE_READ           0x06
  1137.       #define  EE_WRITE          0x05
  1138.       #define  EWEN              0x04
  1139.       #define  EWEN_ADDR         0x03C0
  1140.       #define  EWDS              0x04
  1141.       #define  EWDS_ADDR         0x0000
  1142.    #define  hp_brdctl            0x23
  1143.       #define  DAT_7             BIT(7)
  1144.       #define  DAT_6             BIT(6)
  1145.       #define  DAT_5             BIT(5)
  1146.       #define  BRD_STB           BIT(4)
  1147.       #define  BRD_CS            BIT(3)
  1148.       #define  BRD_WR            BIT(2)
  1149.    #define  hp_reserved_24       0x24
  1150.    #define  hp_reserved_25       0x25
  1151.    #define  hp_bm_ctrl           0x26
  1152.       #define  SCSI_TERM_ENA_L   BIT(0)   /*Enable/Disable external terminators */
  1153.       #define  FLUSH_XFER_CNTR   BIT(1)   /*Flush transfer counter */
  1154.       #define  BM_XFER_MIN_8     BIT(2)   /*Enable bus master transfer of 9 */
  1155.       #define  BIOS_ENA          BIT(3)   /*Enable BIOS/FLASH Enable */
  1156.       #define  FORCE1_XFER       BIT(5)   /*Always xfer one byte in byte mode */
  1157.       #define  FAST_SINGLE       BIT(6)   /*?? */
  1158.       #define  BMCTRL_DEFAULT    (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L)
  1159.    #define  hp_reserved_27       0x27
  1160.    #define  hp_sg_addr           0x28
  1161.    #define  hp_page_ctrl         0x29
  1162.       #define  SCATTER_EN        BIT(0)   
  1163.       #define  SGRAM_ARAM        BIT(1)   
  1164.       #define  BIOS_SHADOW       BIT(2)   
  1165.       #define  G_INT_DISABLE     BIT(3)   /* Enable/Disable all Interrupts */
  1166.       #define  NARROW_SCSI_CARD  BIT(4)   /* NARROW/WIDE SCSI config pin */
  1167.    #define  hp_reserved_2A       0x2A
  1168.    #define  hp_pci_cmd_cfg       0x2B
  1169.       #define  IO_SPACE_ENA      BIT(0)   /*enable I/O space */
  1170.       #define  MEM_SPACE_ENA     BIT(1)   /*enable memory space */
  1171.       #define  BUS_MSTR_ENA      BIT(2)   /*enable bus master operation */
  1172.       #define  MEM_WI_ENA        BIT(4)   /*enable Write and Invalidate */
  1173.       #define  PAR_ERR_RESP      BIT(6)   /*enable parity error responce. */
  1174.    #define  hp_reserved_2C       0x2C
  1175.    #define  hp_pci_stat_cfg      0x2D
  1176.       #define  DATA_PARITY_ERR   BIT(0)   
  1177.       #define  REC_TARGET_ABORT  BIT(4)   /*received Target abort */
  1178.       #define  REC_MASTER_ABORT  BIT(5)   /*received Master abort */
  1179.       #define  SIG_SYSTEM_ERR    BIT(6)   
  1180.       #define  DETECTED_PAR_ERR  BIT(7)   
  1181.    #define  hp_reserved_2E       0x2E
  1182.    #define  hp_sys_status        0x2F
  1183.       #define  SLV_DATA_RDY      BIT(0)   /*Slave data ready */
  1184.       #define  XFER_CNT_ZERO     BIT(1)   /*Transfer counter = 0 */
  1185.       #define  BM_FIFO_EMPTY     BIT(2)   /*FIFO empty */
  1186.       #define  BM_FIFO_FULL      BIT(3)   /*FIFO full */
  1187.       #define  HOST_OP_DONE      BIT(4)   /*host operation done */
  1188.       #define  DMA_OP_DONE       BIT(5)   /*DMA operation done */
  1189.       #define  SLV_OP_DONE       BIT(6)   /*Slave operation done */
  1190.       #define  PWR_ON_FLAG       BIT(7)   /*Power on flag */
  1191.    #define  hp_reserved_30       0x30
  1192.    #define  hp_host_status0      0x31
  1193.       #define  HOST_TERM         BIT(5)   /*Host Terminal Count */
  1194.       #define  HOST_TRSHLD       BIT(6)   /*Host Threshold      */
  1195.       #define  CONNECTED_2_HOST  BIT(7)   /*Connected to Host   */
  1196.    #define  hp_reserved_32       0x32
  1197.    #define  hp_rev_num           0x33
  1198.       #define  REV_A_CONST       0x0E
  1199.       #define  REV_B_CONST       0x0E
  1200.    #define  hp_stack_data        0x34
  1201.    #define  hp_stack_addr        0x35
  1202.    #define  hp_ext_status        0x36
  1203.       #define  BM_FORCE_OFF      BIT(0)   /*Bus Master is forced to get off */
  1204.       #define  PCI_TGT_ABORT     BIT(0)   /*PCI bus master transaction aborted */
  1205.       #define  PCI_DEV_TMOUT     BIT(1)   /*PCI Device Time out */
  1206.       #define  FIFO_TC_NOT_ZERO  BIT(2)   /*FIFO or transfer counter not zero */
  1207.       #define  CHIP_RST_OCCUR    BIT(3)   /*Chip reset occurs */
  1208.       #define  CMD_ABORTED       BIT(4)   /*Command aborted */
  1209.       #define  BM_PARITY_ERR     BIT(5)   /*parity error on data received   */
  1210.       #define  PIO_OVERRUN       BIT(6)   /*Slave data overrun */
  1211.       #define  BM_CMD_BUSY       BIT(7)   /*Bus master transfer command busy */
  1212.       #define  BAD_EXT_STATUS    (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | 
  1213.                                   BM_PARITY_ERR | PIO_OVERRUN)
  1214.    #define  hp_int_status        0x37
  1215.       
  1216.       #define  BM_CMD_CMPL       BIT(0)   /*Bus Master command complete */
  1217.       #define  EXT_STATUS_ON     BIT(1)   /*Extended status is valid */
  1218.       #define  SCSI_INTERRUPT    BIT(2)   /*Global indication of a SCSI int. */
  1219.       #define  BM_FIFO_RDY       BIT(4)   
  1220.       #define  INT_ASSERTED      BIT(5)   /* */
  1221.       #define  SRAM_BUSY         BIT(6)   /*Scatter/Gather RAM busy */
  1222.       #define  CMD_REG_BUSY      BIT(7)                                       
  1223.    #define  hp_fifo_cnt          0x38
  1224.    #define  hp_curr_host_cnt     0x39
  1225.    #define  hp_reserved_3A       0x3A
  1226.    #define  hp_fifo_in_addr      0x3B
  1227.    #define  hp_fifo_out_addr     0x3C
  1228.    #define  hp_reserved_3D       0x3D
  1229.    #define  hp_reserved_3E       0x3E
  1230.    #define  hp_reserved_3F       0x3F
  1231.    extern USHORT default_intena;
  1232.    #define  hp_intena  0x40
  1233.       #define  RESET  BITW(7)
  1234.       #define  PROG_HLT  BITW(6)  
  1235.       #define  PARITY  BITW(5)
  1236.       #define  FIFO  BITW(4)
  1237.       #define  SEL  BITW(3)
  1238.       #define  SCAM_SEL  BITW(2) 
  1239.       #define  RSEL  BITW(1)
  1240.       #define  TIMEOUT  BITW(0)
  1241.       #define  BUS_FREE  BITW(15)
  1242.       #define  XFER_CNT_0  BITW(14)
  1243.       #define  PHASE  BITW(13)
  1244.       #define  IUNKWN  BITW(12)
  1245.       #define  ICMD_COMP  BITW(11)
  1246.       #define  ITICKLE  BITW(10)
  1247.       #define  IDO_STRT  BITW(9)
  1248.       #define  ITAR_DISC  BITW(8)
  1249.       #define  AUTO_INT  (BITW(12)+BITW(11)+BITW(10)+BITW(9)+BITW(8))
  1250.       #define  CLR_ALL_INT  0xFFFF
  1251.       #define  CLR_ALL_INT_1  0xFF00
  1252.    #define  hp_intstat  0x42
  1253.    #define  hp_scsisig           0x44
  1254.       #define  SCSI_SEL          BIT(7)
  1255.       #define  SCSI_BSY          BIT(6)
  1256.       #define  SCSI_REQ          BIT(5)
  1257.       #define  SCSI_ACK          BIT(4)
  1258.       #define  SCSI_ATN          BIT(3)
  1259.       #define  SCSI_CD           BIT(2)
  1260.       #define  SCSI_MSG          BIT(1)
  1261.       #define  SCSI_IOBIT        BIT(0)
  1262.       #define  S_SCSI_PHZ        (BIT(2)+BIT(1)+BIT(0))
  1263.       #define  S_CMD_PH          (BIT(2)              )
  1264.       #define  S_MSGO_PH         (BIT(2)+BIT(1)       )
  1265.       #define  S_STAT_PH         (BIT(2)       +BIT(0))
  1266.       #define  S_MSGI_PH         (BIT(2)+BIT(1)+BIT(0))
  1267.       #define  S_DATAI_PH        (              BIT(0))
  1268.       #define  S_DATAO_PH        0x00
  1269.       #define  S_ILL_PH          (       BIT(1)       )
  1270.    #define  hp_scsictrl_0        0x45
  1271.       #define  NO_ARB            BIT(7)
  1272.       #define  SEL_TAR           BIT(6)
  1273.       #define  ENA_ATN           BIT(4)
  1274.       #define  ENA_RESEL         BIT(2)
  1275.       #define  SCSI_RST          BIT(1)
  1276.       #define  ENA_SCAM_SEL      BIT(0)
  1277.    #define  hp_portctrl_0        0x46
  1278.       #define  SCSI_PORT         BIT(7)
  1279.       #define  SCSI_INBIT        BIT(6)
  1280.       #define  DMA_PORT          BIT(5)
  1281.       #define  DMA_RD            BIT(4)
  1282.       #define  HOST_PORT         BIT(3)
  1283.       #define  HOST_WRT          BIT(2)
  1284.       #define  SCSI_BUS_EN       BIT(1)
  1285.       #define  START_TO          BIT(0)
  1286.    #define  hp_scsireset         0x47
  1287.       #define  SCSI_TAR          BIT(7)
  1288.       #define  SCSI_INI          BIT(6)
  1289.       #define  SCAM_EN           BIT(5)
  1290.       #define  ACK_HOLD          BIT(4)
  1291.       #define  DMA_RESET         BIT(3)
  1292.       #define  HPSCSI_RESET      BIT(2)
  1293.       #define  PROG_RESET        BIT(1)
  1294.       #define  FIFO_CLR          BIT(0)
  1295.    #define  hp_xfercnt_0         0x48
  1296.    #define  hp_xfercnt_1         0x49
  1297.    #define  hp_xfercnt_2         0x4A
  1298.    #define  hp_xfercnt_3         0x4B
  1299.    #define  hp_fifodata_0        0x4C
  1300.    #define  hp_fifodata_1        0x4D
  1301.    #define  hp_addstat           0x4E
  1302.       #define  SCAM_TIMER        BIT(7)
  1303.       #define  AUTO_RUNNING      BIT(6)
  1304.       #define  FAST_SYNC         BIT(5)
  1305.       #define  SCSI_MODE8        BIT(3)
  1306.       #define  SCSI_PAR_ERR      BIT(0)
  1307.    #define  hp_prgmcnt_0         0x4F
  1308.       #define  AUTO_PC_MASK      0x3F
  1309.    #define  hp_selfid_0          0x50
  1310.    #define  hp_selfid_1          0x51
  1311.    #define  hp_arb_id            0x52
  1312.       #define  ARB_ID            (BIT(3) + BIT(2) + BIT(1) + BIT(0))
  1313.    #define  hp_select_id         0x53
  1314.       #define  RESEL_ID          (BIT(7) + BIT(6) + BIT(5) + BIT(4))
  1315.       #define  SELECT_ID         (BIT(3) + BIT(2) + BIT(1) + BIT(0))
  1316.    #define  hp_synctarg_base     0x54
  1317.    #define  hp_synctarg_12       0x54
  1318.    #define  hp_synctarg_13       0x55
  1319.    #define  hp_synctarg_14       0x56
  1320.    #define  hp_synctarg_15       0x57
  1321.    #define  hp_synctarg_8        0x58
  1322.    #define  hp_synctarg_9        0x59
  1323.    #define  hp_synctarg_10       0x5A
  1324.    #define  hp_synctarg_11       0x5B
  1325.    #define  hp_synctarg_4        0x5C
  1326.    #define  hp_synctarg_5        0x5D
  1327.    #define  hp_synctarg_6        0x5E
  1328.    #define  hp_synctarg_7        0x5F
  1329.    #define  hp_synctarg_0        0x60
  1330.    #define  hp_synctarg_1        0x61
  1331.    #define  hp_synctarg_2        0x62
  1332.    #define  hp_synctarg_3        0x63
  1333.       #define  RATE_20MB         0x00
  1334.       #define  RATE_10MB         (              BIT(5))
  1335.       #define  RATE_6_6MB        (       BIT(6)       )   
  1336.       #define  RATE_5MB          (       BIT(6)+BIT(5))
  1337.       #define  RATE_4MB          (BIT(7)              )
  1338.       #define  RATE_3_33MB       (BIT(7)       +BIT(5))
  1339.       #define  RATE_2_85MB       (BIT(7)+BIT(6)       )
  1340.       #define  RATE_2_5MB        (BIT(7)+BIT(5)+BIT(6))
  1341.       #define  NEXT_CLK          BIT(5)
  1342.       #define  SLOWEST_SYNC      (BIT(7)+BIT(6)+BIT(5))
  1343.       #define  NARROW_SCSI       BIT(4)
  1344.       #define  SYNC_OFFSET       (BIT(3) + BIT(2) + BIT(1) + BIT(0))
  1345.       #define  DEFAULT_ASYNC     0x00
  1346.       #define  DEFAULT_OFFSET    0x0F
  1347.    #define  hp_autostart_0       0x64
  1348.    #define  hp_autostart_1       0x65
  1349.    #define  hp_autostart_2       0x66
  1350.    #define  hp_autostart_3       0x67
  1351.       #define  DISABLE  0x00
  1352.       #define  AUTO_IMMED    BIT(5)
  1353.       #define  SELECT   BIT(6)
  1354.       #define  RESELECT (BIT(6)+BIT(5))
  1355.       #define  BUSFREE  BIT(7)
  1356.       #define  XFER_0   (BIT(7)+BIT(5))
  1357.       #define  END_DATA (BIT(7)+BIT(6))
  1358.       #define  MSG_PHZ  (BIT(7)+BIT(6)+BIT(5))
  1359.    #define  hp_gp_reg_0          0x68
  1360.    #define  hp_gp_reg_1          0x69
  1361.    #define  hp_gp_reg_2          0x6A
  1362.    #define  hp_gp_reg_3          0x6B
  1363.    #define  hp_seltimeout        0x6C
  1364.       #define  TO_2ms            0x54      /* 2.0503ms */
  1365.       #define  TO_4ms            0x67      /* 3.9959ms */
  1366.       #define  TO_5ms            0x03      /* 4.9152ms */
  1367.       #define  TO_10ms           0x07      /* 11.xxxms */
  1368.       #define  TO_250ms          0x99      /* 250.68ms */
  1369.       #define  TO_290ms          0xB1      /* 289.99ms */
  1370.       #define  TO_350ms          0xD6      /* 350.62ms */
  1371.       #define  TO_417ms          0xFF      /* 417.79ms */
  1372.    #define  hp_clkctrl_0         0x6D
  1373.       #define  PWR_DWN           BIT(6)
  1374.       #define  ACTdeassert       BIT(4)
  1375.       #define  ATNonErr          BIT(3)
  1376.       #define  CLK_30MHZ         BIT(1)
  1377.       #define  CLK_40MHZ         (BIT(1) + BIT(0))
  1378.       #define  CLK_50MHZ         BIT(2)
  1379.       #define  CLKCTRL_DEFAULT   (ACTdeassert | CLK_40MHZ)
  1380.    #define  hp_fiforead          0x6E
  1381.    #define  hp_fifowrite         0x6F
  1382.    #define  hp_offsetctr         0x70
  1383.    #define  hp_xferstat          0x71
  1384.       #define  FIFO_FULL         BIT(7)
  1385.       #define  FIFO_EMPTY        BIT(6)
  1386.       #define  FIFO_MASK         0x3F   /* Mask for the FIFO count value. */
  1387.       #define  FIFO_LEN          0x20
  1388.    #define  hp_portctrl_1        0x72
  1389.       #define  EVEN_HOST_P       BIT(5)
  1390.       #define  INVT_SCSI         BIT(4)
  1391.       #define  CHK_SCSI_P        BIT(3)
  1392.       #define  HOST_MODE8        BIT(0)
  1393.       #define  HOST_MODE16       0x00
  1394.    #define  hp_xfer_pad          0x73
  1395.       #define  ID_UNLOCK         BIT(3)
  1396.       #define  XFER_PAD          BIT(2)
  1397.    #define  hp_scsidata_0        0x74
  1398.    #define  hp_scsidata_1        0x75
  1399.    #define  hp_timer_0           0x76
  1400.    #define  hp_timer_1           0x77
  1401.    #define  hp_reserved_78       0x78
  1402.    #define  hp_reserved_79       0x79
  1403.    #define  hp_reserved_7A       0x7A
  1404.    #define  hp_reserved_7B       0x7B
  1405.    #define  hp_reserved_7C       0x7C
  1406.    #define  hp_reserved_7D       0x7D
  1407.    #define  hp_reserved_7E       0x7E
  1408.    #define  hp_reserved_7F       0x7F
  1409.    #define  hp_aramBase          0x80
  1410.    #define  BIOS_DATA_OFFSET     0x60
  1411.    #define  BIOS_RELATIVE_CARD   0x64
  1412.       #define  AUTO_LEN 0x80
  1413.       #define  AR0      0x00
  1414.       #define  AR1      BITW(8)
  1415.       #define  AR2      BITW(9)
  1416.       #define  AR3      (BITW(9) + BITW(8))
  1417.       #define  SDATA    BITW(10)
  1418.       #define  NOP_OP   0x00        /* Nop command */
  1419.       #define  CRD_OP   BITW(11)     /* Cmp Reg. w/ Data */
  1420.       #define  CRR_OP   BITW(12)     /* Cmp Reg. w. Reg. */
  1421.       #define  CBE_OP   (BITW(14)+BITW(12)+BITW(11)) /* Cmp SCSI cmd class & Branch EQ */
  1422.       
  1423.       #define  CBN_OP   (BITW(14)+BITW(13))  /* Cmp SCSI cmd class & Branch NOT EQ */
  1424.       
  1425.       #define  CPE_OP   (BITW(14)+BITW(11))  /* Cmp SCSI phs & Branch EQ */
  1426.       #define  CPN_OP   (BITW(14)+BITW(12))  /* Cmp SCSI phs & Branch NOT EQ */
  1427.       #define  ADATA_OUT   0x00     
  1428.       #define  ADATA_IN    BITW(8)
  1429.       #define  ACOMMAND    BITW(10)
  1430.       #define  ASTATUS     (BITW(10)+BITW(8))
  1431.       #define  AMSG_OUT    (BITW(10)+BITW(9))
  1432.       #define  AMSG_IN     (BITW(10)+BITW(9)+BITW(8))
  1433.       #define  AILLEGAL    (BITW(9)+BITW(8))
  1434.       #define  BRH_OP   BITW(13)   /* Branch */
  1435.       
  1436.       #define  ALWAYS   0x00
  1437.       #define  EQUAL    BITW(8)
  1438.       #define  NOT_EQ   BITW(9)
  1439.       #define  TCB_OP   (BITW(13)+BITW(11))    /* Test condition & branch */
  1440.       
  1441.       #define  ATN_SET     BITW(8)
  1442.       #define  ATN_RESET   BITW(9)
  1443.       #define  XFER_CNT    (BITW(9)+BITW(8))
  1444.       #define  FIFO_0      BITW(10)
  1445.       #define  FIFO_NOT0   (BITW(10)+BITW(8))
  1446.       #define  T_USE_SYNC0 (BITW(10)+BITW(9))
  1447.       #define  MPM_OP   BITW(15)        /* Match phase and move data */
  1448.       #define  MDR_OP   (BITW(12)+BITW(11)) /* Move data to Reg. */
  1449.       #define  MRR_OP   BITW(14)        /* Move DReg. to Reg. */
  1450.       #define  S_IDREG  (BIT(2)+BIT(1)+BIT(0))
  1451.       #define  D_AR0    0x00
  1452.       #define  D_AR1    BIT(0)
  1453.       #define  D_AR2    BIT(1)
  1454.       #define  D_AR3    (BIT(1) + BIT(0))
  1455.       #define  D_SDATA  BIT(2)
  1456.       #define  D_BUCKET (BIT(2) + BIT(1) + BIT(0))
  1457.       #define  ADR_OP   (BITW(13)+BITW(12)) /* Logical AND Reg. w. Data */
  1458.       #define  ADS_OP   (BITW(14)+BITW(13)+BITW(12)) 
  1459.       #define  ODR_OP   (BITW(13)+BITW(12)+BITW(11))  
  1460.       #define  ODS_OP   (BITW(14)+BITW(13)+BITW(12)+BITW(11))  
  1461.       #define  STR_OP   (BITW(15)+BITW(14)) /* Store to A_Reg. */
  1462.       #define  AINT_ENA1   0x00
  1463.       #define  AINT_STAT1  BITW(8)
  1464.       #define  ASCSI_SIG   BITW(9)
  1465.       #define  ASCSI_CNTL  (BITW(9)+BITW(8))
  1466.       #define  APORT_CNTL  BITW(10)
  1467.       #define  ARST_CNTL   (BITW(10)+BITW(8))
  1468.       #define  AXFERCNT0   (BITW(10)+BITW(9))
  1469.       #define  AXFERCNT1   (BITW(10)+BITW(9)+BITW(8))
  1470.       #define  AXFERCNT2   BITW(11)
  1471.       #define  AFIFO_DATA  (BITW(11)+BITW(8))
  1472.       #define  ASCSISELID  (BITW(11)+BITW(9))
  1473.       #define  ASCSISYNC0  (BITW(11)+BITW(9)+BITW(8))
  1474.       #define  RAT_OP      (BITW(14)+BITW(13)+BITW(11))
  1475.       #define  SSI_OP      (BITW(15)+BITW(11))
  1476.       #define  SSI_ITAR_DISC (ITAR_DISC >> 8)
  1477.       #define  SSI_IDO_STRT (IDO_STRT >> 8)
  1478.       #define  SSI_IDI_STRT (IDO_STRT >> 8)
  1479.       #define  SSI_ICMD_COMP (ICMD_COMP >> 8)
  1480.       #define  SSI_ITICKLE (ITICKLE >> 8)
  1481.       #define  SSI_IUNKWN (IUNKWN >> 8)
  1482.       #define  SSI_INO_CC (IUNKWN >> 8)
  1483.       #define  SSI_IRFAIL (IUNKWN >> 8)
  1484.       #define  NP    0x10     /*Next Phase */
  1485.       #define  NTCMD 0x02     /*Non- Tagged Command start */
  1486.       #define  CMDPZ 0x04     /*Command phase */
  1487.       #define  DINT  0x12     /*Data Out/In interrupt */
  1488.       #define  DI    0x13     /*Data Out */
  1489.       #define  MI    0x14     /*Message In */
  1490.       #define  DC    0x19     /*Disconnect Message */
  1491.       #define  ST    0x1D     /*Status Phase */
  1492.       #define  UNKNWN 0x24    /*Unknown bus action */
  1493.       #define  CC    0x25     /*Command Completion failure */
  1494.       #define  TICK  0x26     /*New target reselected us. */
  1495.       #define  RFAIL 0x27     /*Reselection failed */
  1496.       #define  SELCHK 0x28     /*Select & Check SCSI ID latch reg */
  1497.       #define  ID_MSG_STRT    hp_aramBase + 0x00
  1498.       #define  NON_TAG_ID_MSG hp_aramBase + 0x06
  1499.       #define  CMD_STRT       hp_aramBase + 0x08
  1500.       #define  SYNC_MSGS      hp_aramBase + 0x08
  1501.       #define  TAG_STRT          0x00
  1502.       #define  SELECTION_START   0x00
  1503.       #define  DISCONNECT_START  0x10/2
  1504.       #define  END_DATA_START    0x14/2
  1505.       #define  NONTAG_STRT       0x02/2
  1506.       #define  CMD_ONLY_STRT     CMDPZ/2
  1507.       #define  TICKLE_STRT     TICK/2
  1508.       #define  SELCHK_STRT     SELCHK/2
  1509. #define mEEPROM_CLK_DELAY(port) (RD_HARPOON(port+hp_intstat_1))
  1510. #define mWAIT_10MS(port) (RD_HARPOON(port+hp_intstat_1))
  1511. #define CLR_XFER_CNT(port) (WR_HARPOON(port+hp_xfercnt_0, 0x00))
  1512. #define SET_XFER_CNT(port, data) (WR_HARP32(port,hp_xfercnt_0,data))
  1513. #define GET_XFER_CNT(port, xfercnt) {RD_HARP32(port,hp_xfercnt_0,xfercnt); xfercnt &= 0xFFFFFF;}
  1514. /* #define GET_XFER_CNT(port, xfercnt) (xfercnt = RD_HARPOON(port+hp_xfercnt_2), 
  1515.                                  xfercnt <<= 16,
  1516.                                  xfercnt |= RDW_HARPOON((USHORT)(port+hp_xfercnt_0)))
  1517.  */
  1518. #if defined(DOS)
  1519. #define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((USHORT)(port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),
  1520.          addr >>= 16,
  1521.          WRW_HARPOON((USHORT)(port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),
  1522.          WR_HARP32(port,hp_xfercnt_0,count),
  1523.          WRW_HARPOON((USHORT)(port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),
  1524.          count >>= 16,
  1525.          WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
  1526. #else
  1527. #define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),
  1528.          addr >>= 16,
  1529.          WRW_HARPOON((port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),
  1530.          WR_HARP32(port,hp_xfercnt_0,count),
  1531.          WRW_HARPOON((port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),
  1532.          count >>= 16,
  1533.          WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
  1534. #endif
  1535. #define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}
  1536.                           WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
  1537. #define ACCEPT_MSG_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}
  1538.                           WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
  1539. #define ACCEPT_STAT(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}
  1540.                           WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
  1541. #define ACCEPT_STAT_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}
  1542.                           WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
  1543. #define DISABLE_AUTO(port) (WR_HARPOON(port+hp_scsireset, PROG_RESET),
  1544.                         WR_HARPOON(port+hp_scsireset, 0x00))
  1545. #define ARAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, 
  1546.                              (RD_HARPOON(p_port+hp_page_ctrl) | SGRAM_ARAM)))
  1547. #define SGRAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, 
  1548.                              (RD_HARPOON(p_port+hp_page_ctrl) & ~SGRAM_ARAM)))
  1549. #define MDISABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, 
  1550.                              (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)))
  1551. #define MENABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, 
  1552.                              (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)))
  1553. #endif
  1554. #if (FW_TYPE==_UCB_MGR_)
  1555. void ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb);
  1556. void WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb);
  1557. void UpdateCheckSum(u32bits baseport);
  1558. #endif // (FW_TYPE==_UCB_MGR_)
  1559. #if defined(DOS)
  1560. UCHAR sfm(USHORT port, PSCCB pcurrSCCB);
  1561. void  scsiStartAuto(USHORT port);
  1562. UCHAR sisyncn(USHORT port, UCHAR p_card, UCHAR syncFlag);
  1563. void  ssel(USHORT port, UCHAR p_card);
  1564. void  sres(USHORT port, UCHAR p_card, PSCCBcard pCurrCard);
  1565. void  sdecm(UCHAR message, USHORT port, UCHAR p_card);
  1566. void  shandem(USHORT port, UCHAR p_card,PSCCB pCurrSCCB);
  1567. void  stsyncn(USHORT port, UCHAR p_card);
  1568. void  sisyncr(USHORT port,UCHAR sync_pulse, UCHAR offset);
  1569. void  sssyncv(USHORT p_port, UCHAR p_id, UCHAR p_sync_value, PSCCBMgr_tar_info currTar_Info);
  1570. void  sresb(USHORT port, UCHAR p_card);
  1571. void  sxfrp(USHORT p_port, UCHAR p_card);
  1572. void  schkdd(USHORT port, UCHAR p_card);
  1573. UCHAR RdStack(USHORT port, UCHAR index);
  1574. void  WrStack(USHORT portBase, UCHAR index, UCHAR data);
  1575. UCHAR ChkIfChipInitialized(USHORT ioPort);
  1576. #if defined(V302)
  1577. UCHAR GetTarLun(USHORT port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun);
  1578. #endif
  1579. void SendMsg(USHORT port, UCHAR message);
  1580. void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code);
  1581. UCHAR scsellDOS(USHORT p_port, UCHAR targ_id);
  1582. #else
  1583. UCHAR sfm(ULONG port, PSCCB pcurrSCCB);
  1584. void  scsiStartAuto(ULONG port);
  1585. UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag);
  1586. void  ssel(ULONG port, UCHAR p_card);
  1587. void  sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard);
  1588. void  sdecm(UCHAR message, ULONG port, UCHAR p_card);
  1589. void  shandem(ULONG port, UCHAR p_card,PSCCB pCurrSCCB);
  1590. void  stsyncn(ULONG port, UCHAR p_card);
  1591. void  sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset);
  1592. void  sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value, PSCCBMgr_tar_info currTar_Info);
  1593. void  sresb(ULONG port, UCHAR p_card);
  1594. void  sxfrp(ULONG p_port, UCHAR p_card);
  1595. void  schkdd(ULONG port, UCHAR p_card);
  1596. UCHAR RdStack(ULONG port, UCHAR index);
  1597. void  WrStack(ULONG portBase, UCHAR index, UCHAR data);
  1598. UCHAR ChkIfChipInitialized(ULONG ioPort);
  1599. #if defined(V302)
  1600. UCHAR GetTarLun(ULONG port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tar, PUCHAR lun);
  1601. #endif
  1602. void SendMsg(ULONG port, UCHAR message);
  1603. void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code);
  1604. #endif
  1605. void  ssenss(PSCCBcard pCurrCard);
  1606. void  sinits(PSCCB p_sccb, UCHAR p_card);
  1607. void  RNVRamData(PNVRamInfo pNvRamInfo);
  1608. #if defined(WIDE_SCSI)
  1609.    #if defined(DOS)
  1610.    UCHAR siwidn(USHORT port, UCHAR p_card);
  1611.    void  stwidn(USHORT port, UCHAR p_card);
  1612.    void  siwidr(USHORT port, UCHAR width);
  1613.    #else
  1614.    UCHAR siwidn(ULONG port, UCHAR p_card);
  1615.    void  stwidn(ULONG port, UCHAR p_card);
  1616.    void  siwidr(ULONG port, UCHAR width);
  1617.    #endif
  1618. #endif
  1619. void  queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card);
  1620. void  queueDisconnect(PSCCB p_SCCB, UCHAR p_card);
  1621. void  queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_SCCB, UCHAR p_card);
  1622. void  queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card);
  1623. void  queueFlushSccb(UCHAR p_card, UCHAR error_code);
  1624. void  queueAddSccb(PSCCB p_SCCB, UCHAR card);
  1625. UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card);
  1626. void  utilUpdateResidual(PSCCB p_SCCB);
  1627. USHORT CalcCrc16(UCHAR buffer[]);
  1628. UCHAR  CalcLrc(UCHAR buffer[]);
  1629. #if defined(DOS)
  1630. void  Wait1Second(USHORT p_port);
  1631. void  Wait(USHORT p_port, UCHAR p_delay);
  1632. void  utilEEWriteOnOff(USHORT p_port,UCHAR p_mode);
  1633. void  utilEEWrite(USHORT p_port, USHORT ee_data, USHORT ee_addr);
  1634. USHORT utilEERead(USHORT p_port, USHORT ee_addr);
  1635. USHORT utilEEReadOrg(USHORT p_port, USHORT ee_addr);
  1636. void  utilEESendCmdAddr(USHORT p_port, UCHAR ee_cmd, USHORT ee_addr);
  1637. #else
  1638. void  Wait1Second(ULONG p_port);
  1639. void  Wait(ULONG p_port, UCHAR p_delay);
  1640. void  utilEEWriteOnOff(ULONG p_port,UCHAR p_mode);
  1641. void  utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr);
  1642. USHORT utilEERead(ULONG p_port, USHORT ee_addr);
  1643. USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr);
  1644. void  utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr);
  1645. #endif
  1646. #if defined(OS2)
  1647.    void  far phaseDataOut(ULONG port, UCHAR p_card);
  1648.    void  far phaseDataIn(ULONG port, UCHAR p_card);
  1649.    void  far phaseCommand(ULONG port, UCHAR p_card);
  1650.    void  far phaseStatus(ULONG port, UCHAR p_card);
  1651.    void  far phaseMsgOut(ULONG port, UCHAR p_card);
  1652.    void  far phaseMsgIn(ULONG port, UCHAR p_card);
  1653.    void  far phaseIllegal(ULONG port, UCHAR p_card);
  1654. #else
  1655.    #if defined(DOS)
  1656.       void  phaseDataOut(USHORT port, UCHAR p_card);
  1657.       void  phaseDataIn(USHORT port, UCHAR p_card);
  1658.       void  phaseCommand(USHORT port, UCHAR p_card);
  1659.       void  phaseStatus(USHORT port, UCHAR p_card);
  1660.       void  phaseMsgOut(USHORT port, UCHAR p_card);
  1661.       void  phaseMsgIn(USHORT port, UCHAR p_card);
  1662.       void  phaseIllegal(USHORT port, UCHAR p_card);
  1663.    #else
  1664.       void  phaseDataOut(ULONG port, UCHAR p_card);
  1665.       void  phaseDataIn(ULONG port, UCHAR p_card);
  1666.       void  phaseCommand(ULONG port, UCHAR p_card);
  1667.       void  phaseStatus(ULONG port, UCHAR p_card);
  1668.       void  phaseMsgOut(ULONG port, UCHAR p_card);
  1669.       void  phaseMsgIn(ULONG port, UCHAR p_card);
  1670.       void  phaseIllegal(ULONG port, UCHAR p_card);
  1671.    #endif
  1672. #endif
  1673. #if defined(DOS)
  1674. void  phaseDecode(USHORT port, UCHAR p_card);
  1675. void  phaseChkFifo(USHORT port, UCHAR p_card);
  1676. void  phaseBusFree(USHORT p_port, UCHAR p_card);
  1677. #else
  1678. void  phaseDecode(ULONG port, UCHAR p_card);
  1679. void  phaseChkFifo(ULONG port, UCHAR p_card);
  1680. void  phaseBusFree(ULONG p_port, UCHAR p_card);
  1681. #endif
  1682. #if defined(DOS)
  1683. void  XbowInit(USHORT port, UCHAR scamFlg);
  1684. void  BusMasterInit(USHORT p_port);
  1685. int   DiagXbow(USHORT port);
  1686. int   DiagBusMaster(USHORT port);
  1687. void  DiagEEPROM(USHORT p_port);
  1688. #else
  1689. void  XbowInit(ULONG port, UCHAR scamFlg);
  1690. void  BusMasterInit(ULONG p_port);
  1691. int   DiagXbow(ULONG port);
  1692. int   DiagBusMaster(ULONG port);
  1693. void  DiagEEPROM(ULONG p_port);
  1694. #endif
  1695. #if defined(DOS)
  1696. void  busMstrAbort(USHORT port);
  1697. UCHAR busMstrTimeOut(USHORT port);
  1698. void  dataXferProcessor(USHORT port, PSCCBcard pCurrCard);
  1699. void  busMstrSGDataXferStart(USHORT port, PSCCB pCurrSCCB);
  1700. void  busMstrDataXferStart(USHORT port, PSCCB pCurrSCCB);
  1701. void  hostDataXferAbort(USHORT port, UCHAR p_card, PSCCB pCurrSCCB);
  1702. #else
  1703. void  busMstrAbort(ULONG port);
  1704. UCHAR busMstrTimeOut(ULONG port);
  1705. void  dataXferProcessor(ULONG port, PSCCBcard pCurrCard);
  1706. void  busMstrSGDataXferStart(ULONG port, PSCCB pCurrSCCB);
  1707. void  busMstrDataXferStart(ULONG port, PSCCB pCurrSCCB);
  1708. void  hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB);
  1709. #endif
  1710. void  hostDataXferRestart(PSCCB currSCCB);
  1711. #if defined (DOS)
  1712. UCHAR SccbMgr_bad_isr(USHORT p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int);
  1713. #else
  1714. UCHAR SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int);
  1715. #endif
  1716. void  SccbMgrTableInitAll(void);
  1717. void  SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card);
  1718. void  SccbMgrTableInitTarget(UCHAR p_card, UCHAR target);
  1719. void  scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up);
  1720. #if defined(DOS)
  1721. int   scarb(USHORT p_port, UCHAR p_sel_type);
  1722. void  scbusf(USHORT p_port);
  1723. void  scsel(USHORT p_port);
  1724. void  scasid(UCHAR p_card, USHORT p_port);
  1725. UCHAR scxferc(USHORT p_port, UCHAR p_data);
  1726. UCHAR scsendi(USHORT p_port, UCHAR p_id_string[]);
  1727. UCHAR sciso(USHORT p_port, UCHAR p_id_string[]);
  1728. void  scwirod(USHORT p_port, UCHAR p_data_bit);
  1729. void  scwiros(USHORT p_port, UCHAR p_data_bit);
  1730. UCHAR scvalq(UCHAR p_quintet);
  1731. UCHAR scsell(USHORT p_port, UCHAR targ_id);
  1732. void  scwtsel(USHORT p_port);
  1733. void  inisci(UCHAR p_card, USHORT p_port, UCHAR p_our_id);
  1734. void  scsavdi(UCHAR p_card, USHORT p_port);
  1735. #else
  1736. int   scarb(ULONG p_port, UCHAR p_sel_type);
  1737. void  scbusf(ULONG p_port);
  1738. void  scsel(ULONG p_port);
  1739. void  scasid(UCHAR p_card, ULONG p_port);
  1740. UCHAR scxferc(ULONG p_port, UCHAR p_data);
  1741. UCHAR scsendi(ULONG p_port, UCHAR p_id_string[]);
  1742. UCHAR sciso(ULONG p_port, UCHAR p_id_string[]);
  1743. void  scwirod(ULONG p_port, UCHAR p_data_bit);
  1744. void  scwiros(ULONG p_port, UCHAR p_data_bit);
  1745. UCHAR scvalq(UCHAR p_quintet);
  1746. UCHAR scsell(ULONG p_port, UCHAR targ_id);
  1747. void  scwtsel(ULONG p_port);
  1748. void  inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id);
  1749. void  scsavdi(UCHAR p_card, ULONG p_port);
  1750. #endif
  1751. UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[]);
  1752. #if defined(DOS)
  1753. void  autoCmdCmplt(USHORT p_port, UCHAR p_card);
  1754. void  autoLoadDefaultMap(USHORT p_port);
  1755. #else
  1756. void  autoCmdCmplt(ULONG p_port, UCHAR p_card);
  1757. void  autoLoadDefaultMap(ULONG p_port);
  1758. #endif
  1759. #if (FW_TYPE==_SCCB_MGR_)
  1760. void  OS_start_timer(unsigned long ioport, unsigned long timeout);
  1761. void  OS_stop_timer(unsigned long ioport, unsigned long timeout);
  1762. void  OS_disable_int(unsigned char intvec);
  1763. void  OS_enable_int(unsigned char intvec);
  1764. void  OS_delay(unsigned long count);
  1765. int   OS_VirtToPhys(u32bits CardHandle, u32bits *physaddr, u32bits *virtaddr);
  1766. #if !(defined(UNIX) || defined(OS2) || defined(SOLARIS_REAL_MODE)) 
  1767. void  OS_Lock(PSCCBMGR_INFO pCardInfo);
  1768. void  OS_UnLock(PSCCBMGR_INFO pCardInfo);
  1769. #endif // if FW_TYPE == ...
  1770. #endif
  1771. extern SCCBCARD BL_Card[MAX_CARDS];
  1772. extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
  1773. #if defined(OS2)
  1774.    extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
  1775. #else
  1776.    #if defined(DOS)
  1777.       extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
  1778.    #else
  1779.       extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
  1780.    #endif
  1781. #endif
  1782. extern SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR];
  1783. extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
  1784. #if defined(DOS) || defined(OS2)
  1785. extern UCHAR temp_id_string[ID_STRING_LENGTH];
  1786. #endif
  1787. extern UCHAR scamHAString[];
  1788. extern UCHAR mbCards;
  1789. #if defined(BUGBUG)
  1790. extern UCHAR debug_int[MAX_CARDS][debug_size];
  1791. extern UCHAR debug_index[MAX_CARDS];
  1792. void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
  1793. #endif
  1794. #if (FW_TYPE==_SCCB_MGR_)
  1795. #if defined(DOS)
  1796.    extern UCHAR first_time;
  1797. #endif
  1798. #endif /* (FW_TYPE==_SCCB_MGR_) */
  1799. #if (FW_TYPE==_UCB_MGR_)
  1800. #if defined(DOS)
  1801.    extern u08bits first_time;
  1802. #endif
  1803. #endif /* (FW_TYPE==_UCB_MGR_) */
  1804. #if defined(BUGBUG)
  1805. void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
  1806. #endif
  1807. extern unsigned int SccbGlobalFlags;
  1808. #ident "$Id: sccb.c 1.18 1997/06/10 16:47:04 mohan Exp $"
  1809. /*----------------------------------------------------------------------
  1810.  *
  1811.  *
  1812.  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
  1813.  *
  1814.  *   This file is available under both the GNU General Public License
  1815.  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
  1816.  *
  1817.  *   $Workfile:   sccb.c  $
  1818.  *
  1819.  *   Description:  Functions relating to handling of the SCCB interface
  1820.  *                 between the device driver and the HARPOON.
  1821.  *
  1822.  *   $Date: 1997/06/10 16:47:04 $
  1823.  *
  1824.  *   $Revision: 1.18 $
  1825.  *
  1826.  *----------------------------------------------------------------------*/
  1827. /*#include <globals.h>*/
  1828. #if (FW_TYPE==_UCB_MGR_)
  1829. /*#include <budi.h>*/
  1830. /*#include <budioctl.h>*/
  1831. #endif
  1832. /*#include <sccbmgr.h>*/
  1833. /*#include <blx30.h>*/
  1834. /*#include <target.h>*/
  1835. /*#include <eeprom.h>*/
  1836. /*#include <scsi2.h>*/
  1837. /*#include <harpoon.h>*/
  1838. #if (FW_TYPE==_SCCB_MGR_)
  1839. #define mOS_Lock(card)    OS_Lock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
  1840. #define mOS_UnLock(card)  OS_UnLock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
  1841. #else /* FW_TYPE==_UCB_MGR_ */
  1842. #define mOS_Lock(card)    OS_Lock((u32bits)(((PSCCBcard)card)->ioPort))
  1843. #define mOS_UnLock(card)  OS_UnLock((u32bits)(((PSCCBcard)card)->ioPort))
  1844. #endif
  1845. /*
  1846. extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
  1847. extern SCCBCARD BL_Card[MAX_CARDS];
  1848. extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
  1849. extern UCHAR mbCards;
  1850. #if defined (OS2)
  1851.    extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
  1852. #else
  1853.    #if defined(DOS)
  1854.       extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
  1855.    #else
  1856.       extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
  1857.    #endif
  1858. #endif
  1859. #if defined(BUGBUG)
  1860. extern UCHAR debug_int[MAX_CARDS][debug_size];
  1861. extern UCHAR debug_index[MAX_CARDS];
  1862. void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
  1863. #endif
  1864. */
  1865. #if (FW_TYPE==_SCCB_MGR_)
  1866. /*---------------------------------------------------------------------
  1867.  *
  1868.  * Function: SccbMgr_sense_adapter
  1869.  *
  1870.  * Description: Setup and/or Search for cards and return info to caller.
  1871.  *
  1872.  *---------------------------------------------------------------------*/
  1873. int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
  1874. {
  1875. #if defined(DOS)
  1876. #else
  1877.    static UCHAR first_time = 1;
  1878. #endif
  1879.    UCHAR i,j,id,ScamFlg;
  1880.    USHORT temp,temp2,temp3,temp4,temp5,temp6;
  1881. #if defined(DOS)
  1882.    USHORT ioport;
  1883. #else
  1884.    ULONG ioport;
  1885. #endif
  1886. PNVRamInfo pCurrNvRam;
  1887. #if defined(DOS)
  1888.    ioport = (USHORT)pCardInfo->si_baseaddr;
  1889. #else
  1890.    ioport = pCardInfo->si_baseaddr;
  1891. #endif
  1892.    if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
  1893.       return((int)FAILURE);
  1894.    if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
  1895.       return((int)FAILURE);
  1896.    if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
  1897.       return((int)FAILURE);
  1898.    if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
  1899.       return((int)FAILURE);
  1900.    if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
  1901. /* For new Harpoon then check for sub_device ID LSB
  1902.    the bits(0-3) must be all ZERO for compatible with
  1903.    current version of SCCBMgr, else skip this Harpoon
  1904. device. */
  1905.    if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
  1906.       return((int)FAILURE);
  1907. }
  1908.    if (first_time)
  1909.       {
  1910.       SccbMgrTableInitAll();
  1911.       first_time = 0;
  1912. mbCards = 0;
  1913.       }
  1914. if(RdStack(ioport, 0) != 0x00) {
  1915. if(ChkIfChipInitialized(ioport) == FALSE)
  1916. {
  1917. pCurrNvRam = NULL;
  1918.    WR_HARPOON(ioport+hp_semaphore, 0x00);
  1919. XbowInit(ioport, 0);             /*Must Init the SCSI before attempting */
  1920. DiagEEPROM(ioport);
  1921. }
  1922. else
  1923. {
  1924. if(mbCards < MAX_MB_CARDS) {
  1925. pCurrNvRam = &nvRamInfo[mbCards];
  1926. mbCards++;
  1927. pCurrNvRam->niBaseAddr = ioport;
  1928. RNVRamData(pCurrNvRam);
  1929. }else
  1930. return((int) FAILURE);
  1931. }
  1932. }else
  1933. pCurrNvRam = NULL;
  1934. #if defined (NO_BIOS_OPTION)
  1935. pCurrNvRam = NULL;
  1936.    XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
  1937.    DiagEEPROM(ioport);
  1938. #endif  /* No BIOS Option */
  1939.    WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
  1940.    WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
  1941. if(pCurrNvRam)
  1942. pCardInfo->si_id = pCurrNvRam->niAdapId;
  1943. else
  1944.    pCardInfo->si_id = (UCHAR)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
  1945.        (UCHAR)0x0FF);
  1946.    pCardInfo->si_lun = 0x00;
  1947.    pCardInfo->si_fw_revision = ORION_FW_REV;
  1948.    temp2 = 0x0000;
  1949.    temp3 = 0x0000;
  1950.    temp4 = 0x0000;
  1951.    temp5 = 0x0000;
  1952.    temp6 = 0x0000;
  1953.    for (id = 0; id < (16/2); id++) {
  1954. if(pCurrNvRam){
  1955. temp = (USHORT) pCurrNvRam->niSyncTbl[id];
  1956. temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
  1957.  (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
  1958. }else
  1959.       temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
  1960.       for (i = 0; i < 2; temp >>=8,i++) {
  1961.          temp2 >>= 1;
  1962.          temp3 >>= 1;
  1963.          temp4 >>= 1;
  1964.          temp5 >>= 1;
  1965.          temp6 >>= 1;
  1966.  switch (temp & 0x3)
  1967.    {
  1968.    case AUTO_RATE_20: /* Synchronous, 20 mega-transfers/second */
  1969.      temp6 |= 0x8000; /* Fall through */
  1970.    case AUTO_RATE_10: /* Synchronous, 10 mega-transfers/second */
  1971.      temp5 |= 0x8000; /* Fall through */
  1972.    case AUTO_RATE_05: /* Synchronous, 5 mega-transfers/second */
  1973.      temp2 |= 0x8000; /* Fall through */
  1974.    case AUTO_RATE_00: /* Asynchronous */
  1975.      break;
  1976.    }
  1977.          if (temp & DISC_ENABLE_BIT)
  1978.    temp3 |= 0x8000;
  1979.          if (temp & WIDE_NEGO_BIT)
  1980.    temp4 |= 0x8000;
  1981.          }
  1982.       }
  1983.    pCardInfo->si_per_targ_init_sync = temp2;
  1984.    pCardInfo->si_per_targ_no_disc = temp3;
  1985.    pCardInfo->si_per_targ_wide_nego = temp4;
  1986.    pCardInfo->si_per_targ_fast_nego = temp5;
  1987.    pCardInfo->si_per_targ_ultra_nego = temp6;
  1988. if(pCurrNvRam)
  1989. i = pCurrNvRam->niSysConf;
  1990. else
  1991.    i = (UCHAR)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
  1992. if(pCurrNvRam)
  1993. ScamFlg = pCurrNvRam->niScamConf;
  1994. else
  1995.    ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
  1996.    pCardInfo->si_flags = 0x0000;
  1997.    if (i & 0x01)
  1998.       pCardInfo->si_flags |= SCSI_PARITY_ENA;
  1999.    if (!(i & 0x02))
  2000.       pCardInfo->si_flags |= SOFT_RESET;
  2001.    if (i & 0x10)
  2002.       pCardInfo->si_flags |= EXTENDED_TRANSLATION;
  2003.    if (ScamFlg & SCAM_ENABLED)
  2004.      pCardInfo->si_flags |= FLAG_SCAM_ENABLED;
  2005.    if (ScamFlg & SCAM_LEVEL2)
  2006.      pCardInfo->si_flags |= FLAG_SCAM_LEVEL2;
  2007.    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
  2008.    if (i & 0x04) {
  2009.       j |= SCSI_TERM_ENA_L;
  2010.       }
  2011.    WR_HARPOON(ioport+hp_bm_ctrl, j );
  2012.    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
  2013.    if (i & 0x08) {
  2014.       j |= SCSI_TERM_ENA_H;
  2015.       }
  2016.    WR_HARPOON(ioport+hp_ee_ctrl, j );
  2017.    if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
  2018.       pCardInfo->si_flags |= SUPPORT_16TAR_32LUN;
  2019.    pCardInfo->si_card_family = HARPOON_FAMILY;
  2020.    pCardInfo->si_bustype = BUSTYPE_PCI;
  2021. if(pCurrNvRam){
  2022.     pCardInfo->si_card_model[0] = '9';
  2023. switch(pCurrNvRam->niModel & 0x0f){
  2024. case MODEL_LT:
  2025.     pCardInfo->si_card_model[1] = '3';
  2026.     pCardInfo->si_card_model[2] = '0';
  2027. break;
  2028. case MODEL_LW:
  2029.     pCardInfo->si_card_model[1] = '5';
  2030.     pCardInfo->si_card_model[2] = '0';
  2031. break;
  2032. case MODEL_DL:
  2033.     pCardInfo->si_card_model[1] = '3';
  2034.     pCardInfo->si_card_model[2] = '2';
  2035. break;
  2036. case MODEL_DW:
  2037.     pCardInfo->si_card_model[1] = '5';
  2038.     pCardInfo->si_card_model[2] = '2';
  2039. break;
  2040. }
  2041. }else{
  2042.    temp = utilEERead(ioport, (MODEL_NUMB_0/2));
  2043.     pCardInfo->si_card_model[0] = (UCHAR)(temp >> 8);
  2044.    temp = utilEERead(ioport, (MODEL_NUMB_2/2));
  2045.     pCardInfo->si_card_model[1] = (UCHAR)(temp & 0x00FF);
  2046.    pCardInfo->si_card_model[2] = (UCHAR)(temp >> 8);
  2047. }
  2048.    if (pCardInfo->si_card_model[1] == '3')
  2049.      {
  2050.        if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
  2051.  pCardInfo->si_flags |= LOW_BYTE_TERM;
  2052.      }
  2053.    else if (pCardInfo->si_card_model[2] == '0')
  2054.      {
  2055.        temp = RD_HARPOON(ioport+hp_xfer_pad);
  2056.        WR_HARPOON(ioport+hp_xfer_pad, (temp & ~BIT(4)));
  2057.        if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
  2058.  pCardInfo->si_flags |= LOW_BYTE_TERM;
  2059.        WR_HARPOON(ioport+hp_xfer_pad, (temp | BIT(4)));
  2060.        if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
  2061.  pCardInfo->si_flags |= HIGH_BYTE_TERM;
  2062.        WR_HARPOON(ioport+hp_xfer_pad, temp);
  2063.      }
  2064.    else
  2065.      {
  2066.        temp = RD_HARPOON(ioport+hp_ee_ctrl);
  2067.        temp2 = RD_HARPOON(ioport+hp_xfer_pad);
  2068.        WR_HARPOON(ioport+hp_ee_ctrl, (temp | SEE_CS));
  2069.        WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
  2070.        temp3 = 0;
  2071.        for (i = 0; i < 8; i++)
  2072.  {
  2073.    temp3 <<= 1;
  2074.    if (!(RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7)))
  2075.      temp3 |= 1;
  2076.    WR_HARPOON(ioport+hp_xfer_pad, (temp2 & ~BIT(4)));
  2077.    WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
  2078.  }
  2079.        WR_HARPOON(ioport+hp_ee_ctrl, temp);
  2080.        WR_HARPOON(ioport+hp_xfer_pad, temp2);
  2081.        if (!(temp3 & BIT(7)))
  2082.  pCardInfo->si_flags |= LOW_BYTE_TERM;
  2083.        if (!(temp3 & BIT(6)))
  2084.  pCardInfo->si_flags |= HIGH_BYTE_TERM;
  2085.      }
  2086.    ARAM_ACCESS(ioport);
  2087.    for ( i = 0; i < 4; i++ ) {
  2088.       pCardInfo->si_XlatInfo[i] =
  2089.          RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
  2090.       }
  2091. /* return with -1 if no sort, else return with
  2092.    logical card number sorted by BIOS (zero-based) */
  2093. pCardInfo->si_relative_cardnum =
  2094. (UCHAR)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1);
  2095.    SGRAM_ACCESS(ioport);
  2096.    s_PhaseTbl[0] = phaseDataOut;
  2097.    s_PhaseTbl[1] = phaseDataIn;
  2098.    s_PhaseTbl[2] = phaseIllegal;
  2099.    s_PhaseTbl[3] = phaseIllegal;
  2100.    s_PhaseTbl[4] = phaseCommand;
  2101.    s_PhaseTbl[5] = phaseStatus;
  2102.    s_PhaseTbl[6] = phaseMsgOut;
  2103.    s_PhaseTbl[7] = phaseMsgIn;
  2104.    pCardInfo->si_present = 0x01;
  2105. #if defined(BUGBUG)
  2106.    for (i = 0; i < MAX_CARDS; i++) {
  2107.       for (id=0; id<debug_size; id++)
  2108.          debug_int[i][id] =  (UCHAR)0x00;
  2109.       debug_index[i] = 0;
  2110.       }
  2111. #endif
  2112.    return(0);
  2113. }
  2114. /*---------------------------------------------------------------------
  2115.  *
  2116.  * Function: SccbMgr_config_adapter
  2117.  *
  2118.  * Description: Setup adapter for normal operation (hard reset).
  2119.  *
  2120.  *---------------------------------------------------------------------*/
  2121. #if defined(DOS)
  2122. USHORT SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
  2123. #else
  2124. ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
  2125. #endif
  2126. {
  2127.    PSCCBcard CurrCard = NULL;
  2128. PNVRamInfo pCurrNvRam;
  2129.    UCHAR i,j,thisCard, ScamFlg;
  2130.    USHORT temp,sync_bit_map,id;
  2131. #if defined(DOS)
  2132.    USHORT ioport;
  2133. #else
  2134.    ULONG ioport;
  2135. #endif
  2136. #if defined(DOS)
  2137.    ioport = (USHORT)pCardInfo->si_baseaddr;
  2138. #else
  2139.    ioport = pCardInfo->si_baseaddr;
  2140. #endif
  2141.    for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
  2142.       if (thisCard == MAX_CARDS) {
  2143.  return(FAILURE);
  2144.          }
  2145.       if (BL_Card[thisCard].ioPort == ioport) {
  2146.          CurrCard = &BL_Card[thisCard];
  2147.          SccbMgrTableInitCard(CurrCard,thisCard);
  2148.          break;
  2149.          }
  2150.       else if (BL_Card[thisCard].ioPort == 0x00) {
  2151.          BL_Card[thisCard].ioPort = ioport;
  2152.          CurrCard = &BL_Card[thisCard];
  2153. if(mbCards)
  2154. for(i = 0; i < mbCards; i++){
  2155. if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
  2156. CurrCard->pNvRamInfo = &nvRamInfo[i];
  2157. }
  2158.          SccbMgrTableInitCard(CurrCard,thisCard);
  2159.          CurrCard->cardIndex = thisCard;
  2160.          CurrCard->cardInfo = pCardInfo;
  2161.  break;
  2162.          }
  2163.       }
  2164. pCurrNvRam = CurrCard->pNvRamInfo;
  2165. if(pCurrNvRam){
  2166. ScamFlg = pCurrNvRam->niScamConf;
  2167. }
  2168. else{
  2169.    ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
  2170. }
  2171.    BusMasterInit(ioport);
  2172.    XbowInit(ioport, ScamFlg);
  2173. #if defined (NO_BIOS_OPTION)
  2174.    if (DiagXbow(ioport)) return(FAILURE);
  2175.    if (DiagBusMaster(ioport)) return(FAILURE);
  2176. #endif  /* No BIOS Option */
  2177.    autoLoadDefaultMap(ioport);
  2178.    for (i = 0,id = 0x01; i != pCardInfo->si_id; i++,id <<= 1){}
  2179.    WR_HARPOON(ioport+hp_selfid_0, id);
  2180.    WR_HARPOON(ioport+hp_selfid_1, 0x00);
  2181.    WR_HARPOON(ioport+hp_arb_id, pCardInfo->si_id);
  2182.    CurrCard->ourId = pCardInfo->si_id;
  2183.    i = (UCHAR) pCardInfo->si_flags;
  2184.    if (i & SCSI_PARITY_ENA)
  2185.        WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
  2186.    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
  2187.    if (i & LOW_BYTE_TERM)
  2188.       j |= SCSI_TERM_ENA_L;
  2189.    WR_HARPOON(ioport+hp_bm_ctrl, j);
  2190.    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
  2191.    if (i & HIGH_BYTE_TERM)
  2192.       j |= SCSI_TERM_ENA_H;
  2193.    WR_HARPOON(ioport+hp_ee_ctrl, j );
  2194.    if (!(pCardInfo->si_flags & SOFT_RESET)) {
  2195.       sresb(ioport,thisCard);
  2196.          scini(thisCard, pCardInfo->si_id, 0);
  2197.       }
  2198.    if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
  2199.       CurrCard->globalFlags |= F_NO_FILTER;
  2200. if(pCurrNvRam){
  2201. if(pCurrNvRam->niSysConf & 0x10)
  2202. CurrCard->globalFlags |= F_GREEN_PC;
  2203. }
  2204. else{
  2205.    if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
  2206.        CurrCard->globalFlags |= F_GREEN_PC;
  2207. }
  2208. /* Set global flag to indicate Re-Negotiation to be done on all
  2209. ckeck condition */
  2210. if(pCurrNvRam){
  2211. if(pCurrNvRam->niScsiConf & 0x04)
  2212. CurrCard->globalFlags |= F_DO_RENEGO;
  2213. }
  2214. else{
  2215.    if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
  2216.        CurrCard->globalFlags |= F_DO_RENEGO;
  2217. }
  2218. if(pCurrNvRam){
  2219. if(pCurrNvRam->niScsiConf & 0x08)
  2220. CurrCard->globalFlags |= F_CONLUN_IO;
  2221. }
  2222. else{
  2223.    if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
  2224.        CurrCard->globalFlags |= F_CONLUN_IO;
  2225. }
  2226.    temp = pCardInfo->si_per_targ_no_disc;
  2227.    for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
  2228.       if (temp & id)
  2229.  sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
  2230.       }
  2231.    sync_bit_map = 0x0001;
  2232.    for (id = 0; id < (MAX_SCSI_TAR/2); id++) {
  2233. if(pCurrNvRam){
  2234. temp = (USHORT) pCurrNvRam->niSyncTbl[id];
  2235. temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
  2236.  (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
  2237. }else
  2238.       temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
  2239.       for (i = 0; i < 2; temp >>=8,i++) {
  2240.          if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
  2241.             sccbMgrTbl[thisCard][id*2+i].TarEEValue = (UCHAR)temp;
  2242.             }
  2243.          else {
  2244.     sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
  2245.             sccbMgrTbl[thisCard][id*2+i].TarEEValue =
  2246.                (UCHAR)(temp & ~EE_SYNC_MASK);
  2247.             }
  2248. #if defined(WIDE_SCSI)
  2249. /*         if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
  2250.             (id*2+i >= 8)){
  2251. */
  2252.          if (pCardInfo->si_per_targ_wide_nego & sync_bit_map){
  2253.             sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
  2254.             }
  2255.          else { /* NARROW SCSI */
  2256.             sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
  2257.             }
  2258. #else
  2259.          sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
  2260. #endif
  2261.  sync_bit_map <<= 1;
  2262.          }
  2263.       }
  2264.    WR_HARPOON((ioport+hp_semaphore),
  2265.       (UCHAR)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
  2266. #if defined(DOS)
  2267.    return((USHORT)CurrCard);
  2268. #else
  2269.    return((ULONG)CurrCard);
  2270. #endif
  2271. }
  2272. #else   /* end (FW_TYPE==_SCCB_MGR_)  */
  2273. STATIC s16bits FP_PresenceCheck(PMGR_INFO pMgrInfo)
  2274. {
  2275. PMGR_ENTRYPNTS pMgr_EntryPnts = &pMgrInfo->mi_Functions;
  2276.       pMgr_EntryPnts->UCBMgr_probe_adapter = probe_adapter;
  2277.       pMgr_EntryPnts->UCBMgr_init_adapter = init_adapter;
  2278.       pMgr_EntryPnts->UCBMgr_start_UCB = SccbMgr_start_sccb;
  2279.       pMgr_EntryPnts->UCBMgr_build_UCB = build_UCB;
  2280.       pMgr_EntryPnts->UCBMgr_abort_UCB = SccbMgr_abort_sccb;
  2281.       pMgr_EntryPnts->UCBMgr_my_int = SccbMgr_my_int;
  2282.       pMgr_EntryPnts->UCBMgr_isr = SccbMgr_isr;
  2283.       pMgr_EntryPnts->UCBMgr_scsi_reset = SccbMgr_scsi_reset;
  2284.       pMgr_EntryPnts->UCBMgr_timer_expired = SccbMgr_timer_expired;
  2285. #ifndef NO_IOCTLS
  2286.   pMgr_EntryPnts->UCBMgr_unload_card = SccbMgr_unload_card;
  2287.   pMgr_EntryPnts->UCBMgr_save_foreign_state =
  2288.    SccbMgr_save_foreign_state;
  2289.   pMgr_EntryPnts->UCBMgr_restore_foreign_state =
  2290.    SccbMgr_restore_foreign_state;
  2291.   pMgr_EntryPnts->UCBMgr_restore_native_state =
  2292.    SccbMgr_restore_native_state;
  2293. #endif /*NO_IOCTLS*/
  2294.       pMgrInfo->mi_SGListFormat=0x01;
  2295.       pMgrInfo->mi_DataPtrFormat=0x01;
  2296.       pMgrInfo->mi_MaxSGElements= (u16bits) 0xffffffff;
  2297.       pMgrInfo->mi_MgrPrivateLen=sizeof(SCCB);
  2298.       pMgrInfo->mi_PCIVendorID=BL_VENDOR_ID;
  2299.       pMgrInfo->mi_PCIDeviceID=FP_DEVICE_ID;
  2300.       pMgrInfo->mi_MgrAttributes= ATTR_IO_MAPPED +
  2301.  ATTR_PHYSICAL_ADDRESS +
  2302.  ATTR_VIRTUAL_ADDRESS +
  2303.  ATTR_OVERLAPPED_IO_IOCTLS_OK;
  2304.       pMgrInfo->mi_IoRangeLen = 256;
  2305.       return(0);
  2306. }
  2307. /*---------------------------------------------------------------------
  2308.  *
  2309.  * Function: probe_adapter
  2310.  *
  2311.  * Description: Setup and/or Search for cards and return info to caller.
  2312.  *
  2313.  *---------------------------------------------------------------------*/
  2314. STATIC s32bits probe_adapter(PADAPTER_INFO pAdapterInfo)
  2315. {
  2316.    u16bits temp,temp2,temp3,temp4;
  2317.    u08bits i,j,id;
  2318. #if defined(DOS)
  2319. #else
  2320.    static u08bits first_time = 1;
  2321. #endif
  2322.    BASE_PORT ioport;
  2323. PNVRamInfo pCurrNvRam;
  2324.    ioport = (BASE_PORT)pAdapterInfo->ai_baseaddr;
  2325.    if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
  2326.       return(1);
  2327.    if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
  2328.       return(2);
  2329.    if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
  2330.       return(3);
  2331.    if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
  2332.       return(4);
  2333.    if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
  2334. /* For new Harpoon then check for sub_device ID LSB
  2335.    the bits(0-3) must be all ZERO for compatible with
  2336.    current version of SCCBMgr, else skip this Harpoon
  2337. device. */
  2338.    if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
  2339.       return(5);
  2340. }
  2341.    if (first_time) {
  2342.       SccbMgrTableInitAll();
  2343.       first_time = 0;
  2344. mbCards = 0;
  2345.       }
  2346. if(RdStack(ioport, 0) != 0x00) {
  2347. if(ChkIfChipInitialized(ioport) == FALSE)
  2348. {
  2349. pCurrNvRam = NULL;
  2350.    WR_HARPOON(ioport+hp_semaphore, 0x00);
  2351. XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
  2352. DiagEEPROM(ioport);
  2353. }
  2354. else
  2355. {
  2356. if(mbCards < MAX_MB_CARDS) {
  2357. pCurrNvRam = &nvRamInfo[mbCards];
  2358. mbCards++;
  2359. pCurrNvRam->niBaseAddr = ioport;
  2360. RNVRamData(pCurrNvRam);
  2361. }else
  2362. return((int) FAILURE);
  2363. }
  2364. }else
  2365. pCurrNvRam = NULL;
  2366. #if defined (NO_BIOS_OPTION)
  2367. pCurrNvRam = NULL;
  2368.    XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
  2369.    DiagEEPROM(ioport);
  2370. #endif  /* No BIOS Option */
  2371.    WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
  2372.    WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
  2373. if(pCurrNvRam)
  2374. pAdapterInfo->ai_id = pCurrNvRam->niAdapId;
  2375. else
  2376.     pAdapterInfo->ai_id = (u08bits)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
  2377.        (u08bits)0x0FF);
  2378.    pAdapterInfo->ai_lun = 0x00;
  2379.    pAdapterInfo->ai_fw_revision[0] = '3';
  2380.    pAdapterInfo->ai_fw_revision[1] = '1';
  2381.    pAdapterInfo->ai_fw_revision[2] = '1';
  2382.    pAdapterInfo->ai_fw_revision[3] = ' ';
  2383.    pAdapterInfo->ai_NumChannels = 1;
  2384.    temp2 = 0x0000;
  2385.    temp3 = 0x0000;
  2386.    temp4 = 0x0000;
  2387.    for (id = 0; id < (16/2); id++) {
  2388. if(pCurrNvRam){
  2389. temp = (USHORT) pCurrNvRam->niSyncTbl[id];
  2390. temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
  2391.  (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
  2392. }else
  2393.       temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
  2394.       for (i = 0; i < 2; temp >>=8,i++) {
  2395.          if ((temp & 0x03) != AUTO_RATE_00) {
  2396.             temp2 >>= 0x01;
  2397.             temp2 |= 0x8000;
  2398.             }
  2399.          else {
  2400.             temp2 >>= 0x01;
  2401.             }
  2402.          if (temp & DISC_ENABLE_BIT) {
  2403.             temp3 >>= 0x01;
  2404.             temp3 |= 0x8000;
  2405.             }
  2406.          else {
  2407.             temp3 >>= 0x01;
  2408.             }
  2409.          if (temp & WIDE_NEGO_BIT) {
  2410.             temp4 >>= 0x01;
  2411.             temp4 |= 0x8000;
  2412.             }
  2413.          else {
  2414.             temp4 >>= 0x01;
  2415.             }
  2416.          }
  2417.       }
  2418.    pAdapterInfo->ai_per_targ_init_sync = temp2;
  2419.    pAdapterInfo->ai_per_targ_no_disc = temp3;
  2420.    pAdapterInfo->ai_per_targ_wide_nego = temp4;
  2421. if(pCurrNvRam)
  2422. i = pCurrNvRam->niSysConf;
  2423. else
  2424.     i = (u08bits)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
  2425.    /*
  2426.    ** interrupts always level-triggered for FlashPoint
  2427.    */
  2428.    pAdapterInfo->ai_stateinfo |= LEVEL_TRIG;
  2429.    if (i & 0x01)
  2430.       pAdapterInfo->ai_stateinfo |= SCSI_PARITY_ENA;
  2431. if (i & 0x02) /* SCSI Bus reset in AutoSCSI Set ? */
  2432. {
  2433. if(pCurrNvRam)
  2434. {
  2435. j = pCurrNvRam->niScamConf;
  2436. }
  2437. else
  2438. {
  2439. j = (u08bits) utilEERead(ioport, SCAM_CONFIG/2);
  2440. }
  2441. if(j & SCAM_ENABLED)
  2442. {
  2443. if(j & SCAM_LEVEL2)
  2444. {
  2445. pAdapterInfo->ai_stateinfo |= SCAM2_ENA;
  2446. }
  2447. else
  2448. {
  2449. pAdapterInfo->ai_stateinfo |= SCAM1_ENA;
  2450. }
  2451. }
  2452. }
  2453.    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
  2454.    if (i & 0x04) {
  2455.       j |= SCSI_TERM_ENA_L;
  2456.       pAdapterInfo->ai_stateinfo |= LOW_BYTE_TERM_ENA;
  2457.       }
  2458.    WR_HARPOON(ioport+hp_bm_ctrl, j );
  2459.    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
  2460.    if (i & 0x08) {
  2461.       j |= SCSI_TERM_ENA_H;
  2462.       pAdapterInfo->ai_stateinfo |= HIGH_BYTE_TERM_ENA;
  2463.       }
  2464.    WR_HARPOON(ioport+hp_ee_ctrl, j );
  2465. if(RD_HARPOON(ioport + hp_page_ctrl) & BIOS_SHADOW)
  2466. {
  2467. pAdapterInfo->ai_FlashRomSize = 64 * 1024; /* 64k ROM */
  2468. }
  2469. else
  2470. {
  2471. pAdapterInfo->ai_FlashRomSize = 32 * 1024; /* 32k ROM */
  2472. }
  2473.    pAdapterInfo->ai_stateinfo |= (FAST20_ENA | TAG_QUEUE_ENA);
  2474.    if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
  2475. {
  2476.       pAdapterInfo->ai_attributes |= (WIDE_CAPABLE | FAST20_CAPABLE
  2477. | SCAM2_CAPABLE
  2478. | TAG_QUEUE_CAPABLE
  2479. | SUPRESS_UNDERRRUNS_CAPABLE
  2480. | SCSI_PARITY_CAPABLE);
  2481. pAdapterInfo->ai_MaxTarg = 16;
  2482. pAdapterInfo->ai_MaxLun  = 32;
  2483. }
  2484. else
  2485. {
  2486.       pAdapterInfo->ai_attributes |= (FAST20_CAPABLE | SCAM2_CAPABLE
  2487. | TAG_QUEUE_CAPABLE
  2488. | SUPRESS_UNDERRRUNS_CAPABLE
  2489. | SCSI_PARITY_CAPABLE);
  2490. pAdapterInfo->ai_MaxTarg = 8;
  2491. pAdapterInfo->ai_MaxLun  = 8;
  2492. }
  2493.    pAdapterInfo->ai_product_family = HARPOON_FAMILY;
  2494.    pAdapterInfo->ai_HBAbustype = BUSTYPE_PCI;
  2495.    for (i=0;i<CARD_MODEL_NAMELEN;i++)
  2496.    {
  2497.       pAdapterInfo->ai_card_model[i]=' '; /* initialize the ai_card_model */
  2498.    }
  2499. if(pCurrNvRam){
  2500. pAdapterInfo->ai_card_model[0] = '9';
  2501. switch(pCurrNvRam->niModel & 0x0f){
  2502. case MODEL_LT:
  2503. pAdapterInfo->ai_card_model[1] = '3';
  2504. pAdapterInfo->ai_card_model[2] = '0';
  2505. break;
  2506. case MODEL_LW:
  2507. pAdapterInfo->ai_card_model[1] = '5';
  2508. pAdapterInfo->ai_card_model[2] = '0';
  2509. break;
  2510. case MODEL_DL:
  2511. pAdapterInfo->ai_card_model[1] = '3';
  2512. pAdapterInfo->ai_card_model[2] = '2';
  2513. break;
  2514. case MODEL_DW:
  2515. pAdapterInfo->ai_card_model[1] = '5';
  2516. pAdapterInfo->ai_card_model[2] = '2';
  2517. break;
  2518. }
  2519. }else{
  2520.    temp = utilEERead(ioport, (MODEL_NUMB_0/2));
  2521. pAdapterInfo->ai_card_model[0] = (u08bits)(temp >> 8);
  2522.    temp = utilEERead(ioport, (MODEL_NUMB_2/2));
  2523. pAdapterInfo->ai_card_model[1] = (u08bits)(temp & 0x00FF);
  2524.    pAdapterInfo->ai_card_model[2] = (u08bits)(temp >> 8);
  2525. }
  2526.    pAdapterInfo->ai_FiberProductType = 0;
  2527.    pAdapterInfo->ai_secondary_range = 0;
  2528.    for (i=0;i<WORLD_WIDE_NAMELEN;i++)
  2529.    {
  2530.       pAdapterInfo->ai_worldwidename[i]='';
  2531.    }
  2532.    for (i=0;i<VENDOR_NAMELEN;i++)
  2533.    {
  2534.       pAdapterInfo->ai_vendorstring[i]='';
  2535.    }
  2536.     pAdapterInfo->ai_vendorstring[0]='B';
  2537.     pAdapterInfo->ai_vendorstring[1]='U';
  2538.     pAdapterInfo->ai_vendorstring[2]='S';
  2539.     pAdapterInfo->ai_vendorstring[3]='L';
  2540.     pAdapterInfo->ai_vendorstring[4]='O';
  2541.     pAdapterInfo->ai_vendorstring[5]='G';
  2542.     pAdapterInfo->ai_vendorstring[6]='I';
  2543.     pAdapterInfo->ai_vendorstring[7]='C';
  2544. for (i=0;i<FAMILY_NAMELEN;i++)
  2545. {
  2546.    pAdapterInfo->ai_AdapterFamilyString[i]='';
  2547. }
  2548.     pAdapterInfo->ai_AdapterFamilyString[0]='F';
  2549.     pAdapterInfo->ai_AdapterFamilyString[1]='L';
  2550.     pAdapterInfo->ai_AdapterFamilyString[2]='A';
  2551.     pAdapterInfo->ai_AdapterFamilyString[3]='S';
  2552.     pAdapterInfo->ai_AdapterFamilyString[4]='H';
  2553.     pAdapterInfo->ai_AdapterFamilyString[5]='P';
  2554.     pAdapterInfo->ai_AdapterFamilyString[6]='O';
  2555.     pAdapterInfo->ai_AdapterFamilyString[7]='I';
  2556.     pAdapterInfo->ai_AdapterFamilyString[8]='N';
  2557.     pAdapterInfo->ai_AdapterFamilyString[9]='T';
  2558.    ARAM_ACCESS(ioport);
  2559.    for ( i = 0; i < 4; i++ ) {
  2560.       pAdapterInfo->ai_XlatInfo[i] =
  2561.          RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
  2562.       }
  2563. /* return with -1 if no sort, else return with
  2564.    logical card number sorted by BIOS (zero-based) */
  2565. pAdapterInfo->ai_relative_cardnum = 
  2566.       (u08bits)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1); 
  2567.    SGRAM_ACCESS(ioport);
  2568.    s_PhaseTbl[0] = phaseDataOut;
  2569.    s_PhaseTbl[1] = phaseDataIn;
  2570.    s_PhaseTbl[2] = phaseIllegal;
  2571.    s_PhaseTbl[3] = phaseIllegal;
  2572.    s_PhaseTbl[4] = phaseCommand;
  2573.    s_PhaseTbl[5] = phaseStatus;
  2574.    s_PhaseTbl[6] = phaseMsgOut;
  2575.    s_PhaseTbl[7] = phaseMsgIn;
  2576.    pAdapterInfo->ai_present = 0x01;
  2577. #if defined(BUGBUG)
  2578.    for (i = 0; i < MAX_CARDS; i++) {
  2579.       for (id=0; id<debug_size; id++)
  2580.          debug_int[i][id] =  (u08bits)0x00;
  2581.       debug_index[i] = 0;
  2582.       }
  2583. #endif
  2584.    return(0);
  2585. }
  2586. /*---------------------------------------------------------------------
  2587.  *
  2588.  * Function: init_adapter, exported to BUDI via UCBMgr_init_adapter entry
  2589.  *
  2590.  *
  2591.  * Description: Setup adapter for normal operation (hard reset).
  2592.  *
  2593.  *---------------------------------------------------------------------*/
  2594. STATIC CARD_HANDLE init_adapter(PADAPTER_INFO pCardInfo)
  2595. {
  2596.    PSCCBcard CurrCard;
  2597. PNVRamInfo pCurrNvRam;
  2598.    u08bits i,j,thisCard, ScamFlg;
  2599.    u16bits temp,sync_bit_map,id;
  2600.    BASE_PORT ioport;
  2601.    ioport = (BASE_PORT)pCardInfo->ai_baseaddr;
  2602.    for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
  2603.       if (thisCard == MAX_CARDS) {
  2604.          return(FAILURE);
  2605.          }
  2606.       if (BL_Card[thisCard].ioPort == ioport) {
  2607.          CurrCard = &BL_Card[thisCard];
  2608.          SccbMgrTableInitCard(CurrCard,thisCard);
  2609.          break;
  2610.          }
  2611.       else if (BL_Card[thisCard].ioPort == 0x00) {
  2612.          BL_Card[thisCard].ioPort = ioport;
  2613.          CurrCard = &BL_Card[thisCard];
  2614. if(mbCards)
  2615. for(i = 0; i < mbCards; i++){
  2616. if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
  2617. CurrCard->pNvRamInfo = &nvRamInfo[i];
  2618. }
  2619.          SccbMgrTableInitCard(CurrCard,thisCard);
  2620.          CurrCard->cardIndex = thisCard;
  2621.          CurrCard->cardInfo = pCardInfo;
  2622.          break;
  2623.          }
  2624.       }
  2625. pCurrNvRam = CurrCard->pNvRamInfo;
  2626.    
  2627. if(pCurrNvRam){
  2628. ScamFlg = pCurrNvRam->niScamConf;
  2629. }
  2630. else{
  2631.    ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
  2632. }
  2633.    BusMasterInit(ioport);
  2634.    XbowInit(ioport, ScamFlg);
  2635. #if defined (NO_BIOS_OPTION)
  2636.    if (DiagXbow(ioport)) return(FAILURE);
  2637.    if (DiagBusMaster(ioport)) return(FAILURE);
  2638. #endif  /* No BIOS Option */
  2639.    autoLoadDefaultMap(ioport);
  2640.    for (i = 0,id = 0x01; i != pCardInfo->ai_id; i++,id <<= 1){}
  2641.    WR_HARPOON(ioport+hp_selfid_0, id);
  2642.    WR_HARPOON(ioport+hp_selfid_1, 0x00);
  2643.    WR_HARPOON(ioport+hp_arb_id, pCardInfo->ai_id);
  2644.    CurrCard->ourId = (unsigned char) pCardInfo->ai_id;
  2645.    i = (u08bits) pCardInfo->ai_stateinfo;
  2646.    if (i & SCSI_PARITY_ENA)
  2647.        WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
  2648.    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
  2649.    if (i & LOW_BYTE_TERM_ENA)
  2650.       j |= SCSI_TERM_ENA_L;
  2651.    WR_HARPOON(ioport+hp_bm_ctrl, j);
  2652.    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
  2653.    if (i & HIGH_BYTE_TERM_ENA)
  2654.       j |= SCSI_TERM_ENA_H;
  2655.    WR_HARPOON(ioport+hp_ee_ctrl, j );
  2656.    if (!(pCardInfo->ai_stateinfo & NO_RESET_IN_INIT)) {
  2657.       sresb(ioport,thisCard);
  2658.          scini(thisCard, (u08bits) pCardInfo->ai_id, 0);
  2659.       }
  2660.    if (pCardInfo->ai_stateinfo & SUPRESS_UNDERRRUNS_ENA)
  2661.       CurrCard->globalFlags |= F_NO_FILTER;
  2662. if(pCurrNvRam){
  2663. if(pCurrNvRam->niSysConf & 0x10)
  2664. CurrCard->globalFlags |= F_GREEN_PC;
  2665. }
  2666. else{
  2667.    if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
  2668.        CurrCard->globalFlags |= F_GREEN_PC;
  2669. }
  2670. /* Set global flag to indicate Re-Negotiation to be done on all
  2671. ckeck condition */
  2672. if(pCurrNvRam){
  2673. if(pCurrNvRam->niScsiConf & 0x04)
  2674. CurrCard->globalFlags |= F_DO_RENEGO;
  2675. }
  2676. else{
  2677.    if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
  2678.        CurrCard->globalFlags |= F_DO_RENEGO;
  2679. }
  2680. if(pCurrNvRam){
  2681. if(pCurrNvRam->niScsiConf & 0x08)
  2682. CurrCard->globalFlags |= F_CONLUN_IO;
  2683. }
  2684. else{
  2685.    if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
  2686.        CurrCard->globalFlags |= F_CONLUN_IO;
  2687. }
  2688.    temp = pCardInfo->ai_per_targ_no_disc;
  2689.    for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
  2690.       if (temp & id)
  2691.          sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
  2692.       }
  2693.    sync_bit_map = 0x0001;
  2694.    for (id = 0; id < (MAX_SCSI_TAR/2); id++){
  2695. if(pCurrNvRam){
  2696. temp = (USHORT) pCurrNvRam->niSyncTbl[id];
  2697. temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
  2698.  (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
  2699. }else
  2700.       temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
  2701.       for (i = 0; i < 2; temp >>=8,i++){
  2702.          if (pCardInfo->ai_per_targ_init_sync & sync_bit_map){
  2703.             sccbMgrTbl[thisCard][id*2+i].TarEEValue = (u08bits)temp;
  2704.             }
  2705.          else {
  2706.             sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
  2707.             sccbMgrTbl[thisCard][id*2+i].TarEEValue =
  2708.                (u08bits)(temp & ~EE_SYNC_MASK);
  2709.             }
  2710. #if defined(WIDE_SCSI)
  2711. /*         if ((pCardInfo->ai_per_targ_wide_nego & sync_bit_map) ||
  2712.             (id*2+i >= 8)){
  2713. */
  2714.          if (pCardInfo->ai_per_targ_wide_nego & sync_bit_map){
  2715.             sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
  2716.             }
  2717.          else { /* NARROW SCSI */
  2718.             sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
  2719.             }
  2720. #else
  2721.          sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
  2722. #endif
  2723.          sync_bit_map <<= 1;
  2724.          }
  2725.       }
  2726.    pCardInfo->ai_SGListFormat=0x01;
  2727.    pCardInfo->ai_DataPtrFormat=0x01;
  2728.    pCardInfo->ai_AEN_mask &= SCSI_RESET_COMPLETE;
  2729.    WR_HARPOON((ioport+hp_semaphore),
  2730.       (u08bits)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
  2731.    return((u32bits)CurrCard);
  2732. }
  2733. /*---------------------------------------------------------------------
  2734.  *
  2735.  * Function: build_ucb, exported to BUDI via UCBMgr_build_ucb entry
  2736.  *
  2737.  * Description: prepare fw portion of ucb. do not start, resource not guaranteed
  2738.  *             so don't manipulate anything that's derived from states which
  2739.  *             may change
  2740.  *
  2741.  *---------------------------------------------------------------------*/
  2742. void build_UCB(CARD_HANDLE pCurrCard, PUCB p_ucb)
  2743. {
  2744.    u08bits thisCard;
  2745.    u08bits i,j;
  2746.    PSCCB p_sccb;
  2747.    thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
  2748.    p_sccb=(PSCCB)p_ucb->UCB_MgrPrivatePtr;
  2749.    p_sccb->Sccb_ucb_ptr=p_ucb;
  2750.    switch (p_ucb->UCB_opcode & (OPC_DEVICE_RESET+OPC_XFER_SG+OPC_CHK_RESIDUAL))
  2751.    {
  2752.       case OPC_DEVICE_RESET:
  2753.          p_sccb->OperationCode=RESET_COMMAND;
  2754.          break;
  2755.       case OPC_XFER_SG:
  2756.          p_sccb->OperationCode=SCATTER_GATHER_COMMAND;
  2757.          break;
  2758.       case OPC_XFER_SG+OPC_CHK_RESIDUAL:
  2759.          p_sccb->OperationCode=RESIDUAL_SG_COMMAND;
  2760.          break;
  2761.       case OPC_CHK_RESIDUAL:
  2762.       p_sccb->OperationCode=RESIDUAL_COMMAND;
  2763.       break;
  2764.       default:
  2765.       p_sccb->OperationCode=SCSI_INITIATOR_COMMAND;
  2766.       break;
  2767.    }
  2768.    if (p_ucb->UCB_opcode & OPC_TQ_ENABLE)
  2769.    {
  2770.       p_sccb->ControlByte = (u08bits)((p_ucb->UCB_opcode & OPC_TQ_MASK)>>2) | F_USE_CMD_Q;
  2771.    }
  2772.    else
  2773.    {
  2774.       p_sccb->ControlByte = 0;
  2775.    }
  2776.    p_sccb->CdbLength = (u08bits)p_ucb->UCB_cdblen;
  2777.    if (p_ucb->UCB_opcode & OPC_NO_AUTO_SENSE)
  2778.    {
  2779.       p_sccb->RequestSenseLength = 0;
  2780.    }
  2781.    else
  2782.    {
  2783.       p_sccb->RequestSenseLength = (unsigned char) p_ucb->UCB_senselen;
  2784.    }
  2785.    if (p_ucb->UCB_opcode & OPC_XFER_SG)
  2786.    {
  2787.       p_sccb->DataPointer=p_ucb->UCB_virt_dataptr;
  2788.       p_sccb->DataLength = (((u32bits)p_ucb->UCB_NumSgElements)<<3);
  2789.    }
  2790.    else
  2791.    {
  2792.       p_sccb->DataPointer=p_ucb->UCB_phys_dataptr;
  2793.       p_sccb->DataLength=p_ucb->UCB_datalen;
  2794.    };
  2795.    p_sccb->HostStatus=0;
  2796.    p_sccb->TargetStatus=0;
  2797.    p_sccb->TargID=(unsigned char)p_ucb->UCB_targid;
  2798.    p_sccb->Lun=(unsigned char) p_ucb->UCB_lun;
  2799.    p_sccb->SccbIOPort=((PSCCBcard)pCurrCard)->ioPort;
  2800.    j=p_ucb->UCB_cdblen;
  2801.    for (i=0;i<j;i++)
  2802.    {
  2803.       p_sccb->Cdb[i] = p_ucb->UCB_cdb[i];
  2804.    }
  2805.    p_sccb->SensePointer=p_ucb->UCB_phys_senseptr;
  2806.    sinits(p_sccb,thisCard);
  2807. }
  2808. #ifndef NO_IOCTLS
  2809. /*---------------------------------------------------------------------
  2810.  *
  2811.  * Function: GetDevSyncRate
  2812.  *
  2813.  *---------------------------------------------------------------------*/
  2814. STATIC  int GetDevSyncRate(PSCCBcard pCurrCard,PUCB p_ucb)
  2815. {
  2816. struct _SYNC_RATE_INFO * pSyncStr;
  2817.    PSCCBMgr_tar_info currTar_Info;
  2818. BASE_PORT ioport;
  2819. u08bits scsiID, j;
  2820. #if (FW_TYPE != _SCCB_MGR_)
  2821. if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
  2822. {
  2823. return(1);
  2824. }
  2825. #endif
  2826. ioport  = pCurrCard->ioPort;
  2827. pSyncStr = (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
  2828. scsiID = (u08bits) p_ucb->UCB_targid;
  2829.    currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
  2830. j = currTar_Info->TarSyncCtrl;
  2831. switch (currTar_Info->TarEEValue & EE_SYNC_MASK)
  2832. {
  2833. case EE_SYNC_ASYNC:
  2834. pSyncStr->RequestMegaXferRate = 0x00;
  2835. break;
  2836. case EE_SYNC_5MB:
  2837. pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
  2838. break;
  2839. case EE_SYNC_10MB:
  2840. pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
  2841. break;
  2842. case EE_SYNC_20MB:
  2843. pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
  2844. break;
  2845. }
  2846. switch ((j >> 5) & 0x07)
  2847. {
  2848. case 0x00:
  2849. if((j & 0x07) == 0x00)
  2850. {
  2851. pSyncStr->ActualMegaXferRate = 0x00; /* Async Mode */
  2852. }
  2853. else
  2854. {
  2855. pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
  2856. }
  2857. break;
  2858. case 0x01:
  2859. pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
  2860. break;
  2861. case 0x02:
  2862. pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 66 : 122;
  2863. break;
  2864. case 0x03:
  2865. pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
  2866. break;
  2867. case 0x04:
  2868. pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 40 : 80;
  2869. break;
  2870. case 0x05:
  2871. pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 33 : 66;
  2872. break;
  2873. case 0x06:
  2874. pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 28 : 56;
  2875. break;
  2876. case 0x07:
  2877. pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 25 : 50;
  2878. break;
  2879. }
  2880. pSyncStr->NegotiatedOffset = j & 0x0f;
  2881. return(0);
  2882. }
  2883. /*---------------------------------------------------------------------
  2884.  *
  2885.  * Function: SetDevSyncRate
  2886.  *
  2887.  *---------------------------------------------------------------------*/
  2888. STATIC int SetDevSyncRate(PSCCBcard pCurrCard, PUCB p_ucb)
  2889. {
  2890. struct _SYNC_RATE_INFO * pSyncStr;
  2891.    PSCCBMgr_tar_info currTar_Info;
  2892. BASE_PORT ioPort;
  2893. u08bits scsiID, i, j, syncVal;
  2894. u16bits syncOffset, actualXferRate;
  2895. union {
  2896. u08bits tempb[2];
  2897. u16bits tempw;
  2898. }temp2;
  2899. #if (FW_TYPE != _SCCB_MGR_)
  2900. if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
  2901. {
  2902. return(1);
  2903. }
  2904. #endif
  2905. ioPort  = pCurrCard->ioPort;
  2906. pSyncStr = (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
  2907. scsiID = (u08bits) p_ucb->UCB_targid;
  2908.    currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
  2909. i = RD_HARPOON(ioPort+hp_xfer_pad); /* Save current value */
  2910. WR_HARPOON(ioPort+hp_xfer_pad, (i | ID_UNLOCK));
  2911. WR_HARPOON(ioPort+hp_select_id, ((scsiID << 4) | scsiID));
  2912. j = RD_HARPOON(ioPort+hp_synctarg_0);
  2913. WR_HARPOON(ioPort+hp_xfer_pad, i); /* restore value */
  2914. actualXferRate = pSyncStr->ActualMegaXferRate;
  2915. if(!(j & NARROW_SCSI))
  2916. {
  2917. actualXferRate <<= 1;
  2918. }
  2919. if(actualXferRate == 0x00)
  2920. {
  2921. syncVal = EE_SYNC_ASYNC; /* Async Mode */
  2922. }
  2923. if(actualXferRate == 0x0200)
  2924. {
  2925. syncVal = EE_SYNC_20MB; /* 20/40 MB Mode */
  2926. }
  2927. if(actualXferRate > 0x0050 && actualXferRate < 0x0200 )
  2928. {
  2929. syncVal = EE_SYNC_10MB; /* 10/20 MB Mode */
  2930. }
  2931. else
  2932. {
  2933. syncVal = EE_SYNC_5MB; /* 5/10 MB Mode */
  2934. }
  2935. if(currTar_Info->TarEEValue && EE_SYNC_MASK == syncVal)
  2936. return(0);
  2937. currTar_Info->TarEEValue = (currTar_Info->TarEEValue & !EE_SYNC_MASK)
  2938. | syncVal;
  2939. syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
  2940. temp2.tempw = utilEERead(ioPort, syncOffset);
  2941. if(scsiID & 0x01)
  2942. {
  2943. temp2.tempb[0] = (temp2.tempb[0] & !EE_SYNC_MASK) | syncVal;
  2944. }
  2945. else
  2946. {
  2947. temp2.tempb[1] = (temp2.tempb[1] & !EE_SYNC_MASK) | syncVal;
  2948. }
  2949. utilEEWriteOnOff(ioPort, 1);
  2950. utilEEWrite(ioPort, temp2.tempw, syncOffset);
  2951. utilEEWriteOnOff(ioPort, 0);
  2952. UpdateCheckSum(ioPort);
  2953. return(0);
  2954. }
  2955. /*---------------------------------------------------------------------
  2956.  *
  2957.  * Function: GetDevWideMode
  2958.  *
  2959.  *---------------------------------------------------------------------*/
  2960. int GetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
  2961. {
  2962. u08bits *pData;
  2963. pData = (u08bits *)p_ucb->UCB_virt_dataptr;
  2964. if(sccbMgrTbl[pCurrCard->cardIndex][p_ucb->UCB_targid].TarEEValue
  2965. & EE_WIDE_SCSI)
  2966. {
  2967. *pData = 1;
  2968. }
  2969. else
  2970. {
  2971. *pData = 0;
  2972. }
  2973. return(0);
  2974. }
  2975. /*---------------------------------------------------------------------
  2976.  *
  2977.  * Function: SetDevWideMode
  2978.  *
  2979.  *---------------------------------------------------------------------*/
  2980. int SetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
  2981. {
  2982. u08bits *pData;
  2983.    PSCCBMgr_tar_info currTar_Info;
  2984. BASE_PORT ioPort;
  2985. u08bits scsiID, scsiWideMode;
  2986. u16bits syncOffset;
  2987. union {
  2988. u08bits tempb[2];
  2989. u16bits tempw;
  2990. }temp2;
  2991. #if (FW_TYPE != _SCCB_MGR_)
  2992. if( !(pCurrCard->cardInfo->ai_attributes & WIDE_CAPABLE) )
  2993. {
  2994. return(1);
  2995. }
  2996. if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
  2997. {
  2998. return(1);
  2999. }
  3000. #endif
  3001. ioPort  = pCurrCard->ioPort;
  3002. pData = (u08bits *)p_ucb->UCB_virt_dataptr;
  3003. scsiID = (u08bits) p_ucb->UCB_targid;
  3004. currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
  3005. if(*pData)
  3006. {
  3007. if(currTar_Info->TarEEValue & EE_WIDE_SCSI)
  3008. {
  3009. return(0);
  3010. }
  3011. else
  3012. {
  3013. scsiWideMode = EE_WIDE_SCSI;
  3014. }
  3015. }
  3016. else
  3017. {
  3018. if(!currTar_Info->TarEEValue & EE_WIDE_SCSI)
  3019. {
  3020. return(0);
  3021. }
  3022. else
  3023. {
  3024. scsiWideMode = 0;
  3025. }
  3026. }
  3027. currTar_Info->TarEEValue = (currTar_Info->TarEEValue & !EE_WIDE_SCSI)
  3028. | scsiWideMode;
  3029. syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
  3030. temp2.tempw = utilEERead(ioPort, syncOffset);
  3031. if(scsiID & 0x01)
  3032. {
  3033. temp2.tempb[0] = (temp2.tempb[0] & !EE_WIDE_SCSI) | scsiWideMode;
  3034. }
  3035. else
  3036. {
  3037. temp2.tempb[1] = (temp2.tempb[1] & !EE_WIDE_SCSI) | scsiWideMode;
  3038. }
  3039. utilEEWriteOnOff(ioPort, 1);
  3040. utilEEWrite(ioPort, temp2.tempw, syncOffset);
  3041. utilEEWriteOnOff(ioPort, 0);
  3042. UpdateCheckSum(ioPort);
  3043. return(0);
  3044. }
  3045. /*---------------------------------------------------------------------
  3046.  *
  3047.  * Function: ReadNVRam
  3048.  *
  3049.  *---------------------------------------------------------------------*/
  3050. void ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
  3051. {
  3052. u08bits *pdata;
  3053. u16bits i,numwrds,numbytes,offset,temp;
  3054. u08bits OneMore = FALSE;
  3055. #if defined(DOS)
  3056. u16bits ioport;
  3057. #else
  3058. u32bits ioport;
  3059. #endif
  3060. numbytes = (u16bits) p_ucb->UCB_datalen;
  3061. ioport  = pCurrCard->ioPort;
  3062.    pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
  3063. offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
  3064.    if (offset & 0x1)
  3065. {
  3066.     *((u16bits*) pdata) = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
  3067.  *pdata = *(pdata + 1);
  3068.  ++offset;
  3069.      ++pdata;
  3070.  --numbytes;
  3071. }
  3072. numwrds = numbytes / 2;
  3073. if (numbytes & 1)
  3074.   OneMore = TRUE;
  3075. for (i = 0; i < numwrds; i++)
  3076. {
  3077.     *((u16bits*) pdata) = utilEERead(ioport,(u16bits)(offset / 2));
  3078. pdata += 2;
  3079. offset += 2;
  3080.    }
  3081. if (OneMore)
  3082. {
  3083. --pdata;
  3084. -- offset;
  3085.     temp = utilEERead(ioport,(u16bits)(offset / 2));
  3086. *pdata = (u08bits) (temp);
  3087. }
  3088. } /* end proc ReadNVRam */
  3089. /*---------------------------------------------------------------------
  3090.  *
  3091.  * Function: WriteNVRam
  3092.  *
  3093.  *---------------------------------------------------------------------*/
  3094. void WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
  3095. {
  3096. u08bits *pdata;
  3097. u16bits i,numwrds,numbytes,offset, eeprom_end;
  3098. u08bits OneMore = FALSE;
  3099. union {
  3100. u08bits  tempb[2];
  3101. u16bits  tempw;
  3102. } temp2;
  3103. #if defined(DOS)
  3104. u16bits ioport;
  3105. #else
  3106. u32bits ioport;
  3107. #endif
  3108. numbytes = (u16bits) p_ucb->UCB_datalen;
  3109. ioport  = pCurrCard->ioPort;
  3110.    pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
  3111. offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
  3112.    if (RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD)
  3113.       eeprom_end = 512;
  3114.    else
  3115.       eeprom_end = 768;
  3116. if(offset > eeprom_end)
  3117. return;
  3118. if((offset + numbytes) > eeprom_end)
  3119. numbytes = eeprom_end - offset;
  3120.     utilEEWriteOnOff(ioport,1);   /* Enable write access to the EEPROM */
  3121.    if (offset & 0x1)
  3122. {
  3123.     temp2.tempw = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
  3124.  temp2.tempb[1] = *pdata;
  3125.     utilEEWrite(ioport, temp2.tempw, (u16bits)((offset -1) / 2));
  3126.  *pdata = *(pdata + 1);
  3127.  ++offset;
  3128.      ++pdata;
  3129.  --numbytes;
  3130. }
  3131. numwrds = numbytes / 2;
  3132. if (numbytes & 1)
  3133.   OneMore = TRUE;
  3134. for (i = 0; i < numwrds; i++)
  3135. {
  3136.     utilEEWrite(ioport, *((pu16bits)pdata),(u16bits)(offset / 2));
  3137. pdata += 2;
  3138. offset += 2;
  3139.    }
  3140. if (OneMore)
  3141. {
  3142.     temp2.tempw = utilEERead(ioport,(u16bits)(offset / 2));
  3143. temp2.tempb[0] = *pdata;
  3144.     utilEEWrite(ioport, temp2.tempw, (u16bits)(offset / 2));
  3145. }
  3146.    utilEEWriteOnOff(ioport,0);   /* Turn off write access */
  3147.    UpdateCheckSum((u32bits)ioport);
  3148. } /* end proc WriteNVRam */
  3149. /*---------------------------------------------------------------------
  3150.  *
  3151.  * Function: UpdateCheckSum
  3152.  *
  3153.  * Description: Update Check Sum in EEPROM
  3154.  *
  3155.  *---------------------------------------------------------------------*/
  3156. void UpdateCheckSum(u32bits baseport)
  3157. {
  3158. USHORT i,sum_data, eeprom_end;
  3159. sum_data = 0x0000;
  3160.    if (RD_HARPOON(baseport+hp_page_ctrl) & NARROW_SCSI_CARD)
  3161.       eeprom_end = 512;
  3162.    else
  3163.       eeprom_end = 768;
  3164. for (i = 1; i < eeprom_end/2; i++)
  3165. {
  3166. sum_data += utilEERead(baseport, i);
  3167. }
  3168.    utilEEWriteOnOff(baseport,1);   /* Enable write access to the EEPROM */
  3169.    utilEEWrite(baseport, sum_data, EEPROM_CHECK_SUM/2);
  3170.    utilEEWriteOnOff(baseport,0);   /* Turn off write access */
  3171. }
  3172. void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo)
  3173. {
  3174. }
  3175. void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard)
  3176. {
  3177. }
  3178. void SccbMgr_restore_native_state(CARD_HANDLE pCurrCard)
  3179. {
  3180. }
  3181. #endif /* NO_IOCTLS */