[PATCH] macintosh/adbhid.c: adb buttons support for aluminium PowerBook G4
[linux-2.6] / drivers / scsi / FlashPoint.c
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
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)
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
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  *---------------------------------------------------------------------*/
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  *---------------------------------------------------------------------*/
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  *---------------------------------------------------------------------*/
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  *---------------------------------------------------------------------*/
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  *---------------------------------------------------------------------*/
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  *---------------------------------------------------------------------*/
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  *---------------------------------------------------------------------*/
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  *---------------------------------------------------------------------*/
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  *---------------------------------------------------------------------*/
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
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
4040 void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo)
4041 {
4042 }
4043
4044
4045 void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard)
4046 {
4047 }
4048
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_)
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
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)
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)
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_)
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_)
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_)
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_)
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_)
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)
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_)
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_)
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
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
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
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
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
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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  *---------------------------------------------------------------------*/
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)
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)
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
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 initially 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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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  *---------------------------------------------------------------------*/
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
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)
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)
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)
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)
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)
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)
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)
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)
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)
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
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)
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
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)
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)
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
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)
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)
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)
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)
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)
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  *              necessary.
10870  *
10871  *---------------------------------------------------------------------*/
10872
10873 #if defined(DOS)
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
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
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
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  *---------------------------------------------------------------------*/
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
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
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
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
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
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)
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)
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)
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)
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)
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)
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)
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
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
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
12056 FlashPoint__ProbeHostAdapter(struct FlashPoint_Info *FlashPointInfo)
12057 {
12058   return FlashPoint_ProbeHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
12059 }
12060
12061
12062 static inline FlashPoint_CardHandle_T
12063 FlashPoint__HardwareResetHostAdapter(struct FlashPoint_Info *FlashPointInfo)
12064 {
12065   return FlashPoint_HardwareResetHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
12066 }
12067
12068 static inline void
12069 FlashPoint__ReleaseHostAdapter(FlashPoint_CardHandle_T CardHandle)
12070 {
12071   FlashPoint_ReleaseHostAdapter(CardHandle);
12072 }
12073
12074
12075 static inline void
12076 FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle, struct BusLogic_CCB *CCB)
12077 {
12078   FlashPoint_StartCCB(CardHandle, (PSCCB) CCB);
12079 }
12080
12081
12082 static inline void
12083 FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle, struct BusLogic_CCB *CCB)
12084 {
12085   FlashPoint_AbortCCB(CardHandle, (PSCCB) CCB);
12086 }
12087
12088
12089 static inline boolean
12090 FlashPoint__InterruptPending(FlashPoint_CardHandle_T CardHandle)
12091 {
12092   return FlashPoint_InterruptPending(CardHandle);
12093 }
12094
12095
12096 static inline int
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
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(struct FlashPoint_Info *);
12147 extern FlashPoint_CardHandle_T
12148        FlashPoint_HardwareResetHostAdapter(struct FlashPoint_Info *);
12149 extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *);
12150 extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, struct BusLogic_CCB *);
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 */