1 /*
2 
3   FlashPoint.c -- FlashPoint SCCB Manager for Linux
4 
5   This file contains the FlashPoint SCCB Manager from BusLogic's FlashPoint
6   Driver Developer's Kit, with minor modifications by Leonard N. Zubkoff for
7   Linux compatibility.  It was provided by BusLogic in the form of 16 separate
8   source files, which would have unnecessarily cluttered the scsi directory, so
9   the individual files have been combined into this single file.
10 
11   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
12 
13   This file is available under both the GNU General Public License
14   and a BSD-style copyright; see LICENSE.FlashPoint for details.
15 
16 */
17 
18 
19 #include <linux/config.h>
20 
21 
22 #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
23 
24 
25 #define UNIX
26 #define FW_TYPE		_SCCB_MGR_
27 #define MAX_CARDS	8
28 #undef BUSTYPE_PCI
29 
30 
31 #define OS_InPortByte(port)		inb(port)
32 #define OS_InPortWord(port)		inw(port)
33 #define OS_InPortLong(port)		inl(port)
34 #define OS_OutPortByte(port, value)	outb(value, port)
35 #define OS_OutPortWord(port, value)	outw(value, port)
36 #define OS_OutPortLong(port, value)	outl(value, port)
37 #define OS_Lock(x)
38 #define OS_UnLock(x)
39 
40 
41 /*
42   Define name replacements for compatibility with the Linux BusLogic Driver.
43 */
44 
45 #define SccbMgr_sense_adapter		FlashPoint_ProbeHostAdapter
46 #define SccbMgr_config_adapter		FlashPoint_HardwareResetHostAdapter
47 #define SccbMgr_unload_card		FlashPoint_ReleaseHostAdapter
48 #define SccbMgr_start_sccb		FlashPoint_StartCCB
49 #define SccbMgr_abort_sccb		FlashPoint_AbortCCB
50 #define SccbMgr_my_int			FlashPoint_InterruptPending
51 #define SccbMgr_isr			FlashPoint_HandleInterrupt
52 
53 
54 /*
55   Define name replacements to avoid kernel namespace pollution.
56 */
57 
58 #define BL_Card				FPT_BL_Card
59 #define BusMasterInit			FPT_BusMasterInit
60 #define CalcCrc16			FPT_CalcCrc16
61 #define CalcLrc				FPT_CalcLrc
62 #define ChkIfChipInitialized		FPT_ChkIfChipInitialized
63 #define DiagBusMaster			FPT_DiagBusMaster
64 #define DiagEEPROM			FPT_DiagEEPROM
65 #define DiagXbow			FPT_DiagXbow
66 #define GetTarLun			FPT_GetTarLun
67 #define RNVRamData			FPT_RNVRamData
68 #define RdStack				FPT_RdStack
69 #define SccbMgrTableInitAll		FPT_SccbMgrTableInitAll
70 #define SccbMgrTableInitCard		FPT_SccbMgrTableInitCard
71 #define SccbMgrTableInitTarget		FPT_SccbMgrTableInitTarget
72 #define SccbMgr_bad_isr			FPT_SccbMgr_bad_isr
73 #define SccbMgr_scsi_reset		FPT_SccbMgr_scsi_reset
74 #define SccbMgr_timer_expired		FPT_SccbMgr_timer_expired
75 #define SendMsg				FPT_SendMsg
76 #define Wait				FPT_Wait
77 #define Wait1Second			FPT_Wait1Second
78 #define WrStack				FPT_WrStack
79 #define XbowInit			FPT_XbowInit
80 #define autoCmdCmplt			FPT_autoCmdCmplt
81 #define autoLoadDefaultMap		FPT_autoLoadDefaultMap
82 #define busMstrDataXferStart		FPT_busMstrDataXferStart
83 #define busMstrSGDataXferStart		FPT_busMstrSGDataXferStart
84 #define busMstrTimeOut			FPT_busMstrTimeOut
85 #define dataXferProcessor		FPT_dataXferProcessor
86 #define default_intena			FPT_default_intena
87 #define hostDataXferAbort		FPT_hostDataXferAbort
88 #define hostDataXferRestart		FPT_hostDataXferRestart
89 #define inisci				FPT_inisci
90 #define mbCards				FPT_mbCards
91 #define nvRamInfo			FPT_nvRamInfo
92 #define phaseBusFree			FPT_phaseBusFree
93 #define phaseChkFifo			FPT_phaseChkFifo
94 #define phaseCommand			FPT_phaseCommand
95 #define phaseDataIn			FPT_phaseDataIn
96 #define phaseDataOut			FPT_phaseDataOut
97 #define phaseDecode			FPT_phaseDecode
98 #define phaseIllegal			FPT_phaseIllegal
99 #define phaseMsgIn			FPT_phaseMsgIn
100 #define phaseMsgOut			FPT_phaseMsgOut
101 #define phaseStatus			FPT_phaseStatus
102 #define queueAddSccb			FPT_queueAddSccb
103 #define queueCmdComplete		FPT_queueCmdComplete
104 #define queueDisconnect			FPT_queueDisconnect
105 #define queueFindSccb			FPT_queueFindSccb
106 #define queueFlushSccb			FPT_queueFlushSccb
107 #define queueFlushTargSccb		FPT_queueFlushTargSccb
108 #define queueSearchSelect		FPT_queueSearchSelect
109 #define queueSelectFail			FPT_queueSelectFail
110 #define s_PhaseTbl			FPT_s_PhaseTbl
111 #define scamHAString			FPT_scamHAString
112 #define scamInfo			FPT_scamInfo
113 #define scarb				FPT_scarb
114 #define scasid				FPT_scasid
115 #define scbusf				FPT_scbusf
116 #define sccbMgrTbl			FPT_sccbMgrTbl
117 #define schkdd				FPT_schkdd
118 #define scini				FPT_scini
119 #define sciso				FPT_sciso
120 #define scmachid			FPT_scmachid
121 #define scsavdi				FPT_scsavdi
122 #define scsel				FPT_scsel
123 #define scsell				FPT_scsell
124 #define scsendi				FPT_scsendi
125 #define scvalq				FPT_scvalq
126 #define scwirod				FPT_scwirod
127 #define scwiros				FPT_scwiros
128 #define scwtsel				FPT_scwtsel
129 #define scxferc				FPT_scxferc
130 #define sdecm				FPT_sdecm
131 #define sfm				FPT_sfm
132 #define shandem				FPT_shandem
133 #define sinits				FPT_sinits
134 #define sisyncn				FPT_sisyncn
135 #define sisyncr				FPT_sisyncr
136 #define siwidn				FPT_siwidn
137 #define siwidr				FPT_siwidr
138 #define sres				FPT_sres
139 #define sresb				FPT_sresb
140 #define ssel				FPT_ssel
141 #define ssenss				FPT_ssenss
142 #define sssyncv				FPT_sssyncv
143 #define stsyncn				FPT_stsyncn
144 #define stwidn				FPT_stwidn
145 #define sxfrp				FPT_sxfrp
146 #define utilEERead			FPT_utilEERead
147 #define utilEEReadOrg			FPT_utilEEReadOrg
148 #define utilEESendCmdAddr		FPT_utilEESendCmdAddr
149 #define utilEEWrite			FPT_utilEEWrite
150 #define utilEEWriteOnOff		FPT_utilEEWriteOnOff
151 #define utilUpdateResidual		FPT_utilUpdateResidual
152 
153 
154 /*----------------------------------------------------------------------
155  *
156  *
157  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
158  *
159  *   This file is available under both the GNU General Public License
160  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
161  *
162  *   $Workfile:   globals.h  $
163  *
164  *   Description:  Common shared global defines.
165  *
166  *   $Date: 1996/09/04 01:26:13 $
167  *
168  *   $Revision: 1.11 $
169  *
170  *----------------------------------------------------------------------*/
171 #ifndef __GLOBALS_H__
172 #define __GLOBALS_H__
173 
174 #define _UCB_MGR_  1
175 #define _SCCB_MGR_ 2
176 
177 /*#include <osflags.h>*/
178 
179 #define MAX_CDBLEN  12
180 
181 #define SCAM_LEV_2	1
182 
183 #define CRCMASK	0xA001
184 
185 /*  In your osflags.h file, please ENSURE that only ONE OS FLAG
186     is on at a time !!! Also, please make sure you turn set the
187  	 variable FW_TYPE to either _UCB_MGR_ or _SCCB_MGR_  !!! */
188 
189 #if defined(DOS) || defined(WIN95_16) || defined(OS2) || defined(OTHER_16)
190    #define       COMPILER_16_BIT 1
191 #elif defined(NETWARE) || defined(NT) || defined(WIN95_32) || defined(UNIX) || defined(OTHER_32) || defined(SOLARIS_REAL_MODE)
192    #define       COMPILER_32_BIT 1
193 #endif
194 
195 
196 #define     BL_VENDOR_ID      0x104B
197 #define     FP_DEVICE_ID      0x8130
198 #define     MM_DEVICE_ID      0x1040
199 
200 
201 #ifndef FALSE
202 #define FALSE           0
203 #endif
204 #ifndef TRUE
205 #define TRUE            (!(FALSE))
206 #endif
207 
208 #ifndef NULL
209 #define NULL            0
210 #endif
211 
212 #define FAILURE         0xFFFFFFFFL
213 
214 
215 typedef unsigned char   UCHAR;
216 typedef unsigned short  USHORT;
217 typedef unsigned int    UINT;
218 typedef unsigned long   ULONG;
219 typedef unsigned char * PUCHAR;
220 typedef unsigned short* PUSHORT;
221 typedef unsigned long * PULONG;
222 typedef void *          PVOID;
223 
224 
225 #if defined(COMPILER_16_BIT)
226 typedef unsigned char far       * uchar_ptr;
227 typedef unsigned short far      * ushort_ptr;
228 typedef unsigned long far       * ulong_ptr;
229 #endif  /* 16_BIT_COMPILER */
230 
231 #if defined(COMPILER_32_BIT)
232 typedef unsigned char           * uchar_ptr;
233 typedef unsigned short          * ushort_ptr;
234 typedef unsigned long           * ulong_ptr;
235 #endif  /* 32_BIT_COMPILER */
236 
237 
238 /*	 			NEW TYPE DEFINITIONS (shared with Mylex North)
239 
240 **  Use following type defines to avoid confusion in 16 and 32-bit
241 **  environments.  Avoid using 'int' as it denotes 16 bits in 16-bit
242 **  environment and 32 in 32-bit environments.
243 
244 */
245 
246 #define s08bits	char
247 #define s16bits 	short
248 #define s32bits	long
249 
250 #define u08bits	unsigned s08bits
251 #define u16bits	unsigned s16bits
252 #define u32bits	unsigned s32bits
253 
254 #if defined(COMPILER_16_BIT)
255 
256 typedef u08bits far 	* pu08bits;
257 typedef u16bits far 	* pu16bits;
258 typedef u32bits far	* pu32bits;
259 
260 #endif	/* COMPILER_16_BIT */
261 
262 #if defined(COMPILER_32_BIT)
263 
264 typedef u08bits 	* pu08bits;
265 typedef u16bits 	* pu16bits;
266 typedef u32bits 	* pu32bits;
267 
268 #endif	/* COMPILER_32_BIT */
269 
270 
271 #define BIT(x)          ((UCHAR)(1<<(x)))    /* single-bit mask in bit position x */
272 #define BITW(x)          ((USHORT)(1<<(x)))  /* single-bit mask in bit position x */
273 
274 
275 
276 #if defined(DOS)
277 /*#include <dos.h>*/
278 	#undef inportb          /* undefine for Borland Lib */
279 	#undef inport           /* they may have define I/O function in LIB */
280 	#undef outportb
281 	#undef outport
282 
283 	#define OS_InPortByte(ioport) 		inportb(ioport)
284 	#define OS_InPortWord(ioport) 		inport(ioport)
285 	#define OS_InPortLong(ioport)			inportq(ioport, val)
286 	#define OS_OutPortByte(ioport, val) outportb(ioport, val)
287 	#define OS_OutPortWord(ioport, val)	outport(ioport, val)
288 	#define OS_OutPortLong(ioport)		outportq(ioport, val)
289 #endif	/* DOS */
290 
291 #if defined(NETWARE) || defined(OTHER_32) ||  defined(OTHER_16)
292 	extern u08bits	OS_InPortByte(u32bits ioport);
293 	extern u16bits	OS_InPortWord(u32bits ioport);
294 	extern u32bits	OS_InPortLong(u32bits ioport);
295 
296 	extern OS_InPortByteBuffer(u32bits ioport, pu08bits buffer, u32bits count);
297 	extern OS_InPortWordBuffer(u32bits ioport, pu16bits buffer, u32bits count);
298 	extern OS_OutPortByte(u32bits ioport, u08bits val);
299 	extern OS_OutPortWord(u32bits ioport, u16bits val);
300 	extern OS_OutPortLong(u32bits ioport, u32bits val);
301 	extern OS_OutPortByteBuffer(u32bits ioport, pu08bits buffer, u32bits count);
302 	extern OS_OutPortWordBuffer(u32bits ioport, pu16bits buffer, u32bits count);
303 #endif	/* NETWARE || OTHER_32 || OTHER_16 */
304 
305 #if defined (NT) || defined(WIN95_32) || defined(WIN95_16)
306 	#if defined(NT)
307 
308 		extern __declspec(dllimport) u08bits ScsiPortReadPortUchar(pu08bits ioport);
309 		extern __declspec(dllimport) u16bits ScsiPortReadPortUshort(pu16bits ioport);
310 		extern __declspec(dllimport) u32bits ScsiPortReadPortUlong(pu32bits ioport);
311 		extern __declspec(dllimport) void ScsiPortWritePortUchar(pu08bits ioport, u08bits val);
312 		extern __declspec(dllimport) void ScsiPortWritePortUshort(pu16bits port, u16bits val);
313 		extern __declspec(dllimport) void ScsiPortWritePortUlong(pu32bits port, u32bits val);
314 
315 	#else
316 
317 		extern u08bits ScsiPortReadPortUchar(pu08bits ioport);
318 		extern u16bits ScsiPortReadPortUshort(pu16bits ioport);
319 		extern u32bits ScsiPortReadPortUlong(pu32bits ioport);
320 		extern void ScsiPortWritePortUchar(pu08bits ioport, u08bits val);
321 		extern void ScsiPortWritePortUshort(pu16bits port, u16bits val);
322 		extern void ScsiPortWritePortUlong(pu32bits port, u32bits val);
323 	#endif
324 
325 
326 	#define OS_InPortByte(ioport) ScsiPortReadPortUchar((pu08bits) ioport)
327 	#define OS_InPortWord(ioport) ScsiPortReadPortUshort((pu16bits) ioport)
328 	#define OS_InPortLong(ioport) ScsiPortReadPortUlong((pu32bits) ioport)
329 
330 	#define OS_OutPortByte(ioport, val) ScsiPortWritePortUchar((pu08bits) ioport, (u08bits) val)
331 	#define OS_OutPortWord(ioport, val) ScsiPortWritePortUshort((pu16bits) ioport, (u16bits) val)
332 	#define OS_OutPortLong(ioport, val) ScsiPortWritePortUlong((pu32bits) ioport, (u32bits) val)
333 	#define OS_OutPortByteBuffer(ioport, buffer, count) \
334 		ScsiPortWritePortBufferUchar((pu08bits)&port, (pu08bits) buffer, (u32bits) count)
335 	#define OS_OutPortWordBuffer(ioport, buffer, count) \
336 		ScsiPortWritePortBufferUshort((pu16bits)&port, (pu16bits) buffer, (u32bits) count)
337 
338 	#define OS_Lock(x)
339 	#define OS_UnLock(x)
340 #endif /* NT || WIN95_32 || WIN95_16 */
341 
342 #if defined (UNIX) && !defined(OS_InPortByte)
343 	#define OS_InPortByte(ioport)    inb((u16bits)ioport)
344 	#define OS_InPortWord(ioport)    inw((u16bits)ioport)
345 	#define OS_InPortLong(ioport)    inl((u16bits)ioport)
346 	#define OS_OutPortByte(ioport,val)  outb((u16bits)ioport, (u08bits)val)
347 	#define OS_OutPortWord(ioport,val)  outw((u16bits)ioport, (u16bits)val)
348 	#define OS_OutPortLong(ioport,val)  outl((u16bits)ioport, (u32bits)val)
349 
350 	#define OS_Lock(x)
351 	#define OS_UnLock(x)
352 #endif /* UNIX */
353 
354 
355 #if defined(OS2)
356 	extern u08bits	inb(u32bits ioport);
357 	extern u16bits	inw(u32bits ioport);
358 	extern void	outb(u32bits ioport, u08bits val);
359 	extern void	outw(u32bits ioport, u16bits val);
360 
361 	#define OS_InPortByte(ioport)			inb(ioport)
362 	#define OS_InPortWord(ioport)			inw(ioport)
363 	#define OS_OutPortByte(ioport, val)	outb(ioport, val)
364 	#define OS_OutPortWord(ioport, val)	outw(ioport, val)
365 	extern u32bits	OS_InPortLong(u32bits ioport);
366 	extern void	OS_OutPortLong(u32bits ioport, u32bits val);
367 
368 	#define OS_Lock(x)
369 	#define OS_UnLock(x)
370 #endif /* OS2 */
371 
372 #if defined(SOLARIS_REAL_MODE)
373 
374 extern unsigned char    inb(unsigned long ioport);
375 extern unsigned short   inw(unsigned long ioport);
376 
377 #define OS_InPortByte(ioport)    inb(ioport)
378 #define OS_InPortWord(ioport)    inw(ioport)
379 
380 extern void OS_OutPortByte(unsigned long ioport, unsigned char val);
381 extern void OS_OutPortWord(unsigned long ioport, unsigned short val);
382 extern unsigned long  OS_InPortLong(unsigned long ioport);
383 extern void     OS_OutPortLong(unsigned long ioport, unsigned long val);
384 
385 #define OS_Lock(x)
386 #define OS_UnLock(x)
387 
388 #endif  /* SOLARIS_REAL_MODE */
389 
390 #endif  /* __GLOBALS_H__ */
391 
392 /*----------------------------------------------------------------------
393  *
394  *
395  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
396  *
397  *   This file is available under both the GNU General Public License
398  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
399  *
400  *   $Workfile:   sccbmgr.h  $
401  *
402  *   Description:  Common shared SCCB Interface defines and SCCB
403  *						 Manager specifics defines.
404  *
405  *   $Date: 1996/10/24 23:09:33 $
406  *
407  *   $Revision: 1.14 $
408  *
409  *----------------------------------------------------------------------*/
410 
411 #ifndef __SCCB_H__
412 #define __SCCB_H__
413 
414 /*#include <osflags.h>*/
415 /*#include <globals.h>*/
416 
417 #if defined(BUGBUG)
418 #define debug_size 32
419 #endif
420 
421 #if defined(DOS)
422 
423    typedef struct _SCCB near *PSCCB;
424 	#if (FW_TYPE == _SCCB_MGR_)
425    	typedef void (*CALL_BK_FN)(PSCCB);
426 	#endif
427 
428 #elif defined(OS2)
429 
430    typedef struct _SCCB far *PSCCB;
431 	#if (FW_TYPE == _SCCB_MGR_)
432    	typedef void (far *CALL_BK_FN)(PSCCB);
433 	#endif
434 
435 #else
436 
437    typedef struct _SCCB *PSCCB;
438 	#if (FW_TYPE == _SCCB_MGR_)
439    	typedef void (*CALL_BK_FN)(PSCCB);
440 	#endif
441 
442 #endif
443 
444 
445 typedef struct SCCBMgr_info {
446    ULONG    si_baseaddr;
447    UCHAR    si_present;
448    UCHAR    si_intvect;
449    UCHAR    si_id;
450    UCHAR    si_lun;
451    USHORT   si_fw_revision;
452    USHORT   si_per_targ_init_sync;
453    USHORT   si_per_targ_fast_nego;
454    USHORT   si_per_targ_ultra_nego;
455    USHORT   si_per_targ_no_disc;
456    USHORT   si_per_targ_wide_nego;
457    USHORT   si_flags;
458    UCHAR    si_card_family;
459    UCHAR    si_bustype;
460    UCHAR    si_card_model[3];
461    UCHAR    si_relative_cardnum;
462    UCHAR    si_reserved[4];
463    ULONG    si_OS_reserved;
464    UCHAR    si_XlatInfo[4];
465    ULONG    si_reserved2[5];
466    ULONG    si_secondary_range;
467 } SCCBMGR_INFO;
468 
469 #if defined(DOS)
470    typedef SCCBMGR_INFO *      PSCCBMGR_INFO;
471 #else
472    #if defined (COMPILER_16_BIT)
473    typedef SCCBMGR_INFO far *  PSCCBMGR_INFO;
474    #else
475    typedef SCCBMGR_INFO *      PSCCBMGR_INFO;
476    #endif
477 #endif // defined(DOS)
478 
479 
480 
481 
482 #if (FW_TYPE==_SCCB_MGR_)
483 	#define SCSI_PARITY_ENA		  0x0001
484 	#define LOW_BYTE_TERM		  0x0010
485 	#define HIGH_BYTE_TERM		  0x0020
486 	#define BUSTYPE_PCI	  0x3
487 #endif
488 
489 #define SUPPORT_16TAR_32LUN	  0x0002
490 #define SOFT_RESET		  0x0004
491 #define EXTENDED_TRANSLATION	  0x0008
492 #define POST_ALL_UNDERRRUNS	  0x0040
493 #define FLAG_SCAM_ENABLED	  0x0080
494 #define FLAG_SCAM_LEVEL2	  0x0100
495 
496 
497 
498 
499 #define HARPOON_FAMILY        0x02
500 
501 
502 #define ISA_BUS_CARD          0x01
503 #define EISA_BUS_CARD         0x02
504 #define PCI_BUS_CARD          0x03
505 #define VESA_BUS_CARD         0x04
506 
507 /* SCCB struc used for both SCCB and UCB manager compiles!
508  * The UCB Manager treats the SCCB as it's 'native hardware structure'
509  */
510 
511 
512 #pragma pack(1)
513 typedef struct _SCCB {
514    UCHAR OperationCode;
515    UCHAR ControlByte;
516    UCHAR CdbLength;
517    UCHAR RequestSenseLength;
518    ULONG DataLength;
519    ULONG DataPointer;
520    UCHAR CcbRes[2];
521    UCHAR HostStatus;
522    UCHAR TargetStatus;
523    UCHAR TargID;
524    UCHAR Lun;
525    UCHAR Cdb[12];
526    UCHAR CcbRes1;
527    UCHAR Reserved1;
528    ULONG Reserved2;
529    ULONG SensePointer;
530 
531 
532    CALL_BK_FN SccbCallback;                  /* VOID (*SccbCallback)(); */
533    ULONG  SccbIOPort;                        /* Identifies board base port */
534    UCHAR  SccbStatus;
535    UCHAR  SCCBRes2;
536    USHORT SccbOSFlags;
537 
538 
539    ULONG   Sccb_XferCnt;            /* actual transfer count */
540    ULONG   Sccb_ATC;
541    ULONG   SccbVirtDataPtr;         /* virtual addr for OS/2 */
542    ULONG   Sccb_res1;
543    USHORT  Sccb_MGRFlags;
544    USHORT  Sccb_sgseg;
545    UCHAR   Sccb_scsimsg;            /* identify msg for selection */
546    UCHAR   Sccb_tag;
547    UCHAR   Sccb_scsistat;
548    UCHAR   Sccb_idmsg;              /* image of last msg in */
549    PSCCB   Sccb_forwardlink;
550    PSCCB   Sccb_backlink;
551    ULONG   Sccb_savedATC;
552    UCHAR   Save_Cdb[6];
553    UCHAR   Save_CdbLen;
554    UCHAR   Sccb_XferState;
555    ULONG   Sccb_SGoffset;
556 #if (FW_TYPE == _UCB_MGR_)
557    PUCB    Sccb_ucb_ptr;
558 #endif
559    } SCCB;
560 
561 #define SCCB_SIZE sizeof(SCCB)
562 
563 #pragma pack()
564 
565 
566 
567 #define SCSI_INITIATOR_COMMAND    0x00
568 #define TARGET_MODE_COMMAND       0x01
569 #define SCATTER_GATHER_COMMAND    0x02
570 #define RESIDUAL_COMMAND          0x03
571 #define RESIDUAL_SG_COMMAND       0x04
572 #define RESET_COMMAND             0x81
573 
574 
575 #define F_USE_CMD_Q              0x20     /*Inidcates TAGGED command. */
576 #define TAG_TYPE_MASK            0xC0     /*Type of tag msg to send. */
577 #define TAG_Q_MASK               0xE0
578 #define SCCB_DATA_XFER_OUT       0x10     /* Write */
579 #define SCCB_DATA_XFER_IN        0x08     /* Read */
580 
581 
582 #define FOURTEEN_BYTES           0x00     /* Request Sense Buffer size */
583 #define NO_AUTO_REQUEST_SENSE    0x01     /* No Request Sense Buffer */
584 
585 
586 #define BUS_FREE_ST     0
587 #define SELECT_ST       1
588 #define SELECT_BDR_ST   2     /* Select w\ Bus Device Reset */
589 #define SELECT_SN_ST    3     /* Select w\ Sync Nego */
590 #define SELECT_WN_ST    4     /* Select w\ Wide Data Nego */
591 #define SELECT_Q_ST     5     /* Select w\ Tagged Q'ing */
592 #define COMMAND_ST      6
593 #define DATA_OUT_ST     7
594 #define DATA_IN_ST      8
595 #define DISCONNECT_ST   9
596 #define STATUS_ST       10
597 #define ABORT_ST        11
598 #define MESSAGE_ST      12
599 
600 
601 #define F_HOST_XFER_DIR                0x01
602 #define F_ALL_XFERRED                  0x02
603 #define F_SG_XFER                      0x04
604 #define F_AUTO_SENSE                   0x08
605 #define F_ODD_BALL_CNT                 0x10
606 #define F_NO_DATA_YET                  0x80
607 
608 
609 #define F_STATUSLOADED                 0x01
610 #define F_MSGLOADED                    0x02
611 #define F_DEV_SELECTED                 0x04
612 
613 
614 #define SCCB_COMPLETE               0x00  /* SCCB completed without error */
615 #define SCCB_DATA_UNDER_RUN         0x0C
616 #define SCCB_SELECTION_TIMEOUT      0x11  /* Set SCSI selection timed out */
617 #define SCCB_DATA_OVER_RUN          0x12
618 #define SCCB_UNEXPECTED_BUS_FREE    0x13  /* Target dropped SCSI BSY */
619 #define SCCB_PHASE_SEQUENCE_FAIL    0x14  /* Target bus phase sequence failure */
620 
621 #define SCCB_INVALID_OP_CODE        0x16  /* SCCB invalid operation code */
622 #define SCCB_INVALID_SCCB           0x1A  /* Invalid SCCB - bad parameter */
623 #define SCCB_GROSS_FW_ERR           0x27  /* Major problem! */
624 #define SCCB_BM_ERR                 0x30  /* BusMaster error. */
625 #define SCCB_PARITY_ERR             0x34  /* SCSI parity error */
626 
627 
628 
629 #if (FW_TYPE==_UCB_MGR_)
630    #define  HBA_AUTO_SENSE_FAIL        0x1B
631    #define  HBA_TQ_REJECTED            0x1C
632    #define  HBA_UNSUPPORTED_MSG         0x1D
633    #define  HBA_HW_ERROR               0x20
634    #define  HBA_ATN_NOT_RESPONDED      0x21
635    #define  HBA_SCSI_RESET_BY_ADAPTER  0x22
636    #define  HBA_SCSI_RESET_BY_TARGET   0x23
637    #define  HBA_WRONG_CONNECTION       0x24
638    #define  HBA_BUS_DEVICE_RESET       0x25
639    #define  HBA_ABORT_QUEUE            0x26
640 
641 #else // these are not defined in BUDI/UCB
642 
643    #define SCCB_INVALID_DIRECTION      0x18  /* Invalid target direction */
644    #define SCCB_DUPLICATE_SCCB         0x19  /* Duplicate SCCB */
645    #define SCCB_SCSI_RST               0x35  /* SCSI RESET detected. */
646 
647 #endif // (FW_TYPE==_UCB_MGR_)
648 
649 
650 #define SCCB_IN_PROCESS            0x00
651 #define SCCB_SUCCESS               0x01
652 #define SCCB_ABORT                 0x02
653 #define SCCB_NOT_FOUND             0x03
654 #define SCCB_ERROR                 0x04
655 #define SCCB_INVALID               0x05
656 
657 #define SCCB_SIZE sizeof(SCCB)
658 
659 
660 
661 
662 #if (FW_TYPE == _UCB_MGR_)
663 	void SccbMgr_start_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb);
664 	s32bits SccbMgr_abort_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb);
665 	u08bits SccbMgr_my_int(CARD_HANDLE pCurrCard);
666 	s32bits SccbMgr_isr(CARD_HANDLE pCurrCard);
667 	void SccbMgr_scsi_reset(CARD_HANDLE pCurrCard);
668 	void SccbMgr_timer_expired(CARD_HANDLE pCurrCard);
669 	void SccbMgr_unload_card(CARD_HANDLE pCurrCard);
670 	void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard);
671 	void SccbMgr_restore_native_state(CARD_HANDLE pCurrCard);
672 	void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo);
673 
674 #endif
675 
676 
677 #if (FW_TYPE == _SCCB_MGR_)
678 
679  #if defined (DOS)
680 	int    SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo);
681 	USHORT SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo);
682 	void  SccbMgr_start_sccb(USHORT pCurrCard, PSCCB p_SCCB);
683 	int   SccbMgr_abort_sccb(USHORT pCurrCard, PSCCB p_SCCB);
684 	UCHAR SccbMgr_my_int(USHORT pCurrCard);
685 	int   SccbMgr_isr(USHORT pCurrCard);
686 	void  SccbMgr_scsi_reset(USHORT pCurrCard);
687 	void  SccbMgr_timer_expired(USHORT pCurrCard);
688 	USHORT SccbMgr_status(USHORT pCurrCard);
689 	void SccbMgr_unload_card(USHORT pCurrCard);
690 
691  #else    //non-DOS
692 
693 	int   SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo);
694 	ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo);
695 	void  SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_SCCB);
696 	int   SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_SCCB);
697 	UCHAR SccbMgr_my_int(ULONG pCurrCard);
698 	int   SccbMgr_isr(ULONG pCurrCard);
699 	void  SccbMgr_scsi_reset(ULONG pCurrCard);
700 	void  SccbMgr_enable_int(ULONG pCurrCard);
701 	void  SccbMgr_disable_int(ULONG pCurrCard);
702 	void  SccbMgr_timer_expired(ULONG pCurrCard);
703 	void SccbMgr_unload_card(ULONG pCurrCard);
704 
705   #endif
706 #endif  // (FW_TYPE == _SCCB_MGR_)
707 
708 #endif  /* __SCCB_H__ */
709 
710 /*----------------------------------------------------------------------
711  *
712  *
713  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
714  *
715  *   This file is available under both the GNU General Public License
716  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
717  *
718  *   $Workfile:   blx30.h  $
719  *
720  *   Description: This module contains SCCB/UCB Manager implementation
721  *                specific stuff.
722  *
723  *   $Date: 1996/11/13 18:34:22 $
724  *
725  *   $Revision: 1.10 $
726  *
727  *----------------------------------------------------------------------*/
728 
729 
730 #ifndef __blx30_H__
731 #define __blx30_H__
732 
733 /*#include <globals.h>*/
734 
735 #define  ORION_FW_REV      3110
736 
737 
738 
739 
740 #define HARP_REVD    1
741 
742 
743 #if defined(DOS)
744 #define QUEUE_DEPTH     8+1            /*1 for Normal disconnect 0 for Q'ing. */
745 #else
746 #define QUEUE_DEPTH     254+1            /*1 for Normal disconnect 32 for Q'ing. */
747 #endif   // defined(DOS)
748 
749 #define	MAX_MB_CARDS	4					/* Max. no of cards suppoerted on Mother Board */
750 
751 #define WIDE_SCSI       1
752 
753 #if defined(WIDE_SCSI)
754    #if defined(DOS)
755       #define MAX_SCSI_TAR    16
756       #define MAX_LUN         8
757 		#define LUN_MASK			0x07
758    #else
759       #define MAX_SCSI_TAR    16
760       #define MAX_LUN         32
761 		#define LUN_MASK			0x1f
762 
763    #endif
764 #else
765    #define MAX_SCSI_TAR    8
766    #define MAX_LUN         8
767 	#define LUN_MASK			0x07
768 #endif
769 
770 #if defined(HARP_REVA)
771 #define SG_BUF_CNT      15             /*Number of prefetched elements. */
772 #else
773 #define SG_BUF_CNT      16             /*Number of prefetched elements. */
774 #endif
775 
776 #define SG_ELEMENT_SIZE 8              /*Eight byte per element. */
777 #define SG_LOCAL_MASK   0x00000000L
778 #define SG_ELEMENT_MASK 0xFFFFFFFFL
779 
780 
781 #if (FW_TYPE == _UCB_MGR_)
782 	#define OPC_DECODE_NORMAL       0x0f7f
783 #endif   // _UCB_MGR_
784 
785 
786 
787 #if defined(DOS)
788 
789 /*#include <dos.h>*/
790 	#define RD_HARPOON(ioport)          (OS_InPortByte(ioport))
791 	#define RDW_HARPOON(ioport)         (OS_InPortWord(ioport))
792 	#define WR_HARPOON(ioport,val)      (OS_OutPortByte(ioport,val))
793 	#define WRW_HARPOON(ioport,val)     (OS_OutPortWord(ioport,val))
794 
795 	#define RD_HARP32(port,offset,data)  asm{db 66h;         \
796                                        push ax;             \
797                                        mov dx,port;         \
798                                        add dx, offset;      \
799                                        db 66h;              \
800                                        in ax,dx;            \
801                                        db 66h;              \
802                                        mov word ptr data,ax;\
803                                        db 66h;              \
804                                        pop ax}
805 
806 	#define WR_HARP32(port,offset,data) asm{db 66h;          \
807                                        push ax;             \
808                                        mov dx,port;         \
809                                        add dx, offset;      \
810                                        db 66h;              \
811                                        mov ax,word ptr data;\
812                                        db 66h;              \
813                                        out dx,ax;           \
814                                        db 66h;              \
815                                        pop ax}
816 #endif	/* DOS */
817 
818 #if defined(NETWARE) || defined(OTHER_32) ||  defined(OTHER_16)
819 	#define RD_HARPOON(ioport)     OS_InPortByte((unsigned long)ioport)
820 	#define RDW_HARPOON(ioport)    OS_InPortWord((unsigned long)ioport)
821 	#define RD_HARP32(ioport,offset,data) (data = OS_InPortLong(ioport + offset))
822 	#define WR_HARPOON(ioport,val) OS_OutPortByte((ULONG)ioport,(UCHAR) val)
823 	#define WRW_HARPOON(ioport,val)  OS_OutPortWord((ULONG)ioport,(USHORT)val)
824 	#define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ioport + offset), data)
825 #endif	/* NETWARE || OTHER_32 || OTHER_16 */
826 
827 #if defined(NT) || defined(WIN95_32) || defined(WIN95_16)
828 	#define RD_HARPOON(ioport)          OS_InPortByte((ULONG)ioport)
829 	#define RDW_HARPOON(ioport)         OS_InPortWord((ULONG)ioport)
830 	#define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
831 	#define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
832 	#define WRW_HARPOON(ioport,val)     OS_OutPortWord((ULONG)ioport,(USHORT)val)
833 	#define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ULONG)(ioport + offset), data)
834 #endif /* NT || WIN95_32 || WIN95_16 */
835 
836 #if defined (UNIX)
837 	#define RD_HARPOON(ioport)          OS_InPortByte((u32bits)ioport)
838 	#define RDW_HARPOON(ioport)         OS_InPortWord((u32bits)ioport)
839 	#define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((u32bits)(ioport + offset)))
840 	#define WR_HARPOON(ioport,val)      OS_OutPortByte((u32bits)ioport,(u08bits) val)
841 	#define WRW_HARPOON(ioport,val)       OS_OutPortWord((u32bits)ioport,(u16bits)val)
842 	#define WR_HARP32(ioport,offset,data)  OS_OutPortLong((u32bits)(ioport + offset), data)
843 #endif /* UNIX */
844 
845 #if defined(OS2)
846 	#define RD_HARPOON(ioport)          OS_InPortByte((unsigned long)ioport)
847 	#define RDW_HARPOON(ioport)         OS_InPortWord((unsigned long)ioport)
848 	#define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
849 	#define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
850 	#define WRW_HARPOON(ioport,val)       OS_OutPortWord((ULONG)ioport,(USHORT)val)
851 	#define WR_HARP32(ioport,offset,data)  OS_OutPortLong(((ULONG)(ioport + offset)), data)
852 #endif /* OS2 */
853 
854 #if defined(SOLARIS_REAL_MODE)
855 
856 	#define RD_HARPOON(ioport)          OS_InPortByte((unsigned long)ioport)
857 	#define RDW_HARPOON(ioport)         OS_InPortWord((unsigned long)ioport)
858 	#define RD_HARP32(ioport,offset,data) (data = OS_InPortLong((ULONG)(ioport + offset)))
859 	#define WR_HARPOON(ioport,val)      OS_OutPortByte((ULONG)ioport,(UCHAR) val)
860 	#define WRW_HARPOON(ioport,val)       OS_OutPortWord((ULONG)ioport,(USHORT)val)
861 	#define WR_HARP32(ioport,offset,data)  OS_OutPortLong((ULONG)(ioport + offset), (ULONG)data)
862 
863 #endif  /* SOLARIS_REAL_MODE */
864 
865 #endif  /* __BLX30_H__ */
866 
867 
868 /*----------------------------------------------------------------------
869  *
870  *
871  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
872  *
873  *   This file is available under both the GNU General Public License
874  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
875  *
876  *   $Workfile:   target.h  $
877  *
878  *   Description:  Definitions for Target related structures
879  *
880  *   $Date: 1996/12/11 22:06:20 $
881  *
882  *   $Revision: 1.9 $
883  *
884  *----------------------------------------------------------------------*/
885 
886 #ifndef __TARGET__
887 #define __TARGET__
888 
889 /*#include <globals.h>*/
890 /*#include <blx30.h>*/
891 
892 
893 #define  TAR_SYNC_MASK     (BIT(7)+BIT(6))
894 #define  SYNC_UNKNOWN      0x00
895 #define  SYNC_TRYING               BIT(6)
896 #define  SYNC_SUPPORTED    (BIT(7)+BIT(6))
897 
898 #define  TAR_WIDE_MASK     (BIT(5)+BIT(4))
899 #define  WIDE_DISABLED     0x00
900 #define  WIDE_ENABLED              BIT(4)
901 #define  WIDE_NEGOCIATED   BIT(5)
902 
903 #define  TAR_TAG_Q_MASK    (BIT(3)+BIT(2))
904 #define  TAG_Q_UNKNOWN     0x00
905 #define  TAG_Q_TRYING              BIT(2)
906 #define  TAG_Q_REJECT      BIT(3)
907 #define  TAG_Q_SUPPORTED   (BIT(3)+BIT(2))
908 
909 #define  TAR_ALLOW_DISC    BIT(0)
910 
911 
912 #define  EE_SYNC_MASK      (BIT(0)+BIT(1))
913 #define  EE_SYNC_ASYNC     0x00
914 #define  EE_SYNC_5MB       BIT(0)
915 #define  EE_SYNC_10MB      BIT(1)
916 #define  EE_SYNC_20MB      (BIT(0)+BIT(1))
917 
918 #define  EE_ALLOW_DISC     BIT(6)
919 #define  EE_WIDE_SCSI      BIT(7)
920 
921 
922 #if defined(DOS)
923    typedef struct SCCBMgr_tar_info near *PSCCBMgr_tar_info;
924 
925 #elif defined(OS2)
926    typedef struct SCCBMgr_tar_info far *PSCCBMgr_tar_info;
927 
928 #else
929    typedef struct SCCBMgr_tar_info *PSCCBMgr_tar_info;
930 
931 #endif
932 
933 
934 typedef struct SCCBMgr_tar_info {
935 
936    PSCCB    TarSelQ_Head;
937    PSCCB    TarSelQ_Tail;
938    UCHAR    TarLUN_CA;        /*Contingent Allgiance */
939    UCHAR    TarTagQ_Cnt;
940    UCHAR    TarSelQ_Cnt;
941    UCHAR    TarStatus;
942    UCHAR    TarEEValue;
943    UCHAR 	TarSyncCtrl;
944    UCHAR 	TarReserved[2];			/* for alignment */
945    UCHAR 	LunDiscQ_Idx[MAX_LUN];
946    UCHAR    TarLUNBusy[MAX_LUN];
947 } SCCBMGR_TAR_INFO;
948 
949 typedef struct NVRAMInfo {
950 	UCHAR		niModel;								/* Model No. of card */
951 	UCHAR		niCardNo;							/* Card no. */
952 #if defined(DOS)
953 	USHORT	niBaseAddr;							/* Port Address of card */
954 #else
955 	ULONG		niBaseAddr;							/* Port Address of card */
956 #endif
957 	UCHAR		niSysConf;							/* Adapter Configuration byte - Byte 16 of eeprom map */
958 	UCHAR		niScsiConf;							/* SCSI Configuration byte - Byte 17 of eeprom map */
959 	UCHAR		niScamConf;							/* SCAM Configuration byte - Byte 20 of eeprom map */
960 	UCHAR		niAdapId;							/* Host Adapter ID - Byte 24 of eerpom map */
961 	UCHAR		niSyncTbl[MAX_SCSI_TAR / 2];	/* Sync/Wide byte of targets */
962 	UCHAR		niScamTbl[MAX_SCSI_TAR][4];	/* Compressed Scam name string of Targets */
963 }NVRAMINFO;
964 
965 #if defined(DOS)
966 typedef NVRAMINFO near *PNVRamInfo;
967 #elif defined (OS2)
968 typedef NVRAMINFO far *PNVRamInfo;
969 #else
970 typedef NVRAMINFO *PNVRamInfo;
971 #endif
972 
973 #define	MODEL_LT		1
974 #define	MODEL_DL		2
975 #define	MODEL_LW		3
976 #define	MODEL_DW		4
977 
978 
979 typedef struct SCCBcard {
980    PSCCB currentSCCB;
981 #if (FW_TYPE==_SCCB_MGR_)
982    PSCCBMGR_INFO cardInfo;
983 #else
984    PADAPTER_INFO cardInfo;
985 #endif
986 
987 #if defined(DOS)
988    USHORT ioPort;
989 #else
990    ULONG ioPort;
991 #endif
992 
993    USHORT cmdCounter;
994    UCHAR  discQCount;
995    UCHAR  tagQ_Lst;
996    UCHAR cardIndex;
997    UCHAR scanIndex;
998    UCHAR globalFlags;
999    UCHAR ourId;
1000    PNVRamInfo pNvRamInfo;
1001    PSCCB discQ_Tbl[QUEUE_DEPTH];
1002 
1003 }SCCBCARD;
1004 
1005 #if defined(DOS)
1006 typedef struct SCCBcard near *PSCCBcard;
1007 #elif defined (OS2)
1008 typedef struct SCCBcard far *PSCCBcard;
1009 #else
1010 typedef struct SCCBcard *PSCCBcard;
1011 #endif
1012 
1013 
1014 #define F_TAG_STARTED		0x01
1015 #define F_CONLUN_IO			0x02
1016 #define F_DO_RENEGO			0x04
1017 #define F_NO_FILTER			0x08
1018 #define F_GREEN_PC			0x10
1019 #define F_HOST_XFER_ACT		0x20
1020 #define F_NEW_SCCB_CMD		0x40
1021 #define F_UPDATE_EEPROM		0x80
1022 
1023 
1024 #define  ID_STRING_LENGTH  32
1025 #define  TYPE_CODE0        0x63           /*Level2 Mstr (bits 7-6),  */
1026 
1027 #define  TYPE_CODE1        00             /*No ID yet */
1028 
1029 #define  SLV_TYPE_CODE0    0xA3           /*Priority Bit set (bits 7-6),  */
1030 
1031 #define  ASSIGN_ID   0x00
1032 #define  SET_P_FLAG  0x01
1033 #define  CFG_CMPLT   0x03
1034 #define  DOM_MSTR    0x0F
1035 #define  SYNC_PTRN   0x1F
1036 
1037 #define  ID_0_7      0x18
1038 #define  ID_8_F      0x11
1039 #define  ID_10_17    0x12
1040 #define  ID_18_1F    0x0B
1041 #define  MISC_CODE   0x14
1042 #define  CLR_P_FLAG  0x18
1043 #define  LOCATE_ON   0x12
1044 #define  LOCATE_OFF  0x0B
1045 
1046 #define  LVL_1_MST   0x00
1047 #define  LVL_2_MST   0x40
1048 #define  DOM_LVL_2   0xC0
1049 
1050 
1051 #define  INIT_SELTD  0x01
1052 #define  LEVEL2_TAR  0x02
1053 
1054 
1055 enum scam_id_st { ID0,ID1,ID2,ID3,ID4,ID5,ID6,ID7,ID8,ID9,ID10,ID11,ID12,
1056                   ID13,ID14,ID15,ID_UNUSED,ID_UNASSIGNED,ID_ASSIGNED,LEGACY,
1057                   CLR_PRIORITY,NO_ID_AVAIL };
1058 
1059 typedef struct SCCBscam_info {
1060 
1061    UCHAR    id_string[ID_STRING_LENGTH];
1062    enum scam_id_st state;
1063 
1064 } SCCBSCAM_INFO, *PSCCBSCAM_INFO;
1065 
1066 #endif
1067 /*----------------------------------------------------------------------
1068  *
1069  *
1070  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
1071  *
1072  *   This file is available under both the GNU General Public License
1073  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
1074  *
1075  *   $Workfile:   scsi2.h  $
1076  *
1077  *   Description:  Register definitions for HARPOON ASIC.
1078  *
1079  *   $Date: 1996/11/13 18:32:57 $
1080  *
1081  *   $Revision: 1.4 $
1082  *
1083  *----------------------------------------------------------------------*/
1084 
1085 #ifndef __SCSI_H__
1086 #define __SCSI_H__
1087 
1088 
1089 
1090 #define  SCSI_TEST_UNIT_READY    0x00
1091 #define  SCSI_REZERO_UNIT        0x01
1092 #define  SCSI_REQUEST_SENSE      0x03
1093 #define  SCSI_FORMAT_UNIT        0x04
1094 #define  SCSI_REASSIGN           0x07
1095 #define  SCSI_READ               0x08
1096 #define  SCSI_WRITE              0x0A
1097 #define  SCSI_SEEK               0x0B
1098 #define  SCSI_INQUIRY            0x12
1099 #define  SCSI_MODE_SELECT        0x15
1100 #define  SCSI_RESERVE_UNIT       0x16
1101 #define  SCSI_RELEASE_UNIT       0x17
1102 #define  SCSI_MODE_SENSE         0x1A
1103 #define  SCSI_START_STOP_UNIT    0x1B
1104 #define  SCSI_SEND_DIAGNOSTIC    0x1D
1105 #define  SCSI_READ_CAPACITY      0x25
1106 #define  SCSI_READ_EXTENDED      0x28
1107 #define  SCSI_WRITE_EXTENDED     0x2A
1108 #define  SCSI_SEEK_EXTENDED      0x2B
1109 #define  SCSI_WRITE_AND_VERIFY   0x2E
1110 #define  SCSI_VERIFY             0x2F
1111 #define  SCSI_READ_DEFECT_DATA   0x37
1112 #define  SCSI_WRITE_BUFFER       0x3B
1113 #define  SCSI_READ_BUFFER        0x3C
1114 #define  SCSI_RECV_DIAGNOSTIC    0x1C
1115 #define  SCSI_READ_LONG          0x3E
1116 #define  SCSI_WRITE_LONG         0x3F
1117 #define  SCSI_LAST_SCSI_CMND     SCSI_WRITE_LONG
1118 #define  SCSI_INVALID_CMND       0xFF
1119 
1120 
1121 
1122 #define  SSGOOD                  0x00
1123 #define  SSCHECK                 0x02
1124 #define  SSCOND_MET              0x04
1125 #define  SSBUSY                  0x08
1126 #define  SSRESERVATION_CONFLICT  0x18
1127 #define  SSCMD_TERM              0x22
1128 #define  SSQ_FULL                0x28
1129 
1130 
1131 #define  SKNO_SEN                0x00
1132 #define  SKRECOV_ERR             0x01
1133 #define  SKNOT_RDY               0x02
1134 #define  SKMED_ERR               0x03
1135 #define  SKHW_ERR                0x04
1136 #define  SKILL_REQ               0x05
1137 #define  SKUNIT_ATTN             0x06
1138 #define  SKDATA_PROTECT          0x07
1139 #define  SKBLNK_CHK              0x08
1140 #define  SKCPY_ABORT             0x0A
1141 #define  SKABORT_CMD             0x0B
1142 #define  SKEQUAL                 0x0C
1143 #define  SKVOL_OVF               0x0D
1144 #define  SKMIS_CMP               0x0E
1145 
1146 
1147 #define  SMCMD_COMP              0x00
1148 #define  SMEXT                   0x01
1149 #define  SMSAVE_DATA_PTR         0x02
1150 #define  SMREST_DATA_PTR         0x03
1151 #define  SMDISC                  0x04
1152 #define  SMINIT_DETEC_ERR        0x05
1153 #define  SMABORT                 0x06
1154 #define  SMREJECT                0x07
1155 #define  SMNO_OP                 0x08
1156 #define  SMPARITY                0x09
1157 #define  SMDEV_RESET             0x0C
1158 #define	SMABORT_TAG					0x0D
1159 #define	SMINIT_RECOVERY			0x0F
1160 #define	SMREL_RECOVERY				0x10
1161 
1162 #define  SMIDENT                 0x80
1163 #define  DISC_PRIV               0x40
1164 
1165 
1166 #define  SMSYNC                  0x01
1167 #define  SM10MBS                 0x19     /* 100ns           */
1168 #define  SM5MBS                  0x32     /* 200ns           */
1169 #define  SMOFFSET                0x0F     /* Maxoffset value */
1170 #define  SMWDTR                  0x03
1171 #define  SM8BIT                  0x00
1172 #define  SM16BIT                 0x01
1173 #define  SM32BIT                 0x02
1174 #define  SMIGNORWR               0x23     /* Ignore Wide Residue */
1175 
1176 
1177 #define  ARBITRATION_DELAY       0x01     /* 2.4us using a 40Mhz clock */
1178 #define  BUS_SETTLE_DELAY        0x01     /* 400ns */
1179 #define  BUS_CLEAR_DELAY         0x01     /* 800ns */
1180 
1181 
1182 
1183 #define  SPHASE_TO               0x0A  /* 10 second timeout waiting for */
1184 #define  SCMD_TO                 0x0F  /* Overall command timeout */
1185 
1186 
1187 
1188 #define  SIX_BYTE_CMD            0x06
1189 #define  TEN_BYTE_CMD            0x0A
1190 #define  TWELVE_BYTE_CMD         0x0C
1191 
1192 #define  ASYNC                   0x00
1193 #define  PERI25NS                0x06  /* 25/4ns to next clock for xbow. */
1194 #define  SYNC10MBS               0x19
1195 #define  SYNC5MBS                0x32
1196 #define  MAX_OFFSET              0x0F  /* Maxbyteoffset for Sync Xfers */
1197 
1198 #endif
1199 /*----------------------------------------------------------------------
1200  *
1201  *
1202  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
1203  *
1204  *   This file is available under both the GNU General Public License
1205  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
1206  *
1207  *   $Workfile:   eeprom.h  $
1208  *
1209  *   Description:  Definitions for EEPROM related structures
1210  *
1211  *   $Date: 1996/11/13 18:28:39 $
1212  *
1213  *   $Revision: 1.4 $
1214  *
1215  *----------------------------------------------------------------------*/
1216 
1217 #ifndef __EEPROM__
1218 #define __EEPROM__
1219 
1220 /*#include <globals.h>*/
1221 
1222 #define  EEPROM_WD_CNT     256
1223 
1224 #define  EEPROM_CHECK_SUM  0
1225 #define  FW_SIGNATURE      2
1226 #define  MODEL_NUMB_0      4
1227 #define  MODEL_NUMB_1      5
1228 #define  MODEL_NUMB_2      6
1229 #define  MODEL_NUMB_3      7
1230 #define  MODEL_NUMB_4      8
1231 #define  MODEL_NUMB_5      9
1232 #define  IO_BASE_ADDR      10
1233 #define  IRQ_NUMBER        12
1234 #define  PCI_INT_PIN       13
1235 #define  BUS_DELAY         14       /*On time in byte 14 off delay in 15 */
1236 #define  SYSTEM_CONFIG     16
1237 #define  SCSI_CONFIG       17
1238 #define  BIOS_CONFIG       18
1239 #define  SPIN_UP_DELAY     19
1240 #define  SCAM_CONFIG       20
1241 #define  ADAPTER_SCSI_ID   24
1242 
1243 
1244 #define  IGNORE_B_SCAN     32
1245 #define  SEND_START_ENA    34
1246 #define  DEVICE_ENABLE     36
1247 
1248 #define  SYNC_RATE_TBL     38
1249 #define  SYNC_RATE_TBL01   38
1250 #define  SYNC_RATE_TBL23   40
1251 #define  SYNC_RATE_TBL45   42
1252 #define  SYNC_RATE_TBL67   44
1253 #define  SYNC_RATE_TBL89   46
1254 #define  SYNC_RATE_TBLab   48
1255 #define  SYNC_RATE_TBLcd   50
1256 #define  SYNC_RATE_TBLef   52
1257 
1258 
1259 
1260 #define  EE_SCAMBASE      256
1261 
1262 
1263 
1264    #define  DOM_MASTER     (BIT(0) + BIT(1))
1265    #define  SCAM_ENABLED   BIT(2)
1266    #define  SCAM_LEVEL2    BIT(3)
1267 
1268 
1269 	#define	RENEGO_ENA		BITW(10)
1270 	#define	CONNIO_ENA		BITW(11)
1271    #define  GREEN_PC_ENA   BITW(12)
1272 
1273 
1274    #define  AUTO_RATE_00   00
1275    #define  AUTO_RATE_05   01
1276    #define  AUTO_RATE_10   02
1277    #define  AUTO_RATE_20   03
1278 
1279    #define  WIDE_NEGO_BIT     BIT(7)
1280    #define  DISC_ENABLE_BIT   BIT(6)
1281 
1282 
1283 #endif
1284 /*----------------------------------------------------------------------
1285  *
1286  *
1287  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
1288  *
1289  *   This file is available under both the GNU General Public License
1290  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
1291  *
1292  *   $Workfile:   harpoon.h  $
1293  *
1294  *   Description:  Register definitions for HARPOON ASIC.
1295  *
1296  *   $Date: 1997/07/09 21:44:36 $
1297  *
1298  *   $Revision: 1.9 $
1299  *
1300  *----------------------------------------------------------------------*/
1301 
1302 
1303 /*#include <globals.h>*/
1304 
1305 #ifndef __HARPOON__
1306 #define __HARPOON__
1307 
1308 
1309    #define  hp_vendor_id_0       0x00		/* LSB */
1310       #define  ORION_VEND_0   0x4B
1311 
1312    #define  hp_vendor_id_1       0x01		/* MSB */
1313       #define  ORION_VEND_1   0x10
1314 
1315    #define  hp_device_id_0       0x02		/* LSB */
1316       #define  ORION_DEV_0    0x30
1317 
1318    #define  hp_device_id_1       0x03		/* MSB */
1319       #define  ORION_DEV_1    0x81
1320 
1321 	/* Sub Vendor ID and Sub Device ID only available in
1322 		Harpoon Version 2 and higher */
1323 
1324    #define  hp_sub_vendor_id_0   0x04		/* LSB */
1325    #define  hp_sub_vendor_id_1   0x05		/* MSB */
1326    #define  hp_sub_device_id_0   0x06		/* LSB */
1327    #define  hp_sub_device_id_1   0x07		/* MSB */
1328 
1329 
1330    #define  hp_dual_addr_lo      0x08
1331    #define  hp_dual_addr_lmi     0x09
1332    #define  hp_dual_addr_hmi     0x0A
1333    #define  hp_dual_addr_hi      0x0B
1334 
1335    #define  hp_semaphore         0x0C
1336       #define SCCB_MGR_ACTIVE    BIT(0)
1337       #define TICKLE_ME          BIT(1)
1338       #define SCCB_MGR_PRESENT   BIT(3)
1339       #define BIOS_IN_USE        BIT(4)
1340 
1341    #define  hp_user_defined_D    0x0D
1342 
1343    #define  hp_reserved_E        0x0E
1344 
1345    #define  hp_sys_ctrl          0x0F
1346 
1347       #define  STOP_CLK          BIT(0)      /*Turn off BusMaster Clock */
1348       #define  DRVR_RST          BIT(1)      /*Firmware Reset to 80C15 chip */
1349       #define  HALT_MACH         BIT(3)      /*Halt State Machine      */
1350       #define  HARD_ABORT        BIT(4)      /*Hard Abort              */
1351       #define  DIAG_MODE         BIT(5)      /*Diagnostic Mode         */
1352 
1353       #define  BM_ABORT_TMOUT    0x50        /*Halt State machine time out */
1354 
1355    #define  hp_sys_cfg           0x10
1356 
1357       #define  DONT_RST_FIFO     BIT(7)      /*Don't reset FIFO      */
1358 
1359 
1360    #define  hp_host_ctrl0        0x11
1361 
1362       #define  DUAL_ADDR_MODE    BIT(0)   /*Enable 64-bit addresses */
1363       #define  IO_MEM_SPACE      BIT(1)   /*I/O Memory Space    */
1364       #define  RESOURCE_LOCK     BIT(2)   /*Enable Resource Lock */
1365       #define  IGNOR_ACCESS_ERR  BIT(3)   /*Ignore Access Error */
1366       #define  HOST_INT_EDGE     BIT(4)   /*Host interrupt level/edge mode sel */
1367       #define  SIX_CLOCKS        BIT(5)   /*6 Clocks between Strobe   */
1368       #define  DMA_EVEN_PARITY   BIT(6)   /*Enable DMA Enen Parity */
1369 
1370 /*
1371       #define  BURST_MODE        BIT(0)
1372 */
1373 
1374    #define  hp_reserved_12       0x12
1375 
1376    #define  hp_host_blk_cnt      0x13
1377 
1378       #define  XFER_BLK1         0x00     /*     0 0 0  1 byte per block*/
1379       #define  XFER_BLK2         0x01     /*     0 0 1  2 byte per block*/
1380       #define  XFER_BLK4         0x02     /*     0 1 0  4 byte per block*/
1381       #define  XFER_BLK8         0x03     /*     0 1 1  8 byte per block*/
1382       #define  XFER_BLK16        0x04     /*     1 0 0 16 byte per block*/
1383       #define  XFER_BLK32        0x05     /*     1 0 1 32 byte per block*/
1384       #define  XFER_BLK64        0x06     /*     1 1 0 64 byte per block*/
1385 
1386       #define  BM_THRESHOLD      0x40     /* PCI mode can only xfer 16 bytes*/
1387 
1388 
1389    #define  hp_reserved_14       0x14
1390    #define  hp_reserved_15       0x15
1391    #define  hp_reserved_16       0x16
1392 
1393    #define  hp_int_mask          0x17
1394 
1395       #define  INT_CMD_COMPL     BIT(0)   /* DMA command complete   */
1396       #define  INT_EXT_STATUS    BIT(1)   /* Extended Status Set    */
1397       #define  INT_SCSI          BIT(2)   /* Scsi block interrupt   */
1398       #define  INT_FIFO_RDY      BIT(4)   /* FIFO data ready        */
1399 
1400 
1401    #define  hp_xfer_cnt_lo       0x18
1402    #define  hp_xfer_cnt_mi       0x19
1403    #define  hp_xfer_cnt_hi       0x1A
1404    #define  hp_xfer_cmd          0x1B
1405 
1406       #define  XFER_HOST_DMA     0x00     /*     0 0 0 Transfer Host -> DMA */
1407       #define  XFER_DMA_HOST     0x01     /*     0 0 1 Transfer DMA  -> Host */
1408       #define  XFER_HOST_MPU     0x02     /*     0 1 0 Transfer Host -> MPU  */
1409       #define  XFER_MPU_HOST     0x03     /*     0 1 1 Transfer MPU  -> Host */
1410       #define  XFER_DMA_MPU      0x04     /*     1 0 0 Transfer DMA  -> MPU  */
1411       #define  XFER_MPU_DMA      0x05     /*     1 0 1 Transfer MPU  -> DMA  */
1412       #define  SET_SEMAPHORE     0x06     /*     1 1 0 Set Semaphore         */
1413       #define  XFER_NOP          0x07     /*     1 1 1 Transfer NOP          */
1414       #define  XFER_MB_MPU       0x06     /*     1 1 0 Transfer MB -> MPU */
1415       #define  XFER_MB_DMA       0x07     /*     1 1 1 Transfer MB -> DMA */
1416 
1417 
1418       #define  XFER_HOST_AUTO    0x00     /*     0 0 Auto Transfer Size   */
1419       #define  XFER_HOST_8BIT    0x08     /*     0 1 8 BIT Transfer Size  */
1420       #define  XFER_HOST_16BIT   0x10     /*     1 0 16 BIT Transfer Size */
1421       #define  XFER_HOST_32BIT   0x18     /*     1 1 32 BIT Transfer Size */
1422 
1423       #define  XFER_DMA_8BIT     0x20     /*     0 1 8 BIT  Transfer Size */
1424       #define  XFER_DMA_16BIT    0x40     /*     1 0 16 BIT Transfer Size */
1425 
1426       #define  DISABLE_INT       BIT(7)   /*Do not interrupt at end of cmd. */
1427 
1428       #define  HOST_WRT_CMD      ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_8BIT))
1429       #define  HOST_RD_CMD       ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_8BIT))
1430       #define  WIDE_HOST_WRT_CMD ((DISABLE_INT + XFER_HOST_DMA + XFER_HOST_AUTO + XFER_DMA_16BIT))
1431       #define  WIDE_HOST_RD_CMD  ((DISABLE_INT + XFER_DMA_HOST + XFER_HOST_AUTO + XFER_DMA_16BIT))
1432 
1433    #define  hp_host_addr_lo      0x1C
1434    #define  hp_host_addr_lmi     0x1D
1435    #define  hp_host_addr_hmi     0x1E
1436    #define  hp_host_addr_hi      0x1F
1437 
1438    #define  hp_pio_data          0x20
1439    #define  hp_reserved_21       0x21
1440    #define  hp_ee_ctrl           0x22
1441 
1442       #define  EXT_ARB_ACK       BIT(7)
1443       #define  SCSI_TERM_ENA_H   BIT(6)   /* SCSI high byte terminator */
1444       #define  SEE_MS            BIT(5)
1445       #define  SEE_CS            BIT(3)
1446       #define  SEE_CLK           BIT(2)
1447       #define  SEE_DO            BIT(1)
1448       #define  SEE_DI            BIT(0)
1449 
1450       #define  EE_READ           0x06
1451       #define  EE_WRITE          0x05
1452       #define  EWEN              0x04
1453       #define  EWEN_ADDR         0x03C0
1454       #define  EWDS              0x04
1455       #define  EWDS_ADDR         0x0000
1456 
1457    #define  hp_brdctl            0x23
1458 
1459       #define  DAT_7             BIT(7)
1460       #define  DAT_6             BIT(6)
1461       #define  DAT_5             BIT(5)
1462       #define  BRD_STB           BIT(4)
1463       #define  BRD_CS            BIT(3)
1464       #define  BRD_WR            BIT(2)
1465 
1466    #define  hp_reserved_24       0x24
1467    #define  hp_reserved_25       0x25
1468 
1469 
1470 
1471 
1472    #define  hp_bm_ctrl           0x26
1473 
1474       #define  SCSI_TERM_ENA_L   BIT(0)   /*Enable/Disable external terminators */
1475       #define  FLUSH_XFER_CNTR   BIT(1)   /*Flush transfer counter */
1476       #define  BM_XFER_MIN_8     BIT(2)   /*Enable bus master transfer of 9 */
1477       #define  BIOS_ENA          BIT(3)   /*Enable BIOS/FLASH Enable */
1478       #define  FORCE1_XFER       BIT(5)   /*Always xfer one byte in byte mode */
1479       #define  FAST_SINGLE       BIT(6)   /*?? */
1480 
1481       #define  BMCTRL_DEFAULT    (FORCE1_XFER|FAST_SINGLE|SCSI_TERM_ENA_L)
1482 
1483    #define  hp_reserved_27       0x27
1484 
1485    #define  hp_sg_addr           0x28
1486    #define  hp_page_ctrl         0x29
1487 
1488       #define  SCATTER_EN        BIT(0)
1489       #define  SGRAM_ARAM        BIT(1)
1490       #define  BIOS_SHADOW       BIT(2)
1491       #define  G_INT_DISABLE     BIT(3)   /* Enable/Disable all Interrupts */
1492       #define  NARROW_SCSI_CARD  BIT(4)   /* NARROW/WIDE SCSI config pin */
1493 
1494    #define  hp_reserved_2A       0x2A
1495    #define  hp_pci_cmd_cfg       0x2B
1496 
1497       #define  IO_SPACE_ENA      BIT(0)   /*enable I/O space */
1498       #define  MEM_SPACE_ENA     BIT(1)   /*enable memory space */
1499       #define  BUS_MSTR_ENA      BIT(2)   /*enable bus master operation */
1500       #define  MEM_WI_ENA        BIT(4)   /*enable Write and Invalidate */
1501       #define  PAR_ERR_RESP      BIT(6)   /*enable parity error responce. */
1502 
1503    #define  hp_reserved_2C       0x2C
1504 
1505    #define  hp_pci_stat_cfg      0x2D
1506 
1507       #define  DATA_PARITY_ERR   BIT(0)
1508       #define  REC_TARGET_ABORT  BIT(4)   /*received Target abort */
1509       #define  REC_MASTER_ABORT  BIT(5)   /*received Master abort */
1510       #define  SIG_SYSTEM_ERR    BIT(6)
1511       #define  DETECTED_PAR_ERR  BIT(7)
1512 
1513    #define  hp_reserved_2E       0x2E
1514 
1515    #define  hp_sys_status        0x2F
1516 
1517       #define  SLV_DATA_RDY      BIT(0)   /*Slave data ready */
1518       #define  XFER_CNT_ZERO     BIT(1)   /*Transfer counter = 0 */
1519       #define  BM_FIFO_EMPTY     BIT(2)   /*FIFO empty */
1520       #define  BM_FIFO_FULL      BIT(3)   /*FIFO full */
1521       #define  HOST_OP_DONE      BIT(4)   /*host operation done */
1522       #define  DMA_OP_DONE       BIT(5)   /*DMA operation done */
1523       #define  SLV_OP_DONE       BIT(6)   /*Slave operation done */
1524       #define  PWR_ON_FLAG       BIT(7)   /*Power on flag */
1525 
1526    #define  hp_reserved_30       0x30
1527 
1528    #define  hp_host_status0      0x31
1529 
1530       #define  HOST_TERM         BIT(5)   /*Host Terminal Count */
1531       #define  HOST_TRSHLD       BIT(6)   /*Host Threshold      */
1532       #define  CONNECTED_2_HOST  BIT(7)   /*Connected to Host   */
1533 
1534    #define  hp_reserved_32       0x32
1535 
1536    #define  hp_rev_num           0x33
1537 
1538       #define  REV_A_CONST       0x0E
1539       #define  REV_B_CONST       0x0E
1540 
1541    #define  hp_stack_data        0x34
1542    #define  hp_stack_addr        0x35
1543 
1544    #define  hp_ext_status        0x36
1545 
1546       #define  BM_FORCE_OFF      BIT(0)   /*Bus Master is forced to get off */
1547       #define  PCI_TGT_ABORT     BIT(0)   /*PCI bus master transaction aborted */
1548       #define  PCI_DEV_TMOUT     BIT(1)   /*PCI Device Time out */
1549       #define  FIFO_TC_NOT_ZERO  BIT(2)   /*FIFO or transfer counter not zero */
1550       #define  CHIP_RST_OCCUR    BIT(3)   /*Chip reset occurs */
1551       #define  CMD_ABORTED       BIT(4)   /*Command aborted */
1552       #define  BM_PARITY_ERR     BIT(5)   /*parity error on data received   */
1553       #define  PIO_OVERRUN       BIT(6)   /*Slave data overrun */
1554       #define  BM_CMD_BUSY       BIT(7)   /*Bus master transfer command busy */
1555       #define  BAD_EXT_STATUS    (BM_FORCE_OFF | PCI_DEV_TMOUT | CMD_ABORTED | \
1556                                   BM_PARITY_ERR | PIO_OVERRUN)
1557 
1558    #define  hp_int_status        0x37
1559 
1560       #define  BM_CMD_CMPL       BIT(0)   /*Bus Master command complete */
1561       #define  EXT_STATUS_ON     BIT(1)   /*Extended status is valid */
1562       #define  SCSI_INTERRUPT    BIT(2)   /*Global indication of a SCSI int. */
1563       #define  BM_FIFO_RDY       BIT(4)
1564       #define  INT_ASSERTED      BIT(5)   /* */
1565       #define  SRAM_BUSY         BIT(6)   /*Scatter/Gather RAM busy */
1566       #define  CMD_REG_BUSY      BIT(7)
1567 
1568 
1569    #define  hp_fifo_cnt          0x38
1570    #define  hp_curr_host_cnt     0x39
1571    #define  hp_reserved_3A       0x3A
1572    #define  hp_fifo_in_addr      0x3B
1573 
1574    #define  hp_fifo_out_addr     0x3C
1575    #define  hp_reserved_3D       0x3D
1576    #define  hp_reserved_3E       0x3E
1577    #define  hp_reserved_3F       0x3F
1578 
1579 
1580 
1581    extern USHORT default_intena;
1582 
1583    #define  hp_intena		 0x40
1584 
1585       #define  RESET		 BITW(7)
1586       #define  PROG_HLT		 BITW(6)
1587       #define  PARITY		 BITW(5)
1588       #define  FIFO		 BITW(4)
1589       #define  SEL		 BITW(3)
1590       #define  SCAM_SEL		 BITW(2)
1591       #define  RSEL		 BITW(1)
1592       #define  TIMEOUT		 BITW(0)
1593       #define  BUS_FREE		 BITW(15)
1594       #define  XFER_CNT_0	 BITW(14)
1595       #define  PHASE		 BITW(13)
1596       #define  IUNKWN		 BITW(12)
1597       #define  ICMD_COMP	 BITW(11)
1598       #define  ITICKLE		 BITW(10)
1599       #define  IDO_STRT		 BITW(9)
1600       #define  ITAR_DISC	 BITW(8)
1601       #define  AUTO_INT		 (BITW(12)+BITW(11)+BITW(10)+BITW(9)+BITW(8))
1602       #define  CLR_ALL_INT	 0xFFFF
1603       #define  CLR_ALL_INT_1	 0xFF00
1604 
1605    #define  hp_intstat		 0x42
1606 
1607    #define  hp_scsisig           0x44
1608 
1609       #define  SCSI_SEL          BIT(7)
1610       #define  SCSI_BSY          BIT(6)
1611       #define  SCSI_REQ          BIT(5)
1612       #define  SCSI_ACK          BIT(4)
1613       #define  SCSI_ATN          BIT(3)
1614       #define  SCSI_CD           BIT(2)
1615       #define  SCSI_MSG          BIT(1)
1616       #define  SCSI_IOBIT        BIT(0)
1617 
1618       #define  S_SCSI_PHZ        (BIT(2)+BIT(1)+BIT(0))
1619       #define  S_CMD_PH          (BIT(2)              )
1620       #define  S_MSGO_PH         (BIT(2)+BIT(1)       )
1621       #define  S_STAT_PH         (BIT(2)       +BIT(0))
1622       #define  S_MSGI_PH         (BIT(2)+BIT(1)+BIT(0))
1623       #define  S_DATAI_PH        (              BIT(0))
1624       #define  S_DATAO_PH        0x00
1625       #define  S_ILL_PH          (       BIT(1)       )
1626 
1627    #define  hp_scsictrl_0        0x45
1628 
1629       #define  NO_ARB            BIT(7)
1630       #define  SEL_TAR           BIT(6)
1631       #define  ENA_ATN           BIT(4)
1632       #define  ENA_RESEL         BIT(2)
1633       #define  SCSI_RST          BIT(1)
1634       #define  ENA_SCAM_SEL      BIT(0)
1635 
1636 
1637 
1638    #define  hp_portctrl_0        0x46
1639 
1640       #define  SCSI_PORT         BIT(7)
1641       #define  SCSI_INBIT        BIT(6)
1642       #define  DMA_PORT          BIT(5)
1643       #define  DMA_RD            BIT(4)
1644       #define  HOST_PORT         BIT(3)
1645       #define  HOST_WRT          BIT(2)
1646       #define  SCSI_BUS_EN       BIT(1)
1647       #define  START_TO          BIT(0)
1648 
1649    #define  hp_scsireset         0x47
1650 
1651       #define  SCSI_TAR          BIT(7)
1652       #define  SCSI_INI          BIT(6)
1653       #define  SCAM_EN           BIT(5)
1654       #define  ACK_HOLD          BIT(4)
1655       #define  DMA_RESET         BIT(3)
1656       #define  HPSCSI_RESET      BIT(2)
1657       #define  PROG_RESET        BIT(1)
1658       #define  FIFO_CLR          BIT(0)
1659 
1660    #define  hp_xfercnt_0         0x48
1661    #define  hp_xfercnt_1         0x49
1662    #define  hp_xfercnt_2         0x4A
1663    #define  hp_xfercnt_3         0x4B
1664 
1665    #define  hp_fifodata_0        0x4C
1666    #define  hp_fifodata_1        0x4D
1667    #define  hp_addstat           0x4E
1668 
1669       #define  SCAM_TIMER        BIT(7)
1670       #define  AUTO_RUNNING      BIT(6)
1671       #define  FAST_SYNC         BIT(5)
1672       #define  SCSI_MODE8        BIT(3)
1673       #define  SCSI_PAR_ERR      BIT(0)
1674 
1675    #define  hp_prgmcnt_0         0x4F
1676 
1677       #define  AUTO_PC_MASK      0x3F
1678 
1679    #define  hp_selfid_0          0x50
1680    #define  hp_selfid_1          0x51
1681    #define  hp_arb_id            0x52
1682 
1683       #define  ARB_ID            (BIT(3) + BIT(2) + BIT(1) + BIT(0))
1684 
1685    #define  hp_select_id         0x53
1686 
1687       #define  RESEL_ID          (BIT(7) + BIT(6) + BIT(5) + BIT(4))
1688       #define  SELECT_ID         (BIT(3) + BIT(2) + BIT(1) + BIT(0))
1689 
1690    #define  hp_synctarg_base     0x54
1691    #define  hp_synctarg_12       0x54
1692    #define  hp_synctarg_13       0x55
1693    #define  hp_synctarg_14       0x56
1694    #define  hp_synctarg_15       0x57
1695 
1696    #define  hp_synctarg_8        0x58
1697    #define  hp_synctarg_9        0x59
1698    #define  hp_synctarg_10       0x5A
1699    #define  hp_synctarg_11       0x5B
1700 
1701    #define  hp_synctarg_4        0x5C
1702    #define  hp_synctarg_5        0x5D
1703    #define  hp_synctarg_6        0x5E
1704    #define  hp_synctarg_7        0x5F
1705 
1706    #define  hp_synctarg_0        0x60
1707    #define  hp_synctarg_1        0x61
1708    #define  hp_synctarg_2        0x62
1709    #define  hp_synctarg_3        0x63
1710 
1711       #define  RATE_20MB         0x00
1712       #define  RATE_10MB         (              BIT(5))
1713       #define  RATE_6_6MB        (       BIT(6)       )
1714       #define  RATE_5MB          (       BIT(6)+BIT(5))
1715       #define  RATE_4MB          (BIT(7)              )
1716       #define  RATE_3_33MB       (BIT(7)       +BIT(5))
1717       #define  RATE_2_85MB       (BIT(7)+BIT(6)       )
1718       #define  RATE_2_5MB        (BIT(7)+BIT(5)+BIT(6))
1719       #define  NEXT_CLK          BIT(5)
1720       #define  SLOWEST_SYNC      (BIT(7)+BIT(6)+BIT(5))
1721       #define  NARROW_SCSI       BIT(4)
1722       #define  SYNC_OFFSET       (BIT(3) + BIT(2) + BIT(1) + BIT(0))
1723       #define  DEFAULT_ASYNC     0x00
1724       #define  DEFAULT_OFFSET    0x0F
1725 
1726    #define  hp_autostart_0       0x64
1727    #define  hp_autostart_1       0x65
1728    #define  hp_autostart_2       0x66
1729    #define  hp_autostart_3       0x67
1730 
1731 
1732 
1733       #define  DISABLE  0x00
1734       #define  AUTO_IMMED    BIT(5)
1735       #define  SELECT   BIT(6)
1736       #define  RESELECT (BIT(6)+BIT(5))
1737       #define  BUSFREE  BIT(7)
1738       #define  XFER_0   (BIT(7)+BIT(5))
1739       #define  END_DATA (BIT(7)+BIT(6))
1740       #define  MSG_PHZ  (BIT(7)+BIT(6)+BIT(5))
1741 
1742    #define  hp_gp_reg_0          0x68
1743    #define  hp_gp_reg_1          0x69
1744    #define  hp_gp_reg_2          0x6A
1745    #define  hp_gp_reg_3          0x6B
1746 
1747    #define  hp_seltimeout        0x6C
1748 
1749 
1750       #define  TO_2ms            0x54      /* 2.0503ms */
1751       #define  TO_4ms            0x67      /* 3.9959ms */
1752 
1753       #define  TO_5ms            0x03      /* 4.9152ms */
1754       #define  TO_10ms           0x07      /* 11.xxxms */
1755       #define  TO_250ms          0x99      /* 250.68ms */
1756       #define  TO_290ms          0xB1      /* 289.99ms */
1757       #define  TO_350ms          0xD6      /* 350.62ms */
1758       #define  TO_417ms          0xFF      /* 417.79ms */
1759 
1760    #define  hp_clkctrl_0         0x6D
1761 
1762       #define  PWR_DWN           BIT(6)
1763       #define  ACTdeassert       BIT(4)
1764       #define  ATNonErr          BIT(3)
1765       #define  CLK_30MHZ         BIT(1)
1766       #define  CLK_40MHZ         (BIT(1) + BIT(0))
1767       #define  CLK_50MHZ         BIT(2)
1768 
1769       #define  CLKCTRL_DEFAULT   (ACTdeassert | CLK_40MHZ)
1770 
1771    #define  hp_fiforead          0x6E
1772    #define  hp_fifowrite         0x6F
1773 
1774    #define  hp_offsetctr         0x70
1775    #define  hp_xferstat          0x71
1776 
1777       #define  FIFO_FULL         BIT(7)
1778       #define  FIFO_EMPTY        BIT(6)
1779       #define  FIFO_MASK         0x3F   /* Mask for the FIFO count value. */
1780       #define  FIFO_LEN          0x20
1781 
1782    #define  hp_portctrl_1        0x72
1783 
1784       #define  EVEN_HOST_P       BIT(5)
1785       #define  INVT_SCSI         BIT(4)
1786       #define  CHK_SCSI_P        BIT(3)
1787       #define  HOST_MODE8        BIT(0)
1788       #define  HOST_MODE16       0x00
1789 
1790    #define  hp_xfer_pad          0x73
1791 
1792       #define  ID_UNLOCK         BIT(3)
1793       #define  XFER_PAD          BIT(2)
1794 
1795    #define  hp_scsidata_0        0x74
1796    #define  hp_scsidata_1        0x75
1797    #define  hp_timer_0           0x76
1798    #define  hp_timer_1           0x77
1799 
1800    #define  hp_reserved_78       0x78
1801    #define  hp_reserved_79       0x79
1802    #define  hp_reserved_7A       0x7A
1803    #define  hp_reserved_7B       0x7B
1804 
1805    #define  hp_reserved_7C       0x7C
1806    #define  hp_reserved_7D       0x7D
1807    #define  hp_reserved_7E       0x7E
1808    #define  hp_reserved_7F       0x7F
1809 
1810    #define  hp_aramBase          0x80
1811    #define  BIOS_DATA_OFFSET     0x60
1812    #define  BIOS_RELATIVE_CARD   0x64
1813 
1814 
1815 
1816 
1817       #define  AUTO_LEN 0x80
1818       #define  AR0      0x00
1819       #define  AR1      BITW(8)
1820       #define  AR2      BITW(9)
1821       #define  AR3      (BITW(9) + BITW(8))
1822       #define  SDATA    BITW(10)
1823 
1824       #define  NOP_OP   0x00        /* Nop command */
1825 
1826       #define  CRD_OP   BITW(11)     /* Cmp Reg. w/ Data */
1827 
1828       #define  CRR_OP   BITW(12)     /* Cmp Reg. w. Reg. */
1829 
1830       #define  CBE_OP   (BITW(14)+BITW(12)+BITW(11)) /* Cmp SCSI cmd class & Branch EQ */
1831 
1832       #define  CBN_OP   (BITW(14)+BITW(13))  /* Cmp SCSI cmd class & Branch NOT EQ */
1833 
1834       #define  CPE_OP   (BITW(14)+BITW(11))  /* Cmp SCSI phs & Branch EQ */
1835 
1836       #define  CPN_OP   (BITW(14)+BITW(12))  /* Cmp SCSI phs & Branch NOT EQ */
1837 
1838 
1839       #define  ADATA_OUT   0x00
1840       #define  ADATA_IN    BITW(8)
1841       #define  ACOMMAND    BITW(10)
1842       #define  ASTATUS     (BITW(10)+BITW(8))
1843       #define  AMSG_OUT    (BITW(10)+BITW(9))
1844       #define  AMSG_IN     (BITW(10)+BITW(9)+BITW(8))
1845       #define  AILLEGAL    (BITW(9)+BITW(8))
1846 
1847 
1848       #define  BRH_OP   BITW(13)   /* Branch */
1849 
1850 
1851       #define  ALWAYS   0x00
1852       #define  EQUAL    BITW(8)
1853       #define  NOT_EQ   BITW(9)
1854 
1855       #define  TCB_OP   (BITW(13)+BITW(11))    /* Test condition & branch */
1856 
1857 
1858       #define  ATN_SET     BITW(8)
1859       #define  ATN_RESET   BITW(9)
1860       #define  XFER_CNT    (BITW(9)+BITW(8))
1861       #define  FIFO_0      BITW(10)
1862       #define  FIFO_NOT0   (BITW(10)+BITW(8))
1863       #define  T_USE_SYNC0 (BITW(10)+BITW(9))
1864 
1865 
1866       #define  MPM_OP   BITW(15)        /* Match phase and move data */
1867 
1868       #define  MDR_OP   (BITW(12)+BITW(11)) /* Move data to Reg. */
1869 
1870       #define  MRR_OP   BITW(14)        /* Move DReg. to Reg. */
1871 
1872 
1873       #define  S_IDREG  (BIT(2)+BIT(1)+BIT(0))
1874 
1875 
1876       #define  D_AR0    0x00
1877       #define  D_AR1    BIT(0)
1878       #define  D_AR2    BIT(1)
1879       #define  D_AR3    (BIT(1) + BIT(0))
1880       #define  D_SDATA  BIT(2)
1881       #define  D_BUCKET (BIT(2) + BIT(1) + BIT(0))
1882 
1883 
1884       #define  ADR_OP   (BITW(13)+BITW(12)) /* Logical AND Reg. w. Data */
1885 
1886       #define  ADS_OP   (BITW(14)+BITW(13)+BITW(12))
1887 
1888       #define  ODR_OP   (BITW(13)+BITW(12)+BITW(11))
1889 
1890       #define  ODS_OP   (BITW(14)+BITW(13)+BITW(12)+BITW(11))
1891 
1892       #define  STR_OP   (BITW(15)+BITW(14)) /* Store to A_Reg. */
1893 
1894       #define  AINT_ENA1   0x00
1895       #define  AINT_STAT1  BITW(8)
1896       #define  ASCSI_SIG   BITW(9)
1897       #define  ASCSI_CNTL  (BITW(9)+BITW(8))
1898       #define  APORT_CNTL  BITW(10)
1899       #define  ARST_CNTL   (BITW(10)+BITW(8))
1900       #define  AXFERCNT0   (BITW(10)+BITW(9))
1901       #define  AXFERCNT1   (BITW(10)+BITW(9)+BITW(8))
1902       #define  AXFERCNT2   BITW(11)
1903       #define  AFIFO_DATA  (BITW(11)+BITW(8))
1904       #define  ASCSISELID  (BITW(11)+BITW(9))
1905       #define  ASCSISYNC0  (BITW(11)+BITW(9)+BITW(8))
1906 
1907 
1908       #define  RAT_OP      (BITW(14)+BITW(13)+BITW(11))
1909 
1910       #define  SSI_OP      (BITW(15)+BITW(11))
1911 
1912 
1913       #define  SSI_ITAR_DISC	(ITAR_DISC >> 8)
1914       #define  SSI_IDO_STRT	(IDO_STRT >> 8)
1915       #define  SSI_IDI_STRT	(IDO_STRT >> 8)
1916 
1917       #define  SSI_ICMD_COMP	(ICMD_COMP >> 8)
1918       #define  SSI_ITICKLE	(ITICKLE >> 8)
1919 
1920       #define  SSI_IUNKWN	(IUNKWN >> 8)
1921       #define  SSI_INO_CC	(IUNKWN >> 8)
1922       #define  SSI_IRFAIL	(IUNKWN >> 8)
1923 
1924 
1925       #define  NP    0x10     /*Next Phase */
1926       #define  NTCMD 0x02     /*Non- Tagged Command start */
1927       #define  CMDPZ 0x04     /*Command phase */
1928       #define  DINT  0x12     /*Data Out/In interrupt */
1929       #define  DI    0x13     /*Data Out */
1930       #define  MI    0x14     /*Message In */
1931       #define  DC    0x19     /*Disconnect Message */
1932       #define  ST    0x1D     /*Status Phase */
1933       #define  UNKNWN 0x24    /*Unknown bus action */
1934       #define  CC    0x25     /*Command Completion failure */
1935       #define  TICK  0x26     /*New target reselected us. */
1936       #define  RFAIL 0x27     /*Reselection failed */
1937       #define  SELCHK 0x28     /*Select & Check SCSI ID latch reg */
1938 
1939 
1940       #define  ID_MSG_STRT    hp_aramBase + 0x00
1941       #define  NON_TAG_ID_MSG hp_aramBase + 0x06
1942       #define  CMD_STRT       hp_aramBase + 0x08
1943       #define  SYNC_MSGS      hp_aramBase + 0x08
1944 
1945 
1946 
1947 
1948 
1949       #define  TAG_STRT          0x00
1950       #define  SELECTION_START   0x00
1951       #define  DISCONNECT_START  0x10/2
1952       #define  END_DATA_START    0x14/2
1953       #define  NONTAG_STRT       0x02/2
1954       #define  CMD_ONLY_STRT     CMDPZ/2
1955       #define  TICKLE_STRT     TICK/2
1956       #define  SELCHK_STRT     SELCHK/2
1957 
1958 
1959 
1960 
1961 #define mEEPROM_CLK_DELAY(port) (RD_HARPOON(port+hp_intstat_1))
1962 
1963 #define mWAIT_10MS(port) (RD_HARPOON(port+hp_intstat_1))
1964 
1965 
1966 #define CLR_XFER_CNT(port) (WR_HARPOON(port+hp_xfercnt_0, 0x00))
1967 
1968 #define SET_XFER_CNT(port, data) (WR_HARP32(port,hp_xfercnt_0,data))
1969 
1970 #define GET_XFER_CNT(port, xfercnt) {RD_HARP32(port,hp_xfercnt_0,xfercnt); xfercnt &= 0xFFFFFF;}
1971 /* #define GET_XFER_CNT(port, xfercnt) (xfercnt = RD_HARPOON(port+hp_xfercnt_2), \
1972                                  xfercnt <<= 16,\
1973                                  xfercnt |= RDW_HARPOON((USHORT)(port+hp_xfercnt_0)))
1974  */
1975 #if defined(DOS)
1976 #define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((USHORT)(port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),\
1977          addr >>= 16,\
1978          WRW_HARPOON((USHORT)(port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),\
1979          WR_HARP32(port,hp_xfercnt_0,count),\
1980          WRW_HARPOON((USHORT)(port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),\
1981          count >>= 16,\
1982          WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
1983 #else
1984 #define HP_SETUP_ADDR_CNT(port,addr,count) (WRW_HARPOON((port+hp_host_addr_lo), (USHORT)(addr & 0x0000FFFFL)),\
1985          addr >>= 16,\
1986          WRW_HARPOON((port+hp_host_addr_hmi), (USHORT)(addr & 0x0000FFFFL)),\
1987          WR_HARP32(port,hp_xfercnt_0,count),\
1988          WRW_HARPOON((port+hp_xfer_cnt_lo), (USHORT)(count & 0x0000FFFFL)),\
1989          count >>= 16,\
1990          WR_HARPOON(port+hp_xfer_cnt_hi, (count & 0xFF)))
1991 #endif
1992 
1993 #define ACCEPT_MSG(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
1994                           WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
1995 
1996 
1997 #define ACCEPT_MSG_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
1998                           WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
1999 
2000 #define ACCEPT_STAT(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
2001                           WR_HARPOON(port+hp_scsisig, S_ILL_PH);}
2002 
2003 #define ACCEPT_STAT_ATN(port) {while(RD_HARPOON(port+hp_scsisig) & SCSI_REQ){}\
2004                           WR_HARPOON(port+hp_scsisig, (S_ILL_PH|SCSI_ATN));}
2005 
2006 #define DISABLE_AUTO(port) (WR_HARPOON(port+hp_scsireset, PROG_RESET),\
2007                         WR_HARPOON(port+hp_scsireset, 0x00))
2008 
2009 #define ARAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
2010                              (RD_HARPOON(p_port+hp_page_ctrl) | SGRAM_ARAM)))
2011 
2012 #define SGRAM_ACCESS(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
2013                              (RD_HARPOON(p_port+hp_page_ctrl) & ~SGRAM_ARAM)))
2014 
2015 #define MDISABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
2016                              (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE)))
2017 
2018 #define MENABLE_INT(p_port) (WR_HARPOON(p_port+hp_page_ctrl, \
2019                              (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE)))
2020 
2021 
2022 
2023 #endif
2024 
2025 
2026 #if (FW_TYPE==_UCB_MGR_)
2027 void ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb);
2028 void WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb);
2029 void UpdateCheckSum(u32bits baseport);
2030 #endif // (FW_TYPE==_UCB_MGR_)
2031 
2032 #if defined(DOS)
2033 UCHAR sfm(USHORT port, PSCCB pcurrSCCB);
2034 void  scsiStartAuto(USHORT port);
2035 UCHAR sisyncn(USHORT port, UCHAR p_card, UCHAR syncFlag);
2036 void  ssel(USHORT port, UCHAR p_card);
2037 void  sres(USHORT port, UCHAR p_card, PSCCBcard pCurrCard);
2038 void  sdecm(UCHAR message, USHORT port, UCHAR p_card);
2039 void  shandem(USHORT port, UCHAR p_card,PSCCB pCurrSCCB);
2040 void  stsyncn(USHORT port, UCHAR p_card);
2041 void  sisyncr(USHORT port,UCHAR sync_pulse, UCHAR offset);
2042 void  sssyncv(USHORT p_port, UCHAR p_id, UCHAR p_sync_value, PSCCBMgr_tar_info currTar_Info);
2043 void  sresb(USHORT port, UCHAR p_card);
2044 void  sxfrp(USHORT p_port, UCHAR p_card);
2045 void  schkdd(USHORT port, UCHAR p_card);
2046 UCHAR RdStack(USHORT port, UCHAR index);
2047 void  WrStack(USHORT portBase, UCHAR index, UCHAR data);
2048 UCHAR ChkIfChipInitialized(USHORT ioPort);
2049 
2050 #if defined(V302)
2051 UCHAR GetTarLun(USHORT port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun);
2052 #endif
2053 
2054 void SendMsg(USHORT port, UCHAR message);
2055 void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code);
2056 UCHAR scsellDOS(USHORT p_port, UCHAR targ_id);
2057 #else
2058 UCHAR sfm(ULONG port, PSCCB pcurrSCCB);
2059 void  scsiStartAuto(ULONG port);
2060 UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag);
2061 void  ssel(ULONG port, UCHAR p_card);
2062 void  sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard);
2063 void  sdecm(UCHAR message, ULONG port, UCHAR p_card);
2064 void  shandem(ULONG port, UCHAR p_card,PSCCB pCurrSCCB);
2065 void  stsyncn(ULONG port, UCHAR p_card);
2066 void  sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset);
2067 void  sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value, PSCCBMgr_tar_info currTar_Info);
2068 void  sresb(ULONG port, UCHAR p_card);
2069 void  sxfrp(ULONG p_port, UCHAR p_card);
2070 void  schkdd(ULONG port, UCHAR p_card);
2071 UCHAR RdStack(ULONG port, UCHAR index);
2072 void  WrStack(ULONG portBase, UCHAR index, UCHAR data);
2073 UCHAR ChkIfChipInitialized(ULONG ioPort);
2074 
2075 #if defined(V302)
2076 UCHAR GetTarLun(ULONG port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tar, PUCHAR lun);
2077 #endif
2078 
2079 void SendMsg(ULONG port, UCHAR message);
2080 void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code);
2081 #endif
2082 
2083 void  ssenss(PSCCBcard pCurrCard);
2084 void  sinits(PSCCB p_sccb, UCHAR p_card);
2085 void  RNVRamData(PNVRamInfo pNvRamInfo);
2086 
2087 #if defined(WIDE_SCSI)
2088    #if defined(DOS)
2089    UCHAR siwidn(USHORT port, UCHAR p_card);
2090    void  stwidn(USHORT port, UCHAR p_card);
2091    void  siwidr(USHORT port, UCHAR width);
2092    #else
2093    UCHAR siwidn(ULONG port, UCHAR p_card);
2094    void  stwidn(ULONG port, UCHAR p_card);
2095    void  siwidr(ULONG port, UCHAR width);
2096    #endif
2097 #endif
2098 
2099 
2100 void  queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card);
2101 void  queueDisconnect(PSCCB p_SCCB, UCHAR p_card);
2102 void  queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_SCCB, UCHAR p_card);
2103 void  queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card);
2104 void  queueFlushSccb(UCHAR p_card, UCHAR error_code);
2105 void  queueAddSccb(PSCCB p_SCCB, UCHAR card);
2106 UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card);
2107 void  utilUpdateResidual(PSCCB p_SCCB);
2108 USHORT CalcCrc16(UCHAR buffer[]);
2109 UCHAR  CalcLrc(UCHAR buffer[]);
2110 
2111 
2112 #if defined(DOS)
2113 void  Wait1Second(USHORT p_port);
2114 void  Wait(USHORT p_port, UCHAR p_delay);
2115 void  utilEEWriteOnOff(USHORT p_port,UCHAR p_mode);
2116 void  utilEEWrite(USHORT p_port, USHORT ee_data, USHORT ee_addr);
2117 USHORT utilEERead(USHORT p_port, USHORT ee_addr);
2118 USHORT utilEEReadOrg(USHORT p_port, USHORT ee_addr);
2119 void  utilEESendCmdAddr(USHORT p_port, UCHAR ee_cmd, USHORT ee_addr);
2120 #else
2121 void  Wait1Second(ULONG p_port);
2122 void  Wait(ULONG p_port, UCHAR p_delay);
2123 void  utilEEWriteOnOff(ULONG p_port,UCHAR p_mode);
2124 void  utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr);
2125 USHORT utilEERead(ULONG p_port, USHORT ee_addr);
2126 USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr);
2127 void  utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr);
2128 #endif
2129 
2130 
2131 
2132 #if defined(OS2)
2133    void  far phaseDataOut(ULONG port, UCHAR p_card);
2134    void  far phaseDataIn(ULONG port, UCHAR p_card);
2135    void  far phaseCommand(ULONG port, UCHAR p_card);
2136    void  far phaseStatus(ULONG port, UCHAR p_card);
2137    void  far phaseMsgOut(ULONG port, UCHAR p_card);
2138    void  far phaseMsgIn(ULONG port, UCHAR p_card);
2139    void  far phaseIllegal(ULONG port, UCHAR p_card);
2140 #else
2141    #if defined(DOS)
2142       void  phaseDataOut(USHORT port, UCHAR p_card);
2143       void  phaseDataIn(USHORT port, UCHAR p_card);
2144       void  phaseCommand(USHORT port, UCHAR p_card);
2145       void  phaseStatus(USHORT port, UCHAR p_card);
2146       void  phaseMsgOut(USHORT port, UCHAR p_card);
2147       void  phaseMsgIn(USHORT port, UCHAR p_card);
2148       void  phaseIllegal(USHORT port, UCHAR p_card);
2149    #else
2150       void  phaseDataOut(ULONG port, UCHAR p_card);
2151       void  phaseDataIn(ULONG port, UCHAR p_card);
2152       void  phaseCommand(ULONG port, UCHAR p_card);
2153       void  phaseStatus(ULONG port, UCHAR p_card);
2154       void  phaseMsgOut(ULONG port, UCHAR p_card);
2155       void  phaseMsgIn(ULONG port, UCHAR p_card);
2156       void  phaseIllegal(ULONG port, UCHAR p_card);
2157    #endif
2158 #endif
2159 
2160 #if defined(DOS)
2161 void  phaseDecode(USHORT port, UCHAR p_card);
2162 void  phaseChkFifo(USHORT port, UCHAR p_card);
2163 void  phaseBusFree(USHORT p_port, UCHAR p_card);
2164 #else
2165 void  phaseDecode(ULONG port, UCHAR p_card);
2166 void  phaseChkFifo(ULONG port, UCHAR p_card);
2167 void  phaseBusFree(ULONG p_port, UCHAR p_card);
2168 #endif
2169 
2170 
2171 
2172 
2173 #if defined(DOS)
2174 void  XbowInit(USHORT port, UCHAR scamFlg);
2175 void  BusMasterInit(USHORT p_port);
2176 int   DiagXbow(USHORT port);
2177 int   DiagBusMaster(USHORT port);
2178 void  DiagEEPROM(USHORT p_port);
2179 #else
2180 void  XbowInit(ULONG port, UCHAR scamFlg);
2181 void  BusMasterInit(ULONG p_port);
2182 int   DiagXbow(ULONG port);
2183 int   DiagBusMaster(ULONG port);
2184 void  DiagEEPROM(ULONG p_port);
2185 #endif
2186 
2187 
2188 
2189 
2190 #if defined(DOS)
2191 void  busMstrAbort(USHORT port);
2192 UCHAR busMstrTimeOut(USHORT port);
2193 void  dataXferProcessor(USHORT port, PSCCBcard pCurrCard);
2194 void  busMstrSGDataXferStart(USHORT port, PSCCB pCurrSCCB);
2195 void  busMstrDataXferStart(USHORT port, PSCCB pCurrSCCB);
2196 void  hostDataXferAbort(USHORT port, UCHAR p_card, PSCCB pCurrSCCB);
2197 #else
2198 void  busMstrAbort(ULONG port);
2199 UCHAR busMstrTimeOut(ULONG port);
2200 void  dataXferProcessor(ULONG port, PSCCBcard pCurrCard);
2201 void  busMstrSGDataXferStart(ULONG port, PSCCB pCurrSCCB);
2202 void  busMstrDataXferStart(ULONG port, PSCCB pCurrSCCB);
2203 void  hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB);
2204 #endif
2205 void  hostDataXferRestart(PSCCB currSCCB);
2206 
2207 
2208 #if defined (DOS)
2209 UCHAR SccbMgr_bad_isr(USHORT p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int);
2210 #else
2211 UCHAR SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int);
2212 
2213 #endif
2214 
2215 void  SccbMgrTableInitAll(void);
2216 void  SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card);
2217 void  SccbMgrTableInitTarget(UCHAR p_card, UCHAR target);
2218 
2219 
2220 
2221 void  scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up);
2222 
2223 #if defined(DOS)
2224 int   scarb(USHORT p_port, UCHAR p_sel_type);
2225 void  scbusf(USHORT p_port);
2226 void  scsel(USHORT p_port);
2227 void  scasid(UCHAR p_card, USHORT p_port);
2228 UCHAR scxferc(USHORT p_port, UCHAR p_data);
2229 UCHAR scsendi(USHORT p_port, UCHAR p_id_string[]);
2230 UCHAR sciso(USHORT p_port, UCHAR p_id_string[]);
2231 void  scwirod(USHORT p_port, UCHAR p_data_bit);
2232 void  scwiros(USHORT p_port, UCHAR p_data_bit);
2233 UCHAR scvalq(UCHAR p_quintet);
2234 UCHAR scsell(USHORT p_port, UCHAR targ_id);
2235 void  scwtsel(USHORT p_port);
2236 void  inisci(UCHAR p_card, USHORT p_port, UCHAR p_our_id);
2237 void  scsavdi(UCHAR p_card, USHORT p_port);
2238 #else
2239 int   scarb(ULONG p_port, UCHAR p_sel_type);
2240 void  scbusf(ULONG p_port);
2241 void  scsel(ULONG p_port);
2242 void  scasid(UCHAR p_card, ULONG p_port);
2243 UCHAR scxferc(ULONG p_port, UCHAR p_data);
2244 UCHAR scsendi(ULONG p_port, UCHAR p_id_string[]);
2245 UCHAR sciso(ULONG p_port, UCHAR p_id_string[]);
2246 void  scwirod(ULONG p_port, UCHAR p_data_bit);
2247 void  scwiros(ULONG p_port, UCHAR p_data_bit);
2248 UCHAR scvalq(UCHAR p_quintet);
2249 UCHAR scsell(ULONG p_port, UCHAR targ_id);
2250 void  scwtsel(ULONG p_port);
2251 void  inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id);
2252 void  scsavdi(UCHAR p_card, ULONG p_port);
2253 #endif
2254 UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[]);
2255 
2256 
2257 #if defined(DOS)
2258 void  autoCmdCmplt(USHORT p_port, UCHAR p_card);
2259 void  autoLoadDefaultMap(USHORT p_port);
2260 #else
2261 void  autoCmdCmplt(ULONG p_port, UCHAR p_card);
2262 void  autoLoadDefaultMap(ULONG p_port);
2263 #endif
2264 
2265 
2266 
2267 #if (FW_TYPE==_SCCB_MGR_)
2268 	void  OS_start_timer(unsigned long ioport, unsigned long timeout);
2269 	void  OS_stop_timer(unsigned long ioport, unsigned long timeout);
2270 	void  OS_disable_int(unsigned char intvec);
2271 	void  OS_enable_int(unsigned char intvec);
2272 	void  OS_delay(unsigned long count);
2273 	int   OS_VirtToPhys(u32bits CardHandle, u32bits *physaddr, u32bits *virtaddr);
2274 	#if !(defined(UNIX) || defined(OS2) || defined(SOLARIS_REAL_MODE))
2275 	void  OS_Lock(PSCCBMGR_INFO pCardInfo);
2276 	void  OS_UnLock(PSCCBMGR_INFO pCardInfo);
2277 #endif // if FW_TYPE == ...
2278 
2279 #endif
2280 
2281 extern SCCBCARD BL_Card[MAX_CARDS];
2282 extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
2283 
2284 
2285 #if defined(OS2)
2286    extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
2287 #else
2288    #if defined(DOS)
2289       extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
2290    #else
2291       extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
2292    #endif
2293 #endif
2294 
2295 extern SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR];
2296 extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
2297 #if defined(DOS) || defined(OS2)
2298 extern UCHAR temp_id_string[ID_STRING_LENGTH];
2299 #endif
2300 extern UCHAR scamHAString[];
2301 
2302 
2303 extern UCHAR mbCards;
2304 #if defined(BUGBUG)
2305 extern UCHAR debug_int[MAX_CARDS][debug_size];
2306 extern UCHAR debug_index[MAX_CARDS];
2307 void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
2308 #endif
2309 
2310 #if (FW_TYPE==_SCCB_MGR_)
2311 #if defined(DOS)
2312    extern UCHAR first_time;
2313 #endif
2314 #endif /* (FW_TYPE==_SCCB_MGR_) */
2315 
2316 #if (FW_TYPE==_UCB_MGR_)
2317 #if defined(DOS)
2318    extern u08bits first_time;
2319 #endif
2320 #endif /* (FW_TYPE==_UCB_MGR_) */
2321 
2322 #if defined(BUGBUG)
2323 void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
2324 #endif
2325 
2326 extern unsigned int SccbGlobalFlags;
2327 
2328 
2329 #ident "$Id: sccb.c 1.18 1997/06/10 16:47:04 mohan Exp $"
2330 /*----------------------------------------------------------------------
2331  *
2332  *
2333  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
2334  *
2335  *   This file is available under both the GNU General Public License
2336  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
2337  *
2338  *   $Workfile:   sccb.c  $
2339  *
2340  *   Description:  Functions relating to handling of the SCCB interface
2341  *                 between the device driver and the HARPOON.
2342  *
2343  *   $Date: 1997/06/10 16:47:04 $
2344  *
2345  *   $Revision: 1.18 $
2346  *
2347  *----------------------------------------------------------------------*/
2348 
2349 /*#include <globals.h>*/
2350 
2351 #if (FW_TYPE==_UCB_MGR_)
2352 	/*#include <budi.h>*/
2353 	/*#include <budioctl.h>*/
2354 #endif
2355 
2356 /*#include <sccbmgr.h>*/
2357 /*#include <blx30.h>*/
2358 /*#include <target.h>*/
2359 /*#include <eeprom.h>*/
2360 /*#include <scsi2.h>*/
2361 /*#include <harpoon.h>*/
2362 
2363 
2364 
2365 #if (FW_TYPE==_SCCB_MGR_)
2366 #define mOS_Lock(card)    OS_Lock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
2367 #define mOS_UnLock(card)  OS_UnLock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
2368 #else /* FW_TYPE==_UCB_MGR_ */
2369 #define mOS_Lock(card)    OS_Lock((u32bits)(((PSCCBcard)card)->ioPort))
2370 #define mOS_UnLock(card)  OS_UnLock((u32bits)(((PSCCBcard)card)->ioPort))
2371 #endif
2372 
2373 
2374 /*
2375 extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
2376 extern SCCBCARD BL_Card[MAX_CARDS];
2377 
2378 extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
2379 extern UCHAR mbCards;
2380 
2381 #if defined (OS2)
2382    extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
2383 #else
2384    #if defined(DOS)
2385       extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
2386    #else
2387       extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
2388    #endif
2389 #endif
2390 
2391 
2392 #if defined(BUGBUG)
2393 extern UCHAR debug_int[MAX_CARDS][debug_size];
2394 extern UCHAR debug_index[MAX_CARDS];
2395 void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
2396 #endif
2397 */
2398 
2399 #if (FW_TYPE==_SCCB_MGR_)
2400 
2401 /*---------------------------------------------------------------------
2402  *
2403  * Function: SccbMgr_sense_adapter
2404  *
2405  * Description: Setup and/or Search for cards and return info to caller.
2406  *
2407  *---------------------------------------------------------------------*/
2408 
SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)2409 int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
2410 {
2411 #if defined(DOS)
2412 #else
2413    static UCHAR first_time = 1;
2414 #endif
2415 
2416    UCHAR i,j,id,ScamFlg;
2417    USHORT temp,temp2,temp3,temp4,temp5,temp6;
2418 #if defined(DOS)
2419    USHORT ioport;
2420 #else
2421    ULONG ioport;
2422 #endif
2423 	PNVRamInfo pCurrNvRam;
2424 
2425 #if defined(DOS)
2426    ioport = (USHORT)pCardInfo->si_baseaddr;
2427 #else
2428    ioport = pCardInfo->si_baseaddr;
2429 #endif
2430 
2431 
2432    if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
2433       return((int)FAILURE);
2434 
2435    if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
2436       return((int)FAILURE);
2437 
2438    if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
2439       return((int)FAILURE);
2440 
2441    if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
2442       return((int)FAILURE);
2443 
2444 
2445    if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
2446 
2447 /* For new Harpoon then check for sub_device ID LSB
2448    the bits(0-3) must be all ZERO for compatible with
2449    current version of SCCBMgr, else skip this Harpoon
2450 	device. */
2451 
2452 	   if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
2453 	      return((int)FAILURE);
2454 	}
2455 
2456    if (first_time)
2457       {
2458       SccbMgrTableInitAll();
2459       first_time = 0;
2460 		mbCards = 0;
2461       }
2462 
2463 	if(RdStack(ioport, 0) != 0x00) {
2464 		if(ChkIfChipInitialized(ioport) == FALSE)
2465 		{
2466 			pCurrNvRam = NULL;
2467 		   WR_HARPOON(ioport+hp_semaphore, 0x00);
2468 			XbowInit(ioport, 0);             /*Must Init the SCSI before attempting */
2469 			DiagEEPROM(ioport);
2470 		}
2471 		else
2472 		{
2473 			if(mbCards < MAX_MB_CARDS) {
2474 				pCurrNvRam = &nvRamInfo[mbCards];
2475 				mbCards++;
2476 				pCurrNvRam->niBaseAddr = ioport;
2477 				RNVRamData(pCurrNvRam);
2478 			}else
2479 				return((int) FAILURE);
2480 		}
2481 	}else
2482 		pCurrNvRam = NULL;
2483 #if defined (NO_BIOS_OPTION)
2484 	pCurrNvRam = NULL;
2485    XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
2486    DiagEEPROM(ioport);
2487 #endif  /* No BIOS Option */
2488 
2489    WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
2490    WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
2491 
2492 	if(pCurrNvRam)
2493 		pCardInfo->si_id = pCurrNvRam->niAdapId;
2494 	else
2495 	   pCardInfo->si_id = (UCHAR)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
2496    	   (UCHAR)0x0FF);
2497 
2498    pCardInfo->si_lun = 0x00;
2499    pCardInfo->si_fw_revision = ORION_FW_REV;
2500    temp2 = 0x0000;
2501    temp3 = 0x0000;
2502    temp4 = 0x0000;
2503    temp5 = 0x0000;
2504    temp6 = 0x0000;
2505 
2506    for (id = 0; id < (16/2); id++) {
2507 
2508 		if(pCurrNvRam){
2509 			temp = (USHORT) pCurrNvRam->niSyncTbl[id];
2510 			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
2511 					 (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
2512 		}else
2513 	      temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
2514 
2515       for (i = 0; i < 2; temp >>=8,i++) {
2516 
2517          temp2 >>= 1;
2518          temp3 >>= 1;
2519          temp4 >>= 1;
2520          temp5 >>= 1;
2521          temp6 >>= 1;
2522 	 switch (temp & 0x3)
2523 	   {
2524 	   case AUTO_RATE_20:	/* Synchronous, 20 mega-transfers/second */
2525 	     temp6 |= 0x8000;	/* Fall through */
2526 	   case AUTO_RATE_10:	/* Synchronous, 10 mega-transfers/second */
2527 	     temp5 |= 0x8000;	/* Fall through */
2528 	   case AUTO_RATE_05:	/* Synchronous, 5 mega-transfers/second */
2529 	     temp2 |= 0x8000;	/* Fall through */
2530 	   case AUTO_RATE_00:	/* Asynchronous */
2531 	     break;
2532 	   }
2533 
2534          if (temp & DISC_ENABLE_BIT)
2535 	   temp3 |= 0x8000;
2536 
2537          if (temp & WIDE_NEGO_BIT)
2538 	   temp4 |= 0x8000;
2539 
2540          }
2541       }
2542 
2543    pCardInfo->si_per_targ_init_sync = temp2;
2544    pCardInfo->si_per_targ_no_disc = temp3;
2545    pCardInfo->si_per_targ_wide_nego = temp4;
2546    pCardInfo->si_per_targ_fast_nego = temp5;
2547    pCardInfo->si_per_targ_ultra_nego = temp6;
2548 
2549 	if(pCurrNvRam)
2550 		i = pCurrNvRam->niSysConf;
2551 	else
2552 	   i = (UCHAR)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
2553 
2554 	if(pCurrNvRam)
2555 		ScamFlg = pCurrNvRam->niScamConf;
2556 	else
2557 	   ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
2558 
2559    pCardInfo->si_flags = 0x0000;
2560 
2561    if (i & 0x01)
2562       pCardInfo->si_flags |= SCSI_PARITY_ENA;
2563 
2564    if (!(i & 0x02))
2565       pCardInfo->si_flags |= SOFT_RESET;
2566 
2567    if (i & 0x10)
2568       pCardInfo->si_flags |= EXTENDED_TRANSLATION;
2569 
2570    if (ScamFlg & SCAM_ENABLED)
2571      pCardInfo->si_flags |= FLAG_SCAM_ENABLED;
2572 
2573    if (ScamFlg & SCAM_LEVEL2)
2574      pCardInfo->si_flags |= FLAG_SCAM_LEVEL2;
2575 
2576    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
2577    if (i & 0x04) {
2578       j |= SCSI_TERM_ENA_L;
2579       }
2580    WR_HARPOON(ioport+hp_bm_ctrl, j );
2581 
2582    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
2583    if (i & 0x08) {
2584       j |= SCSI_TERM_ENA_H;
2585       }
2586    WR_HARPOON(ioport+hp_ee_ctrl, j );
2587 
2588    if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
2589 
2590       pCardInfo->si_flags |= SUPPORT_16TAR_32LUN;
2591 
2592    pCardInfo->si_card_family = HARPOON_FAMILY;
2593    pCardInfo->si_bustype = BUSTYPE_PCI;
2594 
2595 	if(pCurrNvRam){
2596    	pCardInfo->si_card_model[0] = '9';
2597 		switch(pCurrNvRam->niModel & 0x0f){
2598 			case MODEL_LT:
2599 		   	pCardInfo->si_card_model[1] = '3';
2600 		   	pCardInfo->si_card_model[2] = '0';
2601 				break;
2602 			case MODEL_LW:
2603 		   	pCardInfo->si_card_model[1] = '5';
2604 		   	pCardInfo->si_card_model[2] = '0';
2605 				break;
2606 			case MODEL_DL:
2607 		   	pCardInfo->si_card_model[1] = '3';
2608 		   	pCardInfo->si_card_model[2] = '2';
2609 				break;
2610 			case MODEL_DW:
2611 		   	pCardInfo->si_card_model[1] = '5';
2612 		   	pCardInfo->si_card_model[2] = '2';
2613 				break;
2614 		}
2615 	}else{
2616 	   temp = utilEERead(ioport, (MODEL_NUMB_0/2));
2617    	pCardInfo->si_card_model[0] = (UCHAR)(temp >> 8);
2618 	   temp = utilEERead(ioport, (MODEL_NUMB_2/2));
2619 
2620    	pCardInfo->si_card_model[1] = (UCHAR)(temp & 0x00FF);
2621 	   pCardInfo->si_card_model[2] = (UCHAR)(temp >> 8);
2622 	}
2623 
2624    if (pCardInfo->si_card_model[1] == '3')
2625      {
2626        if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
2627 	 pCardInfo->si_flags |= LOW_BYTE_TERM;
2628      }
2629    else if (pCardInfo->si_card_model[2] == '0')
2630      {
2631        temp = RD_HARPOON(ioport+hp_xfer_pad);
2632        WR_HARPOON(ioport+hp_xfer_pad, (temp & ~BIT(4)));
2633        if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
2634 	 pCardInfo->si_flags |= LOW_BYTE_TERM;
2635        WR_HARPOON(ioport+hp_xfer_pad, (temp | BIT(4)));
2636        if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
2637 	 pCardInfo->si_flags |= HIGH_BYTE_TERM;
2638        WR_HARPOON(ioport+hp_xfer_pad, temp);
2639      }
2640    else
2641      {
2642        temp = RD_HARPOON(ioport+hp_ee_ctrl);
2643        temp2 = RD_HARPOON(ioport+hp_xfer_pad);
2644        WR_HARPOON(ioport+hp_ee_ctrl, (temp | SEE_CS));
2645        WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
2646        temp3 = 0;
2647        for (i = 0; i < 8; i++)
2648 	 {
2649 	   temp3 <<= 1;
2650 	   if (!(RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7)))
2651 	     temp3 |= 1;
2652 	   WR_HARPOON(ioport+hp_xfer_pad, (temp2 & ~BIT(4)));
2653 	   WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
2654 	 }
2655        WR_HARPOON(ioport+hp_ee_ctrl, temp);
2656        WR_HARPOON(ioport+hp_xfer_pad, temp2);
2657        if (!(temp3 & BIT(7)))
2658 	 pCardInfo->si_flags |= LOW_BYTE_TERM;
2659        if (!(temp3 & BIT(6)))
2660 	 pCardInfo->si_flags |= HIGH_BYTE_TERM;
2661      }
2662 
2663 
2664    ARAM_ACCESS(ioport);
2665 
2666    for ( i = 0; i < 4; i++ ) {
2667 
2668       pCardInfo->si_XlatInfo[i] =
2669          RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
2670       }
2671 
2672 	/* return with -1 if no sort, else return with
2673 	   logical card number sorted by BIOS (zero-based) */
2674 
2675 	pCardInfo->si_relative_cardnum =
2676 	(UCHAR)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1);
2677 
2678    SGRAM_ACCESS(ioport);
2679 
2680    s_PhaseTbl[0] = phaseDataOut;
2681    s_PhaseTbl[1] = phaseDataIn;
2682    s_PhaseTbl[2] = phaseIllegal;
2683    s_PhaseTbl[3] = phaseIllegal;
2684    s_PhaseTbl[4] = phaseCommand;
2685    s_PhaseTbl[5] = phaseStatus;
2686    s_PhaseTbl[6] = phaseMsgOut;
2687    s_PhaseTbl[7] = phaseMsgIn;
2688 
2689    pCardInfo->si_present = 0x01;
2690 
2691 #if defined(BUGBUG)
2692 
2693 
2694    for (i = 0; i < MAX_CARDS; i++) {
2695 
2696       for (id=0; id<debug_size; id++)
2697          debug_int[i][id] =  (UCHAR)0x00;
2698       debug_index[i] = 0;
2699       }
2700 
2701 #endif
2702 
2703    return(0);
2704 }
2705 
2706 
2707 /*---------------------------------------------------------------------
2708  *
2709  * Function: SccbMgr_config_adapter
2710  *
2711  * Description: Setup adapter for normal operation (hard reset).
2712  *
2713  *---------------------------------------------------------------------*/
2714 
2715 #if defined(DOS)
SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)2716 USHORT SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
2717 #else
2718 ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
2719 #endif
2720 {
2721    PSCCBcard CurrCard = NULL;
2722 	PNVRamInfo pCurrNvRam;
2723    UCHAR i,j,thisCard, ScamFlg;
2724    USHORT temp,sync_bit_map,id;
2725 #if defined(DOS)
2726    USHORT ioport;
2727 #else
2728    ULONG ioport;
2729 #endif
2730 
2731 #if defined(DOS)
2732    ioport = (USHORT)pCardInfo->si_baseaddr;
2733 #else
2734    ioport = pCardInfo->si_baseaddr;
2735 #endif
2736 
2737    for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
2738 
2739       if (thisCard == MAX_CARDS) {
2740 
2741 	 return(FAILURE);
2742          }
2743 
2744       if (BL_Card[thisCard].ioPort == ioport) {
2745 
2746          CurrCard = &BL_Card[thisCard];
2747          SccbMgrTableInitCard(CurrCard,thisCard);
2748          break;
2749          }
2750 
2751       else if (BL_Card[thisCard].ioPort == 0x00) {
2752 
2753          BL_Card[thisCard].ioPort = ioport;
2754          CurrCard = &BL_Card[thisCard];
2755 
2756 			if(mbCards)
2757 				for(i = 0; i < mbCards; i++){
2758 					if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
2759 						CurrCard->pNvRamInfo = &nvRamInfo[i];
2760 				}
2761          SccbMgrTableInitCard(CurrCard,thisCard);
2762          CurrCard->cardIndex = thisCard;
2763          CurrCard->cardInfo = pCardInfo;
2764 
2765 	 break;
2766          }
2767       }
2768 
2769 	pCurrNvRam = CurrCard->pNvRamInfo;
2770 
2771 	if(pCurrNvRam){
2772 		ScamFlg = pCurrNvRam->niScamConf;
2773 	}
2774 	else{
2775 	   ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
2776 	}
2777 
2778 
2779    BusMasterInit(ioport);
2780    XbowInit(ioport, ScamFlg);
2781 
2782 #if defined (NO_BIOS_OPTION)
2783 
2784 
2785    if (DiagXbow(ioport)) return(FAILURE);
2786    if (DiagBusMaster(ioport)) return(FAILURE);
2787 
2788 #endif  /* No BIOS Option */
2789 
2790    autoLoadDefaultMap(ioport);
2791 
2792 
2793    for (i = 0,id = 0x01; i != pCardInfo->si_id; i++,id <<= 1){}
2794 
2795    WR_HARPOON(ioport+hp_selfid_0, id);
2796    WR_HARPOON(ioport+hp_selfid_1, 0x00);
2797    WR_HARPOON(ioport+hp_arb_id, pCardInfo->si_id);
2798    CurrCard->ourId = pCardInfo->si_id;
2799 
2800    i = (UCHAR) pCardInfo->si_flags;
2801    if (i & SCSI_PARITY_ENA)
2802        WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
2803 
2804    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
2805    if (i & LOW_BYTE_TERM)
2806       j |= SCSI_TERM_ENA_L;
2807    WR_HARPOON(ioport+hp_bm_ctrl, j);
2808 
2809    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
2810    if (i & HIGH_BYTE_TERM)
2811       j |= SCSI_TERM_ENA_H;
2812    WR_HARPOON(ioport+hp_ee_ctrl, j );
2813 
2814 
2815    if (!(pCardInfo->si_flags & SOFT_RESET)) {
2816 
2817       sresb(ioport,thisCard);
2818 
2819          scini(thisCard, pCardInfo->si_id, 0);
2820       }
2821 
2822 
2823 
2824    if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
2825       CurrCard->globalFlags |= F_NO_FILTER;
2826 
2827 	if(pCurrNvRam){
2828 		if(pCurrNvRam->niSysConf & 0x10)
2829 			CurrCard->globalFlags |= F_GREEN_PC;
2830 	}
2831 	else{
2832 	   if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
2833    	   CurrCard->globalFlags |= F_GREEN_PC;
2834 	}
2835 
2836 	/* Set global flag to indicate Re-Negotiation to be done on all
2837 		ckeck condition */
2838 	if(pCurrNvRam){
2839 		if(pCurrNvRam->niScsiConf & 0x04)
2840 			CurrCard->globalFlags |= F_DO_RENEGO;
2841 	}
2842 	else{
2843 	   if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
2844    	   CurrCard->globalFlags |= F_DO_RENEGO;
2845 	}
2846 
2847 	if(pCurrNvRam){
2848 		if(pCurrNvRam->niScsiConf & 0x08)
2849 			CurrCard->globalFlags |= F_CONLUN_IO;
2850 	}
2851 	else{
2852 	   if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
2853    	   CurrCard->globalFlags |= F_CONLUN_IO;
2854 	}
2855 
2856 
2857    temp = pCardInfo->si_per_targ_no_disc;
2858 
2859    for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
2860 
2861       if (temp & id)
2862 	 sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
2863       }
2864 
2865    sync_bit_map = 0x0001;
2866 
2867    for (id = 0; id < (MAX_SCSI_TAR/2); id++) {
2868 
2869 		if(pCurrNvRam){
2870 			temp = (USHORT) pCurrNvRam->niSyncTbl[id];
2871 			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
2872 					 (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
2873 		}else
2874 	      temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
2875 
2876       for (i = 0; i < 2; temp >>=8,i++) {
2877 
2878          if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
2879 
2880             sccbMgrTbl[thisCard][id*2+i].TarEEValue = (UCHAR)temp;
2881             }
2882 
2883          else {
2884 	    sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
2885             sccbMgrTbl[thisCard][id*2+i].TarEEValue =
2886                (UCHAR)(temp & ~EE_SYNC_MASK);
2887             }
2888 
2889 #if defined(WIDE_SCSI)
2890 /*         if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
2891             (id*2+i >= 8)){
2892 */
2893          if (pCardInfo->si_per_targ_wide_nego & sync_bit_map){
2894 
2895             sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
2896 
2897             }
2898 
2899          else { /* NARROW SCSI */
2900             sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
2901             }
2902 
2903 #else
2904          sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
2905 #endif
2906 
2907 
2908 	 sync_bit_map <<= 1;
2909 
2910 
2911 
2912          }
2913       }
2914 
2915    WR_HARPOON((ioport+hp_semaphore),
2916       (UCHAR)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
2917 
2918 #if defined(DOS)
2919    return((USHORT)CurrCard);
2920 #else
2921    return((ULONG)CurrCard);
2922 #endif
2923 }
2924 
2925 #else  			/* end (FW_TYPE==_SCCB_MGR_)  */
2926 
2927 
2928 
FP_PresenceCheck(PMGR_INFO pMgrInfo)2929 STATIC s16bits FP_PresenceCheck(PMGR_INFO pMgrInfo)
2930 {
2931 	PMGR_ENTRYPNTS	pMgr_EntryPnts = &pMgrInfo->mi_Functions;
2932 
2933       pMgr_EntryPnts->UCBMgr_probe_adapter = probe_adapter;
2934       pMgr_EntryPnts->UCBMgr_init_adapter = init_adapter;
2935       pMgr_EntryPnts->UCBMgr_start_UCB = SccbMgr_start_sccb;
2936       pMgr_EntryPnts->UCBMgr_build_UCB = build_UCB;
2937       pMgr_EntryPnts->UCBMgr_abort_UCB = SccbMgr_abort_sccb;
2938       pMgr_EntryPnts->UCBMgr_my_int = SccbMgr_my_int;
2939       pMgr_EntryPnts->UCBMgr_isr = SccbMgr_isr;
2940       pMgr_EntryPnts->UCBMgr_scsi_reset = SccbMgr_scsi_reset;
2941       pMgr_EntryPnts->UCBMgr_timer_expired = SccbMgr_timer_expired;
2942 #ifndef NO_IOCTLS
2943 	  pMgr_EntryPnts->UCBMgr_unload_card = SccbMgr_unload_card;
2944 	  pMgr_EntryPnts->UCBMgr_save_foreign_state =
2945 	  									SccbMgr_save_foreign_state;
2946 	  pMgr_EntryPnts->UCBMgr_restore_foreign_state =
2947 	  									SccbMgr_restore_foreign_state;
2948 	  pMgr_EntryPnts->UCBMgr_restore_native_state =
2949 	  									SccbMgr_restore_native_state;
2950 #endif /*NO_IOCTLS*/
2951 
2952       pMgrInfo->mi_SGListFormat=0x01;
2953       pMgrInfo->mi_DataPtrFormat=0x01;
2954       pMgrInfo->mi_MaxSGElements= (u16bits) 0xffffffff;
2955       pMgrInfo->mi_MgrPrivateLen=sizeof(SCCB);
2956       pMgrInfo->mi_PCIVendorID=BL_VENDOR_ID;
2957       pMgrInfo->mi_PCIDeviceID=FP_DEVICE_ID;
2958       pMgrInfo->mi_MgrAttributes= ATTR_IO_MAPPED +
2959 											 ATTR_PHYSICAL_ADDRESS +
2960 											 ATTR_VIRTUAL_ADDRESS +
2961 											 ATTR_OVERLAPPED_IO_IOCTLS_OK;
2962       pMgrInfo->mi_IoRangeLen = 256;
2963       return(0);
2964 }
2965 
2966 
2967 
2968 /*---------------------------------------------------------------------
2969  *
2970  * Function: probe_adapter
2971  *
2972  * Description: Setup and/or Search for cards and return info to caller.
2973  *
2974  *---------------------------------------------------------------------*/
probe_adapter(PADAPTER_INFO pAdapterInfo)2975 STATIC s32bits probe_adapter(PADAPTER_INFO pAdapterInfo)
2976 {
2977    u16bits temp,temp2,temp3,temp4;
2978    u08bits i,j,id;
2979 
2980 #if defined(DOS)
2981 #else
2982    static u08bits first_time = 1;
2983 #endif
2984    BASE_PORT ioport;
2985 	PNVRamInfo pCurrNvRam;
2986 
2987    ioport = (BASE_PORT)pAdapterInfo->ai_baseaddr;
2988 
2989 
2990 
2991    if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
2992       return(1);
2993 
2994    if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
2995       return(2);
2996 
2997    if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
2998       return(3);
2999 
3000    if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
3001       return(4);
3002 
3003 
3004    if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
3005 
3006 
3007 /* For new Harpoon then check for sub_device ID LSB
3008    the bits(0-3) must be all ZERO for compatible with
3009    current version of SCCBMgr, else skip this Harpoon
3010 	device. */
3011 
3012 	   if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
3013 	      return(5);
3014 	}
3015 
3016    if (first_time) {
3017 
3018       SccbMgrTableInitAll();
3019       first_time = 0;
3020 		mbCards = 0;
3021       }
3022 
3023 	if(RdStack(ioport, 0) != 0x00) {
3024 		if(ChkIfChipInitialized(ioport) == FALSE)
3025 		{
3026 			pCurrNvRam = NULL;
3027 		   WR_HARPOON(ioport+hp_semaphore, 0x00);
3028 			XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
3029 			DiagEEPROM(ioport);
3030 		}
3031 		else
3032 		{
3033 			if(mbCards < MAX_MB_CARDS) {
3034 				pCurrNvRam = &nvRamInfo[mbCards];
3035 				mbCards++;
3036 				pCurrNvRam->niBaseAddr = ioport;
3037 				RNVRamData(pCurrNvRam);
3038 			}else
3039 				return((int) FAILURE);
3040 		}
3041 	}else
3042 		pCurrNvRam = NULL;
3043 
3044 #if defined (NO_BIOS_OPTION)
3045 	pCurrNvRam = NULL;
3046    XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
3047    DiagEEPROM(ioport);
3048 #endif  /* No BIOS Option */
3049 
3050    WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
3051    WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
3052 
3053 	if(pCurrNvRam)
3054 		pAdapterInfo->ai_id = pCurrNvRam->niAdapId;
3055 	else
3056    	pAdapterInfo->ai_id = (u08bits)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
3057       	(u08bits)0x0FF);
3058 
3059    pAdapterInfo->ai_lun = 0x00;
3060    pAdapterInfo->ai_fw_revision[0] = '3';
3061    pAdapterInfo->ai_fw_revision[1] = '1';
3062    pAdapterInfo->ai_fw_revision[2] = '1';
3063    pAdapterInfo->ai_fw_revision[3] = ' ';
3064    pAdapterInfo->ai_NumChannels = 1;
3065 
3066    temp2 = 0x0000;
3067    temp3 = 0x0000;
3068    temp4 = 0x0000;
3069 
3070    for (id = 0; id < (16/2); id++) {
3071 
3072 		if(pCurrNvRam){
3073 			temp = (USHORT) pCurrNvRam->niSyncTbl[id];
3074 			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
3075 					 (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
3076 		}else
3077 	      temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
3078 
3079       for (i = 0; i < 2; temp >>=8,i++) {
3080 
3081          if ((temp & 0x03) != AUTO_RATE_00) {
3082 
3083             temp2 >>= 0x01;
3084             temp2 |= 0x8000;
3085             }
3086 
3087          else {
3088             temp2 >>= 0x01;
3089             }
3090 
3091          if (temp & DISC_ENABLE_BIT) {
3092 
3093             temp3 >>= 0x01;
3094             temp3 |= 0x8000;
3095             }
3096 
3097          else {
3098             temp3 >>= 0x01;
3099             }
3100 
3101          if (temp & WIDE_NEGO_BIT) {
3102 
3103             temp4 >>= 0x01;
3104             temp4 |= 0x8000;
3105             }
3106 
3107          else {
3108             temp4 >>= 0x01;
3109             }
3110 
3111          }
3112       }
3113 
3114    pAdapterInfo->ai_per_targ_init_sync = temp2;
3115    pAdapterInfo->ai_per_targ_no_disc = temp3;
3116    pAdapterInfo->ai_per_targ_wide_nego = temp4;
3117 	if(pCurrNvRam)
3118 		i = pCurrNvRam->niSysConf;
3119 	else
3120    	i = (u08bits)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
3121 
3122    /*
3123    ** interrupts always level-triggered for FlashPoint
3124    */
3125    pAdapterInfo->ai_stateinfo |= LEVEL_TRIG;
3126 
3127    if (i & 0x01)
3128       pAdapterInfo->ai_stateinfo |= SCSI_PARITY_ENA;
3129 
3130 	if (i & 0x02)	/* SCSI Bus reset in AutoSCSI Set ? */
3131 	{
3132 		if(pCurrNvRam)
3133 		{
3134 			j = pCurrNvRam->niScamConf;
3135 		}
3136 		else
3137 		{
3138 		j = (u08bits) utilEERead(ioport, SCAM_CONFIG/2);
3139 		}
3140 		if(j & SCAM_ENABLED)
3141 		{
3142 			if(j & SCAM_LEVEL2)
3143 			{
3144 				pAdapterInfo->ai_stateinfo |= SCAM2_ENA;
3145 			}
3146 			else
3147 			{
3148 				pAdapterInfo->ai_stateinfo |= SCAM1_ENA;
3149 			}
3150 		}
3151 	}
3152    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
3153    if (i & 0x04) {
3154       j |= SCSI_TERM_ENA_L;
3155       pAdapterInfo->ai_stateinfo |= LOW_BYTE_TERM_ENA;
3156       }
3157    WR_HARPOON(ioport+hp_bm_ctrl, j );
3158 
3159    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
3160    if (i & 0x08) {
3161       j |= SCSI_TERM_ENA_H;
3162       pAdapterInfo->ai_stateinfo |= HIGH_BYTE_TERM_ENA;
3163       }
3164    WR_HARPOON(ioport+hp_ee_ctrl, j );
3165 
3166 	if(RD_HARPOON(ioport + hp_page_ctrl) & BIOS_SHADOW)
3167 	{
3168 		pAdapterInfo->ai_FlashRomSize = 64 * 1024;	/* 64k ROM */
3169 	}
3170 	else
3171 	{
3172 		pAdapterInfo->ai_FlashRomSize = 32 * 1024;	/* 32k ROM */
3173 	}
3174 
3175    pAdapterInfo->ai_stateinfo |= (FAST20_ENA | TAG_QUEUE_ENA);
3176    if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
3177 	{
3178       pAdapterInfo->ai_attributes |= (WIDE_CAPABLE | FAST20_CAPABLE
3179 													| SCAM2_CAPABLE
3180 													| TAG_QUEUE_CAPABLE
3181 													| SUPRESS_UNDERRRUNS_CAPABLE
3182 													| SCSI_PARITY_CAPABLE);
3183 		pAdapterInfo->ai_MaxTarg = 16;
3184 		pAdapterInfo->ai_MaxLun  = 32;
3185 	}
3186 	else
3187 	{
3188       pAdapterInfo->ai_attributes |= (FAST20_CAPABLE | SCAM2_CAPABLE
3189 													| TAG_QUEUE_CAPABLE
3190 													| SUPRESS_UNDERRRUNS_CAPABLE
3191 													| SCSI_PARITY_CAPABLE);
3192 		pAdapterInfo->ai_MaxTarg = 8;
3193 		pAdapterInfo->ai_MaxLun  = 8;
3194 	}
3195 
3196    pAdapterInfo->ai_product_family = HARPOON_FAMILY;
3197    pAdapterInfo->ai_HBAbustype = BUSTYPE_PCI;
3198 
3199    for (i=0;i<CARD_MODEL_NAMELEN;i++)
3200    {
3201       pAdapterInfo->ai_card_model[i]=' '; /* initialize the ai_card_model */
3202    }
3203 
3204 	if(pCurrNvRam){
3205 	pAdapterInfo->ai_card_model[0] = '9';
3206 		switch(pCurrNvRam->niModel & 0x0f){
3207 			case MODEL_LT:
3208 			pAdapterInfo->ai_card_model[1] = '3';
3209 			pAdapterInfo->ai_card_model[2] = '0';
3210 				break;
3211 			case MODEL_LW:
3212 			pAdapterInfo->ai_card_model[1] = '5';
3213 			pAdapterInfo->ai_card_model[2] = '0';
3214 				break;
3215 			case MODEL_DL:
3216 			pAdapterInfo->ai_card_model[1] = '3';
3217 			pAdapterInfo->ai_card_model[2] = '2';
3218 				break;
3219 			case MODEL_DW:
3220 			pAdapterInfo->ai_card_model[1] = '5';
3221 			pAdapterInfo->ai_card_model[2] = '2';
3222 				break;
3223 		}
3224 	}else{
3225 	   temp = utilEERead(ioport, (MODEL_NUMB_0/2));
3226 		pAdapterInfo->ai_card_model[0] = (u08bits)(temp >> 8);
3227 	   temp = utilEERead(ioport, (MODEL_NUMB_2/2));
3228 
3229 		pAdapterInfo->ai_card_model[1] = (u08bits)(temp & 0x00FF);
3230 	   pAdapterInfo->ai_card_model[2] = (u08bits)(temp >> 8);
3231 	}
3232 
3233 
3234 
3235    pAdapterInfo->ai_FiberProductType = 0;
3236 
3237    pAdapterInfo->ai_secondary_range = 0;
3238 
3239    for (i=0;i<WORLD_WIDE_NAMELEN;i++)
3240    {
3241       pAdapterInfo->ai_worldwidename[i]='\0';
3242    }
3243 
3244    for (i=0;i<VENDOR_NAMELEN;i++)
3245    {
3246       pAdapterInfo->ai_vendorstring[i]='\0';
3247    }
3248    	pAdapterInfo->ai_vendorstring[0]='B';
3249    	pAdapterInfo->ai_vendorstring[1]='U';
3250    	pAdapterInfo->ai_vendorstring[2]='S';
3251    	pAdapterInfo->ai_vendorstring[3]='L';
3252    	pAdapterInfo->ai_vendorstring[4]='O';
3253    	pAdapterInfo->ai_vendorstring[5]='G';
3254    	pAdapterInfo->ai_vendorstring[6]='I';
3255    	pAdapterInfo->ai_vendorstring[7]='C';
3256 
3257 	for (i=0;i<FAMILY_NAMELEN;i++)
3258 	{
3259 	   pAdapterInfo->ai_AdapterFamilyString[i]='\0';
3260 	}
3261    	pAdapterInfo->ai_AdapterFamilyString[0]='F';
3262    	pAdapterInfo->ai_AdapterFamilyString[1]='L';
3263    	pAdapterInfo->ai_AdapterFamilyString[2]='A';
3264    	pAdapterInfo->ai_AdapterFamilyString[3]='S';
3265    	pAdapterInfo->ai_AdapterFamilyString[4]='H';
3266    	pAdapterInfo->ai_AdapterFamilyString[5]='P';
3267    	pAdapterInfo->ai_AdapterFamilyString[6]='O';
3268    	pAdapterInfo->ai_AdapterFamilyString[7]='I';
3269    	pAdapterInfo->ai_AdapterFamilyString[8]='N';
3270    	pAdapterInfo->ai_AdapterFamilyString[9]='T';
3271 
3272    ARAM_ACCESS(ioport);
3273 
3274    for ( i = 0; i < 4; i++ ) {
3275 
3276       pAdapterInfo->ai_XlatInfo[i] =
3277          RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
3278       }
3279 
3280 	/* return with -1 if no sort, else return with
3281 	   logical card number sorted by BIOS (zero-based) */
3282 
3283 
3284 	pAdapterInfo->ai_relative_cardnum =
3285       (u08bits)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1);
3286 
3287    SGRAM_ACCESS(ioport);
3288 
3289    s_PhaseTbl[0] = phaseDataOut;
3290    s_PhaseTbl[1] = phaseDataIn;
3291    s_PhaseTbl[2] = phaseIllegal;
3292    s_PhaseTbl[3] = phaseIllegal;
3293    s_PhaseTbl[4] = phaseCommand;
3294    s_PhaseTbl[5] = phaseStatus;
3295    s_PhaseTbl[6] = phaseMsgOut;
3296    s_PhaseTbl[7] = phaseMsgIn;
3297 
3298    pAdapterInfo->ai_present = 0x01;
3299 
3300 #if defined(BUGBUG)
3301 
3302 
3303    for (i = 0; i < MAX_CARDS; i++) {
3304 
3305       for (id=0; id<debug_size; id++)
3306          debug_int[i][id] =  (u08bits)0x00;
3307       debug_index[i] = 0;
3308       }
3309 
3310 #endif
3311 
3312    return(0);
3313 }
3314 
3315 
3316 
3317 
3318 
3319 /*---------------------------------------------------------------------
3320  *
3321  * Function: init_adapter, exported to BUDI via UCBMgr_init_adapter entry
3322  *
3323  *
3324  * Description: Setup adapter for normal operation (hard reset).
3325  *
3326  *---------------------------------------------------------------------*/
init_adapter(PADAPTER_INFO pCardInfo)3327 STATIC CARD_HANDLE init_adapter(PADAPTER_INFO pCardInfo)
3328 {
3329    PSCCBcard CurrCard;
3330 	PNVRamInfo pCurrNvRam;
3331    u08bits i,j,thisCard, ScamFlg;
3332    u16bits temp,sync_bit_map,id;
3333    BASE_PORT ioport;
3334 
3335    ioport = (BASE_PORT)pCardInfo->ai_baseaddr;
3336 
3337    for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
3338 
3339       if (thisCard == MAX_CARDS) {
3340 
3341          return(FAILURE);
3342          }
3343 
3344       if (BL_Card[thisCard].ioPort == ioport) {
3345 
3346          CurrCard = &BL_Card[thisCard];
3347          SccbMgrTableInitCard(CurrCard,thisCard);
3348          break;
3349          }
3350 
3351       else if (BL_Card[thisCard].ioPort == 0x00) {
3352 
3353          BL_Card[thisCard].ioPort = ioport;
3354          CurrCard = &BL_Card[thisCard];
3355 
3356 			if(mbCards)
3357 				for(i = 0; i < mbCards; i++){
3358 					if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
3359 						CurrCard->pNvRamInfo = &nvRamInfo[i];
3360 				}
3361          SccbMgrTableInitCard(CurrCard,thisCard);
3362          CurrCard->cardIndex = thisCard;
3363          CurrCard->cardInfo = pCardInfo;
3364 
3365          break;
3366          }
3367       }
3368 
3369 	pCurrNvRam = CurrCard->pNvRamInfo;
3370 
3371 
3372 	if(pCurrNvRam){
3373 		ScamFlg = pCurrNvRam->niScamConf;
3374 	}
3375 	else{
3376 	   ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
3377 	}
3378 
3379 
3380    BusMasterInit(ioport);
3381    XbowInit(ioport, ScamFlg);
3382 
3383 #if defined (NO_BIOS_OPTION)
3384 
3385 
3386    if (DiagXbow(ioport)) return(FAILURE);
3387    if (DiagBusMaster(ioport)) return(FAILURE);
3388 
3389 #endif  /* No BIOS Option */
3390 
3391    autoLoadDefaultMap(ioport);
3392 
3393 
3394    for (i = 0,id = 0x01; i != pCardInfo->ai_id; i++,id <<= 1){}
3395 
3396    WR_HARPOON(ioport+hp_selfid_0, id);
3397    WR_HARPOON(ioport+hp_selfid_1, 0x00);
3398    WR_HARPOON(ioport+hp_arb_id, pCardInfo->ai_id);
3399    CurrCard->ourId = (unsigned char) pCardInfo->ai_id;
3400 
3401    i = (u08bits) pCardInfo->ai_stateinfo;
3402    if (i & SCSI_PARITY_ENA)
3403        WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
3404 
3405    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
3406    if (i & LOW_BYTE_TERM_ENA)
3407       j |= SCSI_TERM_ENA_L;
3408    WR_HARPOON(ioport+hp_bm_ctrl, j);
3409 
3410    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
3411    if (i & HIGH_BYTE_TERM_ENA)
3412       j |= SCSI_TERM_ENA_H;
3413    WR_HARPOON(ioport+hp_ee_ctrl, j );
3414 
3415 
3416    if (!(pCardInfo->ai_stateinfo & NO_RESET_IN_INIT)) {
3417 
3418       sresb(ioport,thisCard);
3419 
3420          scini(thisCard, (u08bits) pCardInfo->ai_id, 0);
3421       }
3422 
3423 
3424 
3425    if (pCardInfo->ai_stateinfo & SUPRESS_UNDERRRUNS_ENA)
3426       CurrCard->globalFlags |= F_NO_FILTER;
3427 
3428 	if(pCurrNvRam){
3429 		if(pCurrNvRam->niSysConf & 0x10)
3430 			CurrCard->globalFlags |= F_GREEN_PC;
3431 	}
3432 	else{
3433 	   if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
3434    	   CurrCard->globalFlags |= F_GREEN_PC;
3435 	}
3436 
3437 	/* Set global flag to indicate Re-Negotiation to be done on all
3438 		ckeck condition */
3439 	if(pCurrNvRam){
3440 		if(pCurrNvRam->niScsiConf & 0x04)
3441 			CurrCard->globalFlags |= F_DO_RENEGO;
3442 	}
3443 	else{
3444 	   if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
3445    	   CurrCard->globalFlags |= F_DO_RENEGO;
3446 	}
3447 
3448 	if(pCurrNvRam){
3449 		if(pCurrNvRam->niScsiConf & 0x08)
3450 			CurrCard->globalFlags |= F_CONLUN_IO;
3451 	}
3452 	else{
3453 	   if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
3454    	   CurrCard->globalFlags |= F_CONLUN_IO;
3455 	}
3456 
3457    temp = pCardInfo->ai_per_targ_no_disc;
3458 
3459    for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
3460 
3461       if (temp & id)
3462          sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
3463       }
3464 
3465    sync_bit_map = 0x0001;
3466 
3467    for (id = 0; id < (MAX_SCSI_TAR/2); id++){
3468 
3469 		if(pCurrNvRam){
3470 			temp = (USHORT) pCurrNvRam->niSyncTbl[id];
3471 			temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
3472 					 (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
3473 		}else
3474 	      temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
3475 
3476       for (i = 0; i < 2; temp >>=8,i++){
3477 
3478          if (pCardInfo->ai_per_targ_init_sync & sync_bit_map){
3479 
3480             sccbMgrTbl[thisCard][id*2+i].TarEEValue = (u08bits)temp;
3481             }
3482 
3483          else {
3484             sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
3485             sccbMgrTbl[thisCard][id*2+i].TarEEValue =
3486                (u08bits)(temp & ~EE_SYNC_MASK);
3487             }
3488 
3489 #if defined(WIDE_SCSI)
3490 /*         if ((pCardInfo->ai_per_targ_wide_nego & sync_bit_map) ||
3491             (id*2+i >= 8)){
3492 */
3493          if (pCardInfo->ai_per_targ_wide_nego & sync_bit_map){
3494 
3495             sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
3496 
3497             }
3498 
3499          else { /* NARROW SCSI */
3500             sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
3501             }
3502 
3503 #else
3504          sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
3505 #endif
3506 
3507 
3508          sync_bit_map <<= 1;
3509          }
3510       }
3511 
3512 
3513    pCardInfo->ai_SGListFormat=0x01;
3514    pCardInfo->ai_DataPtrFormat=0x01;
3515    pCardInfo->ai_AEN_mask &= SCSI_RESET_COMPLETE;
3516 
3517    WR_HARPOON((ioport+hp_semaphore),
3518       (u08bits)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
3519 
3520    return((u32bits)CurrCard);
3521 
3522 }
3523 
3524 
3525 /*---------------------------------------------------------------------
3526  *
3527  * Function: build_ucb, exported to BUDI via UCBMgr_build_ucb entry
3528  *
3529  * Description: prepare fw portion of ucb. do not start, resource not guaranteed
3530  *             so don't manipulate anything that's derived from states which
3531  *             may change
3532  *
3533  *---------------------------------------------------------------------*/
build_UCB(CARD_HANDLE pCurrCard,PUCB p_ucb)3534 void build_UCB(CARD_HANDLE pCurrCard, PUCB p_ucb)
3535 {
3536 
3537    u08bits thisCard;
3538    u08bits i,j;
3539 
3540    PSCCB p_sccb;
3541 
3542 
3543    thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
3544 
3545 
3546    p_sccb=(PSCCB)p_ucb->UCB_MgrPrivatePtr;
3547 
3548 
3549    p_sccb->Sccb_ucb_ptr=p_ucb;
3550 
3551    switch (p_ucb->UCB_opcode & (OPC_DEVICE_RESET+OPC_XFER_SG+OPC_CHK_RESIDUAL))
3552    {
3553       case OPC_DEVICE_RESET:
3554          p_sccb->OperationCode=RESET_COMMAND;
3555          break;
3556       case OPC_XFER_SG:
3557          p_sccb->OperationCode=SCATTER_GATHER_COMMAND;
3558          break;
3559       case OPC_XFER_SG+OPC_CHK_RESIDUAL:
3560          p_sccb->OperationCode=RESIDUAL_SG_COMMAND;
3561          break;
3562       case OPC_CHK_RESIDUAL:
3563 
3564 	      p_sccb->OperationCode=RESIDUAL_COMMAND;
3565 	      break;
3566       default:
3567 	      p_sccb->OperationCode=SCSI_INITIATOR_COMMAND;
3568 	      break;
3569    }
3570 
3571    if (p_ucb->UCB_opcode & OPC_TQ_ENABLE)
3572    {
3573       p_sccb->ControlByte = (u08bits)((p_ucb->UCB_opcode & OPC_TQ_MASK)>>2) | F_USE_CMD_Q;
3574    }
3575    else
3576    {
3577       p_sccb->ControlByte = 0;
3578    }
3579 
3580 
3581    p_sccb->CdbLength = (u08bits)p_ucb->UCB_cdblen;
3582 
3583    if (p_ucb->UCB_opcode & OPC_NO_AUTO_SENSE)
3584    {
3585       p_sccb->RequestSenseLength = 0;
3586    }
3587    else
3588    {
3589       p_sccb->RequestSenseLength = (unsigned char) p_ucb->UCB_senselen;
3590    }
3591 
3592 
3593    if (p_ucb->UCB_opcode & OPC_XFER_SG)
3594    {
3595       p_sccb->DataPointer=p_ucb->UCB_virt_dataptr;
3596       p_sccb->DataLength = (((u32bits)p_ucb->UCB_NumSgElements)<<3);
3597    }
3598    else
3599    {
3600       p_sccb->DataPointer=p_ucb->UCB_phys_dataptr;
3601       p_sccb->DataLength=p_ucb->UCB_datalen;
3602    };
3603 
3604    p_sccb->HostStatus=0;
3605    p_sccb->TargetStatus=0;
3606    p_sccb->TargID=(unsigned char)p_ucb->UCB_targid;
3607    p_sccb->Lun=(unsigned char) p_ucb->UCB_lun;
3608    p_sccb->SccbIOPort=((PSCCBcard)pCurrCard)->ioPort;
3609 
3610    j=p_ucb->UCB_cdblen;
3611    for (i=0;i<j;i++)
3612    {
3613       p_sccb->Cdb[i] = p_ucb->UCB_cdb[i];
3614    }
3615 
3616    p_sccb->SensePointer=p_ucb->UCB_phys_senseptr;
3617 
3618    sinits(p_sccb,thisCard);
3619 
3620 }
3621 #ifndef NO_IOCTLS
3622 
3623 /*---------------------------------------------------------------------
3624  *
3625  * Function: GetDevSyncRate
3626  *
3627  *---------------------------------------------------------------------*/
GetDevSyncRate(PSCCBcard pCurrCard,PUCB p_ucb)3628 STATIC  int GetDevSyncRate(PSCCBcard pCurrCard,PUCB p_ucb)
3629 {
3630 	struct _SYNC_RATE_INFO * pSyncStr;
3631    PSCCBMgr_tar_info currTar_Info;
3632 	BASE_PORT ioport;
3633 	u08bits scsiID, j;
3634 
3635 #if (FW_TYPE != _SCCB_MGR_)
3636 	if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
3637 	{
3638 		return(1);
3639 	}
3640 #endif
3641 
3642 	ioport  = pCurrCard->ioPort;
3643 	pSyncStr	= (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
3644 	scsiID = (u08bits) p_ucb->UCB_targid;
3645    currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
3646 	j = currTar_Info->TarSyncCtrl;
3647 
3648 	switch (currTar_Info->TarEEValue & EE_SYNC_MASK)
3649 	{
3650 		case EE_SYNC_ASYNC:
3651 			pSyncStr->RequestMegaXferRate = 0x00;
3652 			break;
3653 		case EE_SYNC_5MB:
3654 			pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
3655 			break;
3656 		case EE_SYNC_10MB:
3657 			pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
3658 			break;
3659 		case EE_SYNC_20MB:
3660 			pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
3661 			break;
3662 	}
3663 
3664 	switch ((j >> 5) & 0x07)
3665 	{
3666 		case 0x00:
3667 			if((j & 0x07) == 0x00)
3668 			{
3669 				pSyncStr->ActualMegaXferRate = 0x00;	/* Async Mode */
3670 			}
3671 			else
3672 			{
3673 				pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
3674 			}
3675 			break;
3676 		case 0x01:
3677 			pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
3678 			break;
3679 		case 0x02:
3680 			pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 66 : 122;
3681 			break;
3682 		case 0x03:
3683 			pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
3684 			break;
3685 		case 0x04:
3686 			pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 40 : 80;
3687 			break;
3688 		case 0x05:
3689 			pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 33 : 66;
3690 			break;
3691 		case 0x06:
3692 			pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 28 : 56;
3693 			break;
3694 		case 0x07:
3695 			pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 25 : 50;
3696 			break;
3697 	}
3698 	pSyncStr->NegotiatedOffset = j & 0x0f;
3699 
3700 	return(0);
3701 }
3702 
3703 /*---------------------------------------------------------------------
3704  *
3705  * Function: SetDevSyncRate
3706  *
3707  *---------------------------------------------------------------------*/
SetDevSyncRate(PSCCBcard pCurrCard,PUCB p_ucb)3708 STATIC int SetDevSyncRate(PSCCBcard pCurrCard, PUCB p_ucb)
3709 {
3710 	struct _SYNC_RATE_INFO * pSyncStr;
3711    PSCCBMgr_tar_info currTar_Info;
3712 	BASE_PORT ioPort;
3713 	u08bits scsiID, i, j, syncVal;
3714 	u16bits syncOffset, actualXferRate;
3715 	union {
3716 		u08bits tempb[2];
3717 		u16bits tempw;
3718 	}temp2;
3719 
3720 #if (FW_TYPE != _SCCB_MGR_)
3721 	if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
3722 	{
3723 		return(1);
3724 	}
3725 #endif
3726 
3727 	ioPort  = pCurrCard->ioPort;
3728 	pSyncStr	= (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
3729 	scsiID = (u08bits) p_ucb->UCB_targid;
3730    currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
3731 	i = RD_HARPOON(ioPort+hp_xfer_pad);		/* Save current value */
3732 	WR_HARPOON(ioPort+hp_xfer_pad, (i | ID_UNLOCK));
3733 	WR_HARPOON(ioPort+hp_select_id, ((scsiID << 4) | scsiID));
3734 	j = RD_HARPOON(ioPort+hp_synctarg_0);
3735 	WR_HARPOON(ioPort+hp_xfer_pad, i);		/* restore value */
3736 
3737 	actualXferRate = pSyncStr->ActualMegaXferRate;
3738 	if(!(j & NARROW_SCSI))
3739 	{
3740 		actualXferRate <<= 1;
3741 	}
3742 	if(actualXferRate == 0x00)
3743 	{
3744 		syncVal = EE_SYNC_ASYNC;			/* Async Mode */
3745 	}
3746 	if(actualXferRate == 0x0200)
3747 	{
3748 		syncVal = EE_SYNC_20MB;				/* 20/40 MB Mode */
3749 	}
3750 	if(actualXferRate > 0x0050 && actualXferRate < 0x0200 )
3751 	{
3752 		syncVal = EE_SYNC_10MB;				/* 10/20 MB Mode */
3753 	}
3754 	else
3755 	{
3756 		syncVal = EE_SYNC_5MB;				/* 5/10 MB Mode */
3757 	}
3758 	if(currTar_Info->TarEEValue && EE_SYNC_MASK == syncVal)
3759 		return(0);
3760 	currTar_Info->TarEEValue = (currTar_Info->TarEEValue & ~EE_SYNC_MASK)
3761 											| syncVal;
3762 	syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
3763 	temp2.tempw = utilEERead(ioPort, syncOffset);
3764 	if(scsiID & 0x01)
3765 	{
3766 		temp2.tempb[0] = (temp2.tempb[0] & ~EE_SYNC_MASK) | syncVal;
3767 	}
3768 	else
3769 	{
3770 		temp2.tempb[1] = (temp2.tempb[1] & ~EE_SYNC_MASK) | syncVal;
3771 	}
3772 	utilEEWriteOnOff(ioPort, 1);
3773 	utilEEWrite(ioPort, temp2.tempw, syncOffset);
3774 	utilEEWriteOnOff(ioPort, 0);
3775 	UpdateCheckSum(ioPort);
3776 
3777 	return(0);
3778 }
3779 /*---------------------------------------------------------------------
3780  *
3781  * Function: GetDevWideMode
3782  *
3783  *---------------------------------------------------------------------*/
GetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)3784 int GetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
3785 {
3786 	u08bits *pData;
3787 
3788 	pData = (u08bits *)p_ucb->UCB_virt_dataptr;
3789 	if(sccbMgrTbl[pCurrCard->cardIndex][p_ucb->UCB_targid].TarEEValue
3790 				& EE_WIDE_SCSI)
3791 	{
3792 		*pData = 1;
3793 	}
3794 	else
3795 	{
3796 		*pData = 0;
3797 	}
3798 
3799 	return(0);
3800 }
3801 
3802 /*---------------------------------------------------------------------
3803  *
3804  * Function: SetDevWideMode
3805  *
3806  *---------------------------------------------------------------------*/
SetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)3807 int SetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
3808 {
3809 	u08bits *pData;
3810    PSCCBMgr_tar_info currTar_Info;
3811 	BASE_PORT ioPort;
3812 	u08bits scsiID, scsiWideMode;
3813 	u16bits syncOffset;
3814 	union {
3815 		u08bits tempb[2];
3816 		u16bits tempw;
3817 	}temp2;
3818 
3819 #if (FW_TYPE != _SCCB_MGR_)
3820 	if( !(pCurrCard->cardInfo->ai_attributes & WIDE_CAPABLE) )
3821 	{
3822 		return(1);
3823 	}
3824 
3825 	if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
3826 	{
3827 		return(1);
3828 	}
3829 #endif
3830 
3831 	ioPort  = pCurrCard->ioPort;
3832 	pData = (u08bits *)p_ucb->UCB_virt_dataptr;
3833 	scsiID = (u08bits) p_ucb->UCB_targid;
3834 	currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
3835 
3836 	if(*pData)
3837 	{
3838 		if(currTar_Info->TarEEValue & EE_WIDE_SCSI)
3839 		{
3840 			return(0);
3841 		}
3842 		else
3843 		{
3844 			scsiWideMode = EE_WIDE_SCSI;
3845 		}
3846 	}
3847 	else
3848 	{
3849 		if(!currTar_Info->TarEEValue & EE_WIDE_SCSI)
3850 		{
3851 			return(0);
3852 		}
3853 		else
3854 		{
3855 			scsiWideMode = 0;
3856 		}
3857 	}
3858 	currTar_Info->TarEEValue = (currTar_Info->TarEEValue & !EE_WIDE_SCSI)
3859 											| scsiWideMode;
3860 
3861 	syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
3862 	temp2.tempw = utilEERead(ioPort, syncOffset);
3863 	if(scsiID & 0x01)
3864 	{
3865 		temp2.tempb[0] = (temp2.tempb[0] & !EE_WIDE_SCSI) | scsiWideMode;
3866 	}
3867 	else
3868 	{
3869 		temp2.tempb[1] = (temp2.tempb[1] & !EE_WIDE_SCSI) | scsiWideMode;
3870 	}
3871 	utilEEWriteOnOff(ioPort, 1);
3872 	utilEEWrite(ioPort, temp2.tempw, syncOffset);
3873 	utilEEWriteOnOff(ioPort, 0);
3874 	UpdateCheckSum(ioPort);
3875 
3876 	return(0);
3877 }
3878 
3879 /*---------------------------------------------------------------------
3880  *
3881  * Function: ReadNVRam
3882  *
3883  *---------------------------------------------------------------------*/
ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb)3884 void ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
3885 {
3886 	u08bits *pdata;
3887 	u16bits i,numwrds,numbytes,offset,temp;
3888 	u08bits OneMore = FALSE;
3889 #if defined(DOS)
3890 	u16bits ioport;
3891 #else
3892 	u32bits ioport;
3893 #endif
3894 
3895 	numbytes = (u16bits) p_ucb->UCB_datalen;
3896 	ioport  = pCurrCard->ioPort;
3897    pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
3898 	offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
3899 
3900 
3901 
3902    if (offset & 0x1)
3903 	{
3904 	    *((u16bits*) pdata) = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
3905 		 *pdata = *(pdata + 1);
3906 		 ++offset;
3907    	 ++pdata;
3908 		 --numbytes;
3909 	}
3910 
3911 	numwrds = numbytes / 2;
3912 	if (numbytes & 1)
3913 	 	OneMore = TRUE;
3914 
3915 	for (i = 0; i < numwrds; i++)
3916 	{
3917    	*((u16bits*) pdata) = utilEERead(ioport,(u16bits)(offset / 2));
3918 		pdata += 2;
3919 		offset += 2;
3920    }
3921 	if (OneMore)
3922 	{
3923 		--pdata;
3924 		-- offset;
3925    	temp = utilEERead(ioport,(u16bits)(offset / 2));
3926 		*pdata = (u08bits) (temp);
3927 	}
3928 
3929 } /* end proc ReadNVRam */
3930 
3931 
3932 /*---------------------------------------------------------------------
3933  *
3934  * Function: WriteNVRam
3935  *
3936  *---------------------------------------------------------------------*/
WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb)3937 void WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
3938 {
3939 	u08bits *pdata;
3940 	u16bits i,numwrds,numbytes,offset, eeprom_end;
3941 	u08bits OneMore = FALSE;
3942 	union {
3943 		u08bits  tempb[2];
3944 		u16bits  tempw;
3945 	} temp2;
3946 
3947 #if defined(DOS)
3948 	u16bits ioport;
3949 #else
3950 	u32bits ioport;
3951 #endif
3952 
3953 	numbytes = (u16bits) p_ucb->UCB_datalen;
3954 	ioport  = pCurrCard->ioPort;
3955    pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
3956 	offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
3957 
3958    if (RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD)
3959       eeprom_end = 512;
3960    else
3961       eeprom_end = 768;
3962 
3963 	if(offset > eeprom_end)
3964 		return;
3965 
3966 	if((offset + numbytes) > eeprom_end)
3967 		numbytes = eeprom_end - offset;
3968 
3969     utilEEWriteOnOff(ioport,1);   /* Enable write access to the EEPROM */
3970 
3971 
3972 
3973    if (offset & 0x1)
3974 	{
3975 	    temp2.tempw = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
3976 		 temp2.tempb[1] = *pdata;
3977 	    utilEEWrite(ioport, temp2.tempw, (u16bits)((offset -1) / 2));
3978 		 *pdata = *(pdata + 1);
3979 		 ++offset;
3980    	 ++pdata;
3981 		 --numbytes;
3982 	}
3983 
3984 	numwrds = numbytes / 2;
3985 	if (numbytes & 1)
3986 	 	OneMore = TRUE;
3987 
3988 	for (i = 0; i < numwrds; i++)
3989 	{
3990    	utilEEWrite(ioport, *((pu16bits)pdata),(u16bits)(offset / 2));
3991 		pdata += 2;
3992 		offset += 2;
3993    }
3994 	if (OneMore)
3995 	{
3996 
3997    	temp2.tempw = utilEERead(ioport,(u16bits)(offset / 2));
3998 		temp2.tempb[0] = *pdata;
3999    	utilEEWrite(ioport, temp2.tempw, (u16bits)(offset / 2));
4000 	}
4001    utilEEWriteOnOff(ioport,0);   /* Turn off write access */
4002    UpdateCheckSum((u32bits)ioport);
4003 
4004 } /* end proc WriteNVRam */
4005 
4006 
4007 
4008 /*---------------------------------------------------------------------
4009  *
4010  * Function: UpdateCheckSum
4011  *
4012  * Description: Update Check Sum in EEPROM
4013  *
4014  *---------------------------------------------------------------------*/
4015 
4016 
UpdateCheckSum(u32bits baseport)4017 void UpdateCheckSum(u32bits baseport)
4018 {
4019 	USHORT i,sum_data, eeprom_end;
4020 
4021 	sum_data = 0x0000;
4022 
4023 
4024    if (RD_HARPOON(baseport+hp_page_ctrl) & NARROW_SCSI_CARD)
4025       eeprom_end = 512;
4026    else
4027       eeprom_end = 768;
4028 
4029 	for (i = 1; i < eeprom_end/2; i++)
4030 	{
4031 		sum_data += utilEERead(baseport, i);
4032 	}
4033 
4034    utilEEWriteOnOff(baseport,1);   /* Enable write access to the EEPROM */
4035 
4036    utilEEWrite(baseport, sum_data, EEPROM_CHECK_SUM/2);
4037    utilEEWriteOnOff(baseport,0);   /* Turn off write access */
4038 }
4039 
SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo)4040 void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo)
4041 {
4042 }
4043 
4044 
SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard)4045 void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard)
4046 {
4047 }
4048 
SccbMgr_restore_native_state(CARD_HANDLE pCurrCard)4049 void SccbMgr_restore_native_state(CARD_HANDLE pCurrCard)
4050 {
4051 }
4052 
4053 #endif /* NO_IOCTLS */
4054 
4055 #endif /* (FW_TYPE==_UCB_MGR_)   */
4056 
4057 #ifndef NO_IOCTLS
4058 #if (FW_TYPE==_UCB_MGR_)
SccbMgr_unload_card(CARD_HANDLE pCurrCard)4059 void SccbMgr_unload_card(CARD_HANDLE pCurrCard)
4060 #else
4061 #if defined(DOS)
4062 void SccbMgr_unload_card(USHORT pCurrCard)
4063 #else
4064 void SccbMgr_unload_card(ULONG pCurrCard)
4065 #endif
4066 #endif
4067 {
4068 	UCHAR i;
4069 #if defined(DOS)
4070 	USHORT portBase;
4071 	USHORT regOffset;
4072 #else
4073 	ULONG portBase;
4074 	ULONG regOffset;
4075 #endif
4076 	ULONG scamData;
4077 #if defined(OS2)
4078 	ULONG far *pScamTbl;
4079 #else
4080 	ULONG *pScamTbl;
4081 #endif
4082 	PNVRamInfo pCurrNvRam;
4083 
4084 	pCurrNvRam = ((PSCCBcard)pCurrCard)->pNvRamInfo;
4085 
4086 	if(pCurrNvRam){
4087 		WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
4088 		WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
4089 		WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
4090 		WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
4091 		WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
4092 
4093 		for(i = 0; i < MAX_SCSI_TAR / 2; i++)
4094 			WrStack(pCurrNvRam->niBaseAddr, (UCHAR)(i+5), pCurrNvRam->niSyncTbl[i]);
4095 
4096 		portBase = pCurrNvRam->niBaseAddr;
4097 
4098 		for(i = 0; i < MAX_SCSI_TAR; i++){
4099 			regOffset = hp_aramBase + 64 + i*4;
4100 #if defined(OS2)
4101 			pScamTbl = (ULONG far *) &pCurrNvRam->niScamTbl[i];
4102 #else
4103 			pScamTbl = (ULONG *) &pCurrNvRam->niScamTbl[i];
4104 #endif
4105 			scamData = *pScamTbl;
4106 			WR_HARP32(portBase, regOffset, scamData);
4107 		}
4108 
4109 	}else{
4110 		WrStack(((PSCCBcard)pCurrCard)->ioPort, 0, 0);
4111 	}
4112 }
4113 #endif /* NO_IOCTLS */
4114 
4115 
RNVRamData(PNVRamInfo pNvRamInfo)4116 void RNVRamData(PNVRamInfo pNvRamInfo)
4117 {
4118 	UCHAR i;
4119 #if defined(DOS)
4120 	USHORT portBase;
4121 	USHORT regOffset;
4122 #else
4123 	ULONG portBase;
4124 	ULONG regOffset;
4125 #endif
4126 	ULONG scamData;
4127 #if defined (OS2)
4128 	ULONG far *pScamTbl;
4129 #else
4130 	ULONG *pScamTbl;
4131 #endif
4132 
4133 	pNvRamInfo->niModel    = RdStack(pNvRamInfo->niBaseAddr, 0);
4134 	pNvRamInfo->niSysConf  = RdStack(pNvRamInfo->niBaseAddr, 1);
4135 	pNvRamInfo->niScsiConf = RdStack(pNvRamInfo->niBaseAddr, 2);
4136 	pNvRamInfo->niScamConf = RdStack(pNvRamInfo->niBaseAddr, 3);
4137 	pNvRamInfo->niAdapId   = RdStack(pNvRamInfo->niBaseAddr, 4);
4138 
4139 	for(i = 0; i < MAX_SCSI_TAR / 2; i++)
4140 		pNvRamInfo->niSyncTbl[i] = RdStack(pNvRamInfo->niBaseAddr, (UCHAR)(i+5));
4141 
4142 	portBase = pNvRamInfo->niBaseAddr;
4143 
4144 	for(i = 0; i < MAX_SCSI_TAR; i++){
4145 		regOffset = hp_aramBase + 64 + i*4;
4146 		RD_HARP32(portBase, regOffset, scamData);
4147 #if defined(OS2)
4148 		pScamTbl = (ULONG far *) &pNvRamInfo->niScamTbl[i];
4149 #else
4150 		pScamTbl = (ULONG *) &pNvRamInfo->niScamTbl[i];
4151 #endif
4152 		*pScamTbl = scamData;
4153 	}
4154 
4155 }
4156 
4157 #if defined(DOS)
RdStack(USHORT portBase,UCHAR index)4158 UCHAR RdStack(USHORT portBase, UCHAR index)
4159 #else
4160 UCHAR RdStack(ULONG portBase, UCHAR index)
4161 #endif
4162 {
4163 	WR_HARPOON(portBase + hp_stack_addr, index);
4164 	return(RD_HARPOON(portBase + hp_stack_data));
4165 }
4166 
4167 #if defined(DOS)
WrStack(USHORT portBase,UCHAR index,UCHAR data)4168 void WrStack(USHORT portBase, UCHAR index, UCHAR data)
4169 #else
4170 void WrStack(ULONG portBase, UCHAR index, UCHAR data)
4171 #endif
4172 {
4173 	WR_HARPOON(portBase + hp_stack_addr, index);
4174 	WR_HARPOON(portBase + hp_stack_data, data);
4175 }
4176 
4177 
4178 #if (FW_TYPE==_UCB_MGR_)
ChkIfChipInitialized(BASE_PORT ioPort)4179 u08bits ChkIfChipInitialized(BASE_PORT ioPort)
4180 #else
4181 #if defined(DOS)
4182 UCHAR ChkIfChipInitialized(USHORT ioPort)
4183 #else
4184 UCHAR ChkIfChipInitialized(ULONG ioPort)
4185 #endif
4186 #endif
4187 {
4188 	if((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != RdStack(ioPort, 4))
4189 		return(FALSE);
4190 	if((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT)
4191 								!= CLKCTRL_DEFAULT)
4192 		return(FALSE);
4193 	if((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) ||
4194 		(RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms))
4195 		return(TRUE);
4196 	return(FALSE);
4197 
4198 }
4199 /*---------------------------------------------------------------------
4200  *
4201  * Function: SccbMgr_start_sccb
4202  *
4203  * Description: Start a command pointed to by p_Sccb. When the
4204  *              command is completed it will be returned via the
4205  *              callback function.
4206  *
4207  *---------------------------------------------------------------------*/
4208 #if (FW_TYPE==_UCB_MGR_)
SccbMgr_start_sccb(CARD_HANDLE pCurrCard,PUCB p_ucb)4209 void SccbMgr_start_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb)
4210 #else
4211 #if defined(DOS)
4212 void SccbMgr_start_sccb(USHORT pCurrCard, PSCCB p_Sccb)
4213 #else
4214 void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
4215 #endif
4216 #endif
4217 {
4218 #if defined(DOS)
4219    USHORT ioport;
4220 #else
4221    ULONG ioport;
4222 #endif
4223    UCHAR thisCard, lun;
4224 	PSCCB pSaveSccb;
4225    CALL_BK_FN callback;
4226 
4227 #if (FW_TYPE==_UCB_MGR_)
4228    PSCCB p_Sccb;
4229 #endif
4230 
4231    mOS_Lock((PSCCBcard)pCurrCard);
4232    thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
4233    ioport = ((PSCCBcard) pCurrCard)->ioPort;
4234 
4235 #if (FW_TYPE==_UCB_MGR_)
4236    p_Sccb = (PSCCB)p_ucb->UCB_MgrPrivatePtr;
4237 #endif
4238 
4239 	if((p_Sccb->TargID > MAX_SCSI_TAR) || (p_Sccb->Lun > MAX_LUN))
4240 	{
4241 
4242 #if (FW_TYPE==_UCB_MGR_)
4243 		p_ucb->UCB_hbastat = SCCB_COMPLETE;
4244 		p_ucb->UCB_status=SCCB_ERROR;
4245 		callback = (CALL_BK_FN)p_ucb->UCB_callback;
4246 		if (callback)
4247 			callback(p_ucb);
4248 #endif
4249 
4250 #if (FW_TYPE==_SCCB_MGR_)
4251 		p_Sccb->HostStatus = SCCB_COMPLETE;
4252 		p_Sccb->SccbStatus = SCCB_ERROR;
4253 		callback = (CALL_BK_FN)p_Sccb->SccbCallback;
4254 		if (callback)
4255 			callback(p_Sccb);
4256 #endif
4257 
4258 		mOS_UnLock((PSCCBcard)pCurrCard);
4259 		return;
4260 	}
4261 
4262 #if (FW_TYPE==_SCCB_MGR_)
4263    sinits(p_Sccb,thisCard);
4264 #endif
4265 
4266 
4267 #if (FW_TYPE==_UCB_MGR_)
4268 #ifndef NO_IOCTLS
4269 
4270    if (p_ucb->UCB_opcode & OPC_IOCTL)
4271 	{
4272 
4273 		switch (p_ucb->UCB_IOCTLCommand)
4274 		{
4275 			case READ_NVRAM:
4276 				ReadNVRam((PSCCBcard)pCurrCard,p_ucb);
4277 				p_ucb->UCB_status=UCB_SUCCESS;
4278 				callback = (CALL_BK_FN)p_ucb->UCB_callback;
4279 				if (callback)
4280 					callback(p_ucb);
4281 				mOS_UnLock((PSCCBcard)pCurrCard);
4282 				return;
4283 
4284 			case WRITE_NVRAM:
4285 				WriteNVRam((PSCCBcard)pCurrCard,p_ucb);
4286 				p_ucb->UCB_status=UCB_SUCCESS;
4287 				callback = (CALL_BK_FN)p_ucb->UCB_callback;
4288 				if (callback)
4289 					callback(p_ucb);
4290 				mOS_UnLock((PSCCBcard)pCurrCard);
4291 				return;
4292 
4293 			case SEND_SCSI_PASSTHRU:
4294 #if (FW_TYPE != _SCCB_MGR_)
4295 				if( p_ucb->UCB_targid >=
4296 				    ((PSCCBcard)pCurrCard)->cardInfo->ai_MaxTarg )
4297 				{
4298 					p_ucb->UCB_status = UCB_ERROR;
4299 					p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4300 					callback = (CALL_BK_FN)p_ucb->UCB_callback;
4301 					if (callback)
4302 						callback(p_ucb);
4303 					mOS_UnLock((PSCCBcard)pCurrCard);
4304 					return;
4305 				}
4306 #endif
4307 				break;
4308 
4309 			case HARD_RESET:
4310 				p_ucb->UCB_status = UCB_INVALID;
4311 				callback = (CALL_BK_FN)p_ucb->UCB_callback;
4312 				if (callback)
4313 					callback(p_ucb);
4314 				mOS_UnLock((PSCCBcard)pCurrCard);
4315 				return;
4316 			case GET_DEVICE_SYNCRATE:
4317 				if( !GetDevSyncRate((PSCCBcard)pCurrCard,p_ucb) )
4318 				{
4319 					p_ucb->UCB_status = UCB_SUCCESS;
4320 				}
4321 				else
4322 				{
4323 					p_ucb->UCB_status = UCB_ERROR;
4324 					p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4325 				}
4326 				callback = (CALL_BK_FN)p_ucb->UCB_callback;
4327 				if (callback)
4328 					callback(p_ucb);
4329 				mOS_UnLock((PSCCBcard)pCurrCard);
4330 				return;
4331 			case SET_DEVICE_SYNCRATE:
4332 				if( !SetDevSyncRate((PSCCBcard)pCurrCard,p_ucb) )
4333 				{
4334 					p_ucb->UCB_status = UCB_SUCCESS;
4335 				}
4336 				else
4337 				{
4338 					p_ucb->UCB_status = UCB_ERROR;
4339 					p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4340 				}
4341 				callback = (CALL_BK_FN)p_ucb->UCB_callback;
4342 				if (callback)
4343 					callback(p_ucb);
4344 				mOS_UnLock((PSCCBcard)pCurrCard);
4345 				return;
4346 			case GET_WIDE_MODE:
4347 				if( !GetDevWideMode((PSCCBcard)pCurrCard,p_ucb) )
4348 				{
4349 					p_ucb->UCB_status = UCB_SUCCESS;
4350 				}
4351 				else
4352 				{
4353 					p_ucb->UCB_status = UCB_ERROR;
4354 					p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4355 				}
4356 				callback = (CALL_BK_FN)p_ucb->UCB_callback;
4357 				if (callback)
4358 					callback(p_ucb);
4359 				mOS_UnLock((PSCCBcard)pCurrCard);
4360 				return;
4361 			case SET_WIDE_MODE:
4362 				if( !SetDevWideMode((PSCCBcard)pCurrCard,p_ucb) )
4363 				{
4364 					p_ucb->UCB_status = UCB_SUCCESS;
4365 				}
4366 				else
4367 				{
4368 					p_ucb->UCB_status = UCB_ERROR;
4369 					p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
4370 				}
4371 				callback = (CALL_BK_FN)p_ucb->UCB_callback;
4372 				if (callback)
4373 					callback(p_ucb);
4374 				mOS_UnLock((PSCCBcard)pCurrCard);
4375 				return;
4376 			default:
4377 				p_ucb->UCB_status=UCB_INVALID;
4378 				callback = (CALL_BK_FN)p_ucb->UCB_callback;
4379 				if (callback)
4380 					callback(p_ucb);
4381 				mOS_UnLock((PSCCBcard)pCurrCard);
4382 				return;
4383 		}
4384 	}
4385 #endif /* NO_IOCTLS */
4386 #endif /* (FW_TYPE==_UCB_MGR_) */
4387 
4388 
4389    if (!((PSCCBcard) pCurrCard)->cmdCounter)
4390       {
4391       WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore)
4392          | SCCB_MGR_ACTIVE));
4393 
4394       if (((PSCCBcard) pCurrCard)->globalFlags & F_GREEN_PC)
4395          {
4396 		 WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
4397 		 WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
4398          }
4399       }
4400 
4401    ((PSCCBcard)pCurrCard)->cmdCounter++;
4402 
4403    if (RD_HARPOON(ioport+hp_semaphore) & BIOS_IN_USE) {
4404 
4405       WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore)
4406          | TICKLE_ME));
4407 		if(p_Sccb->OperationCode == RESET_COMMAND)
4408 			{
4409 				pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
4410 				((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4411 				queueSelectFail(&BL_Card[thisCard], thisCard);
4412 				((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
4413 			}
4414 		else
4415 			{
4416 	      queueAddSccb(p_Sccb,thisCard);
4417 			}
4418       }
4419 
4420    else if ((RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)) {
4421 
4422 			if(p_Sccb->OperationCode == RESET_COMMAND)
4423 				{
4424 					pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
4425 					((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4426 					queueSelectFail(&BL_Card[thisCard], thisCard);
4427 					((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
4428 				}
4429 			else
4430 				{
4431 		      queueAddSccb(p_Sccb,thisCard);
4432 				}
4433       }
4434 
4435    else {
4436 
4437       MDISABLE_INT(ioport);
4438 
4439 		if((((PSCCBcard) pCurrCard)->globalFlags & F_CONLUN_IO) &&
4440 			((sccbMgrTbl[thisCard][p_Sccb->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
4441 			lun = p_Sccb->Lun;
4442 		else
4443 			lun = 0;
4444       if ((((PSCCBcard) pCurrCard)->currentSCCB == NULL) &&
4445          (sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0) &&
4446          (sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
4447          == FALSE)) {
4448 
4449             ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4450 			   mOS_UnLock((PSCCBcard)pCurrCard);
4451 #if defined(DOS)
4452             ssel((USHORT)p_Sccb->SccbIOPort,thisCard);
4453 #else
4454 	    ssel(p_Sccb->SccbIOPort,thisCard);
4455 #endif
4456 			   mOS_Lock((PSCCBcard)pCurrCard);
4457          }
4458 
4459       else {
4460 
4461 			if(p_Sccb->OperationCode == RESET_COMMAND)
4462 				{
4463 					pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
4464 					((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4465 					queueSelectFail(&BL_Card[thisCard], thisCard);
4466 					((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
4467 				}
4468 			else
4469 				{
4470 	         	queueAddSccb(p_Sccb,thisCard);
4471 				}
4472          }
4473 
4474 
4475       MENABLE_INT(ioport);
4476       }
4477 
4478    mOS_UnLock((PSCCBcard)pCurrCard);
4479 }
4480 
4481 
4482 /*---------------------------------------------------------------------
4483  *
4484  * Function: SccbMgr_abort_sccb
4485  *
4486  * Description: Abort the command pointed to by p_Sccb.  When the
4487  *              command is completed it will be returned via the
4488  *              callback function.
4489  *
4490  *---------------------------------------------------------------------*/
4491 #if (FW_TYPE==_UCB_MGR_)
SccbMgr_abort_sccb(CARD_HANDLE pCurrCard,PUCB p_ucb)4492 s32bits SccbMgr_abort_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb)
4493 #else
4494 #if defined(DOS)
4495 int SccbMgr_abort_sccb(USHORT pCurrCard, PSCCB p_Sccb)
4496 #else
4497 int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
4498 #endif
4499 #endif
4500 
4501 {
4502 #if defined(DOS)
4503 	USHORT ioport;
4504 #else
4505 	ULONG ioport;
4506 #endif
4507 
4508 	UCHAR thisCard;
4509 	CALL_BK_FN callback;
4510 	UCHAR TID;
4511 	PSCCB pSaveSCCB;
4512 	PSCCBMgr_tar_info currTar_Info;
4513 
4514 
4515 #if (FW_TYPE==_UCB_MGR_)
4516 	PSCCB    p_Sccb;
4517 	p_Sccb=(PSCCB)p_ucb->UCB_MgrPrivatePtr;
4518 #endif
4519 
4520 	ioport = ((PSCCBcard) pCurrCard)->ioPort;
4521 
4522 	thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
4523 
4524 	mOS_Lock((PSCCBcard)pCurrCard);
4525 
4526 	if (RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)
4527 	{
4528 		mOS_UnLock((PSCCBcard)pCurrCard);
4529 	}
4530 
4531 	else
4532 	{
4533 
4534 		if (queueFindSccb(p_Sccb,thisCard))
4535 		{
4536 
4537 			mOS_UnLock((PSCCBcard)pCurrCard);
4538 
4539 			((PSCCBcard)pCurrCard)->cmdCounter--;
4540 
4541 			if (!((PSCCBcard)pCurrCard)->cmdCounter)
4542 				WR_HARPOON(ioport+hp_semaphore,(RD_HARPOON(ioport+hp_semaphore)
4543 					& (UCHAR)(~(SCCB_MGR_ACTIVE | TICKLE_ME)) ));
4544 
4545 #if (FW_TYPE==_SCCB_MGR_)
4546 			p_Sccb->SccbStatus = SCCB_ABORT;
4547 			callback = p_Sccb->SccbCallback;
4548 			callback(p_Sccb);
4549 #else
4550 			p_ucb->UCB_status=SCCB_ABORT;
4551 			callback = (CALL_BK_FN)p_ucb->UCB_callback;
4552 			callback(p_ucb);
4553 #endif
4554 
4555 			return(0);
4556 		}
4557 
4558 		else
4559 		{
4560 			mOS_UnLock((PSCCBcard)pCurrCard);
4561 
4562 			if (((PSCCBcard)pCurrCard)->currentSCCB == p_Sccb)
4563 			{
4564 				p_Sccb->SccbStatus = SCCB_ABORT;
4565 				return(0);
4566 
4567 			}
4568 
4569 			else
4570 			{
4571 
4572 				TID = p_Sccb->TargID;
4573 
4574 
4575 				if(p_Sccb->Sccb_tag)
4576 				{
4577 					MDISABLE_INT(ioport);
4578 					if (((PSCCBcard) pCurrCard)->discQ_Tbl[p_Sccb->Sccb_tag]==p_Sccb)
4579 					{
4580 						p_Sccb->SccbStatus = SCCB_ABORT;
4581 						p_Sccb->Sccb_scsistat = ABORT_ST;
4582 #if (FW_TYPE==_UCB_MGR_)
4583 						p_ucb->UCB_status=SCCB_ABORT;
4584 #endif
4585 						p_Sccb->Sccb_scsimsg = SMABORT_TAG;
4586 
4587 						if(((PSCCBcard) pCurrCard)->currentSCCB == NULL)
4588 						{
4589 							((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4590 							ssel(ioport, thisCard);
4591 						}
4592 						else
4593 						{
4594 							pSaveSCCB = ((PSCCBcard) pCurrCard)->currentSCCB;
4595 							((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
4596 							queueSelectFail((PSCCBcard) pCurrCard, thisCard);
4597 							((PSCCBcard) pCurrCard)->currentSCCB = pSaveSCCB;
4598 						}
4599 					}
4600 					MENABLE_INT(ioport);
4601 					return(0);
4602 				}
4603 				else
4604 				{
4605 					currTar_Info = &sccbMgrTbl[thisCard][p_Sccb->TargID];
4606 
4607 					if(BL_Card[thisCard].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_Sccb->Lun]]
4608 							== p_Sccb)
4609 					{
4610 						p_Sccb->SccbStatus = SCCB_ABORT;
4611 						return(0);
4612 					}
4613 				}
4614 			}
4615 		}
4616 	}
4617 	return(-1);
4618 }
4619 
4620 
4621 /*---------------------------------------------------------------------
4622  *
4623  * Function: SccbMgr_my_int
4624  *
4625  * Description: Do a quick check to determine if there is a pending
4626  *              interrupt for this card and disable the IRQ Pin if so.
4627  *
4628  *---------------------------------------------------------------------*/
4629 #if (FW_TYPE==_UCB_MGR_)
SccbMgr_my_int(CARD_HANDLE pCurrCard)4630 u08bits SccbMgr_my_int(CARD_HANDLE pCurrCard)
4631 #else
4632 #if defined(DOS)
4633 UCHAR SccbMgr_my_int(USHORT pCurrCard)
4634 #else
4635 UCHAR SccbMgr_my_int(ULONG pCurrCard)
4636 #endif
4637 #endif
4638 {
4639 #if defined(DOS)
4640    USHORT ioport;
4641 #else
4642    ULONG ioport;
4643 #endif
4644 
4645    ioport = ((PSCCBcard)pCurrCard)->ioPort;
4646 
4647    if (RD_HARPOON(ioport+hp_int_status) & INT_ASSERTED)
4648    {
4649 
4650 #if defined(DOS)
4651       MDISABLE_INT(ioport);
4652 #endif
4653 
4654       return(TRUE);
4655    }
4656 
4657    else
4658 
4659       return(FALSE);
4660 }
4661 
4662 
4663 
4664 /*---------------------------------------------------------------------
4665  *
4666  * Function: SccbMgr_isr
4667  *
4668  * Description: This is our entry point when an interrupt is generated
4669  *              by the card and the upper level driver passes it on to
4670  *              us.
4671  *
4672  *---------------------------------------------------------------------*/
4673 #if (FW_TYPE==_UCB_MGR_)
SccbMgr_isr(CARD_HANDLE pCurrCard)4674 s32bits SccbMgr_isr(CARD_HANDLE pCurrCard)
4675 #else
4676 #if defined(DOS)
4677 int SccbMgr_isr(USHORT pCurrCard)
4678 #else
4679 int SccbMgr_isr(ULONG pCurrCard)
4680 #endif
4681 #endif
4682 {
4683    PSCCB currSCCB;
4684    UCHAR thisCard,result,bm_status, bm_int_st;
4685    USHORT hp_int;
4686    UCHAR i, target;
4687 #if defined(DOS)
4688    USHORT ioport;
4689 #else
4690    ULONG ioport;
4691 #endif
4692 
4693    mOS_Lock((PSCCBcard)pCurrCard);
4694 
4695    thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
4696    ioport = ((PSCCBcard)pCurrCard)->ioPort;
4697 
4698    MDISABLE_INT(ioport);
4699 
4700 #if defined(BUGBUG)
4701    WR_HARPOON(ioport+hp_user_defined_D, RD_HARPOON(ioport+hp_int_status));
4702 #endif
4703 
4704    if ((bm_int_st=RD_HARPOON(ioport+hp_int_status)) & EXT_STATUS_ON)
4705 		bm_status = RD_HARPOON(ioport+hp_ext_status) & (UCHAR)BAD_EXT_STATUS;
4706    else
4707       bm_status = 0;
4708 
4709    WR_HARPOON(ioport+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
4710 
4711    mOS_UnLock((PSCCBcard)pCurrCard);
4712 
4713    while ((hp_int = RDW_HARPOON((ioport+hp_intstat)) & default_intena) |
4714 	  bm_status)
4715      {
4716 
4717        currSCCB = ((PSCCBcard)pCurrCard)->currentSCCB;
4718 
4719 #if defined(BUGBUG)
4720    Debug_Load(thisCard,(UCHAR) 0XFF);
4721    Debug_Load(thisCard,bm_int_st);
4722 
4723    Debug_Load(thisCard,hp_int_0);
4724    Debug_Load(thisCard,hp_int_1);
4725 #endif
4726 
4727 
4728       if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
4729          result = SccbMgr_bad_isr(ioport,thisCard,((PSCCBcard)pCurrCard),hp_int);
4730          WRW_HARPOON((ioport+hp_intstat), (FIFO | TIMEOUT | RESET | SCAM_SEL));
4731          bm_status = 0;
4732 
4733          if (result) {
4734 
4735 			   mOS_Lock((PSCCBcard)pCurrCard);
4736             MENABLE_INT(ioport);
4737 			   mOS_UnLock((PSCCBcard)pCurrCard);
4738             return(result);
4739             }
4740          }
4741 
4742 
4743       else if (hp_int & ICMD_COMP) {
4744 
4745          if ( !(hp_int & BUS_FREE) ) {
4746             /* Wait for the BusFree before starting a new command.  We
4747                must also check for being reselected since the BusFree
4748                may not show up if another device reselects us in 1.5us or
4749                less.  SRR Wednesday, 3/8/1995.
4750 	         */
4751 	   while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL))) ;
4752 	 }
4753 
4754          if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
4755 
4756             phaseChkFifo(ioport, thisCard);
4757 
4758 /*         WRW_HARPOON((ioport+hp_intstat),
4759             (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
4760          */
4761 
4762 		 WRW_HARPOON((ioport+hp_intstat), CLR_ALL_INT_1);
4763 
4764          autoCmdCmplt(ioport,thisCard);
4765 
4766          }
4767 
4768 
4769       else if (hp_int & ITAR_DISC)
4770          {
4771 
4772          if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
4773 
4774             phaseChkFifo(ioport, thisCard);
4775 
4776             }
4777 
4778          if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR) {
4779 
4780             WR_HARPOON(ioport+hp_gp_reg_1, 0x00);
4781             currSCCB->Sccb_XferState |= F_NO_DATA_YET;
4782 
4783             currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
4784             }
4785 
4786          currSCCB->Sccb_scsistat = DISCONNECT_ST;
4787          queueDisconnect(currSCCB,thisCard);
4788 
4789             /* Wait for the BusFree before starting a new command.  We
4790                must also check for being reselected since the BusFree
4791                may not show up if another device reselects us in 1.5us or
4792                less.  SRR Wednesday, 3/8/1995.
4793              */
4794 	   while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)) &&
4795 		  !((RDW_HARPOON((ioport+hp_intstat)) & PHASE) &&
4796 		    RD_HARPOON((ioport+hp_scsisig)) ==
4797 		    (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG | SCSI_IOBIT))) ;
4798 
4799 	   /*
4800 	     The additional loop exit condition above detects a timing problem
4801 	     with the revision D/E harpoon chips.  The caller should reset the
4802 	     host adapter to recover when 0xFE is returned.
4803 	   */
4804 	   if (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)))
4805 	     {
4806 	       mOS_Lock((PSCCBcard)pCurrCard);
4807 	       MENABLE_INT(ioport);
4808 	       mOS_UnLock((PSCCBcard)pCurrCard);
4809 	       return 0xFE;
4810 	     }
4811 
4812          WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC));
4813 
4814 
4815          ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD;
4816 
4817       	}
4818 
4819 
4820       else if (hp_int & RSEL) {
4821 
4822          WRW_HARPOON((ioport+hp_intstat), (PROG_HLT | RSEL | PHASE | BUS_FREE));
4823 
4824          if (RDW_HARPOON((ioport+hp_intstat)) & ITAR_DISC)
4825 		      {
4826             if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
4827 			      {
4828                phaseChkFifo(ioport, thisCard);
4829                }
4830 
4831             if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR)
4832 			      {
4833                WR_HARPOON(ioport+hp_gp_reg_1, 0x00);
4834                currSCCB->Sccb_XferState |= F_NO_DATA_YET;
4835                currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
4836                }
4837 
4838             WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC));
4839             currSCCB->Sccb_scsistat = DISCONNECT_ST;
4840             queueDisconnect(currSCCB,thisCard);
4841             }
4842 
4843          sres(ioport,thisCard,((PSCCBcard)pCurrCard));
4844          phaseDecode(ioport,thisCard);
4845 
4846          }
4847 
4848 
4849       else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE)))
4850          {
4851 
4852             WRW_HARPOON((ioport+hp_intstat), (IDO_STRT | XFER_CNT_0));
4853             phaseDecode(ioport,thisCard);
4854 
4855          }
4856 
4857 
4858       else if ( (hp_int & IUNKWN) || (hp_int & PROG_HLT) )
4859 		   {
4860 	 	   WRW_HARPOON((ioport+hp_intstat), (PHASE | IUNKWN | PROG_HLT));
4861 	 	   if ((RD_HARPOON(ioport+hp_prgmcnt_0) & (UCHAR)0x3f)< (UCHAR)SELCHK)
4862 	    		{
4863 	    		phaseDecode(ioport,thisCard);
4864 	    		}
4865 	 	   else
4866 	    		{
4867    /* Harpoon problem some SCSI target device respond to selection
4868    with short BUSY pulse (<400ns) this will make the Harpoon is not able
4869    to latch the correct Target ID into reg. x53.
4870    The work around require to correct this reg. But when write to this
4871    reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we
4872    need to read this reg first then restore it later. After update to 0x53 */
4873 
4874 	    		i = (UCHAR)(RD_HARPOON(ioport+hp_fifowrite));
4875 	    		target = (UCHAR)(RD_HARPOON(ioport+hp_gp_reg_3));
4876 	    		WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) ID_UNLOCK);
4877 	    		WR_HARPOON(ioport+hp_select_id, (UCHAR)(target | target<<4));
4878 	    		WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) 0x00);
4879 	    		WR_HARPOON(ioport+hp_fifowrite, i);
4880 	    		WR_HARPOON(ioport+hp_autostart_3, (AUTO_IMMED+TAG_STRT));
4881 	    		}
4882 	 	   }
4883 
4884       else if (hp_int & XFER_CNT_0) {
4885 
4886          WRW_HARPOON((ioport+hp_intstat), XFER_CNT_0);
4887 
4888          schkdd(ioport,thisCard);
4889 
4890          }
4891 
4892 
4893       else if (hp_int & BUS_FREE) {
4894 
4895          WRW_HARPOON((ioport+hp_intstat), BUS_FREE);
4896 
4897         	if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
4898 
4899            	hostDataXferAbort(ioport,thisCard,currSCCB);
4900 				}
4901 
4902          phaseBusFree(ioport,thisCard);
4903 			}
4904 
4905 
4906       else if (hp_int & ITICKLE) {
4907 
4908          WRW_HARPOON((ioport+hp_intstat), ITICKLE);
4909          ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD;
4910          }
4911 
4912 
4913 
4914       if (((PSCCBcard)pCurrCard)->globalFlags & F_NEW_SCCB_CMD) {
4915 
4916 
4917          ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD;
4918 
4919 
4920          if (((PSCCBcard)pCurrCard)->currentSCCB == NULL) {
4921 
4922             queueSearchSelect(((PSCCBcard)pCurrCard),thisCard);
4923             }
4924 
4925          if (((PSCCBcard)pCurrCard)->currentSCCB != NULL) {
4926             ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD;
4927             ssel(ioport,thisCard);
4928             }
4929 
4930          break;
4931 
4932          }
4933 
4934       }  /*end while */
4935 
4936    mOS_Lock((PSCCBcard)pCurrCard);
4937    MENABLE_INT(ioport);
4938    mOS_UnLock((PSCCBcard)pCurrCard);
4939 
4940    return(0);
4941 }
4942 
4943 /*---------------------------------------------------------------------
4944  *
4945  * Function: Sccb_bad_isr
4946  *
4947  * Description: Some type of interrupt has occurred which is slightly
4948  *              out of the ordinary.  We will now decode it fully, in
4949  *              this routine.  This is broken up in an attempt to save
4950  *              processing time.
4951  *
4952  *---------------------------------------------------------------------*/
4953 #if defined(DOS)
SccbMgr_bad_isr(USHORT p_port,UCHAR p_card,PSCCBcard pCurrCard,USHORT p_int)4954 UCHAR SccbMgr_bad_isr(USHORT p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int)
4955 #else
4956 UCHAR SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int)
4957 #endif
4958 {
4959 #if defined(HARP_REVX)
4960    ULONG timer;
4961 #endif
4962 UCHAR temp, ScamFlg;
4963 PSCCBMgr_tar_info currTar_Info;
4964 PNVRamInfo pCurrNvRam;
4965 
4966 
4967    if (RD_HARPOON(p_port+hp_ext_status) &
4968          (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN) )
4969       {
4970 
4971       if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
4972          {
4973 
4974          hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
4975          }
4976 
4977       if (RD_HARPOON(p_port+hp_pci_stat_cfg) & REC_MASTER_ABORT)
4978 
4979          {
4980          WR_HARPOON(p_port+hp_pci_stat_cfg,
4981             (RD_HARPOON(p_port+hp_pci_stat_cfg) & ~REC_MASTER_ABORT));
4982 
4983          WR_HARPOON(p_port+hp_host_blk_cnt, 0x00);
4984 
4985          }
4986 
4987       if (pCurrCard->currentSCCB != NULL)
4988          {
4989 
4990          if (!pCurrCard->currentSCCB->HostStatus)
4991             pCurrCard->currentSCCB->HostStatus = SCCB_BM_ERR;
4992 
4993          sxfrp(p_port,p_card);
4994 
4995 	     temp = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) &
4996 							(EXT_ARB_ACK | SCSI_TERM_ENA_H));
4997       	WR_HARPOON(p_port+hp_ee_ctrl, ((UCHAR)temp | SEE_MS | SEE_CS));
4998          WR_HARPOON(p_port+hp_ee_ctrl, temp);
4999 
5000          if (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
5001             {
5002             phaseDecode(p_port,p_card);
5003             }
5004          }
5005       }
5006 
5007 
5008    else if (p_int & RESET)
5009          {
5010 
5011 				WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT);
5012 				WR_HARPOON(p_port+hp_sys_ctrl, 0x00);
5013            if (pCurrCard->currentSCCB != NULL) {
5014 
5015                if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
5016 
5017                hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
5018                }
5019 
5020 
5021            DISABLE_AUTO(p_port);
5022 
5023            sresb(p_port,p_card);
5024 
5025            while(RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST) {}
5026 
5027 				pCurrNvRam = pCurrCard->pNvRamInfo;
5028 				if(pCurrNvRam){
5029 					ScamFlg = pCurrNvRam->niScamConf;
5030 				}
5031 				else{
5032 				   ScamFlg = (UCHAR) utilEERead(p_port, SCAM_CONFIG/2);
5033 				}
5034 
5035            XbowInit(p_port, ScamFlg);
5036 
5037                scini(p_card, pCurrCard->ourId, 0);
5038 
5039            return(0xFF);
5040          }
5041 
5042 
5043    else if (p_int & FIFO) {
5044 
5045       WRW_HARPOON((p_port+hp_intstat), FIFO);
5046 
5047 #if defined(HARP_REVX)
5048 
5049       for (timer=0x00FFFFFFL; timer != 0x00000000L; timer--) {
5050 
5051          if (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)
5052             break;
5053 
5054          if (RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)
5055             break;
5056          }
5057 
5058 
5059       if ( (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY) &&
5060            (RD_HARPOON(p_port+hp_fiforead) !=
5061             RD_HARPOON(p_port+hp_fifowrite)) &&
5062            (RD_HARPOON(p_port+hp_xfercnt_0))
5063          )
5064 
5065             WR_HARPOON((p_port+hp_xferstat), 0x01);
5066 
5067 /*      else
5068  */
5069 /*         sxfrp(p_port,p_card);
5070  */
5071 #else
5072       if (pCurrCard->currentSCCB != NULL)
5073          sxfrp(p_port,p_card);
5074 #endif
5075       }
5076 
5077    else if (p_int & TIMEOUT)
5078       {
5079 
5080       DISABLE_AUTO(p_port);
5081 
5082       WRW_HARPOON((p_port+hp_intstat),
5083 		  (PROG_HLT | TIMEOUT | SEL |BUS_FREE | PHASE | IUNKWN));
5084 
5085       pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT;
5086 
5087 
5088 		currTar_Info = &sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
5089 		if((pCurrCard->globalFlags & F_CONLUN_IO) &&
5090 			((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
5091 	      currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] = FALSE;
5092 		else
5093 	      currTar_Info->TarLUNBusy[0] = FALSE;
5094 
5095 
5096       if (currTar_Info->TarEEValue & EE_SYNC_MASK)
5097          {
5098 	       currTar_Info->TarSyncCtrl = 0;
5099          currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
5100          }
5101 
5102       if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
5103          {
5104          currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
5105          }
5106 
5107       sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,currTar_Info);
5108 
5109       queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
5110 
5111       }
5112 
5113 #if defined(SCAM_LEV_2)
5114 
5115    else if (p_int & SCAM_SEL)
5116       {
5117 
5118       scarb(p_port,LEVEL2_TAR);
5119       scsel(p_port);
5120       scasid(p_card, p_port);
5121 
5122       scbusf(p_port);
5123 
5124       WRW_HARPOON((p_port+hp_intstat), SCAM_SEL);
5125       }
5126 #endif
5127 
5128    return(0x00);
5129 }
5130 
5131 
5132 /*---------------------------------------------------------------------
5133  *
5134  * Function: SccbMgr_scsi_reset
5135  *
5136  * Description: A SCSI bus reset will be generated and all outstanding
5137  *              Sccbs will be returned via the callback.
5138  *
5139  *---------------------------------------------------------------------*/
5140 #if (FW_TYPE==_UCB_MGR_)
SccbMgr_scsi_reset(CARD_HANDLE pCurrCard)5141 void SccbMgr_scsi_reset(CARD_HANDLE pCurrCard)
5142 #else
5143 #if defined(DOS)
5144 void SccbMgr_scsi_reset(USHORT pCurrCard)
5145 #else
5146 void SccbMgr_scsi_reset(ULONG pCurrCard)
5147 #endif
5148 #endif
5149 {
5150    UCHAR thisCard;
5151 
5152    thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
5153 
5154    mOS_Lock((PSCCBcard)pCurrCard);
5155 
5156    if (((PSCCBcard) pCurrCard)->globalFlags & F_GREEN_PC)
5157       {
5158       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_clkctrl_0, CLKCTRL_DEFAULT);
5159       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_sys_ctrl, 0x00);
5160       }
5161 
5162    sresb(((PSCCBcard)pCurrCard)->ioPort,thisCard);
5163 
5164    if (RD_HARPOON(((PSCCBcard)pCurrCard)->ioPort+hp_ext_status) & BM_CMD_BUSY)
5165       {
5166       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_page_ctrl,
5167          (RD_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_page_ctrl)
5168          & ~SCATTER_EN));
5169 
5170       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_sg_addr,0x00);
5171 
5172       ((PSCCBcard) pCurrCard)->globalFlags &= ~F_HOST_XFER_ACT;
5173       busMstrTimeOut(((PSCCBcard) pCurrCard)->ioPort);
5174 
5175       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_int_mask,
5176          (INT_CMD_COMPL | SCSI_INTERRUPT));
5177       }
5178 
5179 /*
5180       if (utilEERead(((PSCCBcard)pCurrCard)->ioPort, (SCAM_CONFIG/2))
5181             & SCAM_ENABLED)
5182 */
5183          scini(thisCard, ((PSCCBcard)pCurrCard)->ourId, 0);
5184 
5185 #if (FW_TYPE==_UCB_MGR_)
5186    ((PSCCBcard)pCurrCard)->cardInfo->ai_AEN_routine(0x01,pCurrCard,0,0,0,0);
5187 #endif
5188 
5189    mOS_UnLock((PSCCBcard)pCurrCard);
5190 }
5191 
5192 
5193 /*---------------------------------------------------------------------
5194  *
5195  * Function: SccbMgr_timer_expired
5196  *
5197  * Description: This function allow me to kill my own job that has not
5198  *              yet completed, and has cause a timeout to occur.  This
5199  *              timeout has caused the upper level driver to call this
5200  *              function.
5201  *
5202  *---------------------------------------------------------------------*/
5203 
5204 #if (FW_TYPE==_UCB_MGR_)
SccbMgr_timer_expired(CARD_HANDLE pCurrCard)5205 void SccbMgr_timer_expired(CARD_HANDLE pCurrCard)
5206 #else
5207 #if defined(DOS)
5208 void SccbMgr_timer_expired(USHORT pCurrCard)
5209 #else
5210 void SccbMgr_timer_expired(ULONG pCurrCard)
5211 #endif
5212 #endif
5213 {
5214 }
5215 
5216 #if defined(DOS)
5217 /*---------------------------------------------------------------------
5218  *
5219  * Function: SccbMgr_status
5220  *
5221  * Description: This function returns the number of outstanding SCCB's.
5222  *              This is specific to the DOS enviroment, which needs this
5223  *              to help them keep protected and real mode commands staight.
5224  *
5225  *---------------------------------------------------------------------*/
5226 
SccbMgr_status(USHORT pCurrCard)5227 USHORT SccbMgr_status(USHORT pCurrCard)
5228 {
5229    return(BL_Card[pCurrCard].cmdCounter);
5230 }
5231 #endif
5232 
5233 /*---------------------------------------------------------------------
5234  *
5235  * Function: SccbMgrTableInit
5236  *
5237  * Description: Initialize all Sccb manager data structures.
5238  *
5239  *---------------------------------------------------------------------*/
5240 
SccbMgrTableInitAll()5241 void SccbMgrTableInitAll()
5242 {
5243    UCHAR thisCard;
5244 
5245    for (thisCard = 0; thisCard < MAX_CARDS; thisCard++)
5246       {
5247       SccbMgrTableInitCard(&BL_Card[thisCard],thisCard);
5248 
5249       BL_Card[thisCard].ioPort      = 0x00;
5250       BL_Card[thisCard].cardInfo    = NULL;
5251       BL_Card[thisCard].cardIndex   = 0xFF;
5252       BL_Card[thisCard].ourId       = 0x00;
5253 		BL_Card[thisCard].pNvRamInfo	= NULL;
5254       }
5255 }
5256 
5257 
5258 /*---------------------------------------------------------------------
5259  *
5260  * Function: SccbMgrTableInit
5261  *
5262  * Description: Initialize all Sccb manager data structures.
5263  *
5264  *---------------------------------------------------------------------*/
5265 
SccbMgrTableInitCard(PSCCBcard pCurrCard,UCHAR p_card)5266 void SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card)
5267 {
5268    UCHAR scsiID, qtag;
5269 
5270 	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
5271 	{
5272 		BL_Card[p_card].discQ_Tbl[qtag] = NULL;
5273 	}
5274 
5275    for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
5276       {
5277       sccbMgrTbl[p_card][scsiID].TarStatus = 0;
5278       sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
5279       SccbMgrTableInitTarget(p_card, scsiID);
5280       }
5281 
5282    pCurrCard->scanIndex = 0x00;
5283    pCurrCard->currentSCCB = NULL;
5284    pCurrCard->globalFlags = 0x00;
5285    pCurrCard->cmdCounter  = 0x00;
5286 	pCurrCard->tagQ_Lst = 0x01;
5287 	pCurrCard->discQCount = 0;
5288 
5289 
5290 }
5291 
5292 
5293 /*---------------------------------------------------------------------
5294  *
5295  * Function: SccbMgrTableInit
5296  *
5297  * Description: Initialize all Sccb manager data structures.
5298  *
5299  *---------------------------------------------------------------------*/
5300 
SccbMgrTableInitTarget(UCHAR p_card,UCHAR target)5301 void SccbMgrTableInitTarget(UCHAR p_card, UCHAR target)
5302 {
5303 
5304 	UCHAR lun, qtag;
5305 	PSCCBMgr_tar_info currTar_Info;
5306 
5307 	currTar_Info = &sccbMgrTbl[p_card][target];
5308 
5309 	currTar_Info->TarSelQ_Cnt = 0;
5310 	currTar_Info->TarSyncCtrl = 0;
5311 
5312 	currTar_Info->TarSelQ_Head = NULL;
5313 	currTar_Info->TarSelQ_Tail = NULL;
5314 	currTar_Info->TarTagQ_Cnt = 0;
5315 	currTar_Info->TarLUN_CA = FALSE;
5316 
5317 
5318 	for (lun = 0; lun < MAX_LUN; lun++)
5319 	{
5320 		currTar_Info->TarLUNBusy[lun] = FALSE;
5321 		currTar_Info->LunDiscQ_Idx[lun] = 0;
5322 	}
5323 
5324 	for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
5325 	{
5326 		if(BL_Card[p_card].discQ_Tbl[qtag] != NULL)
5327 		{
5328 			if(BL_Card[p_card].discQ_Tbl[qtag]->TargID == target)
5329 			{
5330 				BL_Card[p_card].discQ_Tbl[qtag] = NULL;
5331 				BL_Card[p_card].discQCount--;
5332 			}
5333 		}
5334 	}
5335 }
5336 
5337 #if defined(BUGBUG)
5338 
5339 /*****************************************************************
5340  * Save the current byte in the debug array
5341  *****************************************************************/
5342 
5343 
Debug_Load(UCHAR p_card,UCHAR p_bug_data)5344 void Debug_Load(UCHAR p_card, UCHAR p_bug_data)
5345 {
5346    debug_int[p_card][debug_index[p_card]] = p_bug_data;
5347    debug_index[p_card]++;
5348 
5349    if (debug_index[p_card] == debug_size)
5350 
5351       debug_index[p_card] = 0;
5352 }
5353 
5354 #endif
5355 #ident "$Id: sccb_dat.c 1.10 1997/02/22 03:16:02 awin Exp $"
5356 /*----------------------------------------------------------------------
5357  *
5358  *
5359  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
5360  *
5361  *   This file is available under both the GNU General Public License
5362  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
5363  *
5364  *   $Workfile:   sccb_dat.c  $
5365  *
5366  *   Description:  Functions relating to handling of the SCCB interface
5367  *                 between the device driver and the HARPOON.
5368  *
5369  *   $Date: 1997/02/22 03:16:02 $
5370  *
5371  *   $Revision: 1.10 $
5372  *
5373  *----------------------------------------------------------------------*/
5374 
5375 /*#include <globals.h>*/
5376 
5377 #if (FW_TYPE==_UCB_MGR_)
5378 	/*#include <budi.h>*/
5379 #endif
5380 
5381 /*#include <sccbmgr.h>*/
5382 /*#include <blx30.h>*/
5383 /*#include <target.h>*/
5384 /*#include <harpoon.h>*/
5385 
5386 /*
5387 **  IMPORTANT NOTE!!!
5388 **
5389 **  You MUST preassign all data to a valid value or zero.  This is
5390 **  required due to the MS compiler bug under OS/2 and Solaris Real-Mode
5391 **  driver environment.
5392 */
5393 
5394 
5395 SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] = { { { 0 } } };
5396 SCCBCARD BL_Card[MAX_CARDS] = { { 0 } };
5397 SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR] = { { { 0 } } };
5398 NVRAMINFO nvRamInfo[MAX_MB_CARDS] = { { 0 } };
5399 
5400 
5401 #if defined(OS2)
5402 void (far *s_PhaseTbl[8]) (ULONG, UCHAR) = { 0 };
5403 UCHAR temp_id_string[ID_STRING_LENGTH] = { 0 };
5404 #elif defined(SOLARIS_REAL_MODE) || defined(__STDC__)
5405 void (*s_PhaseTbl[8]) (ULONG, UCHAR) = { 0 };
5406 #else
5407 void (*s_PhaseTbl[8]) ();
5408 #endif
5409 
5410 #if defined(DOS)
5411 UCHAR first_time = 0;
5412 #endif
5413 
5414 UCHAR mbCards = 0;
5415 UCHAR scamHAString[] = {0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C', \
5416 								' ', 'B', 'T', '-', '9', '3', '0', \
5417 								0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \
5418 								0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
5419 
5420 USHORT default_intena = 0;
5421 
5422 #if defined(BUGBUG)
5423 UCHAR    debug_int[MAX_CARDS][debug_size] = { 0 };
5424 UCHAR    debug_index[MAX_CARDS] = { 0 };
5425 UCHAR    reserved_1[3] = { 0 };
5426 #endif
5427 #ident "$Id: scsi.c 1.23 1997/07/09 21:42:54 mohan Exp $"
5428 /*----------------------------------------------------------------------
5429  *
5430  *
5431  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
5432  *
5433  *   This file is available under both the GNU General Public License
5434  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
5435  *
5436  *   $Workfile:   scsi.c  $
5437  *
5438  *   Description:  Functions for handling SCSI bus functions such as
5439  *                 selection/reselection, sync negotiation, message-in
5440  *                 decoding.
5441  *
5442  *   $Date: 1997/07/09 21:42:54 $
5443  *
5444  *   $Revision: 1.23 $
5445  *
5446  *----------------------------------------------------------------------*/
5447 
5448 /*#include <globals.h>*/
5449 
5450 #if (FW_TYPE==_UCB_MGR_)
5451 	/*#include <budi.h>*/
5452 #endif
5453 
5454 /*#include <sccbmgr.h>*/
5455 /*#include <blx30.h>*/
5456 /*#include <target.h>*/
5457 /*#include <scsi2.h>*/
5458 /*#include <eeprom.h>*/
5459 /*#include <harpoon.h>*/
5460 
5461 
5462 /*
5463 extern SCCBCARD BL_Card[MAX_CARDS];
5464 extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
5465 #if defined(BUGBUG)
5466 void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
5467 #endif
5468 */
5469 
5470 /*---------------------------------------------------------------------
5471  *
5472  * Function: sfetm
5473  *
5474  * Description: Read in a message byte from the SCSI bus, and check
5475  *              for a parity error.
5476  *
5477  *---------------------------------------------------------------------*/
5478 
5479 #if defined(DOS)
sfm(USHORT port,PSCCB pCurrSCCB)5480 UCHAR sfm(USHORT port, PSCCB pCurrSCCB)
5481 #else
5482 UCHAR sfm(ULONG port, PSCCB pCurrSCCB)
5483 #endif
5484 {
5485 	UCHAR message;
5486 	USHORT TimeOutLoop;
5487 
5488 	TimeOutLoop = 0;
5489 	while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
5490 			(TimeOutLoop++ < 20000) ){}
5491 
5492 
5493 	WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
5494 
5495 	message = RD_HARPOON(port+hp_scsidata_0);
5496 
5497 	WR_HARPOON(port+hp_scsisig, SCSI_ACK + S_MSGI_PH);
5498 
5499 
5500 	if (TimeOutLoop > 20000)
5501 		message = 0x00;   /* force message byte = 0 if Time Out on Req */
5502 
5503 	if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
5504 		(RD_HARPOON(port+hp_addstat) & SCSI_PAR_ERR))
5505 	{
5506 		WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
5507 		WR_HARPOON(port+hp_xferstat, 0);
5508 		WR_HARPOON(port+hp_fiforead, 0);
5509 		WR_HARPOON(port+hp_fifowrite, 0);
5510 		if (pCurrSCCB != NULL)
5511 		{
5512 			pCurrSCCB->Sccb_scsimsg = SMPARITY;
5513 		}
5514 		message = 0x00;
5515 		do
5516 		{
5517 			ACCEPT_MSG_ATN(port);
5518 			TimeOutLoop = 0;
5519 			while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
5520 				(TimeOutLoop++ < 20000) ){}
5521 			if (TimeOutLoop > 20000)
5522 			{
5523 				WRW_HARPOON((port+hp_intstat), PARITY);
5524 				return(message);
5525 			}
5526 			if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) != S_MSGI_PH)
5527 			{
5528 				WRW_HARPOON((port+hp_intstat), PARITY);
5529 				return(message);
5530 			}
5531 			WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
5532 
5533 			RD_HARPOON(port+hp_scsidata_0);
5534 
5535 			WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
5536 
5537 		}while(1);
5538 
5539 	}
5540 	WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
5541 	WR_HARPOON(port+hp_xferstat, 0);
5542 	WR_HARPOON(port+hp_fiforead, 0);
5543 	WR_HARPOON(port+hp_fifowrite, 0);
5544 	return(message);
5545 }
5546 
5547 
5548 /*---------------------------------------------------------------------
5549  *
5550  * Function: ssel
5551  *
5552  * Description: Load up automation and select target device.
5553  *
5554  *---------------------------------------------------------------------*/
5555 
5556 #if defined(DOS)
ssel(USHORT port,UCHAR p_card)5557 void ssel(USHORT port, UCHAR p_card)
5558 #else
5559 void ssel(ULONG port, UCHAR p_card)
5560 #endif
5561 {
5562 
5563 #if defined(DOS)
5564    UCHAR auto_loaded, i, target, *theCCB;
5565 #elif defined(OS2)
5566    UCHAR auto_loaded, i, target;
5567    UCHAR far *theCCB;
5568 #else
5569    UCHAR auto_loaded, i, target, *theCCB;
5570 #endif
5571 
5572 #if defined(DOS)
5573    USHORT cdb_reg;
5574 #else
5575    ULONG cdb_reg;
5576 #endif
5577    PSCCBcard CurrCard;
5578    PSCCB currSCCB;
5579    PSCCBMgr_tar_info currTar_Info;
5580    UCHAR lastTag, lun;
5581 
5582    CurrCard = &BL_Card[p_card];
5583    currSCCB = CurrCard->currentSCCB;
5584    target = currSCCB->TargID;
5585    currTar_Info = &sccbMgrTbl[p_card][target];
5586    lastTag = CurrCard->tagQ_Lst;
5587 
5588    ARAM_ACCESS(port);
5589 
5590 
5591 	if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
5592 		currSCCB->ControlByte &= ~F_USE_CMD_Q;
5593 
5594 	if(((CurrCard->globalFlags & F_CONLUN_IO) &&
5595 		((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
5596 
5597 	   lun = currSCCB->Lun;
5598 	else
5599 		lun = 0;
5600 
5601 
5602 #if defined(DOS)
5603    currTar_Info->TarLUNBusy[lun] = TRUE;
5604 
5605 #else
5606 
5607    if (CurrCard->globalFlags & F_TAG_STARTED)
5608       {
5609       if (!(currSCCB->ControlByte & F_USE_CMD_Q))
5610          {
5611       	if ((currTar_Info->TarLUN_CA == FALSE)
5612       	    && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
5613       	    == TAG_Q_TRYING))
5614             {
5615 
5616 	         if (currTar_Info->TarTagQ_Cnt !=0)
5617                   {
5618          		   currTar_Info->TarLUNBusy[lun] = TRUE;
5619             		queueSelectFail(CurrCard,p_card);
5620 					   SGRAM_ACCESS(port);
5621          		   return;
5622          		   }
5623 
5624             else {
5625          		  currTar_Info->TarLUNBusy[lun] = TRUE;
5626          		  }
5627 
5628    	      }  /*End non-tagged */
5629 
5630 	      else {
5631 	         currTar_Info->TarLUNBusy[lun] = TRUE;
5632 	         }
5633 
5634 	      }  /*!Use cmd Q Tagged */
5635 
5636 	   else {
5637    	     if (currTar_Info->TarLUN_CA == TRUE)
5638                {
5639       	      queueSelectFail(CurrCard,p_card);
5640 				   SGRAM_ACCESS(port);
5641       	      return;
5642 	            }
5643 
5644 	        currTar_Info->TarLUNBusy[lun] = TRUE;
5645 
5646    	     }  /*else use cmd Q tagged */
5647 
5648       }  /*if glob tagged started */
5649 
5650    else {
5651         currTar_Info->TarLUNBusy[lun] = TRUE;
5652         }
5653 
5654 #endif /* DOS */
5655 
5656 
5657 
5658 	if((((CurrCard->globalFlags & F_CONLUN_IO) &&
5659 		((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
5660 		|| (!(currSCCB->ControlByte & F_USE_CMD_Q))))
5661 	{
5662 		if(CurrCard->discQCount >= QUEUE_DEPTH)
5663 		{
5664 			currTar_Info->TarLUNBusy[lun] = TRUE;
5665 			queueSelectFail(CurrCard,p_card);
5666 			SGRAM_ACCESS(port);
5667 			return;
5668 		}
5669 		for (i = 1; i < QUEUE_DEPTH; i++)
5670 		{
5671 			if (++lastTag >= QUEUE_DEPTH) lastTag = 1;
5672 			if (CurrCard->discQ_Tbl[lastTag] == NULL)
5673 			{
5674 				CurrCard->tagQ_Lst = lastTag;
5675 				currTar_Info->LunDiscQ_Idx[lun] = lastTag;
5676 				CurrCard->discQ_Tbl[lastTag] = currSCCB;
5677 				CurrCard->discQCount++;
5678 				break;
5679 			}
5680 		}
5681 		if(i == QUEUE_DEPTH)
5682 		{
5683 			currTar_Info->TarLUNBusy[lun] = TRUE;
5684 			queueSelectFail(CurrCard,p_card);
5685 			SGRAM_ACCESS(port);
5686 			return;
5687 		}
5688 	}
5689 
5690 
5691 
5692    auto_loaded = FALSE;
5693 
5694    WR_HARPOON(port+hp_select_id, target);
5695    WR_HARPOON(port+hp_gp_reg_3, target);  /* Use by new automation logic */
5696 
5697    if (currSCCB->OperationCode == RESET_COMMAND) {
5698       WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+
5699                	 (currSCCB->Sccb_idmsg & ~DISC_PRIV)));
5700 
5701       WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+NP);
5702 
5703       currSCCB->Sccb_scsimsg = SMDEV_RESET;
5704 
5705       WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5706       auto_loaded = TRUE;
5707       currSCCB->Sccb_scsistat = SELECT_BDR_ST;
5708 
5709       if (currTar_Info->TarEEValue & EE_SYNC_MASK)
5710          {
5711 	       currTar_Info->TarSyncCtrl = 0;
5712 	      currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
5713 	      }
5714 
5715 #if defined(WIDE_SCSI)
5716 
5717       if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
5718          {
5719       	currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
5720       	}
5721 #endif
5722 
5723       sssyncv(port, target, NARROW_SCSI,currTar_Info);
5724       SccbMgrTableInitTarget(p_card, target);
5725 
5726       }
5727 
5728 		else if(currSCCB->Sccb_scsistat == ABORT_ST)
5729 		{
5730 			WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+
5731 								(currSCCB->Sccb_idmsg & ~DISC_PRIV)));
5732 
5733       WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
5734 
5735 			WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+
5736 								(((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK)
5737 								>> 6) | (UCHAR)0x20)));
5738 			WRW_HARPOON((port+SYNC_MSGS+2),
5739 							(MPM_OP+AMSG_OUT+currSCCB->Sccb_tag));
5740 			WRW_HARPOON((port+SYNC_MSGS+4), (BRH_OP+ALWAYS+NP ));
5741 
5742 			WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5743 			auto_loaded = TRUE;
5744 
5745 		}
5746 
5747 #if defined(WIDE_SCSI)
5748 
5749 
5750    else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED))  {
5751       auto_loaded = siwidn(port,p_card);
5752       currSCCB->Sccb_scsistat = SELECT_WN_ST;
5753       }
5754 
5755 #endif
5756 
5757 
5758    else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK)
5759       == SYNC_SUPPORTED))  {
5760       auto_loaded = sisyncn(port,p_card, FALSE);
5761       currSCCB->Sccb_scsistat = SELECT_SN_ST;
5762       }
5763 
5764 
5765    if (!auto_loaded)
5766       {
5767 
5768 #if !defined(DOS)
5769       if (currSCCB->ControlByte & F_USE_CMD_Q)
5770          {
5771 
5772          CurrCard->globalFlags |= F_TAG_STARTED;
5773 
5774          if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
5775             == TAG_Q_REJECT)
5776             {
5777             currSCCB->ControlByte &= ~F_USE_CMD_Q;
5778 
5779             /* Fix up the start instruction with a jump to
5780                Non-Tag-CMD handling */
5781             WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD);
5782 
5783             WRW_HARPOON((port+NON_TAG_ID_MSG),
5784 	                     (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
5785 
5786 	         WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5787 
5788 	         /* Setup our STATE so we know what happend when
5789                the wheels fall off. */
5790             currSCCB->Sccb_scsistat = SELECT_ST;
5791 
5792 	         currTar_Info->TarLUNBusy[lun] = TRUE;
5793             }
5794 
5795          else
5796             {
5797             WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
5798 
5799             WRW_HARPOON((port+ID_MSG_STRT+2), (MPM_OP+AMSG_OUT+
5800                         (((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK)
5801                         >> 6) | (UCHAR)0x20)));
5802 
5803 				for (i = 1; i < QUEUE_DEPTH; i++)
5804 				{
5805 					if (++lastTag >= QUEUE_DEPTH) lastTag = 1;
5806 					if (CurrCard->discQ_Tbl[lastTag] == NULL)
5807 					{
5808 						WRW_HARPOON((port+ID_MSG_STRT+6),
5809 							(MPM_OP+AMSG_OUT+lastTag));
5810 						CurrCard->tagQ_Lst = lastTag;
5811 						currSCCB->Sccb_tag = lastTag;
5812 						CurrCard->discQ_Tbl[lastTag] = currSCCB;
5813 						CurrCard->discQCount++;
5814 						break;
5815 					}
5816 				}
5817 
5818 
5819             if ( i == QUEUE_DEPTH )
5820                {
5821    	         currTar_Info->TarLUNBusy[lun] = TRUE;
5822                queueSelectFail(CurrCard,p_card);
5823 				   SGRAM_ACCESS(port);
5824    	         return;
5825    	         }
5826 
5827             currSCCB->Sccb_scsistat = SELECT_Q_ST;
5828 
5829    	      WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5830             }
5831          }
5832 
5833       else
5834          {
5835 #endif   /* !DOS */
5836 
5837          WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD);
5838 
5839       	WRW_HARPOON((port+NON_TAG_ID_MSG),
5840             (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
5841 
5842          currSCCB->Sccb_scsistat = SELECT_ST;
5843 
5844          WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
5845 #if !defined(DOS)
5846          }
5847 #endif
5848 
5849 
5850 #if defined(OS2)
5851       theCCB = (UCHAR far *)&currSCCB->Cdb[0];
5852 #else
5853       theCCB = (UCHAR *)&currSCCB->Cdb[0];
5854 #endif
5855 
5856       cdb_reg = port + CMD_STRT;
5857 
5858       for (i=0; i < currSCCB->CdbLength; i++)
5859          {
5860          WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB));
5861          cdb_reg +=2;
5862          theCCB++;
5863          }
5864 
5865       if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
5866          WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+    NP));
5867 
5868       }  /* auto_loaded */
5869 
5870 #if defined(WIDE_SCSI)
5871    WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
5872    WR_HARPOON(port+hp_xferstat, 0x00);
5873 #endif
5874 
5875    WRW_HARPOON((port+hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE));
5876 
5877    WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT));
5878 
5879 
5880    if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED))
5881       {
5882       WR_HARPOON(port+hp_scsictrl_0, (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL));
5883       }
5884    else
5885       {
5886 
5887 /*      auto_loaded =  (RD_HARPOON(port+hp_autostart_3) & (UCHAR)0x1F);
5888       auto_loaded |= AUTO_IMMED; */
5889       auto_loaded = AUTO_IMMED;
5890 
5891       DISABLE_AUTO(port);
5892 
5893       WR_HARPOON(port+hp_autostart_3, auto_loaded);
5894       }
5895 
5896    SGRAM_ACCESS(port);
5897 }
5898 
5899 
5900 /*---------------------------------------------------------------------
5901  *
5902  * Function: sres
5903  *
5904  * Description: Hookup the correct CCB and handle the incoming messages.
5905  *
5906  *---------------------------------------------------------------------*/
5907 
5908 #if defined(DOS)
sres(USHORT port,UCHAR p_card,PSCCBcard pCurrCard)5909 void sres(USHORT port, UCHAR p_card, PSCCBcard pCurrCard)
5910 #else
5911 void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
5912 #endif
5913 {
5914 
5915 #if defined(V302)
5916 #ifdef DOS
5917    UCHAR our_target,message, msgRetryCount;
5918    extern UCHAR lun, tag;
5919 #else
5920    UCHAR our_target,message,lun,tag, msgRetryCount;
5921 #endif
5922 
5923 #else  /* V302 */
5924    UCHAR our_target, message, lun = 0, tag, msgRetryCount;
5925 #endif /* V302 */
5926 
5927 
5928    PSCCBMgr_tar_info currTar_Info;
5929 	PSCCB currSCCB;
5930 
5931 
5932 
5933 
5934 	if(pCurrCard->currentSCCB != NULL)
5935 	{
5936 		currTar_Info = &sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
5937 		DISABLE_AUTO(port);
5938 
5939 
5940 		WR_HARPOON((port+hp_scsictrl_0),(ENA_RESEL | ENA_SCAM_SEL));
5941 
5942 
5943 		currSCCB = pCurrCard->currentSCCB;
5944 		if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
5945 		{
5946 			currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
5947 			currSCCB->Sccb_scsistat = BUS_FREE_ST;
5948 		}
5949 		if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
5950 		{
5951 			currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
5952 			currSCCB->Sccb_scsistat = BUS_FREE_ST;
5953 		}
5954 		if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
5955 			((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
5956 		{
5957       	currTar_Info->TarLUNBusy[currSCCB->Lun] = FALSE;
5958 			if(currSCCB->Sccb_scsistat != ABORT_ST)
5959 			{
5960 				pCurrCard->discQCount--;
5961 				pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[currSCCB->Lun]]
5962 													= NULL;
5963 			}
5964 		}
5965 		else
5966 		{
5967 	      currTar_Info->TarLUNBusy[0] = FALSE;
5968 			if(currSCCB->Sccb_tag)
5969 			{
5970 				if(currSCCB->Sccb_scsistat != ABORT_ST)
5971 				{
5972 					pCurrCard->discQCount--;
5973 					pCurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL;
5974 				}
5975 			}else
5976 			{
5977 				if(currSCCB->Sccb_scsistat != ABORT_ST)
5978 				{
5979 					pCurrCard->discQCount--;
5980 					pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
5981 				}
5982 			}
5983 		}
5984 
5985       queueSelectFail(&BL_Card[p_card],p_card);
5986 	}
5987 
5988 #if defined(WIDE_SCSI)
5989 	WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
5990 #endif
5991 
5992 
5993 	our_target = (UCHAR)(RD_HARPOON(port+hp_select_id) >> 4);
5994 	currTar_Info = &sccbMgrTbl[p_card][our_target];
5995 
5996 
5997 	msgRetryCount = 0;
5998 	do
5999 	{
6000 
6001 #if defined(V302)
6002 
6003 		message = GetTarLun(port, p_card, our_target, pCurrCard, &tag, &lun);
6004 
6005 #else /* V302 */
6006 
6007 		currTar_Info = &sccbMgrTbl[p_card][our_target];
6008 		tag = 0;
6009 
6010 
6011 		while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
6012 		{
6013 			if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
6014 			{
6015 
6016 				WRW_HARPOON((port+hp_intstat), PHASE);
6017 				return;
6018 			}
6019 		}
6020 
6021 		WRW_HARPOON((port+hp_intstat), PHASE);
6022 		if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH)
6023 		{
6024 
6025 			message = sfm(port,pCurrCard->currentSCCB);
6026 			if (message)
6027 			{
6028 
6029 				if (message <= (0x80 | LUN_MASK))
6030 				{
6031 					lun = message & (UCHAR)LUN_MASK;
6032 
6033 #if !defined(DOS)
6034 					if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING)
6035 					{
6036 						if (currTar_Info->TarTagQ_Cnt != 0)
6037 						{
6038 
6039 							if (!(currTar_Info->TarLUN_CA))
6040 							{
6041 								ACCEPT_MSG(port);    /*Release the ACK for ID msg. */
6042 
6043 
6044 								message = sfm(port,pCurrCard->currentSCCB);
6045 								if (message)
6046 								{
6047 									ACCEPT_MSG(port);
6048 								}
6049 
6050 								else
6051    								message = FALSE;
6052 
6053 								if(message != FALSE)
6054 								{
6055 									tag = sfm(port,pCurrCard->currentSCCB);
6056 
6057 									if (!(tag))
6058 										message = FALSE;
6059 								}
6060 
6061 							} /*C.A. exists! */
6062 
6063 						} /*End Q cnt != 0 */
6064 
6065 					} /*End Tag cmds supported! */
6066 #endif /* !DOS */
6067 
6068 				} /*End valid ID message.  */
6069 
6070 				else
6071 				{
6072 
6073 					ACCEPT_MSG_ATN(port);
6074 				}
6075 
6076 			} /* End good id message. */
6077 
6078 			else
6079 			{
6080 
6081 				message = FALSE;
6082 			}
6083 		}
6084 		else
6085 		{
6086 			ACCEPT_MSG_ATN(port);
6087 
6088 		   while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) &&
6089 			  !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) &&
6090 			  (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ;
6091 
6092 			return;
6093 		}
6094 
6095 #endif /* V302 */
6096 
6097 		if(message == FALSE)
6098 		{
6099 			msgRetryCount++;
6100 			if(msgRetryCount == 1)
6101 			{
6102 				SendMsg(port, SMPARITY);
6103 			}
6104 			else
6105 			{
6106 				SendMsg(port, SMDEV_RESET);
6107 
6108 				sssyncv(port, our_target, NARROW_SCSI,currTar_Info);
6109 
6110 				if (sccbMgrTbl[p_card][our_target].TarEEValue & EE_SYNC_MASK)
6111 				{
6112 
6113 					sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_SYNC_MASK;
6114 
6115 				}
6116 
6117 				if (sccbMgrTbl[p_card][our_target].TarEEValue & EE_WIDE_SCSI)
6118 				{
6119 
6120 					sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_WIDE_MASK;
6121 				}
6122 
6123 
6124 				queueFlushTargSccb(p_card, our_target, SCCB_COMPLETE);
6125 				SccbMgrTableInitTarget(p_card,our_target);
6126 				return;
6127 			}
6128 		}
6129 	}while(message == FALSE);
6130 
6131 
6132 
6133 	if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
6134 		((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
6135 	{
6136 		currTar_Info->TarLUNBusy[lun] = TRUE;
6137 		pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
6138 		if(pCurrCard->currentSCCB != NULL)
6139 		{
6140 			ACCEPT_MSG(port);
6141 		}
6142 		else
6143 		{
6144 			ACCEPT_MSG_ATN(port);
6145 		}
6146 	}
6147 	else
6148 	{
6149 		currTar_Info->TarLUNBusy[0] = TRUE;
6150 
6151 
6152 		if (tag)
6153 		{
6154 			if (pCurrCard->discQ_Tbl[tag] != NULL)
6155 			{
6156 				pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[tag];
6157 		 		currTar_Info->TarTagQ_Cnt--;
6158 				ACCEPT_MSG(port);
6159 			}
6160 			else
6161 			{
6162 			ACCEPT_MSG_ATN(port);
6163 			}
6164 		}else
6165 		{
6166 			pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]];
6167 			if(pCurrCard->currentSCCB != NULL)
6168 			{
6169 				ACCEPT_MSG(port);
6170 			}
6171 			else
6172 			{
6173 				ACCEPT_MSG_ATN(port);
6174 			}
6175 		}
6176 	}
6177 
6178 	if(pCurrCard->currentSCCB != NULL)
6179 	{
6180 		if(pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST)
6181 		{
6182 		/* During Abort Tag command, the target could have got re-selected
6183 			and completed the command. Check the select Q and remove the CCB
6184 			if it is in the Select Q */
6185 			queueFindSccb(pCurrCard->currentSCCB, p_card);
6186 		}
6187 	}
6188 
6189 
6190    while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) &&
6191 	  !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) &&
6192 	  (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ;
6193 }
6194 
6195 #if defined(V302)
6196 
6197 #if defined(DOS)
GetTarLun(USHORT port,UCHAR p_card,UCHAR our_target,PSCCBcard pCurrCard,PUCHAR tag,PUCHAR lun)6198 UCHAR GetTarLun(USHORT port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun)
6199 #else
6200 UCHAR GetTarLun(ULONG port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun)
6201 #endif
6202 {
6203    UCHAR message;
6204    PSCCBMgr_tar_info currTar_Info;
6205 
6206 
6207 	currTar_Info = &sccbMgrTbl[p_card][our_target];
6208 	*tag = 0;
6209 
6210 
6211 	while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
6212 	{
6213 		if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
6214 		{
6215 
6216 			WRW_HARPOON((port+hp_intstat), PHASE);
6217 			return(TRUE);
6218 		}
6219 	}
6220 
6221 	WRW_HARPOON((port+hp_intstat), PHASE);
6222 	if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH)
6223 	{
6224 
6225 		message = sfm(port,pCurrCard->currentSCCB);
6226 		if (message)
6227 		{
6228 
6229 			if (message <= (0x80 | LUN_MASK))
6230 			{
6231 				*lun = message & (UCHAR)LUN_MASK;
6232 
6233 #if !defined(DOS)
6234 				if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING)
6235 				{
6236 					if (currTar_Info->TarTagQ_Cnt != 0)
6237 					{
6238 
6239 						if (!(currTar_Info->TarLUN_CA))
6240 						{
6241 							ACCEPT_MSG(port);    /*Release the ACK for ID msg. */
6242 
6243 
6244 							message = sfm(port,pCurrCard->currentSCCB);
6245 							if (message)
6246 							{
6247 								ACCEPT_MSG(port);
6248 							}
6249 
6250 							else
6251    							return(FALSE);
6252 
6253 							*tag = sfm(port,pCurrCard->currentSCCB);
6254 
6255 							if (!(*tag)) return(FALSE);
6256 
6257 						} /*C.A. exists! */
6258 
6259 					} /*End Q cnt != 0 */
6260 
6261 				} /*End Tag cmds supported! */
6262 #endif /* !DOS */
6263 
6264 			} /*End valid ID message.  */
6265 
6266 			else
6267 			{
6268 
6269 				ACCEPT_MSG_ATN(port);
6270 			}
6271 
6272 		} /* End good id message. */
6273 
6274 		else
6275 		{
6276 
6277 			return(FALSE);
6278 		}
6279 	}
6280 	else
6281 	{
6282 		ACCEPT_MSG_ATN(port);
6283 		return(TRUE);
6284 	}
6285 	return(TRUE);
6286 }
6287 
6288 #endif /* V302 */
6289 
6290 #if defined(DOS)
SendMsg(USHORT port,UCHAR message)6291 void SendMsg(USHORT port, UCHAR message)
6292 #else
6293 void SendMsg(ULONG port, UCHAR message)
6294 #endif
6295 {
6296 	while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
6297 	{
6298 		if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
6299 		{
6300 
6301 			WRW_HARPOON((port+hp_intstat), PHASE);
6302 			return;
6303 		}
6304 	}
6305 
6306 	WRW_HARPOON((port+hp_intstat), PHASE);
6307 	if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH)
6308 	{
6309 		WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
6310 
6311 
6312 		WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN);
6313 
6314 		WR_HARPOON(port+hp_scsidata_0,message);
6315 
6316 		WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
6317 
6318 		ACCEPT_MSG(port);
6319 
6320 		WR_HARPOON(port+hp_portctrl_0, 0x00);
6321 
6322 		if ((message == SMABORT) || (message == SMDEV_RESET) ||
6323 				(message == SMABORT_TAG) )
6324 		{
6325 			while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {}
6326 
6327 			if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
6328 			{
6329 			WRW_HARPOON((port+hp_intstat), BUS_FREE);
6330 			}
6331 		}
6332 	}
6333 }
6334 
6335 /*---------------------------------------------------------------------
6336  *
6337  * Function: sdecm
6338  *
6339  * Description: Determine the proper responce to the message from the
6340  *              target device.
6341  *
6342  *---------------------------------------------------------------------*/
6343 #if defined(DOS)
sdecm(UCHAR message,USHORT port,UCHAR p_card)6344 void sdecm(UCHAR message, USHORT port, UCHAR p_card)
6345 #else
6346 void sdecm(UCHAR message, ULONG port, UCHAR p_card)
6347 #endif
6348 {
6349 	PSCCB currSCCB;
6350 	PSCCBcard CurrCard;
6351 	PSCCBMgr_tar_info currTar_Info;
6352 
6353 	CurrCard = &BL_Card[p_card];
6354 	currSCCB = CurrCard->currentSCCB;
6355 
6356 	currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6357 
6358 	if (message == SMREST_DATA_PTR)
6359 	{
6360 		if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET))
6361 		{
6362 			currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
6363 
6364 			hostDataXferRestart(currSCCB);
6365 		}
6366 
6367 		ACCEPT_MSG(port);
6368 		WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6369 	}
6370 
6371 	else if (message == SMCMD_COMP)
6372 	{
6373 
6374 
6375 		if (currSCCB->Sccb_scsistat == SELECT_Q_ST)
6376 		{
6377 			currTar_Info->TarStatus &= ~(UCHAR)TAR_TAG_Q_MASK;
6378 			currTar_Info->TarStatus |= (UCHAR)TAG_Q_REJECT;
6379 		}
6380 
6381 		ACCEPT_MSG(port);
6382 
6383 	}
6384 
6385 	else if ((message == SMNO_OP) || (message >= SMIDENT)
6386 			|| (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY))
6387 	{
6388 
6389 		ACCEPT_MSG(port);
6390 		WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6391 	}
6392 
6393 	else if (message == SMREJECT)
6394 	{
6395 
6396 		if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) ||
6397 				(currSCCB->Sccb_scsistat == SELECT_WN_ST) ||
6398 				((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING ) ||
6399 				((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING ) )
6400 
6401 		{
6402 			WRW_HARPOON((port+hp_intstat), BUS_FREE);
6403 
6404 			ACCEPT_MSG(port);
6405 
6406 
6407 			while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
6408 				(!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {}
6409 
6410 			if(currSCCB->Lun == 0x00)
6411 			{
6412 				if ((currSCCB->Sccb_scsistat == SELECT_SN_ST))
6413 				{
6414 
6415 					currTar_Info->TarStatus |= (UCHAR)SYNC_SUPPORTED;
6416 
6417 					currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
6418 				}
6419 
6420 #if defined(WIDE_SCSI)
6421 				else if ((currSCCB->Sccb_scsistat == SELECT_WN_ST))
6422 				{
6423 
6424 
6425 					currTar_Info->TarStatus = (currTar_Info->TarStatus &
6426 													~WIDE_ENABLED) | WIDE_NEGOCIATED;
6427 
6428 					currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
6429 
6430 				}
6431 #endif
6432 
6433 				else if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING )
6434 				{
6435 					currTar_Info->TarStatus = (currTar_Info->TarStatus &
6436 													~(UCHAR)TAR_TAG_Q_MASK) | TAG_Q_REJECT;
6437 
6438 
6439 					currSCCB->ControlByte &= ~F_USE_CMD_Q;
6440 					CurrCard->discQCount--;
6441 					CurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL;
6442 					currSCCB->Sccb_tag = 0x00;
6443 
6444 				}
6445 			}
6446 
6447 			if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
6448 			{
6449 
6450 
6451 				if(currSCCB->Lun == 0x00)
6452 				{
6453 					WRW_HARPOON((port+hp_intstat), BUS_FREE);
6454 					CurrCard->globalFlags |= F_NEW_SCCB_CMD;
6455 				}
6456 			}
6457 
6458 			else
6459 			{
6460 
6461 				if((CurrCard->globalFlags & F_CONLUN_IO) &&
6462 					((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
6463 					currTar_Info->TarLUNBusy[currSCCB->Lun] = TRUE;
6464 				else
6465 					currTar_Info->TarLUNBusy[0] = TRUE;
6466 
6467 
6468 				currSCCB->ControlByte &= ~(UCHAR)F_USE_CMD_Q;
6469 
6470 				WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6471 
6472 			}
6473 		}
6474 
6475 		else
6476 		{
6477 			ACCEPT_MSG(port);
6478 
6479 			while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
6480 				(!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {}
6481 
6482 			if (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))
6483 			{
6484 				WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6485 			}
6486 		}
6487 	}
6488 
6489 	else if (message == SMEXT)
6490 	{
6491 
6492 		ACCEPT_MSG(port);
6493 		shandem(port,p_card,currSCCB);
6494 	}
6495 
6496 	else if (message == SMIGNORWR)
6497 	{
6498 
6499 		ACCEPT_MSG(port);          /* ACK the RESIDUE MSG */
6500 
6501 		message = sfm(port,currSCCB);
6502 
6503 		if(currSCCB->Sccb_scsimsg != SMPARITY)
6504 			ACCEPT_MSG(port);
6505 		WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6506 	}
6507 
6508 
6509 	else
6510 	{
6511 
6512 		currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
6513 		currSCCB->Sccb_scsimsg = SMREJECT;
6514 
6515 		ACCEPT_MSG_ATN(port);
6516 		WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6517 	}
6518 }
6519 
6520 
6521 /*---------------------------------------------------------------------
6522  *
6523  * Function: shandem
6524  *
6525  * Description: Decide what to do with the extended message.
6526  *
6527  *---------------------------------------------------------------------*/
6528 #if defined(DOS)
shandem(USHORT port,UCHAR p_card,PSCCB pCurrSCCB)6529 void shandem(USHORT port, UCHAR p_card, PSCCB pCurrSCCB)
6530 #else
6531 void shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
6532 #endif
6533 {
6534 	UCHAR length,message;
6535 
6536 	length = sfm(port,pCurrSCCB);
6537 	if (length)
6538 	{
6539 
6540 		ACCEPT_MSG(port);
6541 		message = sfm(port,pCurrSCCB);
6542 		if (message)
6543 		{
6544 
6545 			if (message == SMSYNC)
6546 			{
6547 
6548 				if (length == 0x03)
6549 				{
6550 
6551 					ACCEPT_MSG(port);
6552 					stsyncn(port,p_card);
6553 				}
6554 				else
6555 				{
6556 
6557 					pCurrSCCB->Sccb_scsimsg = SMREJECT;
6558 					ACCEPT_MSG_ATN(port);
6559 				}
6560 			}
6561 #if defined(WIDE_SCSI)
6562 			else if (message == SMWDTR)
6563 			{
6564 
6565 				if (length == 0x02)
6566 				{
6567 
6568 					ACCEPT_MSG(port);
6569 					stwidn(port,p_card);
6570 				}
6571 				else
6572 				{
6573 
6574 					pCurrSCCB->Sccb_scsimsg = SMREJECT;
6575 					ACCEPT_MSG_ATN(port);
6576 
6577 					WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6578 				}
6579 			}
6580 #endif
6581 			else
6582 			{
6583 
6584 				pCurrSCCB->Sccb_scsimsg = SMREJECT;
6585 				ACCEPT_MSG_ATN(port);
6586 
6587 				WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6588 			}
6589 		}
6590 		else
6591 		{
6592 			if(pCurrSCCB->Sccb_scsimsg != SMPARITY)
6593 				ACCEPT_MSG(port);
6594 			WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6595 		}
6596 	}else
6597 	{
6598 			if(pCurrSCCB->Sccb_scsimsg == SMPARITY)
6599 				WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6600 	}
6601 }
6602 
6603 
6604 /*---------------------------------------------------------------------
6605  *
6606  * Function: sisyncn
6607  *
6608  * Description: Read in a message byte from the SCSI bus, and check
6609  *              for a parity error.
6610  *
6611  *---------------------------------------------------------------------*/
6612 
6613 #if defined(DOS)
sisyncn(USHORT port,UCHAR p_card,UCHAR syncFlag)6614 UCHAR sisyncn(USHORT port, UCHAR p_card, UCHAR syncFlag)
6615 #else
6616 UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag)
6617 #endif
6618 {
6619    PSCCB currSCCB;
6620    PSCCBMgr_tar_info currTar_Info;
6621 
6622    currSCCB = BL_Card[p_card].currentSCCB;
6623    currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6624 
6625    if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) {
6626 
6627 
6628       WRW_HARPOON((port+ID_MSG_STRT),
6629                  (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV)));
6630 
6631       WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
6632 
6633       WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
6634       WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03  ));
6635       WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC));
6636 
6637 
6638       if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
6639 
6640 	 WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 12));
6641 
6642       else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
6643 
6644 	 WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 25));
6645 
6646       else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
6647 
6648 	 WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 50));
6649 
6650       else
6651 	 WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 00));
6652 
6653 
6654       WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP                ));
6655       WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+DEFAULT_OFFSET));
6656       WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP      ));
6657 
6658 
6659 		if(syncFlag == FALSE)
6660 		{
6661 		   WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
6662 	      currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6663    	      ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_TRYING);
6664 		}
6665 		else
6666 		{
6667 		   WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
6668 		}
6669 
6670 
6671       return(TRUE);
6672       }
6673 
6674    else {
6675 
6676       currTar_Info->TarStatus |=	 (UCHAR)SYNC_SUPPORTED;
6677       currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
6678       return(FALSE);
6679       }
6680 }
6681 
6682 
6683 
6684 /*---------------------------------------------------------------------
6685  *
6686  * Function: stsyncn
6687  *
6688  * Description: The has sent us a Sync Nego message so handle it as
6689  *              necessary.
6690  *
6691  *---------------------------------------------------------------------*/
6692 #if defined(DOS)
stsyncn(USHORT port,UCHAR p_card)6693 void stsyncn(USHORT port, UCHAR p_card)
6694 #else
6695 void stsyncn(ULONG port, UCHAR p_card)
6696 #endif
6697 {
6698    UCHAR sync_msg,offset,sync_reg,our_sync_msg;
6699    PSCCB currSCCB;
6700    PSCCBMgr_tar_info currTar_Info;
6701 
6702    currSCCB = BL_Card[p_card].currentSCCB;
6703    currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6704 
6705    sync_msg = sfm(port,currSCCB);
6706 
6707 	if((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
6708 	{
6709 		WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6710 		return;
6711 	}
6712 
6713    ACCEPT_MSG(port);
6714 
6715 
6716    offset = sfm(port,currSCCB);
6717 
6718 	if((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
6719 	{
6720 		WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6721 		return;
6722 	}
6723 
6724    if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
6725 
6726       our_sync_msg = 12;              /* Setup our Message to 20mb/s */
6727 
6728    else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
6729 
6730       our_sync_msg = 25;              /* Setup our Message to 10mb/s */
6731 
6732    else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
6733 
6734       our_sync_msg = 50;              /* Setup our Message to 5mb/s */
6735    else
6736 
6737       our_sync_msg = 0;               /* Message = Async */
6738 
6739    if (sync_msg < our_sync_msg) {
6740       sync_msg = our_sync_msg;    /*if faster, then set to max. */
6741       }
6742 
6743    if (offset == ASYNC)
6744       sync_msg = ASYNC;
6745 
6746    if (offset > MAX_OFFSET)
6747       offset = MAX_OFFSET;
6748 
6749    sync_reg = 0x00;
6750 
6751    if (sync_msg > 12)
6752 
6753       sync_reg = 0x20;        /* Use 10MB/s */
6754 
6755    if (sync_msg > 25)
6756 
6757       sync_reg = 0x40;        /* Use 6.6MB/s */
6758 
6759    if (sync_msg > 38)
6760 
6761       sync_reg = 0x60;        /* Use 5MB/s */
6762 
6763    if (sync_msg > 50)
6764 
6765       sync_reg = 0x80;        /* Use 4MB/s */
6766 
6767    if (sync_msg > 62)
6768 
6769       sync_reg = 0xA0;        /* Use 3.33MB/s */
6770 
6771    if (sync_msg > 75)
6772 
6773       sync_reg = 0xC0;        /* Use 2.85MB/s */
6774 
6775    if (sync_msg > 87)
6776 
6777       sync_reg = 0xE0;        /* Use 2.5MB/s */
6778 
6779    if (sync_msg > 100) {
6780 
6781       sync_reg = 0x00;        /* Use ASYNC */
6782       offset = 0x00;
6783       }
6784 
6785 
6786 #if defined(WIDE_SCSI)
6787    if (currTar_Info->TarStatus & WIDE_ENABLED)
6788 
6789       sync_reg |= offset;
6790 
6791    else
6792 
6793       sync_reg |= (offset | NARROW_SCSI);
6794 
6795 #else
6796    sync_reg |= (offset | NARROW_SCSI);
6797 #endif
6798 
6799    sssyncv(port,currSCCB->TargID,sync_reg,currTar_Info);
6800 
6801 
6802    if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
6803 
6804 
6805       ACCEPT_MSG(port);
6806 
6807       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6808          ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED);
6809 
6810       WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6811       }
6812 
6813    else {
6814 
6815 
6816       ACCEPT_MSG_ATN(port);
6817 
6818       sisyncr(port,sync_msg,offset);
6819 
6820       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6821          ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED);
6822       }
6823 }
6824 
6825 
6826 /*---------------------------------------------------------------------
6827  *
6828  * Function: sisyncr
6829  *
6830  * Description: Answer the targets sync message.
6831  *
6832  *---------------------------------------------------------------------*/
6833 #if defined(DOS)
sisyncr(USHORT port,UCHAR sync_pulse,UCHAR offset)6834 void sisyncr(USHORT port,UCHAR sync_pulse, UCHAR offset)
6835 #else
6836 void sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset)
6837 #endif
6838 {
6839    ARAM_ACCESS(port);
6840    WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
6841    WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03  ));
6842    WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC));
6843    WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+sync_pulse));
6844    WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP                ));
6845    WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+offset));
6846    WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP      ));
6847    SGRAM_ACCESS(port);
6848 
6849    WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
6850    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1);
6851 
6852    WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT));
6853 
6854    while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {}
6855 }
6856 
6857 
6858 
6859 #if defined(WIDE_SCSI)
6860 
6861 /*---------------------------------------------------------------------
6862  *
6863  * Function: siwidn
6864  *
6865  * Description: Read in a message byte from the SCSI bus, and check
6866  *              for a parity error.
6867  *
6868  *---------------------------------------------------------------------*/
6869 
6870 #if defined(DOS)
siwidn(USHORT port,UCHAR p_card)6871 UCHAR siwidn(USHORT port, UCHAR p_card)
6872 #else
6873 UCHAR siwidn(ULONG port, UCHAR p_card)
6874 #endif
6875 {
6876    PSCCB currSCCB;
6877    PSCCBMgr_tar_info currTar_Info;
6878 
6879    currSCCB = BL_Card[p_card].currentSCCB;
6880    currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6881 
6882    if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) {
6883 
6884 
6885       WRW_HARPOON((port+ID_MSG_STRT),
6886 	              (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV)));
6887 
6888       WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
6889 
6890       WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
6891       WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02  ));
6892       WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR));
6893       WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP                ));
6894       WRW_HARPOON((port+SYNC_MSGS+8), (MPM_OP+AMSG_OUT+ SM16BIT));
6895       WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP      ));
6896 
6897       WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
6898 
6899 
6900       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6901          ~(UCHAR)TAR_WIDE_MASK) | (UCHAR)WIDE_ENABLED);
6902 
6903       return(TRUE);
6904       }
6905 
6906    else {
6907 
6908       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
6909                ~(UCHAR)TAR_WIDE_MASK) | WIDE_NEGOCIATED);
6910 
6911       currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
6912       return(FALSE);
6913       }
6914 }
6915 
6916 
6917 
6918 /*---------------------------------------------------------------------
6919  *
6920  * Function: stwidn
6921  *
6922  * Description: The has sent us a Wide Nego message so handle it as
6923  *              necessary.
6924  *
6925  *---------------------------------------------------------------------*/
6926 #if defined(DOS)
stwidn(USHORT port,UCHAR p_card)6927 void stwidn(USHORT port, UCHAR p_card)
6928 #else
6929 void stwidn(ULONG port, UCHAR p_card)
6930 #endif
6931 {
6932    UCHAR width;
6933    PSCCB currSCCB;
6934    PSCCBMgr_tar_info currTar_Info;
6935 
6936    currSCCB = BL_Card[p_card].currentSCCB;
6937    currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
6938 
6939    width = sfm(port,currSCCB);
6940 
6941 	if((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
6942 	{
6943 		WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6944 		return;
6945 	}
6946 
6947 
6948    if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
6949       width = 0;
6950 
6951    if (width) {
6952       currTar_Info->TarStatus |= WIDE_ENABLED;
6953       width = 0;
6954       }
6955    else {
6956       width = NARROW_SCSI;
6957       currTar_Info->TarStatus &= ~WIDE_ENABLED;
6958       }
6959 
6960 
6961    sssyncv(port,currSCCB->TargID,width,currTar_Info);
6962 
6963 
6964    if (currSCCB->Sccb_scsistat == SELECT_WN_ST)
6965 	{
6966 
6967 
6968 
6969       currTar_Info->TarStatus |=	 WIDE_NEGOCIATED;
6970 
6971 	   if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_SUPPORTED))
6972 		{
6973 	      ACCEPT_MSG_ATN(port);
6974 		   ARAM_ACCESS(port);
6975 	     	sisyncn(port,p_card, TRUE);
6976 	      currSCCB->Sccb_scsistat = SELECT_SN_ST;
6977 		   SGRAM_ACCESS(port);
6978 		}
6979 		else
6980 		{
6981 	      ACCEPT_MSG(port);
6982   		   WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
6983 		}
6984    }
6985 
6986    else {
6987 
6988 
6989       ACCEPT_MSG_ATN(port);
6990 
6991       if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
6992       	 width = SM16BIT;
6993       else
6994       	 width = SM8BIT;
6995 
6996       siwidr(port,width);
6997 
6998       currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
6999       }
7000 }
7001 
7002 
7003 /*---------------------------------------------------------------------
7004  *
7005  * Function: siwidr
7006  *
7007  * Description: Answer the targets Wide nego message.
7008  *
7009  *---------------------------------------------------------------------*/
7010 #if defined(DOS)
siwidr(USHORT port,UCHAR width)7011 void siwidr(USHORT port, UCHAR width)
7012 #else
7013 void siwidr(ULONG port, UCHAR width)
7014 #endif
7015 {
7016    ARAM_ACCESS(port);
7017    WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
7018    WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02  ));
7019    WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR));
7020    WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP                ));
7021    WRW_HARPOON((port+SYNC_MSGS+8),(MPM_OP+AMSG_OUT+width));
7022    WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP      ));
7023    SGRAM_ACCESS(port);
7024 
7025    WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
7026    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1);
7027 
7028    WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT));
7029 
7030    while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {}
7031 }
7032 
7033 #endif
7034 
7035 
7036 
7037 /*---------------------------------------------------------------------
7038  *
7039  * Function: sssyncv
7040  *
7041  * Description: Write the desired value to the Sync Register for the
7042  *              ID specified.
7043  *
7044  *---------------------------------------------------------------------*/
7045 #if defined(DOS)
sssyncv(USHORT p_port,UCHAR p_id,UCHAR p_sync_value,PSCCBMgr_tar_info currTar_Info)7046 void sssyncv(USHORT p_port, UCHAR p_id, UCHAR p_sync_value,PSCCBMgr_tar_info currTar_Info)
7047 #else
7048 void sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value,PSCCBMgr_tar_info currTar_Info)
7049 #endif
7050 {
7051    UCHAR index;
7052 
7053    index = p_id;
7054 
7055    switch (index) {
7056 
7057       case 0:
7058 	 index = 12;             /* hp_synctarg_0 */
7059 	 break;
7060       case 1:
7061 	 index = 13;             /* hp_synctarg_1 */
7062 	 break;
7063       case 2:
7064 	 index = 14;             /* hp_synctarg_2 */
7065 	 break;
7066       case 3:
7067 	 index = 15;             /* hp_synctarg_3 */
7068 	 break;
7069       case 4:
7070 	 index = 8;              /* hp_synctarg_4 */
7071 	 break;
7072       case 5:
7073 	 index = 9;              /* hp_synctarg_5 */
7074 	 break;
7075       case 6:
7076 	 index = 10;             /* hp_synctarg_6 */
7077 	 break;
7078       case 7:
7079 	 index = 11;             /* hp_synctarg_7 */
7080 	 break;
7081       case 8:
7082 	 index = 4;              /* hp_synctarg_8 */
7083 	 break;
7084       case 9:
7085 	 index = 5;              /* hp_synctarg_9 */
7086 	 break;
7087       case 10:
7088 	 index = 6;              /* hp_synctarg_10 */
7089 	 break;
7090       case 11:
7091 	 index = 7;              /* hp_synctarg_11 */
7092 	 break;
7093       case 12:
7094 	 index = 0;              /* hp_synctarg_12 */
7095 	 break;
7096       case 13:
7097 	 index = 1;              /* hp_synctarg_13 */
7098 	 break;
7099       case 14:
7100 	 index = 2;              /* hp_synctarg_14 */
7101 	 break;
7102       case 15:
7103 	 index = 3;              /* hp_synctarg_15 */
7104 
7105       }
7106 
7107    WR_HARPOON(p_port+hp_synctarg_base+index, p_sync_value);
7108 
7109 	currTar_Info->TarSyncCtrl = p_sync_value;
7110 }
7111 
7112 
7113 /*---------------------------------------------------------------------
7114  *
7115  * Function: sresb
7116  *
7117  * Description: Reset the desired card's SCSI bus.
7118  *
7119  *---------------------------------------------------------------------*/
7120 #if defined(DOS)
sresb(USHORT port,UCHAR p_card)7121 void sresb(USHORT port, UCHAR p_card)
7122 #else
7123 void sresb(ULONG port, UCHAR p_card)
7124 #endif
7125 {
7126    UCHAR scsiID, i;
7127 
7128    PSCCBMgr_tar_info currTar_Info;
7129 
7130    WR_HARPOON(port+hp_page_ctrl,
7131       (RD_HARPOON(port+hp_page_ctrl) | G_INT_DISABLE));
7132    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
7133 
7134    WR_HARPOON(port+hp_scsictrl_0, SCSI_RST);
7135 
7136    scsiID = RD_HARPOON(port+hp_seltimeout);
7137    WR_HARPOON(port+hp_seltimeout,TO_5ms);
7138    WRW_HARPOON((port+hp_intstat), TIMEOUT);
7139 
7140    WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT | START_TO));
7141 
7142    while (!(RDW_HARPOON((port+hp_intstat)) & TIMEOUT)) {}
7143 
7144    WR_HARPOON(port+hp_seltimeout,scsiID);
7145 
7146    WR_HARPOON(port+hp_scsictrl_0, ENA_SCAM_SEL);
7147 
7148    Wait(port, TO_5ms);
7149 
7150    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
7151 
7152    WR_HARPOON(port+hp_int_mask, (RD_HARPOON(port+hp_int_mask) | 0x00));
7153 
7154    for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
7155       {
7156       currTar_Info = &sccbMgrTbl[p_card][scsiID];
7157 
7158       if (currTar_Info->TarEEValue & EE_SYNC_MASK)
7159          {
7160 	      	currTar_Info->TarSyncCtrl = 0;
7161 	      	currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
7162 	      }
7163 
7164       if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
7165          {
7166       	currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
7167       	}
7168 
7169       sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
7170 
7171       SccbMgrTableInitTarget(p_card, scsiID);
7172       }
7173 
7174    BL_Card[p_card].scanIndex = 0x00;
7175    BL_Card[p_card].currentSCCB = NULL;
7176    BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT
7177 													| F_NEW_SCCB_CMD);
7178    BL_Card[p_card].cmdCounter  = 0x00;
7179 	BL_Card[p_card].discQCount = 0x00;
7180    BL_Card[p_card].tagQ_Lst = 0x01;
7181 
7182 	for(i = 0; i < QUEUE_DEPTH; i++)
7183 		BL_Card[p_card].discQ_Tbl[i] = NULL;
7184 
7185    WR_HARPOON(port+hp_page_ctrl,
7186       (RD_HARPOON(port+hp_page_ctrl) & ~G_INT_DISABLE));
7187 
7188 }
7189 
7190 /*---------------------------------------------------------------------
7191  *
7192  * Function: ssenss
7193  *
7194  * Description: Setup for the Auto Sense command.
7195  *
7196  *---------------------------------------------------------------------*/
ssenss(PSCCBcard pCurrCard)7197 void ssenss(PSCCBcard pCurrCard)
7198 {
7199    UCHAR i;
7200    PSCCB currSCCB;
7201 
7202    currSCCB = pCurrCard->currentSCCB;
7203 
7204 
7205    currSCCB->Save_CdbLen = currSCCB->CdbLength;
7206 
7207    for (i = 0; i < 6; i++) {
7208 
7209       currSCCB->Save_Cdb[i] = currSCCB->Cdb[i];
7210       }
7211 
7212    currSCCB->CdbLength = SIX_BYTE_CMD;
7213    currSCCB->Cdb[0]    = SCSI_REQUEST_SENSE;
7214    currSCCB->Cdb[1]    = currSCCB->Cdb[1] & (UCHAR)0xE0; /*Keep LUN. */
7215    currSCCB->Cdb[2]    = 0x00;
7216    currSCCB->Cdb[3]    = 0x00;
7217    currSCCB->Cdb[4]    = currSCCB->RequestSenseLength;
7218    currSCCB->Cdb[5]    = 0x00;
7219 
7220    currSCCB->Sccb_XferCnt = (unsigned long)currSCCB->RequestSenseLength;
7221 
7222    currSCCB->Sccb_ATC = 0x00;
7223 
7224    currSCCB->Sccb_XferState |= F_AUTO_SENSE;
7225 
7226    currSCCB->Sccb_XferState &= ~F_SG_XFER;
7227 
7228    currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV;
7229 
7230    currSCCB->ControlByte = 0x00;
7231 
7232    currSCCB->Sccb_MGRFlags &= F_STATUSLOADED;
7233 }
7234 
7235 
7236 
7237 /*---------------------------------------------------------------------
7238  *
7239  * Function: sxfrp
7240  *
7241  * Description: Transfer data into the bit bucket until the device
7242  *              decides to switch phase.
7243  *
7244  *---------------------------------------------------------------------*/
7245 
7246 #if defined(DOS)
sxfrp(USHORT p_port,UCHAR p_card)7247 void sxfrp(USHORT p_port, UCHAR p_card)
7248 #else
7249 void sxfrp(ULONG p_port, UCHAR p_card)
7250 #endif
7251 {
7252    UCHAR curr_phz;
7253 
7254 
7255    DISABLE_AUTO(p_port);
7256 
7257    if (BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
7258 
7259       hostDataXferAbort(p_port,p_card,BL_Card[p_card].currentSCCB);
7260 
7261       }
7262 
7263    /* If the Automation handled the end of the transfer then do not
7264       match the phase or we will get out of sync with the ISR.       */
7265 
7266    if (RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | XFER_CNT_0 | AUTO_INT))
7267       return;
7268 
7269    WR_HARPOON(p_port+hp_xfercnt_0, 0x00);
7270 
7271    curr_phz = RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ;
7272 
7273    WRW_HARPOON((p_port+hp_intstat), XFER_CNT_0);
7274 
7275 
7276    WR_HARPOON(p_port+hp_scsisig, curr_phz);
7277 
7278    while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)) &&
7279       (curr_phz == (RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ)) )
7280       {
7281       if (curr_phz & (UCHAR)SCSI_IOBIT)
7282          {
7283       	WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT));
7284 
7285 	      if (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY))
7286             {
7287 	         RD_HARPOON(p_port+hp_fifodata_0);
7288 	         }
7289 	      }
7290       else
7291          {
7292       	WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | HOST_WRT));
7293    	   if (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)
7294             {
7295 	         WR_HARPOON(p_port+hp_fifodata_0,0xFA);
7296 	         }
7297 	      }
7298       } /* End of While loop for padding data I/O phase */
7299 
7300       while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
7301          {
7302          if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
7303       	   break;
7304          }
7305 
7306       WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT));
7307       while (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY))
7308          {
7309          RD_HARPOON(p_port+hp_fifodata_0);
7310          }
7311 
7312       if ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
7313          {
7314          WR_HARPOON(p_port+hp_autostart_0, (AUTO_IMMED+DISCONNECT_START));
7315          while (!(RDW_HARPOON((p_port+hp_intstat)) & AUTO_INT)) {}
7316 
7317          if (RDW_HARPOON((p_port+hp_intstat)) & (ICMD_COMP | ITAR_DISC))
7318    	   while (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RSEL))) ;
7319          }
7320 }
7321 
7322 
7323 /*---------------------------------------------------------------------
7324  *
7325  * Function: schkdd
7326  *
7327  * Description: Make sure data has been flushed from both FIFOs and abort
7328  *              the operations if necessary.
7329  *
7330  *---------------------------------------------------------------------*/
7331 
7332 #if defined(DOS)
schkdd(USHORT port,UCHAR p_card)7333 void schkdd(USHORT port, UCHAR p_card)
7334 #else
7335 void schkdd(ULONG port, UCHAR p_card)
7336 #endif
7337 {
7338    USHORT TimeOutLoop;
7339 	UCHAR sPhase;
7340 
7341    PSCCB currSCCB;
7342 
7343    currSCCB = BL_Card[p_card].currentSCCB;
7344 
7345 
7346    if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
7347        (currSCCB->Sccb_scsistat != DATA_IN_ST)) {
7348       return;
7349       }
7350 
7351 
7352 
7353    if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT)
7354       {
7355 
7356       currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt-1);
7357 
7358       currSCCB->Sccb_XferCnt = 1;
7359 
7360       currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT;
7361       WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
7362       WR_HARPOON(port+hp_xferstat, 0x00);
7363       }
7364 
7365    else
7366       {
7367 
7368       currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
7369 
7370       currSCCB->Sccb_XferCnt = 0;
7371       }
7372 
7373    if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
7374       (currSCCB->HostStatus == SCCB_COMPLETE)) {
7375 
7376       currSCCB->HostStatus = SCCB_PARITY_ERR;
7377       WRW_HARPOON((port+hp_intstat), PARITY);
7378       }
7379 
7380 
7381    hostDataXferAbort(port,p_card,currSCCB);
7382 
7383 
7384    while (RD_HARPOON(port+hp_scsisig) & SCSI_ACK) {}
7385 
7386    TimeOutLoop = 0;
7387 
7388    while(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)
7389       {
7390       if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE) {
7391 	      return;
7392    	   }
7393       if (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F) {
7394 	      break;
7395    	   }
7396       if (RDW_HARPOON((port+hp_intstat)) & RESET) {
7397 	      return;
7398    	   }
7399       if ((RD_HARPOON(port+hp_scsisig) & SCSI_REQ) || (TimeOutLoop++>0x3000) )
7400    	   break;
7401       }
7402 
7403 	sPhase = RD_HARPOON(port+hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ);
7404    if ((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))                     ||
7405       (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F)                       ||
7406       (sPhase == (SCSI_BSY | S_DATAO_PH)) ||
7407       (sPhase == (SCSI_BSY | S_DATAI_PH)))
7408       {
7409 
7410 	   WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
7411 
7412 	   if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED))
7413          {
7414 	      if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
7415 	         phaseDataIn(port,p_card);
7416 	      	}
7417 
7418 	   	else {
7419 	       phaseDataOut(port,p_card);
7420 	       	}
7421 	   	}
7422 		else
7423       	{
7424 	   	sxfrp(port,p_card);
7425 	   	if (!(RDW_HARPOON((port+hp_intstat)) &
7426 		      (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET)))
7427          {
7428    		WRW_HARPOON((port+hp_intstat), AUTO_INT);
7429 		   phaseDecode(port,p_card);
7430 		   }
7431 	   }
7432 
7433    }
7434 
7435    else {
7436       WR_HARPOON(port+hp_portctrl_0, 0x00);
7437       }
7438 }
7439 
7440 
7441 /*---------------------------------------------------------------------
7442  *
7443  * Function: sinits
7444  *
7445  * Description: Setup SCCB manager fields in this SCCB.
7446  *
7447  *---------------------------------------------------------------------*/
7448 
sinits(PSCCB p_sccb,UCHAR p_card)7449 void sinits(PSCCB p_sccb, UCHAR p_card)
7450 {
7451    PSCCBMgr_tar_info currTar_Info;
7452 
7453 	if((p_sccb->TargID > MAX_SCSI_TAR) || (p_sccb->Lun > MAX_LUN))
7454 	{
7455 		return;
7456 	}
7457    currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
7458 
7459    p_sccb->Sccb_XferState     = 0x00;
7460    p_sccb->Sccb_XferCnt       = p_sccb->DataLength;
7461 
7462    if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) ||
7463       (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) {
7464 
7465       p_sccb->Sccb_SGoffset   = 0;
7466       p_sccb->Sccb_XferState  = F_SG_XFER;
7467       p_sccb->Sccb_XferCnt    = 0x00;
7468       }
7469 
7470    if (p_sccb->DataLength == 0x00)
7471 
7472       p_sccb->Sccb_XferState |= F_ALL_XFERRED;
7473 
7474    if (p_sccb->ControlByte & F_USE_CMD_Q)
7475       {
7476       if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
7477          p_sccb->ControlByte &= ~F_USE_CMD_Q;
7478 
7479       else
7480 	      currTar_Info->TarStatus |= TAG_Q_TRYING;
7481       }
7482 
7483 /*      For !single SCSI device in system  & device allow Disconnect
7484 	or command is tag_q type then send Cmd with Disconnect Enable
7485 	else send Cmd with Disconnect Disable */
7486 
7487 /*
7488    if (((!(BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
7489       (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
7490       (currTar_Info->TarStatus & TAG_Q_TRYING)) {
7491 */
7492    if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) ||
7493       (currTar_Info->TarStatus & TAG_Q_TRYING)) {
7494       p_sccb->Sccb_idmsg      = (UCHAR)(SMIDENT | DISC_PRIV) | p_sccb->Lun;
7495       }
7496 
7497    else {
7498 
7499       p_sccb->Sccb_idmsg      = (UCHAR)SMIDENT | p_sccb->Lun;
7500       }
7501 
7502    p_sccb->HostStatus         = 0x00;
7503    p_sccb->TargetStatus       = 0x00;
7504    p_sccb->Sccb_tag           = 0x00;
7505    p_sccb->Sccb_MGRFlags      = 0x00;
7506    p_sccb->Sccb_sgseg         = 0x00;
7507    p_sccb->Sccb_ATC           = 0x00;
7508    p_sccb->Sccb_savedATC      = 0x00;
7509 /*
7510    p_sccb->SccbVirtDataPtr    = 0x00;
7511    p_sccb->Sccb_forwardlink   = NULL;
7512    p_sccb->Sccb_backlink      = NULL;
7513  */
7514    p_sccb->Sccb_scsistat      = BUS_FREE_ST;
7515    p_sccb->SccbStatus         = SCCB_IN_PROCESS;
7516    p_sccb->Sccb_scsimsg       = SMNO_OP;
7517 
7518 }
7519 
7520 
7521 #ident "$Id: phase.c 1.11 1997/01/31 02:08:49 mohan Exp $"
7522 /*----------------------------------------------------------------------
7523  *
7524  *
7525  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
7526  *
7527  *   This file is available under both the GNU General Public License
7528  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
7529  *
7530  *   $Workfile:   phase.c  $
7531  *
7532  *   Description:  Functions to intially handle the SCSI bus phase when
7533  *                 the target asserts request (and the automation is not
7534  *                 enabled to handle the situation).
7535  *
7536  *   $Date: 1997/01/31 02:08:49 $
7537  *
7538  *   $Revision: 1.11 $
7539  *
7540  *----------------------------------------------------------------------*/
7541 
7542 /*#include <globals.h>*/
7543 
7544 #if (FW_TYPE==_UCB_MGR_)
7545 	/*#include <budi.h>*/
7546 #endif
7547 
7548 /*#include <sccbmgr.h>*/
7549 /*#include <blx30.h>*/
7550 /*#include <target.h>*/
7551 /*#include <scsi2.h>*/
7552 /*#include <harpoon.h>*/
7553 
7554 
7555 /*
7556 extern SCCBCARD BL_Card[MAX_CARDS];
7557 extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
7558 
7559 #if defined(OS2)
7560    extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
7561 #else
7562    #if defined(DOS)
7563       extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
7564    #else
7565       extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
7566    #endif
7567 #endif
7568 */
7569 
7570 /*---------------------------------------------------------------------
7571  *
7572  * Function: Phase Decode
7573  *
7574  * Description: Determine the phase and call the appropriate function.
7575  *
7576  *---------------------------------------------------------------------*/
7577 
7578 #if defined(DOS)
phaseDecode(USHORT p_port,UCHAR p_card)7579 void phaseDecode(USHORT p_port, UCHAR p_card)
7580 #else
7581 void phaseDecode(ULONG p_port, UCHAR p_card)
7582 #endif
7583 {
7584    unsigned char phase_ref;
7585 #if defined(OS2)
7586    void (far *phase) (ULONG, UCHAR);
7587 #else
7588    #if defined(DOS)
7589       void (*phase) (USHORT, UCHAR);
7590    #else
7591       void (*phase) (ULONG, UCHAR);
7592    #endif
7593 #endif
7594 
7595 
7596    DISABLE_AUTO(p_port);
7597 
7598    phase_ref = (UCHAR) (RD_HARPOON(p_port+hp_scsisig) & S_SCSI_PHZ);
7599 
7600    phase = s_PhaseTbl[phase_ref];
7601 
7602    (*phase)(p_port, p_card);           /* Call the correct phase func */
7603 }
7604 
7605 
7606 
7607 /*---------------------------------------------------------------------
7608  *
7609  * Function: Data Out Phase
7610  *
7611  * Description: Start up both the BusMaster and Xbow.
7612  *
7613  *---------------------------------------------------------------------*/
7614 
7615 #if defined(OS2)
phaseDataOut(ULONG port,UCHAR p_card)7616 void far phaseDataOut(ULONG port, UCHAR p_card)
7617 #else
7618 #if defined(DOS)
7619 void phaseDataOut(USHORT port, UCHAR p_card)
7620 #else
7621 void phaseDataOut(ULONG port, UCHAR p_card)
7622 #endif
7623 #endif
7624 {
7625 
7626    PSCCB currSCCB;
7627 
7628    currSCCB = BL_Card[p_card].currentSCCB;
7629    if (currSCCB == NULL)
7630       {
7631       return;  /* Exit if No SCCB record */
7632       }
7633 
7634    currSCCB->Sccb_scsistat = DATA_OUT_ST;
7635    currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET);
7636 
7637    WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
7638 
7639    WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
7640 
7641    WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
7642 
7643    dataXferProcessor(port, &BL_Card[p_card]);
7644 
7645 #if defined(NOBUGBUG)
7646    if (RDW_HARPOON((port+hp_intstat)) & XFER_CNT_0)
7647       WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
7648 
7649 #endif
7650 
7651 
7652    if (currSCCB->Sccb_XferCnt == 0) {
7653 
7654 
7655       if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) &&
7656 	 (currSCCB->HostStatus == SCCB_COMPLETE))
7657 	 currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
7658 
7659       sxfrp(port,p_card);
7660       if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
7661 	    phaseDecode(port,p_card);
7662       }
7663 }
7664 
7665 
7666 /*---------------------------------------------------------------------
7667  *
7668  * Function: Data In Phase
7669  *
7670  * Description: Startup the BusMaster and the XBOW.
7671  *
7672  *---------------------------------------------------------------------*/
7673 
7674 #if defined(OS2)
phaseDataIn(ULONG port,UCHAR p_card)7675 void far phaseDataIn(ULONG port, UCHAR p_card)
7676 #else
7677 #if defined(DOS)
7678 void phaseDataIn(USHORT port, UCHAR p_card)
7679 #else
7680 void phaseDataIn(ULONG port, UCHAR p_card)
7681 #endif
7682 #endif
7683 {
7684 
7685    PSCCB currSCCB;
7686 
7687    currSCCB = BL_Card[p_card].currentSCCB;
7688 
7689    if (currSCCB == NULL)
7690       {
7691       return;  /* Exit if No SCCB record */
7692       }
7693 
7694 
7695    currSCCB->Sccb_scsistat = DATA_IN_ST;
7696    currSCCB->Sccb_XferState |= F_HOST_XFER_DIR;
7697    currSCCB->Sccb_XferState &= ~F_NO_DATA_YET;
7698 
7699    WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
7700 
7701    WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
7702 
7703    WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
7704 
7705    dataXferProcessor(port, &BL_Card[p_card]);
7706 
7707    if (currSCCB->Sccb_XferCnt == 0) {
7708 
7709 
7710       if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) &&
7711 	 (currSCCB->HostStatus == SCCB_COMPLETE))
7712 	 currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
7713 
7714       sxfrp(port,p_card);
7715       if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
7716 	    phaseDecode(port,p_card);
7717 
7718       }
7719 }
7720 
7721 /*---------------------------------------------------------------------
7722  *
7723  * Function: Command Phase
7724  *
7725  * Description: Load the CDB into the automation and start it up.
7726  *
7727  *---------------------------------------------------------------------*/
7728 
7729 #if defined(OS2)
phaseCommand(ULONG p_port,UCHAR p_card)7730 void far phaseCommand(ULONG p_port, UCHAR p_card)
7731 #else
7732 #if defined(DOS)
7733 void phaseCommand(USHORT p_port, UCHAR p_card)
7734 #else
7735 void phaseCommand(ULONG p_port, UCHAR p_card)
7736 #endif
7737 #endif
7738 {
7739    PSCCB currSCCB;
7740 #if defined(DOS)
7741    USHORT cdb_reg;
7742 #else
7743    ULONG cdb_reg;
7744 #endif
7745    UCHAR i;
7746 
7747    currSCCB = BL_Card[p_card].currentSCCB;
7748 
7749    if (currSCCB->OperationCode == RESET_COMMAND) {
7750 
7751       currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
7752       currSCCB->CdbLength = SIX_BYTE_CMD;
7753       }
7754 
7755    WR_HARPOON(p_port+hp_scsisig, 0x00);
7756 
7757    ARAM_ACCESS(p_port);
7758 
7759 
7760    cdb_reg = p_port + CMD_STRT;
7761 
7762    for (i=0; i < currSCCB->CdbLength; i++) {
7763 
7764       if (currSCCB->OperationCode == RESET_COMMAND)
7765 
7766 	 WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00));
7767 
7768       else
7769 	 WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + currSCCB->Cdb[i]));
7770       cdb_reg +=2;
7771       }
7772 
7773    if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
7774       WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+    NP));
7775 
7776    WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT));
7777 
7778    currSCCB->Sccb_scsistat = COMMAND_ST;
7779 
7780    WR_HARPOON(p_port+hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT));
7781    SGRAM_ACCESS(p_port);
7782 }
7783 
7784 
7785 /*---------------------------------------------------------------------
7786  *
7787  * Function: Status phase
7788  *
7789  * Description: Bring in the status and command complete message bytes
7790  *
7791  *---------------------------------------------------------------------*/
7792 
7793 #if defined(OS2)
phaseStatus(ULONG port,UCHAR p_card)7794 void far phaseStatus(ULONG port, UCHAR p_card)
7795 #else
7796 #if defined(DOS)
7797 void phaseStatus(USHORT port, UCHAR p_card)
7798 #else
7799 void phaseStatus(ULONG port, UCHAR p_card)
7800 #endif
7801 #endif
7802 {
7803    /* Start-up the automation to finish off this command and let the
7804       isr handle the interrupt for command complete when it comes in.
7805       We could wait here for the interrupt to be generated?
7806     */
7807 
7808    WR_HARPOON(port+hp_scsisig, 0x00);
7809 
7810    WR_HARPOON(port+hp_autostart_0, (AUTO_IMMED+END_DATA_START));
7811 }
7812 
7813 
7814 /*---------------------------------------------------------------------
7815  *
7816  * Function: Phase Message Out
7817  *
7818  * Description: Send out our message (if we have one) and handle whatever
7819  *              else is involed.
7820  *
7821  *---------------------------------------------------------------------*/
7822 
7823 #if defined(OS2)
phaseMsgOut(ULONG port,UCHAR p_card)7824 void far phaseMsgOut(ULONG port, UCHAR p_card)
7825 #else
7826 #if defined(DOS)
7827 void phaseMsgOut(USHORT port, UCHAR p_card)
7828 #else
7829 void phaseMsgOut(ULONG port, UCHAR p_card)
7830 #endif
7831 #endif
7832 {
7833 	UCHAR message,scsiID;
7834 	PSCCB currSCCB;
7835 	PSCCBMgr_tar_info currTar_Info;
7836 
7837 	currSCCB = BL_Card[p_card].currentSCCB;
7838 
7839 	if (currSCCB != NULL) {
7840 
7841 		message = currSCCB->Sccb_scsimsg;
7842 		scsiID = currSCCB->TargID;
7843 
7844 		if (message == SMDEV_RESET)
7845 		{
7846 
7847 
7848 			currTar_Info = &sccbMgrTbl[p_card][scsiID];
7849 			currTar_Info->TarSyncCtrl = 0;
7850 			sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
7851 
7852 			if (sccbMgrTbl[p_card][scsiID].TarEEValue & EE_SYNC_MASK)
7853 			{
7854 
7855 				sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_SYNC_MASK;
7856 
7857 			}
7858 
7859 			if (sccbMgrTbl[p_card][scsiID].TarEEValue & EE_WIDE_SCSI)
7860 			{
7861 
7862 				sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_WIDE_MASK;
7863 			}
7864 
7865 
7866 			queueFlushSccb(p_card,SCCB_COMPLETE);
7867 			SccbMgrTableInitTarget(p_card,scsiID);
7868 		}
7869 		else if (currSCCB->Sccb_scsistat == ABORT_ST)
7870 		{
7871 			currSCCB->HostStatus = SCCB_COMPLETE;
7872 			if(BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] != NULL)
7873 			{
7874 				BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
7875 				sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
7876 			}
7877 
7878 		}
7879 
7880 		else if (currSCCB->Sccb_scsistat < COMMAND_ST)
7881 		{
7882 
7883 
7884 			if(message == SMNO_OP)
7885 			{
7886 				currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
7887 
7888 				ssel(port,p_card);
7889 				return;
7890 			}
7891 		}
7892 		else
7893 		{
7894 
7895 
7896 			if (message == SMABORT)
7897 
7898 				queueFlushSccb(p_card,SCCB_COMPLETE);
7899 		}
7900 
7901 	}
7902 	else
7903 	{
7904 		message = SMABORT;
7905 	}
7906 
7907 	WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
7908 
7909 
7910 	WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN);
7911 
7912 	WR_HARPOON(port+hp_scsidata_0,message);
7913 
7914 	WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
7915 
7916 	ACCEPT_MSG(port);
7917 
7918 	WR_HARPOON(port+hp_portctrl_0, 0x00);
7919 
7920 	if ((message == SMABORT) || (message == SMDEV_RESET) ||
7921 				(message == SMABORT_TAG) )
7922 	{
7923 
7924 		while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {}
7925 
7926 		if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
7927 		{
7928 			WRW_HARPOON((port+hp_intstat), BUS_FREE);
7929 
7930 			if (currSCCB != NULL)
7931 			{
7932 
7933 				if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
7934 					((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
7935 					sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
7936 				else
7937 					sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
7938 
7939 				queueCmdComplete(&BL_Card[p_card],currSCCB, p_card);
7940 			}
7941 
7942 			else
7943 			{
7944 				BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
7945 			}
7946 		}
7947 
7948 		else
7949 		{
7950 
7951 			sxfrp(port,p_card);
7952 		}
7953 	}
7954 
7955 	else
7956 	{
7957 
7958 		if(message == SMPARITY)
7959 		{
7960 			currSCCB->Sccb_scsimsg = SMNO_OP;
7961 			WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
7962 		}
7963 		else
7964 		{
7965 			sxfrp(port,p_card);
7966 		}
7967 	}
7968 }
7969 
7970 
7971 /*---------------------------------------------------------------------
7972  *
7973  * Function: Message In phase
7974  *
7975  * Description: Bring in the message and determine what to do with it.
7976  *
7977  *---------------------------------------------------------------------*/
7978 
7979 #if defined(OS2)
phaseMsgIn(ULONG port,UCHAR p_card)7980 void far phaseMsgIn(ULONG port, UCHAR p_card)
7981 #else
7982 #if defined(DOS)
7983 void phaseMsgIn(USHORT port, UCHAR p_card)
7984 #else
7985 void phaseMsgIn(ULONG port, UCHAR p_card)
7986 #endif
7987 #endif
7988 {
7989 	UCHAR message;
7990 	PSCCB currSCCB;
7991 
7992 	currSCCB = BL_Card[p_card].currentSCCB;
7993 
7994 	if (BL_Card[p_card].globalFlags & F_HOST_XFER_ACT)
7995 	{
7996 
7997 		phaseChkFifo(port, p_card);
7998 	}
7999 
8000 	message = RD_HARPOON(port+hp_scsidata_0);
8001 	if ((message == SMDISC) || (message == SMSAVE_DATA_PTR))
8002 	{
8003 
8004 		WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+END_DATA_START));
8005 
8006 	}
8007 
8008 	else
8009 	{
8010 
8011 		message = sfm(port,currSCCB);
8012 		if (message)
8013 		{
8014 
8015 
8016 			sdecm(message,port,p_card);
8017 
8018 		}
8019 		else
8020 		{
8021 			if(currSCCB->Sccb_scsimsg != SMPARITY)
8022 				ACCEPT_MSG(port);
8023 			WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
8024 		}
8025 	}
8026 
8027 }
8028 
8029 
8030 /*---------------------------------------------------------------------
8031  *
8032  * Function: Illegal phase
8033  *
8034  * Description: Target switched to some illegal phase, so all we can do
8035  *              is report an error back to the host (if that is possible)
8036  *              and send an ABORT message to the misbehaving target.
8037  *
8038  *---------------------------------------------------------------------*/
8039 
8040 #if defined(OS2)
phaseIllegal(ULONG port,UCHAR p_card)8041 void far phaseIllegal(ULONG port, UCHAR p_card)
8042 #else
8043 #if defined(DOS)
8044 void phaseIllegal(USHORT port, UCHAR p_card)
8045 #else
8046 void phaseIllegal(ULONG port, UCHAR p_card)
8047 #endif
8048 #endif
8049 {
8050    PSCCB currSCCB;
8051 
8052    currSCCB = BL_Card[p_card].currentSCCB;
8053 
8054    WR_HARPOON(port+hp_scsisig, RD_HARPOON(port+hp_scsisig));
8055    if (currSCCB != NULL) {
8056 
8057       currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
8058       currSCCB->Sccb_scsistat = ABORT_ST;
8059       currSCCB->Sccb_scsimsg = SMABORT;
8060       }
8061 
8062    ACCEPT_MSG_ATN(port);
8063 }
8064 
8065 
8066 
8067 /*---------------------------------------------------------------------
8068  *
8069  * Function: Phase Check FIFO
8070  *
8071  * Description: Make sure data has been flushed from both FIFOs and abort
8072  *              the operations if necessary.
8073  *
8074  *---------------------------------------------------------------------*/
8075 
8076 #if defined(DOS)
phaseChkFifo(USHORT port,UCHAR p_card)8077 void phaseChkFifo(USHORT port, UCHAR p_card)
8078 #else
8079 void phaseChkFifo(ULONG port, UCHAR p_card)
8080 #endif
8081 {
8082    ULONG xfercnt;
8083    PSCCB currSCCB;
8084 
8085    currSCCB = BL_Card[p_card].currentSCCB;
8086 
8087    if (currSCCB->Sccb_scsistat == DATA_IN_ST)
8088       {
8089 
8090       while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) &&
8091 	      (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {}
8092 
8093 
8094       if (!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))
8095          {
8096 	      currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
8097 
8098 	      currSCCB->Sccb_XferCnt = 0;
8099 
8100 	      if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
8101 	            (currSCCB->HostStatus == SCCB_COMPLETE))
8102             {
8103 	         currSCCB->HostStatus = SCCB_PARITY_ERR;
8104 	         WRW_HARPOON((port+hp_intstat), PARITY);
8105 	         }
8106 
8107 	      hostDataXferAbort(port,p_card,currSCCB);
8108 
8109 	      dataXferProcessor(port, &BL_Card[p_card]);
8110 
8111 	      while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) &&
8112 	         (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {}
8113 
8114 	      }
8115       }  /*End Data In specific code. */
8116 
8117 
8118 
8119 #if defined(DOS)
8120    asm { mov dx,port;
8121       add dx,hp_xfercnt_2;
8122       in  al,dx;
8123       dec dx;
8124       xor ah,ah;
8125       mov word ptr xfercnt+2,ax;
8126       in  al,dx;
8127       dec dx;
8128       mov ah,al;
8129       in  al,dx;
8130       mov word ptr xfercnt,ax;
8131       }
8132 #else
8133    GET_XFER_CNT(port,xfercnt);
8134 #endif
8135 
8136 
8137    WR_HARPOON(port+hp_xfercnt_0, 0x00);
8138 
8139 
8140    WR_HARPOON(port+hp_portctrl_0, 0x00);
8141 
8142    currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt);
8143 
8144    currSCCB->Sccb_XferCnt = xfercnt;
8145 
8146    if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
8147       (currSCCB->HostStatus == SCCB_COMPLETE)) {
8148 
8149       currSCCB->HostStatus = SCCB_PARITY_ERR;
8150       WRW_HARPOON((port+hp_intstat), PARITY);
8151       }
8152 
8153 
8154    hostDataXferAbort(port,p_card,currSCCB);
8155 
8156 
8157    WR_HARPOON(port+hp_fifowrite, 0x00);
8158    WR_HARPOON(port+hp_fiforead, 0x00);
8159    WR_HARPOON(port+hp_xferstat, 0x00);
8160 
8161    WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
8162 }
8163 
8164 
8165 /*---------------------------------------------------------------------
8166  *
8167  * Function: Phase Bus Free
8168  *
8169  * Description: We just went bus free so figure out if it was
8170  *              because of command complete or from a disconnect.
8171  *
8172  *---------------------------------------------------------------------*/
8173 #if defined(DOS)
phaseBusFree(USHORT port,UCHAR p_card)8174 void phaseBusFree(USHORT port, UCHAR p_card)
8175 #else
8176 void phaseBusFree(ULONG port, UCHAR p_card)
8177 #endif
8178 {
8179    PSCCB currSCCB;
8180 
8181    currSCCB = BL_Card[p_card].currentSCCB;
8182 
8183    if (currSCCB != NULL)
8184       {
8185 
8186       DISABLE_AUTO(port);
8187 
8188 
8189       if (currSCCB->OperationCode == RESET_COMMAND)
8190          {
8191 
8192 			if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8193 				((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
8194 	   		 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
8195 			else
8196 		   	 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
8197 
8198 	      queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
8199 
8200 	      queueSearchSelect(&BL_Card[p_card],p_card);
8201 
8202 	      }
8203 
8204       else if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
8205 	      {
8206 	      sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
8207 			         (UCHAR)SYNC_SUPPORTED;
8208 	      sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
8209 	      }
8210 
8211       else if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
8212 	      {
8213 	      sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
8214 		            (sccbMgrTbl[p_card][currSCCB->TargID].
8215 		   TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
8216 
8217 	      sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
8218 	      }
8219 
8220 #if !defined(DOS)
8221       else if(currSCCB->Sccb_scsistat == SELECT_Q_ST)
8222 	      {
8223 	      /* Make sure this is not a phony BUS_FREE.  If we were
8224 	      reselected or if BUSY is NOT on then this is a
8225 	      valid BUS FREE.  SRR Wednesday, 5/10/1995.     */
8226 
8227 	      if ((!(RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ||
8228 	         (RDW_HARPOON((port+hp_intstat)) & RSEL))
8229 	         {
8230 	         sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_TAG_Q_MASK;
8231 	         sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= TAG_Q_REJECT;
8232 	         }
8233 
8234 	      else
8235             {
8236 	         return;
8237 	         }
8238          }
8239 #endif
8240 
8241       else
8242 	      {
8243 
8244 	      currSCCB->Sccb_scsistat = BUS_FREE_ST;
8245 
8246          if (!currSCCB->HostStatus)
8247 	         {
8248 	         currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
8249 	         }
8250 
8251 			if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8252 				((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
8253 	   		 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
8254 			else
8255 		   	 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
8256 
8257 	      queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
8258 	      return;
8259 	      }
8260 
8261 
8262       BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8263 
8264       } /*end if !=null */
8265 }
8266 
8267 
8268 
8269 
8270 #ident "$Id: automate.c 1.14 1997/01/31 02:11:46 mohan Exp $"
8271 /*----------------------------------------------------------------------
8272  *
8273  *
8274  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
8275  *
8276  *   This file is available under both the GNU General Public License
8277  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
8278  *
8279  *   $Workfile:   automate.c  $
8280  *
8281  *   Description:  Functions relating to programming the automation of
8282  *                 the HARPOON.
8283  *
8284  *   $Date: 1997/01/31 02:11:46 $
8285  *
8286  *   $Revision: 1.14 $
8287  *
8288  *----------------------------------------------------------------------*/
8289 
8290 /*#include <globals.h>*/
8291 
8292 #if (FW_TYPE==_UCB_MGR_)
8293 	/*#include <budi.h>*/
8294 #endif
8295 
8296 /*#include <sccbmgr.h>*/
8297 /*#include <blx30.h>*/
8298 /*#include <target.h>*/
8299 /*#include <scsi2.h>*/
8300 /*#include <harpoon.h>*/
8301 
8302 /*
8303 extern SCCBCARD BL_Card[MAX_CARDS];
8304 extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
8305 extern SCCBCARD BL_Card[MAX_CARDS];
8306 */
8307 
8308 /*---------------------------------------------------------------------
8309  *
8310  * Function: Auto Load Default Map
8311  *
8312  * Description: Load the Automation RAM with the defualt map values.
8313  *
8314  *---------------------------------------------------------------------*/
8315 #if defined(DOS)
autoLoadDefaultMap(USHORT p_port)8316 void autoLoadDefaultMap(USHORT p_port)
8317 #else
8318 void autoLoadDefaultMap(ULONG p_port)
8319 #endif
8320 {
8321 #if defined(DOS)
8322    USHORT map_addr;
8323 #else
8324    ULONG map_addr;
8325 #endif
8326 
8327    ARAM_ACCESS(p_port);
8328    map_addr = p_port + hp_aramBase;
8329 
8330    WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0xC0));  /*ID MESSAGE */
8331    map_addr +=2;
8332    WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x20));  /*SIMPLE TAG QUEUEING MSG */
8333    map_addr +=2;
8334    WRW_HARPOON(map_addr, RAT_OP);                   /*RESET ATTENTION */
8335    map_addr +=2;
8336    WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x00));  /*TAG ID MSG */
8337    map_addr +=2;
8338    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 0 */
8339    map_addr +=2;
8340    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 1 */
8341    map_addr +=2;
8342    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 2 */
8343    map_addr +=2;
8344    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 3 */
8345    map_addr +=2;
8346    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 4 */
8347    map_addr +=2;
8348    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 5 */
8349    map_addr +=2;
8350    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 6 */
8351    map_addr +=2;
8352    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 7 */
8353    map_addr +=2;
8354    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 8 */
8355    map_addr +=2;
8356    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 9 */
8357    map_addr +=2;
8358    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 10 */
8359    map_addr +=2;
8360    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 11 */
8361    map_addr +=2;
8362    WRW_HARPOON(map_addr, (CPE_OP+ADATA_OUT+ DINT)); /*JUMP IF DATA OUT */
8363    map_addr +=2;
8364    WRW_HARPOON(map_addr, (TCB_OP+FIFO_0+ DI));     /*JUMP IF NO DATA IN FIFO */
8365    map_addr +=2;                                   /*This means AYNC DATA IN */
8366    WRW_HARPOON(map_addr, (SSI_OP+   SSI_IDO_STRT)); /*STOP AND INTERRUPT */
8367    map_addr +=2;
8368    WRW_HARPOON(map_addr, (CPE_OP+ADATA_IN+DINT));   /*JUMP IF NOT DATA IN PHZ */
8369    map_addr +=2;
8370    WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+  ST));    /*IF NOT MSG IN CHECK 4 DATA IN */
8371    map_addr +=2;
8372    WRW_HARPOON(map_addr, (CRD_OP+SDATA+    0x02));  /*SAVE DATA PTR MSG? */
8373    map_addr +=2;
8374    WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+   DC));    /*GO CHECK FOR DISCONNECT MSG */
8375    map_addr +=2;
8376    WRW_HARPOON(map_addr, (MRR_OP+SDATA+    D_AR1)); /*SAVE DATA PTRS MSG */
8377    map_addr +=2;
8378    WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+  ST));    /*IF NOT MSG IN CHECK DATA IN */
8379    map_addr +=2;
8380    WRW_HARPOON(map_addr, (CRD_OP+SDATA+    0x04));  /*DISCONNECT MSG? */
8381    map_addr +=2;
8382    WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+   UNKNWN));/*UKNKNOWN MSG */
8383    map_addr +=2;
8384    WRW_HARPOON(map_addr, (MRR_OP+SDATA+    D_BUCKET));/*XFER DISCONNECT MSG */
8385    map_addr +=2;
8386    WRW_HARPOON(map_addr, (SSI_OP+          SSI_ITAR_DISC));/*STOP AND INTERRUPT */
8387    map_addr +=2;
8388    WRW_HARPOON(map_addr, (CPN_OP+ASTATUS+  UNKNWN));/*JUMP IF NOT STATUS PHZ. */
8389    map_addr +=2;
8390    WRW_HARPOON(map_addr, (MRR_OP+SDATA+  D_AR0));   /*GET STATUS BYTE */
8391    map_addr +=2;
8392    WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+  CC));    /*ERROR IF NOT MSG IN PHZ */
8393    map_addr +=2;
8394    WRW_HARPOON(map_addr, (CRD_OP+SDATA+    0x00));  /*CHECK FOR CMD COMPLETE MSG. */
8395    map_addr +=2;
8396    WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+   CC));    /*ERROR IF NOT CMD COMPLETE MSG. */
8397    map_addr +=2;
8398    WRW_HARPOON(map_addr, (MRR_OP+SDATA+  D_BUCKET));/*GET CMD COMPLETE MSG */
8399    map_addr +=2;
8400    WRW_HARPOON(map_addr, (SSI_OP+       SSI_ICMD_COMP));/*END OF COMMAND */
8401    map_addr +=2;
8402 
8403    WRW_HARPOON(map_addr, (SSI_OP+ SSI_IUNKWN));  /*RECEIVED UNKNOWN MSG BYTE */
8404    map_addr +=2;
8405    WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC));  /*NO COMMAND COMPLETE AFTER STATUS */
8406    map_addr +=2;
8407    WRW_HARPOON(map_addr, (SSI_OP+ SSI_ITICKLE)); /*BIOS Tickled the Mgr */
8408    map_addr +=2;
8409    WRW_HARPOON(map_addr, (SSI_OP+ SSI_IRFAIL));  /*EXPECTED ID/TAG MESSAGES AND */
8410    map_addr +=2;                             /* DIDN'T GET ONE */
8411    WRW_HARPOON(map_addr, (CRR_OP+AR3+  S_IDREG)); /* comp SCSI SEL ID & AR3*/
8412    map_addr +=2;
8413    WRW_HARPOON(map_addr, (BRH_OP+EQUAL+   0x00));    /*SEL ID OK then Conti. */
8414    map_addr +=2;
8415    WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC));  /*NO COMMAND COMPLETE AFTER STATUS */
8416 
8417 
8418 
8419    SGRAM_ACCESS(p_port);
8420 }
8421 
8422 /*---------------------------------------------------------------------
8423  *
8424  * Function: Auto Command Complete
8425  *
8426  * Description: Post command back to host and find another command
8427  *              to execute.
8428  *
8429  *---------------------------------------------------------------------*/
8430 
8431 #if defined(DOS)
autoCmdCmplt(USHORT p_port,UCHAR p_card)8432 void autoCmdCmplt(USHORT p_port, UCHAR p_card)
8433 #else
8434 void autoCmdCmplt(ULONG p_port, UCHAR p_card)
8435 #endif
8436 {
8437    PSCCB currSCCB;
8438    UCHAR status_byte;
8439 
8440    currSCCB = BL_Card[p_card].currentSCCB;
8441 
8442    status_byte = RD_HARPOON(p_port+hp_gp_reg_0);
8443 
8444    sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = FALSE;
8445 
8446    if (status_byte != SSGOOD) {
8447 
8448       if (status_byte == SSQ_FULL) {
8449 
8450 
8451 			if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8452 				((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8453 			{
8454 	         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8455 				if(BL_Card[p_card].discQCount != 0)
8456 					BL_Card[p_card].discQCount--;
8457 				BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8458 			}
8459 			else
8460 			{
8461 	         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8462 				if(currSCCB->Sccb_tag)
8463 				{
8464 					if(BL_Card[p_card].discQCount != 0)
8465 						BL_Card[p_card].discQCount--;
8466 					BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8467 				}else
8468 				{
8469 					if(BL_Card[p_card].discQCount != 0)
8470 						BL_Card[p_card].discQCount--;
8471 					BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8472 				}
8473 			}
8474 
8475          currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
8476 
8477          queueSelectFail(&BL_Card[p_card],p_card);
8478 
8479          return;
8480          }
8481 
8482       if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
8483          {
8484          sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
8485             (UCHAR)SYNC_SUPPORTED;
8486 
8487 	      sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
8488          BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8489 
8490 			if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8491 				((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8492 			{
8493 	         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8494 				if(BL_Card[p_card].discQCount != 0)
8495 					BL_Card[p_card].discQCount--;
8496 				BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8497 			}
8498 			else
8499 			{
8500 	         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8501 				if(currSCCB->Sccb_tag)
8502 				{
8503 					if(BL_Card[p_card].discQCount != 0)
8504 						BL_Card[p_card].discQCount--;
8505 					BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8506 				}else
8507 				{
8508 					if(BL_Card[p_card].discQCount != 0)
8509 						BL_Card[p_card].discQCount--;
8510 					BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8511 				}
8512 			}
8513          return;
8514 
8515          }
8516 
8517       if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
8518          {
8519 
8520 	      sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
8521 	         (sccbMgrTbl[p_card][currSCCB->TargID].
8522 	         TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
8523 
8524 	      sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
8525          BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8526 
8527 			if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8528 				((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8529 			{
8530 	         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8531 				if(BL_Card[p_card].discQCount != 0)
8532 					BL_Card[p_card].discQCount--;
8533 				BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8534 			}
8535 			else
8536 			{
8537 	         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8538 				if(currSCCB->Sccb_tag)
8539 				{
8540 					if(BL_Card[p_card].discQCount != 0)
8541 						BL_Card[p_card].discQCount--;
8542 					BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8543 				}else
8544 				{
8545 					if(BL_Card[p_card].discQCount != 0)
8546 						BL_Card[p_card].discQCount--;
8547 					BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8548 				}
8549 			}
8550          return;
8551 
8552          }
8553 
8554 	   if (status_byte == SSCHECK)
8555 		{
8556 			if(BL_Card[p_card].globalFlags & F_DO_RENEGO)
8557 			{
8558 				if (sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_SYNC_MASK)
8559 				{
8560 					sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_SYNC_MASK;
8561 				}
8562 				if (sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_WIDE_SCSI)
8563 				{
8564 					sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_WIDE_MASK;
8565 				}
8566 			}
8567 		}
8568 
8569       if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) {
8570 
8571          currSCCB->SccbStatus = SCCB_ERROR;
8572          currSCCB->TargetStatus = status_byte;
8573 
8574          if (status_byte == SSCHECK) {
8575 
8576             sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA
8577                = TRUE;
8578 
8579 
8580 #if (FW_TYPE==_SCCB_MGR_)
8581             if (currSCCB->RequestSenseLength != NO_AUTO_REQUEST_SENSE) {
8582 
8583                if (currSCCB->RequestSenseLength == 0)
8584                   currSCCB->RequestSenseLength = 14;
8585 
8586                ssenss(&BL_Card[p_card]);
8587                BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8588 
8589  					if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8590 						((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8591 					{
8592 			         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8593 						if(BL_Card[p_card].discQCount != 0)
8594 							BL_Card[p_card].discQCount--;
8595 						BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8596 					}
8597 					else
8598 					{
8599 	   		      sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8600 						if(currSCCB->Sccb_tag)
8601 						{
8602 							if(BL_Card[p_card].discQCount != 0)
8603 								BL_Card[p_card].discQCount--;
8604 							BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8605 						}else
8606 						{
8607 							if(BL_Card[p_card].discQCount != 0)
8608 								BL_Card[p_card].discQCount--;
8609 							BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8610 						}
8611 					}
8612                return;
8613                }
8614 #else
8615 				   if ((!(currSCCB->Sccb_ucb_ptr->UCB_opcode & OPC_NO_AUTO_SENSE)) &&
8616 			   		(currSCCB->RequestSenseLength))
8617 				   {
8618 				   	ssenss(&BL_Card[p_card]);
8619 				      BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
8620 
8621 						if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8622 							((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
8623 						{
8624 	      			   sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
8625 							if(BL_Card[p_card].discQCount != 0)
8626 								BL_Card[p_card].discQCount--;
8627 							BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
8628 						}
8629 						else
8630 						{
8631 	      			   sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
8632 							if(currSCCB->Sccb_tag)
8633 							{
8634 								if(BL_Card[p_card].discQCount != 0)
8635 									BL_Card[p_card].discQCount--;
8636 								BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
8637 							}else
8638 							{
8639 								if(BL_Card[p_card].discQCount != 0)
8640 									BL_Card[p_card].discQCount--;
8641 								BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
8642 							}
8643 						}
8644 				      return;
8645 				   }
8646 
8647 #endif
8648             }
8649          }
8650       }
8651 
8652 
8653 	if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
8654 		((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
8655 	   sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
8656 	else
8657 	   sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
8658 
8659 
8660    queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
8661 }
8662 #ident "$Id: busmstr.c 1.8 1997/01/31 02:10:27 mohan Exp $"
8663 /*----------------------------------------------------------------------
8664  *
8665  *
8666  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
8667  *
8668  *   This file is available under both the GNU General Public License
8669  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
8670  *
8671  *   $Workfile:   busmstr.c  $
8672  *
8673  *   Description:  Functions to start, stop, and abort BusMaster operations.
8674  *
8675  *   $Date: 1997/01/31 02:10:27 $
8676  *
8677  *   $Revision: 1.8 $
8678  *
8679  *----------------------------------------------------------------------*/
8680 
8681 /*#include <globals.h>*/
8682 
8683 #if (FW_TYPE==_UCB_MGR_)
8684 	/*#include <budi.h>*/
8685 #endif
8686 
8687 /*#include <sccbmgr.h>*/
8688 /*#include <blx30.h>*/
8689 /*#include <target.h>*/
8690 /*#include <scsi2.h>*/
8691 /*#include <harpoon.h>*/
8692 
8693 
8694 /*
8695 extern SCCBCARD BL_Card[MAX_CARDS];
8696 extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
8697 */
8698 
8699 #define SHORT_WAIT   0x0000000F
8700 #define LONG_WAIT    0x0000FFFFL
8701 
8702 #if defined(BUGBUG)
8703 void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
8704 #endif
8705 
8706 /*---------------------------------------------------------------------
8707  *
8708  * Function: Data Transfer Processor
8709  *
8710  * Description: This routine performs two tasks.
8711  *              (1) Start data transfer by calling HOST_DATA_XFER_START
8712  *              function.  Once data transfer is started, (2) Depends
8713  *              on the type of data transfer mode Scatter/Gather mode
8714  *              or NON Scatter/Gather mode.  In NON Scatter/Gather mode,
8715  *              this routine checks Sccb_MGRFlag (F_HOST_XFER_ACT bit) for
8716  *              data transfer done.  In Scatter/Gather mode, this routine
8717  *              checks bus master command complete and dual rank busy
8718  *              bit to keep chaining SC transfer command.  Similarly,
8719  *              in Scatter/Gather mode, it checks Sccb_MGRFlag
8720  *              (F_HOST_XFER_ACT bit) for data transfer done.
8721  *
8722  *---------------------------------------------------------------------*/
8723 
8724 #if defined(DOS)
dataXferProcessor(USHORT port,PSCCBcard pCurrCard)8725 void dataXferProcessor(USHORT port, PSCCBcard pCurrCard)
8726 #else
8727 void dataXferProcessor(ULONG port, PSCCBcard pCurrCard)
8728 #endif
8729 {
8730    PSCCB currSCCB;
8731 
8732    currSCCB = pCurrCard->currentSCCB;
8733 
8734       if (currSCCB->Sccb_XferState & F_SG_XFER)
8735 			{
8736 			if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
8737 
8738 				{
8739 		   	currSCCB->Sccb_sgseg += (UCHAR)SG_BUF_CNT;
8740          	currSCCB->Sccb_SGoffset = 0x00;
8741  				}
8742 			pCurrCard->globalFlags |= F_HOST_XFER_ACT;
8743 
8744          busMstrSGDataXferStart(port, currSCCB);
8745 			}
8746 
8747       else
8748 			{
8749 			if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT))
8750 				{
8751 				pCurrCard->globalFlags |= F_HOST_XFER_ACT;
8752 
8753          	busMstrDataXferStart(port, currSCCB);
8754          	}
8755 			}
8756 }
8757 
8758 
8759 /*---------------------------------------------------------------------
8760  *
8761  * Function: BusMaster Scatter Gather Data Transfer Start
8762  *
8763  * Description:
8764  *
8765  *---------------------------------------------------------------------*/
8766 #if defined(DOS)
busMstrSGDataXferStart(USHORT p_port,PSCCB pcurrSCCB)8767 void busMstrSGDataXferStart(USHORT p_port, PSCCB pcurrSCCB)
8768 #else
8769 void busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
8770 #endif
8771 {
8772    ULONG count,addr,tmpSGCnt;
8773    UINT sg_index;
8774    UCHAR sg_count, i;
8775 #if defined(DOS)
8776    USHORT reg_offset;
8777 #else
8778    ULONG reg_offset;
8779 #endif
8780 
8781 
8782    if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
8783 
8784       count =  ((ULONG) HOST_RD_CMD)<<24;
8785       }
8786 
8787    else {
8788       count =  ((ULONG) HOST_WRT_CMD)<<24;
8789       }
8790 
8791    sg_count = 0;
8792    tmpSGCnt = 0;
8793    sg_index = pcurrSCCB->Sccb_sgseg;
8794    reg_offset = hp_aramBase;
8795 
8796 
8797 	i = (UCHAR) (RD_HARPOON(p_port+hp_page_ctrl) & ~(SGRAM_ARAM|SCATTER_EN));
8798 
8799 
8800 	WR_HARPOON(p_port+hp_page_ctrl, i);
8801 
8802    while ((sg_count < (UCHAR)SG_BUF_CNT) &&
8803       ((ULONG)(sg_index * (UINT)SG_ELEMENT_SIZE) < pcurrSCCB->DataLength) ) {
8804 
8805 #if defined(COMPILER_16_BIT) && !defined(DOS)
8806       tmpSGCnt += *(((ULONG far *)pcurrSCCB->DataPointer)+
8807          (sg_index * 2));
8808 
8809       count |= *(((ULONG far *)pcurrSCCB->DataPointer)+
8810          (sg_index * 2));
8811 
8812       addr = *(((ULONG far *)pcurrSCCB->DataPointer)+
8813          ((sg_index * 2) + 1));
8814 
8815 #else
8816       tmpSGCnt += *(((ULONG *)pcurrSCCB->DataPointer)+
8817          (sg_index * 2));
8818 
8819       count |= *(((ULONG *)pcurrSCCB->DataPointer)+
8820          (sg_index * 2));
8821 
8822       addr = *(((ULONG *)pcurrSCCB->DataPointer)+
8823          ((sg_index * 2) + 1));
8824 #endif
8825 
8826 
8827       if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
8828 
8829          addr += ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset);
8830          count = (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset;
8831 
8832          tmpSGCnt = count & 0x00FFFFFFL;
8833          }
8834 
8835       WR_HARP32(p_port,reg_offset,addr);
8836       reg_offset +=4;
8837 
8838       WR_HARP32(p_port,reg_offset,count);
8839       reg_offset +=4;
8840 
8841       count &= 0xFF000000L;
8842       sg_index++;
8843       sg_count++;
8844 
8845       } /*End While */
8846 
8847    pcurrSCCB->Sccb_XferCnt = tmpSGCnt;
8848 
8849    WR_HARPOON(p_port+hp_sg_addr,(sg_count<<4));
8850 
8851    if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
8852 
8853       WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt);
8854 
8855 
8856       WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT));
8857       WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH);
8858       }
8859 
8860    else {
8861 
8862 
8863       if ((!(RD_HARPOON(p_port+hp_synctarg_0) & NARROW_SCSI)) &&
8864          (tmpSGCnt & 0x000000001))
8865          {
8866 
8867          pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT;
8868          tmpSGCnt--;
8869          }
8870 
8871 
8872       WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt);
8873 
8874       WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD));
8875       WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH);
8876       }
8877 
8878 
8879    WR_HARPOON(p_port+hp_page_ctrl, (UCHAR) (i | SCATTER_EN));
8880 
8881 }
8882 
8883 
8884 /*---------------------------------------------------------------------
8885  *
8886  * Function: BusMaster Data Transfer Start
8887  *
8888  * Description:
8889  *
8890  *---------------------------------------------------------------------*/
8891 #if defined(DOS)
busMstrDataXferStart(USHORT p_port,PSCCB pcurrSCCB)8892 void busMstrDataXferStart(USHORT p_port, PSCCB pcurrSCCB)
8893 #else
8894 void busMstrDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
8895 #endif
8896 {
8897    ULONG addr,count;
8898 
8899    if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) {
8900 
8901       count = pcurrSCCB->Sccb_XferCnt;
8902 
8903       addr = (ULONG) pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC;
8904       }
8905 
8906    else {
8907       addr = pcurrSCCB->SensePointer;
8908       count = pcurrSCCB->RequestSenseLength;
8909 
8910       }
8911 
8912 #if defined(DOS)
8913    asm { mov dx,p_port;
8914          mov ax,word ptr count;
8915          add dx,hp_xfer_cnt_lo;
8916          out dx,al;
8917          inc dx;
8918          xchg ah,al
8919          out dx,al;
8920          inc dx;
8921          mov ax,word ptr count+2;
8922          out dx,al;
8923          inc dx;
8924          inc dx;
8925          mov ax,word ptr addr;
8926          out dx,al;
8927          inc dx;
8928          xchg ah,al
8929          out dx,al;
8930          inc dx;
8931          mov ax,word ptr addr+2;
8932          out dx,al;
8933          inc dx;
8934          xchg ah,al
8935          out dx,al;
8936          }
8937 
8938    WR_HARP32(p_port,hp_xfercnt_0,count);
8939 
8940 #else
8941    HP_SETUP_ADDR_CNT(p_port,addr,count);
8942 #endif
8943 
8944 
8945    if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
8946 
8947       WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT));
8948       WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH);
8949 
8950       WR_HARPOON(p_port+hp_xfer_cmd,
8951          (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT));
8952       }
8953 
8954    else {
8955 
8956       WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD));
8957       WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH);
8958 
8959       WR_HARPOON(p_port+hp_xfer_cmd,
8960          (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT));
8961 
8962       }
8963 }
8964 
8965 
8966 /*---------------------------------------------------------------------
8967  *
8968  * Function: BusMaster Timeout Handler
8969  *
8970  * Description: This function is called after a bus master command busy time
8971  *               out is detected.  This routines issue halt state machine
8972  *               with a software time out for command busy.  If command busy
8973  *               is still asserted at the end of the time out, it issues
8974  *               hard abort with another software time out.  It hard abort
8975  *               command busy is also time out, it'll just give up.
8976  *
8977  *---------------------------------------------------------------------*/
8978 #if defined(DOS)
busMstrTimeOut(USHORT p_port)8979 UCHAR busMstrTimeOut(USHORT p_port)
8980 #else
8981 UCHAR busMstrTimeOut(ULONG p_port)
8982 #endif
8983 {
8984    ULONG timeout;
8985 
8986    timeout = LONG_WAIT;
8987 
8988    WR_HARPOON(p_port+hp_sys_ctrl, HALT_MACH);
8989 
8990    while ((!(RD_HARPOON(p_port+hp_ext_status) & CMD_ABORTED)) && timeout--) {}
8991 
8992 
8993 
8994    if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) {
8995       WR_HARPOON(p_port+hp_sys_ctrl, HARD_ABORT);
8996 
8997       timeout = LONG_WAIT;
8998       while ((RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
8999       }
9000 
9001    RD_HARPOON(p_port+hp_int_status);           /*Clear command complete */
9002 
9003    if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) {
9004       return(TRUE);
9005       }
9006 
9007    else {
9008       return(FALSE);
9009       }
9010 }
9011 
9012 
9013 /*---------------------------------------------------------------------
9014  *
9015  * Function: Host Data Transfer Abort
9016  *
9017  * Description: Abort any in progress transfer.
9018  *
9019  *---------------------------------------------------------------------*/
9020 #if defined(DOS)
hostDataXferAbort(USHORT port,UCHAR p_card,PSCCB pCurrSCCB)9021 void hostDataXferAbort(USHORT port, UCHAR p_card, PSCCB pCurrSCCB)
9022 #else
9023 void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
9024 #endif
9025 {
9026 
9027    ULONG timeout;
9028    ULONG remain_cnt;
9029    UINT sg_ptr;
9030 
9031    BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
9032 
9033    if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) {
9034 
9035 
9036       if (!(RD_HARPOON(port+hp_int_status) & INT_CMD_COMPL)) {
9037 
9038          WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) | FLUSH_XFER_CNTR));
9039          timeout = LONG_WAIT;
9040 
9041          while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
9042 
9043          WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) & ~FLUSH_XFER_CNTR));
9044 
9045          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9046 
9047             if (busMstrTimeOut(port)) {
9048 
9049                if (pCurrSCCB->HostStatus == 0x00)
9050 
9051                   pCurrSCCB->HostStatus = SCCB_BM_ERR;
9052 
9053                }
9054 
9055             if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS)
9056 
9057                if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS)
9058 
9059                   if (pCurrSCCB->HostStatus == 0x00)
9060 
9061                      {
9062                      pCurrSCCB->HostStatus = SCCB_BM_ERR;
9063 #if defined(BUGBUG)
9064                      WR_HARPOON(port+hp_dual_addr_lo,
9065                         RD_HARPOON(port+hp_ext_status));
9066 #endif
9067                      }
9068             }
9069          }
9070       }
9071 
9072    else if (pCurrSCCB->Sccb_XferCnt) {
9073 
9074       if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
9075 
9076 
9077               WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) &
9078             ~SCATTER_EN));
9079 
9080          WR_HARPOON(port+hp_sg_addr,0x00);
9081 
9082          sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT;
9083 
9084          if (sg_ptr > (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE)) {
9085 
9086             sg_ptr = (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE);
9087             }
9088 
9089          remain_cnt = pCurrSCCB->Sccb_XferCnt;
9090 
9091          while (remain_cnt < 0x01000000L) {
9092 
9093             sg_ptr--;
9094 
9095 #if defined(COMPILER_16_BIT) && !defined(DOS)
9096             if (remain_cnt > (ULONG)(*(((ULONG far *)pCurrSCCB->
9097                DataPointer) + (sg_ptr * 2)))) {
9098 
9099                remain_cnt -= (ULONG)(*(((ULONG far *)pCurrSCCB->
9100                   DataPointer) + (sg_ptr * 2)));
9101                }
9102 
9103 #else
9104             if (remain_cnt > (ULONG)(*(((ULONG *)pCurrSCCB->
9105                DataPointer) + (sg_ptr * 2)))) {
9106 
9107                remain_cnt -= (ULONG)(*(((ULONG *)pCurrSCCB->
9108                   DataPointer) + (sg_ptr * 2)));
9109                }
9110 #endif
9111 
9112             else {
9113 
9114                break;
9115                }
9116             }
9117 
9118 
9119 
9120          if (remain_cnt < 0x01000000L) {
9121 
9122 
9123             pCurrSCCB->Sccb_SGoffset = remain_cnt;
9124 
9125             pCurrSCCB->Sccb_sgseg = (USHORT)sg_ptr;
9126 
9127 
9128             if ((ULONG)(sg_ptr * SG_ELEMENT_SIZE) == pCurrSCCB->DataLength
9129                 && (remain_cnt == 0))
9130 
9131                pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
9132             }
9133 
9134          else {
9135 
9136 
9137             if (pCurrSCCB->HostStatus == 0x00) {
9138 
9139                pCurrSCCB->HostStatus = SCCB_GROSS_FW_ERR;
9140                }
9141             }
9142          }
9143 
9144 
9145       if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) {
9146 
9147 
9148          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9149 
9150             busMstrTimeOut(port);
9151             }
9152 
9153          else {
9154 
9155             if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
9156 
9157                if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
9158 
9159                   if (pCurrSCCB->HostStatus == 0x00) {
9160 
9161                      pCurrSCCB->HostStatus = SCCB_BM_ERR;
9162 #if defined(BUGBUG)
9163                      WR_HARPOON(port+hp_dual_addr_lo,
9164                         RD_HARPOON(port+hp_ext_status));
9165 #endif
9166                      }
9167                   }
9168                }
9169 
9170             }
9171          }
9172 
9173       else {
9174 
9175 
9176          if ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) {
9177 
9178             timeout = SHORT_WAIT;
9179 
9180             while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) &&
9181                ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) &&
9182                timeout--) {}
9183             }
9184 
9185          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9186 
9187             WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) |
9188                FLUSH_XFER_CNTR));
9189 
9190             timeout = LONG_WAIT;
9191 
9192             while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) &&
9193                timeout--) {}
9194 
9195             WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) &
9196                ~FLUSH_XFER_CNTR));
9197 
9198 
9199             if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9200 
9201                if (pCurrSCCB->HostStatus == 0x00) {
9202 
9203                   pCurrSCCB->HostStatus = SCCB_BM_ERR;
9204                   }
9205 
9206                busMstrTimeOut(port);
9207                }
9208             }
9209 
9210          if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
9211 
9212             if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
9213 
9214                if (pCurrSCCB->HostStatus == 0x00) {
9215 
9216                   pCurrSCCB->HostStatus = SCCB_BM_ERR;
9217 #if defined(BUGBUG)
9218                   WR_HARPOON(port+hp_dual_addr_lo,
9219                      RD_HARPOON(port+hp_ext_status));
9220 #endif
9221                   }
9222                }
9223             }
9224          }
9225 
9226       }
9227 
9228    else {
9229 
9230 
9231       if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9232 
9233          timeout = LONG_WAIT;
9234 
9235          while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
9236 
9237          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
9238 
9239             if (pCurrSCCB->HostStatus == 0x00) {
9240 
9241                pCurrSCCB->HostStatus = SCCB_BM_ERR;
9242                }
9243 
9244             busMstrTimeOut(port);
9245             }
9246          }
9247 
9248 
9249       if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
9250 
9251          if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
9252 
9253             if (pCurrSCCB->HostStatus == 0x00) {
9254 
9255                pCurrSCCB->HostStatus = SCCB_BM_ERR;
9256 #if defined(BUGBUG)
9257                WR_HARPOON(port+hp_dual_addr_lo,
9258                   RD_HARPOON(port+hp_ext_status));
9259 #endif
9260                }
9261             }
9262 
9263          }
9264 
9265       if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
9266 
9267          WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) &
9268                  ~SCATTER_EN));
9269 
9270          WR_HARPOON(port+hp_sg_addr,0x00);
9271 
9272          pCurrSCCB->Sccb_sgseg += SG_BUF_CNT;
9273 
9274          pCurrSCCB->Sccb_SGoffset = 0x00;
9275 
9276 
9277          if ((ULONG)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >=
9278             pCurrSCCB->DataLength) {
9279 
9280             pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
9281 
9282             pCurrSCCB->Sccb_sgseg = (USHORT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE);
9283 
9284             }
9285          }
9286 
9287       else {
9288 
9289          if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE))
9290 
9291             pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
9292          }
9293       }
9294 
9295    WR_HARPOON(port+hp_int_mask,(INT_CMD_COMPL | SCSI_INTERRUPT));
9296 }
9297 
9298 
9299 
9300 /*---------------------------------------------------------------------
9301  *
9302  * Function: Host Data Transfer Restart
9303  *
9304  * Description: Reset the available count due to a restore data
9305  *              pointers message.
9306  *
9307  *---------------------------------------------------------------------*/
hostDataXferRestart(PSCCB currSCCB)9308 void hostDataXferRestart(PSCCB currSCCB)
9309 {
9310    ULONG data_count;
9311    UINT  sg_index;
9312 #if defined(COMPILER_16_BIT) && !defined(DOS)
9313    ULONG far *sg_ptr;
9314 #else
9315    ULONG *sg_ptr;
9316 #endif
9317 
9318    if (currSCCB->Sccb_XferState & F_SG_XFER) {
9319 
9320       currSCCB->Sccb_XferCnt = 0;
9321 
9322       sg_index = 0xffff;         /*Index by long words into sg list. */
9323       data_count = 0;            /*Running count of SG xfer counts. */
9324 
9325 #if defined(COMPILER_16_BIT) && !defined(DOS)
9326       sg_ptr = (ULONG far *)currSCCB->DataPointer;
9327 #else
9328       sg_ptr = (ULONG *)currSCCB->DataPointer;
9329 #endif
9330 
9331       while (data_count < currSCCB->Sccb_ATC) {
9332 
9333          sg_index++;
9334          data_count += *(sg_ptr+(sg_index * 2));
9335          }
9336 
9337       if (data_count == currSCCB->Sccb_ATC) {
9338 
9339          currSCCB->Sccb_SGoffset = 0;
9340          sg_index++;
9341          }
9342 
9343       else {
9344          currSCCB->Sccb_SGoffset = data_count - currSCCB->Sccb_ATC;
9345          }
9346 
9347       currSCCB->Sccb_sgseg = (USHORT)sg_index;
9348       }
9349 
9350    else {
9351       currSCCB->Sccb_XferCnt = currSCCB->DataLength - currSCCB->Sccb_ATC;
9352       }
9353 }
9354 #ident "$Id: scam.c 1.17 1997/03/20 23:49:37 mohan Exp $"
9355 /*----------------------------------------------------------------------
9356  *
9357  *
9358  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
9359  *
9360  *   This file is available under both the GNU General Public License
9361  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
9362  *
9363  *   $Workfile:   scam.c  $
9364  *
9365  *   Description:  Functions relating to handling of the SCAM selection
9366  *                 and the determination of the SCSI IDs to be assigned
9367  *                 to all perspective SCSI targets.
9368  *
9369  *   $Date: 1997/03/20 23:49:37 $
9370  *
9371  *   $Revision: 1.17 $
9372  *
9373  *----------------------------------------------------------------------*/
9374 
9375 /*#include <globals.h>*/
9376 
9377 #if (FW_TYPE==_UCB_MGR_)
9378 	/*#include <budi.h>*/
9379 #endif
9380 
9381 /*#include <sccbmgr.h>*/
9382 /*#include <blx30.h>*/
9383 /*#include <target.h>*/
9384 /*#include <scsi2.h>*/
9385 /*#include <eeprom.h>*/
9386 /*#include <harpoon.h>*/
9387 
9388 
9389 
9390 /*
9391 extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
9392 extern SCCBCARD BL_Card[MAX_CARDS];
9393 extern SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR];
9394 extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
9395 #if defined(DOS) || defined(OS2)
9396 extern UCHAR temp_id_string[ID_STRING_LENGTH];
9397 #endif
9398 extern UCHAR scamHAString[];
9399 */
9400 /*---------------------------------------------------------------------
9401  *
9402  * Function: scini
9403  *
9404  * Description: Setup all data structures necessary for SCAM selection.
9405  *
9406  *---------------------------------------------------------------------*/
9407 
scini(UCHAR p_card,UCHAR p_our_id,UCHAR p_power_up)9408 void scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
9409 {
9410 
9411 #if defined(SCAM_LEV_2)
9412    UCHAR loser,assigned_id;
9413 #endif
9414 #if defined(DOS)
9415 
9416    USHORT p_port;
9417 #else
9418    ULONG p_port;
9419 #endif
9420 
9421    UCHAR i,k,ScamFlg ;
9422    PSCCBcard currCard;
9423 	PNVRamInfo pCurrNvRam;
9424 
9425    currCard = &BL_Card[p_card];
9426    p_port = currCard->ioPort;
9427 	pCurrNvRam = currCard->pNvRamInfo;
9428 
9429 
9430 	if(pCurrNvRam){
9431 		ScamFlg = pCurrNvRam->niScamConf;
9432 		i = pCurrNvRam->niSysConf;
9433 	}
9434 	else{
9435 	   ScamFlg = (UCHAR) utilEERead(p_port, SCAM_CONFIG/2);
9436 	   i = (UCHAR)(utilEERead(p_port, (SYSTEM_CONFIG/2)));
9437 	}
9438 	if(!(i & 0x02))	/* check if reset bus in AutoSCSI parameter set */
9439 		return;
9440 
9441    inisci(p_card,p_port, p_our_id);
9442 
9443    /* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW
9444       too slow to return to SCAM selection */
9445 
9446    /* if (p_power_up)
9447          Wait1Second(p_port);
9448       else
9449          Wait(p_port, TO_250ms); */
9450 
9451    Wait1Second(p_port);
9452 
9453 #if defined(SCAM_LEV_2)
9454 
9455    if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
9456       {
9457       while (!(scarb(p_port,INIT_SELTD))) {}
9458 
9459       scsel(p_port);
9460 
9461       do {
9462          scxferc(p_port,SYNC_PTRN);
9463          scxferc(p_port,DOM_MSTR);
9464          loser = scsendi(p_port,&scamInfo[p_our_id].id_string[0]);
9465          } while ( loser == 0xFF );
9466 
9467       scbusf(p_port);
9468 
9469       if ((p_power_up) && (!loser))
9470          {
9471          sresb(p_port,p_card);
9472          Wait(p_port, TO_250ms);
9473 
9474          while (!(scarb(p_port,INIT_SELTD))) {}
9475 
9476          scsel(p_port);
9477 
9478          do {
9479             scxferc(p_port, SYNC_PTRN);
9480             scxferc(p_port, DOM_MSTR);
9481             loser = scsendi(p_port,&scamInfo[p_our_id].
9482                id_string[0]);
9483             } while ( loser == 0xFF );
9484 
9485          scbusf(p_port);
9486          }
9487       }
9488 
9489    else
9490       {
9491       loser = FALSE;
9492       }
9493 
9494 
9495    if (!loser)
9496       {
9497 
9498 #endif  /* SCAM_LEV_2 */
9499 
9500       scamInfo[p_our_id].state = ID_ASSIGNED;
9501 
9502 
9503 		if (ScamFlg & SCAM_ENABLED)
9504 		{
9505 
9506 	      for (i=0; i < MAX_SCSI_TAR; i++)
9507   		   {
9508       	   if ((scamInfo[i].state == ID_UNASSIGNED) ||
9509   	      	   (scamInfo[i].state == ID_UNUSED))
9510 	  	      {
9511    	     	   if (scsell(p_port,i))
9512       	  	   {
9513             	   scamInfo[i].state = LEGACY;
9514   	            	if ((scamInfo[i].id_string[0] != 0xFF) ||
9515      	            	(scamInfo[i].id_string[1] != 0xFA))
9516 	     	         {
9517 
9518    	        	      scamInfo[i].id_string[0] = 0xFF;
9519       	        	   scamInfo[i].id_string[1] = 0xFA;
9520 							if(pCurrNvRam == NULL)
9521 	         	         currCard->globalFlags |= F_UPDATE_EEPROM;
9522                	}
9523 	  	         }
9524    	  	   }
9525       	}
9526 
9527 	      sresb(p_port,p_card);
9528       	Wait1Second(p_port);
9529          while (!(scarb(p_port,INIT_SELTD))) {}
9530          scsel(p_port);
9531          scasid(p_card, p_port);
9532          }
9533 
9534 #if defined(SCAM_LEV_2)
9535 
9536       }
9537 
9538    else if ((loser) && (ScamFlg & SCAM_ENABLED))
9539       {
9540       scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
9541       assigned_id = FALSE;
9542       scwtsel(p_port);
9543 
9544       do {
9545          while (scxferc(p_port,0x00) != SYNC_PTRN) {}
9546 
9547          i = scxferc(p_port,0x00);
9548          if (i == ASSIGN_ID)
9549             {
9550             if (!(scsendi(p_port,&scamInfo[p_our_id].id_string[0])))
9551                   {
9552                   i = scxferc(p_port,0x00);
9553                   if (scvalq(i))
9554                      {
9555                      k = scxferc(p_port,0x00);
9556 
9557                      if (scvalq(k))
9558                         {
9559                         currCard->ourId =
9560                            ((UCHAR)(i<<3)+(k & (UCHAR)7)) & (UCHAR) 0x3F;
9561                         inisci(p_card, p_port, p_our_id);
9562                         scamInfo[currCard->ourId].state = ID_ASSIGNED;
9563                         scamInfo[currCard->ourId].id_string[0]
9564                            = SLV_TYPE_CODE0;
9565                         assigned_id = TRUE;
9566                         }
9567                      }
9568                   }
9569             }
9570 
9571          else if (i == SET_P_FLAG)
9572             {
9573                if (!(scsendi(p_port,
9574                         &scamInfo[p_our_id].id_string[0])))
9575                         scamInfo[p_our_id].id_string[0] |= 0x80;
9576             }
9577          }while (!assigned_id);
9578 
9579       while (scxferc(p_port,0x00) != CFG_CMPLT) {}
9580       }
9581 
9582 #endif   /* SCAM_LEV_2 */
9583    if (ScamFlg & SCAM_ENABLED)
9584       {
9585       scbusf(p_port);
9586       if (currCard->globalFlags & F_UPDATE_EEPROM)
9587          {
9588          scsavdi(p_card, p_port);
9589          currCard->globalFlags &= ~F_UPDATE_EEPROM;
9590          }
9591       }
9592 
9593 
9594 #if defined(DOS)
9595    for (i=0; i < MAX_SCSI_TAR; i++)
9596    {
9597      	if (((ScamFlg & SCAM_ENABLED) && (scamInfo[i].state == LEGACY))
9598 			|| (i != p_our_id))
9599         	{
9600          scsellDOS(p_port,i);
9601   	      }
9602   	}
9603 #endif
9604 
9605 /*
9606    for (i=0,k=0; i < MAX_SCSI_TAR; i++)
9607       {
9608       if ((scamInfo[i].state == ID_ASSIGNED) ||
9609          (scamInfo[i].state == LEGACY))
9610          k++;
9611       }
9612 
9613    if (k==2)
9614       currCard->globalFlags |= F_SINGLE_DEVICE;
9615    else
9616       currCard->globalFlags &= ~F_SINGLE_DEVICE;
9617 */
9618 }
9619 
9620 
9621 /*---------------------------------------------------------------------
9622  *
9623  * Function: scarb
9624  *
9625  * Description: Gain control of the bus and wait SCAM select time (250ms)
9626  *
9627  *---------------------------------------------------------------------*/
9628 
9629 #if defined(DOS)
scarb(USHORT p_port,UCHAR p_sel_type)9630 int scarb(USHORT p_port, UCHAR p_sel_type)
9631 #else
9632 int scarb(ULONG p_port, UCHAR p_sel_type)
9633 #endif
9634 {
9635    if (p_sel_type == INIT_SELTD)
9636       {
9637 
9638       while (RD_HARPOON(p_port+hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {}
9639 
9640 
9641       if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL)
9642          return(FALSE);
9643 
9644       if (RD_HARPOON(p_port+hp_scsidata_0) != 00)
9645          return(FALSE);
9646 
9647       WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_BSY));
9648 
9649       if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL) {
9650 
9651          WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
9652             ~SCSI_BSY));
9653          return(FALSE);
9654          }
9655 
9656 
9657       WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_SEL));
9658 
9659       if (RD_HARPOON(p_port+hp_scsidata_0) != 00) {
9660 
9661          WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
9662             ~(SCSI_BSY | SCSI_SEL)));
9663          return(FALSE);
9664          }
9665       }
9666 
9667 
9668    WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0)
9669       & ~ACTdeassert));
9670    WR_HARPOON(p_port+hp_scsireset, SCAM_EN);
9671    WR_HARPOON(p_port+hp_scsidata_0, 0x00);
9672 #if defined(WIDE_SCSI)
9673    WR_HARPOON(p_port+hp_scsidata_1, 0x00);
9674 #endif
9675    WR_HARPOON(p_port+hp_portctrl_0, SCSI_BUS_EN);
9676 
9677    WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_MSG));
9678 
9679    WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig)
9680       & ~SCSI_BSY));
9681 
9682    Wait(p_port,TO_250ms);
9683 
9684    return(TRUE);
9685 }
9686 
9687 
9688 /*---------------------------------------------------------------------
9689  *
9690  * Function: scbusf
9691  *
9692  * Description: Release the SCSI bus and disable SCAM selection.
9693  *
9694  *---------------------------------------------------------------------*/
9695 
9696 #if defined(DOS)
scbusf(USHORT p_port)9697 void scbusf(USHORT p_port)
9698 #else
9699 void scbusf(ULONG p_port)
9700 #endif
9701 {
9702    WR_HARPOON(p_port+hp_page_ctrl,
9703       (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
9704 
9705 
9706    WR_HARPOON(p_port+hp_scsidata_0, 0x00);
9707 
9708    WR_HARPOON(p_port+hp_portctrl_0, (RD_HARPOON(p_port+hp_portctrl_0)
9709       & ~SCSI_BUS_EN));
9710 
9711    WR_HARPOON(p_port+hp_scsisig, 0x00);
9712 
9713 
9714    WR_HARPOON(p_port+hp_scsireset,  (RD_HARPOON(p_port+hp_scsireset)
9715       & ~SCAM_EN));
9716 
9717    WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0)
9718       | ACTdeassert));
9719 
9720 #if defined(SCAM_LEV_2)
9721    WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
9722 #else
9723    WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT));
9724 #endif
9725 
9726    WR_HARPOON(p_port+hp_page_ctrl,
9727       (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
9728 }
9729 
9730 
9731 
9732 /*---------------------------------------------------------------------
9733  *
9734  * Function: scasid
9735  *
9736  * Description: Assign an ID to all the SCAM devices.
9737  *
9738  *---------------------------------------------------------------------*/
9739 
9740 #if defined(DOS)
scasid(UCHAR p_card,USHORT p_port)9741 void scasid(UCHAR p_card, USHORT p_port)
9742 #else
9743 void scasid(UCHAR p_card, ULONG p_port)
9744 #endif
9745 {
9746 #if defined(DOS) || defined(OS2)
9747    /* Use external defined in global space area, instead of Stack
9748       space. WIN/95 DOS doesnot work TINY mode. The OS doesnot intialize
9749       SS equal to DS. Thus the array allocated on stack doesnot get
9750       access correctly */
9751 #else
9752    UCHAR temp_id_string[ID_STRING_LENGTH];
9753 #endif
9754 
9755    UCHAR i,k,scam_id;
9756 	UCHAR crcBytes[3];
9757 	PNVRamInfo pCurrNvRam;
9758 	ushort_ptr pCrcBytes;
9759 
9760 	pCurrNvRam = BL_Card[p_card].pNvRamInfo;
9761 
9762    i=FALSE;
9763 
9764    while (!i)
9765       {
9766 
9767       for (k=0; k < ID_STRING_LENGTH; k++)
9768          {
9769          temp_id_string[k] = (UCHAR) 0x00;
9770          }
9771 
9772       scxferc(p_port,SYNC_PTRN);
9773       scxferc(p_port,ASSIGN_ID);
9774 
9775       if (!(sciso(p_port,&temp_id_string[0])))
9776          {
9777 			if(pCurrNvRam){
9778 				pCrcBytes = (ushort_ptr)&crcBytes[0];
9779 				*pCrcBytes = CalcCrc16(&temp_id_string[0]);
9780 				crcBytes[2] = CalcLrc(&temp_id_string[0]);
9781 				temp_id_string[1] = crcBytes[2];
9782 				temp_id_string[2] = crcBytes[0];
9783 				temp_id_string[3] = crcBytes[1];
9784 				for(k = 4; k < ID_STRING_LENGTH; k++)
9785 					temp_id_string[k] = (UCHAR) 0x00;
9786 			}
9787          i = scmachid(p_card,temp_id_string);
9788 
9789          if (i == CLR_PRIORITY)
9790             {
9791             scxferc(p_port,MISC_CODE);
9792             scxferc(p_port,CLR_P_FLAG);
9793             i = FALSE;  /*Not the last ID yet. */
9794             }
9795 
9796          else if (i != NO_ID_AVAIL)
9797             {
9798             if (i < 8 )
9799                scxferc(p_port,ID_0_7);
9800             else
9801                scxferc(p_port,ID_8_F);
9802 
9803             scam_id = (i & (UCHAR) 0x07);
9804 
9805 
9806             for (k=1; k < 0x08; k <<= 1)
9807                if (!( k & i ))
9808                   scam_id += 0x08;        /*Count number of zeros in DB0-3. */
9809 
9810             scxferc(p_port,scam_id);
9811 
9812             i = FALSE;  /*Not the last ID yet. */
9813             }
9814          }
9815 
9816       else
9817          {
9818          i = TRUE;
9819          }
9820 
9821       }  /*End while */
9822 
9823    scxferc(p_port,SYNC_PTRN);
9824    scxferc(p_port,CFG_CMPLT);
9825 }
9826 
9827 
9828 
9829 
9830 
9831 /*---------------------------------------------------------------------
9832  *
9833  * Function: scsel
9834  *
9835  * Description: Select all the SCAM devices.
9836  *
9837  *---------------------------------------------------------------------*/
9838 
9839 #if defined(DOS)
scsel(USHORT p_port)9840 void scsel(USHORT p_port)
9841 #else
9842 void scsel(ULONG p_port)
9843 #endif
9844 {
9845 
9846    WR_HARPOON(p_port+hp_scsisig, SCSI_SEL);
9847    scwiros(p_port, SCSI_MSG);
9848 
9849    WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY));
9850 
9851 
9852    WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
9853    WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) |
9854       (UCHAR)(BIT(7)+BIT(6))));
9855 
9856 
9857    WR_HARPOON(p_port+hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD));
9858    scwiros(p_port, SCSI_SEL);
9859 
9860    WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) &
9861       ~(UCHAR)BIT(6)));
9862    scwirod(p_port, BIT(6));
9863 
9864    WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
9865 }
9866 
9867 
9868 
9869 /*---------------------------------------------------------------------
9870  *
9871  * Function: scxferc
9872  *
9873  * Description: Handshake the p_data (DB4-0) across the bus.
9874  *
9875  *---------------------------------------------------------------------*/
9876 
9877 #if defined(DOS)
scxferc(USHORT p_port,UCHAR p_data)9878 UCHAR scxferc(USHORT p_port, UCHAR p_data)
9879 #else
9880 UCHAR scxferc(ULONG p_port, UCHAR p_data)
9881 #endif
9882 {
9883    UCHAR curr_data, ret_data;
9884 
9885    curr_data = p_data | BIT(7) | BIT(5);   /*Start with DB7 & DB5 asserted. */
9886 
9887    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9888 
9889    curr_data &= ~BIT(7);
9890 
9891    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9892 
9893    scwirod(p_port,BIT(7));              /*Wait for DB7 to be released. */
9894 	while (!(RD_HARPOON(p_port+hp_scsidata_0) & BIT(5)));
9895 
9896    ret_data = (RD_HARPOON(p_port+hp_scsidata_0) & (UCHAR) 0x1F);
9897 
9898    curr_data |= BIT(6);
9899 
9900    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9901 
9902    curr_data &= ~BIT(5);
9903 
9904    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9905 
9906    scwirod(p_port,BIT(5));              /*Wait for DB5 to be released. */
9907 
9908    curr_data &= ~(BIT(4)|BIT(3)|BIT(2)|BIT(1)|BIT(0)); /*Release data bits */
9909    curr_data |= BIT(7);
9910 
9911    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9912 
9913    curr_data &= ~BIT(6);
9914 
9915    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
9916 
9917    scwirod(p_port,BIT(6));              /*Wait for DB6 to be released. */
9918 
9919    return(ret_data);
9920 }
9921 
9922 
9923 /*---------------------------------------------------------------------
9924  *
9925  * Function: scsendi
9926  *
9927  * Description: Transfer our Identification string to determine if we
9928  *              will be the dominant master.
9929  *
9930  *---------------------------------------------------------------------*/
9931 
9932 #if defined(DOS)
scsendi(USHORT p_port,UCHAR p_id_string[])9933 UCHAR scsendi(USHORT p_port, UCHAR p_id_string[])
9934 #else
9935 UCHAR scsendi(ULONG p_port, UCHAR p_id_string[])
9936 #endif
9937 {
9938    UCHAR ret_data,byte_cnt,bit_cnt,defer;
9939 
9940    defer = FALSE;
9941 
9942    for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
9943 
9944       for (bit_cnt = 0x80; bit_cnt != 0 ; bit_cnt >>= 1) {
9945 
9946          if (defer)
9947             ret_data = scxferc(p_port,00);
9948 
9949          else if (p_id_string[byte_cnt] & bit_cnt)
9950 
9951                ret_data = scxferc(p_port,02);
9952 
9953             else {
9954 
9955                ret_data = scxferc(p_port,01);
9956                if (ret_data & 02)
9957                   defer = TRUE;
9958                }
9959 
9960          if ((ret_data & 0x1C) == 0x10)
9961             return(0x00);  /*End of isolation stage, we won! */
9962 
9963          if (ret_data & 0x1C)
9964             return(0xFF);
9965 
9966          if ((defer) && (!(ret_data & 0x1F)))
9967             return(0x01);  /*End of isolation stage, we lost. */
9968 
9969          } /*bit loop */
9970 
9971       } /*byte loop */
9972 
9973    if (defer)
9974       return(0x01);  /*We lost */
9975    else
9976       return(0);  /*We WON! Yeeessss! */
9977 }
9978 
9979 
9980 
9981 /*---------------------------------------------------------------------
9982  *
9983  * Function: sciso
9984  *
9985  * Description: Transfer the Identification string.
9986  *
9987  *---------------------------------------------------------------------*/
9988 
9989 #if defined(DOS)
sciso(USHORT p_port,UCHAR p_id_string[])9990 UCHAR sciso(USHORT p_port, UCHAR p_id_string[])
9991 #else
9992 UCHAR sciso(ULONG p_port, UCHAR p_id_string[])
9993 #endif
9994 {
9995    UCHAR ret_data,the_data,byte_cnt,bit_cnt;
9996 
9997    the_data = 0;
9998 
9999    for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
10000 
10001       for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
10002 
10003          ret_data = scxferc(p_port,0);
10004 
10005          if (ret_data & 0xFC)
10006             return(0xFF);
10007 
10008          else {
10009 
10010             the_data <<= 1;
10011             if (ret_data & BIT(1)) {
10012                the_data |= 1;
10013                }
10014             }
10015 
10016          if ((ret_data & 0x1F) == 0)
10017 	   {
10018 /*
10019 				if(bit_cnt != 0 || bit_cnt != 8)
10020 				{
10021 					byte_cnt = 0;
10022 					bit_cnt = 0;
10023 					scxferc(p_port, SYNC_PTRN);
10024 					scxferc(p_port, ASSIGN_ID);
10025 					continue;
10026 				}
10027 */
10028             if (byte_cnt)
10029                return(0x00);
10030             else
10031                return(0xFF);
10032 	   }
10033 
10034          } /*bit loop */
10035 
10036       p_id_string[byte_cnt] = the_data;
10037 
10038       } /*byte loop */
10039 
10040    return(0);
10041 }
10042 
10043 
10044 
10045 /*---------------------------------------------------------------------
10046  *
10047  * Function: scwirod
10048  *
10049  * Description: Sample the SCSI data bus making sure the signal has been
10050  *              deasserted for the correct number of consecutive samples.
10051  *
10052  *---------------------------------------------------------------------*/
10053 
10054 #if defined(DOS)
scwirod(USHORT p_port,UCHAR p_data_bit)10055 void scwirod(USHORT p_port, UCHAR p_data_bit)
10056 #else
10057 void scwirod(ULONG p_port, UCHAR p_data_bit)
10058 #endif
10059 {
10060    UCHAR i;
10061 
10062    i = 0;
10063    while ( i < MAX_SCSI_TAR ) {
10064 
10065       if (RD_HARPOON(p_port+hp_scsidata_0) & p_data_bit)
10066 
10067          i = 0;
10068 
10069       else
10070 
10071          i++;
10072 
10073       }
10074 }
10075 
10076 
10077 
10078 /*---------------------------------------------------------------------
10079  *
10080  * Function: scwiros
10081  *
10082  * Description: Sample the SCSI Signal lines making sure the signal has been
10083  *              deasserted for the correct number of consecutive samples.
10084  *
10085  *---------------------------------------------------------------------*/
10086 
10087 #if defined(DOS)
scwiros(USHORT p_port,UCHAR p_data_bit)10088 void scwiros(USHORT p_port, UCHAR p_data_bit)
10089 #else
10090 void scwiros(ULONG p_port, UCHAR p_data_bit)
10091 #endif
10092 {
10093    UCHAR i;
10094 
10095    i = 0;
10096    while ( i < MAX_SCSI_TAR ) {
10097 
10098       if (RD_HARPOON(p_port+hp_scsisig) & p_data_bit)
10099 
10100          i = 0;
10101 
10102       else
10103 
10104          i++;
10105 
10106       }
10107 }
10108 
10109 
10110 /*---------------------------------------------------------------------
10111  *
10112  * Function: scvalq
10113  *
10114  * Description: Make sure we received a valid data byte.
10115  *
10116  *---------------------------------------------------------------------*/
10117 
scvalq(UCHAR p_quintet)10118 UCHAR scvalq(UCHAR p_quintet)
10119 {
10120    UCHAR count;
10121 
10122    for (count=1; count < 0x08; count<<=1) {
10123       if (!(p_quintet & count))
10124          p_quintet -= 0x80;
10125       }
10126 
10127    if (p_quintet & 0x18)
10128       return(FALSE);
10129 
10130    else
10131       return(TRUE);
10132 }
10133 
10134 
10135 /*---------------------------------------------------------------------
10136  *
10137  * Function: scsell
10138  *
10139  * Description: Select the specified device ID using a selection timeout
10140  *              less than 4ms.  If somebody responds then it is a legacy
10141  *              drive and this ID must be marked as such.
10142  *
10143  *---------------------------------------------------------------------*/
10144 
10145 #if defined(DOS)
scsell(USHORT p_port,UCHAR targ_id)10146 UCHAR scsell(USHORT p_port, UCHAR targ_id)
10147 #else
10148 UCHAR scsell(ULONG p_port, UCHAR targ_id)
10149 #endif
10150 {
10151 #if defined(DOS)
10152    USHORT i;
10153 #else
10154    ULONG i;
10155 #endif
10156 
10157    WR_HARPOON(p_port+hp_page_ctrl,
10158       (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
10159 
10160    ARAM_ACCESS(p_port);
10161 
10162    WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER));
10163    WR_HARPOON(p_port+hp_seltimeout,TO_4ms);
10164 
10165 
10166    for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) {
10167       WRW_HARPOON(i, (MPM_OP+ACOMMAND));
10168       }
10169    WRW_HARPOON(i, (BRH_OP+ALWAYS+    NP));
10170 
10171    WRW_HARPOON((p_port+hp_intstat),
10172 	       (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
10173 
10174    WR_HARPOON(p_port+hp_select_id, targ_id);
10175 
10176    WR_HARPOON(p_port+hp_portctrl_0, SCSI_PORT);
10177    WR_HARPOON(p_port+hp_autostart_3, (SELECT | CMD_ONLY_STRT));
10178    WR_HARPOON(p_port+hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
10179 
10180 
10181    while (!(RDW_HARPOON((p_port+hp_intstat)) &
10182 	    (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {}
10183 
10184    if (RDW_HARPOON((p_port+hp_intstat)) & RESET)
10185          Wait(p_port, TO_250ms);
10186 
10187    DISABLE_AUTO(p_port);
10188 
10189    WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) & ~SCAM_TIMER));
10190    WR_HARPOON(p_port+hp_seltimeout,TO_290ms);
10191 
10192    SGRAM_ACCESS(p_port);
10193 
10194    if (RDW_HARPOON((p_port+hp_intstat)) & (RESET | TIMEOUT) ) {
10195 
10196       WRW_HARPOON((p_port+hp_intstat),
10197 		  (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
10198 
10199       WR_HARPOON(p_port+hp_page_ctrl,
10200          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
10201 
10202       return(FALSE);  /*No legacy device */
10203       }
10204 
10205    else {
10206 
10207       while(!(RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)) {
10208 				if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
10209 					{
10210 					WR_HARPOON(p_port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
10211       			ACCEPT_MSG(p_port);
10212 					}
10213 		}
10214 
10215       WRW_HARPOON((p_port+hp_intstat), CLR_ALL_INT_1);
10216 
10217       WR_HARPOON(p_port+hp_page_ctrl,
10218          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
10219 
10220       return(TRUE);  /*Found one of them oldies! */
10221       }
10222 }
10223 
10224 #if defined(DOS)
10225 /*---------------------------------------------------------------------
10226  *
10227  * Function: scsell for DOS
10228  *
10229  * Description: Select the specified device ID using a selection timeout
10230  *              less than 2ms.  This was specially required to solve
10231  *              the problem with Plextor 12X CD-ROM drive. This drive
10232  *					 was responding the Selection at the end of 4ms and
10233  *					 hanging the system.
10234  *
10235  *---------------------------------------------------------------------*/
10236 
scsellDOS(USHORT p_port,UCHAR targ_id)10237 UCHAR scsellDOS(USHORT p_port, UCHAR targ_id)
10238 {
10239    USHORT i;
10240 
10241    WR_HARPOON(p_port+hp_page_ctrl,
10242       (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
10243 
10244    ARAM_ACCESS(p_port);
10245 
10246    WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER));
10247    WR_HARPOON(p_port+hp_seltimeout,TO_2ms);
10248 
10249 
10250    for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) {
10251       WRW_HARPOON(i, (MPM_OP+ACOMMAND));
10252       }
10253    WRW_HARPOON(i, (BRH_OP+ALWAYS+    NP));
10254 
10255    WRW_HARPOON((p_port+hp_intstat),
10256 	       (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
10257 
10258    WR_HARPOON(p_port+hp_select_id, targ_id);
10259 
10260    WR_HARPOON(p_port+hp_portctrl_0, SCSI_PORT);
10261    WR_HARPOON(p_port+hp_autostart_3, (SELECT | CMD_ONLY_STRT));
10262    WR_HARPOON(p_port+hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
10263 
10264 
10265    while (!(RDW_HARPOON((p_port+hp_intstat)) &
10266 	    (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {}
10267 
10268    if (RDW_HARPOON((p_port+hp_intstat)) & RESET)
10269          Wait(p_port, TO_250ms);
10270 
10271    DISABLE_AUTO(p_port);
10272 
10273    WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) & ~SCAM_TIMER));
10274    WR_HARPOON(p_port+hp_seltimeout,TO_290ms);
10275 
10276    SGRAM_ACCESS(p_port);
10277 
10278    if (RDW_HARPOON((p_port+hp_intstat)) & (RESET | TIMEOUT) ) {
10279 
10280       WRW_HARPOON((p_port+hp_intstat),
10281 		  (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
10282 
10283       WR_HARPOON(p_port+hp_page_ctrl,
10284          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
10285 
10286       return(FALSE);  /*No legacy device */
10287       }
10288 
10289    else {
10290 
10291       while(!(RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)) {
10292 				if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
10293 					{
10294 					WR_HARPOON(p_port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
10295       			ACCEPT_MSG(p_port);
10296 					}
10297 		}
10298 
10299       WRW_HARPOON((p_port+hp_intstat), CLR_ALL_INT_1);
10300 
10301       WR_HARPOON(p_port+hp_page_ctrl,
10302          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
10303 
10304       return(TRUE);  /*Found one of them oldies! */
10305       }
10306 }
10307 #endif  /* DOS */
10308 
10309 /*---------------------------------------------------------------------
10310  *
10311  * Function: scwtsel
10312  *
10313  * Description: Wait to be selected by another SCAM initiator.
10314  *
10315  *---------------------------------------------------------------------*/
10316 
10317 #if defined(DOS)
scwtsel(USHORT p_port)10318 void scwtsel(USHORT p_port)
10319 #else
10320 void scwtsel(ULONG p_port)
10321 #endif
10322 {
10323    while(!(RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL)) {}
10324 }
10325 
10326 
10327 /*---------------------------------------------------------------------
10328  *
10329  * Function: inisci
10330  *
10331  * Description: Setup the data Structure with the info from the EEPROM.
10332  *
10333  *---------------------------------------------------------------------*/
10334 
10335 #if defined(DOS)
inisci(UCHAR p_card,USHORT p_port,UCHAR p_our_id)10336 void inisci(UCHAR p_card, USHORT p_port, UCHAR p_our_id)
10337 #else
10338 void inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id)
10339 #endif
10340 {
10341    UCHAR i,k,max_id;
10342    USHORT ee_data;
10343 	PNVRamInfo pCurrNvRam;
10344 
10345 	pCurrNvRam = BL_Card[p_card].pNvRamInfo;
10346 
10347    if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
10348       max_id = 0x08;
10349 
10350    else
10351       max_id = 0x10;
10352 
10353 	if(pCurrNvRam){
10354 		for(i = 0; i < max_id; i++){
10355 
10356 			for(k = 0; k < 4; k++)
10357 				scamInfo[i].id_string[k] = pCurrNvRam->niScamTbl[i][k];
10358 			for(k = 4; k < ID_STRING_LENGTH; k++)
10359 				scamInfo[i].id_string[k] = (UCHAR) 0x00;
10360 
10361 	      if(scamInfo[i].id_string[0] == 0x00)
10362       	   scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
10363 	      else
10364    	      scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
10365 
10366 		}
10367 	}else {
10368 	   for (i=0; i < max_id; i++)
10369    	   {
10370       	for (k=0; k < ID_STRING_LENGTH; k+=2)
10371 	         {
10372    	      ee_data = utilEERead(p_port, (USHORT)((EE_SCAMBASE/2) +
10373       	     (USHORT) (i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
10374          	scamInfo[i].id_string[k] = (UCHAR) ee_data;
10375 	         ee_data >>= 8;
10376    	      scamInfo[i].id_string[k+1] = (UCHAR) ee_data;
10377       	   }
10378 
10379 	      if ((scamInfo[i].id_string[0] == 0x00) ||
10380    	       (scamInfo[i].id_string[0] == 0xFF))
10381 
10382       	   scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
10383 
10384 	      else
10385    	      scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
10386 
10387       	}
10388 	}
10389 	for(k = 0; k < ID_STRING_LENGTH; k++)
10390 		scamInfo[p_our_id].id_string[k] = scamHAString[k];
10391 
10392 }
10393 
10394 /*---------------------------------------------------------------------
10395  *
10396  * Function: scmachid
10397  *
10398  * Description: Match the Device ID string with our values stored in
10399  *              the EEPROM.
10400  *
10401  *---------------------------------------------------------------------*/
10402 
scmachid(UCHAR p_card,UCHAR p_id_string[])10403 UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[])
10404 {
10405 
10406    UCHAR i,k,match;
10407 
10408 
10409    for (i=0; i < MAX_SCSI_TAR; i++) {
10410 
10411 #if !defined(SCAM_LEV_2)
10412       if (scamInfo[i].state == ID_UNASSIGNED)
10413          {
10414 #endif
10415          match = TRUE;
10416 
10417          for (k=0; k < ID_STRING_LENGTH; k++)
10418             {
10419             if (p_id_string[k] != scamInfo[i].id_string[k])
10420                match = FALSE;
10421             }
10422 
10423          if (match)
10424             {
10425             scamInfo[i].state = ID_ASSIGNED;
10426             return(i);
10427             }
10428 
10429 #if !defined(SCAM_LEV_2)
10430          }
10431 #endif
10432 
10433       }
10434 
10435 
10436 
10437    if (p_id_string[0] & BIT(5))
10438       i = 8;
10439    else
10440       i = MAX_SCSI_TAR;
10441 
10442    if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04))
10443       match = p_id_string[1] & (UCHAR) 0x1F;
10444    else
10445       match = 7;
10446 
10447    while (i > 0)
10448       {
10449       i--;
10450 
10451       if (scamInfo[match].state == ID_UNUSED)
10452          {
10453          for (k=0; k < ID_STRING_LENGTH; k++)
10454             {
10455             scamInfo[match].id_string[k] = p_id_string[k];
10456             }
10457 
10458          scamInfo[match].state = ID_ASSIGNED;
10459 
10460 			if(BL_Card[p_card].pNvRamInfo == NULL)
10461 	         BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
10462          return(match);
10463 
10464          }
10465 
10466 
10467       match--;
10468 
10469       if (match == 0xFF)
10470 	{
10471          if (p_id_string[0] & BIT(5))
10472             match = 7;
10473          else
10474             match = MAX_SCSI_TAR-1;
10475 	}
10476       }
10477 
10478 
10479 
10480    if (p_id_string[0] & BIT(7))
10481       {
10482       return(CLR_PRIORITY);
10483       }
10484 
10485 
10486    if (p_id_string[0] & BIT(5))
10487       i = 8;
10488    else
10489       i = MAX_SCSI_TAR;
10490 
10491    if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04))
10492       match = p_id_string[1] & (UCHAR) 0x1F;
10493    else
10494       match = 7;
10495 
10496    while (i > 0)
10497       {
10498 
10499       i--;
10500 
10501       if (scamInfo[match].state == ID_UNASSIGNED)
10502          {
10503          for (k=0; k < ID_STRING_LENGTH; k++)
10504             {
10505             scamInfo[match].id_string[k] = p_id_string[k];
10506             }
10507 
10508          scamInfo[match].id_string[0] |= BIT(7);
10509          scamInfo[match].state = ID_ASSIGNED;
10510 			if(BL_Card[p_card].pNvRamInfo == NULL)
10511 	         BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
10512          return(match);
10513 
10514          }
10515 
10516 
10517       match--;
10518 
10519       if (match == 0xFF)
10520 	{
10521          if (p_id_string[0] & BIT(5))
10522             match = 7;
10523          else
10524             match = MAX_SCSI_TAR-1;
10525 	}
10526       }
10527 
10528    return(NO_ID_AVAIL);
10529 }
10530 
10531 
10532 /*---------------------------------------------------------------------
10533  *
10534  * Function: scsavdi
10535  *
10536  * Description: Save off the device SCAM ID strings.
10537  *
10538  *---------------------------------------------------------------------*/
10539 
10540 #if defined(DOS)
scsavdi(UCHAR p_card,USHORT p_port)10541 void scsavdi(UCHAR p_card, USHORT p_port)
10542 #else
10543 void scsavdi(UCHAR p_card, ULONG p_port)
10544 #endif
10545 {
10546    UCHAR i,k,max_id;
10547    USHORT ee_data,sum_data;
10548 
10549 
10550    sum_data = 0x0000;
10551 
10552    for (i = 1; i < EE_SCAMBASE/2; i++)
10553       {
10554       sum_data += utilEERead(p_port, i);
10555       }
10556 
10557 
10558    utilEEWriteOnOff(p_port,1);   /* Enable write access to the EEPROM */
10559 
10560    if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
10561       max_id = 0x08;
10562 
10563    else
10564       max_id = 0x10;
10565 
10566    for (i=0; i < max_id; i++)
10567       {
10568 
10569       for (k=0; k < ID_STRING_LENGTH; k+=2)
10570          {
10571          ee_data = scamInfo[i].id_string[k+1];
10572          ee_data <<= 8;
10573          ee_data |= scamInfo[i].id_string[k];
10574          sum_data += ee_data;
10575          utilEEWrite(p_port, ee_data, (USHORT)((EE_SCAMBASE/2) +
10576             (USHORT)(i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
10577          }
10578       }
10579 
10580 
10581    utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM/2);
10582    utilEEWriteOnOff(p_port,0);   /* Turn off write access */
10583 }
10584 #ident "$Id: diagnose.c 1.10 1997/06/10 16:51:47 mohan Exp $"
10585 /*----------------------------------------------------------------------
10586  *
10587  *
10588  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
10589  *
10590  *   This file is available under both the GNU General Public License
10591  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
10592  *
10593  *   $Workfile:   diagnose.c  $
10594  *
10595  *   Description:  Diagnostic funtions for testing the integrity of
10596  *                 the HARPOON.
10597  *
10598  *   $Date: 1997/06/10 16:51:47 $
10599  *
10600  *   $Revision: 1.10 $
10601  *
10602  *----------------------------------------------------------------------*/
10603 
10604 /*#include <globals.h>*/
10605 
10606 #if (FW_TYPE==_UCB_MGR_)
10607 	/*#include <budi.h>*/
10608 #endif
10609 
10610 /*#include <sccbmgr.h>*/
10611 /*#include <blx30.h>*/
10612 /*#include <target.h>*/
10613 /*#include <eeprom.h>*/
10614 /*#include <harpoon.h>*/
10615 
10616 /*---------------------------------------------------------------------
10617  *
10618  * Function: XbowInit
10619  *
10620  * Description: Setup the Xbow for normal operation.
10621  *
10622  *---------------------------------------------------------------------*/
10623 
10624 #if defined(DOS)
XbowInit(USHORT port,UCHAR ScamFlg)10625 void XbowInit(USHORT port, UCHAR ScamFlg)
10626 #else
10627 void XbowInit(ULONG port, UCHAR ScamFlg)
10628 #endif
10629 {
10630 UCHAR i;
10631 
10632 	i = RD_HARPOON(port+hp_page_ctrl);
10633 	WR_HARPOON(port+hp_page_ctrl, (UCHAR) (i | G_INT_DISABLE));
10634 
10635    WR_HARPOON(port+hp_scsireset,0x00);
10636    WR_HARPOON(port+hp_portctrl_1,HOST_MODE8);
10637 
10638    WR_HARPOON(port+hp_scsireset,(DMA_RESET | HPSCSI_RESET | PROG_RESET | \
10639 				 FIFO_CLR));
10640 
10641    WR_HARPOON(port+hp_scsireset,SCSI_INI);
10642 
10643    WR_HARPOON(port+hp_clkctrl_0,CLKCTRL_DEFAULT);
10644 
10645    WR_HARPOON(port+hp_scsisig,0x00);         /*  Clear any signals we might */
10646    WR_HARPOON(port+hp_scsictrl_0,ENA_SCAM_SEL);
10647 
10648    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
10649 
10650 #if defined(SCAM_LEV_2)
10651    default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
10652 		    BUS_FREE | XFER_CNT_0 | AUTO_INT;
10653 
10654    if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
10655 		default_intena |= SCAM_SEL;
10656 
10657 #else
10658    default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
10659 		    BUS_FREE | XFER_CNT_0 | AUTO_INT;
10660 #endif
10661    WRW_HARPOON((port+hp_intena), default_intena);
10662 
10663    WR_HARPOON(port+hp_seltimeout,TO_290ms);
10664 
10665    /* Turn on SCSI_MODE8 for narrow cards to fix the
10666       strapping issue with the DUAL CHANNEL card */
10667    if (RD_HARPOON(port+hp_page_ctrl) & NARROW_SCSI_CARD)
10668       WR_HARPOON(port+hp_addstat,SCSI_MODE8);
10669 
10670 #if defined(NO_BIOS_OPTION)
10671 
10672    WR_HARPOON(port+hp_synctarg_0,NARROW_SCSI);
10673    WR_HARPOON(port+hp_synctarg_1,NARROW_SCSI);
10674    WR_HARPOON(port+hp_synctarg_2,NARROW_SCSI);
10675    WR_HARPOON(port+hp_synctarg_3,NARROW_SCSI);
10676    WR_HARPOON(port+hp_synctarg_4,NARROW_SCSI);
10677    WR_HARPOON(port+hp_synctarg_5,NARROW_SCSI);
10678    WR_HARPOON(port+hp_synctarg_6,NARROW_SCSI);
10679    WR_HARPOON(port+hp_synctarg_7,NARROW_SCSI);
10680    WR_HARPOON(port+hp_synctarg_8,NARROW_SCSI);
10681    WR_HARPOON(port+hp_synctarg_9,NARROW_SCSI);
10682    WR_HARPOON(port+hp_synctarg_10,NARROW_SCSI);
10683    WR_HARPOON(port+hp_synctarg_11,NARROW_SCSI);
10684    WR_HARPOON(port+hp_synctarg_12,NARROW_SCSI);
10685    WR_HARPOON(port+hp_synctarg_13,NARROW_SCSI);
10686    WR_HARPOON(port+hp_synctarg_14,NARROW_SCSI);
10687    WR_HARPOON(port+hp_synctarg_15,NARROW_SCSI);
10688 
10689 #endif
10690 	WR_HARPOON(port+hp_page_ctrl, i);
10691 
10692 }
10693 
10694 
10695 /*---------------------------------------------------------------------
10696  *
10697  * Function: BusMasterInit
10698  *
10699  * Description: Initialize the BusMaster for normal operations.
10700  *
10701  *---------------------------------------------------------------------*/
10702 
10703 #if defined(DOS)
BusMasterInit(USHORT p_port)10704 void BusMasterInit(USHORT p_port)
10705 #else
10706 void BusMasterInit(ULONG p_port)
10707 #endif
10708 {
10709 
10710 
10711    WR_HARPOON(p_port+hp_sys_ctrl, DRVR_RST);
10712    WR_HARPOON(p_port+hp_sys_ctrl, 0x00);
10713 
10714    WR_HARPOON(p_port+hp_host_blk_cnt, XFER_BLK64);
10715 
10716 
10717    WR_HARPOON(p_port+hp_bm_ctrl, (BMCTRL_DEFAULT));
10718 
10719    WR_HARPOON(p_port+hp_ee_ctrl, (SCSI_TERM_ENA_H));
10720 
10721 
10722 #if defined(NT)
10723 
10724    WR_HARPOON(p_port+hp_pci_cmd_cfg, (RD_HARPOON(p_port+hp_pci_cmd_cfg)
10725       & ~MEM_SPACE_ENA));
10726 
10727 #endif
10728 
10729    RD_HARPOON(p_port+hp_int_status);        /*Clear interrupts. */
10730    WR_HARPOON(p_port+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
10731    WR_HARPOON(p_port+hp_page_ctrl, (RD_HARPOON(p_port+hp_page_ctrl) &
10732       ~SCATTER_EN));
10733 }
10734 
10735 
10736 /*---------------------------------------------------------------------
10737  *
10738  * Function: DiagXbow
10739  *
10740  * Description: Test Xbow integrity.  Non-zero return indicates an error.
10741  *
10742  *---------------------------------------------------------------------*/
10743 
10744 #if defined(DOS)
DiagXbow(USHORT port)10745 int DiagXbow(USHORT port)
10746 #else
10747 int DiagXbow(ULONG port)
10748 #endif
10749 {
10750    unsigned char fifo_cnt,loop_cnt;
10751 
10752    unsigned char fifodata[5];
10753    fifodata[0] = 0x00;
10754    fifodata[1] = 0xFF;
10755    fifodata[2] = 0x55;
10756    fifodata[3] = 0xAA;
10757    fifodata[4] = 0x00;
10758 
10759 
10760    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
10761    WRW_HARPOON((port+hp_intena), 0x0000);
10762 
10763    WR_HARPOON(port+hp_seltimeout,TO_5ms);
10764 
10765    WR_HARPOON(port+hp_portctrl_0,START_TO);
10766 
10767 
10768    for(fifodata[4] = 0x01; fifodata[4] != (UCHAR) 0; fifodata[4] = fifodata[4] << 1) {
10769 
10770       WR_HARPOON(port+hp_selfid_0,fifodata[4]);
10771       WR_HARPOON(port+hp_selfid_1,fifodata[4]);
10772 
10773       if ((RD_HARPOON(port+hp_selfid_0) != fifodata[4]) ||
10774           (RD_HARPOON(port+hp_selfid_1) != fifodata[4]))
10775          return(1);
10776       }
10777 
10778 
10779    for(loop_cnt = 0; loop_cnt < 4; loop_cnt++) {
10780 
10781       WR_HARPOON(port+hp_portctrl_0,(HOST_PORT | HOST_WRT | START_TO));
10782 
10783 
10784       for (fifo_cnt = 0; fifo_cnt < FIFO_LEN; fifo_cnt++) {
10785 
10786          WR_HARPOON(port+hp_fifodata_0, fifodata[loop_cnt]);
10787          }
10788 
10789 
10790       if (!(RD_HARPOON(port+hp_xferstat) & FIFO_FULL))
10791          return(1);
10792 
10793 
10794       WR_HARPOON(port+hp_portctrl_0,(HOST_PORT | START_TO));
10795 
10796       for (fifo_cnt = 0; fifo_cnt < FIFO_LEN; fifo_cnt++) {
10797 
10798          if (RD_HARPOON(port+hp_fifodata_0) != fifodata[loop_cnt])
10799             return(1);
10800          }
10801 
10802 
10803       if (!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))
10804          return(1);
10805       }
10806 
10807 
10808    while(!(RDW_HARPOON((port+hp_intstat)) & TIMEOUT)) {}
10809 
10810 
10811    WR_HARPOON(port+hp_seltimeout,TO_290ms);
10812 
10813    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
10814 
10815    WRW_HARPOON((port+hp_intena), default_intena);
10816 
10817    return(0);
10818 }
10819 
10820 
10821 /*---------------------------------------------------------------------
10822  *
10823  * Function: DiagBusMaster
10824  *
10825  * Description: Test BusMaster integrity.  Non-zero return indicates an
10826  *              error.
10827  *
10828  *---------------------------------------------------------------------*/
10829 
10830 #if defined(DOS)
DiagBusMaster(USHORT port)10831 int DiagBusMaster(USHORT port)
10832 #else
10833 int DiagBusMaster(ULONG port)
10834 #endif
10835 {
10836    UCHAR testdata;
10837 
10838    for(testdata = (UCHAR) 1; testdata != (UCHAR)0; testdata = testdata << 1) {
10839 
10840       WR_HARPOON(port+hp_xfer_cnt_lo,testdata);
10841       WR_HARPOON(port+hp_xfer_cnt_mi,testdata);
10842       WR_HARPOON(port+hp_xfer_cnt_hi,testdata);
10843       WR_HARPOON(port+hp_host_addr_lo,testdata);
10844       WR_HARPOON(port+hp_host_addr_lmi,testdata);
10845       WR_HARPOON(port+hp_host_addr_hmi,testdata);
10846       WR_HARPOON(port+hp_host_addr_hi,testdata);
10847 
10848       if ((RD_HARPOON(port+hp_xfer_cnt_lo) != testdata)   ||
10849           (RD_HARPOON(port+hp_xfer_cnt_mi) != testdata)   ||
10850           (RD_HARPOON(port+hp_xfer_cnt_hi) != testdata)   ||
10851           (RD_HARPOON(port+hp_host_addr_lo) != testdata)  ||
10852           (RD_HARPOON(port+hp_host_addr_lmi) != testdata) ||
10853           (RD_HARPOON(port+hp_host_addr_hmi) != testdata) ||
10854           (RD_HARPOON(port+hp_host_addr_hi) != testdata))
10855 
10856          return(1);
10857       }
10858    RD_HARPOON(port+hp_int_status);        /*Clear interrupts. */
10859    return(0);
10860 }
10861 
10862 
10863 
10864 /*---------------------------------------------------------------------
10865  *
10866  * Function: DiagEEPROM
10867  *
10868  * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
10869  *              neccessary.
10870  *
10871  *---------------------------------------------------------------------*/
10872 
10873 #if defined(DOS)
DiagEEPROM(USHORT p_port)10874 void DiagEEPROM(USHORT p_port)
10875 #else
10876 void DiagEEPROM(ULONG p_port)
10877 #endif
10878 
10879 {
10880    USHORT index,temp,max_wd_cnt;
10881 
10882    if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
10883       max_wd_cnt = EEPROM_WD_CNT;
10884    else
10885       max_wd_cnt = EEPROM_WD_CNT * 2;
10886 
10887    temp = utilEERead(p_port, FW_SIGNATURE/2);
10888 
10889    if (temp == 0x4641) {
10890 
10891       for (index = 2; index < max_wd_cnt; index++) {
10892 
10893          temp += utilEERead(p_port, index);
10894 
10895          }
10896 
10897       if (temp == utilEERead(p_port, EEPROM_CHECK_SUM/2)) {
10898 
10899          return;          /*EEPROM is Okay so return now! */
10900          }
10901       }
10902 
10903 
10904    utilEEWriteOnOff(p_port,(UCHAR)1);
10905 
10906    for (index = 0; index < max_wd_cnt; index++) {
10907 
10908       utilEEWrite(p_port, 0x0000, index);
10909       }
10910 
10911    temp = 0;
10912 
10913    utilEEWrite(p_port, 0x4641, FW_SIGNATURE/2);
10914    temp += 0x4641;
10915    utilEEWrite(p_port, 0x3920, MODEL_NUMB_0/2);
10916    temp += 0x3920;
10917    utilEEWrite(p_port, 0x3033, MODEL_NUMB_2/2);
10918    temp += 0x3033;
10919    utilEEWrite(p_port, 0x2020, MODEL_NUMB_4/2);
10920    temp += 0x2020;
10921    utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG/2);
10922    temp += 0x70D3;
10923    utilEEWrite(p_port, 0x0010, BIOS_CONFIG/2);
10924    temp += 0x0010;
10925    utilEEWrite(p_port, 0x0003, SCAM_CONFIG/2);
10926    temp += 0x0003;
10927    utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID/2);
10928    temp += 0x0007;
10929 
10930    utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN/2);
10931    temp += 0x0000;
10932    utilEEWrite(p_port, 0x0000, SEND_START_ENA/2);
10933    temp += 0x0000;
10934    utilEEWrite(p_port, 0x0000, DEVICE_ENABLE/2);
10935    temp += 0x0000;
10936 
10937    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01/2);
10938    temp += 0x4242;
10939    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23/2);
10940    temp += 0x4242;
10941    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45/2);
10942    temp += 0x4242;
10943    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67/2);
10944    temp += 0x4242;
10945    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89/2);
10946    temp += 0x4242;
10947    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab/2);
10948    temp += 0x4242;
10949    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd/2);
10950    temp += 0x4242;
10951    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef/2);
10952    temp += 0x4242;
10953 
10954 
10955    utilEEWrite(p_port, 0x6C46, 64/2);  /*PRODUCT ID */
10956    temp += 0x6C46;
10957    utilEEWrite(p_port, 0x7361, 66/2);  /* FlashPoint LT   */
10958    temp += 0x7361;
10959    utilEEWrite(p_port, 0x5068, 68/2);
10960    temp += 0x5068;
10961    utilEEWrite(p_port, 0x696F, 70/2);
10962    temp += 0x696F;
10963    utilEEWrite(p_port, 0x746E, 72/2);
10964    temp += 0x746E;
10965    utilEEWrite(p_port, 0x4C20, 74/2);
10966    temp += 0x4C20;
10967    utilEEWrite(p_port, 0x2054, 76/2);
10968    temp += 0x2054;
10969    utilEEWrite(p_port, 0x2020, 78/2);
10970    temp += 0x2020;
10971 
10972    index = ((EE_SCAMBASE/2)+(7*16));
10973    utilEEWrite(p_port, (0x0700+TYPE_CODE0), index);
10974    temp += (0x0700+TYPE_CODE0);
10975    index++;
10976    utilEEWrite(p_port, 0x5542, index);            /*Vendor ID code */
10977    temp += 0x5542;                                /* BUSLOGIC      */
10978    index++;
10979    utilEEWrite(p_port, 0x4C53, index);
10980    temp += 0x4C53;
10981    index++;
10982    utilEEWrite(p_port, 0x474F, index);
10983    temp += 0x474F;
10984    index++;
10985    utilEEWrite(p_port, 0x4349, index);
10986    temp += 0x4349;
10987    index++;
10988    utilEEWrite(p_port, 0x5442, index);            /*Vendor unique code */
10989    temp += 0x5442;                         /* BT- 930           */
10990    index++;
10991    utilEEWrite(p_port, 0x202D, index);
10992    temp += 0x202D;
10993    index++;
10994    utilEEWrite(p_port, 0x3339, index);
10995    temp += 0x3339;
10996    index++;                                 /*Serial #          */
10997    utilEEWrite(p_port, 0x2030, index);             /* 01234567         */
10998    temp += 0x2030;
10999    index++;
11000    utilEEWrite(p_port, 0x5453, index);
11001    temp += 0x5453;
11002    index++;
11003    utilEEWrite(p_port, 0x5645, index);
11004    temp += 0x5645;
11005    index++;
11006    utilEEWrite(p_port, 0x2045, index);
11007    temp += 0x2045;
11008    index++;
11009    utilEEWrite(p_port, 0x202F, index);
11010    temp += 0x202F;
11011    index++;
11012    utilEEWrite(p_port, 0x4F4A, index);
11013    temp += 0x4F4A;
11014    index++;
11015    utilEEWrite(p_port, 0x204E, index);
11016    temp += 0x204E;
11017    index++;
11018    utilEEWrite(p_port, 0x3539, index);
11019    temp += 0x3539;
11020 
11021 
11022 
11023    utilEEWrite(p_port, temp, EEPROM_CHECK_SUM/2);
11024 
11025    utilEEWriteOnOff(p_port,(UCHAR)0);
11026 
11027 }
11028 
11029 #ident "$Id: utility.c 1.23 1997/06/10 16:55:06 mohan Exp $"
11030 /*----------------------------------------------------------------------
11031  *
11032  *
11033  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
11034  *
11035  *   This file is available under both the GNU General Public License
11036  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
11037  *
11038  *   $Workfile:   utility.c  $
11039  *
11040  *   Description:  Utility functions relating to queueing and EEPROM
11041  *                 manipulation and any other garbage functions.
11042  *
11043  *   $Date: 1997/06/10 16:55:06 $
11044  *
11045  *   $Revision: 1.23 $
11046  *
11047  *----------------------------------------------------------------------*/
11048 /*#include <globals.h>*/
11049 
11050 #if (FW_TYPE==_UCB_MGR_)
11051 	/*#include <budi.h>*/
11052 #endif
11053 
11054 /*#include <sccbmgr.h>*/
11055 /*#include <blx30.h>*/
11056 /*#include <target.h>*/
11057 /*#include <scsi2.h>*/
11058 /*#include <harpoon.h>*/
11059 
11060 
11061 /*
11062 extern SCCBCARD BL_Card[MAX_CARDS];
11063 extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
11064 extern unsigned int SccbGlobalFlags;
11065 */
11066 
11067 /*---------------------------------------------------------------------
11068  *
11069  * Function: Queue Search Select
11070  *
11071  * Description: Try to find a new command to execute.
11072  *
11073  *---------------------------------------------------------------------*/
11074 
queueSearchSelect(PSCCBcard pCurrCard,UCHAR p_card)11075 void queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
11076 {
11077    UCHAR scan_ptr, lun;
11078    PSCCBMgr_tar_info currTar_Info;
11079 	PSCCB pOldSccb;
11080 
11081    scan_ptr = pCurrCard->scanIndex;
11082 	do
11083 	{
11084 		currTar_Info = &sccbMgrTbl[p_card][scan_ptr];
11085 		if((pCurrCard->globalFlags & F_CONLUN_IO) &&
11086 			((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
11087 		{
11088 			if (currTar_Info->TarSelQ_Cnt != 0)
11089 			{
11090 
11091 				scan_ptr++;
11092 				if (scan_ptr == MAX_SCSI_TAR)
11093 					scan_ptr = 0;
11094 
11095 				for(lun=0; lun < MAX_LUN; lun++)
11096 				{
11097 					if(currTar_Info->TarLUNBusy[lun] == FALSE)
11098 					{
11099 
11100 						pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
11101 						pOldSccb = NULL;
11102 
11103 						while((pCurrCard->currentSCCB != NULL) &&
11104 								 (lun != pCurrCard->currentSCCB->Lun))
11105 						{
11106 							pOldSccb = pCurrCard->currentSCCB;
11107 							pCurrCard->currentSCCB = (PSCCB)(pCurrCard->currentSCCB)->
11108 																	Sccb_forwardlink;
11109 						}
11110 						if(pCurrCard->currentSCCB == NULL)
11111 							continue;
11112 						if(pOldSccb != NULL)
11113 						{
11114 							pOldSccb->Sccb_forwardlink = (PSCCB)(pCurrCard->currentSCCB)->
11115 																	Sccb_forwardlink;
11116 							pOldSccb->Sccb_backlink = (PSCCB)(pCurrCard->currentSCCB)->
11117 																	Sccb_backlink;
11118 							currTar_Info->TarSelQ_Cnt--;
11119 						}
11120 						else
11121 						{
11122 							currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink;
11123 
11124 							if (currTar_Info->TarSelQ_Head == NULL)
11125 							{
11126 								currTar_Info->TarSelQ_Tail = NULL;
11127 								currTar_Info->TarSelQ_Cnt = 0;
11128 							}
11129 							else
11130 							{
11131 								currTar_Info->TarSelQ_Cnt--;
11132 								currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL;
11133 							}
11134 						}
11135 					pCurrCard->scanIndex = scan_ptr;
11136 
11137 					pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
11138 
11139 					break;
11140 					}
11141 				}
11142 			}
11143 
11144 			else
11145 			{
11146 				scan_ptr++;
11147 				if (scan_ptr == MAX_SCSI_TAR) {
11148 					scan_ptr = 0;
11149 				}
11150 			}
11151 
11152 		}
11153 		else
11154 		{
11155 			if ((currTar_Info->TarSelQ_Cnt != 0) &&
11156 				(currTar_Info->TarLUNBusy[0] == FALSE))
11157 			{
11158 
11159 				pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
11160 
11161 				currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink;
11162 
11163 				if (currTar_Info->TarSelQ_Head == NULL)
11164 				{
11165 					currTar_Info->TarSelQ_Tail = NULL;
11166 					currTar_Info->TarSelQ_Cnt = 0;
11167 				}
11168 				else
11169 				{
11170 					currTar_Info->TarSelQ_Cnt--;
11171 					currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL;
11172 				}
11173 
11174 				scan_ptr++;
11175 				if (scan_ptr == MAX_SCSI_TAR)
11176 					scan_ptr = 0;
11177 
11178 				pCurrCard->scanIndex = scan_ptr;
11179 
11180 				pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
11181 
11182 				break;
11183 			}
11184 
11185 			else
11186 			{
11187 				scan_ptr++;
11188 				if (scan_ptr == MAX_SCSI_TAR)
11189 				{
11190 					scan_ptr = 0;
11191 				}
11192 			}
11193 		}
11194 	} while (scan_ptr != pCurrCard->scanIndex);
11195 }
11196 
11197 
11198 /*---------------------------------------------------------------------
11199  *
11200  * Function: Queue Select Fail
11201  *
11202  * Description: Add the current SCCB to the head of the Queue.
11203  *
11204  *---------------------------------------------------------------------*/
11205 
queueSelectFail(PSCCBcard pCurrCard,UCHAR p_card)11206 void queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card)
11207 {
11208    UCHAR thisTarg;
11209    PSCCBMgr_tar_info currTar_Info;
11210 
11211    if (pCurrCard->currentSCCB != NULL)
11212 	  {
11213 	  thisTarg = (UCHAR)(((PSCCB)(pCurrCard->currentSCCB))->TargID);
11214       currTar_Info = &sccbMgrTbl[p_card][thisTarg];
11215 
11216       pCurrCard->currentSCCB->Sccb_backlink = (PSCCB)NULL;
11217 
11218       pCurrCard->currentSCCB->Sccb_forwardlink = currTar_Info->TarSelQ_Head;
11219 
11220 	  if (currTar_Info->TarSelQ_Cnt == 0)
11221 		 {
11222 		 currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
11223 		 }
11224 
11225 	  else
11226 		 {
11227 		 currTar_Info->TarSelQ_Head->Sccb_backlink = pCurrCard->currentSCCB;
11228 		 }
11229 
11230 
11231 	  currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
11232 
11233 	  pCurrCard->currentSCCB = NULL;
11234 	  currTar_Info->TarSelQ_Cnt++;
11235 	  }
11236 }
11237 /*---------------------------------------------------------------------
11238  *
11239  * Function: Queue Command Complete
11240  *
11241  * Description: Call the callback function with the current SCCB.
11242  *
11243  *---------------------------------------------------------------------*/
11244 
queueCmdComplete(PSCCBcard pCurrCard,PSCCB p_sccb,UCHAR p_card)11245 void queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb, UCHAR p_card)
11246 {
11247 
11248 #if (FW_TYPE==_UCB_MGR_)
11249 
11250    u08bits SCSIcmd;
11251    CALL_BK_FN callback;
11252    PSCCBMgr_tar_info currTar_Info;
11253 
11254    PUCB p_ucb;
11255    p_ucb=p_sccb->Sccb_ucb_ptr;
11256 
11257    SCSIcmd = p_sccb->Cdb[0];
11258 
11259 
11260    if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED))
11261    {
11262 
11263       if ((p_ucb->UCB_opcode & OPC_CHK_UNDER_OVER_RUN)                     &&
11264          (p_sccb->HostStatus == SCCB_COMPLETE)                             &&
11265          (p_sccb->TargetStatus != SSCHECK))
11266 
11267          if ((SCSIcmd == SCSI_READ)             ||
11268              (SCSIcmd == SCSI_WRITE)            ||
11269              (SCSIcmd == SCSI_READ_EXTENDED)    ||
11270              (SCSIcmd == SCSI_WRITE_EXTENDED)   ||
11271              (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
11272              (SCSIcmd == SCSI_START_STOP_UNIT)  ||
11273              (pCurrCard->globalFlags & F_NO_FILTER)
11274             )
11275                p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
11276    }
11277 
11278    p_ucb->UCB_status=SCCB_SUCCESS;
11279 
11280    if ((p_ucb->UCB_hbastat=p_sccb->HostStatus) || (p_ucb->UCB_scsistat=p_sccb->TargetStatus))
11281    {
11282       p_ucb->UCB_status=SCCB_ERROR;
11283    }
11284 
11285    if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
11286       (p_sccb->OperationCode == RESIDUAL_COMMAND))
11287    {
11288 
11289          utilUpdateResidual(p_sccb);
11290 
11291          p_ucb->UCB_datalen=p_sccb->DataLength;
11292    }
11293 
11294    pCurrCard->cmdCounter--;
11295    if (!pCurrCard->cmdCounter)
11296    {
11297 
11298       if (pCurrCard->globalFlags & F_GREEN_PC)
11299       {
11300          WR_HARPOON(pCurrCard->ioPort+hp_clkctrl_0,(PWR_DWN | CLKCTRL_DEFAULT));
11301          WR_HARPOON(pCurrCard->ioPort+hp_sys_ctrl, STOP_CLK);
11302       }
11303 
11304       WR_HARPOON(pCurrCard->ioPort+hp_semaphore,
11305       (RD_HARPOON(pCurrCard->ioPort+hp_semaphore) & ~SCCB_MGR_ACTIVE));
11306    }
11307 
11308 	if(pCurrCard->discQCount != 0)
11309 	{
11310       currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
11311 		if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
11312 			((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
11313 		{
11314 			pCurrCard->discQCount--;
11315 			pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = NULL;
11316 		}
11317 		else
11318 		{
11319 			if(p_sccb->Sccb_tag)
11320 			{
11321 				pCurrCard->discQCount--;
11322 				pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
11323 			}else
11324 			{
11325 				pCurrCard->discQCount--;
11326 				pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
11327 			}
11328 		}
11329 
11330 	}
11331    callback = (CALL_BK_FN)p_ucb->UCB_callback;
11332    callback(p_ucb);
11333    pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
11334    pCurrCard->currentSCCB = NULL;
11335 }
11336 
11337 
11338 
11339 
11340 #else
11341 
11342    UCHAR i, SCSIcmd;
11343    CALL_BK_FN callback;
11344    PSCCBMgr_tar_info currTar_Info;
11345 
11346    SCSIcmd = p_sccb->Cdb[0];
11347 
11348 
11349    if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) {
11350 
11351 	  if ((p_sccb->ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN)) &&
11352 		 (p_sccb->HostStatus == SCCB_COMPLETE)                             &&
11353 		 (p_sccb->TargetStatus != SSCHECK))
11354 
11355 		 if ((SCSIcmd == SCSI_READ)             ||
11356 			 (SCSIcmd == SCSI_WRITE)            ||
11357 			 (SCSIcmd == SCSI_READ_EXTENDED)    ||
11358 			 (SCSIcmd == SCSI_WRITE_EXTENDED)   ||
11359 			 (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
11360 			 (SCSIcmd == SCSI_START_STOP_UNIT)  ||
11361 			 (pCurrCard->globalFlags & F_NO_FILTER)
11362 			)
11363 			   p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
11364 	  }
11365 
11366 
11367 	if(p_sccb->SccbStatus == SCCB_IN_PROCESS)
11368 	{
11369 	   if (p_sccb->HostStatus || p_sccb->TargetStatus)
11370 		  p_sccb->SccbStatus = SCCB_ERROR;
11371 	   else
11372 		  p_sccb->SccbStatus = SCCB_SUCCESS;
11373 	}
11374 
11375    if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
11376 
11377 	  p_sccb->CdbLength = p_sccb->Save_CdbLen;
11378 	  for (i=0; i < 6; i++) {
11379 		 p_sccb->Cdb[i] = p_sccb->Save_Cdb[i];
11380 		 }
11381 	  }
11382 
11383    if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
11384 	  (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
11385 
11386 		 utilUpdateResidual(p_sccb);
11387 		 }
11388 
11389    pCurrCard->cmdCounter--;
11390    if (!pCurrCard->cmdCounter) {
11391 
11392 	  if (pCurrCard->globalFlags & F_GREEN_PC) {
11393 		 WR_HARPOON(pCurrCard->ioPort+hp_clkctrl_0,(PWR_DWN | CLKCTRL_DEFAULT));
11394 		 WR_HARPOON(pCurrCard->ioPort+hp_sys_ctrl, STOP_CLK);
11395 		 }
11396 
11397 	  WR_HARPOON(pCurrCard->ioPort+hp_semaphore,
11398 	  (RD_HARPOON(pCurrCard->ioPort+hp_semaphore) & ~SCCB_MGR_ACTIVE));
11399 
11400 	  }
11401 
11402 	if(pCurrCard->discQCount != 0)
11403 	{
11404       currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
11405 		if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
11406 			((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
11407 		{
11408 			pCurrCard->discQCount--;
11409 			pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = NULL;
11410 		}
11411 		else
11412 		{
11413 			if(p_sccb->Sccb_tag)
11414 			{
11415 				pCurrCard->discQCount--;
11416 				pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
11417 			}else
11418 			{
11419 				pCurrCard->discQCount--;
11420 				pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
11421 			}
11422 		}
11423 
11424 	}
11425 
11426 	callback = (CALL_BK_FN)p_sccb->SccbCallback;
11427    callback(p_sccb);
11428    pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
11429    pCurrCard->currentSCCB = NULL;
11430 }
11431 #endif /* ( if FW_TYPE==...) */
11432 
11433 
11434 /*---------------------------------------------------------------------
11435  *
11436  * Function: Queue Disconnect
11437  *
11438  * Description: Add SCCB to our disconnect array.
11439  *
11440  *---------------------------------------------------------------------*/
queueDisconnect(PSCCB p_sccb,UCHAR p_card)11441 void queueDisconnect(PSCCB p_sccb, UCHAR p_card)
11442 {
11443    PSCCBMgr_tar_info currTar_Info;
11444 
11445 	currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
11446 
11447 	if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
11448 		((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
11449 	{
11450 		BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = p_sccb;
11451 	}
11452 	else
11453 	{
11454 		if (p_sccb->Sccb_tag)
11455 		{
11456 			BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] = p_sccb;
11457 			sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] = FALSE;
11458 			sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
11459 		}else
11460 		{
11461 			BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = p_sccb;
11462 		}
11463 	}
11464 	BL_Card[p_card].currentSCCB = NULL;
11465 }
11466 
11467 
11468 /*---------------------------------------------------------------------
11469  *
11470  * Function: Queue Flush SCCB
11471  *
11472  * Description: Flush all SCCB's back to the host driver for this target.
11473  *
11474  *---------------------------------------------------------------------*/
11475 
queueFlushSccb(UCHAR p_card,UCHAR error_code)11476 void  queueFlushSccb(UCHAR p_card, UCHAR error_code)
11477 {
11478    UCHAR qtag,thisTarg;
11479    PSCCB currSCCB;
11480    PSCCBMgr_tar_info currTar_Info;
11481 
11482    currSCCB = BL_Card[p_card].currentSCCB;
11483 	if(currSCCB != NULL)
11484 	{
11485 	   thisTarg = (UCHAR)currSCCB->TargID;
11486    	currTar_Info = &sccbMgrTbl[p_card][thisTarg];
11487 
11488 	   for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
11489 
11490 		  if (BL_Card[p_card].discQ_Tbl[qtag] &&
11491 					(BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
11492 			 {
11493 
11494 			 BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
11495 
11496 			 queueCmdComplete(&BL_Card[p_card],BL_Card[p_card].discQ_Tbl[qtag], p_card);
11497 
11498 			 BL_Card[p_card].discQ_Tbl[qtag] = NULL;
11499 			 currTar_Info->TarTagQ_Cnt--;
11500 
11501 			 }
11502 		  }
11503 	}
11504 
11505 }
11506 
11507 /*---------------------------------------------------------------------
11508  *
11509  * Function: Queue Flush Target SCCB
11510  *
11511  * Description: Flush all SCCB's back to the host driver for this target.
11512  *
11513  *---------------------------------------------------------------------*/
11514 
queueFlushTargSccb(UCHAR p_card,UCHAR thisTarg,UCHAR error_code)11515 void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code)
11516 {
11517    UCHAR qtag;
11518    PSCCBMgr_tar_info currTar_Info;
11519 
11520    currTar_Info = &sccbMgrTbl[p_card][thisTarg];
11521 
11522    for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
11523 
11524 	  if (BL_Card[p_card].discQ_Tbl[qtag] &&
11525 				(BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
11526 		 {
11527 
11528 		 BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
11529 
11530 		 queueCmdComplete(&BL_Card[p_card],BL_Card[p_card].discQ_Tbl[qtag], p_card);
11531 
11532 		 BL_Card[p_card].discQ_Tbl[qtag] = NULL;
11533 		 currTar_Info->TarTagQ_Cnt--;
11534 
11535 		 }
11536 	  }
11537 
11538 }
11539 
11540 
11541 
11542 
11543 
queueAddSccb(PSCCB p_SCCB,UCHAR p_card)11544 void queueAddSccb(PSCCB p_SCCB, UCHAR p_card)
11545 {
11546    PSCCBMgr_tar_info currTar_Info;
11547    currTar_Info = &sccbMgrTbl[p_card][p_SCCB->TargID];
11548 
11549    p_SCCB->Sccb_forwardlink = NULL;
11550 
11551    p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
11552 
11553    if (currTar_Info->TarSelQ_Cnt == 0) {
11554 
11555 	  currTar_Info->TarSelQ_Head = p_SCCB;
11556 	  }
11557 
11558    else {
11559 
11560 	  currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
11561 	  }
11562 
11563 
11564    currTar_Info->TarSelQ_Tail = p_SCCB;
11565    currTar_Info->TarSelQ_Cnt++;
11566 }
11567 
11568 
11569 /*---------------------------------------------------------------------
11570  *
11571  * Function: Queue Find SCCB
11572  *
11573  * Description: Search the target select Queue for this SCCB, and
11574  *              remove it if found.
11575  *
11576  *---------------------------------------------------------------------*/
11577 
queueFindSccb(PSCCB p_SCCB,UCHAR p_card)11578 UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card)
11579 {
11580    PSCCB q_ptr;
11581    PSCCBMgr_tar_info currTar_Info;
11582 
11583    currTar_Info = &sccbMgrTbl[p_card][p_SCCB->TargID];
11584 
11585    q_ptr = currTar_Info->TarSelQ_Head;
11586 
11587    while(q_ptr != NULL) {
11588 
11589 	  if (q_ptr == p_SCCB) {
11590 
11591 
11592 		 if (currTar_Info->TarSelQ_Head == q_ptr) {
11593 
11594 			currTar_Info->TarSelQ_Head = q_ptr->Sccb_forwardlink;
11595 			}
11596 
11597 		 if (currTar_Info->TarSelQ_Tail == q_ptr) {
11598 
11599 			currTar_Info->TarSelQ_Tail = q_ptr->Sccb_backlink;
11600 			}
11601 
11602 		 if (q_ptr->Sccb_forwardlink != NULL) {
11603 			q_ptr->Sccb_forwardlink->Sccb_backlink = q_ptr->Sccb_backlink;
11604 			}
11605 
11606 		 if (q_ptr->Sccb_backlink != NULL) {
11607 			q_ptr->Sccb_backlink->Sccb_forwardlink = q_ptr->Sccb_forwardlink;
11608 			}
11609 
11610 		 currTar_Info->TarSelQ_Cnt--;
11611 
11612 		 return(TRUE);
11613 		 }
11614 
11615 	  else {
11616 		 q_ptr = q_ptr->Sccb_forwardlink;
11617 		 }
11618 	  }
11619 
11620 
11621    return(FALSE);
11622 
11623 }
11624 
11625 
11626 /*---------------------------------------------------------------------
11627  *
11628  * Function: Utility Update Residual Count
11629  *
11630  * Description: Update the XferCnt to the remaining byte count.
11631  *              If we transferred all the data then just write zero.
11632  *              If Non-SG transfer then report Total Cnt - Actual Transfer
11633  *              Cnt.  For SG transfers add the count fields of all
11634  *              remaining SG elements, as well as any partial remaining
11635  *              element.
11636  *
11637  *---------------------------------------------------------------------*/
11638 
utilUpdateResidual(PSCCB p_SCCB)11639 void  utilUpdateResidual(PSCCB p_SCCB)
11640 {
11641    ULONG partial_cnt;
11642    UINT  sg_index;
11643 #if defined(COMPILER_16_BIT) && !defined(DOS)
11644    ULONG far *sg_ptr;
11645 #else
11646    ULONG *sg_ptr;
11647 #endif
11648 
11649    if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
11650 
11651 	  p_SCCB->DataLength = 0x0000;
11652 	  }
11653 
11654    else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
11655 
11656 		 partial_cnt = 0x0000;
11657 
11658 		 sg_index = p_SCCB->Sccb_sgseg;
11659 
11660 #if defined(COMPILER_16_BIT) && !defined(DOS)
11661 		 sg_ptr = (ULONG far *)p_SCCB->DataPointer;
11662 #else
11663 		 sg_ptr = (ULONG *)p_SCCB->DataPointer;
11664 #endif
11665 
11666 		 if (p_SCCB->Sccb_SGoffset) {
11667 
11668 			partial_cnt = p_SCCB->Sccb_SGoffset;
11669 			sg_index++;
11670 			}
11671 
11672 		 while ( ((ULONG)sg_index * (ULONG)SG_ELEMENT_SIZE) <
11673 			p_SCCB->DataLength ) {
11674 
11675 			partial_cnt += *(sg_ptr+(sg_index * 2));
11676 			sg_index++;
11677 			}
11678 
11679 		 p_SCCB->DataLength = partial_cnt;
11680 		 }
11681 
11682 	  else {
11683 
11684 		 p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
11685 		 }
11686 }
11687 
11688 
11689 /*---------------------------------------------------------------------
11690  *
11691  * Function: Wait 1 Second
11692  *
11693  * Description: Wait for 1 second.
11694  *
11695  *---------------------------------------------------------------------*/
11696 
11697 #if defined(DOS)
Wait1Second(USHORT p_port)11698 void Wait1Second(USHORT p_port)
11699 #else
11700 void Wait1Second(ULONG p_port)
11701 #endif
11702 {
11703    UCHAR i;
11704 
11705    for(i=0; i < 4; i++) {
11706 
11707 	  Wait(p_port, TO_250ms);
11708 
11709 	  if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST))
11710 		 break;
11711 
11712 	  if((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL))
11713 		 break;
11714 	  }
11715 }
11716 
11717 
11718 /*---------------------------------------------------------------------
11719  *
11720  * Function: Wait
11721  *
11722  * Description: Wait the desired delay.
11723  *
11724  *---------------------------------------------------------------------*/
11725 
11726 #if defined(DOS)
Wait(USHORT p_port,UCHAR p_delay)11727 void Wait(USHORT p_port, UCHAR p_delay)
11728 #else
11729 void Wait(ULONG p_port, UCHAR p_delay)
11730 #endif
11731 {
11732    UCHAR old_timer;
11733    UCHAR green_flag;
11734 
11735    old_timer = RD_HARPOON(p_port+hp_seltimeout);
11736 
11737    green_flag=RD_HARPOON(p_port+hp_clkctrl_0);
11738    WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT);
11739 
11740    WR_HARPOON(p_port+hp_seltimeout,p_delay);
11741    WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
11742    WRW_HARPOON((p_port+hp_intena), (default_intena & ~TIMEOUT));
11743 
11744 
11745    WR_HARPOON(p_port+hp_portctrl_0,
11746 	  (RD_HARPOON(p_port+hp_portctrl_0) | START_TO));
11747 
11748    while (!(RDW_HARPOON((p_port+hp_intstat)) & TIMEOUT)) {
11749 
11750 	  if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST))
11751 		 break;
11752 
11753 	  if ((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL))
11754 		 break;
11755 	  }
11756 
11757    WR_HARPOON(p_port+hp_portctrl_0,
11758 	  (RD_HARPOON(p_port+hp_portctrl_0) & ~START_TO));
11759 
11760    WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
11761    WRW_HARPOON((p_port+hp_intena), default_intena);
11762 
11763    WR_HARPOON(p_port+hp_clkctrl_0,green_flag);
11764 
11765    WR_HARPOON(p_port+hp_seltimeout,old_timer);
11766 }
11767 
11768 
11769 /*---------------------------------------------------------------------
11770  *
11771  * Function: Enable/Disable Write to EEPROM
11772  *
11773  * Description: The EEPROM must first be enabled for writes
11774  *              A total of 9 clocks are needed.
11775  *
11776  *---------------------------------------------------------------------*/
11777 
11778 #if defined(DOS)
utilEEWriteOnOff(USHORT p_port,UCHAR p_mode)11779 void utilEEWriteOnOff(USHORT p_port,UCHAR p_mode)
11780 #else
11781 void utilEEWriteOnOff(ULONG p_port,UCHAR p_mode)
11782 #endif
11783 {
11784    UCHAR ee_value;
11785 
11786    ee_value = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H));
11787 
11788    if (p_mode)
11789 
11790 	  utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
11791 
11792    else
11793 
11794 
11795 	  utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
11796 
11797    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
11798    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);       /*Turn off Master Select */
11799 }
11800 
11801 
11802 /*---------------------------------------------------------------------
11803  *
11804  * Function: Write EEPROM
11805  *
11806  * Description: Write a word to the EEPROM at the specified
11807  *              address.
11808  *
11809  *---------------------------------------------------------------------*/
11810 
11811 #if defined(DOS)
utilEEWrite(USHORT p_port,USHORT ee_data,USHORT ee_addr)11812 void utilEEWrite(USHORT p_port, USHORT ee_data, USHORT ee_addr)
11813 #else
11814 void utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr)
11815 #endif
11816 {
11817 
11818    UCHAR ee_value;
11819    USHORT i;
11820 
11821    ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))|
11822 		   (SEE_MS | SEE_CS));
11823 
11824 
11825 
11826    utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
11827 
11828 
11829    ee_value |= (SEE_MS + SEE_CS);
11830 
11831    for(i = 0x8000; i != 0; i>>=1) {
11832 
11833 	  if (i & ee_data)
11834 	 ee_value |= SEE_DO;
11835 	  else
11836 	 ee_value &= ~SEE_DO;
11837 
11838 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11839 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11840 	  ee_value |= SEE_CLK;          /* Clock  data! */
11841 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11842 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11843 	  ee_value &= ~SEE_CLK;
11844 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11845 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11846 	  }
11847    ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H);
11848    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS));
11849 
11850    Wait(p_port, TO_10ms);
11851 
11852    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS)); /* Set CS to EEPROM */
11853    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS));       /* Turn off CS */
11854    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);       /* Turn off Master Select */
11855 }
11856 
11857 /*---------------------------------------------------------------------
11858  *
11859  * Function: Read EEPROM
11860  *
11861  * Description: Read a word from the EEPROM at the desired
11862  *              address.
11863  *
11864  *---------------------------------------------------------------------*/
11865 
11866 #if defined(DOS)
utilEERead(USHORT p_port,USHORT ee_addr)11867 USHORT utilEERead(USHORT p_port, USHORT ee_addr)
11868 #else
11869 USHORT utilEERead(ULONG p_port, USHORT ee_addr)
11870 #endif
11871 {
11872    USHORT i, ee_data1, ee_data2;
11873 
11874 	i = 0;
11875 	ee_data1 = utilEEReadOrg(p_port, ee_addr);
11876 	do
11877 	{
11878 		ee_data2 = utilEEReadOrg(p_port, ee_addr);
11879 
11880 		if(ee_data1 == ee_data2)
11881 			return(ee_data1);
11882 
11883 		ee_data1 = ee_data2;
11884 		i++;
11885 
11886 	}while(i < 4);
11887 
11888 	return(ee_data1);
11889 }
11890 
11891 /*---------------------------------------------------------------------
11892  *
11893  * Function: Read EEPROM Original
11894  *
11895  * Description: Read a word from the EEPROM at the desired
11896  *              address.
11897  *
11898  *---------------------------------------------------------------------*/
11899 
11900 #if defined(DOS)
utilEEReadOrg(USHORT p_port,USHORT ee_addr)11901 USHORT utilEEReadOrg(USHORT p_port, USHORT ee_addr)
11902 #else
11903 USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr)
11904 #endif
11905 {
11906 
11907    UCHAR ee_value;
11908    USHORT i, ee_data;
11909 
11910    ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))|
11911 		   (SEE_MS | SEE_CS));
11912 
11913 
11914    utilEESendCmdAddr(p_port, EE_READ, ee_addr);
11915 
11916 
11917    ee_value |= (SEE_MS + SEE_CS);
11918    ee_data = 0;
11919 
11920    for(i = 1; i <= 16; i++) {
11921 
11922 	  ee_value |= SEE_CLK;          /* Clock  data! */
11923 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11924 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11925 	  ee_value &= ~SEE_CLK;
11926 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11927 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11928 
11929 	  ee_data <<= 1;
11930 
11931 	  if (RD_HARPOON(p_port+hp_ee_ctrl) & SEE_DI)
11932 		 ee_data |= 1;
11933 	  }
11934 
11935    ee_value &= ~(SEE_MS + SEE_CS);
11936    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
11937    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);   /*Turn off Master Select */
11938 
11939    return(ee_data);
11940 }
11941 
11942 
11943 /*---------------------------------------------------------------------
11944  *
11945  * Function: Send EE command and Address to the EEPROM
11946  *
11947  * Description: Transfers the correct command and sends the address
11948  *              to the eeprom.
11949  *
11950  *---------------------------------------------------------------------*/
11951 
11952 #if defined(DOS)
utilEESendCmdAddr(USHORT p_port,UCHAR ee_cmd,USHORT ee_addr)11953 void utilEESendCmdAddr(USHORT p_port, UCHAR ee_cmd, USHORT ee_addr)
11954 #else
11955 void utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr)
11956 #endif
11957 {
11958    UCHAR ee_value;
11959    UCHAR narrow_flg;
11960 
11961    USHORT i;
11962 
11963 
11964    narrow_flg= (UCHAR)(RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD);
11965 
11966 
11967    ee_value = SEE_MS;
11968    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11969 
11970    ee_value |= SEE_CS;                             /* Set CS to EEPROM */
11971    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11972 
11973 
11974    for(i = 0x04; i != 0; i>>=1) {
11975 
11976 	  if (i & ee_cmd)
11977 		 ee_value |= SEE_DO;
11978 	  else
11979 		 ee_value &= ~SEE_DO;
11980 
11981 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11982 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11983 	  ee_value |= SEE_CLK;                         /* Clock  data! */
11984 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11985 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11986 	  ee_value &= ~SEE_CLK;
11987 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11988 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
11989 	  }
11990 
11991 
11992    if (narrow_flg)
11993 	  i = 0x0080;
11994 
11995    else
11996 	  i = 0x0200;
11997 
11998 
11999    while (i != 0) {
12000 
12001 	  if (i & ee_addr)
12002 		 ee_value |= SEE_DO;
12003 	  else
12004 		 ee_value &= ~SEE_DO;
12005 
12006 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12007 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12008 	  ee_value |= SEE_CLK;                         /* Clock  data! */
12009 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12010 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12011 	  ee_value &= ~SEE_CLK;
12012 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12013 	  WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
12014 
12015 	  i >>= 1;
12016 	  }
12017 }
12018 
CalcCrc16(UCHAR buffer[])12019 USHORT CalcCrc16(UCHAR buffer[])
12020 {
12021    USHORT crc=0;
12022 	int i,j;
12023    USHORT ch;
12024    for (i=0; i < ID_STRING_LENGTH; i++)
12025    {
12026       ch = (USHORT) buffer[i];
12027 	   for(j=0; j < 8; j++)
12028 	   {
12029 		   if ((crc ^ ch) & 1)
12030             crc = (crc >> 1) ^ CRCMASK;
12031 		   else
12032             crc >>= 1;
12033 		   ch >>= 1;
12034 	   }
12035    }
12036 	return(crc);
12037 }
12038 
CalcLrc(UCHAR buffer[])12039 UCHAR CalcLrc(UCHAR buffer[])
12040 {
12041 	int i;
12042 	UCHAR lrc;
12043 	lrc = 0;
12044 	for(i = 0; i < ID_STRING_LENGTH; i++)
12045 		lrc ^= buffer[i];
12046 	return(lrc);
12047 }
12048 
12049 
12050 
12051 /*
12052   The following inline definitions avoid type conflicts.
12053 */
12054 
12055 static inline unsigned char
FlashPoint__ProbeHostAdapter(FlashPoint_Info_T * FlashPointInfo)12056 FlashPoint__ProbeHostAdapter(FlashPoint_Info_T *FlashPointInfo)
12057 {
12058   return FlashPoint_ProbeHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
12059 }
12060 
12061 
12062 static inline FlashPoint_CardHandle_T
FlashPoint__HardwareResetHostAdapter(FlashPoint_Info_T * FlashPointInfo)12063 FlashPoint__HardwareResetHostAdapter(FlashPoint_Info_T *FlashPointInfo)
12064 {
12065   return FlashPoint_HardwareResetHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
12066 }
12067 
12068 static inline void
FlashPoint__ReleaseHostAdapter(FlashPoint_CardHandle_T CardHandle)12069 FlashPoint__ReleaseHostAdapter(FlashPoint_CardHandle_T CardHandle)
12070 {
12071   FlashPoint_ReleaseHostAdapter(CardHandle);
12072 }
12073 
12074 
12075 static inline void
FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle,BusLogic_CCB_T * CCB)12076 FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle, BusLogic_CCB_T *CCB)
12077 {
12078   FlashPoint_StartCCB(CardHandle, (PSCCB) CCB);
12079 }
12080 
12081 
12082 static inline void
FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle,BusLogic_CCB_T * CCB)12083 FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle, BusLogic_CCB_T *CCB)
12084 {
12085   FlashPoint_AbortCCB(CardHandle, (PSCCB) CCB);
12086 }
12087 
12088 
12089 static inline boolean
FlashPoint__InterruptPending(FlashPoint_CardHandle_T CardHandle)12090 FlashPoint__InterruptPending(FlashPoint_CardHandle_T CardHandle)
12091 {
12092   return FlashPoint_InterruptPending(CardHandle);
12093 }
12094 
12095 
12096 static inline int
FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle)12097 FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle)
12098 {
12099   return FlashPoint_HandleInterrupt(CardHandle);
12100 }
12101 
12102 
12103 #define FlashPoint_ProbeHostAdapter	    FlashPoint__ProbeHostAdapter
12104 #define FlashPoint_HardwareResetHostAdapter FlashPoint__HardwareResetHostAdapter
12105 #define FlashPoint_ReleaseHostAdapter	    FlashPoint__ReleaseHostAdapter
12106 #define FlashPoint_StartCCB		    FlashPoint__StartCCB
12107 #define FlashPoint_AbortCCB		    FlashPoint__AbortCCB
12108 #define FlashPoint_InterruptPending	    FlashPoint__InterruptPending
12109 #define FlashPoint_HandleInterrupt	    FlashPoint__HandleInterrupt
12110 
12111 
12112 /*
12113   FlashPoint_InquireTargetInfo returns the Synchronous Period, Synchronous
12114   Offset, and Wide Transfers Active information for TargetID on CardHandle.
12115 */
12116 
FlashPoint_InquireTargetInfo(FlashPoint_CardHandle_T CardHandle,int TargetID,unsigned char * SynchronousPeriod,unsigned char * SynchronousOffset,unsigned char * WideTransfersActive)12117 void FlashPoint_InquireTargetInfo(FlashPoint_CardHandle_T CardHandle,
12118 				  int TargetID,
12119 				  unsigned char *SynchronousPeriod,
12120 				  unsigned char *SynchronousOffset,
12121 				  unsigned char *WideTransfersActive)
12122 {
12123   SCCBMGR_TAR_INFO *TargetInfo =
12124     &sccbMgrTbl[((SCCBCARD *)CardHandle)->cardIndex][TargetID];
12125   if ((TargetInfo->TarSyncCtrl & SYNC_OFFSET) > 0)
12126     {
12127       *SynchronousPeriod = 5 * ((TargetInfo->TarSyncCtrl >> 5) + 1);
12128       *SynchronousOffset = TargetInfo->TarSyncCtrl & SYNC_OFFSET;
12129     }
12130   else
12131     {
12132       *SynchronousPeriod = 0;
12133       *SynchronousOffset = 0;
12134     }
12135   *WideTransfersActive = (TargetInfo->TarSyncCtrl & NARROW_SCSI ? 0 : 1);
12136 }
12137 
12138 
12139 #else  /* CONFIG_SCSI_OMIT_FLASHPOINT */
12140 
12141 
12142 /*
12143   Define prototypes for the FlashPoint SCCB Manager Functions.
12144 */
12145 
12146 extern unsigned char FlashPoint_ProbeHostAdapter(FlashPoint_Info_T *);
12147 extern FlashPoint_CardHandle_T
12148        FlashPoint_HardwareResetHostAdapter(FlashPoint_Info_T *);
12149 extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, BusLogic_CCB_T *);
12150 extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, BusLogic_CCB_T *);
12151 extern boolean FlashPoint_InterruptPending(FlashPoint_CardHandle_T);
12152 extern int FlashPoint_HandleInterrupt(FlashPoint_CardHandle_T);
12153 extern void FlashPoint_ReleaseHostAdapter(FlashPoint_CardHandle_T);
12154 extern void FlashPoint_InquireTargetInfo(FlashPoint_CardHandle_T,
12155 					 int, unsigned char *,
12156 					 unsigned char *, unsigned char *);
12157 
12158 
12159 #endif /* CONFIG_SCSI_OMIT_FLASHPOINT */
12160