]> nv-tegra.nvidia Code Review - linux-3.10.git/blob - drivers/scsi/FlashPoint.c
56a695c6ab52ae05530d61c0cbc0fdb68762565d
[linux-3.10.git] / 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