Annotation of Gnu-Mach/linux/src/drivers/scsi/FlashPoint.c, revision 1.1.1.1

1.1       root        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: 1999/04/26 05:53:56 $
                    167:  *
                    168:  *   $Revision: 1.1 $
                    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: 1999/04/26 05:53:56 $
                    406:  *
                    407:  *   $Revision: 1.1 $
                    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_UNSUPORTED_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: 1999/04/26 05:53:56 $
                    724:  *
                    725:  *   $Revision: 1.1 $
                    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: 1999/04/26 05:53:56 $
                    881:  *
                    882:  *   $Revision: 1.1 $
                    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: 1999/04/26 05:53:56 $
                   1080:  *
                   1081:  *   $Revision: 1.1 $
                   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: 1999/04/26 05:53:56 $
                   1212:  *
                   1213:  *   $Revision: 1.1 $
                   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: 1999/04/26 05:53:56 $
                   1297:  *
                   1298:  *   $Revision: 1.1 $
                   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: FlashPoint.c,v 1.1 1999/04/26 05:53:56 tb 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: 1999/04/26 05:53:56 $
                   2344:  *
                   2345:  *   $Revision: 1.1 $
                   2346:  *
                   2347:  *----------------------------------------------------------------------*/
                   2348: 
                   2349: /*#include <globals.h>*/
                   2350: 
                   2351: #if (FW_TYPE==_UCB_MGR_)
                   2352:        /*#include <budi.h>*/
                   2353:        /*#include <budioctl.h>*/
                   2354: #endif
                   2355: 
                   2356: /*#include <sccbmgr.h>*/
                   2357: /*#include <blx30.h>*/
                   2358: /*#include <target.h>*/
                   2359: /*#include <eeprom.h>*/
                   2360: /*#include <scsi2.h>*/
                   2361: /*#include <harpoon.h>*/
                   2362: 
                   2363: 
                   2364: 
                   2365: #if (FW_TYPE==_SCCB_MGR_)
                   2366: #define mOS_Lock(card)    OS_Lock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
                   2367: #define mOS_UnLock(card)  OS_UnLock((PSCCBMGR_INFO)(((PSCCBcard)card)->cardInfo))
                   2368: #else /* FW_TYPE==_UCB_MGR_ */
                   2369: #define mOS_Lock(card)    OS_Lock((u32bits)(((PSCCBcard)card)->ioPort))
                   2370: #define mOS_UnLock(card)  OS_UnLock((u32bits)(((PSCCBcard)card)->ioPort))
                   2371: #endif
                   2372: 
                   2373: 
                   2374: /*
                   2375: extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
                   2376: extern SCCBCARD BL_Card[MAX_CARDS];
                   2377: 
                   2378: extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
                   2379: extern UCHAR mbCards;
                   2380: 
                   2381: #if defined (OS2)
                   2382:    extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
                   2383: #else
                   2384:    #if defined(DOS)
                   2385:       extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
                   2386:    #else
                   2387:       extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
                   2388:    #endif
                   2389: #endif
                   2390: 
                   2391: 
                   2392: #if defined(BUGBUG)
                   2393: extern UCHAR debug_int[MAX_CARDS][debug_size];
                   2394: extern UCHAR debug_index[MAX_CARDS];
                   2395: void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
                   2396: #endif
                   2397: */
                   2398: 
                   2399: #if (FW_TYPE==_SCCB_MGR_)
                   2400: 
                   2401: /*---------------------------------------------------------------------
                   2402:  *
                   2403:  * Function: SccbMgr_sense_adapter
                   2404:  *
                   2405:  * Description: Setup and/or Search for cards and return info to caller.
                   2406:  *
                   2407:  *---------------------------------------------------------------------*/
                   2408: 
                   2409: int SccbMgr_sense_adapter(PSCCBMGR_INFO pCardInfo)
                   2410: {
                   2411: #if defined(DOS)
                   2412: #else
                   2413:    static UCHAR first_time = 1;
                   2414: #endif
                   2415: 
                   2416:    UCHAR i,j,id,ScamFlg;
                   2417:    USHORT temp,temp2,temp3,temp4,temp5,temp6;
                   2418: #if defined(DOS)
                   2419:    USHORT ioport;
                   2420: #else
                   2421:    ULONG ioport;
                   2422: #endif
                   2423:        PNVRamInfo pCurrNvRam;
                   2424: 
                   2425: #if defined(DOS)
                   2426:    ioport = (USHORT)pCardInfo->si_baseaddr;
                   2427: #else
                   2428:    ioport = pCardInfo->si_baseaddr;
                   2429: #endif
                   2430: 
                   2431: 
                   2432:    if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
                   2433:       return((int)FAILURE);
                   2434: 
                   2435:    if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
                   2436:       return((int)FAILURE);
                   2437: 
                   2438:    if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
                   2439:       return((int)FAILURE);
                   2440: 
                   2441:    if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
                   2442:       return((int)FAILURE);
                   2443: 
                   2444: 
                   2445:    if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
                   2446: 
                   2447: /* For new Harpoon then check for sub_device ID LSB
                   2448:    the bits(0-3) must be all ZERO for compatible with
                   2449:    current version of SCCBMgr, else skip this Harpoon
                   2450:        device. */
                   2451: 
                   2452:           if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
                   2453:              return((int)FAILURE);
                   2454:        }
                   2455: 
                   2456:    if (first_time)
                   2457:       {
                   2458:       SccbMgrTableInitAll();
                   2459:       first_time = 0;
                   2460:                mbCards = 0;
                   2461:       }
                   2462: 
                   2463:        if(RdStack(ioport, 0) != 0x00) {
                   2464:                if(ChkIfChipInitialized(ioport) == FALSE)
                   2465:                {
                   2466:                        pCurrNvRam = NULL;
                   2467:                   WR_HARPOON(ioport+hp_semaphore, 0x00);
                   2468:                        XbowInit(ioport, 0);             /*Must Init the SCSI before attempting */
                   2469:                        DiagEEPROM(ioport);
                   2470:                }
                   2471:                else
                   2472:                {
                   2473:                        if(mbCards < MAX_MB_CARDS) {
                   2474:                                pCurrNvRam = &nvRamInfo[mbCards];
                   2475:                                mbCards++;
                   2476:                                pCurrNvRam->niBaseAddr = ioport;
                   2477:                                RNVRamData(pCurrNvRam);
                   2478:                        }else
                   2479:                                return((int) FAILURE);
                   2480:                }
                   2481:        }else
                   2482:                pCurrNvRam = NULL;
                   2483: #if defined (NO_BIOS_OPTION)
                   2484:        pCurrNvRam = NULL;
                   2485:    XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
                   2486:    DiagEEPROM(ioport);
                   2487: #endif  /* No BIOS Option */
                   2488: 
                   2489:    WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
                   2490:    WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
                   2491: 
                   2492:        if(pCurrNvRam)
                   2493:                pCardInfo->si_id = pCurrNvRam->niAdapId;
                   2494:        else
                   2495:           pCardInfo->si_id = (UCHAR)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
                   2496:           (UCHAR)0x0FF);
                   2497: 
                   2498:    pCardInfo->si_lun = 0x00;
                   2499:    pCardInfo->si_fw_revision = ORION_FW_REV;
                   2500:    temp2 = 0x0000;
                   2501:    temp3 = 0x0000;
                   2502:    temp4 = 0x0000;
                   2503:    temp5 = 0x0000;
                   2504:    temp6 = 0x0000;
                   2505: 
                   2506:    for (id = 0; id < (16/2); id++) {
                   2507: 
                   2508:                if(pCurrNvRam){
                   2509:                        temp = (USHORT) pCurrNvRam->niSyncTbl[id];
                   2510:                        temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
                   2511:                                         (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
                   2512:                }else
                   2513:              temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
                   2514: 
                   2515:       for (i = 0; i < 2; temp >>=8,i++) {
                   2516: 
                   2517:          temp2 >>= 1;
                   2518:          temp3 >>= 1;
                   2519:          temp4 >>= 1;
                   2520:          temp5 >>= 1;
                   2521:          temp6 >>= 1;
                   2522:         switch (temp & 0x3)
                   2523:           {
                   2524:           case AUTO_RATE_20:   /* Synchronous, 20 mega-transfers/second */
                   2525:             temp6 |= 0x8000;   /* Fall through */
                   2526:           case AUTO_RATE_10:   /* Synchronous, 10 mega-transfers/second */
                   2527:             temp5 |= 0x8000;   /* Fall through */
                   2528:           case AUTO_RATE_05:   /* Synchronous, 5 mega-transfers/second */
                   2529:             temp2 |= 0x8000;   /* Fall through */
                   2530:           case AUTO_RATE_00:   /* Asynchronous */
                   2531:             break;
                   2532:           }
                   2533: 
                   2534:          if (temp & DISC_ENABLE_BIT)
                   2535:           temp3 |= 0x8000;
                   2536: 
                   2537:          if (temp & WIDE_NEGO_BIT)
                   2538:           temp4 |= 0x8000;
                   2539: 
                   2540:          }
                   2541:       }
                   2542: 
                   2543:    pCardInfo->si_per_targ_init_sync = temp2;
                   2544:    pCardInfo->si_per_targ_no_disc = temp3;
                   2545:    pCardInfo->si_per_targ_wide_nego = temp4;
                   2546:    pCardInfo->si_per_targ_fast_nego = temp5;
                   2547:    pCardInfo->si_per_targ_ultra_nego = temp6;
                   2548: 
                   2549:        if(pCurrNvRam)
                   2550:                i = pCurrNvRam->niSysConf;
                   2551:        else
                   2552:           i = (UCHAR)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
                   2553: 
                   2554:        if(pCurrNvRam)
                   2555:                ScamFlg = pCurrNvRam->niScamConf;
                   2556:        else
                   2557:           ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
                   2558: 
                   2559:    pCardInfo->si_flags = 0x0000;
                   2560: 
                   2561:    if (i & 0x01)
                   2562:       pCardInfo->si_flags |= SCSI_PARITY_ENA;
                   2563: 
                   2564:    if (!(i & 0x02))
                   2565:       pCardInfo->si_flags |= SOFT_RESET;
                   2566: 
                   2567:    if (i & 0x10)
                   2568:       pCardInfo->si_flags |= EXTENDED_TRANSLATION;
                   2569: 
                   2570:    if (ScamFlg & SCAM_ENABLED)
                   2571:      pCardInfo->si_flags |= FLAG_SCAM_ENABLED;
                   2572: 
                   2573:    if (ScamFlg & SCAM_LEVEL2)
                   2574:      pCardInfo->si_flags |= FLAG_SCAM_LEVEL2;
                   2575: 
                   2576:    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
                   2577:    if (i & 0x04) {
                   2578:       j |= SCSI_TERM_ENA_L;
                   2579:       }
                   2580:    WR_HARPOON(ioport+hp_bm_ctrl, j );
                   2581: 
                   2582:    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
                   2583:    if (i & 0x08) {
                   2584:       j |= SCSI_TERM_ENA_H;
                   2585:       }
                   2586:    WR_HARPOON(ioport+hp_ee_ctrl, j );
                   2587: 
                   2588:    if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
                   2589: 
                   2590:       pCardInfo->si_flags |= SUPPORT_16TAR_32LUN;
                   2591: 
                   2592:    pCardInfo->si_card_family = HARPOON_FAMILY;
                   2593:    pCardInfo->si_bustype = BUSTYPE_PCI;
                   2594: 
                   2595:        if(pCurrNvRam){
                   2596:        pCardInfo->si_card_model[0] = '9';
                   2597:                switch(pCurrNvRam->niModel & 0x0f){
                   2598:                        case MODEL_LT:
                   2599:                        pCardInfo->si_card_model[1] = '3';
                   2600:                        pCardInfo->si_card_model[2] = '0';
                   2601:                                break;
                   2602:                        case MODEL_LW:
                   2603:                        pCardInfo->si_card_model[1] = '5';
                   2604:                        pCardInfo->si_card_model[2] = '0';
                   2605:                                break;
                   2606:                        case MODEL_DL:
                   2607:                        pCardInfo->si_card_model[1] = '3';
                   2608:                        pCardInfo->si_card_model[2] = '2';
                   2609:                                break;
                   2610:                        case MODEL_DW:
                   2611:                        pCardInfo->si_card_model[1] = '5';
                   2612:                        pCardInfo->si_card_model[2] = '2';
                   2613:                                break;
                   2614:                }
                   2615:        }else{
                   2616:           temp = utilEERead(ioport, (MODEL_NUMB_0/2));
                   2617:        pCardInfo->si_card_model[0] = (UCHAR)(temp >> 8);
                   2618:           temp = utilEERead(ioport, (MODEL_NUMB_2/2));
                   2619: 
                   2620:        pCardInfo->si_card_model[1] = (UCHAR)(temp & 0x00FF);
                   2621:           pCardInfo->si_card_model[2] = (UCHAR)(temp >> 8);
                   2622:        }
                   2623: 
                   2624:    if (pCardInfo->si_card_model[1] == '3')
                   2625:      {
                   2626:        if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
                   2627:         pCardInfo->si_flags |= LOW_BYTE_TERM;
                   2628:      }
                   2629:    else if (pCardInfo->si_card_model[2] == '0')
                   2630:      {
                   2631:        temp = RD_HARPOON(ioport+hp_xfer_pad);
                   2632:        WR_HARPOON(ioport+hp_xfer_pad, (temp & ~BIT(4)));
                   2633:        if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
                   2634:         pCardInfo->si_flags |= LOW_BYTE_TERM;
                   2635:        WR_HARPOON(ioport+hp_xfer_pad, (temp | BIT(4)));
                   2636:        if (RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7))
                   2637:         pCardInfo->si_flags |= HIGH_BYTE_TERM;
                   2638:        WR_HARPOON(ioport+hp_xfer_pad, temp);
                   2639:      }
                   2640:    else
                   2641:      {
                   2642:        temp = RD_HARPOON(ioport+hp_ee_ctrl);
                   2643:        temp2 = RD_HARPOON(ioport+hp_xfer_pad);
                   2644:        WR_HARPOON(ioport+hp_ee_ctrl, (temp | SEE_CS));
                   2645:        WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
                   2646:        temp3 = 0;
                   2647:        for (i = 0; i < 8; i++)
                   2648:         {
                   2649:           temp3 <<= 1;
                   2650:           if (!(RD_HARPOON(ioport+hp_ee_ctrl) & BIT(7)))
                   2651:             temp3 |= 1;
                   2652:           WR_HARPOON(ioport+hp_xfer_pad, (temp2 & ~BIT(4)));
                   2653:           WR_HARPOON(ioport+hp_xfer_pad, (temp2 | BIT(4)));
                   2654:         }
                   2655:        WR_HARPOON(ioport+hp_ee_ctrl, temp);
                   2656:        WR_HARPOON(ioport+hp_xfer_pad, temp2);
                   2657:        if (!(temp3 & BIT(7)))
                   2658:         pCardInfo->si_flags |= LOW_BYTE_TERM;
                   2659:        if (!(temp3 & BIT(6)))
                   2660:         pCardInfo->si_flags |= HIGH_BYTE_TERM;
                   2661:      }
                   2662: 
                   2663: 
                   2664:    ARAM_ACCESS(ioport);
                   2665: 
                   2666:    for ( i = 0; i < 4; i++ ) {
                   2667: 
                   2668:       pCardInfo->si_XlatInfo[i] =
                   2669:          RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
                   2670:       }
                   2671: 
                   2672:        /* return with -1 if no sort, else return with
                   2673:           logical card number sorted by BIOS (zero-based) */
                   2674: 
                   2675:        pCardInfo->si_relative_cardnum =
                   2676:        (UCHAR)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1);
                   2677: 
                   2678:    SGRAM_ACCESS(ioport);
                   2679: 
                   2680:    s_PhaseTbl[0] = phaseDataOut;
                   2681:    s_PhaseTbl[1] = phaseDataIn;
                   2682:    s_PhaseTbl[2] = phaseIllegal;
                   2683:    s_PhaseTbl[3] = phaseIllegal;
                   2684:    s_PhaseTbl[4] = phaseCommand;
                   2685:    s_PhaseTbl[5] = phaseStatus;
                   2686:    s_PhaseTbl[6] = phaseMsgOut;
                   2687:    s_PhaseTbl[7] = phaseMsgIn;
                   2688: 
                   2689:    pCardInfo->si_present = 0x01;
                   2690: 
                   2691: #if defined(BUGBUG)
                   2692: 
                   2693: 
                   2694:    for (i = 0; i < MAX_CARDS; i++) {
                   2695: 
                   2696:       for (id=0; id<debug_size; id++)
                   2697:          debug_int[i][id] =  (UCHAR)0x00;
                   2698:       debug_index[i] = 0;
                   2699:       }
                   2700: 
                   2701: #endif
                   2702: 
                   2703:    return(0);
                   2704: }
                   2705: 
                   2706: 
                   2707: /*---------------------------------------------------------------------
                   2708:  *
                   2709:  * Function: SccbMgr_config_adapter
                   2710:  *
                   2711:  * Description: Setup adapter for normal operation (hard reset).
                   2712:  *
                   2713:  *---------------------------------------------------------------------*/
                   2714: 
                   2715: #if defined(DOS)
                   2716: USHORT SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
                   2717: #else
                   2718: ULONG SccbMgr_config_adapter(PSCCBMGR_INFO pCardInfo)
                   2719: #endif
                   2720: {
                   2721:    PSCCBcard CurrCard = NULL;
                   2722:        PNVRamInfo pCurrNvRam;
                   2723:    UCHAR i,j,thisCard, ScamFlg;
                   2724:    USHORT temp,sync_bit_map,id;
                   2725: #if defined(DOS)
                   2726:    USHORT ioport;
                   2727: #else
                   2728:    ULONG ioport;
                   2729: #endif
                   2730: 
                   2731: #if defined(DOS)
                   2732:    ioport = (USHORT)pCardInfo->si_baseaddr;
                   2733: #else
                   2734:    ioport = pCardInfo->si_baseaddr;
                   2735: #endif
                   2736: 
                   2737:    for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
                   2738: 
                   2739:       if (thisCard == MAX_CARDS) {
                   2740: 
                   2741:         return(FAILURE);
                   2742:          }
                   2743: 
                   2744:       if (BL_Card[thisCard].ioPort == ioport) {
                   2745: 
                   2746:          CurrCard = &BL_Card[thisCard];
                   2747:          SccbMgrTableInitCard(CurrCard,thisCard);
                   2748:          break;
                   2749:          }
                   2750: 
                   2751:       else if (BL_Card[thisCard].ioPort == 0x00) {
                   2752: 
                   2753:          BL_Card[thisCard].ioPort = ioport;
                   2754:          CurrCard = &BL_Card[thisCard];
                   2755: 
                   2756:                        if(mbCards)
                   2757:                                for(i = 0; i < mbCards; i++){
                   2758:                                        if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
                   2759:                                                CurrCard->pNvRamInfo = &nvRamInfo[i];
                   2760:                                }
                   2761:          SccbMgrTableInitCard(CurrCard,thisCard);
                   2762:          CurrCard->cardIndex = thisCard;
                   2763:          CurrCard->cardInfo = pCardInfo;
                   2764: 
                   2765:         break;
                   2766:          }
                   2767:       }
                   2768: 
                   2769:        pCurrNvRam = CurrCard->pNvRamInfo;
                   2770: 
                   2771:        if(pCurrNvRam){
                   2772:                ScamFlg = pCurrNvRam->niScamConf;
                   2773:        }
                   2774:        else{
                   2775:           ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
                   2776:        }
                   2777: 
                   2778: 
                   2779:    BusMasterInit(ioport);
                   2780:    XbowInit(ioport, ScamFlg);
                   2781: 
                   2782: #if defined (NO_BIOS_OPTION)
                   2783: 
                   2784: 
                   2785:    if (DiagXbow(ioport)) return(FAILURE);
                   2786:    if (DiagBusMaster(ioport)) return(FAILURE);
                   2787: 
                   2788: #endif  /* No BIOS Option */
                   2789: 
                   2790:    autoLoadDefaultMap(ioport);
                   2791: 
                   2792: 
                   2793:    for (i = 0,id = 0x01; i != pCardInfo->si_id; i++,id <<= 1){}
                   2794: 
                   2795:    WR_HARPOON(ioport+hp_selfid_0, id);
                   2796:    WR_HARPOON(ioport+hp_selfid_1, 0x00);
                   2797:    WR_HARPOON(ioport+hp_arb_id, pCardInfo->si_id);
                   2798:    CurrCard->ourId = pCardInfo->si_id;
                   2799: 
                   2800:    i = (UCHAR) pCardInfo->si_flags;
                   2801:    if (i & SCSI_PARITY_ENA)
                   2802:        WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
                   2803: 
                   2804:    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
                   2805:    if (i & LOW_BYTE_TERM)
                   2806:       j |= SCSI_TERM_ENA_L;
                   2807:    WR_HARPOON(ioport+hp_bm_ctrl, j);
                   2808: 
                   2809:    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
                   2810:    if (i & HIGH_BYTE_TERM)
                   2811:       j |= SCSI_TERM_ENA_H;
                   2812:    WR_HARPOON(ioport+hp_ee_ctrl, j );
                   2813: 
                   2814: 
                   2815:    if (!(pCardInfo->si_flags & SOFT_RESET)) {
                   2816: 
                   2817:       sresb(ioport,thisCard);
                   2818: 
                   2819:          scini(thisCard, pCardInfo->si_id, 0);
                   2820:       }
                   2821: 
                   2822: 
                   2823: 
                   2824:    if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
                   2825:       CurrCard->globalFlags |= F_NO_FILTER;
                   2826: 
                   2827:        if(pCurrNvRam){
                   2828:                if(pCurrNvRam->niSysConf & 0x10)
                   2829:                        CurrCard->globalFlags |= F_GREEN_PC;
                   2830:        }
                   2831:        else{
                   2832:           if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
                   2833:           CurrCard->globalFlags |= F_GREEN_PC;
                   2834:        }
                   2835: 
                   2836:        /* Set global flag to indicate Re-Negotiation to be done on all
                   2837:                ckeck condition */
                   2838:        if(pCurrNvRam){
                   2839:                if(pCurrNvRam->niScsiConf & 0x04)
                   2840:                        CurrCard->globalFlags |= F_DO_RENEGO;
                   2841:        }
                   2842:        else{
                   2843:           if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
                   2844:           CurrCard->globalFlags |= F_DO_RENEGO;
                   2845:        }
                   2846: 
                   2847:        if(pCurrNvRam){
                   2848:                if(pCurrNvRam->niScsiConf & 0x08)
                   2849:                        CurrCard->globalFlags |= F_CONLUN_IO;
                   2850:        }
                   2851:        else{
                   2852:           if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
                   2853:           CurrCard->globalFlags |= F_CONLUN_IO;
                   2854:        }
                   2855: 
                   2856: 
                   2857:    temp = pCardInfo->si_per_targ_no_disc;
                   2858: 
                   2859:    for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
                   2860: 
                   2861:       if (temp & id)
                   2862:         sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
                   2863:       }
                   2864: 
                   2865:    sync_bit_map = 0x0001;
                   2866: 
                   2867:    for (id = 0; id < (MAX_SCSI_TAR/2); id++) {
                   2868: 
                   2869:                if(pCurrNvRam){
                   2870:                        temp = (USHORT) pCurrNvRam->niSyncTbl[id];
                   2871:                        temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
                   2872:                                         (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
                   2873:                }else
                   2874:              temp = utilEERead(ioport, (USHORT)((SYNC_RATE_TBL/2)+id));
                   2875: 
                   2876:       for (i = 0; i < 2; temp >>=8,i++) {
                   2877: 
                   2878:          if (pCardInfo->si_per_targ_init_sync & sync_bit_map) {
                   2879: 
                   2880:             sccbMgrTbl[thisCard][id*2+i].TarEEValue = (UCHAR)temp;
                   2881:             }
                   2882: 
                   2883:          else {
                   2884:            sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
                   2885:             sccbMgrTbl[thisCard][id*2+i].TarEEValue =
                   2886:                (UCHAR)(temp & ~EE_SYNC_MASK);
                   2887:             }
                   2888: 
                   2889: #if defined(WIDE_SCSI)
                   2890: /*         if ((pCardInfo->si_per_targ_wide_nego & sync_bit_map) ||
                   2891:             (id*2+i >= 8)){
                   2892: */
                   2893:          if (pCardInfo->si_per_targ_wide_nego & sync_bit_map){
                   2894: 
                   2895:             sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
                   2896: 
                   2897:             }
                   2898: 
                   2899:          else { /* NARROW SCSI */
                   2900:             sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
                   2901:             }
                   2902: 
                   2903: #else
                   2904:          sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
                   2905: #endif
                   2906: 
                   2907: 
                   2908:         sync_bit_map <<= 1;
                   2909: 
                   2910: 
                   2911: 
                   2912:          }
                   2913:       }
                   2914: 
                   2915:    WR_HARPOON((ioport+hp_semaphore),
                   2916:       (UCHAR)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
                   2917: 
                   2918: #if defined(DOS)
                   2919:    return((USHORT)CurrCard);
                   2920: #else
                   2921:    return((ULONG)CurrCard);
                   2922: #endif
                   2923: }
                   2924: 
                   2925: #else                          /* end (FW_TYPE==_SCCB_MGR_)  */
                   2926: 
                   2927: 
                   2928: 
                   2929: STATIC s16bits FP_PresenceCheck(PMGR_INFO pMgrInfo)
                   2930: {
                   2931:        PMGR_ENTRYPNTS  pMgr_EntryPnts = &pMgrInfo->mi_Functions;
                   2932: 
                   2933:       pMgr_EntryPnts->UCBMgr_probe_adapter = probe_adapter;
                   2934:       pMgr_EntryPnts->UCBMgr_init_adapter = init_adapter;
                   2935:       pMgr_EntryPnts->UCBMgr_start_UCB = SccbMgr_start_sccb;
                   2936:       pMgr_EntryPnts->UCBMgr_build_UCB = build_UCB;
                   2937:       pMgr_EntryPnts->UCBMgr_abort_UCB = SccbMgr_abort_sccb;
                   2938:       pMgr_EntryPnts->UCBMgr_my_int = SccbMgr_my_int;
                   2939:       pMgr_EntryPnts->UCBMgr_isr = SccbMgr_isr;
                   2940:       pMgr_EntryPnts->UCBMgr_scsi_reset = SccbMgr_scsi_reset;
                   2941:       pMgr_EntryPnts->UCBMgr_timer_expired = SccbMgr_timer_expired;
                   2942: #ifndef NO_IOCTLS
                   2943:          pMgr_EntryPnts->UCBMgr_unload_card = SccbMgr_unload_card;
                   2944:          pMgr_EntryPnts->UCBMgr_save_foreign_state =
                   2945:                                                                                SccbMgr_save_foreign_state;
                   2946:          pMgr_EntryPnts->UCBMgr_restore_foreign_state =
                   2947:                                                                                SccbMgr_restore_foreign_state;
                   2948:          pMgr_EntryPnts->UCBMgr_restore_native_state =
                   2949:                                                                                SccbMgr_restore_native_state;
                   2950: #endif /*NO_IOCTLS*/
                   2951: 
                   2952:       pMgrInfo->mi_SGListFormat=0x01;
                   2953:       pMgrInfo->mi_DataPtrFormat=0x01;
                   2954:       pMgrInfo->mi_MaxSGElements= (u16bits) 0xffffffff;
                   2955:       pMgrInfo->mi_MgrPrivateLen=sizeof(SCCB);
                   2956:       pMgrInfo->mi_PCIVendorID=BL_VENDOR_ID;
                   2957:       pMgrInfo->mi_PCIDeviceID=FP_DEVICE_ID;
                   2958:       pMgrInfo->mi_MgrAttributes= ATTR_IO_MAPPED +
                   2959:                                                                                         ATTR_PHYSICAL_ADDRESS +
                   2960:                                                                                         ATTR_VIRTUAL_ADDRESS +
                   2961:                                                                                         ATTR_OVERLAPPED_IO_IOCTLS_OK;
                   2962:       pMgrInfo->mi_IoRangeLen = 256;
                   2963:       return(0);
                   2964: }
                   2965: 
                   2966: 
                   2967: 
                   2968: /*---------------------------------------------------------------------
                   2969:  *
                   2970:  * Function: probe_adapter
                   2971:  *
                   2972:  * Description: Setup and/or Search for cards and return info to caller.
                   2973:  *
                   2974:  *---------------------------------------------------------------------*/
                   2975: STATIC s32bits probe_adapter(PADAPTER_INFO pAdapterInfo)
                   2976: {
                   2977:    u16bits temp,temp2,temp3,temp4;
                   2978:    u08bits i,j,id;
                   2979: 
                   2980: #if defined(DOS)
                   2981: #else
                   2982:    static u08bits first_time = 1;
                   2983: #endif
                   2984:    BASE_PORT ioport;
                   2985:        PNVRamInfo pCurrNvRam;
                   2986: 
                   2987:    ioport = (BASE_PORT)pAdapterInfo->ai_baseaddr;
                   2988: 
                   2989: 
                   2990: 
                   2991:    if (RD_HARPOON(ioport+hp_vendor_id_0) != ORION_VEND_0)
                   2992:       return(1);
                   2993: 
                   2994:    if ((RD_HARPOON(ioport+hp_vendor_id_1) != ORION_VEND_1))
                   2995:       return(2);
                   2996: 
                   2997:    if ((RD_HARPOON(ioport+hp_device_id_0) != ORION_DEV_0))
                   2998:       return(3);
                   2999: 
                   3000:    if ((RD_HARPOON(ioport+hp_device_id_1) != ORION_DEV_1))
                   3001:       return(4);
                   3002: 
                   3003: 
                   3004:    if (RD_HARPOON(ioport+hp_rev_num) != 0x0f){
                   3005: 
                   3006: 
                   3007: /* For new Harpoon then check for sub_device ID LSB
                   3008:    the bits(0-3) must be all ZERO for compatible with
                   3009:    current version of SCCBMgr, else skip this Harpoon
                   3010:        device. */
                   3011: 
                   3012:           if (RD_HARPOON(ioport+hp_sub_device_id_0) & 0x0f)
                   3013:              return(5);
                   3014:        }
                   3015: 
                   3016:    if (first_time) {
                   3017: 
                   3018:       SccbMgrTableInitAll();
                   3019:       first_time = 0;
                   3020:                mbCards = 0;
                   3021:       }
                   3022: 
                   3023:        if(RdStack(ioport, 0) != 0x00) {
                   3024:                if(ChkIfChipInitialized(ioport) == FALSE)
                   3025:                {
                   3026:                        pCurrNvRam = NULL;
                   3027:                   WR_HARPOON(ioport+hp_semaphore, 0x00);
                   3028:                        XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
                   3029:                        DiagEEPROM(ioport);
                   3030:                }
                   3031:                else
                   3032:                {
                   3033:                        if(mbCards < MAX_MB_CARDS) {
                   3034:                                pCurrNvRam = &nvRamInfo[mbCards];
                   3035:                                mbCards++;
                   3036:                                pCurrNvRam->niBaseAddr = ioport;
                   3037:                                RNVRamData(pCurrNvRam);
                   3038:                        }else
                   3039:                                return((int) FAILURE);
                   3040:                }
                   3041:        }else
                   3042:                pCurrNvRam = NULL;
                   3043: 
                   3044: #if defined (NO_BIOS_OPTION)
                   3045:        pCurrNvRam = NULL;
                   3046:    XbowInit(ioport, 0);                /*Must Init the SCSI before attempting */
                   3047:    DiagEEPROM(ioport);
                   3048: #endif  /* No BIOS Option */
                   3049: 
                   3050:    WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
                   3051:    WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
                   3052: 
                   3053:        if(pCurrNvRam)
                   3054:                pAdapterInfo->ai_id = pCurrNvRam->niAdapId;
                   3055:        else
                   3056:        pAdapterInfo->ai_id = (u08bits)(utilEERead(ioport, (ADAPTER_SCSI_ID/2)) &
                   3057:        (u08bits)0x0FF);
                   3058: 
                   3059:    pAdapterInfo->ai_lun = 0x00;
                   3060:    pAdapterInfo->ai_fw_revision[0] = '3';
                   3061:    pAdapterInfo->ai_fw_revision[1] = '1';
                   3062:    pAdapterInfo->ai_fw_revision[2] = '1';
                   3063:    pAdapterInfo->ai_fw_revision[3] = ' ';
                   3064:    pAdapterInfo->ai_NumChannels = 1;
                   3065: 
                   3066:    temp2 = 0x0000;
                   3067:    temp3 = 0x0000;
                   3068:    temp4 = 0x0000;
                   3069: 
                   3070:    for (id = 0; id < (16/2); id++) {
                   3071: 
                   3072:                if(pCurrNvRam){
                   3073:                        temp = (USHORT) pCurrNvRam->niSyncTbl[id];
                   3074:                        temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
                   3075:                                         (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
                   3076:                }else
                   3077:              temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
                   3078: 
                   3079:       for (i = 0; i < 2; temp >>=8,i++) {
                   3080: 
                   3081:          if ((temp & 0x03) != AUTO_RATE_00) {
                   3082: 
                   3083:             temp2 >>= 0x01;
                   3084:             temp2 |= 0x8000;
                   3085:             }
                   3086: 
                   3087:          else {
                   3088:             temp2 >>= 0x01;
                   3089:             }
                   3090: 
                   3091:          if (temp & DISC_ENABLE_BIT) {
                   3092: 
                   3093:             temp3 >>= 0x01;
                   3094:             temp3 |= 0x8000;
                   3095:             }
                   3096: 
                   3097:          else {
                   3098:             temp3 >>= 0x01;
                   3099:             }
                   3100: 
                   3101:          if (temp & WIDE_NEGO_BIT) {
                   3102: 
                   3103:             temp4 >>= 0x01;
                   3104:             temp4 |= 0x8000;
                   3105:             }
                   3106: 
                   3107:          else {
                   3108:             temp4 >>= 0x01;
                   3109:             }
                   3110: 
                   3111:          }
                   3112:       }
                   3113: 
                   3114:    pAdapterInfo->ai_per_targ_init_sync = temp2;
                   3115:    pAdapterInfo->ai_per_targ_no_disc = temp3;
                   3116:    pAdapterInfo->ai_per_targ_wide_nego = temp4;
                   3117:        if(pCurrNvRam)
                   3118:                i = pCurrNvRam->niSysConf;
                   3119:        else
                   3120:        i = (u08bits)(utilEERead(ioport, (SYSTEM_CONFIG/2)));
                   3121: 
                   3122:    /*
                   3123:    ** interrupts always level-triggered for FlashPoint
                   3124:    */
                   3125:    pAdapterInfo->ai_stateinfo |= LEVEL_TRIG;
                   3126: 
                   3127:    if (i & 0x01)
                   3128:       pAdapterInfo->ai_stateinfo |= SCSI_PARITY_ENA;
                   3129: 
                   3130:        if (i & 0x02)   /* SCSI Bus reset in AutoSCSI Set ? */
                   3131:        {
                   3132:                if(pCurrNvRam)
                   3133:                {
                   3134:                        j = pCurrNvRam->niScamConf;
                   3135:                }
                   3136:                else
                   3137:                {
                   3138:                j = (u08bits) utilEERead(ioport, SCAM_CONFIG/2);
                   3139:                }
                   3140:                if(j & SCAM_ENABLED)
                   3141:                {
                   3142:                        if(j & SCAM_LEVEL2)
                   3143:                        {
                   3144:                                pAdapterInfo->ai_stateinfo |= SCAM2_ENA;
                   3145:                        }
                   3146:                        else
                   3147:                        {
                   3148:                                pAdapterInfo->ai_stateinfo |= SCAM1_ENA;
                   3149:                        }
                   3150:                }
                   3151:        }
                   3152:    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
                   3153:    if (i & 0x04) {
                   3154:       j |= SCSI_TERM_ENA_L;
                   3155:       pAdapterInfo->ai_stateinfo |= LOW_BYTE_TERM_ENA;
                   3156:       }
                   3157:    WR_HARPOON(ioport+hp_bm_ctrl, j );
                   3158: 
                   3159:    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
                   3160:    if (i & 0x08) {
                   3161:       j |= SCSI_TERM_ENA_H;
                   3162:       pAdapterInfo->ai_stateinfo |= HIGH_BYTE_TERM_ENA;
                   3163:       }
                   3164:    WR_HARPOON(ioport+hp_ee_ctrl, j );
                   3165: 
                   3166:        if(RD_HARPOON(ioport + hp_page_ctrl) & BIOS_SHADOW)
                   3167:        {
                   3168:                pAdapterInfo->ai_FlashRomSize = 64 * 1024;      /* 64k ROM */
                   3169:        }
                   3170:        else
                   3171:        {
                   3172:                pAdapterInfo->ai_FlashRomSize = 32 * 1024;      /* 32k ROM */
                   3173:        }
                   3174: 
                   3175:    pAdapterInfo->ai_stateinfo |= (FAST20_ENA | TAG_QUEUE_ENA);
                   3176:    if (!(RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD))
                   3177:        {
                   3178:       pAdapterInfo->ai_attributes |= (WIDE_CAPABLE | FAST20_CAPABLE
                   3179:                                                                                                        | SCAM2_CAPABLE
                   3180:                                                                                                        | TAG_QUEUE_CAPABLE
                   3181:                                                                                                        | SUPRESS_UNDERRRUNS_CAPABLE
                   3182:                                                                                                        | SCSI_PARITY_CAPABLE);
                   3183:                pAdapterInfo->ai_MaxTarg = 16;
                   3184:                pAdapterInfo->ai_MaxLun  = 32;
                   3185:        }
                   3186:        else
                   3187:        {
                   3188:       pAdapterInfo->ai_attributes |= (FAST20_CAPABLE | SCAM2_CAPABLE
                   3189:                                                                                                        | TAG_QUEUE_CAPABLE
                   3190:                                                                                                        | SUPRESS_UNDERRRUNS_CAPABLE
                   3191:                                                                                                        | SCSI_PARITY_CAPABLE);
                   3192:                pAdapterInfo->ai_MaxTarg = 8;
                   3193:                pAdapterInfo->ai_MaxLun  = 8;
                   3194:        }
                   3195: 
                   3196:    pAdapterInfo->ai_product_family = HARPOON_FAMILY;
                   3197:    pAdapterInfo->ai_HBAbustype = BUSTYPE_PCI;
                   3198: 
                   3199:    for (i=0;i<CARD_MODEL_NAMELEN;i++)
                   3200:    {
                   3201:       pAdapterInfo->ai_card_model[i]=' '; /* initialize the ai_card_model */
                   3202:    }
                   3203: 
                   3204:        if(pCurrNvRam){
                   3205:        pAdapterInfo->ai_card_model[0] = '9';
                   3206:                switch(pCurrNvRam->niModel & 0x0f){
                   3207:                        case MODEL_LT:
                   3208:                        pAdapterInfo->ai_card_model[1] = '3';
                   3209:                        pAdapterInfo->ai_card_model[2] = '0';
                   3210:                                break;
                   3211:                        case MODEL_LW:
                   3212:                        pAdapterInfo->ai_card_model[1] = '5';
                   3213:                        pAdapterInfo->ai_card_model[2] = '0';
                   3214:                                break;
                   3215:                        case MODEL_DL:
                   3216:                        pAdapterInfo->ai_card_model[1] = '3';
                   3217:                        pAdapterInfo->ai_card_model[2] = '2';
                   3218:                                break;
                   3219:                        case MODEL_DW:
                   3220:                        pAdapterInfo->ai_card_model[1] = '5';
                   3221:                        pAdapterInfo->ai_card_model[2] = '2';
                   3222:                                break;
                   3223:                }
                   3224:        }else{
                   3225:           temp = utilEERead(ioport, (MODEL_NUMB_0/2));
                   3226:                pAdapterInfo->ai_card_model[0] = (u08bits)(temp >> 8);
                   3227:           temp = utilEERead(ioport, (MODEL_NUMB_2/2));
                   3228: 
                   3229:                pAdapterInfo->ai_card_model[1] = (u08bits)(temp & 0x00FF);
                   3230:           pAdapterInfo->ai_card_model[2] = (u08bits)(temp >> 8);
                   3231:        }
                   3232: 
                   3233: 
                   3234: 
                   3235:    pAdapterInfo->ai_FiberProductType = 0;
                   3236: 
                   3237:    pAdapterInfo->ai_secondary_range = 0;
                   3238: 
                   3239:    for (i=0;i<WORLD_WIDE_NAMELEN;i++)
                   3240:    {
                   3241:       pAdapterInfo->ai_worldwidename[i]='\0';
                   3242:    }
                   3243: 
                   3244:    for (i=0;i<VENDOR_NAMELEN;i++)
                   3245:    {
                   3246:       pAdapterInfo->ai_vendorstring[i]='\0';
                   3247:    }
                   3248:        pAdapterInfo->ai_vendorstring[0]='B';
                   3249:        pAdapterInfo->ai_vendorstring[1]='U';
                   3250:        pAdapterInfo->ai_vendorstring[2]='S';
                   3251:        pAdapterInfo->ai_vendorstring[3]='L';
                   3252:        pAdapterInfo->ai_vendorstring[4]='O';
                   3253:        pAdapterInfo->ai_vendorstring[5]='G';
                   3254:        pAdapterInfo->ai_vendorstring[6]='I';
                   3255:        pAdapterInfo->ai_vendorstring[7]='C';
                   3256: 
                   3257:        for (i=0;i<FAMILY_NAMELEN;i++)
                   3258:        {
                   3259:           pAdapterInfo->ai_AdapterFamilyString[i]='\0';
                   3260:        }
                   3261:        pAdapterInfo->ai_AdapterFamilyString[0]='F';
                   3262:        pAdapterInfo->ai_AdapterFamilyString[1]='L';
                   3263:        pAdapterInfo->ai_AdapterFamilyString[2]='A';
                   3264:        pAdapterInfo->ai_AdapterFamilyString[3]='S';
                   3265:        pAdapterInfo->ai_AdapterFamilyString[4]='H';
                   3266:        pAdapterInfo->ai_AdapterFamilyString[5]='P';
                   3267:        pAdapterInfo->ai_AdapterFamilyString[6]='O';
                   3268:        pAdapterInfo->ai_AdapterFamilyString[7]='I';
                   3269:        pAdapterInfo->ai_AdapterFamilyString[8]='N';
                   3270:        pAdapterInfo->ai_AdapterFamilyString[9]='T';
                   3271: 
                   3272:    ARAM_ACCESS(ioport);
                   3273: 
                   3274:    for ( i = 0; i < 4; i++ ) {
                   3275: 
                   3276:       pAdapterInfo->ai_XlatInfo[i] =
                   3277:          RD_HARPOON(ioport+hp_aramBase+BIOS_DATA_OFFSET+i);
                   3278:       }
                   3279: 
                   3280:        /* return with -1 if no sort, else return with
                   3281:           logical card number sorted by BIOS (zero-based) */
                   3282: 
                   3283: 
                   3284:        pAdapterInfo->ai_relative_cardnum = 
                   3285:       (u08bits)(RD_HARPOON(ioport+hp_aramBase+BIOS_RELATIVE_CARD)-1); 
                   3286: 
                   3287:    SGRAM_ACCESS(ioport);
                   3288: 
                   3289:    s_PhaseTbl[0] = phaseDataOut;
                   3290:    s_PhaseTbl[1] = phaseDataIn;
                   3291:    s_PhaseTbl[2] = phaseIllegal;
                   3292:    s_PhaseTbl[3] = phaseIllegal;
                   3293:    s_PhaseTbl[4] = phaseCommand;
                   3294:    s_PhaseTbl[5] = phaseStatus;
                   3295:    s_PhaseTbl[6] = phaseMsgOut;
                   3296:    s_PhaseTbl[7] = phaseMsgIn;
                   3297: 
                   3298:    pAdapterInfo->ai_present = 0x01;
                   3299: 
                   3300: #if defined(BUGBUG)
                   3301: 
                   3302: 
                   3303:    for (i = 0; i < MAX_CARDS; i++) {
                   3304: 
                   3305:       for (id=0; id<debug_size; id++)
                   3306:          debug_int[i][id] =  (u08bits)0x00;
                   3307:       debug_index[i] = 0;
                   3308:       }
                   3309: 
                   3310: #endif
                   3311: 
                   3312:    return(0);
                   3313: }
                   3314: 
                   3315: 
                   3316: 
                   3317: 
                   3318: 
                   3319: /*---------------------------------------------------------------------
                   3320:  *
                   3321:  * Function: init_adapter, exported to BUDI via UCBMgr_init_adapter entry
                   3322:  *
                   3323:  *
                   3324:  * Description: Setup adapter for normal operation (hard reset).
                   3325:  *
                   3326:  *---------------------------------------------------------------------*/
                   3327: STATIC CARD_HANDLE init_adapter(PADAPTER_INFO pCardInfo)
                   3328: {
                   3329:    PSCCBcard CurrCard;
                   3330:        PNVRamInfo pCurrNvRam;
                   3331:    u08bits i,j,thisCard, ScamFlg;
                   3332:    u16bits temp,sync_bit_map,id;
                   3333:    BASE_PORT ioport;
                   3334: 
                   3335:    ioport = (BASE_PORT)pCardInfo->ai_baseaddr;
                   3336: 
                   3337:    for(thisCard =0; thisCard <= MAX_CARDS; thisCard++) {
                   3338: 
                   3339:       if (thisCard == MAX_CARDS) {
                   3340: 
                   3341:          return(FAILURE);
                   3342:          }
                   3343: 
                   3344:       if (BL_Card[thisCard].ioPort == ioport) {
                   3345: 
                   3346:          CurrCard = &BL_Card[thisCard];
                   3347:          SccbMgrTableInitCard(CurrCard,thisCard);
                   3348:          break;
                   3349:          }
                   3350: 
                   3351:       else if (BL_Card[thisCard].ioPort == 0x00) {
                   3352: 
                   3353:          BL_Card[thisCard].ioPort = ioport;
                   3354:          CurrCard = &BL_Card[thisCard];
                   3355: 
                   3356:                        if(mbCards)
                   3357:                                for(i = 0; i < mbCards; i++){
                   3358:                                        if(CurrCard->ioPort == nvRamInfo[i].niBaseAddr)
                   3359:                                                CurrCard->pNvRamInfo = &nvRamInfo[i];
                   3360:                                }
                   3361:          SccbMgrTableInitCard(CurrCard,thisCard);
                   3362:          CurrCard->cardIndex = thisCard;
                   3363:          CurrCard->cardInfo = pCardInfo;
                   3364: 
                   3365:          break;
                   3366:          }
                   3367:       }
                   3368: 
                   3369:        pCurrNvRam = CurrCard->pNvRamInfo;
                   3370: 
                   3371:    
                   3372:        if(pCurrNvRam){
                   3373:                ScamFlg = pCurrNvRam->niScamConf;
                   3374:        }
                   3375:        else{
                   3376:           ScamFlg = (UCHAR) utilEERead(ioport, SCAM_CONFIG/2);
                   3377:        }
                   3378:        
                   3379: 
                   3380:    BusMasterInit(ioport);
                   3381:    XbowInit(ioport, ScamFlg);
                   3382: 
                   3383: #if defined (NO_BIOS_OPTION)
                   3384: 
                   3385: 
                   3386:    if (DiagXbow(ioport)) return(FAILURE);
                   3387:    if (DiagBusMaster(ioport)) return(FAILURE);
                   3388: 
                   3389: #endif  /* No BIOS Option */
                   3390: 
                   3391:    autoLoadDefaultMap(ioport);
                   3392: 
                   3393: 
                   3394:    for (i = 0,id = 0x01; i != pCardInfo->ai_id; i++,id <<= 1){}
                   3395: 
                   3396:    WR_HARPOON(ioport+hp_selfid_0, id);
                   3397:    WR_HARPOON(ioport+hp_selfid_1, 0x00);
                   3398:    WR_HARPOON(ioport+hp_arb_id, pCardInfo->ai_id);
                   3399:    CurrCard->ourId = (unsigned char) pCardInfo->ai_id;
                   3400: 
                   3401:    i = (u08bits) pCardInfo->ai_stateinfo;
                   3402:    if (i & SCSI_PARITY_ENA)
                   3403:        WR_HARPOON(ioport+hp_portctrl_1,(HOST_MODE8 | CHK_SCSI_P));
                   3404: 
                   3405:    j = (RD_HARPOON(ioport+hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
                   3406:    if (i & LOW_BYTE_TERM_ENA)
                   3407:       j |= SCSI_TERM_ENA_L;
                   3408:    WR_HARPOON(ioport+hp_bm_ctrl, j);
                   3409: 
                   3410:    j = (RD_HARPOON(ioport+hp_ee_ctrl) & ~SCSI_TERM_ENA_H);
                   3411:    if (i & HIGH_BYTE_TERM_ENA)
                   3412:       j |= SCSI_TERM_ENA_H;
                   3413:    WR_HARPOON(ioport+hp_ee_ctrl, j );
                   3414: 
                   3415: 
                   3416:    if (!(pCardInfo->ai_stateinfo & NO_RESET_IN_INIT)) {
                   3417: 
                   3418:       sresb(ioport,thisCard);
                   3419: 
                   3420:          scini(thisCard, (u08bits) pCardInfo->ai_id, 0);
                   3421:       }
                   3422: 
                   3423: 
                   3424: 
                   3425:    if (pCardInfo->ai_stateinfo & SUPRESS_UNDERRRUNS_ENA)
                   3426:       CurrCard->globalFlags |= F_NO_FILTER;
                   3427: 
                   3428:        if(pCurrNvRam){
                   3429:                if(pCurrNvRam->niSysConf & 0x10)
                   3430:                        CurrCard->globalFlags |= F_GREEN_PC;
                   3431:        }
                   3432:        else{
                   3433:           if (utilEERead(ioport, (SYSTEM_CONFIG/2)) & GREEN_PC_ENA)
                   3434:           CurrCard->globalFlags |= F_GREEN_PC;
                   3435:        }
                   3436: 
                   3437:        /* Set global flag to indicate Re-Negotiation to be done on all
                   3438:                ckeck condition */
                   3439:        if(pCurrNvRam){
                   3440:                if(pCurrNvRam->niScsiConf & 0x04)
                   3441:                        CurrCard->globalFlags |= F_DO_RENEGO;
                   3442:        }
                   3443:        else{
                   3444:           if (utilEERead(ioport, (SCSI_CONFIG/2)) & RENEGO_ENA)
                   3445:           CurrCard->globalFlags |= F_DO_RENEGO;
                   3446:        }
                   3447: 
                   3448:        if(pCurrNvRam){
                   3449:                if(pCurrNvRam->niScsiConf & 0x08)
                   3450:                        CurrCard->globalFlags |= F_CONLUN_IO;
                   3451:        }
                   3452:        else{
                   3453:           if (utilEERead(ioport, (SCSI_CONFIG/2)) & CONNIO_ENA)
                   3454:           CurrCard->globalFlags |= F_CONLUN_IO;
                   3455:        }
                   3456: 
                   3457:    temp = pCardInfo->ai_per_targ_no_disc;
                   3458: 
                   3459:    for (i = 0,id = 1; i < MAX_SCSI_TAR; i++, id <<= 1) {
                   3460: 
                   3461:       if (temp & id)
                   3462:          sccbMgrTbl[thisCard][i].TarStatus |= TAR_ALLOW_DISC;
                   3463:       }
                   3464: 
                   3465:    sync_bit_map = 0x0001;
                   3466: 
                   3467:    for (id = 0; id < (MAX_SCSI_TAR/2); id++){
                   3468: 
                   3469:                if(pCurrNvRam){
                   3470:                        temp = (USHORT) pCurrNvRam->niSyncTbl[id];
                   3471:                        temp = ((temp & 0x03) + ((temp << 4) & 0xc0)) +
                   3472:                                         (((temp << 4) & 0x0300) + ((temp << 8) & 0xc000));
                   3473:                }else
                   3474:              temp = utilEERead(ioport, (u16bits)((SYNC_RATE_TBL/2)+id));
                   3475: 
                   3476:       for (i = 0; i < 2; temp >>=8,i++){
                   3477: 
                   3478:          if (pCardInfo->ai_per_targ_init_sync & sync_bit_map){
                   3479: 
                   3480:             sccbMgrTbl[thisCard][id*2+i].TarEEValue = (u08bits)temp;
                   3481:             }
                   3482: 
                   3483:          else {
                   3484:             sccbMgrTbl[thisCard][id*2+i].TarStatus |= SYNC_SUPPORTED;
                   3485:             sccbMgrTbl[thisCard][id*2+i].TarEEValue =
                   3486:                (u08bits)(temp & ~EE_SYNC_MASK);
                   3487:             }
                   3488: 
                   3489: #if defined(WIDE_SCSI)
                   3490: /*         if ((pCardInfo->ai_per_targ_wide_nego & sync_bit_map) ||
                   3491:             (id*2+i >= 8)){
                   3492: */
                   3493:          if (pCardInfo->ai_per_targ_wide_nego & sync_bit_map){
                   3494: 
                   3495:             sccbMgrTbl[thisCard][id*2+i].TarEEValue |= EE_WIDE_SCSI;
                   3496: 
                   3497:             }
                   3498: 
                   3499:          else { /* NARROW SCSI */
                   3500:             sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
                   3501:             }
                   3502: 
                   3503: #else
                   3504:          sccbMgrTbl[thisCard][id*2+i].TarStatus |= WIDE_NEGOCIATED;
                   3505: #endif
                   3506: 
                   3507: 
                   3508:          sync_bit_map <<= 1;
                   3509:          }
                   3510:       }
                   3511: 
                   3512: 
                   3513:    pCardInfo->ai_SGListFormat=0x01;
                   3514:    pCardInfo->ai_DataPtrFormat=0x01;
                   3515:    pCardInfo->ai_AEN_mask &= SCSI_RESET_COMPLETE;
                   3516: 
                   3517:    WR_HARPOON((ioport+hp_semaphore),
                   3518:       (u08bits)(RD_HARPOON((ioport+hp_semaphore)) | SCCB_MGR_PRESENT));
                   3519: 
                   3520:    return((u32bits)CurrCard);
                   3521: 
                   3522: }
                   3523: 
                   3524: 
                   3525: /*---------------------------------------------------------------------
                   3526:  *
                   3527:  * Function: build_ucb, exported to BUDI via UCBMgr_build_ucb entry
                   3528:  *
                   3529:  * Description: prepare fw portion of ucb. do not start, resource not guaranteed
                   3530:  *             so don't manipulate anything that's derived from states which
                   3531:  *             may change
                   3532:  *
                   3533:  *---------------------------------------------------------------------*/
                   3534: void build_UCB(CARD_HANDLE pCurrCard, PUCB p_ucb)
                   3535: {
                   3536: 
                   3537:    u08bits thisCard;
                   3538:    u08bits i,j;
                   3539: 
                   3540:    PSCCB p_sccb;
                   3541: 
                   3542: 
                   3543:    thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
                   3544: 
                   3545: 
                   3546:    p_sccb=(PSCCB)p_ucb->UCB_MgrPrivatePtr;
                   3547: 
                   3548: 
                   3549:    p_sccb->Sccb_ucb_ptr=p_ucb;
                   3550: 
                   3551:    switch (p_ucb->UCB_opcode & (OPC_DEVICE_RESET+OPC_XFER_SG+OPC_CHK_RESIDUAL))
                   3552:    {
                   3553:       case OPC_DEVICE_RESET:
                   3554:          p_sccb->OperationCode=RESET_COMMAND;
                   3555:          break;
                   3556:       case OPC_XFER_SG:
                   3557:          p_sccb->OperationCode=SCATTER_GATHER_COMMAND;
                   3558:          break;
                   3559:       case OPC_XFER_SG+OPC_CHK_RESIDUAL:
                   3560:          p_sccb->OperationCode=RESIDUAL_SG_COMMAND;
                   3561:          break;
                   3562:       case OPC_CHK_RESIDUAL:
                   3563: 
                   3564:              p_sccb->OperationCode=RESIDUAL_COMMAND;
                   3565:              break;
                   3566:       default:
                   3567:              p_sccb->OperationCode=SCSI_INITIATOR_COMMAND;
                   3568:              break;
                   3569:    }
                   3570: 
                   3571:    if (p_ucb->UCB_opcode & OPC_TQ_ENABLE)
                   3572:    {
                   3573:       p_sccb->ControlByte = (u08bits)((p_ucb->UCB_opcode & OPC_TQ_MASK)>>2) | F_USE_CMD_Q;
                   3574:    }
                   3575:    else
                   3576:    {
                   3577:       p_sccb->ControlByte = 0;
                   3578:    }
                   3579: 
                   3580: 
                   3581:    p_sccb->CdbLength = (u08bits)p_ucb->UCB_cdblen;
                   3582: 
                   3583:    if (p_ucb->UCB_opcode & OPC_NO_AUTO_SENSE)
                   3584:    {
                   3585:       p_sccb->RequestSenseLength = 0;
                   3586:    }
                   3587:    else
                   3588:    {
                   3589:       p_sccb->RequestSenseLength = (unsigned char) p_ucb->UCB_senselen;
                   3590:    }
                   3591: 
                   3592: 
                   3593:    if (p_ucb->UCB_opcode & OPC_XFER_SG)
                   3594:    {
                   3595:       p_sccb->DataPointer=p_ucb->UCB_virt_dataptr;
                   3596:       p_sccb->DataLength = (((u32bits)p_ucb->UCB_NumSgElements)<<3);
                   3597:    }
                   3598:    else
                   3599:    {
                   3600:       p_sccb->DataPointer=p_ucb->UCB_phys_dataptr;
                   3601:       p_sccb->DataLength=p_ucb->UCB_datalen;
                   3602:    };
                   3603: 
                   3604:    p_sccb->HostStatus=0;
                   3605:    p_sccb->TargetStatus=0;
                   3606:    p_sccb->TargID=(unsigned char)p_ucb->UCB_targid;
                   3607:    p_sccb->Lun=(unsigned char) p_ucb->UCB_lun;
                   3608:    p_sccb->SccbIOPort=((PSCCBcard)pCurrCard)->ioPort;
                   3609: 
                   3610:    j=p_ucb->UCB_cdblen;
                   3611:    for (i=0;i<j;i++)
                   3612:    {
                   3613:       p_sccb->Cdb[i] = p_ucb->UCB_cdb[i];
                   3614:    }
                   3615: 
                   3616:    p_sccb->SensePointer=p_ucb->UCB_phys_senseptr;
                   3617: 
                   3618:    sinits(p_sccb,thisCard);
                   3619: 
                   3620: }
                   3621: #ifndef NO_IOCTLS
                   3622: 
                   3623: /*---------------------------------------------------------------------
                   3624:  *
                   3625:  * Function: GetDevSyncRate
                   3626:  *
                   3627:  *---------------------------------------------------------------------*/
                   3628: STATIC  int GetDevSyncRate(PSCCBcard pCurrCard,PUCB p_ucb)
                   3629: {
                   3630:        struct _SYNC_RATE_INFO * pSyncStr;
                   3631:    PSCCBMgr_tar_info currTar_Info;
                   3632:        BASE_PORT ioport;
                   3633:        u08bits scsiID, j;
                   3634: 
                   3635: #if (FW_TYPE != _SCCB_MGR_)
                   3636:        if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
                   3637:        {
                   3638:                return(1);
                   3639:        }
                   3640: #endif
                   3641: 
                   3642:        ioport  = pCurrCard->ioPort;
                   3643:        pSyncStr        = (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
                   3644:        scsiID = (u08bits) p_ucb->UCB_targid;
                   3645:    currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
                   3646:        j = currTar_Info->TarSyncCtrl;
                   3647: 
                   3648:        switch (currTar_Info->TarEEValue & EE_SYNC_MASK)
                   3649:        {
                   3650:                case EE_SYNC_ASYNC:
                   3651:                        pSyncStr->RequestMegaXferRate = 0x00;
                   3652:                        break;
                   3653:                case EE_SYNC_5MB:
                   3654:                        pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
                   3655:                        break;
                   3656:                case EE_SYNC_10MB:
                   3657:                        pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
                   3658:                        break;
                   3659:                case EE_SYNC_20MB:
                   3660:                        pSyncStr->RequestMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
                   3661:                        break;
                   3662:        }
                   3663: 
                   3664:        switch ((j >> 5) & 0x07)
                   3665:        {
                   3666:                case 0x00:
                   3667:                        if((j & 0x07) == 0x00)
                   3668:                        {
                   3669:                                pSyncStr->ActualMegaXferRate = 0x00;    /* Async Mode */
                   3670:                        }
                   3671:                        else
                   3672:                        {
                   3673:                                pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 200 : 400;
                   3674:                        }
                   3675:                        break;
                   3676:                case 0x01:
                   3677:                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 100 : 200;
                   3678:                        break;
                   3679:                case 0x02:
                   3680:                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 66 : 122;
                   3681:                        break;
                   3682:                case 0x03:
                   3683:                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 50 : 100;
                   3684:                        break;
                   3685:                case 0x04:
                   3686:                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 40 : 80;
                   3687:                        break;
                   3688:                case 0x05:
                   3689:                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 33 : 66;
                   3690:                        break;
                   3691:                case 0x06:
                   3692:                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 28 : 56;
                   3693:                        break;
                   3694:                case 0x07:
                   3695:                        pSyncStr->ActualMegaXferRate = (j & NARROW_SCSI) ? 25 : 50;
                   3696:                        break;
                   3697:        }
                   3698:        pSyncStr->NegotiatedOffset = j & 0x0f;
                   3699: 
                   3700:        return(0);
                   3701: }
                   3702: 
                   3703: /*---------------------------------------------------------------------
                   3704:  *
                   3705:  * Function: SetDevSyncRate
                   3706:  *
                   3707:  *---------------------------------------------------------------------*/
                   3708: STATIC int SetDevSyncRate(PSCCBcard pCurrCard, PUCB p_ucb)
                   3709: {
                   3710:        struct _SYNC_RATE_INFO * pSyncStr;
                   3711:    PSCCBMgr_tar_info currTar_Info;
                   3712:        BASE_PORT ioPort;
                   3713:        u08bits scsiID, i, j, syncVal;
                   3714:        u16bits syncOffset, actualXferRate;
                   3715:        union {
                   3716:                u08bits tempb[2];
                   3717:                u16bits tempw;
                   3718:        }temp2;
                   3719: 
                   3720: #if (FW_TYPE != _SCCB_MGR_)
                   3721:        if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
                   3722:        {
                   3723:                return(1);
                   3724:        }
                   3725: #endif
                   3726: 
                   3727:        ioPort  = pCurrCard->ioPort;
                   3728:        pSyncStr        = (struct _SYNC_RATE_INFO *) p_ucb->UCB_virt_dataptr;
                   3729:        scsiID = (u08bits) p_ucb->UCB_targid;
                   3730:    currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
                   3731:        i = RD_HARPOON(ioPort+hp_xfer_pad);             /* Save current value */
                   3732:        WR_HARPOON(ioPort+hp_xfer_pad, (i | ID_UNLOCK));
                   3733:        WR_HARPOON(ioPort+hp_select_id, ((scsiID << 4) | scsiID));
                   3734:        j = RD_HARPOON(ioPort+hp_synctarg_0);
                   3735:        WR_HARPOON(ioPort+hp_xfer_pad, i);              /* restore value */
                   3736: 
                   3737:        actualXferRate = pSyncStr->ActualMegaXferRate;
                   3738:        if(!(j & NARROW_SCSI))
                   3739:        {
                   3740:                actualXferRate <<= 1;
                   3741:        }
                   3742:        if(actualXferRate == 0x00)
                   3743:        {
                   3744:                syncVal = EE_SYNC_ASYNC;                        /* Async Mode */
                   3745:        }
                   3746:        if(actualXferRate == 0x0200)
                   3747:        {
                   3748:                syncVal = EE_SYNC_20MB;                         /* 20/40 MB Mode */
                   3749:        }
                   3750:        if(actualXferRate > 0x0050 && actualXferRate < 0x0200 )
                   3751:        {
                   3752:                syncVal = EE_SYNC_10MB;                         /* 10/20 MB Mode */
                   3753:        }
                   3754:        else
                   3755:        {
                   3756:                syncVal = EE_SYNC_5MB;                          /* 5/10 MB Mode */
                   3757:        }
                   3758:        if(currTar_Info->TarEEValue && EE_SYNC_MASK == syncVal)
                   3759:                return(0);
                   3760:        currTar_Info->TarEEValue = (currTar_Info->TarEEValue & !EE_SYNC_MASK)
                   3761:                                                                                        | syncVal;
                   3762:        syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
                   3763:        temp2.tempw = utilEERead(ioPort, syncOffset);
                   3764:        if(scsiID & 0x01)
                   3765:        {
                   3766:                temp2.tempb[0] = (temp2.tempb[0] & !EE_SYNC_MASK) | syncVal;
                   3767:        }
                   3768:        else
                   3769:        {
                   3770:                temp2.tempb[1] = (temp2.tempb[1] & !EE_SYNC_MASK) | syncVal;
                   3771:        }
                   3772:        utilEEWriteOnOff(ioPort, 1);
                   3773:        utilEEWrite(ioPort, temp2.tempw, syncOffset);
                   3774:        utilEEWriteOnOff(ioPort, 0);
                   3775:        UpdateCheckSum(ioPort);
                   3776: 
                   3777:        return(0);
                   3778: }
                   3779: /*---------------------------------------------------------------------
                   3780:  *
                   3781:  * Function: GetDevWideMode
                   3782:  *
                   3783:  *---------------------------------------------------------------------*/
                   3784: int GetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
                   3785: {
                   3786:        u08bits *pData;
                   3787: 
                   3788:        pData = (u08bits *)p_ucb->UCB_virt_dataptr;
                   3789:        if(sccbMgrTbl[pCurrCard->cardIndex][p_ucb->UCB_targid].TarEEValue
                   3790:                                & EE_WIDE_SCSI)
                   3791:        {
                   3792:                *pData = 1;
                   3793:        }
                   3794:        else
                   3795:        {
                   3796:                *pData = 0;
                   3797:        }
                   3798: 
                   3799:        return(0);
                   3800: }
                   3801: 
                   3802: /*---------------------------------------------------------------------
                   3803:  *
                   3804:  * Function: SetDevWideMode
                   3805:  *
                   3806:  *---------------------------------------------------------------------*/
                   3807: int SetDevWideMode(PSCCBcard pCurrCard,PUCB p_ucb)
                   3808: {
                   3809:        u08bits *pData;
                   3810:    PSCCBMgr_tar_info currTar_Info;
                   3811:        BASE_PORT ioPort;
                   3812:        u08bits scsiID, scsiWideMode;
                   3813:        u16bits syncOffset;
                   3814:        union {
                   3815:                u08bits tempb[2];
                   3816:                u16bits tempw;
                   3817:        }temp2;
                   3818: 
                   3819: #if (FW_TYPE != _SCCB_MGR_)
                   3820:        if( !(pCurrCard->cardInfo->ai_attributes & WIDE_CAPABLE) )
                   3821:        {
                   3822:                return(1);
                   3823:        }
                   3824: 
                   3825:        if( p_ucb->UCB_targid >= pCurrCard->cardInfo->ai_MaxTarg )
                   3826:        {
                   3827:                return(1);
                   3828:        }
                   3829: #endif
                   3830: 
                   3831:        ioPort  = pCurrCard->ioPort;
                   3832:        pData = (u08bits *)p_ucb->UCB_virt_dataptr;
                   3833:        scsiID = (u08bits) p_ucb->UCB_targid;
                   3834:        currTar_Info = &sccbMgrTbl[pCurrCard->cardIndex][scsiID];
                   3835: 
                   3836:        if(*pData)
                   3837:        {
                   3838:                if(currTar_Info->TarEEValue & EE_WIDE_SCSI)
                   3839:                {
                   3840:                        return(0);
                   3841:                }
                   3842:                else
                   3843:                {
                   3844:                        scsiWideMode = EE_WIDE_SCSI;
                   3845:                }
                   3846:        }
                   3847:        else
                   3848:        {
                   3849:                if(!currTar_Info->TarEEValue & EE_WIDE_SCSI)
                   3850:                {
                   3851:                        return(0);
                   3852:                }
                   3853:                else
                   3854:                {
                   3855:                        scsiWideMode = 0;
                   3856:                }
                   3857:        }
                   3858:        currTar_Info->TarEEValue = (currTar_Info->TarEEValue & !EE_WIDE_SCSI)
                   3859:                                                                                        | scsiWideMode;
                   3860: 
                   3861:        syncOffset = (SYNC_RATE_TBL + scsiID) / 2;
                   3862:        temp2.tempw = utilEERead(ioPort, syncOffset);
                   3863:        if(scsiID & 0x01)
                   3864:        {
                   3865:                temp2.tempb[0] = (temp2.tempb[0] & !EE_WIDE_SCSI) | scsiWideMode;
                   3866:        }
                   3867:        else
                   3868:        {
                   3869:                temp2.tempb[1] = (temp2.tempb[1] & !EE_WIDE_SCSI) | scsiWideMode;
                   3870:        }
                   3871:        utilEEWriteOnOff(ioPort, 1);
                   3872:        utilEEWrite(ioPort, temp2.tempw, syncOffset);
                   3873:        utilEEWriteOnOff(ioPort, 0);
                   3874:        UpdateCheckSum(ioPort);
                   3875: 
                   3876:        return(0);
                   3877: }
                   3878: 
                   3879: /*---------------------------------------------------------------------
                   3880:  *
                   3881:  * Function: ReadNVRam
                   3882:  *
                   3883:  *---------------------------------------------------------------------*/
                   3884: void ReadNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
                   3885: {
                   3886:        u08bits *pdata;
                   3887:        u16bits i,numwrds,numbytes,offset,temp;
                   3888:        u08bits OneMore = FALSE;
                   3889: #if defined(DOS)
                   3890:        u16bits ioport;
                   3891: #else
                   3892:        u32bits ioport;
                   3893: #endif
                   3894: 
                   3895:        numbytes = (u16bits) p_ucb->UCB_datalen;
                   3896:        ioport  = pCurrCard->ioPort;
                   3897:    pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
                   3898:        offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
                   3899: 
                   3900: 
                   3901: 
                   3902:    if (offset & 0x1)
                   3903:        {
                   3904:            *((u16bits*) pdata) = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
                   3905:                 *pdata = *(pdata + 1);
                   3906:                 ++offset;
                   3907:         ++pdata;
                   3908:                 --numbytes;
                   3909:        }
                   3910: 
                   3911:        numwrds = numbytes / 2;
                   3912:        if (numbytes & 1)
                   3913:                OneMore = TRUE;
                   3914: 
                   3915:        for (i = 0; i < numwrds; i++)
                   3916:        {
                   3917:        *((u16bits*) pdata) = utilEERead(ioport,(u16bits)(offset / 2));
                   3918:                pdata += 2;
                   3919:                offset += 2;
                   3920:    }
                   3921:        if (OneMore)
                   3922:        {
                   3923:                --pdata;
                   3924:                -- offset;
                   3925:        temp = utilEERead(ioport,(u16bits)(offset / 2));
                   3926:                *pdata = (u08bits) (temp);
                   3927:        }
                   3928: 
                   3929: } /* end proc ReadNVRam */
                   3930: 
                   3931: 
                   3932: /*---------------------------------------------------------------------
                   3933:  *
                   3934:  * Function: WriteNVRam
                   3935:  *
                   3936:  *---------------------------------------------------------------------*/
                   3937: void WriteNVRam(PSCCBcard pCurrCard,PUCB p_ucb)
                   3938: {
                   3939:        u08bits *pdata;
                   3940:        u16bits i,numwrds,numbytes,offset, eeprom_end;
                   3941:        u08bits OneMore = FALSE;
                   3942:        union {
                   3943:                u08bits  tempb[2];
                   3944:                u16bits  tempw;
                   3945:        } temp2;
                   3946: 
                   3947: #if defined(DOS)
                   3948:        u16bits ioport;
                   3949: #else
                   3950:        u32bits ioport;
                   3951: #endif
                   3952: 
                   3953:        numbytes = (u16bits) p_ucb->UCB_datalen;
                   3954:        ioport  = pCurrCard->ioPort;
                   3955:    pdata   = (u08bits *) p_ucb->UCB_virt_dataptr;
                   3956:        offset  = (u16bits) (p_ucb->UCB_IOCTLParams[0]);
                   3957: 
                   3958:    if (RD_HARPOON(ioport+hp_page_ctrl) & NARROW_SCSI_CARD)
                   3959:       eeprom_end = 512;
                   3960:    else
                   3961:       eeprom_end = 768;
                   3962:        
                   3963:        if(offset > eeprom_end)
                   3964:                return;
                   3965: 
                   3966:        if((offset + numbytes) > eeprom_end)
                   3967:                numbytes = eeprom_end - offset;
                   3968: 
                   3969:     utilEEWriteOnOff(ioport,1);   /* Enable write access to the EEPROM */
                   3970: 
                   3971: 
                   3972: 
                   3973:    if (offset & 0x1)
                   3974:        {
                   3975:            temp2.tempw = utilEERead(ioport,(u16bits)((offset - 1) / 2)); /* 16 bit read */
                   3976:                 temp2.tempb[1] = *pdata;
                   3977:            utilEEWrite(ioport, temp2.tempw, (u16bits)((offset -1) / 2));
                   3978:                 *pdata = *(pdata + 1);
                   3979:                 ++offset;
                   3980:         ++pdata;
                   3981:                 --numbytes;
                   3982:        }
                   3983: 
                   3984:        numwrds = numbytes / 2;
                   3985:        if (numbytes & 1)
                   3986:                OneMore = TRUE;
                   3987: 
                   3988:        for (i = 0; i < numwrds; i++)
                   3989:        {
                   3990:        utilEEWrite(ioport, *((pu16bits)pdata),(u16bits)(offset / 2));
                   3991:                pdata += 2;
                   3992:                offset += 2;
                   3993:    }
                   3994:        if (OneMore)
                   3995:        {
                   3996: 
                   3997:        temp2.tempw = utilEERead(ioport,(u16bits)(offset / 2));
                   3998:                temp2.tempb[0] = *pdata;
                   3999:        utilEEWrite(ioport, temp2.tempw, (u16bits)(offset / 2));
                   4000:        }
                   4001:    utilEEWriteOnOff(ioport,0);   /* Turn off write access */
                   4002:    UpdateCheckSum((u32bits)ioport);
                   4003: 
                   4004: } /* end proc WriteNVRam */
                   4005: 
                   4006: 
                   4007: 
                   4008: /*---------------------------------------------------------------------
                   4009:  *
                   4010:  * Function: UpdateCheckSum
                   4011:  *
                   4012:  * Description: Update Check Sum in EEPROM
                   4013:  *
                   4014:  *---------------------------------------------------------------------*/
                   4015: 
                   4016: 
                   4017: void UpdateCheckSum(u32bits baseport)
                   4018: {
                   4019:        USHORT i,sum_data, eeprom_end;
                   4020: 
                   4021:        sum_data = 0x0000;
                   4022: 
                   4023: 
                   4024:    if (RD_HARPOON(baseport+hp_page_ctrl) & NARROW_SCSI_CARD)
                   4025:       eeprom_end = 512;
                   4026:    else
                   4027:       eeprom_end = 768;
                   4028: 
                   4029:        for (i = 1; i < eeprom_end/2; i++)
                   4030:        {
                   4031:                sum_data += utilEERead(baseport, i);
                   4032:        }
                   4033: 
                   4034:    utilEEWriteOnOff(baseport,1);   /* Enable write access to the EEPROM */
                   4035: 
                   4036:    utilEEWrite(baseport, sum_data, EEPROM_CHECK_SUM/2);
                   4037:    utilEEWriteOnOff(baseport,0);   /* Turn off write access */
                   4038: }
                   4039: 
                   4040: void SccbMgr_save_foreign_state(PADAPTER_INFO pAdapterInfo)
                   4041: {
                   4042: }
                   4043: 
                   4044: 
                   4045: void SccbMgr_restore_foreign_state(CARD_HANDLE pCurrCard)
                   4046: {
                   4047: }
                   4048: 
                   4049: void SccbMgr_restore_native_state(CARD_HANDLE pCurrCard)
                   4050: {
                   4051: }
                   4052: 
                   4053: #endif /* NO_IOCTLS */
                   4054: 
                   4055: #endif /* (FW_TYPE==_UCB_MGR_)   */
                   4056: 
                   4057: #ifndef NO_IOCTLS
                   4058: #if (FW_TYPE==_UCB_MGR_)
                   4059: void SccbMgr_unload_card(CARD_HANDLE pCurrCard)
                   4060: #else
                   4061: #if defined(DOS)
                   4062: void SccbMgr_unload_card(USHORT pCurrCard)
                   4063: #else
                   4064: void SccbMgr_unload_card(ULONG pCurrCard)
                   4065: #endif
                   4066: #endif
                   4067: {
                   4068:        UCHAR i;
                   4069: #if defined(DOS)
                   4070:        USHORT portBase;
                   4071:        USHORT regOffset;
                   4072: #else
                   4073:        ULONG portBase;
                   4074:        ULONG regOffset;
                   4075: #endif
                   4076:        ULONG scamData;
                   4077: #if defined(OS2)
                   4078:        ULONG far *pScamTbl;
                   4079: #else
                   4080:        ULONG *pScamTbl;
                   4081: #endif
                   4082:        PNVRamInfo pCurrNvRam;
                   4083: 
                   4084:        pCurrNvRam = ((PSCCBcard)pCurrCard)->pNvRamInfo;
                   4085: 
                   4086:        if(pCurrNvRam){
                   4087:                WrStack(pCurrNvRam->niBaseAddr, 0, pCurrNvRam->niModel);
                   4088:                WrStack(pCurrNvRam->niBaseAddr, 1, pCurrNvRam->niSysConf);
                   4089:                WrStack(pCurrNvRam->niBaseAddr, 2, pCurrNvRam->niScsiConf);
                   4090:                WrStack(pCurrNvRam->niBaseAddr, 3, pCurrNvRam->niScamConf);
                   4091:                WrStack(pCurrNvRam->niBaseAddr, 4, pCurrNvRam->niAdapId);
                   4092: 
                   4093:                for(i = 0; i < MAX_SCSI_TAR / 2; i++)
                   4094:                        WrStack(pCurrNvRam->niBaseAddr, (UCHAR)(i+5), pCurrNvRam->niSyncTbl[i]);
                   4095: 
                   4096:                portBase = pCurrNvRam->niBaseAddr;
                   4097: 
                   4098:                for(i = 0; i < MAX_SCSI_TAR; i++){
                   4099:                        regOffset = hp_aramBase + 64 + i*4;
                   4100: #if defined(OS2)
                   4101:                        pScamTbl = (ULONG far *) &pCurrNvRam->niScamTbl[i];
                   4102: #else
                   4103:                        pScamTbl = (ULONG *) &pCurrNvRam->niScamTbl[i];
                   4104: #endif
                   4105:                        scamData = *pScamTbl;
                   4106:                        WR_HARP32(portBase, regOffset, scamData);
                   4107:                }
                   4108: 
                   4109:        }else{
                   4110:                WrStack(((PSCCBcard)pCurrCard)->ioPort, 0, 0);
                   4111:        }
                   4112: }
                   4113: #endif /* NO_IOCTLS */
                   4114: 
                   4115: 
                   4116: void RNVRamData(PNVRamInfo pNvRamInfo)
                   4117: {
                   4118:        UCHAR i;
                   4119: #if defined(DOS)
                   4120:        USHORT portBase;
                   4121:        USHORT regOffset;
                   4122: #else
                   4123:        ULONG portBase;
                   4124:        ULONG regOffset;
                   4125: #endif
                   4126:        ULONG scamData;
                   4127: #if defined (OS2)
                   4128:        ULONG far *pScamTbl;
                   4129: #else
                   4130:        ULONG *pScamTbl;
                   4131: #endif
                   4132: 
                   4133:        pNvRamInfo->niModel    = RdStack(pNvRamInfo->niBaseAddr, 0);
                   4134:        pNvRamInfo->niSysConf  = RdStack(pNvRamInfo->niBaseAddr, 1);
                   4135:        pNvRamInfo->niScsiConf = RdStack(pNvRamInfo->niBaseAddr, 2);
                   4136:        pNvRamInfo->niScamConf = RdStack(pNvRamInfo->niBaseAddr, 3);
                   4137:        pNvRamInfo->niAdapId   = RdStack(pNvRamInfo->niBaseAddr, 4);
                   4138: 
                   4139:        for(i = 0; i < MAX_SCSI_TAR / 2; i++)
                   4140:                pNvRamInfo->niSyncTbl[i] = RdStack(pNvRamInfo->niBaseAddr, (UCHAR)(i+5));
                   4141: 
                   4142:        portBase = pNvRamInfo->niBaseAddr;
                   4143: 
                   4144:        for(i = 0; i < MAX_SCSI_TAR; i++){
                   4145:                regOffset = hp_aramBase + 64 + i*4;
                   4146:                RD_HARP32(portBase, regOffset, scamData);
                   4147: #if defined(OS2)
                   4148:                pScamTbl = (ULONG far *) &pNvRamInfo->niScamTbl[i];
                   4149: #else
                   4150:                pScamTbl = (ULONG *) &pNvRamInfo->niScamTbl[i];
                   4151: #endif
                   4152:                *pScamTbl = scamData;
                   4153:        }
                   4154: 
                   4155: }
                   4156: 
                   4157: #if defined(DOS)
                   4158: UCHAR RdStack(USHORT portBase, UCHAR index)
                   4159: #else
                   4160: UCHAR RdStack(ULONG portBase, UCHAR index)
                   4161: #endif
                   4162: {
                   4163:        WR_HARPOON(portBase + hp_stack_addr, index);
                   4164:        return(RD_HARPOON(portBase + hp_stack_data));
                   4165: }
                   4166: 
                   4167: #if defined(DOS)
                   4168: void WrStack(USHORT portBase, UCHAR index, UCHAR data)
                   4169: #else
                   4170: void WrStack(ULONG portBase, UCHAR index, UCHAR data)
                   4171: #endif
                   4172: {
                   4173:        WR_HARPOON(portBase + hp_stack_addr, index);
                   4174:        WR_HARPOON(portBase + hp_stack_data, data);
                   4175: }
                   4176: 
                   4177: 
                   4178: #if (FW_TYPE==_UCB_MGR_)
                   4179: u08bits ChkIfChipInitialized(BASE_PORT ioPort)
                   4180: #else
                   4181: #if defined(DOS)
                   4182: UCHAR ChkIfChipInitialized(USHORT ioPort)
                   4183: #else
                   4184: UCHAR ChkIfChipInitialized(ULONG ioPort)
                   4185: #endif
                   4186: #endif
                   4187: {
                   4188:        if((RD_HARPOON(ioPort + hp_arb_id) & 0x0f) != RdStack(ioPort, 4))
                   4189:                return(FALSE);
                   4190:        if((RD_HARPOON(ioPort + hp_clkctrl_0) & CLKCTRL_DEFAULT)
                   4191:                                                                != CLKCTRL_DEFAULT)
                   4192:                return(FALSE);
                   4193:        if((RD_HARPOON(ioPort + hp_seltimeout) == TO_250ms) ||
                   4194:                (RD_HARPOON(ioPort + hp_seltimeout) == TO_290ms))
                   4195:                return(TRUE);
                   4196:        return(FALSE);
                   4197: 
                   4198: }
                   4199: /*---------------------------------------------------------------------
                   4200:  *
                   4201:  * Function: SccbMgr_start_sccb
                   4202:  *
                   4203:  * Description: Start a command pointed to by p_Sccb. When the
                   4204:  *              command is completed it will be returned via the
                   4205:  *              callback function.
                   4206:  *
                   4207:  *---------------------------------------------------------------------*/
                   4208: #if (FW_TYPE==_UCB_MGR_)
                   4209: void SccbMgr_start_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb)
                   4210: #else
                   4211: #if defined(DOS)
                   4212: void SccbMgr_start_sccb(USHORT pCurrCard, PSCCB p_Sccb)
                   4213: #else
                   4214: void SccbMgr_start_sccb(ULONG pCurrCard, PSCCB p_Sccb)
                   4215: #endif
                   4216: #endif
                   4217: {
                   4218: #if defined(DOS)
                   4219:    USHORT ioport;
                   4220: #else
                   4221:    ULONG ioport;
                   4222: #endif
                   4223:    UCHAR thisCard, lun;
                   4224:        PSCCB pSaveSccb;
                   4225:    CALL_BK_FN callback;
                   4226: 
                   4227: #if (FW_TYPE==_UCB_MGR_)
                   4228:    PSCCB p_Sccb;
                   4229: #endif
                   4230: 
                   4231:    mOS_Lock((PSCCBcard)pCurrCard);
                   4232:    thisCard = ((PSCCBcard) pCurrCard)->cardIndex;
                   4233:    ioport = ((PSCCBcard) pCurrCard)->ioPort;
                   4234: 
                   4235: #if (FW_TYPE==_UCB_MGR_)
                   4236:    p_Sccb = (PSCCB)p_ucb->UCB_MgrPrivatePtr;
                   4237: #endif
                   4238: 
                   4239:        if((p_Sccb->TargID > MAX_SCSI_TAR) || (p_Sccb->Lun > MAX_LUN))
                   4240:        {
                   4241: 
                   4242: #if (FW_TYPE==_UCB_MGR_)
                   4243:                p_ucb->UCB_hbastat = SCCB_COMPLETE;
                   4244:                p_ucb->UCB_status=SCCB_ERROR;
                   4245:                callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4246:                if (callback)
                   4247:                        callback(p_ucb);
                   4248: #endif
                   4249: 
                   4250: #if (FW_TYPE==_SCCB_MGR_)
                   4251:                p_Sccb->HostStatus = SCCB_COMPLETE;
                   4252:                p_Sccb->SccbStatus = SCCB_ERROR;
                   4253:                callback = (CALL_BK_FN)p_Sccb->SccbCallback;
                   4254:                if (callback)
                   4255:                        callback(p_Sccb);
                   4256: #endif
                   4257: 
                   4258:                mOS_UnLock((PSCCBcard)pCurrCard);
                   4259:                return;
                   4260:        }
                   4261: 
                   4262: #if (FW_TYPE==_SCCB_MGR_)
                   4263:    sinits(p_Sccb,thisCard);
                   4264: #endif
                   4265: 
                   4266: 
                   4267: #if (FW_TYPE==_UCB_MGR_)
                   4268: #ifndef NO_IOCTLS
                   4269: 
                   4270:    if (p_ucb->UCB_opcode & OPC_IOCTL)
                   4271:        {
                   4272: 
                   4273:                switch (p_ucb->UCB_IOCTLCommand) 
                   4274:                {
                   4275:                        case READ_NVRAM:
                   4276:                                ReadNVRam((PSCCBcard)pCurrCard,p_ucb);
                   4277:                                p_ucb->UCB_status=UCB_SUCCESS;
                   4278:                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4279:                                if (callback)
                   4280:                                        callback(p_ucb);
                   4281:                                mOS_UnLock((PSCCBcard)pCurrCard);
                   4282:                                return;
                   4283: 
                   4284:                        case WRITE_NVRAM:
                   4285:                                WriteNVRam((PSCCBcard)pCurrCard,p_ucb);
                   4286:                                p_ucb->UCB_status=UCB_SUCCESS;
                   4287:                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4288:                                if (callback)
                   4289:                                        callback(p_ucb);
                   4290:                                mOS_UnLock((PSCCBcard)pCurrCard);
                   4291:                                return;
                   4292: 
                   4293:                        case SEND_SCSI_PASSTHRU:
                   4294: #if (FW_TYPE != _SCCB_MGR_)
                   4295:                                if( p_ucb->UCB_targid >=
                   4296:                                    ((PSCCBcard)pCurrCard)->cardInfo->ai_MaxTarg )
                   4297:                                {
                   4298:                                        p_ucb->UCB_status = UCB_ERROR;
                   4299:                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
                   4300:                                        callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4301:                                        if (callback)
                   4302:                                                callback(p_ucb);
                   4303:                                        mOS_UnLock((PSCCBcard)pCurrCard);
                   4304:                                        return;
                   4305:                                }
                   4306: #endif
                   4307:                                break;
                   4308: 
                   4309:                        case HARD_RESET:
                   4310:                                p_ucb->UCB_status = UCB_INVALID;
                   4311:                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4312:                                if (callback)
                   4313:                                        callback(p_ucb);
                   4314:                                mOS_UnLock((PSCCBcard)pCurrCard);
                   4315:                                return;
                   4316:                        case GET_DEVICE_SYNCRATE:
                   4317:                                if( !GetDevSyncRate((PSCCBcard)pCurrCard,p_ucb) )
                   4318:                                {
                   4319:                                        p_ucb->UCB_status = UCB_SUCCESS;
                   4320:                                }
                   4321:                                else
                   4322:                                {
                   4323:                                        p_ucb->UCB_status = UCB_ERROR;
                   4324:                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
                   4325:                                }
                   4326:                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4327:                                if (callback)
                   4328:                                        callback(p_ucb);
                   4329:                                mOS_UnLock((PSCCBcard)pCurrCard);
                   4330:                                return;
                   4331:                        case SET_DEVICE_SYNCRATE:
                   4332:                                if( !SetDevSyncRate((PSCCBcard)pCurrCard,p_ucb) )
                   4333:                                {
                   4334:                                        p_ucb->UCB_status = UCB_SUCCESS;
                   4335:                                }
                   4336:                                else
                   4337:                                {
                   4338:                                        p_ucb->UCB_status = UCB_ERROR;
                   4339:                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
                   4340:                                }
                   4341:                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4342:                                if (callback)
                   4343:                                        callback(p_ucb);
                   4344:                                mOS_UnLock((PSCCBcard)pCurrCard);
                   4345:                                return;
                   4346:                        case GET_WIDE_MODE:
                   4347:                                if( !GetDevWideMode((PSCCBcard)pCurrCard,p_ucb) )
                   4348:                                {
                   4349:                                        p_ucb->UCB_status = UCB_SUCCESS;
                   4350:                                }
                   4351:                                else
                   4352:                                {
                   4353:                                        p_ucb->UCB_status = UCB_ERROR;
                   4354:                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
                   4355:                                }
                   4356:                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4357:                                if (callback)
                   4358:                                        callback(p_ucb);
                   4359:                                mOS_UnLock((PSCCBcard)pCurrCard);
                   4360:                                return;
                   4361:                        case SET_WIDE_MODE:
                   4362:                                if( !SetDevWideMode((PSCCBcard)pCurrCard,p_ucb) )
                   4363:                                {
                   4364:                                        p_ucb->UCB_status = UCB_SUCCESS;
                   4365:                                }
                   4366:                                else
                   4367:                                {
                   4368:                                        p_ucb->UCB_status = UCB_ERROR;
                   4369:                                        p_ucb->UCB_hbastat = HASTAT_HW_ERROR;
                   4370:                                }
                   4371:                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4372:                                if (callback)
                   4373:                                        callback(p_ucb);
                   4374:                                mOS_UnLock((PSCCBcard)pCurrCard);
                   4375:                                return;
                   4376:                        default:
                   4377:                                p_ucb->UCB_status=UCB_INVALID;
                   4378:                                callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4379:                                if (callback)
                   4380:                                        callback(p_ucb);
                   4381:                                mOS_UnLock((PSCCBcard)pCurrCard);
                   4382:                                return;
                   4383:                }
                   4384:        }
                   4385: #endif /* NO_IOCTLS */
                   4386: #endif /* (FW_TYPE==_UCB_MGR_) */
                   4387: 
                   4388: 
                   4389:    if (!((PSCCBcard) pCurrCard)->cmdCounter)
                   4390:       {
                   4391:       WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore)
                   4392:          | SCCB_MGR_ACTIVE));
                   4393: 
                   4394:       if (((PSCCBcard) pCurrCard)->globalFlags & F_GREEN_PC)
                   4395:          {
                   4396:                 WR_HARPOON(ioport+hp_clkctrl_0, CLKCTRL_DEFAULT);
                   4397:                 WR_HARPOON(ioport+hp_sys_ctrl, 0x00);
                   4398:          }
                   4399:       }
                   4400: 
                   4401:    ((PSCCBcard)pCurrCard)->cmdCounter++;
                   4402: 
                   4403:    if (RD_HARPOON(ioport+hp_semaphore) & BIOS_IN_USE) {
                   4404: 
                   4405:       WR_HARPOON(ioport+hp_semaphore, (RD_HARPOON(ioport+hp_semaphore)
                   4406:          | TICKLE_ME));
                   4407:                if(p_Sccb->OperationCode == RESET_COMMAND)
                   4408:                        {
                   4409:                                pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
                   4410:                                ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
                   4411:                                queueSelectFail(&BL_Card[thisCard], thisCard);
                   4412:                                ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
                   4413:                        }
                   4414:                else
                   4415:                        {
                   4416:              queueAddSccb(p_Sccb,thisCard);
                   4417:                        }
                   4418:       }
                   4419: 
                   4420:    else if ((RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)) {
                   4421: 
                   4422:                        if(p_Sccb->OperationCode == RESET_COMMAND)
                   4423:                                {
                   4424:                                        pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
                   4425:                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
                   4426:                                        queueSelectFail(&BL_Card[thisCard], thisCard);
                   4427:                                        ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
                   4428:                                }
                   4429:                        else
                   4430:                                {
                   4431:                      queueAddSccb(p_Sccb,thisCard);
                   4432:                                }
                   4433:       }
                   4434: 
                   4435:    else {
                   4436: 
                   4437:       MDISABLE_INT(ioport);
                   4438: 
                   4439:                if((((PSCCBcard) pCurrCard)->globalFlags & F_CONLUN_IO) && 
                   4440:                        ((sccbMgrTbl[thisCard][p_Sccb->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                   4441:                        lun = p_Sccb->Lun;
                   4442:                else
                   4443:                        lun = 0;
                   4444:       if ((((PSCCBcard) pCurrCard)->currentSCCB == NULL) &&
                   4445:          (sccbMgrTbl[thisCard][p_Sccb->TargID].TarSelQ_Cnt == 0) &&
                   4446:          (sccbMgrTbl[thisCard][p_Sccb->TargID].TarLUNBusy[lun]
                   4447:          == FALSE)) {
                   4448: 
                   4449:             ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
                   4450:                           mOS_UnLock((PSCCBcard)pCurrCard);
                   4451: #if defined(DOS)
                   4452:             ssel((USHORT)p_Sccb->SccbIOPort,thisCard);
                   4453: #else
                   4454:            ssel(p_Sccb->SccbIOPort,thisCard);
                   4455: #endif
                   4456:                           mOS_Lock((PSCCBcard)pCurrCard);
                   4457:          }
                   4458: 
                   4459:       else {
                   4460: 
                   4461:                        if(p_Sccb->OperationCode == RESET_COMMAND)
                   4462:                                {
                   4463:                                        pSaveSccb = ((PSCCBcard) pCurrCard)->currentSCCB;
                   4464:                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
                   4465:                                        queueSelectFail(&BL_Card[thisCard], thisCard);
                   4466:                                        ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSccb;
                   4467:                                }
                   4468:                        else
                   4469:                                {
                   4470:                        queueAddSccb(p_Sccb,thisCard);
                   4471:                                }
                   4472:          }
                   4473: 
                   4474: 
                   4475:       MENABLE_INT(ioport);
                   4476:       }
                   4477: 
                   4478:    mOS_UnLock((PSCCBcard)pCurrCard);
                   4479: }
                   4480: 
                   4481: 
                   4482: /*---------------------------------------------------------------------
                   4483:  *
                   4484:  * Function: SccbMgr_abort_sccb
                   4485:  *
                   4486:  * Description: Abort the command pointed to by p_Sccb.  When the
                   4487:  *              command is completed it will be returned via the
                   4488:  *              callback function.
                   4489:  *
                   4490:  *---------------------------------------------------------------------*/
                   4491: #if (FW_TYPE==_UCB_MGR_)
                   4492: s32bits SccbMgr_abort_sccb(CARD_HANDLE pCurrCard, PUCB p_ucb)
                   4493: #else
                   4494: #if defined(DOS)
                   4495: int SccbMgr_abort_sccb(USHORT pCurrCard, PSCCB p_Sccb)
                   4496: #else
                   4497: int SccbMgr_abort_sccb(ULONG pCurrCard, PSCCB p_Sccb)
                   4498: #endif
                   4499: #endif
                   4500: 
                   4501: {
                   4502: #if defined(DOS)
                   4503:        USHORT ioport;
                   4504: #else
                   4505:        ULONG ioport;
                   4506: #endif
                   4507: 
                   4508:        UCHAR thisCard;
                   4509:        CALL_BK_FN callback;
                   4510:        UCHAR TID;
                   4511:        PSCCB pSaveSCCB;
                   4512:        PSCCBMgr_tar_info currTar_Info;
                   4513: 
                   4514: 
                   4515: #if (FW_TYPE==_UCB_MGR_)
                   4516:        PSCCB    p_Sccb;
                   4517:        p_Sccb=(PSCCB)p_ucb->UCB_MgrPrivatePtr;
                   4518: #endif
                   4519: 
                   4520:        ioport = ((PSCCBcard) pCurrCard)->ioPort;
                   4521: 
                   4522:        thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
                   4523: 
                   4524:        mOS_Lock((PSCCBcard)pCurrCard);
                   4525: 
                   4526:        if (RD_HARPOON(ioport+hp_page_ctrl) & G_INT_DISABLE)
                   4527:        {
                   4528:                mOS_UnLock((PSCCBcard)pCurrCard);
                   4529:        }
                   4530: 
                   4531:        else
                   4532:        {
                   4533: 
                   4534:                if (queueFindSccb(p_Sccb,thisCard))
                   4535:                {
                   4536: 
                   4537:                        mOS_UnLock((PSCCBcard)pCurrCard);
                   4538: 
                   4539:                        ((PSCCBcard)pCurrCard)->cmdCounter--;
                   4540: 
                   4541:                        if (!((PSCCBcard)pCurrCard)->cmdCounter)
                   4542:                                WR_HARPOON(ioport+hp_semaphore,(RD_HARPOON(ioport+hp_semaphore)
                   4543:                                        & (UCHAR)(~(SCCB_MGR_ACTIVE | TICKLE_ME)) ));
                   4544: 
                   4545: #if (FW_TYPE==_SCCB_MGR_)
                   4546:                        p_Sccb->SccbStatus = SCCB_ABORT;
                   4547:                        callback = p_Sccb->SccbCallback;
                   4548:                        callback(p_Sccb);
                   4549: #else
                   4550:                        p_ucb->UCB_status=SCCB_ABORT;
                   4551:                        callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   4552:                        callback(p_ucb);
                   4553: #endif
                   4554: 
                   4555:                        return(0);
                   4556:                }
                   4557: 
                   4558:                else
                   4559:                {
                   4560:                        mOS_UnLock((PSCCBcard)pCurrCard);
                   4561: 
                   4562:                        if (((PSCCBcard)pCurrCard)->currentSCCB == p_Sccb)
                   4563:                        {
                   4564:                                p_Sccb->SccbStatus = SCCB_ABORT;
                   4565:                                return(0);
                   4566: 
                   4567:                        }
                   4568: 
                   4569:                        else
                   4570:                        {
                   4571: 
                   4572:                                TID = p_Sccb->TargID;
                   4573: 
                   4574: 
                   4575:                                if(p_Sccb->Sccb_tag)
                   4576:                                {
                   4577:                                        MDISABLE_INT(ioport);
                   4578:                                        if (((PSCCBcard) pCurrCard)->discQ_Tbl[p_Sccb->Sccb_tag]==p_Sccb)
                   4579:                                        {
                   4580:                                                p_Sccb->SccbStatus = SCCB_ABORT;
                   4581:                                                p_Sccb->Sccb_scsistat = ABORT_ST;
                   4582: #if (FW_TYPE==_UCB_MGR_)
                   4583:                                                p_ucb->UCB_status=SCCB_ABORT;
                   4584: #endif
                   4585:                                                p_Sccb->Sccb_scsimsg = SMABORT_TAG;
                   4586: 
                   4587:                                                if(((PSCCBcard) pCurrCard)->currentSCCB == NULL)
                   4588:                                                {
                   4589:                                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
                   4590:                                                        ssel(ioport, thisCard);
                   4591:                                                }
                   4592:                                                else
                   4593:                                                {
                   4594:                                                        pSaveSCCB = ((PSCCBcard) pCurrCard)->currentSCCB;
                   4595:                                                        ((PSCCBcard) pCurrCard)->currentSCCB = p_Sccb;
                   4596:                                                        queueSelectFail((PSCCBcard) pCurrCard, thisCard);
                   4597:                                                        ((PSCCBcard) pCurrCard)->currentSCCB = pSaveSCCB;
                   4598:                                                }
                   4599:                                        }
                   4600:                                        MENABLE_INT(ioport);
                   4601:                                        return(0);
                   4602:                                }
                   4603:                                else
                   4604:                                {
                   4605:                                        currTar_Info = &sccbMgrTbl[thisCard][p_Sccb->TargID];
                   4606: 
                   4607:                                        if(BL_Card[thisCard].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_Sccb->Lun]] 
                   4608:                                                        == p_Sccb)
                   4609:                                        {
                   4610:                                                p_Sccb->SccbStatus = SCCB_ABORT;
                   4611:                                                return(0);
                   4612:                                        }
                   4613:                                }
                   4614:                        }
                   4615:                }
                   4616:        }
                   4617:        return(-1);
                   4618: }
                   4619: 
                   4620: 
                   4621: /*---------------------------------------------------------------------
                   4622:  *
                   4623:  * Function: SccbMgr_my_int
                   4624:  *
                   4625:  * Description: Do a quick check to determine if there is a pending
                   4626:  *              interrupt for this card and disable the IRQ Pin if so.
                   4627:  *
                   4628:  *---------------------------------------------------------------------*/
                   4629: #if (FW_TYPE==_UCB_MGR_)
                   4630: u08bits SccbMgr_my_int(CARD_HANDLE pCurrCard)
                   4631: #else
                   4632: #if defined(DOS)
                   4633: UCHAR SccbMgr_my_int(USHORT pCurrCard)
                   4634: #else
                   4635: UCHAR SccbMgr_my_int(ULONG pCurrCard)
                   4636: #endif
                   4637: #endif
                   4638: {
                   4639: #if defined(DOS)
                   4640:    USHORT ioport;
                   4641: #else
                   4642:    ULONG ioport;
                   4643: #endif
                   4644: 
                   4645:    ioport = ((PSCCBcard)pCurrCard)->ioPort;
                   4646: 
                   4647:    if (RD_HARPOON(ioport+hp_int_status) & INT_ASSERTED)
                   4648:    {
                   4649: 
                   4650: #if defined(DOS)
                   4651:       MDISABLE_INT(ioport);
                   4652: #endif
                   4653: 
                   4654:       return(TRUE);
                   4655:    }
                   4656: 
                   4657:    else
                   4658: 
                   4659:       return(FALSE);
                   4660: }
                   4661: 
                   4662: 
                   4663: 
                   4664: /*---------------------------------------------------------------------
                   4665:  *
                   4666:  * Function: SccbMgr_isr
                   4667:  *
                   4668:  * Description: This is our entry point when an interrupt is generated
                   4669:  *              by the card and the upper level driver passes it on to
                   4670:  *              us.
                   4671:  *
                   4672:  *---------------------------------------------------------------------*/
                   4673: #if (FW_TYPE==_UCB_MGR_)
                   4674: s32bits SccbMgr_isr(CARD_HANDLE pCurrCard)
                   4675: #else
                   4676: #if defined(DOS)
                   4677: int SccbMgr_isr(USHORT pCurrCard)
                   4678: #else
                   4679: int SccbMgr_isr(ULONG pCurrCard)
                   4680: #endif
                   4681: #endif
                   4682: {
                   4683:    PSCCB currSCCB;
                   4684:    UCHAR thisCard,result,bm_status, bm_int_st;
                   4685:    USHORT hp_int;
                   4686:    UCHAR i, target;
                   4687: #if defined(DOS)
                   4688:    USHORT ioport;
                   4689: #else
                   4690:    ULONG ioport;
                   4691: #endif
                   4692: 
                   4693:    mOS_Lock((PSCCBcard)pCurrCard);
                   4694: 
                   4695:    thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
                   4696:    ioport = ((PSCCBcard)pCurrCard)->ioPort;
                   4697: 
                   4698:    MDISABLE_INT(ioport);
                   4699: 
                   4700: #if defined(BUGBUG)
                   4701:    WR_HARPOON(ioport+hp_user_defined_D, RD_HARPOON(ioport+hp_int_status));
                   4702: #endif
                   4703: 
                   4704:    if ((bm_int_st=RD_HARPOON(ioport+hp_int_status)) & EXT_STATUS_ON)
                   4705:                bm_status = RD_HARPOON(ioport+hp_ext_status) & (UCHAR)BAD_EXT_STATUS;
                   4706:    else
                   4707:       bm_status = 0;
                   4708: 
                   4709:    WR_HARPOON(ioport+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
                   4710: 
                   4711:    mOS_UnLock((PSCCBcard)pCurrCard);
                   4712: 
                   4713:    while ((hp_int = RDW_HARPOON((ioport+hp_intstat)) & default_intena) |
                   4714:          bm_status)
                   4715:      {
                   4716: 
                   4717:        currSCCB = ((PSCCBcard)pCurrCard)->currentSCCB;
                   4718: 
                   4719: #if defined(BUGBUG)
                   4720:    Debug_Load(thisCard,(UCHAR) 0XFF);
                   4721:    Debug_Load(thisCard,bm_int_st);
                   4722: 
                   4723:    Debug_Load(thisCard,hp_int_0);
                   4724:    Debug_Load(thisCard,hp_int_1);
                   4725: #endif
                   4726: 
                   4727: 
                   4728:       if (hp_int & (FIFO | TIMEOUT | RESET | SCAM_SEL) || bm_status) {
                   4729:          result = SccbMgr_bad_isr(ioport,thisCard,((PSCCBcard)pCurrCard),hp_int);
                   4730:          WRW_HARPOON((ioport+hp_intstat), (FIFO | TIMEOUT | RESET | SCAM_SEL));
                   4731:          bm_status = 0;
                   4732: 
                   4733:          if (result) {
                   4734: 
                   4735:                           mOS_Lock((PSCCBcard)pCurrCard);
                   4736:             MENABLE_INT(ioport);
                   4737:                           mOS_UnLock((PSCCBcard)pCurrCard);
                   4738:             return(result);
                   4739:             }
                   4740:          }
                   4741: 
                   4742: 
                   4743:       else if (hp_int & ICMD_COMP) {
                   4744: 
                   4745:          if ( !(hp_int & BUS_FREE) ) {
                   4746:             /* Wait for the BusFree before starting a new command.  We
                   4747:                must also check for being reselected since the BusFree
                   4748:                may not show up if another device reselects us in 1.5us or
                   4749:                less.  SRR Wednesday, 3/8/1995.
                   4750:                 */
                   4751:           while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL))) ;
                   4752:         }
                   4753: 
                   4754:          if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
                   4755: 
                   4756:             phaseChkFifo(ioport, thisCard);
                   4757: 
                   4758: /*         WRW_HARPOON((ioport+hp_intstat),
                   4759:             (BUS_FREE | ICMD_COMP | ITAR_DISC | XFER_CNT_0));
                   4760:          */
                   4761: 
                   4762:                 WRW_HARPOON((ioport+hp_intstat), CLR_ALL_INT_1);
                   4763: 
                   4764:          autoCmdCmplt(ioport,thisCard);
                   4765: 
                   4766:          }
                   4767: 
                   4768: 
                   4769:       else if (hp_int & ITAR_DISC)
                   4770:          {
                   4771: 
                   4772:          if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
                   4773: 
                   4774:             phaseChkFifo(ioport, thisCard);
                   4775: 
                   4776:             }
                   4777: 
                   4778:          if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR) {
                   4779: 
                   4780:             WR_HARPOON(ioport+hp_gp_reg_1, 0x00);
                   4781:             currSCCB->Sccb_XferState |= F_NO_DATA_YET;
                   4782: 
                   4783:             currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
                   4784:             }
                   4785: 
                   4786:          currSCCB->Sccb_scsistat = DISCONNECT_ST;
                   4787:          queueDisconnect(currSCCB,thisCard);
                   4788: 
                   4789:             /* Wait for the BusFree before starting a new command.  We
                   4790:                must also check for being reselected since the BusFree
                   4791:                may not show up if another device reselects us in 1.5us or
                   4792:                less.  SRR Wednesday, 3/8/1995.
                   4793:              */
                   4794:           while (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)) &&
                   4795:                  !((RDW_HARPOON((ioport+hp_intstat)) & PHASE) &&
                   4796:                    RD_HARPOON((ioport+hp_scsisig)) ==
                   4797:                    (SCSI_BSY | SCSI_REQ | SCSI_CD | SCSI_MSG | SCSI_IOBIT))) ;
                   4798: 
                   4799:           /*
                   4800:             The additional loop exit condition above detects a timing problem
                   4801:             with the revision D/E harpoon chips.  The caller should reset the
                   4802:             host adapter to recover when 0xFE is returned.
                   4803:           */
                   4804:           if (!(RDW_HARPOON((ioport+hp_intstat)) & (BUS_FREE | RSEL)))
                   4805:             {
                   4806:               mOS_Lock((PSCCBcard)pCurrCard);
                   4807:               MENABLE_INT(ioport);
                   4808:               mOS_UnLock((PSCCBcard)pCurrCard);
                   4809:               return 0xFE;
                   4810:             }
                   4811: 
                   4812:          WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC));
                   4813: 
                   4814: 
                   4815:          ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD;
                   4816: 
                   4817:        }
                   4818: 
                   4819: 
                   4820:       else if (hp_int & RSEL) {
                   4821: 
                   4822:          WRW_HARPOON((ioport+hp_intstat), (PROG_HLT | RSEL | PHASE | BUS_FREE));
                   4823: 
                   4824:          if (RDW_HARPOON((ioport+hp_intstat)) & ITAR_DISC)
                   4825:                      {
                   4826:             if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT)
                   4827:                              {
                   4828:                phaseChkFifo(ioport, thisCard);
                   4829:                }
                   4830: 
                   4831:             if (RD_HARPOON(ioport+hp_gp_reg_1) == SMSAVE_DATA_PTR)
                   4832:                              {
                   4833:                WR_HARPOON(ioport+hp_gp_reg_1, 0x00);
                   4834:                currSCCB->Sccb_XferState |= F_NO_DATA_YET;
                   4835:                currSCCB->Sccb_savedATC = currSCCB->Sccb_ATC;
                   4836:                }
                   4837: 
                   4838:             WRW_HARPOON((ioport+hp_intstat), (BUS_FREE | ITAR_DISC));
                   4839:             currSCCB->Sccb_scsistat = DISCONNECT_ST;
                   4840:             queueDisconnect(currSCCB,thisCard);
                   4841:             }
                   4842: 
                   4843:          sres(ioport,thisCard,((PSCCBcard)pCurrCard));
                   4844:          phaseDecode(ioport,thisCard);
                   4845: 
                   4846:          }
                   4847: 
                   4848: 
                   4849:       else if ((hp_int & IDO_STRT) && (!(hp_int & BUS_FREE)))
                   4850:          {
                   4851: 
                   4852:             WRW_HARPOON((ioport+hp_intstat), (IDO_STRT | XFER_CNT_0));
                   4853:             phaseDecode(ioport,thisCard);
                   4854: 
                   4855:          }
                   4856: 
                   4857: 
                   4858:       else if ( (hp_int & IUNKWN) || (hp_int & PROG_HLT) )
                   4859:                   {
                   4860:                   WRW_HARPOON((ioport+hp_intstat), (PHASE | IUNKWN | PROG_HLT));
                   4861:                   if ((RD_HARPOON(ioport+hp_prgmcnt_0) & (UCHAR)0x3f)< (UCHAR)SELCHK)
                   4862:                        {
                   4863:                        phaseDecode(ioport,thisCard);
                   4864:                        }
                   4865:                   else
                   4866:                        {
                   4867:    /* Harpoon problem some SCSI target device respond to selection
                   4868:    with short BUSY pulse (<400ns) this will make the Harpoon is not able
                   4869:    to latch the correct Target ID into reg. x53.
                   4870:    The work around require to correct this reg. But when write to this
                   4871:    reg. (0x53) also increment the FIFO write addr reg (0x6f), thus we
                   4872:    need to read this reg first then restore it later. After update to 0x53 */
                   4873: 
                   4874:                        i = (UCHAR)(RD_HARPOON(ioport+hp_fifowrite));
                   4875:                        target = (UCHAR)(RD_HARPOON(ioport+hp_gp_reg_3));
                   4876:                        WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) ID_UNLOCK);
                   4877:                        WR_HARPOON(ioport+hp_select_id, (UCHAR)(target | target<<4));
                   4878:                        WR_HARPOON(ioport+hp_xfer_pad, (UCHAR) 0x00);
                   4879:                        WR_HARPOON(ioport+hp_fifowrite, i);
                   4880:                        WR_HARPOON(ioport+hp_autostart_3, (AUTO_IMMED+TAG_STRT));
                   4881:                        }
                   4882:                   }
                   4883: 
                   4884:       else if (hp_int & XFER_CNT_0) {
                   4885: 
                   4886:          WRW_HARPOON((ioport+hp_intstat), XFER_CNT_0);
                   4887: 
                   4888:          schkdd(ioport,thisCard);
                   4889: 
                   4890:          }
                   4891: 
                   4892: 
                   4893:       else if (hp_int & BUS_FREE) {
                   4894: 
                   4895:          WRW_HARPOON((ioport+hp_intstat), BUS_FREE);
                   4896: 
                   4897:                if (((PSCCBcard)pCurrCard)->globalFlags & F_HOST_XFER_ACT) {
                   4898: 
                   4899:                hostDataXferAbort(ioport,thisCard,currSCCB);
                   4900:                                }
                   4901: 
                   4902:          phaseBusFree(ioport,thisCard);
                   4903:                        }
                   4904: 
                   4905: 
                   4906:       else if (hp_int & ITICKLE) {
                   4907: 
                   4908:          WRW_HARPOON((ioport+hp_intstat), ITICKLE);
                   4909:          ((PSCCBcard)pCurrCard)->globalFlags |= F_NEW_SCCB_CMD;
                   4910:          }
                   4911: 
                   4912: 
                   4913: 
                   4914:       if (((PSCCBcard)pCurrCard)->globalFlags & F_NEW_SCCB_CMD) {
                   4915: 
                   4916: 
                   4917:          ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD;
                   4918: 
                   4919: 
                   4920:          if (((PSCCBcard)pCurrCard)->currentSCCB == NULL) {
                   4921: 
                   4922:             queueSearchSelect(((PSCCBcard)pCurrCard),thisCard);
                   4923:             }
                   4924: 
                   4925:          if (((PSCCBcard)pCurrCard)->currentSCCB != NULL) {
                   4926:             ((PSCCBcard)pCurrCard)->globalFlags &= ~F_NEW_SCCB_CMD;
                   4927:             ssel(ioport,thisCard);
                   4928:             }
                   4929: 
                   4930:          break;
                   4931: 
                   4932:          }
                   4933: 
                   4934:       }  /*end while */
                   4935: 
                   4936:    mOS_Lock((PSCCBcard)pCurrCard);
                   4937:    MENABLE_INT(ioport);
                   4938:    mOS_UnLock((PSCCBcard)pCurrCard);
                   4939: 
                   4940:    return(0);
                   4941: }
                   4942: 
                   4943: /*---------------------------------------------------------------------
                   4944:  *
                   4945:  * Function: Sccb_bad_isr
                   4946:  *
                   4947:  * Description: Some type of interrupt has occurred which is slightly
                   4948:  *              out of the ordinary.  We will now decode it fully, in
                   4949:  *              this routine.  This is broken up in an attempt to save
                   4950:  *              processing time.
                   4951:  *
                   4952:  *---------------------------------------------------------------------*/
                   4953: #if defined(DOS)
                   4954: UCHAR SccbMgr_bad_isr(USHORT p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int)
                   4955: #else
                   4956: UCHAR SccbMgr_bad_isr(ULONG p_port, UCHAR p_card, PSCCBcard pCurrCard, USHORT p_int)
                   4957: #endif
                   4958: {
                   4959: #if defined(HARP_REVX)
                   4960:    ULONG timer;
                   4961: #endif
                   4962: UCHAR temp, ScamFlg;
                   4963: PSCCBMgr_tar_info currTar_Info;
                   4964: PNVRamInfo pCurrNvRam;
                   4965: 
                   4966: 
                   4967:    if (RD_HARPOON(p_port+hp_ext_status) &
                   4968:          (BM_FORCE_OFF | PCI_DEV_TMOUT | BM_PARITY_ERR | PIO_OVERRUN) )
                   4969:       {
                   4970: 
                   4971:       if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
                   4972:          {
                   4973: 
                   4974:          hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
                   4975:          }
                   4976: 
                   4977:       if (RD_HARPOON(p_port+hp_pci_stat_cfg) & REC_MASTER_ABORT)
                   4978: 
                   4979:          {
                   4980:          WR_HARPOON(p_port+hp_pci_stat_cfg,
                   4981:             (RD_HARPOON(p_port+hp_pci_stat_cfg) & ~REC_MASTER_ABORT));
                   4982: 
                   4983:          WR_HARPOON(p_port+hp_host_blk_cnt, 0x00);
                   4984: 
                   4985:          }
                   4986: 
                   4987:       if (pCurrCard->currentSCCB != NULL)
                   4988:          {
                   4989: 
                   4990:          if (!pCurrCard->currentSCCB->HostStatus)
                   4991:             pCurrCard->currentSCCB->HostStatus = SCCB_BM_ERR;
                   4992: 
                   4993:          sxfrp(p_port,p_card);
                   4994: 
                   4995:             temp = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) &
                   4996:                                                        (EXT_ARB_ACK | SCSI_TERM_ENA_H));
                   4997:        WR_HARPOON(p_port+hp_ee_ctrl, ((UCHAR)temp | SEE_MS | SEE_CS));
                   4998:          WR_HARPOON(p_port+hp_ee_ctrl, temp);
                   4999: 
                   5000:          if (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
                   5001:             {
                   5002:             phaseDecode(p_port,p_card);
                   5003:             }
                   5004:          }
                   5005:       }
                   5006: 
                   5007: 
                   5008:    else if (p_int & RESET)
                   5009:          {
                   5010: 
                   5011:                                WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT);
                   5012:                                WR_HARPOON(p_port+hp_sys_ctrl, 0x00);
                   5013:            if (pCurrCard->currentSCCB != NULL) {
                   5014: 
                   5015:                if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
                   5016: 
                   5017:                hostDataXferAbort(p_port,p_card, pCurrCard->currentSCCB);
                   5018:                }
                   5019: 
                   5020: 
                   5021:            DISABLE_AUTO(p_port);
                   5022: 
                   5023:            sresb(p_port,p_card);
                   5024: 
                   5025:            while(RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST) {}
                   5026: 
                   5027:                                pCurrNvRam = pCurrCard->pNvRamInfo;
                   5028:                                if(pCurrNvRam){
                   5029:                                        ScamFlg = pCurrNvRam->niScamConf;
                   5030:                                }
                   5031:                                else{
                   5032:                                   ScamFlg = (UCHAR) utilEERead(p_port, SCAM_CONFIG/2);
                   5033:                                }
                   5034: 
                   5035:            XbowInit(p_port, ScamFlg);
                   5036: 
                   5037:                scini(p_card, pCurrCard->ourId, 0);
                   5038: 
                   5039:            return(0xFF);
                   5040:          }
                   5041: 
                   5042: 
                   5043:    else if (p_int & FIFO) {
                   5044: 
                   5045:       WRW_HARPOON((p_port+hp_intstat), FIFO);
                   5046: 
                   5047: #if defined(HARP_REVX)
                   5048: 
                   5049:       for (timer=0x00FFFFFFL; timer != 0x00000000L; timer--) {
                   5050: 
                   5051:          if (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)
                   5052:             break;
                   5053: 
                   5054:          if (RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)
                   5055:             break;
                   5056:          }
                   5057: 
                   5058: 
                   5059:       if ( (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY) &&
                   5060:            (RD_HARPOON(p_port+hp_fiforead) !=
                   5061:             RD_HARPOON(p_port+hp_fifowrite)) &&
                   5062:            (RD_HARPOON(p_port+hp_xfercnt_0))
                   5063:          )
                   5064: 
                   5065:             WR_HARPOON((p_port+hp_xferstat), 0x01);
                   5066: 
                   5067: /*      else
                   5068:  */
                   5069: /*         sxfrp(p_port,p_card);
                   5070:  */
                   5071: #else
                   5072:       if (pCurrCard->currentSCCB != NULL)
                   5073:          sxfrp(p_port,p_card);
                   5074: #endif
                   5075:       }
                   5076: 
                   5077:    else if (p_int & TIMEOUT)
                   5078:       {
                   5079: 
                   5080:       DISABLE_AUTO(p_port);
                   5081: 
                   5082:       WRW_HARPOON((p_port+hp_intstat),
                   5083:                  (PROG_HLT | TIMEOUT | SEL |BUS_FREE | PHASE | IUNKWN));
                   5084: 
                   5085:       pCurrCard->currentSCCB->HostStatus = SCCB_SELECTION_TIMEOUT;
                   5086: 
                   5087: 
                   5088:                currTar_Info = &sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
                   5089:                if((pCurrCard->globalFlags & F_CONLUN_IO) &&
                   5090:                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                   5091:              currTar_Info->TarLUNBusy[pCurrCard->currentSCCB->Lun] = FALSE;
                   5092:                else
                   5093:              currTar_Info->TarLUNBusy[0] = FALSE;
                   5094: 
                   5095: 
                   5096:       if (currTar_Info->TarEEValue & EE_SYNC_MASK)
                   5097:          {
                   5098:               currTar_Info->TarSyncCtrl = 0;
                   5099:          currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
                   5100:          }
                   5101: 
                   5102:       if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
                   5103:          {
                   5104:          currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
                   5105:          }
                   5106: 
                   5107:       sssyncv(p_port, pCurrCard->currentSCCB->TargID, NARROW_SCSI,currTar_Info);
                   5108: 
                   5109:       queueCmdComplete(pCurrCard, pCurrCard->currentSCCB, p_card);
                   5110: 
                   5111:       }
                   5112: 
                   5113: #if defined(SCAM_LEV_2)
                   5114: 
                   5115:    else if (p_int & SCAM_SEL)
                   5116:       {
                   5117: 
                   5118:       scarb(p_port,LEVEL2_TAR);
                   5119:       scsel(p_port);
                   5120:       scasid(p_card, p_port);
                   5121: 
                   5122:       scbusf(p_port);
                   5123: 
                   5124:       WRW_HARPOON((p_port+hp_intstat), SCAM_SEL);
                   5125:       }
                   5126: #endif
                   5127: 
                   5128:    return(0x00);
                   5129: }
                   5130: 
                   5131: 
                   5132: /*---------------------------------------------------------------------
                   5133:  *
                   5134:  * Function: SccbMgr_scsi_reset
                   5135:  *
                   5136:  * Description: A SCSI bus reset will be generated and all outstanding
                   5137:  *              Sccbs will be returned via the callback.
                   5138:  *
                   5139:  *---------------------------------------------------------------------*/
                   5140: #if (FW_TYPE==_UCB_MGR_)
                   5141: void SccbMgr_scsi_reset(CARD_HANDLE pCurrCard)
                   5142: #else
                   5143: #if defined(DOS)
                   5144: void SccbMgr_scsi_reset(USHORT pCurrCard)
                   5145: #else
                   5146: void SccbMgr_scsi_reset(ULONG pCurrCard)
                   5147: #endif
                   5148: #endif
                   5149: {
                   5150:    UCHAR thisCard;
                   5151: 
                   5152:    thisCard = ((PSCCBcard)pCurrCard)->cardIndex;
                   5153: 
                   5154:    mOS_Lock((PSCCBcard)pCurrCard);
                   5155: 
                   5156:    if (((PSCCBcard) pCurrCard)->globalFlags & F_GREEN_PC)
                   5157:       {
                   5158:       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_clkctrl_0, CLKCTRL_DEFAULT);
                   5159:       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_sys_ctrl, 0x00);
                   5160:       }
                   5161: 
                   5162:    sresb(((PSCCBcard)pCurrCard)->ioPort,thisCard);
                   5163: 
                   5164:    if (RD_HARPOON(((PSCCBcard)pCurrCard)->ioPort+hp_ext_status) & BM_CMD_BUSY)
                   5165:       {
                   5166:       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_page_ctrl,
                   5167:          (RD_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_page_ctrl)
                   5168:          & ~SCATTER_EN));
                   5169: 
                   5170:       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_sg_addr,0x00);
                   5171: 
                   5172:       ((PSCCBcard) pCurrCard)->globalFlags &= ~F_HOST_XFER_ACT;
                   5173:       busMstrTimeOut(((PSCCBcard) pCurrCard)->ioPort);
                   5174: 
                   5175:       WR_HARPOON(((PSCCBcard) pCurrCard)->ioPort+hp_int_mask,
                   5176:          (INT_CMD_COMPL | SCSI_INTERRUPT));
                   5177:       }
                   5178: 
                   5179: /*
                   5180:       if (utilEERead(((PSCCBcard)pCurrCard)->ioPort, (SCAM_CONFIG/2))
                   5181:             & SCAM_ENABLED)
                   5182: */
                   5183:          scini(thisCard, ((PSCCBcard)pCurrCard)->ourId, 0);
                   5184: 
                   5185: #if (FW_TYPE==_UCB_MGR_)
                   5186:    ((PSCCBcard)pCurrCard)->cardInfo->ai_AEN_routine(0x01,pCurrCard,0,0,0,0);
                   5187: #endif
                   5188: 
                   5189:    mOS_UnLock((PSCCBcard)pCurrCard);
                   5190: }
                   5191: 
                   5192: 
                   5193: /*---------------------------------------------------------------------
                   5194:  *
                   5195:  * Function: SccbMgr_timer_expired
                   5196:  *
                   5197:  * Description: This function allow me to kill my own job that has not
                   5198:  *              yet completed, and has cause a timeout to occur.  This
                   5199:  *              timeout has caused the upper level driver to call this
                   5200:  *              function.
                   5201:  *
                   5202:  *---------------------------------------------------------------------*/
                   5203: 
                   5204: #if (FW_TYPE==_UCB_MGR_)
                   5205: void SccbMgr_timer_expired(CARD_HANDLE pCurrCard)
                   5206: #else
                   5207: #if defined(DOS)
                   5208: void SccbMgr_timer_expired(USHORT pCurrCard)
                   5209: #else
                   5210: void SccbMgr_timer_expired(ULONG pCurrCard)
                   5211: #endif
                   5212: #endif
                   5213: {
                   5214: }
                   5215: 
                   5216: #if defined(DOS)
                   5217: /*---------------------------------------------------------------------
                   5218:  *
                   5219:  * Function: SccbMgr_status
                   5220:  *
                   5221:  * Description: This function returns the number of outstanding SCCB's.
                   5222:  *              This is specific to the DOS enviroment, which needs this
                   5223:  *              to help them keep protected and real mode commands staight.
                   5224:  *
                   5225:  *---------------------------------------------------------------------*/
                   5226: 
                   5227: USHORT SccbMgr_status(USHORT pCurrCard)
                   5228: {
                   5229:    return(BL_Card[pCurrCard].cmdCounter);
                   5230: }
                   5231: #endif
                   5232: 
                   5233: /*---------------------------------------------------------------------
                   5234:  *
                   5235:  * Function: SccbMgrTableInit
                   5236:  *
                   5237:  * Description: Initialize all Sccb manager data structures.
                   5238:  *
                   5239:  *---------------------------------------------------------------------*/
                   5240: 
                   5241: void SccbMgrTableInitAll()
                   5242: {
                   5243:    UCHAR thisCard;
                   5244: 
                   5245:    for (thisCard = 0; thisCard < MAX_CARDS; thisCard++)
                   5246:       {
                   5247:       SccbMgrTableInitCard(&BL_Card[thisCard],thisCard);
                   5248: 
                   5249:       BL_Card[thisCard].ioPort      = 0x00;
                   5250:       BL_Card[thisCard].cardInfo    = NULL;
                   5251:       BL_Card[thisCard].cardIndex   = 0xFF;
                   5252:       BL_Card[thisCard].ourId       = 0x00;
                   5253:                BL_Card[thisCard].pNvRamInfo    = NULL;
                   5254:       }
                   5255: }
                   5256: 
                   5257: 
                   5258: /*---------------------------------------------------------------------
                   5259:  *
                   5260:  * Function: SccbMgrTableInit
                   5261:  *
                   5262:  * Description: Initialize all Sccb manager data structures.
                   5263:  *
                   5264:  *---------------------------------------------------------------------*/
                   5265: 
                   5266: void SccbMgrTableInitCard(PSCCBcard pCurrCard, UCHAR p_card)
                   5267: {
                   5268:    UCHAR scsiID, qtag;
                   5269: 
                   5270:        for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
                   5271:        {
                   5272:                BL_Card[p_card].discQ_Tbl[qtag] = NULL;
                   5273:        }
                   5274: 
                   5275:    for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
                   5276:       {
                   5277:       sccbMgrTbl[p_card][scsiID].TarStatus = 0;
                   5278:       sccbMgrTbl[p_card][scsiID].TarEEValue = 0;
                   5279:       SccbMgrTableInitTarget(p_card, scsiID);
                   5280:       }
                   5281: 
                   5282:    pCurrCard->scanIndex = 0x00;
                   5283:    pCurrCard->currentSCCB = NULL;
                   5284:    pCurrCard->globalFlags = 0x00;
                   5285:    pCurrCard->cmdCounter  = 0x00;
                   5286:        pCurrCard->tagQ_Lst = 0x01;
                   5287:        pCurrCard->discQCount = 0; 
                   5288: 
                   5289: 
                   5290: }
                   5291: 
                   5292: 
                   5293: /*---------------------------------------------------------------------
                   5294:  *
                   5295:  * Function: SccbMgrTableInit
                   5296:  *
                   5297:  * Description: Initialize all Sccb manager data structures.
                   5298:  *
                   5299:  *---------------------------------------------------------------------*/
                   5300: 
                   5301: void SccbMgrTableInitTarget(UCHAR p_card, UCHAR target)
                   5302: {
                   5303: 
                   5304:        UCHAR lun, qtag;
                   5305:        PSCCBMgr_tar_info currTar_Info;
                   5306: 
                   5307:        currTar_Info = &sccbMgrTbl[p_card][target];
                   5308: 
                   5309:        currTar_Info->TarSelQ_Cnt = 0;
                   5310:        currTar_Info->TarSyncCtrl = 0;
                   5311: 
                   5312:        currTar_Info->TarSelQ_Head = NULL;
                   5313:        currTar_Info->TarSelQ_Tail = NULL;
                   5314:        currTar_Info->TarTagQ_Cnt = 0;
                   5315:        currTar_Info->TarLUN_CA = FALSE;
                   5316: 
                   5317: 
                   5318:        for (lun = 0; lun < MAX_LUN; lun++)
                   5319:        {
                   5320:                currTar_Info->TarLUNBusy[lun] = FALSE;
                   5321:                currTar_Info->LunDiscQ_Idx[lun] = 0;
                   5322:        }
                   5323: 
                   5324:        for (qtag = 0; qtag < QUEUE_DEPTH; qtag++)
                   5325:        {
                   5326:                if(BL_Card[p_card].discQ_Tbl[qtag] != NULL)
                   5327:                {
                   5328:                        if(BL_Card[p_card].discQ_Tbl[qtag]->TargID == target)
                   5329:                        {
                   5330:                                BL_Card[p_card].discQ_Tbl[qtag] = NULL;
                   5331:                                BL_Card[p_card].discQCount--;
                   5332:                        }
                   5333:                }
                   5334:        }
                   5335: }
                   5336: 
                   5337: #if defined(BUGBUG)
                   5338: 
                   5339: /*****************************************************************
                   5340:  * Save the current byte in the debug array
                   5341:  *****************************************************************/
                   5342: 
                   5343: 
                   5344: void Debug_Load(UCHAR p_card, UCHAR p_bug_data)
                   5345: {
                   5346:    debug_int[p_card][debug_index[p_card]] = p_bug_data;
                   5347:    debug_index[p_card]++;
                   5348: 
                   5349:    if (debug_index[p_card] == debug_size)
                   5350: 
                   5351:       debug_index[p_card] = 0;
                   5352: }
                   5353: 
                   5354: #endif
                   5355: #ident "$Id: FlashPoint.c,v 1.1 1999/04/26 05:53:56 tb Exp $"
                   5356: /*----------------------------------------------------------------------
                   5357:  *
                   5358:  *
                   5359:  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
                   5360:  *
                   5361:  *   This file is available under both the GNU General Public License
                   5362:  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
                   5363:  *
                   5364:  *   $Workfile:   sccb_dat.c  $
                   5365:  *
                   5366:  *   Description:  Functions relating to handling of the SCCB interface 
                   5367:  *                 between the device driver and the HARPOON.
                   5368:  *
                   5369:  *   $Date: 1999/04/26 05:53:56 $
                   5370:  *
                   5371:  *   $Revision: 1.1 $
                   5372:  *
                   5373:  *----------------------------------------------------------------------*/
                   5374: 
                   5375: /*#include <globals.h>*/
                   5376: 
                   5377: #if (FW_TYPE==_UCB_MGR_)
                   5378:        /*#include <budi.h>*/
                   5379: #endif
                   5380: 
                   5381: /*#include <sccbmgr.h>*/
                   5382: /*#include <blx30.h>*/
                   5383: /*#include <target.h>*/
                   5384: /*#include <harpoon.h>*/
                   5385: 
                   5386: /*
                   5387: **  IMPORTANT NOTE!!!
                   5388: **
                   5389: **  You MUST preassign all data to a valid value or zero.  This is
                   5390: **  required due to the MS compiler bug under OS/2 and Solaris Real-Mode
                   5391: **  driver environment.
                   5392: */
                   5393: 
                   5394: 
                   5395: SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR] = { { { 0 } } };
                   5396: SCCBCARD BL_Card[MAX_CARDS] = { { 0 } };
                   5397: SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR] = { { { 0 } } };
                   5398: NVRAMINFO nvRamInfo[MAX_MB_CARDS] = { { 0 } };
                   5399: 
                   5400: 
                   5401: #if defined(OS2)
                   5402: void (far *s_PhaseTbl[8]) (ULONG, UCHAR) = { 0 };
                   5403: UCHAR temp_id_string[ID_STRING_LENGTH] = { 0 };
                   5404: #elif defined(SOLARIS_REAL_MODE) || defined(__STDC__)
                   5405: void (*s_PhaseTbl[8]) (ULONG, UCHAR) = { 0 };
                   5406: #else
                   5407: void (*s_PhaseTbl[8]) ();
                   5408: #endif
                   5409: 
                   5410: #if defined(DOS)
                   5411: UCHAR first_time = 0;
                   5412: #endif
                   5413: 
                   5414: UCHAR mbCards = 0;
                   5415: UCHAR scamHAString[] = {0x63, 0x07, 'B', 'U', 'S', 'L', 'O', 'G', 'I', 'C', \
                   5416:                                                                ' ', 'B', 'T', '-', '9', '3', '0', \
                   5417:                                                                0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, \
                   5418:                                                                0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20};
                   5419: 
                   5420: USHORT default_intena = 0;
                   5421: 
                   5422: #if defined(BUGBUG)
                   5423: UCHAR    debug_int[MAX_CARDS][debug_size] = { 0 };
                   5424: UCHAR    debug_index[MAX_CARDS] = { 0 };
                   5425: UCHAR    reserved_1[3] = { 0 };
                   5426: #endif
                   5427: #ident "$Id: FlashPoint.c,v 1.1 1999/04/26 05:53:56 tb Exp $"
                   5428: /*----------------------------------------------------------------------
                   5429:  *
                   5430:  *
                   5431:  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
                   5432:  *
                   5433:  *   This file is available under both the GNU General Public License
                   5434:  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
                   5435:  *
                   5436:  *   $Workfile:   scsi.c  $
                   5437:  *
                   5438:  *   Description:  Functions for handling SCSI bus functions such as
                   5439:  *                 selection/reselection, sync negotiation, message-in
                   5440:  *                 decoding.
                   5441:  *
                   5442:  *   $Date: 1999/04/26 05:53:56 $
                   5443:  *
                   5444:  *   $Revision: 1.1 $
                   5445:  *
                   5446:  *----------------------------------------------------------------------*/
                   5447: 
                   5448: /*#include <globals.h>*/
                   5449: 
                   5450: #if (FW_TYPE==_UCB_MGR_)
                   5451:        /*#include <budi.h>*/
                   5452: #endif
                   5453: 
                   5454: /*#include <sccbmgr.h>*/
                   5455: /*#include <blx30.h>*/
                   5456: /*#include <target.h>*/
                   5457: /*#include <scsi2.h>*/
                   5458: /*#include <eeprom.h>*/
                   5459: /*#include <harpoon.h>*/
                   5460: 
                   5461: 
                   5462: /*
                   5463: extern SCCBCARD BL_Card[MAX_CARDS];
                   5464: extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
                   5465: #if defined(BUGBUG)
                   5466: void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
                   5467: #endif
                   5468: */
                   5469: 
                   5470: /*---------------------------------------------------------------------
                   5471:  *
                   5472:  * Function: sfetm
                   5473:  *
                   5474:  * Description: Read in a message byte from the SCSI bus, and check
                   5475:  *              for a parity error.
                   5476:  *
                   5477:  *---------------------------------------------------------------------*/
                   5478: 
                   5479: #if defined(DOS)
                   5480: UCHAR sfm(USHORT port, PSCCB pCurrSCCB)
                   5481: #else
                   5482: UCHAR sfm(ULONG port, PSCCB pCurrSCCB)
                   5483: #endif
                   5484: {
                   5485:        UCHAR message;
                   5486:        USHORT TimeOutLoop;
                   5487: 
                   5488:        TimeOutLoop = 0;
                   5489:        while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
                   5490:                        (TimeOutLoop++ < 20000) ){}
                   5491: 
                   5492: 
                   5493:        WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
                   5494: 
                   5495:        message = RD_HARPOON(port+hp_scsidata_0);
                   5496: 
                   5497:        WR_HARPOON(port+hp_scsisig, SCSI_ACK + S_MSGI_PH);
                   5498: 
                   5499: 
                   5500:        if (TimeOutLoop > 20000)
                   5501:                message = 0x00;   /* force message byte = 0 if Time Out on Req */
                   5502: 
                   5503:        if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
                   5504:                (RD_HARPOON(port+hp_addstat) & SCSI_PAR_ERR))
                   5505:        {
                   5506:                WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
                   5507:                WR_HARPOON(port+hp_xferstat, 0);
                   5508:                WR_HARPOON(port+hp_fiforead, 0);
                   5509:                WR_HARPOON(port+hp_fifowrite, 0);
                   5510:                if (pCurrSCCB != NULL)
                   5511:                {
                   5512:                        pCurrSCCB->Sccb_scsimsg = SMPARITY;
                   5513:                }
                   5514:                message = 0x00;
                   5515:                do
                   5516:                {
                   5517:                        ACCEPT_MSG_ATN(port);
                   5518:                        TimeOutLoop = 0;
                   5519:                        while( (!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
                   5520:                                (TimeOutLoop++ < 20000) ){}
                   5521:                        if (TimeOutLoop > 20000)
                   5522:                        {
                   5523:                                WRW_HARPOON((port+hp_intstat), PARITY);
                   5524:                                return(message);
                   5525:                        }
                   5526:                        if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) != S_MSGI_PH)
                   5527:                        {
                   5528:                                WRW_HARPOON((port+hp_intstat), PARITY);
                   5529:                                return(message);
                   5530:                        }
                   5531:                        WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
                   5532: 
                   5533:                        RD_HARPOON(port+hp_scsidata_0);
                   5534: 
                   5535:                        WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
                   5536: 
                   5537:                }while(1);
                   5538: 
                   5539:        }
                   5540:        WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
                   5541:        WR_HARPOON(port+hp_xferstat, 0);
                   5542:        WR_HARPOON(port+hp_fiforead, 0);
                   5543:        WR_HARPOON(port+hp_fifowrite, 0);
                   5544:        return(message);
                   5545: }
                   5546: 
                   5547: 
                   5548: /*---------------------------------------------------------------------
                   5549:  *
                   5550:  * Function: ssel
                   5551:  *
                   5552:  * Description: Load up automation and select target device.
                   5553:  *
                   5554:  *---------------------------------------------------------------------*/
                   5555: 
                   5556: #if defined(DOS)
                   5557: void ssel(USHORT port, UCHAR p_card)
                   5558: #else
                   5559: void ssel(ULONG port, UCHAR p_card)
                   5560: #endif
                   5561: {
                   5562: 
                   5563: #if defined(DOS)
                   5564:    UCHAR auto_loaded, i, target, *theCCB;
                   5565: #elif defined(OS2)
                   5566:    UCHAR auto_loaded, i, target;
                   5567:    UCHAR far *theCCB;
                   5568: #else
                   5569:    UCHAR auto_loaded, i, target, *theCCB;
                   5570: #endif
                   5571: 
                   5572: #if defined(DOS)
                   5573:    USHORT cdb_reg;
                   5574: #else
                   5575:    ULONG cdb_reg;
                   5576: #endif
                   5577:    PSCCBcard CurrCard;
                   5578:    PSCCB currSCCB;
                   5579:    PSCCBMgr_tar_info currTar_Info;
                   5580:    UCHAR lastTag, lun;
                   5581: 
                   5582:    CurrCard = &BL_Card[p_card];
                   5583:    currSCCB = CurrCard->currentSCCB;
                   5584:    target = currSCCB->TargID;
                   5585:    currTar_Info = &sccbMgrTbl[p_card][target];
                   5586:    lastTag = CurrCard->tagQ_Lst;
                   5587: 
                   5588:    ARAM_ACCESS(port);
                   5589: 
                   5590: 
                   5591:        if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
                   5592:                currSCCB->ControlByte &= ~F_USE_CMD_Q;
                   5593: 
                   5594:        if(((CurrCard->globalFlags & F_CONLUN_IO) && 
                   5595:                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   5596: 
                   5597:           lun = currSCCB->Lun;
                   5598:        else
                   5599:                lun = 0;
                   5600: 
                   5601: 
                   5602: #if defined(DOS)
                   5603:    currTar_Info->TarLUNBusy[lun] = TRUE;
                   5604: 
                   5605: #else
                   5606: 
                   5607:    if (CurrCard->globalFlags & F_TAG_STARTED)
                   5608:       {
                   5609:       if (!(currSCCB->ControlByte & F_USE_CMD_Q))
                   5610:          {
                   5611:        if ((currTar_Info->TarLUN_CA == FALSE)
                   5612:            && ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
                   5613:            == TAG_Q_TRYING))
                   5614:             {
                   5615: 
                   5616:                 if (currTar_Info->TarTagQ_Cnt !=0)
                   5617:                   {
                   5618:                           currTar_Info->TarLUNBusy[lun] = TRUE;
                   5619:                        queueSelectFail(CurrCard,p_card);
                   5620:                                           SGRAM_ACCESS(port);
                   5621:                           return;
                   5622:                           }
                   5623: 
                   5624:             else {
                   5625:                          currTar_Info->TarLUNBusy[lun] = TRUE;
                   5626:                          }
                   5627: 
                   5628:              }  /*End non-tagged */
                   5629: 
                   5630:              else {
                   5631:                 currTar_Info->TarLUNBusy[lun] = TRUE;
                   5632:                 }
                   5633: 
                   5634:              }  /*!Use cmd Q Tagged */
                   5635: 
                   5636:           else {
                   5637:             if (currTar_Info->TarLUN_CA == TRUE)
                   5638:                {
                   5639:              queueSelectFail(CurrCard,p_card);
                   5640:                                   SGRAM_ACCESS(port);
                   5641:              return;
                   5642:                    }
                   5643: 
                   5644:                currTar_Info->TarLUNBusy[lun] = TRUE;
                   5645: 
                   5646:             }  /*else use cmd Q tagged */
                   5647: 
                   5648:       }  /*if glob tagged started */
                   5649: 
                   5650:    else {
                   5651:         currTar_Info->TarLUNBusy[lun] = TRUE;
                   5652:         }
                   5653: 
                   5654: #endif /* DOS */
                   5655: 
                   5656: 
                   5657: 
                   5658:        if((((CurrCard->globalFlags & F_CONLUN_IO) && 
                   5659:                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)) 
                   5660:                || (!(currSCCB->ControlByte & F_USE_CMD_Q))))
                   5661:        {
                   5662:                if(CurrCard->discQCount >= QUEUE_DEPTH)
                   5663:                {
                   5664:                        currTar_Info->TarLUNBusy[lun] = TRUE;
                   5665:                        queueSelectFail(CurrCard,p_card);
                   5666:                        SGRAM_ACCESS(port);
                   5667:                        return;
                   5668:                }
                   5669:                for (i = 1; i < QUEUE_DEPTH; i++)
                   5670:                {
                   5671:                        if (++lastTag >= QUEUE_DEPTH) lastTag = 1;
                   5672:                        if (CurrCard->discQ_Tbl[lastTag] == NULL)
                   5673:                        {
                   5674:                                CurrCard->tagQ_Lst = lastTag;
                   5675:                                currTar_Info->LunDiscQ_Idx[lun] = lastTag;
                   5676:                                CurrCard->discQ_Tbl[lastTag] = currSCCB;
                   5677:                                CurrCard->discQCount++;
                   5678:                                break;
                   5679:                        }
                   5680:                }
                   5681:                if(i == QUEUE_DEPTH)
                   5682:                {
                   5683:                        currTar_Info->TarLUNBusy[lun] = TRUE;
                   5684:                        queueSelectFail(CurrCard,p_card);
                   5685:                        SGRAM_ACCESS(port);
                   5686:                        return;
                   5687:                }
                   5688:        }
                   5689: 
                   5690: 
                   5691: 
                   5692:    auto_loaded = FALSE;
                   5693: 
                   5694:    WR_HARPOON(port+hp_select_id, target);
                   5695:    WR_HARPOON(port+hp_gp_reg_3, target);  /* Use by new automation logic */
                   5696: 
                   5697:    if (currSCCB->OperationCode == RESET_COMMAND) {
                   5698:       WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+
                   5699:                         (currSCCB->Sccb_idmsg & ~DISC_PRIV)));
                   5700: 
                   5701:       WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+NP);
                   5702: 
                   5703:       currSCCB->Sccb_scsimsg = SMDEV_RESET;
                   5704: 
                   5705:       WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
                   5706:       auto_loaded = TRUE;
                   5707:       currSCCB->Sccb_scsistat = SELECT_BDR_ST;
                   5708: 
                   5709:       if (currTar_Info->TarEEValue & EE_SYNC_MASK)
                   5710:          {
                   5711:               currTar_Info->TarSyncCtrl = 0;
                   5712:              currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
                   5713:              }
                   5714: 
                   5715: #if defined(WIDE_SCSI)
                   5716: 
                   5717:       if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
                   5718:          {
                   5719:        currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
                   5720:        }
                   5721: #endif
                   5722: 
                   5723:       sssyncv(port, target, NARROW_SCSI,currTar_Info);
                   5724:       SccbMgrTableInitTarget(p_card, target);
                   5725: 
                   5726:       }
                   5727: 
                   5728:                else if(currSCCB->Sccb_scsistat == ABORT_ST)
                   5729:                {
                   5730:                        WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+
                   5731:                                                                (currSCCB->Sccb_idmsg & ~DISC_PRIV)));
                   5732: 
                   5733:       WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
                   5734: 
                   5735:                        WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+
                   5736:                                                                (((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK)
                   5737:                                                                >> 6) | (UCHAR)0x20)));
                   5738:                        WRW_HARPOON((port+SYNC_MSGS+2),
                   5739:                                                        (MPM_OP+AMSG_OUT+currSCCB->Sccb_tag));
                   5740:                        WRW_HARPOON((port+SYNC_MSGS+4), (BRH_OP+ALWAYS+NP ));
                   5741: 
                   5742:                        WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
                   5743:                        auto_loaded = TRUE;
                   5744:                
                   5745:                }
                   5746: 
                   5747: #if defined(WIDE_SCSI)
                   5748: 
                   5749: 
                   5750:    else if (!(currTar_Info->TarStatus & WIDE_NEGOCIATED))  {
                   5751:       auto_loaded = siwidn(port,p_card);
                   5752:       currSCCB->Sccb_scsistat = SELECT_WN_ST;
                   5753:       }
                   5754: 
                   5755: #endif
                   5756: 
                   5757: 
                   5758:    else if (!((currTar_Info->TarStatus & TAR_SYNC_MASK)
                   5759:       == SYNC_SUPPORTED))  {
                   5760:       auto_loaded = sisyncn(port,p_card, FALSE);
                   5761:       currSCCB->Sccb_scsistat = SELECT_SN_ST;
                   5762:       }
                   5763: 
                   5764: 
                   5765:    if (!auto_loaded)
                   5766:       {
                   5767: 
                   5768: #if !defined(DOS)
                   5769:       if (currSCCB->ControlByte & F_USE_CMD_Q)
                   5770:          {
                   5771: 
                   5772:          CurrCard->globalFlags |= F_TAG_STARTED;
                   5773: 
                   5774:          if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK)
                   5775:             == TAG_Q_REJECT)
                   5776:             {
                   5777:             currSCCB->ControlByte &= ~F_USE_CMD_Q;
                   5778: 
                   5779:             /* Fix up the start instruction with a jump to
                   5780:                Non-Tag-CMD handling */
                   5781:             WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD);
                   5782: 
                   5783:             WRW_HARPOON((port+NON_TAG_ID_MSG),
                   5784:                             (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
                   5785: 
                   5786:                 WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
                   5787: 
                   5788:                 /* Setup our STATE so we know what happend when
                   5789:                the wheels fall off. */
                   5790:             currSCCB->Sccb_scsistat = SELECT_ST;
                   5791: 
                   5792:                 currTar_Info->TarLUNBusy[lun] = TRUE;
                   5793:             }
                   5794: 
                   5795:          else
                   5796:             {
                   5797:             WRW_HARPOON((port+ID_MSG_STRT), (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
                   5798: 
                   5799:             WRW_HARPOON((port+ID_MSG_STRT+2), (MPM_OP+AMSG_OUT+
                   5800:                         (((UCHAR)(currSCCB->ControlByte & TAG_TYPE_MASK)
                   5801:                         >> 6) | (UCHAR)0x20)));
                   5802: 
                   5803:                                for (i = 1; i < QUEUE_DEPTH; i++)
                   5804:                                {
                   5805:                                        if (++lastTag >= QUEUE_DEPTH) lastTag = 1;
                   5806:                                        if (CurrCard->discQ_Tbl[lastTag] == NULL)
                   5807:                                        {
                   5808:                                                WRW_HARPOON((port+ID_MSG_STRT+6),
                   5809:                                                        (MPM_OP+AMSG_OUT+lastTag));
                   5810:                                                CurrCard->tagQ_Lst = lastTag;
                   5811:                                                currSCCB->Sccb_tag = lastTag;
                   5812:                                                CurrCard->discQ_Tbl[lastTag] = currSCCB;
                   5813:                                                CurrCard->discQCount++;
                   5814:                                                break;
                   5815:                                        }
                   5816:                                }
                   5817: 
                   5818: 
                   5819:             if ( i == QUEUE_DEPTH )
                   5820:                {
                   5821:                 currTar_Info->TarLUNBusy[lun] = TRUE;
                   5822:                queueSelectFail(CurrCard,p_card);
                   5823:                                   SGRAM_ACCESS(port);
                   5824:                 return;
                   5825:                 }
                   5826: 
                   5827:             currSCCB->Sccb_scsistat = SELECT_Q_ST;
                   5828: 
                   5829:              WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
                   5830:             }
                   5831:          }
                   5832: 
                   5833:       else
                   5834:          {
                   5835: #endif   /* !DOS */
                   5836: 
                   5837:          WRW_HARPOON((port+ID_MSG_STRT),BRH_OP+ALWAYS+NTCMD);
                   5838: 
                   5839:        WRW_HARPOON((port+NON_TAG_ID_MSG),
                   5840:             (MPM_OP+AMSG_OUT+currSCCB->Sccb_idmsg));
                   5841: 
                   5842:          currSCCB->Sccb_scsistat = SELECT_ST;
                   5843: 
                   5844:          WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
                   5845: #if !defined(DOS)
                   5846:          }
                   5847: #endif
                   5848: 
                   5849: 
                   5850: #if defined(OS2)
                   5851:       theCCB = (UCHAR far *)&currSCCB->Cdb[0];
                   5852: #else
                   5853:       theCCB = (UCHAR *)&currSCCB->Cdb[0];
                   5854: #endif
                   5855: 
                   5856:       cdb_reg = port + CMD_STRT;
                   5857: 
                   5858:       for (i=0; i < currSCCB->CdbLength; i++)
                   5859:          {
                   5860:          WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + *theCCB));
                   5861:          cdb_reg +=2;
                   5862:          theCCB++;
                   5863:          }
                   5864: 
                   5865:       if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
                   5866:          WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+    NP));
                   5867: 
                   5868:       }  /* auto_loaded */
                   5869: 
                   5870: #if defined(WIDE_SCSI)
                   5871:    WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
                   5872:    WR_HARPOON(port+hp_xferstat, 0x00);
                   5873: #endif
                   5874: 
                   5875:    WRW_HARPOON((port+hp_intstat), (PROG_HLT | TIMEOUT | SEL | BUS_FREE));
                   5876: 
                   5877:    WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT));
                   5878: 
                   5879: 
                   5880:    if (!(currSCCB->Sccb_MGRFlags & F_DEV_SELECTED))
                   5881:       {
                   5882:       WR_HARPOON(port+hp_scsictrl_0, (SEL_TAR | ENA_ATN | ENA_RESEL | ENA_SCAM_SEL));
                   5883:       }
                   5884:    else
                   5885:       {
                   5886: 
                   5887: /*      auto_loaded =  (RD_HARPOON(port+hp_autostart_3) & (UCHAR)0x1F);
                   5888:       auto_loaded |= AUTO_IMMED; */
                   5889:       auto_loaded = AUTO_IMMED;
                   5890: 
                   5891:       DISABLE_AUTO(port);
                   5892: 
                   5893:       WR_HARPOON(port+hp_autostart_3, auto_loaded);
                   5894:       }
                   5895: 
                   5896:    SGRAM_ACCESS(port);
                   5897: }
                   5898: 
                   5899: 
                   5900: /*---------------------------------------------------------------------
                   5901:  *
                   5902:  * Function: sres
                   5903:  *
                   5904:  * Description: Hookup the correct CCB and handle the incoming messages.
                   5905:  *
                   5906:  *---------------------------------------------------------------------*/
                   5907: 
                   5908: #if defined(DOS)
                   5909: void sres(USHORT port, UCHAR p_card, PSCCBcard pCurrCard)
                   5910: #else
                   5911: void sres(ULONG port, UCHAR p_card, PSCCBcard pCurrCard)
                   5912: #endif
                   5913: {
                   5914: 
                   5915: #if defined(V302)
                   5916: #ifdef DOS
                   5917:    UCHAR our_target,message, msgRetryCount;
                   5918:    extern UCHAR lun, tag;
                   5919: #else
                   5920:    UCHAR our_target,message,lun,tag, msgRetryCount;
                   5921: #endif
                   5922: 
                   5923: #else  /* V302 */
                   5924:    UCHAR our_target, message, lun = 0, tag, msgRetryCount;
                   5925: #endif /* V302 */
                   5926: 
                   5927: 
                   5928:    PSCCBMgr_tar_info currTar_Info;
                   5929:        PSCCB currSCCB;
                   5930: 
                   5931: 
                   5932: 
                   5933: 
                   5934:        if(pCurrCard->currentSCCB != NULL)
                   5935:        {
                   5936:                currTar_Info = &sccbMgrTbl[p_card][pCurrCard->currentSCCB->TargID];
                   5937:                DISABLE_AUTO(port);
                   5938: 
                   5939: 
                   5940:                WR_HARPOON((port+hp_scsictrl_0),(ENA_RESEL | ENA_SCAM_SEL));
                   5941: 
                   5942: 
                   5943:                currSCCB = pCurrCard->currentSCCB;
                   5944:                if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
                   5945:                {
                   5946:                        currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
                   5947:                        currSCCB->Sccb_scsistat = BUS_FREE_ST;
                   5948:                }
                   5949:                if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
                   5950:                {
                   5951:                        currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
                   5952:                        currSCCB->Sccb_scsistat = BUS_FREE_ST;
                   5953:                }
                   5954:                if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
                   5955:                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   5956:                {
                   5957:        currTar_Info->TarLUNBusy[currSCCB->Lun] = FALSE;
                   5958:                        if(currSCCB->Sccb_scsistat != ABORT_ST)
                   5959:                        {
                   5960:                                pCurrCard->discQCount--;
                   5961:                                pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[currSCCB->Lun]] 
                   5962:                                                                                                        = NULL;
                   5963:                        }
                   5964:                }
                   5965:                else
                   5966:                {
                   5967:              currTar_Info->TarLUNBusy[0] = FALSE;
                   5968:                        if(currSCCB->Sccb_tag)
                   5969:                        {
                   5970:                                if(currSCCB->Sccb_scsistat != ABORT_ST)
                   5971:                                {
                   5972:                                        pCurrCard->discQCount--;
                   5973:                                        pCurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                   5974:                                }
                   5975:                        }else
                   5976:                        {
                   5977:                                if(currSCCB->Sccb_scsistat != ABORT_ST)
                   5978:                                {
                   5979:                                        pCurrCard->discQCount--;
                   5980:                                        pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
                   5981:                                }
                   5982:                        }
                   5983:                }
                   5984: 
                   5985:       queueSelectFail(&BL_Card[p_card],p_card);
                   5986:        }
                   5987: 
                   5988: #if defined(WIDE_SCSI)
                   5989:        WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
                   5990: #endif
                   5991: 
                   5992: 
                   5993:        our_target = (UCHAR)(RD_HARPOON(port+hp_select_id) >> 4);
                   5994:        currTar_Info = &sccbMgrTbl[p_card][our_target];
                   5995: 
                   5996: 
                   5997:        msgRetryCount = 0;
                   5998:        do
                   5999:        {
                   6000: 
                   6001: #if defined(V302)
                   6002: 
                   6003:                message = GetTarLun(port, p_card, our_target, pCurrCard, &tag, &lun);
                   6004: 
                   6005: #else /* V302 */
                   6006: 
                   6007:                currTar_Info = &sccbMgrTbl[p_card][our_target];
                   6008:                tag = 0;
                   6009: 
                   6010: 
                   6011:                while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
                   6012:                {
                   6013:                        if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
                   6014:                        {
                   6015: 
                   6016:                                WRW_HARPOON((port+hp_intstat), PHASE);
                   6017:                                return;
                   6018:                        }
                   6019:                }
                   6020: 
                   6021:                WRW_HARPOON((port+hp_intstat), PHASE);
                   6022:                if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH)
                   6023:                {
                   6024: 
                   6025:                        message = sfm(port,pCurrCard->currentSCCB);
                   6026:                        if (message)
                   6027:                        {
                   6028: 
                   6029:                                if (message <= (0x80 | LUN_MASK))
                   6030:                                {
                   6031:                                        lun = message & (UCHAR)LUN_MASK;
                   6032: 
                   6033: #if !defined(DOS)
                   6034:                                        if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING)
                   6035:                                        {
                   6036:                                                if (currTar_Info->TarTagQ_Cnt != 0)
                   6037:                                                {
                   6038: 
                   6039:                                                        if (!(currTar_Info->TarLUN_CA))
                   6040:                                                        {
                   6041:                                                                ACCEPT_MSG(port);    /*Release the ACK for ID msg. */
                   6042: 
                   6043: 
                   6044:                                                                message = sfm(port,pCurrCard->currentSCCB);
                   6045:                                                                if (message)
                   6046:                                                                {
                   6047:                                                                        ACCEPT_MSG(port);
                   6048:                                                                }
                   6049: 
                   6050:                                                                else
                   6051:                                                                message = FALSE;
                   6052: 
                   6053:                                                                if(message != FALSE)
                   6054:                                                                {
                   6055:                                                                        tag = sfm(port,pCurrCard->currentSCCB);
                   6056: 
                   6057:                                                                        if (!(tag)) 
                   6058:                                                                                message = FALSE;
                   6059:                                                                }
                   6060: 
                   6061:                                                        } /*C.A. exists! */
                   6062: 
                   6063:                                                } /*End Q cnt != 0 */
                   6064: 
                   6065:                                        } /*End Tag cmds supported! */
                   6066: #endif /* !DOS */
                   6067: 
                   6068:                                } /*End valid ID message.  */
                   6069: 
                   6070:                                else
                   6071:                                {
                   6072: 
                   6073:                                        ACCEPT_MSG_ATN(port);
                   6074:                                }
                   6075: 
                   6076:                        } /* End good id message. */
                   6077: 
                   6078:                        else
                   6079:                        {
                   6080: 
                   6081:                                message = FALSE;
                   6082:                        }
                   6083:                }
                   6084:                else
                   6085:                {
                   6086:                        ACCEPT_MSG_ATN(port);
                   6087: 
                   6088:                   while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) &&
                   6089:                          !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) &&
                   6090:                          (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ;
                   6091: 
                   6092:                        return;
                   6093:                }
                   6094:        
                   6095: #endif /* V302 */
                   6096: 
                   6097:                if(message == FALSE)
                   6098:                {
                   6099:                        msgRetryCount++;
                   6100:                        if(msgRetryCount == 1)
                   6101:                        {
                   6102:                                SendMsg(port, SMPARITY);
                   6103:                        }
                   6104:                        else
                   6105:                        {
                   6106:                                SendMsg(port, SMDEV_RESET);
                   6107: 
                   6108:                                sssyncv(port, our_target, NARROW_SCSI,currTar_Info);
                   6109: 
                   6110:                                if (sccbMgrTbl[p_card][our_target].TarEEValue & EE_SYNC_MASK) 
                   6111:                                {
                   6112:                        
                   6113:                                        sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_SYNC_MASK;
                   6114: 
                   6115:                                }
                   6116: 
                   6117:                                if (sccbMgrTbl[p_card][our_target].TarEEValue & EE_WIDE_SCSI) 
                   6118:                                {
                   6119: 
                   6120:                                        sccbMgrTbl[p_card][our_target].TarStatus &= ~TAR_WIDE_MASK;
                   6121:                                }
                   6122: 
                   6123: 
                   6124:                                queueFlushTargSccb(p_card, our_target, SCCB_COMPLETE);
                   6125:                                SccbMgrTableInitTarget(p_card,our_target);
                   6126:                                return;
                   6127:                        }
                   6128:                }
                   6129:        }while(message == FALSE);
                   6130: 
                   6131: 
                   6132: 
                   6133:        if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
                   6134:                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   6135:        {
                   6136:                currTar_Info->TarLUNBusy[lun] = TRUE;
                   6137:                pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[lun]];
                   6138:                if(pCurrCard->currentSCCB != NULL)
                   6139:                {
                   6140:                        ACCEPT_MSG(port);
                   6141:                }
                   6142:                else 
                   6143:                {
                   6144:                        ACCEPT_MSG_ATN(port);
                   6145:                }
                   6146:        }
                   6147:        else
                   6148:        {
                   6149:                currTar_Info->TarLUNBusy[0] = TRUE;
                   6150: 
                   6151: 
                   6152:                if (tag)
                   6153:                {
                   6154:                        if (pCurrCard->discQ_Tbl[tag] != NULL)
                   6155:                        {
                   6156:                                pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[tag];
                   6157:                                currTar_Info->TarTagQ_Cnt--;
                   6158:                                ACCEPT_MSG(port);
                   6159:                        }
                   6160:                        else
                   6161:                        {
                   6162:                        ACCEPT_MSG_ATN(port);
                   6163:                        }
                   6164:                }else
                   6165:                {
                   6166:                        pCurrCard->currentSCCB = pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]];
                   6167:                        if(pCurrCard->currentSCCB != NULL)
                   6168:                        {
                   6169:                                ACCEPT_MSG(port);
                   6170:                        }
                   6171:                        else 
                   6172:                        {
                   6173:                                ACCEPT_MSG_ATN(port);
                   6174:                        }
                   6175:                }
                   6176:        }
                   6177: 
                   6178:        if(pCurrCard->currentSCCB != NULL)
                   6179:        {
                   6180:                if(pCurrCard->currentSCCB->Sccb_scsistat == ABORT_ST)
                   6181:                {
                   6182:                /* During Abort Tag command, the target could have got re-selected
                   6183:                        and completed the command. Check the select Q and remove the CCB
                   6184:                        if it is in the Select Q */
                   6185:                        queueFindSccb(pCurrCard->currentSCCB, p_card);
                   6186:                }
                   6187:        }
                   6188: 
                   6189: 
                   6190:    while (!(RDW_HARPOON((port+hp_intstat)) & (PHASE | RESET)) &&
                   6191:          !(RD_HARPOON(port+hp_scsisig) & SCSI_REQ) &&
                   6192:          (RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ;
                   6193: }
                   6194: 
                   6195: #if defined(V302)
                   6196: 
                   6197: #if defined(DOS)
                   6198: UCHAR GetTarLun(USHORT port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun)
                   6199: #else
                   6200: UCHAR GetTarLun(ULONG port, UCHAR p_card, UCHAR our_target, PSCCBcard pCurrCard, PUCHAR tag, PUCHAR lun)
                   6201: #endif
                   6202: {
                   6203:    UCHAR message;
                   6204:    PSCCBMgr_tar_info currTar_Info;
                   6205: 
                   6206: 
                   6207:        currTar_Info = &sccbMgrTbl[p_card][our_target];
                   6208:        *tag = 0;
                   6209: 
                   6210: 
                   6211:        while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
                   6212:        {
                   6213:                if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
                   6214:                {
                   6215: 
                   6216:                        WRW_HARPOON((port+hp_intstat), PHASE);
                   6217:                        return(TRUE);
                   6218:                }
                   6219:        }
                   6220: 
                   6221:        WRW_HARPOON((port+hp_intstat), PHASE);
                   6222:        if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGI_PH)
                   6223:        {
                   6224: 
                   6225:                message = sfm(port,pCurrCard->currentSCCB);
                   6226:                if (message)
                   6227:                {
                   6228: 
                   6229:                        if (message <= (0x80 | LUN_MASK))
                   6230:                        {
                   6231:                                *lun = message & (UCHAR)LUN_MASK;
                   6232: 
                   6233: #if !defined(DOS)
                   6234:                                if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING)
                   6235:                                {
                   6236:                                        if (currTar_Info->TarTagQ_Cnt != 0)
                   6237:                                        {
                   6238: 
                   6239:                                                if (!(currTar_Info->TarLUN_CA))
                   6240:                                                {
                   6241:                                                        ACCEPT_MSG(port);    /*Release the ACK for ID msg. */
                   6242: 
                   6243: 
                   6244:                                                        message = sfm(port,pCurrCard->currentSCCB);
                   6245:                                                        if (message)
                   6246:                                                        {
                   6247:                                                                ACCEPT_MSG(port);
                   6248:                                                        }
                   6249: 
                   6250:                                                        else
                   6251:                                                        return(FALSE);
                   6252: 
                   6253:                                                        *tag = sfm(port,pCurrCard->currentSCCB);
                   6254: 
                   6255:                                                        if (!(*tag)) return(FALSE);
                   6256: 
                   6257:                                                } /*C.A. exists! */
                   6258: 
                   6259:                                        } /*End Q cnt != 0 */
                   6260: 
                   6261:                                } /*End Tag cmds supported! */
                   6262: #endif /* !DOS */
                   6263: 
                   6264:                        } /*End valid ID message.  */
                   6265: 
                   6266:                        else
                   6267:                        {
                   6268: 
                   6269:                                ACCEPT_MSG_ATN(port);
                   6270:                        }
                   6271: 
                   6272:                } /* End good id message. */
                   6273: 
                   6274:                else
                   6275:                {
                   6276: 
                   6277:                        return(FALSE);
                   6278:                }
                   6279:        }
                   6280:        else
                   6281:        {
                   6282:                ACCEPT_MSG_ATN(port);
                   6283:                return(TRUE);
                   6284:        }
                   6285:        return(TRUE);
                   6286: }
                   6287: 
                   6288: #endif /* V302 */
                   6289: 
                   6290: #if defined(DOS)
                   6291: void SendMsg(USHORT port, UCHAR message)
                   6292: #else
                   6293: void SendMsg(ULONG port, UCHAR message)
                   6294: #endif
                   6295: {
                   6296:        while(!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ))
                   6297:        {
                   6298:                if (! (RD_HARPOON(port+hp_scsisig) & SCSI_BSY))
                   6299:                {
                   6300: 
                   6301:                        WRW_HARPOON((port+hp_intstat), PHASE);
                   6302:                        return;
                   6303:                }
                   6304:        }
                   6305: 
                   6306:        WRW_HARPOON((port+hp_intstat), PHASE);
                   6307:        if ((RD_HARPOON(port+hp_scsisig) & S_SCSI_PHZ) == S_MSGO_PH)
                   6308:        {
                   6309:                WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
                   6310: 
                   6311: 
                   6312:                WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN);
                   6313: 
                   6314:                WR_HARPOON(port+hp_scsidata_0,message);
                   6315: 
                   6316:                WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
                   6317: 
                   6318:                ACCEPT_MSG(port);
                   6319: 
                   6320:                WR_HARPOON(port+hp_portctrl_0, 0x00);
                   6321: 
                   6322:                if ((message == SMABORT) || (message == SMDEV_RESET) ||
                   6323:                                (message == SMABORT_TAG) )
                   6324:                {
                   6325:                        while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {}
                   6326: 
                   6327:                        if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
                   6328:                        {
                   6329:                        WRW_HARPOON((port+hp_intstat), BUS_FREE);
                   6330:                        }
                   6331:                }
                   6332:        }
                   6333: }
                   6334: 
                   6335: /*---------------------------------------------------------------------
                   6336:  *
                   6337:  * Function: sdecm
                   6338:  *
                   6339:  * Description: Determine the proper responce to the message from the
                   6340:  *              target device.
                   6341:  *
                   6342:  *---------------------------------------------------------------------*/
                   6343: #if defined(DOS)
                   6344: void sdecm(UCHAR message, USHORT port, UCHAR p_card)
                   6345: #else
                   6346: void sdecm(UCHAR message, ULONG port, UCHAR p_card)
                   6347: #endif
                   6348: {
                   6349:        PSCCB currSCCB;
                   6350:        PSCCBcard CurrCard;
                   6351:        PSCCBMgr_tar_info currTar_Info;
                   6352: 
                   6353:        CurrCard = &BL_Card[p_card];
                   6354:        currSCCB = CurrCard->currentSCCB;
                   6355: 
                   6356:        currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
                   6357: 
                   6358:        if (message == SMREST_DATA_PTR)
                   6359:        {
                   6360:                if (!(currSCCB->Sccb_XferState & F_NO_DATA_YET))
                   6361:                {
                   6362:                        currSCCB->Sccb_ATC = currSCCB->Sccb_savedATC;
                   6363: 
                   6364:                        hostDataXferRestart(currSCCB);
                   6365:                }
                   6366: 
                   6367:                ACCEPT_MSG(port);
                   6368:                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6369:        }
                   6370: 
                   6371:        else if (message == SMCMD_COMP)
                   6372:        {
                   6373: 
                   6374: 
                   6375:                if (currSCCB->Sccb_scsistat == SELECT_Q_ST)
                   6376:                {
                   6377:                        currTar_Info->TarStatus &= ~(UCHAR)TAR_TAG_Q_MASK;
                   6378:                        currTar_Info->TarStatus |= (UCHAR)TAG_Q_REJECT;
                   6379:                }
                   6380: 
                   6381:                ACCEPT_MSG(port);
                   6382: 
                   6383:        }
                   6384: 
                   6385:        else if ((message == SMNO_OP) || (message >= SMIDENT) 
                   6386:                        || (message == SMINIT_RECOVERY) || (message == SMREL_RECOVERY))
                   6387:        {
                   6388: 
                   6389:                ACCEPT_MSG(port);
                   6390:                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6391:        }
                   6392: 
                   6393:        else if (message == SMREJECT)
                   6394:        {
                   6395: 
                   6396:                if ((currSCCB->Sccb_scsistat == SELECT_SN_ST) ||
                   6397:                                (currSCCB->Sccb_scsistat == SELECT_WN_ST) ||
                   6398:                                ((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING ) ||
                   6399:                                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING ) )
                   6400: 
                   6401:                {
                   6402:                        WRW_HARPOON((port+hp_intstat), BUS_FREE);
                   6403: 
                   6404:                        ACCEPT_MSG(port);
                   6405: 
                   6406: 
                   6407:                        while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
                   6408:                                (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {}
                   6409: 
                   6410:                        if(currSCCB->Lun == 0x00)
                   6411:                        {
                   6412:                                if ((currSCCB->Sccb_scsistat == SELECT_SN_ST))
                   6413:                                {
                   6414: 
                   6415:                                        currTar_Info->TarStatus |= (UCHAR)SYNC_SUPPORTED;
                   6416: 
                   6417:                                        currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
                   6418:                                }
                   6419: 
                   6420: #if defined(WIDE_SCSI)
                   6421:                                else if ((currSCCB->Sccb_scsistat == SELECT_WN_ST))
                   6422:                                {
                   6423: 
                   6424: 
                   6425:                                        currTar_Info->TarStatus = (currTar_Info->TarStatus &
                   6426:                                                                                                        ~WIDE_ENABLED) | WIDE_NEGOCIATED;
                   6427: 
                   6428:                                        currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
                   6429: 
                   6430:                                }
                   6431: #endif
                   6432: 
                   6433:                                else if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_TRYING )
                   6434:                                {
                   6435:                                        currTar_Info->TarStatus = (currTar_Info->TarStatus &
                   6436:                                                                                                        ~(UCHAR)TAR_TAG_Q_MASK) | TAG_Q_REJECT;
                   6437: 
                   6438: 
                   6439:                                        currSCCB->ControlByte &= ~F_USE_CMD_Q;
                   6440:                                        CurrCard->discQCount--;
                   6441:                                        CurrCard->discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                   6442:                                        currSCCB->Sccb_tag = 0x00;
                   6443: 
                   6444:                                }
                   6445:                        }
                   6446: 
                   6447:                        if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE)
                   6448:                        {
                   6449: 
                   6450: 
                   6451:                                if(currSCCB->Lun == 0x00)
                   6452:                                {
                   6453:                                        WRW_HARPOON((port+hp_intstat), BUS_FREE);
                   6454:                                        CurrCard->globalFlags |= F_NEW_SCCB_CMD;
                   6455:                                }
                   6456:                        }
                   6457: 
                   6458:                        else 
                   6459:                        {
                   6460: 
                   6461:                                if((CurrCard->globalFlags & F_CONLUN_IO) &&
                   6462:                                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                   6463:                                        currTar_Info->TarLUNBusy[currSCCB->Lun] = TRUE;
                   6464:                                else
                   6465:                                        currTar_Info->TarLUNBusy[0] = TRUE;
                   6466: 
                   6467: 
                   6468:                                currSCCB->ControlByte &= ~(UCHAR)F_USE_CMD_Q;
                   6469: 
                   6470:                                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6471: 
                   6472:                        }
                   6473:                }
                   6474: 
                   6475:                else
                   6476:                {
                   6477:                        ACCEPT_MSG(port);
                   6478: 
                   6479:                        while ((!(RD_HARPOON(port+hp_scsisig) & SCSI_REQ)) &&
                   6480:                                (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))) {}
                   6481:        
                   6482:                        if (!(RDW_HARPOON((port+hp_intstat)) & BUS_FREE))
                   6483:                        {
                   6484:                                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6485:                        }
                   6486:                }
                   6487:        }
                   6488: 
                   6489:        else if (message == SMEXT)
                   6490:        {
                   6491: 
                   6492:                ACCEPT_MSG(port);
                   6493:                shandem(port,p_card,currSCCB);
                   6494:        }
                   6495: 
                   6496:        else if (message == SMIGNORWR)
                   6497:        {
                   6498: 
                   6499:                ACCEPT_MSG(port);          /* ACK the RESIDUE MSG */
                   6500: 
                   6501:                message = sfm(port,currSCCB);
                   6502: 
                   6503:                if(currSCCB->Sccb_scsimsg != SMPARITY)
                   6504:                        ACCEPT_MSG(port);
                   6505:                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6506:        }
                   6507: 
                   6508: 
                   6509:        else
                   6510:        {
                   6511: 
                   6512:                currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
                   6513:                currSCCB->Sccb_scsimsg = SMREJECT;
                   6514: 
                   6515:                ACCEPT_MSG_ATN(port);
                   6516:                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6517:        }
                   6518: }
                   6519: 
                   6520: 
                   6521: /*---------------------------------------------------------------------
                   6522:  *
                   6523:  * Function: shandem
                   6524:  *
                   6525:  * Description: Decide what to do with the extended message.
                   6526:  *
                   6527:  *---------------------------------------------------------------------*/
                   6528: #if defined(DOS)
                   6529: void shandem(USHORT port, UCHAR p_card, PSCCB pCurrSCCB)
                   6530: #else
                   6531: void shandem(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                   6532: #endif
                   6533: {
                   6534:        UCHAR length,message;
                   6535: 
                   6536:        length = sfm(port,pCurrSCCB);
                   6537:        if (length) 
                   6538:        {
                   6539: 
                   6540:                ACCEPT_MSG(port);
                   6541:                message = sfm(port,pCurrSCCB);
                   6542:                if (message) 
                   6543:                {
                   6544: 
                   6545:                        if (message == SMSYNC) 
                   6546:                        {
                   6547: 
                   6548:                                if (length == 0x03)
                   6549:                                {
                   6550: 
                   6551:                                        ACCEPT_MSG(port);
                   6552:                                        stsyncn(port,p_card);
                   6553:                                }
                   6554:                                else 
                   6555:                                {
                   6556: 
                   6557:                                        pCurrSCCB->Sccb_scsimsg = SMREJECT;
                   6558:                                        ACCEPT_MSG_ATN(port);
                   6559:                                }
                   6560:                        }
                   6561: #if defined(WIDE_SCSI)
                   6562:                        else if (message == SMWDTR) 
                   6563:                        {
                   6564: 
                   6565:                                if (length == 0x02)
                   6566:                                {
                   6567: 
                   6568:                                        ACCEPT_MSG(port);
                   6569:                                        stwidn(port,p_card);
                   6570:                                }
                   6571:                                else 
                   6572:                                {
                   6573: 
                   6574:                                        pCurrSCCB->Sccb_scsimsg = SMREJECT;
                   6575:                                        ACCEPT_MSG_ATN(port);
                   6576: 
                   6577:                                        WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6578:                                }
                   6579:                        }
                   6580: #endif
                   6581:                        else 
                   6582:                        {
                   6583: 
                   6584:                                pCurrSCCB->Sccb_scsimsg = SMREJECT;
                   6585:                                ACCEPT_MSG_ATN(port);
                   6586: 
                   6587:                                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6588:                        }
                   6589:                }
                   6590:                else
                   6591:                {
                   6592:                        if(pCurrSCCB->Sccb_scsimsg != SMPARITY)
                   6593:                                ACCEPT_MSG(port);
                   6594:                        WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6595:                }
                   6596:        }else
                   6597:        {
                   6598:                        if(pCurrSCCB->Sccb_scsimsg == SMPARITY)
                   6599:                                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6600:        }
                   6601: }
                   6602: 
                   6603: 
                   6604: /*---------------------------------------------------------------------
                   6605:  *
                   6606:  * Function: sisyncn
                   6607:  *
                   6608:  * Description: Read in a message byte from the SCSI bus, and check
                   6609:  *              for a parity error.
                   6610:  *
                   6611:  *---------------------------------------------------------------------*/
                   6612: 
                   6613: #if defined(DOS)
                   6614: UCHAR sisyncn(USHORT port, UCHAR p_card, UCHAR syncFlag)
                   6615: #else
                   6616: UCHAR sisyncn(ULONG port, UCHAR p_card, UCHAR syncFlag)
                   6617: #endif
                   6618: {
                   6619:    PSCCB currSCCB;
                   6620:    PSCCBMgr_tar_info currTar_Info;
                   6621: 
                   6622:    currSCCB = BL_Card[p_card].currentSCCB;
                   6623:    currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
                   6624: 
                   6625:    if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_TRYING)) {
                   6626: 
                   6627: 
                   6628:       WRW_HARPOON((port+ID_MSG_STRT),
                   6629:                  (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV)));
                   6630: 
                   6631:       WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
                   6632: 
                   6633:       WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
                   6634:       WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03  ));
                   6635:       WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC));
                   6636: 
                   6637: 
                   6638:       if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
                   6639: 
                   6640:         WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 12));
                   6641: 
                   6642:       else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
                   6643: 
                   6644:         WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 25));
                   6645: 
                   6646:       else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
                   6647: 
                   6648:         WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 50));
                   6649: 
                   6650:       else
                   6651:         WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+ 00));
                   6652: 
                   6653: 
                   6654:       WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP                ));
                   6655:       WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+DEFAULT_OFFSET));
                   6656:       WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP      ));
                   6657: 
                   6658: 
                   6659:                if(syncFlag == FALSE)
                   6660:                {
                   6661:                   WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
                   6662:              currTar_Info->TarStatus = ((currTar_Info->TarStatus &
                   6663:              ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_TRYING);
                   6664:                }
                   6665:                else
                   6666:                {
                   6667:                   WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED + CMD_ONLY_STRT));
                   6668:                }
                   6669: 
                   6670: 
                   6671:       return(TRUE);
                   6672:       }
                   6673: 
                   6674:    else {
                   6675: 
                   6676:       currTar_Info->TarStatus |=        (UCHAR)SYNC_SUPPORTED;
                   6677:       currTar_Info->TarEEValue &= ~EE_SYNC_MASK;
                   6678:       return(FALSE);
                   6679:       }
                   6680: }
                   6681: 
                   6682: 
                   6683: 
                   6684: /*---------------------------------------------------------------------
                   6685:  *
                   6686:  * Function: stsyncn
                   6687:  *
                   6688:  * Description: The has sent us a Sync Nego message so handle it as
                   6689:  *              necessary.
                   6690:  *
                   6691:  *---------------------------------------------------------------------*/
                   6692: #if defined(DOS)
                   6693: void stsyncn(USHORT port, UCHAR p_card)
                   6694: #else
                   6695: void stsyncn(ULONG port, UCHAR p_card)
                   6696: #endif
                   6697: {
                   6698:    UCHAR sync_msg,offset,sync_reg,our_sync_msg;
                   6699:    PSCCB currSCCB;
                   6700:    PSCCBMgr_tar_info currTar_Info;
                   6701: 
                   6702:    currSCCB = BL_Card[p_card].currentSCCB;
                   6703:    currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
                   6704: 
                   6705:    sync_msg = sfm(port,currSCCB);
                   6706: 
                   6707:        if((sync_msg == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
                   6708:        {
                   6709:                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6710:                return;
                   6711:        }
                   6712: 
                   6713:    ACCEPT_MSG(port);
                   6714: 
                   6715: 
                   6716:    offset = sfm(port,currSCCB);
                   6717: 
                   6718:        if((offset == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
                   6719:        {
                   6720:                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6721:                return;
                   6722:        }
                   6723: 
                   6724:    if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_20MB)
                   6725: 
                   6726:       our_sync_msg = 12;              /* Setup our Message to 20mb/s */
                   6727: 
                   6728:    else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_10MB)
                   6729: 
                   6730:       our_sync_msg = 25;              /* Setup our Message to 10mb/s */
                   6731: 
                   6732:    else if ((currTar_Info->TarEEValue & EE_SYNC_MASK) == EE_SYNC_5MB)
                   6733: 
                   6734:       our_sync_msg = 50;              /* Setup our Message to 5mb/s */
                   6735:    else
                   6736: 
                   6737:       our_sync_msg = 0;               /* Message = Async */
                   6738: 
                   6739:    if (sync_msg < our_sync_msg) {
                   6740:       sync_msg = our_sync_msg;    /*if faster, then set to max. */
                   6741:       }
                   6742: 
                   6743:    if (offset == ASYNC)
                   6744:       sync_msg = ASYNC;
                   6745: 
                   6746:    if (offset > MAX_OFFSET)
                   6747:       offset = MAX_OFFSET;
                   6748: 
                   6749:    sync_reg = 0x00;
                   6750: 
                   6751:    if (sync_msg > 12)
                   6752: 
                   6753:       sync_reg = 0x20;        /* Use 10MB/s */
                   6754: 
                   6755:    if (sync_msg > 25)
                   6756: 
                   6757:       sync_reg = 0x40;        /* Use 6.6MB/s */
                   6758: 
                   6759:    if (sync_msg > 38)
                   6760: 
                   6761:       sync_reg = 0x60;        /* Use 5MB/s */
                   6762: 
                   6763:    if (sync_msg > 50)
                   6764: 
                   6765:       sync_reg = 0x80;        /* Use 4MB/s */
                   6766: 
                   6767:    if (sync_msg > 62)
                   6768: 
                   6769:       sync_reg = 0xA0;        /* Use 3.33MB/s */
                   6770: 
                   6771:    if (sync_msg > 75)
                   6772: 
                   6773:       sync_reg = 0xC0;        /* Use 2.85MB/s */
                   6774: 
                   6775:    if (sync_msg > 87)
                   6776: 
                   6777:       sync_reg = 0xE0;        /* Use 2.5MB/s */
                   6778: 
                   6779:    if (sync_msg > 100) {
                   6780: 
                   6781:       sync_reg = 0x00;        /* Use ASYNC */
                   6782:       offset = 0x00;
                   6783:       }
                   6784: 
                   6785: 
                   6786: #if defined(WIDE_SCSI)
                   6787:    if (currTar_Info->TarStatus & WIDE_ENABLED)
                   6788: 
                   6789:       sync_reg |= offset;
                   6790: 
                   6791:    else
                   6792: 
                   6793:       sync_reg |= (offset | NARROW_SCSI);
                   6794: 
                   6795: #else
                   6796:    sync_reg |= (offset | NARROW_SCSI);
                   6797: #endif
                   6798: 
                   6799:    sssyncv(port,currSCCB->TargID,sync_reg,currTar_Info);
                   6800: 
                   6801: 
                   6802:    if (currSCCB->Sccb_scsistat == SELECT_SN_ST) {
                   6803: 
                   6804: 
                   6805:       ACCEPT_MSG(port);
                   6806: 
                   6807:       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
                   6808:          ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED);
                   6809: 
                   6810:       WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6811:       }
                   6812: 
                   6813:    else {
                   6814: 
                   6815: 
                   6816:       ACCEPT_MSG_ATN(port);
                   6817: 
                   6818:       sisyncr(port,sync_msg,offset);
                   6819: 
                   6820:       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
                   6821:          ~(UCHAR)TAR_SYNC_MASK) | (UCHAR)SYNC_SUPPORTED);
                   6822:       }
                   6823: }
                   6824: 
                   6825: 
                   6826: /*---------------------------------------------------------------------
                   6827:  *
                   6828:  * Function: sisyncr
                   6829:  *
                   6830:  * Description: Answer the targets sync message.
                   6831:  *
                   6832:  *---------------------------------------------------------------------*/
                   6833: #if defined(DOS)
                   6834: void sisyncr(USHORT port,UCHAR sync_pulse, UCHAR offset)
                   6835: #else
                   6836: void sisyncr(ULONG port,UCHAR sync_pulse, UCHAR offset)
                   6837: #endif
                   6838: {
                   6839:    ARAM_ACCESS(port);
                   6840:    WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
                   6841:    WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x03  ));
                   6842:    WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMSYNC));
                   6843:    WRW_HARPOON((port+SYNC_MSGS+6), (MPM_OP+AMSG_OUT+sync_pulse));
                   6844:    WRW_HARPOON((port+SYNC_MSGS+8), (RAT_OP                ));
                   6845:    WRW_HARPOON((port+SYNC_MSGS+10),(MPM_OP+AMSG_OUT+offset));
                   6846:    WRW_HARPOON((port+SYNC_MSGS+12),(BRH_OP+ALWAYS+NP      ));
                   6847:    SGRAM_ACCESS(port);
                   6848: 
                   6849:    WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
                   6850:    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1);
                   6851: 
                   6852:    WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT));
                   6853: 
                   6854:    while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {}
                   6855: }
                   6856: 
                   6857: 
                   6858: 
                   6859: #if defined(WIDE_SCSI)
                   6860: 
                   6861: /*---------------------------------------------------------------------
                   6862:  *
                   6863:  * Function: siwidn
                   6864:  *
                   6865:  * Description: Read in a message byte from the SCSI bus, and check
                   6866:  *              for a parity error.
                   6867:  *
                   6868:  *---------------------------------------------------------------------*/
                   6869: 
                   6870: #if defined(DOS)
                   6871: UCHAR siwidn(USHORT port, UCHAR p_card)
                   6872: #else
                   6873: UCHAR siwidn(ULONG port, UCHAR p_card)
                   6874: #endif
                   6875: {
                   6876:    PSCCB currSCCB;
                   6877:    PSCCBMgr_tar_info currTar_Info;
                   6878: 
                   6879:    currSCCB = BL_Card[p_card].currentSCCB;
                   6880:    currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
                   6881: 
                   6882:    if (!((currTar_Info->TarStatus & TAR_WIDE_MASK) == WIDE_NEGOCIATED)) {
                   6883: 
                   6884: 
                   6885:       WRW_HARPOON((port+ID_MSG_STRT),
                   6886:                      (MPM_OP+AMSG_OUT+(currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV)));
                   6887: 
                   6888:       WRW_HARPOON((port+ID_MSG_STRT+2),BRH_OP+ALWAYS+CMDPZ);
                   6889: 
                   6890:       WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
                   6891:       WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02  ));
                   6892:       WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR));
                   6893:       WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP                ));
                   6894:       WRW_HARPOON((port+SYNC_MSGS+8), (MPM_OP+AMSG_OUT+ SM16BIT));
                   6895:       WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP      ));
                   6896: 
                   6897:       WR_HARPOON(port+hp_autostart_3, (SELECT+SELCHK_STRT));
                   6898: 
                   6899: 
                   6900:       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
                   6901:          ~(UCHAR)TAR_WIDE_MASK) | (UCHAR)WIDE_ENABLED);
                   6902: 
                   6903:       return(TRUE);
                   6904:       }
                   6905: 
                   6906:    else {
                   6907: 
                   6908:       currTar_Info->TarStatus = ((currTar_Info->TarStatus &
                   6909:                ~(UCHAR)TAR_WIDE_MASK) | WIDE_NEGOCIATED);
                   6910: 
                   6911:       currTar_Info->TarEEValue &= ~EE_WIDE_SCSI;
                   6912:       return(FALSE);
                   6913:       }
                   6914: }
                   6915: 
                   6916: 
                   6917: 
                   6918: /*---------------------------------------------------------------------
                   6919:  *
                   6920:  * Function: stwidn
                   6921:  *
                   6922:  * Description: The has sent us a Wide Nego message so handle it as
                   6923:  *              necessary.
                   6924:  *
                   6925:  *---------------------------------------------------------------------*/
                   6926: #if defined(DOS)
                   6927: void stwidn(USHORT port, UCHAR p_card)
                   6928: #else
                   6929: void stwidn(ULONG port, UCHAR p_card)
                   6930: #endif
                   6931: {
                   6932:    UCHAR width;
                   6933:    PSCCB currSCCB;
                   6934:    PSCCBMgr_tar_info currTar_Info;
                   6935: 
                   6936:    currSCCB = BL_Card[p_card].currentSCCB;
                   6937:    currTar_Info = &sccbMgrTbl[p_card][currSCCB->TargID];
                   6938: 
                   6939:    width = sfm(port,currSCCB);
                   6940: 
                   6941:        if((width == 0x00) && (currSCCB->Sccb_scsimsg == SMPARITY))
                   6942:        {
                   6943:                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6944:                return;
                   6945:        }
                   6946: 
                   6947: 
                   6948:    if (!(currTar_Info->TarEEValue & EE_WIDE_SCSI))
                   6949:       width = 0;
                   6950: 
                   6951:    if (width) {
                   6952:       currTar_Info->TarStatus |= WIDE_ENABLED;
                   6953:       width = 0;
                   6954:       }
                   6955:    else {
                   6956:       width = NARROW_SCSI;
                   6957:       currTar_Info->TarStatus &= ~WIDE_ENABLED;
                   6958:       }
                   6959: 
                   6960: 
                   6961:    sssyncv(port,currSCCB->TargID,width,currTar_Info);
                   6962: 
                   6963: 
                   6964:    if (currSCCB->Sccb_scsistat == SELECT_WN_ST)
                   6965:        {
                   6966: 
                   6967: 
                   6968: 
                   6969:       currTar_Info->TarStatus |=        WIDE_NEGOCIATED;
                   6970: 
                   6971:           if (!((currTar_Info->TarStatus & TAR_SYNC_MASK) == SYNC_SUPPORTED))
                   6972:                {
                   6973:              ACCEPT_MSG_ATN(port);
                   6974:                   ARAM_ACCESS(port);
                   6975:                sisyncn(port,p_card, TRUE);
                   6976:              currSCCB->Sccb_scsistat = SELECT_SN_ST;
                   6977:                   SGRAM_ACCESS(port);
                   6978:                }
                   6979:                else
                   6980:                {
                   6981:              ACCEPT_MSG(port);
                   6982:                   WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   6983:                }
                   6984:    }
                   6985: 
                   6986:    else {
                   6987: 
                   6988: 
                   6989:       ACCEPT_MSG_ATN(port);
                   6990: 
                   6991:       if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
                   6992:         width = SM16BIT;
                   6993:       else
                   6994:         width = SM8BIT;
                   6995: 
                   6996:       siwidr(port,width);
                   6997: 
                   6998:       currTar_Info->TarStatus |= (WIDE_NEGOCIATED | WIDE_ENABLED);
                   6999:       }
                   7000: }
                   7001: 
                   7002: 
                   7003: /*---------------------------------------------------------------------
                   7004:  *
                   7005:  * Function: siwidr
                   7006:  *
                   7007:  * Description: Answer the targets Wide nego message.
                   7008:  *
                   7009:  *---------------------------------------------------------------------*/
                   7010: #if defined(DOS)
                   7011: void siwidr(USHORT port, UCHAR width)
                   7012: #else
                   7013: void siwidr(ULONG port, UCHAR width)
                   7014: #endif
                   7015: {
                   7016:    ARAM_ACCESS(port);
                   7017:    WRW_HARPOON((port+SYNC_MSGS+0), (MPM_OP+AMSG_OUT+SMEXT ));
                   7018:    WRW_HARPOON((port+SYNC_MSGS+2), (MPM_OP+AMSG_OUT+0x02  ));
                   7019:    WRW_HARPOON((port+SYNC_MSGS+4), (MPM_OP+AMSG_OUT+SMWDTR));
                   7020:    WRW_HARPOON((port+SYNC_MSGS+6), (RAT_OP                ));
                   7021:    WRW_HARPOON((port+SYNC_MSGS+8),(MPM_OP+AMSG_OUT+width));
                   7022:    WRW_HARPOON((port+SYNC_MSGS+10),(BRH_OP+ALWAYS+NP      ));
                   7023:    SGRAM_ACCESS(port);
                   7024: 
                   7025:    WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
                   7026:    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT_1);
                   7027: 
                   7028:    WR_HARPOON(port+hp_autostart_3, (AUTO_IMMED+CMD_ONLY_STRT));
                   7029: 
                   7030:    while (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | AUTO_INT))) {}
                   7031: }
                   7032: 
                   7033: #endif
                   7034: 
                   7035: 
                   7036: 
                   7037: /*---------------------------------------------------------------------
                   7038:  *
                   7039:  * Function: sssyncv
                   7040:  *
                   7041:  * Description: Write the desired value to the Sync Register for the
                   7042:  *              ID specified.
                   7043:  *
                   7044:  *---------------------------------------------------------------------*/
                   7045: #if defined(DOS)
                   7046: void sssyncv(USHORT p_port, UCHAR p_id, UCHAR p_sync_value,PSCCBMgr_tar_info currTar_Info)
                   7047: #else
                   7048: void sssyncv(ULONG p_port, UCHAR p_id, UCHAR p_sync_value,PSCCBMgr_tar_info currTar_Info)
                   7049: #endif
                   7050: {
                   7051:    UCHAR index;
                   7052: 
                   7053:    index = p_id;
                   7054: 
                   7055:    switch (index) {
                   7056: 
                   7057:       case 0:
                   7058:         index = 12;             /* hp_synctarg_0 */
                   7059:         break;
                   7060:       case 1:
                   7061:         index = 13;             /* hp_synctarg_1 */
                   7062:         break;
                   7063:       case 2:
                   7064:         index = 14;             /* hp_synctarg_2 */
                   7065:         break;
                   7066:       case 3:
                   7067:         index = 15;             /* hp_synctarg_3 */
                   7068:         break;
                   7069:       case 4:
                   7070:         index = 8;              /* hp_synctarg_4 */
                   7071:         break;
                   7072:       case 5:
                   7073:         index = 9;              /* hp_synctarg_5 */
                   7074:         break;
                   7075:       case 6:
                   7076:         index = 10;             /* hp_synctarg_6 */
                   7077:         break;
                   7078:       case 7:
                   7079:         index = 11;             /* hp_synctarg_7 */
                   7080:         break;
                   7081:       case 8:
                   7082:         index = 4;              /* hp_synctarg_8 */
                   7083:         break;
                   7084:       case 9:
                   7085:         index = 5;              /* hp_synctarg_9 */
                   7086:         break;
                   7087:       case 10:
                   7088:         index = 6;              /* hp_synctarg_10 */
                   7089:         break;
                   7090:       case 11:
                   7091:         index = 7;              /* hp_synctarg_11 */
                   7092:         break;
                   7093:       case 12:
                   7094:         index = 0;              /* hp_synctarg_12 */
                   7095:         break;
                   7096:       case 13:
                   7097:         index = 1;              /* hp_synctarg_13 */
                   7098:         break;
                   7099:       case 14:
                   7100:         index = 2;              /* hp_synctarg_14 */
                   7101:         break;
                   7102:       case 15:
                   7103:         index = 3;              /* hp_synctarg_15 */
                   7104: 
                   7105:       }
                   7106: 
                   7107:    WR_HARPOON(p_port+hp_synctarg_base+index, p_sync_value);
                   7108: 
                   7109:        currTar_Info->TarSyncCtrl = p_sync_value;
                   7110: }
                   7111: 
                   7112: 
                   7113: /*---------------------------------------------------------------------
                   7114:  *
                   7115:  * Function: sresb
                   7116:  *
                   7117:  * Description: Reset the desired card's SCSI bus.
                   7118:  *
                   7119:  *---------------------------------------------------------------------*/
                   7120: #if defined(DOS)
                   7121: void sresb(USHORT port, UCHAR p_card)
                   7122: #else
                   7123: void sresb(ULONG port, UCHAR p_card)
                   7124: #endif
                   7125: {
                   7126:    UCHAR scsiID, i;
                   7127: 
                   7128:    PSCCBMgr_tar_info currTar_Info;
                   7129: 
                   7130:    WR_HARPOON(port+hp_page_ctrl,
                   7131:       (RD_HARPOON(port+hp_page_ctrl) | G_INT_DISABLE));
                   7132:    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
                   7133: 
                   7134:    WR_HARPOON(port+hp_scsictrl_0, SCSI_RST);
                   7135: 
                   7136:    scsiID = RD_HARPOON(port+hp_seltimeout);
                   7137:    WR_HARPOON(port+hp_seltimeout,TO_5ms);
                   7138:    WRW_HARPOON((port+hp_intstat), TIMEOUT);
                   7139: 
                   7140:    WR_HARPOON(port+hp_portctrl_0,(SCSI_PORT | START_TO));
                   7141: 
                   7142:    while (!(RDW_HARPOON((port+hp_intstat)) & TIMEOUT)) {}
                   7143: 
                   7144:    WR_HARPOON(port+hp_seltimeout,scsiID);
                   7145: 
                   7146:    WR_HARPOON(port+hp_scsictrl_0, ENA_SCAM_SEL);
                   7147: 
                   7148:    Wait(port, TO_5ms);
                   7149: 
                   7150:    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
                   7151: 
                   7152:    WR_HARPOON(port+hp_int_mask, (RD_HARPOON(port+hp_int_mask) | 0x00));
                   7153: 
                   7154:    for (scsiID = 0; scsiID < MAX_SCSI_TAR; scsiID++)
                   7155:       {
                   7156:       currTar_Info = &sccbMgrTbl[p_card][scsiID];
                   7157: 
                   7158:       if (currTar_Info->TarEEValue & EE_SYNC_MASK)
                   7159:          {
                   7160:                currTar_Info->TarSyncCtrl = 0;
                   7161:                currTar_Info->TarStatus &= ~TAR_SYNC_MASK;
                   7162:              }
                   7163: 
                   7164:       if (currTar_Info->TarEEValue & EE_WIDE_SCSI)
                   7165:          {
                   7166:        currTar_Info->TarStatus &= ~TAR_WIDE_MASK;
                   7167:        }
                   7168: 
                   7169:       sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
                   7170: 
                   7171:       SccbMgrTableInitTarget(p_card, scsiID);
                   7172:       }
                   7173: 
                   7174:    BL_Card[p_card].scanIndex = 0x00;
                   7175:    BL_Card[p_card].currentSCCB = NULL;
                   7176:    BL_Card[p_card].globalFlags &= ~(F_TAG_STARTED | F_HOST_XFER_ACT 
                   7177:                                                                                                        | F_NEW_SCCB_CMD);
                   7178:    BL_Card[p_card].cmdCounter  = 0x00;
                   7179:        BL_Card[p_card].discQCount = 0x00;
                   7180:    BL_Card[p_card].tagQ_Lst = 0x01; 
                   7181: 
                   7182:        for(i = 0; i < QUEUE_DEPTH; i++)
                   7183:                BL_Card[p_card].discQ_Tbl[i] = NULL;
                   7184: 
                   7185:    WR_HARPOON(port+hp_page_ctrl,
                   7186:       (RD_HARPOON(port+hp_page_ctrl) & ~G_INT_DISABLE));
                   7187: 
                   7188: }
                   7189: 
                   7190: /*---------------------------------------------------------------------
                   7191:  *
                   7192:  * Function: ssenss
                   7193:  *
                   7194:  * Description: Setup for the Auto Sense command.
                   7195:  *
                   7196:  *---------------------------------------------------------------------*/
                   7197: void ssenss(PSCCBcard pCurrCard)
                   7198: {
                   7199:    UCHAR i;
                   7200:    PSCCB currSCCB;
                   7201: 
                   7202:    currSCCB = pCurrCard->currentSCCB;
                   7203: 
                   7204: 
                   7205:    currSCCB->Save_CdbLen = currSCCB->CdbLength;
                   7206: 
                   7207:    for (i = 0; i < 6; i++) {
                   7208: 
                   7209:       currSCCB->Save_Cdb[i] = currSCCB->Cdb[i];
                   7210:       }
                   7211: 
                   7212:    currSCCB->CdbLength = SIX_BYTE_CMD;
                   7213:    currSCCB->Cdb[0]    = SCSI_REQUEST_SENSE;
                   7214:    currSCCB->Cdb[1]    = currSCCB->Cdb[1] & (UCHAR)0xE0; /*Keep LUN. */
                   7215:    currSCCB->Cdb[2]    = 0x00;
                   7216:    currSCCB->Cdb[3]    = 0x00;
                   7217:    currSCCB->Cdb[4]    = currSCCB->RequestSenseLength;
                   7218:    currSCCB->Cdb[5]    = 0x00;
                   7219: 
                   7220:    currSCCB->Sccb_XferCnt = (unsigned long)currSCCB->RequestSenseLength;
                   7221: 
                   7222:    currSCCB->Sccb_ATC = 0x00;
                   7223: 
                   7224:    currSCCB->Sccb_XferState |= F_AUTO_SENSE;
                   7225: 
                   7226:    currSCCB->Sccb_XferState &= ~F_SG_XFER;
                   7227: 
                   7228:    currSCCB->Sccb_idmsg = currSCCB->Sccb_idmsg & ~(UCHAR)DISC_PRIV;
                   7229: 
                   7230:    currSCCB->ControlByte = 0x00;
                   7231: 
                   7232:    currSCCB->Sccb_MGRFlags &= F_STATUSLOADED;
                   7233: }
                   7234: 
                   7235: 
                   7236: 
                   7237: /*---------------------------------------------------------------------
                   7238:  *
                   7239:  * Function: sxfrp
                   7240:  *
                   7241:  * Description: Transfer data into the bit bucket until the device
                   7242:  *              decides to switch phase.
                   7243:  *
                   7244:  *---------------------------------------------------------------------*/
                   7245: 
                   7246: #if defined(DOS)
                   7247: void sxfrp(USHORT p_port, UCHAR p_card)
                   7248: #else
                   7249: void sxfrp(ULONG p_port, UCHAR p_card)
                   7250: #endif
                   7251: {
                   7252:    UCHAR curr_phz;
                   7253: 
                   7254: 
                   7255:    DISABLE_AUTO(p_port);
                   7256: 
                   7257:    if (BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) {
                   7258: 
                   7259:       hostDataXferAbort(p_port,p_card,BL_Card[p_card].currentSCCB);
                   7260: 
                   7261:       }
                   7262: 
                   7263:    /* If the Automation handled the end of the transfer then do not
                   7264:       match the phase or we will get out of sync with the ISR.       */
                   7265: 
                   7266:    if (RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | XFER_CNT_0 | AUTO_INT))
                   7267:       return;
                   7268: 
                   7269:    WR_HARPOON(p_port+hp_xfercnt_0, 0x00);
                   7270: 
                   7271:    curr_phz = RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ;
                   7272: 
                   7273:    WRW_HARPOON((p_port+hp_intstat), XFER_CNT_0);
                   7274: 
                   7275: 
                   7276:    WR_HARPOON(p_port+hp_scsisig, curr_phz);
                   7277: 
                   7278:    while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)) &&
                   7279:       (curr_phz == (RD_HARPOON(p_port+hp_scsisig) & (UCHAR)S_SCSI_PHZ)) )
                   7280:       {
                   7281:       if (curr_phz & (UCHAR)SCSI_IOBIT)
                   7282:          {
                   7283:        WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT));
                   7284: 
                   7285:              if (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY))
                   7286:             {
                   7287:                 RD_HARPOON(p_port+hp_fifodata_0);
                   7288:                 }
                   7289:              }
                   7290:       else
                   7291:          {
                   7292:        WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | HOST_WRT));
                   7293:           if (RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY)
                   7294:             {
                   7295:                 WR_HARPOON(p_port+hp_fifodata_0,0xFA);
                   7296:                 }
                   7297:              }
                   7298:       } /* End of While loop for padding data I/O phase */
                   7299: 
                   7300:       while ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
                   7301:          {
                   7302:          if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
                   7303:           break;
                   7304:          }
                   7305: 
                   7306:       WR_HARPOON(p_port+hp_portctrl_0, (SCSI_PORT | HOST_PORT | SCSI_INBIT));
                   7307:       while (!(RD_HARPOON(p_port+hp_xferstat) & FIFO_EMPTY))
                   7308:          {
                   7309:          RD_HARPOON(p_port+hp_fifodata_0);
                   7310:          }
                   7311: 
                   7312:       if ( !(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RESET)))
                   7313:          {
                   7314:          WR_HARPOON(p_port+hp_autostart_0, (AUTO_IMMED+DISCONNECT_START));
                   7315:          while (!(RDW_HARPOON((p_port+hp_intstat)) & AUTO_INT)) {}
                   7316: 
                   7317:          if (RDW_HARPOON((p_port+hp_intstat)) & (ICMD_COMP | ITAR_DISC))
                   7318:           while (!(RDW_HARPOON((p_port+hp_intstat)) & (BUS_FREE | RSEL))) ;
                   7319:          }
                   7320: }
                   7321: 
                   7322: 
                   7323: /*---------------------------------------------------------------------
                   7324:  *
                   7325:  * Function: schkdd
                   7326:  *
                   7327:  * Description: Make sure data has been flushed from both FIFOs and abort
                   7328:  *              the operations if necessary.
                   7329:  *
                   7330:  *---------------------------------------------------------------------*/
                   7331: 
                   7332: #if defined(DOS)
                   7333: void schkdd(USHORT port, UCHAR p_card)
                   7334: #else
                   7335: void schkdd(ULONG port, UCHAR p_card)
                   7336: #endif
                   7337: {
                   7338:    USHORT TimeOutLoop;
                   7339:        UCHAR sPhase;
                   7340: 
                   7341:    PSCCB currSCCB;
                   7342: 
                   7343:    currSCCB = BL_Card[p_card].currentSCCB;
                   7344: 
                   7345: 
                   7346:    if ((currSCCB->Sccb_scsistat != DATA_OUT_ST) &&
                   7347:        (currSCCB->Sccb_scsistat != DATA_IN_ST)) {
                   7348:       return;
                   7349:       }
                   7350: 
                   7351: 
                   7352: 
                   7353:    if (currSCCB->Sccb_XferState & F_ODD_BALL_CNT)
                   7354:       {
                   7355: 
                   7356:       currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt-1);
                   7357: 
                   7358:       currSCCB->Sccb_XferCnt = 1;
                   7359: 
                   7360:       currSCCB->Sccb_XferState &= ~F_ODD_BALL_CNT;
                   7361:       WRW_HARPOON((port+hp_fiforead), (USHORT) 0x00);
                   7362:       WR_HARPOON(port+hp_xferstat, 0x00);
                   7363:       }
                   7364: 
                   7365:    else
                   7366:       {
                   7367: 
                   7368:       currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
                   7369: 
                   7370:       currSCCB->Sccb_XferCnt = 0;
                   7371:       }
                   7372: 
                   7373:    if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
                   7374:       (currSCCB->HostStatus == SCCB_COMPLETE)) {
                   7375: 
                   7376:       currSCCB->HostStatus = SCCB_PARITY_ERR;
                   7377:       WRW_HARPOON((port+hp_intstat), PARITY);
                   7378:       }
                   7379: 
                   7380: 
                   7381:    hostDataXferAbort(port,p_card,currSCCB);
                   7382: 
                   7383: 
                   7384:    while (RD_HARPOON(port+hp_scsisig) & SCSI_ACK) {}
                   7385: 
                   7386:    TimeOutLoop = 0;
                   7387: 
                   7388:    while(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)
                   7389:       {
                   7390:       if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE) {
                   7391:              return;
                   7392:           }
                   7393:       if (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F) {
                   7394:              break;
                   7395:           }
                   7396:       if (RDW_HARPOON((port+hp_intstat)) & RESET) {
                   7397:              return;
                   7398:           }
                   7399:       if ((RD_HARPOON(port+hp_scsisig) & SCSI_REQ) || (TimeOutLoop++>0x3000) )
                   7400:           break;
                   7401:       }
                   7402: 
                   7403:        sPhase = RD_HARPOON(port+hp_scsisig) & (SCSI_BSY | S_SCSI_PHZ);
                   7404:    if ((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))                     ||
                   7405:       (RD_HARPOON(port+hp_offsetctr) & (UCHAR)0x1F)                       ||
                   7406:       (sPhase == (SCSI_BSY | S_DATAO_PH)) ||
                   7407:       (sPhase == (SCSI_BSY | S_DATAI_PH)))
                   7408:       {
                   7409: 
                   7410:           WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
                   7411: 
                   7412:           if (!(currSCCB->Sccb_XferState & F_ALL_XFERRED))
                   7413:          {
                   7414:              if (currSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
                   7415:                 phaseDataIn(port,p_card);
                   7416:                }
                   7417: 
                   7418:                else {
                   7419:               phaseDataOut(port,p_card);
                   7420:                }
                   7421:                }
                   7422:                else
                   7423:        {
                   7424:                sxfrp(port,p_card);
                   7425:                if (!(RDW_HARPOON((port+hp_intstat)) &
                   7426:                      (BUS_FREE | ICMD_COMP | ITAR_DISC | RESET)))
                   7427:          {
                   7428:                WRW_HARPOON((port+hp_intstat), AUTO_INT);
                   7429:                   phaseDecode(port,p_card);
                   7430:                   }
                   7431:           }
                   7432: 
                   7433:    }
                   7434: 
                   7435:    else {
                   7436:       WR_HARPOON(port+hp_portctrl_0, 0x00);
                   7437:       }
                   7438: }
                   7439: 
                   7440: 
                   7441: /*---------------------------------------------------------------------
                   7442:  *
                   7443:  * Function: sinits
                   7444:  *
                   7445:  * Description: Setup SCCB manager fields in this SCCB.
                   7446:  *
                   7447:  *---------------------------------------------------------------------*/
                   7448: 
                   7449: void sinits(PSCCB p_sccb, UCHAR p_card)
                   7450: {
                   7451:    PSCCBMgr_tar_info currTar_Info;
                   7452: 
                   7453:        if((p_sccb->TargID > MAX_SCSI_TAR) || (p_sccb->Lun > MAX_LUN))
                   7454:        {
                   7455:                return;
                   7456:        }
                   7457:    currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
                   7458: 
                   7459:    p_sccb->Sccb_XferState     = 0x00;
                   7460:    p_sccb->Sccb_XferCnt       = p_sccb->DataLength;
                   7461: 
                   7462:    if ((p_sccb->OperationCode == SCATTER_GATHER_COMMAND) ||
                   7463:       (p_sccb->OperationCode == RESIDUAL_SG_COMMAND)) {
                   7464: 
                   7465:       p_sccb->Sccb_SGoffset   = 0;
                   7466:       p_sccb->Sccb_XferState  = F_SG_XFER;
                   7467:       p_sccb->Sccb_XferCnt    = 0x00;
                   7468:       }
                   7469: 
                   7470:    if (p_sccb->DataLength == 0x00)
                   7471: 
                   7472:       p_sccb->Sccb_XferState |= F_ALL_XFERRED;
                   7473: 
                   7474:    if (p_sccb->ControlByte & F_USE_CMD_Q)
                   7475:       {
                   7476:       if ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) == TAG_Q_REJECT)
                   7477:          p_sccb->ControlByte &= ~F_USE_CMD_Q;
                   7478: 
                   7479:       else
                   7480:              currTar_Info->TarStatus |= TAG_Q_TRYING;
                   7481:       }
                   7482: 
                   7483: /*      For !single SCSI device in system  & device allow Disconnect
                   7484:        or command is tag_q type then send Cmd with Disconnect Enable
                   7485:        else send Cmd with Disconnect Disable */
                   7486: 
                   7487: /*
                   7488:    if (((!(BL_Card[p_card].globalFlags & F_SINGLE_DEVICE)) &&
                   7489:       (currTar_Info->TarStatus & TAR_ALLOW_DISC)) ||
                   7490:       (currTar_Info->TarStatus & TAG_Q_TRYING)) {
                   7491: */
                   7492:    if ((currTar_Info->TarStatus & TAR_ALLOW_DISC) ||
                   7493:       (currTar_Info->TarStatus & TAG_Q_TRYING)) {
                   7494:       p_sccb->Sccb_idmsg      = (UCHAR)(SMIDENT | DISC_PRIV) | p_sccb->Lun;
                   7495:       }
                   7496: 
                   7497:    else {
                   7498: 
                   7499:       p_sccb->Sccb_idmsg      = (UCHAR)SMIDENT | p_sccb->Lun;
                   7500:       }
                   7501: 
                   7502:    p_sccb->HostStatus         = 0x00;
                   7503:    p_sccb->TargetStatus       = 0x00;
                   7504:    p_sccb->Sccb_tag           = 0x00;
                   7505:    p_sccb->Sccb_MGRFlags      = 0x00;
                   7506:    p_sccb->Sccb_sgseg         = 0x00;
                   7507:    p_sccb->Sccb_ATC           = 0x00;
                   7508:    p_sccb->Sccb_savedATC      = 0x00;
                   7509: /*
                   7510:    p_sccb->SccbVirtDataPtr    = 0x00;
                   7511:    p_sccb->Sccb_forwardlink   = NULL;
                   7512:    p_sccb->Sccb_backlink      = NULL;
                   7513:  */
                   7514:    p_sccb->Sccb_scsistat      = BUS_FREE_ST;
                   7515:    p_sccb->SccbStatus         = SCCB_IN_PROCESS;
                   7516:    p_sccb->Sccb_scsimsg       = SMNO_OP;
                   7517: 
                   7518: }
                   7519: 
                   7520: 
                   7521: #ident "$Id: FlashPoint.c,v 1.1 1999/04/26 05:53:56 tb Exp $"
                   7522: /*----------------------------------------------------------------------
                   7523:  *
                   7524:  *
                   7525:  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
                   7526:  *
                   7527:  *   This file is available under both the GNU General Public License
                   7528:  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
                   7529:  *
                   7530:  *   $Workfile:   phase.c  $
                   7531:  *
                   7532:  *   Description:  Functions to intially handle the SCSI bus phase when
                   7533:  *                 the target asserts request (and the automation is not
                   7534:  *                 enabled to handle the situation).
                   7535:  *
                   7536:  *   $Date: 1999/04/26 05:53:56 $
                   7537:  *
                   7538:  *   $Revision: 1.1 $
                   7539:  *
                   7540:  *----------------------------------------------------------------------*/
                   7541: 
                   7542: /*#include <globals.h>*/
                   7543: 
                   7544: #if (FW_TYPE==_UCB_MGR_)
                   7545:        /*#include <budi.h>*/
                   7546: #endif
                   7547: 
                   7548: /*#include <sccbmgr.h>*/
                   7549: /*#include <blx30.h>*/
                   7550: /*#include <target.h>*/
                   7551: /*#include <scsi2.h>*/
                   7552: /*#include <harpoon.h>*/
                   7553: 
                   7554: 
                   7555: /*
                   7556: extern SCCBCARD BL_Card[MAX_CARDS];
                   7557: extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
                   7558: 
                   7559: #if defined(OS2)
                   7560:    extern void (far *s_PhaseTbl[8]) (ULONG, UCHAR);
                   7561: #else
                   7562:    #if defined(DOS)
                   7563:       extern void (*s_PhaseTbl[8]) (USHORT, UCHAR);
                   7564:    #else
                   7565:       extern void (*s_PhaseTbl[8]) (ULONG, UCHAR);
                   7566:    #endif
                   7567: #endif
                   7568: */
                   7569: 
                   7570: /*---------------------------------------------------------------------
                   7571:  *
                   7572:  * Function: Phase Decode
                   7573:  *
                   7574:  * Description: Determine the phase and call the appropriate function.
                   7575:  *
                   7576:  *---------------------------------------------------------------------*/
                   7577: 
                   7578: #if defined(DOS)
                   7579: void phaseDecode(USHORT p_port, UCHAR p_card)
                   7580: #else
                   7581: void phaseDecode(ULONG p_port, UCHAR p_card)
                   7582: #endif
                   7583: {
                   7584:    unsigned char phase_ref;
                   7585: #if defined(OS2)
                   7586:    void (far *phase) (ULONG, UCHAR);
                   7587: #else
                   7588:    #if defined(DOS)
                   7589:       void (*phase) (USHORT, UCHAR);
                   7590:    #else
                   7591:       void (*phase) (ULONG, UCHAR);
                   7592:    #endif
                   7593: #endif
                   7594: 
                   7595: 
                   7596:    DISABLE_AUTO(p_port);
                   7597: 
                   7598:    phase_ref = (UCHAR) (RD_HARPOON(p_port+hp_scsisig) & S_SCSI_PHZ);
                   7599: 
                   7600:    phase = s_PhaseTbl[phase_ref];
                   7601: 
                   7602:    (*phase)(p_port, p_card);           /* Call the correct phase func */
                   7603: }
                   7604: 
                   7605: 
                   7606: 
                   7607: /*---------------------------------------------------------------------
                   7608:  *
                   7609:  * Function: Data Out Phase
                   7610:  *
                   7611:  * Description: Start up both the BusMaster and Xbow.
                   7612:  *
                   7613:  *---------------------------------------------------------------------*/
                   7614: 
                   7615: #if defined(OS2)
                   7616: void far phaseDataOut(ULONG port, UCHAR p_card)
                   7617: #else
                   7618: #if defined(DOS)
                   7619: void phaseDataOut(USHORT port, UCHAR p_card)
                   7620: #else
                   7621: void phaseDataOut(ULONG port, UCHAR p_card)
                   7622: #endif
                   7623: #endif
                   7624: {
                   7625: 
                   7626:    PSCCB currSCCB;
                   7627: 
                   7628:    currSCCB = BL_Card[p_card].currentSCCB;
                   7629:    if (currSCCB == NULL)
                   7630:       {
                   7631:       return;  /* Exit if No SCCB record */
                   7632:       }
                   7633: 
                   7634:    currSCCB->Sccb_scsistat = DATA_OUT_ST;
                   7635:    currSCCB->Sccb_XferState &= ~(F_HOST_XFER_DIR | F_NO_DATA_YET);
                   7636: 
                   7637:    WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
                   7638: 
                   7639:    WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
                   7640: 
                   7641:    WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
                   7642: 
                   7643:    dataXferProcessor(port, &BL_Card[p_card]);
                   7644: 
                   7645: #if defined(NOBUGBUG)
                   7646:    if (RDW_HARPOON((port+hp_intstat)) & XFER_CNT_0)
                   7647:       WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
                   7648: 
                   7649: #endif
                   7650: 
                   7651: 
                   7652:    if (currSCCB->Sccb_XferCnt == 0) {
                   7653: 
                   7654: 
                   7655:       if ((currSCCB->ControlByte & SCCB_DATA_XFER_OUT) &&
                   7656:         (currSCCB->HostStatus == SCCB_COMPLETE))
                   7657:         currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
                   7658: 
                   7659:       sxfrp(port,p_card);
                   7660:       if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
                   7661:            phaseDecode(port,p_card);
                   7662:       }
                   7663: }
                   7664: 
                   7665: 
                   7666: /*---------------------------------------------------------------------
                   7667:  *
                   7668:  * Function: Data In Phase
                   7669:  *
                   7670:  * Description: Startup the BusMaster and the XBOW.
                   7671:  *
                   7672:  *---------------------------------------------------------------------*/
                   7673: 
                   7674: #if defined(OS2)
                   7675: void far phaseDataIn(ULONG port, UCHAR p_card)
                   7676: #else
                   7677: #if defined(DOS)
                   7678: void phaseDataIn(USHORT port, UCHAR p_card)
                   7679: #else
                   7680: void phaseDataIn(ULONG port, UCHAR p_card)
                   7681: #endif
                   7682: #endif
                   7683: {
                   7684: 
                   7685:    PSCCB currSCCB;
                   7686: 
                   7687:    currSCCB = BL_Card[p_card].currentSCCB;
                   7688: 
                   7689:    if (currSCCB == NULL)
                   7690:       {
                   7691:       return;  /* Exit if No SCCB record */
                   7692:       }
                   7693: 
                   7694: 
                   7695:    currSCCB->Sccb_scsistat = DATA_IN_ST;
                   7696:    currSCCB->Sccb_XferState |= F_HOST_XFER_DIR;
                   7697:    currSCCB->Sccb_XferState &= ~F_NO_DATA_YET;
                   7698: 
                   7699:    WR_HARPOON(port+hp_portctrl_0, SCSI_PORT);
                   7700: 
                   7701:    WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
                   7702: 
                   7703:    WR_HARPOON(port+hp_autostart_0, (END_DATA+END_DATA_START));
                   7704: 
                   7705:    dataXferProcessor(port, &BL_Card[p_card]);
                   7706: 
                   7707:    if (currSCCB->Sccb_XferCnt == 0) {
                   7708: 
                   7709: 
                   7710:       if ((currSCCB->ControlByte & SCCB_DATA_XFER_IN) &&
                   7711:         (currSCCB->HostStatus == SCCB_COMPLETE))
                   7712:         currSCCB->HostStatus = SCCB_DATA_OVER_RUN;
                   7713: 
                   7714:       sxfrp(port,p_card);
                   7715:       if (!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | RESET)))
                   7716:            phaseDecode(port,p_card);
                   7717: 
                   7718:       }
                   7719: }
                   7720: 
                   7721: /*---------------------------------------------------------------------
                   7722:  *
                   7723:  * Function: Command Phase
                   7724:  *
                   7725:  * Description: Load the CDB into the automation and start it up.
                   7726:  *
                   7727:  *---------------------------------------------------------------------*/
                   7728: 
                   7729: #if defined(OS2)
                   7730: void far phaseCommand(ULONG p_port, UCHAR p_card)
                   7731: #else
                   7732: #if defined(DOS)
                   7733: void phaseCommand(USHORT p_port, UCHAR p_card)
                   7734: #else
                   7735: void phaseCommand(ULONG p_port, UCHAR p_card)
                   7736: #endif
                   7737: #endif
                   7738: {
                   7739:    PSCCB currSCCB;
                   7740: #if defined(DOS)
                   7741:    USHORT cdb_reg;
                   7742: #else
                   7743:    ULONG cdb_reg;
                   7744: #endif
                   7745:    UCHAR i;
                   7746: 
                   7747:    currSCCB = BL_Card[p_card].currentSCCB;
                   7748: 
                   7749:    if (currSCCB->OperationCode == RESET_COMMAND) {
                   7750: 
                   7751:       currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
                   7752:       currSCCB->CdbLength = SIX_BYTE_CMD;
                   7753:       }
                   7754: 
                   7755:    WR_HARPOON(p_port+hp_scsisig, 0x00);
                   7756: 
                   7757:    ARAM_ACCESS(p_port);
                   7758: 
                   7759: 
                   7760:    cdb_reg = p_port + CMD_STRT;
                   7761: 
                   7762:    for (i=0; i < currSCCB->CdbLength; i++) {
                   7763: 
                   7764:       if (currSCCB->OperationCode == RESET_COMMAND)
                   7765: 
                   7766:         WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + 0x00));
                   7767: 
                   7768:       else
                   7769:         WRW_HARPOON(cdb_reg, (MPM_OP + ACOMMAND + currSCCB->Cdb[i]));
                   7770:       cdb_reg +=2;
                   7771:       }
                   7772: 
                   7773:    if (currSCCB->CdbLength != TWELVE_BYTE_CMD)
                   7774:       WRW_HARPOON(cdb_reg, (BRH_OP+ALWAYS+    NP));
                   7775: 
                   7776:    WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT));
                   7777: 
                   7778:    currSCCB->Sccb_scsistat = COMMAND_ST;
                   7779: 
                   7780:    WR_HARPOON(p_port+hp_autostart_3, (AUTO_IMMED | CMD_ONLY_STRT));
                   7781:    SGRAM_ACCESS(p_port);
                   7782: }
                   7783: 
                   7784: 
                   7785: /*---------------------------------------------------------------------
                   7786:  *
                   7787:  * Function: Status phase
                   7788:  *
                   7789:  * Description: Bring in the status and command complete message bytes
                   7790:  *
                   7791:  *---------------------------------------------------------------------*/
                   7792: 
                   7793: #if defined(OS2)
                   7794: void far phaseStatus(ULONG port, UCHAR p_card)
                   7795: #else
                   7796: #if defined(DOS)
                   7797: void phaseStatus(USHORT port, UCHAR p_card)
                   7798: #else
                   7799: void phaseStatus(ULONG port, UCHAR p_card)
                   7800: #endif
                   7801: #endif
                   7802: {
                   7803:    /* Start-up the automation to finish off this command and let the
                   7804:       isr handle the interrupt for command complete when it comes in.
                   7805:       We could wait here for the interrupt to be generated?
                   7806:     */
                   7807: 
                   7808:    WR_HARPOON(port+hp_scsisig, 0x00);
                   7809: 
                   7810:    WR_HARPOON(port+hp_autostart_0, (AUTO_IMMED+END_DATA_START));
                   7811: }
                   7812: 
                   7813: 
                   7814: /*---------------------------------------------------------------------
                   7815:  *
                   7816:  * Function: Phase Message Out
                   7817:  *
                   7818:  * Description: Send out our message (if we have one) and handle whatever
                   7819:  *              else is involed.
                   7820:  *
                   7821:  *---------------------------------------------------------------------*/
                   7822: 
                   7823: #if defined(OS2)
                   7824: void far phaseMsgOut(ULONG port, UCHAR p_card)
                   7825: #else
                   7826: #if defined(DOS)
                   7827: void phaseMsgOut(USHORT port, UCHAR p_card)
                   7828: #else
                   7829: void phaseMsgOut(ULONG port, UCHAR p_card)
                   7830: #endif
                   7831: #endif
                   7832: {
                   7833:        UCHAR message,scsiID;
                   7834:        PSCCB currSCCB;
                   7835:        PSCCBMgr_tar_info currTar_Info;
                   7836: 
                   7837:        currSCCB = BL_Card[p_card].currentSCCB;
                   7838: 
                   7839:        if (currSCCB != NULL) {
                   7840: 
                   7841:                message = currSCCB->Sccb_scsimsg;
                   7842:                scsiID = currSCCB->TargID;
                   7843: 
                   7844:                if (message == SMDEV_RESET) 
                   7845:                {
                   7846: 
                   7847: 
                   7848:                        currTar_Info = &sccbMgrTbl[p_card][scsiID];
                   7849:                        currTar_Info->TarSyncCtrl = 0;
                   7850:                        sssyncv(port, scsiID, NARROW_SCSI,currTar_Info);
                   7851: 
                   7852:                        if (sccbMgrTbl[p_card][scsiID].TarEEValue & EE_SYNC_MASK) 
                   7853:                        {
                   7854: 
                   7855:                                sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_SYNC_MASK;
                   7856: 
                   7857:                        }
                   7858: 
                   7859:                        if (sccbMgrTbl[p_card][scsiID].TarEEValue & EE_WIDE_SCSI) 
                   7860:                        {
                   7861: 
                   7862:                                sccbMgrTbl[p_card][scsiID].TarStatus &= ~TAR_WIDE_MASK;
                   7863:                        }
                   7864: 
                   7865: 
                   7866:                        queueFlushSccb(p_card,SCCB_COMPLETE);
                   7867:                        SccbMgrTableInitTarget(p_card,scsiID);
                   7868:                }
                   7869:                else if (currSCCB->Sccb_scsistat == ABORT_ST)
                   7870:                {
                   7871:                        currSCCB->HostStatus = SCCB_COMPLETE;
                   7872:                        if(BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] != NULL)
                   7873:                        {
                   7874:                                BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                   7875:                                sccbMgrTbl[p_card][scsiID].TarTagQ_Cnt--;
                   7876:                        }
                   7877:                                        
                   7878:                }
                   7879: 
                   7880:                else if (currSCCB->Sccb_scsistat < COMMAND_ST) 
                   7881:                {
                   7882: 
                   7883: 
                   7884:                        if(message == SMNO_OP)
                   7885:                        {
                   7886:                                currSCCB->Sccb_MGRFlags |= F_DEV_SELECTED;
                   7887:                
                   7888:                                ssel(port,p_card);
                   7889:                                return;
                   7890:                        }
                   7891:                }
                   7892:                else 
                   7893:                {
                   7894: 
                   7895: 
                   7896:                        if (message == SMABORT)
                   7897: 
                   7898:                                queueFlushSccb(p_card,SCCB_COMPLETE);
                   7899:                }
                   7900: 
                   7901:        }
                   7902:        else 
                   7903:        {
                   7904:                message = SMABORT;
                   7905:        }
                   7906: 
                   7907:        WRW_HARPOON((port+hp_intstat), (BUS_FREE | PHASE | XFER_CNT_0));
                   7908: 
                   7909: 
                   7910:        WR_HARPOON(port+hp_portctrl_0, SCSI_BUS_EN);
                   7911: 
                   7912:        WR_HARPOON(port+hp_scsidata_0,message);
                   7913: 
                   7914:        WR_HARPOON(port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
                   7915: 
                   7916:        ACCEPT_MSG(port);
                   7917: 
                   7918:        WR_HARPOON(port+hp_portctrl_0, 0x00);
                   7919: 
                   7920:        if ((message == SMABORT) || (message == SMDEV_RESET) || 
                   7921:                                (message == SMABORT_TAG) ) 
                   7922:        {
                   7923: 
                   7924:                while(!(RDW_HARPOON((port+hp_intstat)) & (BUS_FREE | PHASE))) {}
                   7925: 
                   7926:                if (RDW_HARPOON((port+hp_intstat)) & BUS_FREE) 
                   7927:                {
                   7928:                        WRW_HARPOON((port+hp_intstat), BUS_FREE);
                   7929: 
                   7930:                        if (currSCCB != NULL) 
                   7931:                        {
                   7932: 
                   7933:                                if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   7934:                                        ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                   7935:                                        sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
                   7936:                                else
                   7937:                                        sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
                   7938: 
                   7939:                                queueCmdComplete(&BL_Card[p_card],currSCCB, p_card);
                   7940:                        }
                   7941: 
                   7942:                        else 
                   7943:                        {
                   7944:                                BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
                   7945:                        }
                   7946:                }
                   7947: 
                   7948:                else 
                   7949:                {
                   7950: 
                   7951:                        sxfrp(port,p_card);
                   7952:                }
                   7953:        }
                   7954: 
                   7955:        else 
                   7956:        {
                   7957: 
                   7958:                if(message == SMPARITY)
                   7959:                {
                   7960:                        currSCCB->Sccb_scsimsg = SMNO_OP;
                   7961:                        WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   7962:                }
                   7963:                else
                   7964:                {
                   7965:                        sxfrp(port,p_card);
                   7966:                }
                   7967:        }
                   7968: }
                   7969: 
                   7970: 
                   7971: /*---------------------------------------------------------------------
                   7972:  *
                   7973:  * Function: Message In phase
                   7974:  *
                   7975:  * Description: Bring in the message and determine what to do with it.
                   7976:  *
                   7977:  *---------------------------------------------------------------------*/
                   7978: 
                   7979: #if defined(OS2)
                   7980: void far phaseMsgIn(ULONG port, UCHAR p_card)
                   7981: #else
                   7982: #if defined(DOS)
                   7983: void phaseMsgIn(USHORT port, UCHAR p_card)
                   7984: #else
                   7985: void phaseMsgIn(ULONG port, UCHAR p_card)
                   7986: #endif
                   7987: #endif
                   7988: {
                   7989:        UCHAR message;
                   7990:        PSCCB currSCCB;
                   7991: 
                   7992:        currSCCB = BL_Card[p_card].currentSCCB;
                   7993: 
                   7994:        if (BL_Card[p_card].globalFlags & F_HOST_XFER_ACT) 
                   7995:        {
                   7996: 
                   7997:                phaseChkFifo(port, p_card);
                   7998:        }
                   7999: 
                   8000:        message = RD_HARPOON(port+hp_scsidata_0);
                   8001:        if ((message == SMDISC) || (message == SMSAVE_DATA_PTR)) 
                   8002:        {
                   8003: 
                   8004:                WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+END_DATA_START));
                   8005: 
                   8006:        }
                   8007: 
                   8008:        else 
                   8009:        {
                   8010: 
                   8011:                message = sfm(port,currSCCB);
                   8012:                if (message) 
                   8013:                {
                   8014: 
                   8015: 
                   8016:                        sdecm(message,port,p_card);
                   8017: 
                   8018:                }
                   8019:                else
                   8020:                {
                   8021:                        if(currSCCB->Sccb_scsimsg != SMPARITY)
                   8022:                                ACCEPT_MSG(port);
                   8023:                        WR_HARPOON(port+hp_autostart_1, (AUTO_IMMED+DISCONNECT_START));
                   8024:                }
                   8025:        }
                   8026: 
                   8027: }
                   8028: 
                   8029: 
                   8030: /*---------------------------------------------------------------------
                   8031:  *
                   8032:  * Function: Illegal phase
                   8033:  *
                   8034:  * Description: Target switched to some illegal phase, so all we can do
                   8035:  *              is report an error back to the host (if that is possible)
                   8036:  *              and send an ABORT message to the misbehaving target.
                   8037:  *
                   8038:  *---------------------------------------------------------------------*/
                   8039: 
                   8040: #if defined(OS2)
                   8041: void far phaseIllegal(ULONG port, UCHAR p_card)
                   8042: #else
                   8043: #if defined(DOS)
                   8044: void phaseIllegal(USHORT port, UCHAR p_card)
                   8045: #else
                   8046: void phaseIllegal(ULONG port, UCHAR p_card)
                   8047: #endif
                   8048: #endif
                   8049: {
                   8050:    PSCCB currSCCB;
                   8051: 
                   8052:    currSCCB = BL_Card[p_card].currentSCCB;
                   8053: 
                   8054:    WR_HARPOON(port+hp_scsisig, RD_HARPOON(port+hp_scsisig));
                   8055:    if (currSCCB != NULL) {
                   8056: 
                   8057:       currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
                   8058:       currSCCB->Sccb_scsistat = ABORT_ST;
                   8059:       currSCCB->Sccb_scsimsg = SMABORT;
                   8060:       }
                   8061: 
                   8062:    ACCEPT_MSG_ATN(port);
                   8063: }
                   8064: 
                   8065: 
                   8066: 
                   8067: /*---------------------------------------------------------------------
                   8068:  *
                   8069:  * Function: Phase Check FIFO
                   8070:  *
                   8071:  * Description: Make sure data has been flushed from both FIFOs and abort
                   8072:  *              the operations if necessary.
                   8073:  *
                   8074:  *---------------------------------------------------------------------*/
                   8075: 
                   8076: #if defined(DOS)
                   8077: void phaseChkFifo(USHORT port, UCHAR p_card)
                   8078: #else
                   8079: void phaseChkFifo(ULONG port, UCHAR p_card)
                   8080: #endif
                   8081: {
                   8082:    ULONG xfercnt;
                   8083:    PSCCB currSCCB;
                   8084: 
                   8085:    currSCCB = BL_Card[p_card].currentSCCB;
                   8086: 
                   8087:    if (currSCCB->Sccb_scsistat == DATA_IN_ST)
                   8088:       {
                   8089: 
                   8090:       while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) &&
                   8091:              (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {}
                   8092: 
                   8093: 
                   8094:       if (!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))
                   8095:          {
                   8096:              currSCCB->Sccb_ATC += currSCCB->Sccb_XferCnt;
                   8097: 
                   8098:              currSCCB->Sccb_XferCnt = 0;
                   8099: 
                   8100:              if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
                   8101:                    (currSCCB->HostStatus == SCCB_COMPLETE))
                   8102:             {
                   8103:                 currSCCB->HostStatus = SCCB_PARITY_ERR;
                   8104:                 WRW_HARPOON((port+hp_intstat), PARITY);
                   8105:                 }
                   8106: 
                   8107:              hostDataXferAbort(port,p_card,currSCCB);
                   8108: 
                   8109:              dataXferProcessor(port, &BL_Card[p_card]);
                   8110: 
                   8111:              while((!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY)) &&
                   8112:                 (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY)) {}
                   8113: 
                   8114:              }
                   8115:       }  /*End Data In specific code. */
                   8116: 
                   8117: 
                   8118: 
                   8119: #if defined(DOS)
                   8120:    asm { mov dx,port;
                   8121:       add dx,hp_xfercnt_2;
                   8122:       in  al,dx;
                   8123:       dec dx;
                   8124:       xor ah,ah;
                   8125:       mov word ptr xfercnt+2,ax;
                   8126:       in  al,dx;
                   8127:       dec dx;
                   8128:       mov ah,al;
                   8129:       in  al,dx;
                   8130:       mov word ptr xfercnt,ax;
                   8131:       }
                   8132: #else
                   8133:    GET_XFER_CNT(port,xfercnt);
                   8134: #endif
                   8135: 
                   8136: 
                   8137:    WR_HARPOON(port+hp_xfercnt_0, 0x00);
                   8138: 
                   8139: 
                   8140:    WR_HARPOON(port+hp_portctrl_0, 0x00);
                   8141: 
                   8142:    currSCCB->Sccb_ATC += (currSCCB->Sccb_XferCnt - xfercnt);
                   8143: 
                   8144:    currSCCB->Sccb_XferCnt = xfercnt;
                   8145: 
                   8146:    if ((RDW_HARPOON((port+hp_intstat)) & PARITY) &&
                   8147:       (currSCCB->HostStatus == SCCB_COMPLETE)) {
                   8148: 
                   8149:       currSCCB->HostStatus = SCCB_PARITY_ERR;
                   8150:       WRW_HARPOON((port+hp_intstat), PARITY);
                   8151:       }
                   8152: 
                   8153: 
                   8154:    hostDataXferAbort(port,p_card,currSCCB);
                   8155: 
                   8156: 
                   8157:    WR_HARPOON(port+hp_fifowrite, 0x00);
                   8158:    WR_HARPOON(port+hp_fiforead, 0x00);
                   8159:    WR_HARPOON(port+hp_xferstat, 0x00);
                   8160: 
                   8161:    WRW_HARPOON((port+hp_intstat), XFER_CNT_0);
                   8162: }
                   8163: 
                   8164: 
                   8165: /*---------------------------------------------------------------------
                   8166:  *
                   8167:  * Function: Phase Bus Free
                   8168:  *
                   8169:  * Description: We just went bus free so figure out if it was
                   8170:  *              because of command complete or from a disconnect.
                   8171:  *
                   8172:  *---------------------------------------------------------------------*/
                   8173: #if defined(DOS)
                   8174: void phaseBusFree(USHORT port, UCHAR p_card)
                   8175: #else
                   8176: void phaseBusFree(ULONG port, UCHAR p_card)
                   8177: #endif
                   8178: {
                   8179:    PSCCB currSCCB;
                   8180: 
                   8181:    currSCCB = BL_Card[p_card].currentSCCB;
                   8182: 
                   8183:    if (currSCCB != NULL)
                   8184:       {
                   8185: 
                   8186:       DISABLE_AUTO(port);
                   8187: 
                   8188: 
                   8189:       if (currSCCB->OperationCode == RESET_COMMAND)
                   8190:          {
                   8191: 
                   8192:                        if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   8193:                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                   8194:                         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
                   8195:                        else
                   8196:                         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
                   8197: 
                   8198:              queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
                   8199: 
                   8200:              queueSearchSelect(&BL_Card[p_card],p_card);
                   8201: 
                   8202:              }
                   8203: 
                   8204:       else if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
                   8205:              {
                   8206:              sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
                   8207:                                 (UCHAR)SYNC_SUPPORTED;
                   8208:              sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
                   8209:              }
                   8210: 
                   8211:       else if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
                   8212:              {
                   8213:              sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
                   8214:                            (sccbMgrTbl[p_card][currSCCB->TargID].
                   8215:                   TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
                   8216: 
                   8217:              sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
                   8218:              }
                   8219: 
                   8220: #if !defined(DOS)
                   8221:       else if(currSCCB->Sccb_scsistat == SELECT_Q_ST)
                   8222:              {
                   8223:              /* Make sure this is not a phony BUS_FREE.  If we were
                   8224:              reselected or if BUSY is NOT on then this is a
                   8225:              valid BUS FREE.  SRR Wednesday, 5/10/1995.     */
                   8226: 
                   8227:              if ((!(RD_HARPOON(port+hp_scsisig) & SCSI_BSY)) ||
                   8228:                 (RDW_HARPOON((port+hp_intstat)) & RSEL))
                   8229:                 {
                   8230:                 sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_TAG_Q_MASK;
                   8231:                 sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |= TAG_Q_REJECT;
                   8232:                 }
                   8233: 
                   8234:              else
                   8235:             {
                   8236:                 return;
                   8237:                 }
                   8238:          }
                   8239: #endif
                   8240: 
                   8241:       else
                   8242:              {
                   8243: 
                   8244:              currSCCB->Sccb_scsistat = BUS_FREE_ST;
                   8245: 
                   8246:          if (!currSCCB->HostStatus)
                   8247:                 {
                   8248:                 currSCCB->HostStatus = SCCB_PHASE_SEQUENCE_FAIL;
                   8249:                 }
                   8250: 
                   8251:                        if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   8252:                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                   8253:                         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
                   8254:                        else
                   8255:                         sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
                   8256: 
                   8257:              queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
                   8258:              return;
                   8259:              }
                   8260: 
                   8261: 
                   8262:       BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
                   8263: 
                   8264:       } /*end if !=null */
                   8265: }
                   8266: 
                   8267: 
                   8268: 
                   8269: 
                   8270: #ident "$Id: FlashPoint.c,v 1.1 1999/04/26 05:53:56 tb Exp $"
                   8271: /*----------------------------------------------------------------------
                   8272:  *
                   8273:  *
                   8274:  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
                   8275:  *
                   8276:  *   This file is available under both the GNU General Public License
                   8277:  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
                   8278:  *
                   8279:  *   $Workfile:   automate.c  $
                   8280:  *
                   8281:  *   Description:  Functions relating to programming the automation of
                   8282:  *                 the HARPOON.
                   8283:  *
                   8284:  *   $Date: 1999/04/26 05:53:56 $
                   8285:  *
                   8286:  *   $Revision: 1.1 $
                   8287:  *
                   8288:  *----------------------------------------------------------------------*/
                   8289: 
                   8290: /*#include <globals.h>*/
                   8291: 
                   8292: #if (FW_TYPE==_UCB_MGR_)
                   8293:        /*#include <budi.h>*/
                   8294: #endif
                   8295: 
                   8296: /*#include <sccbmgr.h>*/
                   8297: /*#include <blx30.h>*/
                   8298: /*#include <target.h>*/
                   8299: /*#include <scsi2.h>*/
                   8300: /*#include <harpoon.h>*/
                   8301: 
                   8302: /*
                   8303: extern SCCBCARD BL_Card[MAX_CARDS];
                   8304: extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
                   8305: extern SCCBCARD BL_Card[MAX_CARDS];
                   8306: */
                   8307: 
                   8308: /*---------------------------------------------------------------------
                   8309:  *
                   8310:  * Function: Auto Load Default Map
                   8311:  *
                   8312:  * Description: Load the Automation RAM with the defualt map values.
                   8313:  *
                   8314:  *---------------------------------------------------------------------*/
                   8315: #if defined(DOS)
                   8316: void autoLoadDefaultMap(USHORT p_port)
                   8317: #else
                   8318: void autoLoadDefaultMap(ULONG p_port)
                   8319: #endif
                   8320: {
                   8321: #if defined(DOS)
                   8322:    USHORT map_addr;
                   8323: #else
                   8324:    ULONG map_addr;
                   8325: #endif
                   8326: 
                   8327:    ARAM_ACCESS(p_port);
                   8328:    map_addr = p_port + hp_aramBase;
                   8329: 
                   8330:    WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0xC0));  /*ID MESSAGE */
                   8331:    map_addr +=2;
                   8332:    WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x20));  /*SIMPLE TAG QUEUEING MSG */
                   8333:    map_addr +=2;
                   8334:    WRW_HARPOON(map_addr, RAT_OP);                   /*RESET ATTENTION */
                   8335:    map_addr +=2;
                   8336:    WRW_HARPOON(map_addr, (MPM_OP+AMSG_OUT+ 0x00));  /*TAG ID MSG */
                   8337:    map_addr +=2;
                   8338:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 0 */
                   8339:    map_addr +=2;
                   8340:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 1 */
                   8341:    map_addr +=2;
                   8342:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 2 */
                   8343:    map_addr +=2;
                   8344:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 3 */
                   8345:    map_addr +=2;
                   8346:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 4 */
                   8347:    map_addr +=2;
                   8348:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 5 */
                   8349:    map_addr +=2;
                   8350:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 6 */
                   8351:    map_addr +=2;
                   8352:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 7 */
                   8353:    map_addr +=2;
                   8354:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 8 */
                   8355:    map_addr +=2;
                   8356:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 9 */
                   8357:    map_addr +=2;
                   8358:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 10 */
                   8359:    map_addr +=2;
                   8360:    WRW_HARPOON(map_addr, (MPM_OP+ACOMMAND+ 0x00));  /*CDB BYTE 11 */
                   8361:    map_addr +=2;
                   8362:    WRW_HARPOON(map_addr, (CPE_OP+ADATA_OUT+ DINT)); /*JUMP IF DATA OUT */
                   8363:    map_addr +=2;
                   8364:    WRW_HARPOON(map_addr, (TCB_OP+FIFO_0+ DI));     /*JUMP IF NO DATA IN FIFO */
                   8365:    map_addr +=2;                                   /*This means AYNC DATA IN */
                   8366:    WRW_HARPOON(map_addr, (SSI_OP+   SSI_IDO_STRT)); /*STOP AND INTERRUPT */
                   8367:    map_addr +=2;
                   8368:    WRW_HARPOON(map_addr, (CPE_OP+ADATA_IN+DINT));   /*JUMP IF NOT DATA IN PHZ */
                   8369:    map_addr +=2;
                   8370:    WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+  ST));    /*IF NOT MSG IN CHECK 4 DATA IN */
                   8371:    map_addr +=2;
                   8372:    WRW_HARPOON(map_addr, (CRD_OP+SDATA+    0x02));  /*SAVE DATA PTR MSG? */
                   8373:    map_addr +=2;
                   8374:    WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+   DC));    /*GO CHECK FOR DISCONNECT MSG */
                   8375:    map_addr +=2;
                   8376:    WRW_HARPOON(map_addr, (MRR_OP+SDATA+    D_AR1)); /*SAVE DATA PTRS MSG */
                   8377:    map_addr +=2;
                   8378:    WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+  ST));    /*IF NOT MSG IN CHECK DATA IN */
                   8379:    map_addr +=2;
                   8380:    WRW_HARPOON(map_addr, (CRD_OP+SDATA+    0x04));  /*DISCONNECT MSG? */
                   8381:    map_addr +=2;
                   8382:    WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+   UNKNWN));/*UKNKNOWN MSG */
                   8383:    map_addr +=2;
                   8384:    WRW_HARPOON(map_addr, (MRR_OP+SDATA+    D_BUCKET));/*XFER DISCONNECT MSG */
                   8385:    map_addr +=2;
                   8386:    WRW_HARPOON(map_addr, (SSI_OP+          SSI_ITAR_DISC));/*STOP AND INTERRUPT */
                   8387:    map_addr +=2;
                   8388:    WRW_HARPOON(map_addr, (CPN_OP+ASTATUS+  UNKNWN));/*JUMP IF NOT STATUS PHZ. */
                   8389:    map_addr +=2;
                   8390:    WRW_HARPOON(map_addr, (MRR_OP+SDATA+  D_AR0));   /*GET STATUS BYTE */
                   8391:    map_addr +=2;
                   8392:    WRW_HARPOON(map_addr, (CPN_OP+AMSG_IN+  CC));    /*ERROR IF NOT MSG IN PHZ */
                   8393:    map_addr +=2;
                   8394:    WRW_HARPOON(map_addr, (CRD_OP+SDATA+    0x00));  /*CHECK FOR CMD COMPLETE MSG. */
                   8395:    map_addr +=2;
                   8396:    WRW_HARPOON(map_addr, (BRH_OP+NOT_EQ+   CC));    /*ERROR IF NOT CMD COMPLETE MSG. */
                   8397:    map_addr +=2;
                   8398:    WRW_HARPOON(map_addr, (MRR_OP+SDATA+  D_BUCKET));/*GET CMD COMPLETE MSG */
                   8399:    map_addr +=2;
                   8400:    WRW_HARPOON(map_addr, (SSI_OP+       SSI_ICMD_COMP));/*END OF COMMAND */
                   8401:    map_addr +=2;
                   8402: 
                   8403:    WRW_HARPOON(map_addr, (SSI_OP+ SSI_IUNKWN));  /*RECEIVED UNKNOWN MSG BYTE */
                   8404:    map_addr +=2;
                   8405:    WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC));  /*NO COMMAND COMPLETE AFTER STATUS */
                   8406:    map_addr +=2;
                   8407:    WRW_HARPOON(map_addr, (SSI_OP+ SSI_ITICKLE)); /*BIOS Tickled the Mgr */
                   8408:    map_addr +=2;
                   8409:    WRW_HARPOON(map_addr, (SSI_OP+ SSI_IRFAIL));  /*EXPECTED ID/TAG MESSAGES AND */
                   8410:    map_addr +=2;                             /* DIDN'T GET ONE */
                   8411:    WRW_HARPOON(map_addr, (CRR_OP+AR3+  S_IDREG)); /* comp SCSI SEL ID & AR3*/
                   8412:    map_addr +=2;
                   8413:    WRW_HARPOON(map_addr, (BRH_OP+EQUAL+   0x00));    /*SEL ID OK then Conti. */
                   8414:    map_addr +=2;
                   8415:    WRW_HARPOON(map_addr, (SSI_OP+ SSI_INO_CC));  /*NO COMMAND COMPLETE AFTER STATUS */
                   8416: 
                   8417: 
                   8418: 
                   8419:    SGRAM_ACCESS(p_port);
                   8420: }
                   8421: 
                   8422: /*---------------------------------------------------------------------
                   8423:  *
                   8424:  * Function: Auto Command Complete
                   8425:  *
                   8426:  * Description: Post command back to host and find another command
                   8427:  *              to execute.
                   8428:  *
                   8429:  *---------------------------------------------------------------------*/
                   8430: 
                   8431: #if defined(DOS)
                   8432: void autoCmdCmplt(USHORT p_port, UCHAR p_card)
                   8433: #else
                   8434: void autoCmdCmplt(ULONG p_port, UCHAR p_card)
                   8435: #endif
                   8436: {
                   8437:    PSCCB currSCCB;
                   8438:    UCHAR status_byte;
                   8439: 
                   8440:    currSCCB = BL_Card[p_card].currentSCCB;
                   8441: 
                   8442:    status_byte = RD_HARPOON(p_port+hp_gp_reg_0);
                   8443: 
                   8444:    sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA = FALSE;
                   8445: 
                   8446:    if (status_byte != SSGOOD) {
                   8447: 
                   8448:       if (status_byte == SSQ_FULL) {
                   8449: 
                   8450: 
                   8451:                        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   8452:                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   8453:                        {
                   8454:                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
                   8455:                                if(BL_Card[p_card].discQCount != 0)
                   8456:                                        BL_Card[p_card].discQCount--;
                   8457:                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
                   8458:                        }
                   8459:                        else
                   8460:                        {
                   8461:                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
                   8462:                                if(currSCCB->Sccb_tag)
                   8463:                                {
                   8464:                                        if(BL_Card[p_card].discQCount != 0)
                   8465:                                                BL_Card[p_card].discQCount--;
                   8466:                                        BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                   8467:                                }else
                   8468:                                {
                   8469:                                        if(BL_Card[p_card].discQCount != 0)
                   8470:                                                BL_Card[p_card].discQCount--;
                   8471:                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
                   8472:                                }
                   8473:                        }
                   8474: 
                   8475:          currSCCB->Sccb_MGRFlags |= F_STATUSLOADED;
                   8476: 
                   8477:          queueSelectFail(&BL_Card[p_card],p_card);
                   8478: 
                   8479:          return;
                   8480:          }
                   8481: 
                   8482:       if(currSCCB->Sccb_scsistat == SELECT_SN_ST)
                   8483:          {
                   8484:          sccbMgrTbl[p_card][currSCCB->TargID].TarStatus |=
                   8485:             (UCHAR)SYNC_SUPPORTED;
                   8486: 
                   8487:              sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_SYNC_MASK;
                   8488:          BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
                   8489: 
                   8490:                        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   8491:                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   8492:                        {
                   8493:                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
                   8494:                                if(BL_Card[p_card].discQCount != 0)
                   8495:                                        BL_Card[p_card].discQCount--;
                   8496:                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
                   8497:                        }
                   8498:                        else
                   8499:                        {
                   8500:                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
                   8501:                                if(currSCCB->Sccb_tag)
                   8502:                                {
                   8503:                                        if(BL_Card[p_card].discQCount != 0)
                   8504:                                                BL_Card[p_card].discQCount--;
                   8505:                                        BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                   8506:                                }else
                   8507:                                {
                   8508:                                        if(BL_Card[p_card].discQCount != 0)
                   8509:                                                BL_Card[p_card].discQCount--;
                   8510:                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
                   8511:                                }
                   8512:                        }
                   8513:          return;
                   8514: 
                   8515:          }
                   8516: 
                   8517:       if(currSCCB->Sccb_scsistat == SELECT_WN_ST)
                   8518:          {
                   8519: 
                   8520:              sccbMgrTbl[p_card][currSCCB->TargID].TarStatus =
                   8521:                 (sccbMgrTbl[p_card][currSCCB->TargID].
                   8522:                 TarStatus & ~WIDE_ENABLED) | WIDE_NEGOCIATED;
                   8523: 
                   8524:              sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue &= ~EE_WIDE_SCSI;
                   8525:          BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
                   8526: 
                   8527:                        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   8528:                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   8529:                        {
                   8530:                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
                   8531:                                if(BL_Card[p_card].discQCount != 0)
                   8532:                                        BL_Card[p_card].discQCount--;
                   8533:                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
                   8534:                        }
                   8535:                        else
                   8536:                        {
                   8537:                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
                   8538:                                if(currSCCB->Sccb_tag)
                   8539:                                {
                   8540:                                        if(BL_Card[p_card].discQCount != 0)
                   8541:                                                BL_Card[p_card].discQCount--;
                   8542:                                        BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                   8543:                                }else
                   8544:                                {
                   8545:                                        if(BL_Card[p_card].discQCount != 0)
                   8546:                                                BL_Card[p_card].discQCount--;
                   8547:                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
                   8548:                                }
                   8549:                        }
                   8550:          return;
                   8551:       
                   8552:          }
                   8553:      
                   8554:           if (status_byte == SSCHECK) 
                   8555:                {
                   8556:                        if(BL_Card[p_card].globalFlags & F_DO_RENEGO)
                   8557:                        {
                   8558:                                if (sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_SYNC_MASK)
                   8559:                                {
                   8560:                                        sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_SYNC_MASK;
                   8561:                                }
                   8562:                                if (sccbMgrTbl[p_card][currSCCB->TargID].TarEEValue & EE_WIDE_SCSI)
                   8563:                                {
                   8564:                                        sccbMgrTbl[p_card][currSCCB->TargID].TarStatus &= ~TAR_WIDE_MASK;
                   8565:                                }
                   8566:                        }
                   8567:                }
                   8568: 
                   8569:       if (!(currSCCB->Sccb_XferState & F_AUTO_SENSE)) {
                   8570: 
                   8571:          currSCCB->SccbStatus = SCCB_ERROR;
                   8572:          currSCCB->TargetStatus = status_byte;
                   8573: 
                   8574:          if (status_byte == SSCHECK) {
                   8575: 
                   8576:             sccbMgrTbl[p_card][currSCCB->TargID].TarLUN_CA
                   8577:                = TRUE;
                   8578:      
                   8579: 
                   8580: #if (FW_TYPE==_SCCB_MGR_)
                   8581:             if (currSCCB->RequestSenseLength != NO_AUTO_REQUEST_SENSE) {
                   8582: 
                   8583:                if (currSCCB->RequestSenseLength == 0)
                   8584:                   currSCCB->RequestSenseLength = 14;
                   8585: 
                   8586:                ssenss(&BL_Card[p_card]);
                   8587:                BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
                   8588: 
                   8589:                                        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   8590:                                                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   8591:                                        {
                   8592:                                 sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
                   8593:                                                if(BL_Card[p_card].discQCount != 0)
                   8594:                                                        BL_Card[p_card].discQCount--;
                   8595:                                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
                   8596:                                        }
                   8597:                                        else
                   8598:                                        {
                   8599:                              sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
                   8600:                                                if(currSCCB->Sccb_tag)
                   8601:                                                {
                   8602:                                                        if(BL_Card[p_card].discQCount != 0)
                   8603:                                                                BL_Card[p_card].discQCount--;
                   8604:                                                        BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                   8605:                                                }else
                   8606:                                                {
                   8607:                                                        if(BL_Card[p_card].discQCount != 0)
                   8608:                                                                BL_Card[p_card].discQCount--;
                   8609:                                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
                   8610:                                                }
                   8611:                                        }
                   8612:                return;
                   8613:                }
                   8614: #else
                   8615:                                   if ((!(currSCCB->Sccb_ucb_ptr->UCB_opcode & OPC_NO_AUTO_SENSE)) &&
                   8616:                                        (currSCCB->RequestSenseLength))
                   8617:                                   {
                   8618:                                        ssenss(&BL_Card[p_card]);
                   8619:                                      BL_Card[p_card].globalFlags |= F_NEW_SCCB_CMD;
                   8620: 
                   8621:                                                if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   8622:                                                        ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   8623:                                                {
                   8624:                                   sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = TRUE;
                   8625:                                                        if(BL_Card[p_card].discQCount != 0)
                   8626:                                                                BL_Card[p_card].discQCount--;
                   8627:                                                        BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[currSCCB->Lun]] = NULL;
                   8628:                                                }
                   8629:                                                else
                   8630:                                                {
                   8631:                                   sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = TRUE;
                   8632:                                                        if(currSCCB->Sccb_tag)
                   8633:                                                        {
                   8634:                                                                if(BL_Card[p_card].discQCount != 0)
                   8635:                                                                        BL_Card[p_card].discQCount--;
                   8636:                                                                BL_Card[p_card].discQ_Tbl[currSCCB->Sccb_tag] = NULL;
                   8637:                                                        }else
                   8638:                                                        {
                   8639:                                                                if(BL_Card[p_card].discQCount != 0)
                   8640:                                                                        BL_Card[p_card].discQCount--;
                   8641:                                                                BL_Card[p_card].discQ_Tbl[sccbMgrTbl[p_card][currSCCB->TargID].LunDiscQ_Idx[0]] = NULL;
                   8642:                                                        }
                   8643:                                                }
                   8644:                                      return;
                   8645:                                   }
                   8646: 
                   8647: #endif
                   8648:             }
                   8649:          }
                   8650:       }
                   8651: 
                   8652: 
                   8653:        if((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   8654:                ((sccbMgrTbl[p_card][currSCCB->TargID].TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                   8655:           sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[currSCCB->Lun] = FALSE;
                   8656:        else
                   8657:           sccbMgrTbl[p_card][currSCCB->TargID].TarLUNBusy[0] = FALSE;
                   8658: 
                   8659: 
                   8660:    queueCmdComplete(&BL_Card[p_card], currSCCB, p_card);
                   8661: }
                   8662: #ident "$Id: FlashPoint.c,v 1.1 1999/04/26 05:53:56 tb Exp $"
                   8663: /*----------------------------------------------------------------------
                   8664:  *
                   8665:  *
                   8666:  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
                   8667:  *
                   8668:  *   This file is available under both the GNU General Public License
                   8669:  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
                   8670:  *
                   8671:  *   $Workfile:   busmstr.c  $
                   8672:  *
                   8673:  *   Description:  Functions to start, stop, and abort BusMaster operations.
                   8674:  *
                   8675:  *   $Date: 1999/04/26 05:53:56 $
                   8676:  *
                   8677:  *   $Revision: 1.1 $
                   8678:  *
                   8679:  *----------------------------------------------------------------------*/
                   8680: 
                   8681: /*#include <globals.h>*/
                   8682: 
                   8683: #if (FW_TYPE==_UCB_MGR_)
                   8684:        /*#include <budi.h>*/
                   8685: #endif
                   8686: 
                   8687: /*#include <sccbmgr.h>*/
                   8688: /*#include <blx30.h>*/
                   8689: /*#include <target.h>*/
                   8690: /*#include <scsi2.h>*/
                   8691: /*#include <harpoon.h>*/
                   8692: 
                   8693: 
                   8694: /*
                   8695: extern SCCBCARD BL_Card[MAX_CARDS];
                   8696: extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
                   8697: */
                   8698: 
                   8699: #define SHORT_WAIT   0x0000000F
                   8700: #define LONG_WAIT    0x0000FFFFL
                   8701: 
                   8702: #if defined(BUGBUG)
                   8703: void Debug_Load(UCHAR p_card, UCHAR p_bug_data);
                   8704: #endif
                   8705: 
                   8706: /*---------------------------------------------------------------------
                   8707:  *
                   8708:  * Function: Data Transfer Processor
                   8709:  *
                   8710:  * Description: This routine performs two tasks.
                   8711:  *              (1) Start data transfer by calling HOST_DATA_XFER_START
                   8712:  *              function.  Once data transfer is started, (2) Depends
                   8713:  *              on the type of data transfer mode Scatter/Gather mode
                   8714:  *              or NON Scatter/Gather mode.  In NON Scatter/Gather mode,
                   8715:  *              this routine checks Sccb_MGRFlag (F_HOST_XFER_ACT bit) for
                   8716:  *              data transfer done.  In Scatter/Gather mode, this routine
                   8717:  *              checks bus master command complete and dual rank busy
                   8718:  *              bit to keep chaining SC transfer command.  Similarly,
                   8719:  *              in Scatter/Gather mode, it checks Sccb_MGRFlag
                   8720:  *              (F_HOST_XFER_ACT bit) for data transfer done.
                   8721:  *              
                   8722:  *---------------------------------------------------------------------*/
                   8723: 
                   8724: #if defined(DOS)
                   8725: void dataXferProcessor(USHORT port, PSCCBcard pCurrCard)
                   8726: #else
                   8727: void dataXferProcessor(ULONG port, PSCCBcard pCurrCard)
                   8728: #endif
                   8729: {
                   8730:    PSCCB currSCCB;
                   8731: 
                   8732:    currSCCB = pCurrCard->currentSCCB;
                   8733: 
                   8734:       if (currSCCB->Sccb_XferState & F_SG_XFER)
                   8735:                        {
                   8736:                        if (pCurrCard->globalFlags & F_HOST_XFER_ACT)
                   8737: 
                   8738:                                {
                   8739:                        currSCCB->Sccb_sgseg += (UCHAR)SG_BUF_CNT;
                   8740:                currSCCB->Sccb_SGoffset = 0x00; 
                   8741:                                }
                   8742:                        pCurrCard->globalFlags |= F_HOST_XFER_ACT;
                   8743:          
                   8744:          busMstrSGDataXferStart(port, currSCCB);
                   8745:                        }
                   8746: 
                   8747:       else
                   8748:                        {
                   8749:                        if (!(pCurrCard->globalFlags & F_HOST_XFER_ACT))
                   8750:                                {
                   8751:                                pCurrCard->globalFlags |= F_HOST_XFER_ACT;
                   8752:          
                   8753:                busMstrDataXferStart(port, currSCCB);
                   8754:                }
                   8755:                        }
                   8756: }
                   8757: 
                   8758: 
                   8759: /*---------------------------------------------------------------------
                   8760:  *
                   8761:  * Function: BusMaster Scatter Gather Data Transfer Start
                   8762:  *
                   8763:  * Description:
                   8764:  *
                   8765:  *---------------------------------------------------------------------*/
                   8766: #if defined(DOS)
                   8767: void busMstrSGDataXferStart(USHORT p_port, PSCCB pcurrSCCB)
                   8768: #else
                   8769: void busMstrSGDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
                   8770: #endif
                   8771: {
                   8772:    ULONG count,addr,tmpSGCnt;
                   8773:    UINT sg_index;
                   8774:    UCHAR sg_count, i;
                   8775: #if defined(DOS)
                   8776:    USHORT reg_offset;
                   8777: #else
                   8778:    ULONG reg_offset;
                   8779: #endif
                   8780: 
                   8781: 
                   8782:    if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
                   8783: 
                   8784:       count =  ((ULONG) HOST_RD_CMD)<<24;
                   8785:       }
                   8786: 
                   8787:    else {
                   8788:       count =  ((ULONG) HOST_WRT_CMD)<<24;
                   8789:       }
                   8790: 
                   8791:    sg_count = 0;
                   8792:    tmpSGCnt = 0;
                   8793:    sg_index = pcurrSCCB->Sccb_sgseg;
                   8794:    reg_offset = hp_aramBase;
                   8795: 
                   8796: 
                   8797:        i = (UCHAR) (RD_HARPOON(p_port+hp_page_ctrl) & ~(SGRAM_ARAM|SCATTER_EN));
                   8798: 
                   8799: 
                   8800:        WR_HARPOON(p_port+hp_page_ctrl, i);
                   8801: 
                   8802:    while ((sg_count < (UCHAR)SG_BUF_CNT) &&
                   8803:       ((ULONG)(sg_index * (UINT)SG_ELEMENT_SIZE) < pcurrSCCB->DataLength) ) {
                   8804: 
                   8805: #if defined(COMPILER_16_BIT) && !defined(DOS)
                   8806:       tmpSGCnt += *(((ULONG far *)pcurrSCCB->DataPointer)+
                   8807:          (sg_index * 2));
                   8808: 
                   8809:       count |= *(((ULONG far *)pcurrSCCB->DataPointer)+
                   8810:          (sg_index * 2));
                   8811: 
                   8812:       addr = *(((ULONG far *)pcurrSCCB->DataPointer)+
                   8813:          ((sg_index * 2) + 1));
                   8814: 
                   8815: #else
                   8816:       tmpSGCnt += *(((ULONG *)pcurrSCCB->DataPointer)+
                   8817:          (sg_index * 2));
                   8818: 
                   8819:       count |= *(((ULONG *)pcurrSCCB->DataPointer)+
                   8820:          (sg_index * 2));
                   8821: 
                   8822:       addr = *(((ULONG *)pcurrSCCB->DataPointer)+
                   8823:          ((sg_index * 2) + 1));
                   8824: #endif
                   8825: 
                   8826: 
                   8827:       if ((!sg_count) && (pcurrSCCB->Sccb_SGoffset)) {
                   8828: 
                   8829:          addr += ((count & 0x00FFFFFFL) - pcurrSCCB->Sccb_SGoffset);
                   8830:          count = (count & 0xFF000000L) | pcurrSCCB->Sccb_SGoffset;
                   8831: 
                   8832:          tmpSGCnt = count & 0x00FFFFFFL;
                   8833:          }
                   8834: 
                   8835:       WR_HARP32(p_port,reg_offset,addr);
                   8836:       reg_offset +=4;
                   8837: 
                   8838:       WR_HARP32(p_port,reg_offset,count);
                   8839:       reg_offset +=4;
                   8840: 
                   8841:       count &= 0xFF000000L;
                   8842:       sg_index++;
                   8843:       sg_count++;
                   8844: 
                   8845:       } /*End While */
                   8846: 
                   8847:    pcurrSCCB->Sccb_XferCnt = tmpSGCnt;
                   8848: 
                   8849:    WR_HARPOON(p_port+hp_sg_addr,(sg_count<<4));
                   8850: 
                   8851:    if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
                   8852: 
                   8853:       WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt);
                   8854: 
                   8855: 
                   8856:       WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT));
                   8857:       WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH);
                   8858:       }
                   8859: 
                   8860:    else {
                   8861: 
                   8862: 
                   8863:       if ((!(RD_HARPOON(p_port+hp_synctarg_0) & NARROW_SCSI)) &&
                   8864:          (tmpSGCnt & 0x000000001))
                   8865:          {
                   8866: 
                   8867:          pcurrSCCB->Sccb_XferState |= F_ODD_BALL_CNT;
                   8868:          tmpSGCnt--;
                   8869:          }
                   8870: 
                   8871: 
                   8872:       WR_HARP32(p_port,hp_xfercnt_0,tmpSGCnt);
                   8873: 
                   8874:       WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD));
                   8875:       WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH);
                   8876:       }
                   8877: 
                   8878: 
                   8879:    WR_HARPOON(p_port+hp_page_ctrl, (UCHAR) (i | SCATTER_EN));
                   8880: 
                   8881: }
                   8882: 
                   8883: 
                   8884: /*---------------------------------------------------------------------
                   8885:  *
                   8886:  * Function: BusMaster Data Transfer Start
                   8887:  *
                   8888:  * Description: 
                   8889:  *
                   8890:  *---------------------------------------------------------------------*/
                   8891: #if defined(DOS)
                   8892: void busMstrDataXferStart(USHORT p_port, PSCCB pcurrSCCB)
                   8893: #else
                   8894: void busMstrDataXferStart(ULONG p_port, PSCCB pcurrSCCB)
                   8895: #endif
                   8896: {
                   8897:    ULONG addr,count;
                   8898: 
                   8899:    if (!(pcurrSCCB->Sccb_XferState & F_AUTO_SENSE)) {
                   8900: 
                   8901:       count = pcurrSCCB->Sccb_XferCnt;
                   8902: 
                   8903:       addr = (ULONG) pcurrSCCB->DataPointer + pcurrSCCB->Sccb_ATC;
                   8904:       }
                   8905: 
                   8906:    else {
                   8907:       addr = pcurrSCCB->SensePointer;
                   8908:       count = pcurrSCCB->RequestSenseLength;
                   8909: 
                   8910:       }
                   8911: 
                   8912: #if defined(DOS)
                   8913:    asm { mov dx,p_port;
                   8914:          mov ax,word ptr count;
                   8915:          add dx,hp_xfer_cnt_lo;
                   8916:          out dx,al;
                   8917:          inc dx;
                   8918:          xchg ah,al
                   8919:          out dx,al;
                   8920:          inc dx;
                   8921:          mov ax,word ptr count+2;
                   8922:          out dx,al;
                   8923:          inc dx;
                   8924:          inc dx;
                   8925:          mov ax,word ptr addr;
                   8926:          out dx,al;
                   8927:          inc dx;
                   8928:          xchg ah,al
                   8929:          out dx,al;
                   8930:          inc dx;
                   8931:          mov ax,word ptr addr+2;
                   8932:          out dx,al;
                   8933:          inc dx;
                   8934:          xchg ah,al
                   8935:          out dx,al;
                   8936:          }
                   8937: 
                   8938:    WR_HARP32(p_port,hp_xfercnt_0,count);
                   8939: 
                   8940: #else
                   8941:    HP_SETUP_ADDR_CNT(p_port,addr,count);
                   8942: #endif
                   8943: 
                   8944: 
                   8945:    if (pcurrSCCB->Sccb_XferState & F_HOST_XFER_DIR) {
                   8946: 
                   8947:       WR_HARPOON(p_port+hp_portctrl_0,(DMA_PORT | SCSI_PORT | SCSI_INBIT));
                   8948:       WR_HARPOON(p_port+hp_scsisig, S_DATAI_PH);
                   8949: 
                   8950:       WR_HARPOON(p_port+hp_xfer_cmd,
                   8951:          (XFER_DMA_HOST | XFER_HOST_AUTO | XFER_DMA_8BIT));
                   8952:       }
                   8953: 
                   8954:    else {
                   8955: 
                   8956:       WR_HARPOON(p_port+hp_portctrl_0,(SCSI_PORT | DMA_PORT | DMA_RD));
                   8957:       WR_HARPOON(p_port+hp_scsisig, S_DATAO_PH);
                   8958: 
                   8959:       WR_HARPOON(p_port+hp_xfer_cmd,
                   8960:          (XFER_HOST_DMA | XFER_HOST_AUTO | XFER_DMA_8BIT));
                   8961: 
                   8962:       }
                   8963: }
                   8964: 
                   8965: 
                   8966: /*---------------------------------------------------------------------
                   8967:  *
                   8968:  * Function: BusMaster Timeout Handler
                   8969:  *
                   8970:  * Description: This function is called after a bus master command busy time
                   8971:  *               out is detected.  This routines issue halt state machine
                   8972:  *               with a software time out for command busy.  If command busy
                   8973:  *               is still asserted at the end of the time out, it issues
                   8974:  *               hard abort with another software time out.  It hard abort
                   8975:  *               command busy is also time out, it'll just give up.
                   8976:  *
                   8977:  *---------------------------------------------------------------------*/
                   8978: #if defined(DOS)
                   8979: UCHAR busMstrTimeOut(USHORT p_port)
                   8980: #else
                   8981: UCHAR busMstrTimeOut(ULONG p_port)
                   8982: #endif
                   8983: {
                   8984:    ULONG timeout;
                   8985: 
                   8986:    timeout = LONG_WAIT;
                   8987: 
                   8988:    WR_HARPOON(p_port+hp_sys_ctrl, HALT_MACH);
                   8989: 
                   8990:    while ((!(RD_HARPOON(p_port+hp_ext_status) & CMD_ABORTED)) && timeout--) {}
                   8991: 
                   8992:    
                   8993:    
                   8994:    if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) {
                   8995:       WR_HARPOON(p_port+hp_sys_ctrl, HARD_ABORT);
                   8996: 
                   8997:       timeout = LONG_WAIT;
                   8998:       while ((RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
                   8999:       }
                   9000: 
                   9001:    RD_HARPOON(p_port+hp_int_status);           /*Clear command complete */
                   9002: 
                   9003:    if (RD_HARPOON(p_port+hp_ext_status) & BM_CMD_BUSY) {
                   9004:       return(TRUE);
                   9005:       }
                   9006: 
                   9007:    else {
                   9008:       return(FALSE);
                   9009:       }
                   9010: }
                   9011: 
                   9012: 
                   9013: /*---------------------------------------------------------------------
                   9014:  *
                   9015:  * Function: Host Data Transfer Abort
                   9016:  *
                   9017:  * Description: Abort any in progress transfer.
                   9018:  *
                   9019:  *---------------------------------------------------------------------*/
                   9020: #if defined(DOS)
                   9021: void hostDataXferAbort(USHORT port, UCHAR p_card, PSCCB pCurrSCCB)
                   9022: #else
                   9023: void hostDataXferAbort(ULONG port, UCHAR p_card, PSCCB pCurrSCCB)
                   9024: #endif
                   9025: {
                   9026: 
                   9027:    ULONG timeout;
                   9028:    ULONG remain_cnt;
                   9029:    UINT sg_ptr;
                   9030: 
                   9031:    BL_Card[p_card].globalFlags &= ~F_HOST_XFER_ACT;
                   9032: 
                   9033:    if (pCurrSCCB->Sccb_XferState & F_AUTO_SENSE) {
                   9034: 
                   9035: 
                   9036:       if (!(RD_HARPOON(port+hp_int_status) & INT_CMD_COMPL)) {
                   9037: 
                   9038:          WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) | FLUSH_XFER_CNTR));
                   9039:          timeout = LONG_WAIT;
                   9040: 
                   9041:          while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
                   9042: 
                   9043:          WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) & ~FLUSH_XFER_CNTR));
                   9044: 
                   9045:          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
                   9046: 
                   9047:             if (busMstrTimeOut(port)) {
                   9048: 
                   9049:                if (pCurrSCCB->HostStatus == 0x00)
                   9050: 
                   9051:                   pCurrSCCB->HostStatus = SCCB_BM_ERR;
                   9052: 
                   9053:                }
                   9054: 
                   9055:             if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) 
                   9056: 
                   9057:                if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) 
                   9058: 
                   9059:                   if (pCurrSCCB->HostStatus == 0x00)
                   9060: 
                   9061:                      {
                   9062:                      pCurrSCCB->HostStatus = SCCB_BM_ERR;
                   9063: #if defined(BUGBUG)
                   9064:                      WR_HARPOON(port+hp_dual_addr_lo,
                   9065:                         RD_HARPOON(port+hp_ext_status));
                   9066: #endif
                   9067:                      }
                   9068:             }
                   9069:          }
                   9070:       }
                   9071: 
                   9072:    else if (pCurrSCCB->Sccb_XferCnt) {
                   9073: 
                   9074:       if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
                   9075: 
                   9076: 
                   9077:               WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) &
                   9078:             ~SCATTER_EN));
                   9079: 
                   9080:          WR_HARPOON(port+hp_sg_addr,0x00);
                   9081: 
                   9082:          sg_ptr = pCurrSCCB->Sccb_sgseg + SG_BUF_CNT;
                   9083: 
                   9084:          if (sg_ptr > (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE)) {
                   9085: 
                   9086:             sg_ptr = (UINT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE);
                   9087:             }
                   9088: 
                   9089:          remain_cnt = pCurrSCCB->Sccb_XferCnt;
                   9090: 
                   9091:          while (remain_cnt < 0x01000000L) {
                   9092: 
                   9093:             sg_ptr--;
                   9094: 
                   9095: #if defined(COMPILER_16_BIT) && !defined(DOS)
                   9096:             if (remain_cnt > (ULONG)(*(((ULONG far *)pCurrSCCB->
                   9097:                DataPointer) + (sg_ptr * 2)))) {
                   9098: 
                   9099:                remain_cnt -= (ULONG)(*(((ULONG far *)pCurrSCCB->
                   9100:                   DataPointer) + (sg_ptr * 2)));
                   9101:                }
                   9102: 
                   9103: #else
                   9104:             if (remain_cnt > (ULONG)(*(((ULONG *)pCurrSCCB->
                   9105:                DataPointer) + (sg_ptr * 2)))) {
                   9106: 
                   9107:                remain_cnt -= (ULONG)(*(((ULONG *)pCurrSCCB->
                   9108:                   DataPointer) + (sg_ptr * 2)));
                   9109:                }
                   9110: #endif
                   9111: 
                   9112:             else {
                   9113: 
                   9114:                break;
                   9115:                }
                   9116:             }
                   9117: 
                   9118: 
                   9119: 
                   9120:          if (remain_cnt < 0x01000000L) {
                   9121: 
                   9122: 
                   9123:             pCurrSCCB->Sccb_SGoffset = remain_cnt;
                   9124: 
                   9125:             pCurrSCCB->Sccb_sgseg = (USHORT)sg_ptr;
                   9126: 
                   9127: 
                   9128:             if ((ULONG)(sg_ptr * SG_ELEMENT_SIZE) == pCurrSCCB->DataLength 
                   9129:                 && (remain_cnt == 0))
                   9130: 
                   9131:                pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
                   9132:             }
                   9133: 
                   9134:          else {
                   9135: 
                   9136: 
                   9137:             if (pCurrSCCB->HostStatus == 0x00) {
                   9138: 
                   9139:                pCurrSCCB->HostStatus = SCCB_GROSS_FW_ERR;
                   9140:                }
                   9141:             }
                   9142:          }
                   9143: 
                   9144: 
                   9145:       if (!(pCurrSCCB->Sccb_XferState & F_HOST_XFER_DIR)) {
                   9146: 
                   9147: 
                   9148:          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
                   9149: 
                   9150:             busMstrTimeOut(port);
                   9151:             }
                   9152: 
                   9153:          else {
                   9154: 
                   9155:             if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
                   9156: 
                   9157:                if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
                   9158: 
                   9159:                   if (pCurrSCCB->HostStatus == 0x00) {
                   9160: 
                   9161:                      pCurrSCCB->HostStatus = SCCB_BM_ERR;
                   9162: #if defined(BUGBUG)
                   9163:                      WR_HARPOON(port+hp_dual_addr_lo,
                   9164:                         RD_HARPOON(port+hp_ext_status));
                   9165: #endif
                   9166:                      }
                   9167:                   }
                   9168:                }
                   9169: 
                   9170:             }
                   9171:          }
                   9172: 
                   9173:       else {
                   9174: 
                   9175: 
                   9176:          if ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) {
                   9177: 
                   9178:             timeout = SHORT_WAIT;
                   9179: 
                   9180:             while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) &&
                   9181:                ((RD_HARPOON(port+hp_fifo_cnt)) >= BM_THRESHOLD) &&
                   9182:                timeout--) {}
                   9183:             }
                   9184: 
                   9185:          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
                   9186: 
                   9187:             WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) |
                   9188:                FLUSH_XFER_CNTR));
                   9189: 
                   9190:             timeout = LONG_WAIT;
                   9191: 
                   9192:             while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) &&
                   9193:                timeout--) {}
                   9194: 
                   9195:             WR_HARPOON(port+hp_bm_ctrl, (RD_HARPOON(port+hp_bm_ctrl) &
                   9196:                ~FLUSH_XFER_CNTR));
                   9197: 
                   9198: 
                   9199:             if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
                   9200: 
                   9201:                if (pCurrSCCB->HostStatus == 0x00) {
                   9202: 
                   9203:                   pCurrSCCB->HostStatus = SCCB_BM_ERR;
                   9204:                   }
                   9205: 
                   9206:                busMstrTimeOut(port);
                   9207:                }
                   9208:             }
                   9209: 
                   9210:          if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
                   9211: 
                   9212:             if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
                   9213: 
                   9214:                if (pCurrSCCB->HostStatus == 0x00) {
                   9215: 
                   9216:                   pCurrSCCB->HostStatus = SCCB_BM_ERR;
                   9217: #if defined(BUGBUG)
                   9218:                   WR_HARPOON(port+hp_dual_addr_lo,
                   9219:                      RD_HARPOON(port+hp_ext_status));
                   9220: #endif
                   9221:                   }
                   9222:                }
                   9223:             }
                   9224:          }
                   9225: 
                   9226:       }
                   9227: 
                   9228:    else {
                   9229: 
                   9230: 
                   9231:       if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
                   9232: 
                   9233:          timeout = LONG_WAIT;
                   9234: 
                   9235:          while ((RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) && timeout--) {}
                   9236: 
                   9237:          if (RD_HARPOON(port+hp_ext_status) & BM_CMD_BUSY) {
                   9238: 
                   9239:             if (pCurrSCCB->HostStatus == 0x00) {
                   9240: 
                   9241:                pCurrSCCB->HostStatus = SCCB_BM_ERR;
                   9242:                }
                   9243: 
                   9244:             busMstrTimeOut(port);
                   9245:             }
                   9246:          }
                   9247: 
                   9248: 
                   9249:       if (RD_HARPOON(port+hp_int_status) & INT_EXT_STATUS) {
                   9250: 
                   9251:          if (RD_HARPOON(port+hp_ext_status) & BAD_EXT_STATUS) {
                   9252: 
                   9253:             if (pCurrSCCB->HostStatus == 0x00) {
                   9254: 
                   9255:                pCurrSCCB->HostStatus = SCCB_BM_ERR;
                   9256: #if defined(BUGBUG)
                   9257:                WR_HARPOON(port+hp_dual_addr_lo,
                   9258:                   RD_HARPOON(port+hp_ext_status));
                   9259: #endif
                   9260:                }
                   9261:             }
                   9262: 
                   9263:          }
                   9264: 
                   9265:       if (pCurrSCCB->Sccb_XferState & F_SG_XFER) {
                   9266: 
                   9267:          WR_HARPOON(port+hp_page_ctrl, (RD_HARPOON(port+hp_page_ctrl) &
                   9268:                  ~SCATTER_EN));
                   9269: 
                   9270:          WR_HARPOON(port+hp_sg_addr,0x00);
                   9271: 
                   9272:          pCurrSCCB->Sccb_sgseg += SG_BUF_CNT;
                   9273: 
                   9274:          pCurrSCCB->Sccb_SGoffset = 0x00; 
                   9275: 
                   9276: 
                   9277:          if ((ULONG)(pCurrSCCB->Sccb_sgseg * SG_ELEMENT_SIZE) >=
                   9278:             pCurrSCCB->DataLength) {
                   9279: 
                   9280:             pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
                   9281: 
                   9282:             pCurrSCCB->Sccb_sgseg = (USHORT)(pCurrSCCB->DataLength / SG_ELEMENT_SIZE);
                   9283: 
                   9284:             }
                   9285:          }
                   9286: 
                   9287:       else {
                   9288: 
                   9289:          if (!(pCurrSCCB->Sccb_XferState & F_AUTO_SENSE))
                   9290: 
                   9291:             pCurrSCCB->Sccb_XferState |= F_ALL_XFERRED;
                   9292:          }
                   9293:       }
                   9294: 
                   9295:    WR_HARPOON(port+hp_int_mask,(INT_CMD_COMPL | SCSI_INTERRUPT));
                   9296: }
                   9297: 
                   9298: 
                   9299: 
                   9300: /*---------------------------------------------------------------------
                   9301:  *
                   9302:  * Function: Host Data Transfer Restart
                   9303:  *
                   9304:  * Description: Reset the available count due to a restore data
                   9305:  *              pointers message.
                   9306:  *
                   9307:  *---------------------------------------------------------------------*/
                   9308: void hostDataXferRestart(PSCCB currSCCB)
                   9309: {
                   9310:    ULONG data_count;
                   9311:    UINT  sg_index;
                   9312: #if defined(COMPILER_16_BIT) && !defined(DOS)
                   9313:    ULONG far *sg_ptr;
                   9314: #else
                   9315:    ULONG *sg_ptr;
                   9316: #endif
                   9317: 
                   9318:    if (currSCCB->Sccb_XferState & F_SG_XFER) {
                   9319: 
                   9320:       currSCCB->Sccb_XferCnt = 0;
                   9321: 
                   9322:       sg_index = 0xffff;         /*Index by long words into sg list. */
                   9323:       data_count = 0;            /*Running count of SG xfer counts. */
                   9324: 
                   9325: #if defined(COMPILER_16_BIT) && !defined(DOS)
                   9326:       sg_ptr = (ULONG far *)currSCCB->DataPointer;
                   9327: #else
                   9328:       sg_ptr = (ULONG *)currSCCB->DataPointer;
                   9329: #endif
                   9330: 
                   9331:       while (data_count < currSCCB->Sccb_ATC) {
                   9332: 
                   9333:          sg_index++;
                   9334:          data_count += *(sg_ptr+(sg_index * 2));
                   9335:          }
                   9336: 
                   9337:       if (data_count == currSCCB->Sccb_ATC) {
                   9338: 
                   9339:          currSCCB->Sccb_SGoffset = 0;
                   9340:          sg_index++;
                   9341:          }
                   9342: 
                   9343:       else {
                   9344:          currSCCB->Sccb_SGoffset = data_count - currSCCB->Sccb_ATC;
                   9345:          }
                   9346: 
                   9347:       currSCCB->Sccb_sgseg = (USHORT)sg_index;
                   9348:       }
                   9349: 
                   9350:    else {
                   9351:       currSCCB->Sccb_XferCnt = currSCCB->DataLength - currSCCB->Sccb_ATC;
                   9352:       }
                   9353: }
                   9354: #ident "$Id: FlashPoint.c,v 1.1 1999/04/26 05:53:56 tb Exp $"
                   9355: /*----------------------------------------------------------------------
                   9356:  *
                   9357:  *
                   9358:  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
                   9359:  *
                   9360:  *   This file is available under both the GNU General Public License
                   9361:  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
                   9362:  *
                   9363:  *   $Workfile:   scam.c  $
                   9364:  *
                   9365:  *   Description:  Functions relating to handling of the SCAM selection
                   9366:  *                 and the determination of the SCSI IDs to be assigned
                   9367:  *                 to all perspective SCSI targets.
                   9368:  *
                   9369:  *   $Date: 1999/04/26 05:53:56 $
                   9370:  *
                   9371:  *   $Revision: 1.1 $
                   9372:  *
                   9373:  *----------------------------------------------------------------------*/
                   9374: 
                   9375: /*#include <globals.h>*/
                   9376: 
                   9377: #if (FW_TYPE==_UCB_MGR_)
                   9378:        /*#include <budi.h>*/
                   9379: #endif
                   9380: 
                   9381: /*#include <sccbmgr.h>*/
                   9382: /*#include <blx30.h>*/
                   9383: /*#include <target.h>*/
                   9384: /*#include <scsi2.h>*/
                   9385: /*#include <eeprom.h>*/
                   9386: /*#include <harpoon.h>*/
                   9387: 
                   9388: 
                   9389: 
                   9390: /*
                   9391: extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
                   9392: extern SCCBCARD BL_Card[MAX_CARDS];
                   9393: extern SCCBSCAM_INFO scamInfo[MAX_SCSI_TAR];
                   9394: extern NVRAMINFO nvRamInfo[MAX_MB_CARDS];
                   9395: #if defined(DOS) || defined(OS2)
                   9396: extern UCHAR temp_id_string[ID_STRING_LENGTH];
                   9397: #endif
                   9398: extern UCHAR scamHAString[];
                   9399: */
                   9400: /*---------------------------------------------------------------------
                   9401:  *
                   9402:  * Function: scini
                   9403:  *
                   9404:  * Description: Setup all data structures necessary for SCAM selection.
                   9405:  *
                   9406:  *---------------------------------------------------------------------*/
                   9407: 
                   9408: void scini(UCHAR p_card, UCHAR p_our_id, UCHAR p_power_up)
                   9409: {
                   9410: 
                   9411: #if defined(SCAM_LEV_2)
                   9412:    UCHAR loser,assigned_id;
                   9413: #endif
                   9414: #if defined(DOS)
                   9415: 
                   9416:    USHORT p_port;
                   9417: #else
                   9418:    ULONG p_port;
                   9419: #endif
                   9420: 
                   9421:    UCHAR i,k,ScamFlg ;
                   9422:    PSCCBcard currCard;
                   9423:        PNVRamInfo pCurrNvRam;
                   9424: 
                   9425:    currCard = &BL_Card[p_card];
                   9426:    p_port = currCard->ioPort;
                   9427:        pCurrNvRam = currCard->pNvRamInfo;
                   9428: 
                   9429: 
                   9430:        if(pCurrNvRam){
                   9431:                ScamFlg = pCurrNvRam->niScamConf;
                   9432:                i = pCurrNvRam->niSysConf;
                   9433:        }
                   9434:        else{
                   9435:           ScamFlg = (UCHAR) utilEERead(p_port, SCAM_CONFIG/2);
                   9436:           i = (UCHAR)(utilEERead(p_port, (SYSTEM_CONFIG/2)));
                   9437:        }
                   9438:        if(!(i & 0x02)) /* check if reset bus in AutoSCSI parameter set */
                   9439:                return;
                   9440: 
                   9441:    inisci(p_card,p_port, p_our_id);
                   9442: 
                   9443:    /* Force to wait 1 sec after SCSI bus reset. Some SCAM device FW
                   9444:       too slow to return to SCAM selection */
                   9445: 
                   9446:    /* if (p_power_up)
                   9447:          Wait1Second(p_port);
                   9448:       else
                   9449:          Wait(p_port, TO_250ms); */
                   9450: 
                   9451:    Wait1Second(p_port);
                   9452: 
                   9453: #if defined(SCAM_LEV_2)
                   9454: 
                   9455:    if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
                   9456:       {
                   9457:       while (!(scarb(p_port,INIT_SELTD))) {}
                   9458: 
                   9459:       scsel(p_port);
                   9460: 
                   9461:       do {
                   9462:          scxferc(p_port,SYNC_PTRN);
                   9463:          scxferc(p_port,DOM_MSTR);
                   9464:          loser = scsendi(p_port,&scamInfo[p_our_id].id_string[0]);
                   9465:          } while ( loser == 0xFF );
                   9466: 
                   9467:       scbusf(p_port);
                   9468: 
                   9469:       if ((p_power_up) && (!loser))
                   9470:          {
                   9471:          sresb(p_port,p_card);
                   9472:          Wait(p_port, TO_250ms);
                   9473: 
                   9474:          while (!(scarb(p_port,INIT_SELTD))) {}
                   9475: 
                   9476:          scsel(p_port);
                   9477: 
                   9478:          do {
                   9479:             scxferc(p_port, SYNC_PTRN);
                   9480:             scxferc(p_port, DOM_MSTR);
                   9481:             loser = scsendi(p_port,&scamInfo[p_our_id].
                   9482:                id_string[0]);
                   9483:             } while ( loser == 0xFF );
                   9484: 
                   9485:          scbusf(p_port);
                   9486:          }
                   9487:       }
                   9488: 
                   9489:    else
                   9490:       {
                   9491:       loser = FALSE;
                   9492:       }
                   9493: 
                   9494: 
                   9495:    if (!loser)
                   9496:       {
                   9497: 
                   9498: #endif  /* SCAM_LEV_2 */
                   9499: 
                   9500:       scamInfo[p_our_id].state = ID_ASSIGNED;
                   9501: 
                   9502: 
                   9503:                if (ScamFlg & SCAM_ENABLED)
                   9504:                {
                   9505: 
                   9506:              for (i=0; i < MAX_SCSI_TAR; i++)
                   9507:                   {
                   9508:           if ((scamInfo[i].state == ID_UNASSIGNED) ||
                   9509:                   (scamInfo[i].state == ID_UNUSED))
                   9510:                      {
                   9511:                   if (scsell(p_port,i))
                   9512:                   {
                   9513:                   scamInfo[i].state = LEGACY;
                   9514:                        if ((scamInfo[i].id_string[0] != 0xFF) ||
                   9515:                        (scamInfo[i].id_string[1] != 0xFA))
                   9516:                         {
                   9517: 
                   9518:                              scamInfo[i].id_string[0] = 0xFF;
                   9519:                           scamInfo[i].id_string[1] = 0xFA;
                   9520:                                                        if(pCurrNvRam == NULL)
                   9521:                                 currCard->globalFlags |= F_UPDATE_EEPROM;
                   9522:                        }
                   9523:                         }
                   9524:                   }
                   9525:        }
                   9526: 
                   9527:              sresb(p_port,p_card);
                   9528:        Wait1Second(p_port);
                   9529:          while (!(scarb(p_port,INIT_SELTD))) {}
                   9530:          scsel(p_port);
                   9531:          scasid(p_card, p_port);
                   9532:          }
                   9533: 
                   9534: #if defined(SCAM_LEV_2)
                   9535: 
                   9536:       }
                   9537: 
                   9538:    else if ((loser) && (ScamFlg & SCAM_ENABLED))
                   9539:       {
                   9540:       scamInfo[p_our_id].id_string[0] = SLV_TYPE_CODE0;
                   9541:       assigned_id = FALSE;
                   9542:       scwtsel(p_port);
                   9543: 
                   9544:       do {
                   9545:          while (scxferc(p_port,0x00) != SYNC_PTRN) {}
                   9546: 
                   9547:          i = scxferc(p_port,0x00);
                   9548:          if (i == ASSIGN_ID)
                   9549:             {
                   9550:             if (!(scsendi(p_port,&scamInfo[p_our_id].id_string[0])))
                   9551:                   {
                   9552:                   i = scxferc(p_port,0x00);
                   9553:                   if (scvalq(i))
                   9554:                      {
                   9555:                      k = scxferc(p_port,0x00);
                   9556: 
                   9557:                      if (scvalq(k))
                   9558:                         {
                   9559:                         currCard->ourId =
                   9560:                            ((UCHAR)(i<<3)+(k & (UCHAR)7)) & (UCHAR) 0x3F;
                   9561:                         inisci(p_card, p_port, p_our_id);
                   9562:                         scamInfo[currCard->ourId].state = ID_ASSIGNED;
                   9563:                         scamInfo[currCard->ourId].id_string[0]
                   9564:                            = SLV_TYPE_CODE0;
                   9565:                         assigned_id = TRUE;
                   9566:                         }
                   9567:                      }
                   9568:                   }
                   9569:             }
                   9570: 
                   9571:          else if (i == SET_P_FLAG)
                   9572:             {
                   9573:                if (!(scsendi(p_port,
                   9574:                         &scamInfo[p_our_id].id_string[0])))
                   9575:                         scamInfo[p_our_id].id_string[0] |= 0x80;
                   9576:             }
                   9577:          }while (!assigned_id);
                   9578: 
                   9579:       while (scxferc(p_port,0x00) != CFG_CMPLT) {}
                   9580:       }
                   9581: 
                   9582: #endif   /* SCAM_LEV_2 */
                   9583:    if (ScamFlg & SCAM_ENABLED)
                   9584:       {
                   9585:       scbusf(p_port);
                   9586:       if (currCard->globalFlags & F_UPDATE_EEPROM)
                   9587:          {
                   9588:          scsavdi(p_card, p_port);
                   9589:          currCard->globalFlags &= ~F_UPDATE_EEPROM;
                   9590:          }
                   9591:       }
                   9592: 
                   9593: 
                   9594: #if defined(DOS)
                   9595:    for (i=0; i < MAX_SCSI_TAR; i++)
                   9596:    {
                   9597:        if (((ScamFlg & SCAM_ENABLED) && (scamInfo[i].state == LEGACY))
                   9598:                        || (i != p_our_id))
                   9599:                {
                   9600:          scsellDOS(p_port,i);
                   9601:              }
                   9602:        }
                   9603: #endif
                   9604: 
                   9605: /*
                   9606:    for (i=0,k=0; i < MAX_SCSI_TAR; i++)
                   9607:       {
                   9608:       if ((scamInfo[i].state == ID_ASSIGNED) ||
                   9609:          (scamInfo[i].state == LEGACY))
                   9610:          k++;
                   9611:       }
                   9612: 
                   9613:    if (k==2)
                   9614:       currCard->globalFlags |= F_SINGLE_DEVICE;
                   9615:    else
                   9616:       currCard->globalFlags &= ~F_SINGLE_DEVICE;
                   9617: */
                   9618: }
                   9619: 
                   9620: 
                   9621: /*---------------------------------------------------------------------
                   9622:  *
                   9623:  * Function: scarb
                   9624:  *
                   9625:  * Description: Gain control of the bus and wait SCAM select time (250ms)
                   9626:  *
                   9627:  *---------------------------------------------------------------------*/
                   9628: 
                   9629: #if defined(DOS)
                   9630: int scarb(USHORT p_port, UCHAR p_sel_type)
                   9631: #else
                   9632: int scarb(ULONG p_port, UCHAR p_sel_type)
                   9633: #endif
                   9634: {
                   9635:    if (p_sel_type == INIT_SELTD)
                   9636:       {
                   9637: 
                   9638:       while (RD_HARPOON(p_port+hp_scsisig) & (SCSI_SEL | SCSI_BSY)) {}
                   9639: 
                   9640: 
                   9641:       if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL)
                   9642:          return(FALSE);
                   9643: 
                   9644:       if (RD_HARPOON(p_port+hp_scsidata_0) != 00)
                   9645:          return(FALSE);
                   9646: 
                   9647:       WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_BSY));
                   9648: 
                   9649:       if (RD_HARPOON(p_port+hp_scsisig) & SCSI_SEL) {
                   9650: 
                   9651:          WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
                   9652:             ~SCSI_BSY));
                   9653:          return(FALSE);
                   9654:          }
                   9655: 
                   9656: 
                   9657:       WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_SEL));
                   9658: 
                   9659:       if (RD_HARPOON(p_port+hp_scsidata_0) != 00) {
                   9660: 
                   9661:          WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) &
                   9662:             ~(SCSI_BSY | SCSI_SEL)));
                   9663:          return(FALSE);
                   9664:          }
                   9665:       }
                   9666: 
                   9667: 
                   9668:    WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0)
                   9669:       & ~ACTdeassert));
                   9670:    WR_HARPOON(p_port+hp_scsireset, SCAM_EN);
                   9671:    WR_HARPOON(p_port+hp_scsidata_0, 0x00);
                   9672: #if defined(WIDE_SCSI)
                   9673:    WR_HARPOON(p_port+hp_scsidata_1, 0x00);
                   9674: #endif
                   9675:    WR_HARPOON(p_port+hp_portctrl_0, SCSI_BUS_EN);
                   9676: 
                   9677:    WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig) | SCSI_MSG));
                   9678: 
                   9679:    WR_HARPOON(p_port+hp_scsisig, (RD_HARPOON(p_port+hp_scsisig)
                   9680:       & ~SCSI_BSY));
                   9681: 
                   9682:    Wait(p_port,TO_250ms);
                   9683: 
                   9684:    return(TRUE);
                   9685: }
                   9686: 
                   9687: 
                   9688: /*---------------------------------------------------------------------
                   9689:  *
                   9690:  * Function: scbusf
                   9691:  *
                   9692:  * Description: Release the SCSI bus and disable SCAM selection.
                   9693:  *
                   9694:  *---------------------------------------------------------------------*/
                   9695: 
                   9696: #if defined(DOS)
                   9697: void scbusf(USHORT p_port)
                   9698: #else
                   9699: void scbusf(ULONG p_port)
                   9700: #endif
                   9701: {
                   9702:    WR_HARPOON(p_port+hp_page_ctrl,
                   9703:       (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
                   9704: 
                   9705: 
                   9706:    WR_HARPOON(p_port+hp_scsidata_0, 0x00);
                   9707: 
                   9708:    WR_HARPOON(p_port+hp_portctrl_0, (RD_HARPOON(p_port+hp_portctrl_0)
                   9709:       & ~SCSI_BUS_EN));
                   9710: 
                   9711:    WR_HARPOON(p_port+hp_scsisig, 0x00);
                   9712: 
                   9713: 
                   9714:    WR_HARPOON(p_port+hp_scsireset,  (RD_HARPOON(p_port+hp_scsireset)
                   9715:       & ~SCAM_EN));
                   9716: 
                   9717:    WR_HARPOON(p_port+hp_clkctrl_0, (RD_HARPOON(p_port+hp_clkctrl_0)
                   9718:       | ACTdeassert));
                   9719: 
                   9720: #if defined(SCAM_LEV_2)
                   9721:    WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT | SCAM_SEL));
                   9722: #else
                   9723:    WRW_HARPOON((p_port+hp_intstat), (BUS_FREE | AUTO_INT));
                   9724: #endif
                   9725: 
                   9726:    WR_HARPOON(p_port+hp_page_ctrl,
                   9727:       (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
                   9728: }
                   9729: 
                   9730: 
                   9731: 
                   9732: /*---------------------------------------------------------------------
                   9733:  *
                   9734:  * Function: scasid
                   9735:  *
                   9736:  * Description: Assign an ID to all the SCAM devices.
                   9737:  *
                   9738:  *---------------------------------------------------------------------*/
                   9739: 
                   9740: #if defined(DOS)
                   9741: void scasid(UCHAR p_card, USHORT p_port)
                   9742: #else
                   9743: void scasid(UCHAR p_card, ULONG p_port)
                   9744: #endif
                   9745: {
                   9746: #if defined(DOS) || defined(OS2)
                   9747:    /* Use external defined in global space area, instead of Stack
                   9748:       space. WIN/95 DOS doesnot work TINY mode. The OS doesnot intialize
                   9749:       SS equal to DS. Thus the array allocated on stack doesnot get
                   9750:       access correctly */
                   9751: #else
                   9752:    UCHAR temp_id_string[ID_STRING_LENGTH];
                   9753: #endif
                   9754: 
                   9755:    UCHAR i,k,scam_id;
                   9756:        UCHAR crcBytes[3];
                   9757:        PNVRamInfo pCurrNvRam;
                   9758:        ushort_ptr pCrcBytes;
                   9759: 
                   9760:        pCurrNvRam = BL_Card[p_card].pNvRamInfo;
                   9761: 
                   9762:    i=FALSE;
                   9763: 
                   9764:    while (!i)
                   9765:       {
                   9766: 
                   9767:       for (k=0; k < ID_STRING_LENGTH; k++)
                   9768:          {
                   9769:          temp_id_string[k] = (UCHAR) 0x00;
                   9770:          }
                   9771: 
                   9772:       scxferc(p_port,SYNC_PTRN);
                   9773:       scxferc(p_port,ASSIGN_ID);
                   9774: 
                   9775:       if (!(sciso(p_port,&temp_id_string[0])))
                   9776:          {
                   9777:                        if(pCurrNvRam){
                   9778:                                pCrcBytes = (ushort_ptr)&crcBytes[0];
                   9779:                                *pCrcBytes = CalcCrc16(&temp_id_string[0]);
                   9780:                                crcBytes[2] = CalcLrc(&temp_id_string[0]);
                   9781:                                temp_id_string[1] = crcBytes[2];
                   9782:                                temp_id_string[2] = crcBytes[0];
                   9783:                                temp_id_string[3] = crcBytes[1];
                   9784:                                for(k = 4; k < ID_STRING_LENGTH; k++)
                   9785:                                        temp_id_string[k] = (UCHAR) 0x00;
                   9786:                        }
                   9787:          i = scmachid(p_card,temp_id_string);
                   9788: 
                   9789:          if (i == CLR_PRIORITY)
                   9790:             {
                   9791:             scxferc(p_port,MISC_CODE);
                   9792:             scxferc(p_port,CLR_P_FLAG);
                   9793:             i = FALSE;  /*Not the last ID yet. */
                   9794:             }
                   9795: 
                   9796:          else if (i != NO_ID_AVAIL)
                   9797:             {
                   9798:             if (i < 8 )
                   9799:                scxferc(p_port,ID_0_7);
                   9800:             else
                   9801:                scxferc(p_port,ID_8_F);
                   9802: 
                   9803:             scam_id = (i & (UCHAR) 0x07);
                   9804: 
                   9805: 
                   9806:             for (k=1; k < 0x08; k <<= 1)
                   9807:                if (!( k & i ))
                   9808:                   scam_id += 0x08;        /*Count number of zeros in DB0-3. */
                   9809: 
                   9810:             scxferc(p_port,scam_id);
                   9811: 
                   9812:             i = FALSE;  /*Not the last ID yet. */
                   9813:             }
                   9814:          }
                   9815: 
                   9816:       else
                   9817:          {
                   9818:          i = TRUE;
                   9819:          }
                   9820: 
                   9821:       }  /*End while */
                   9822: 
                   9823:    scxferc(p_port,SYNC_PTRN);
                   9824:    scxferc(p_port,CFG_CMPLT);
                   9825: }
                   9826: 
                   9827: 
                   9828: 
                   9829: 
                   9830: 
                   9831: /*---------------------------------------------------------------------
                   9832:  *
                   9833:  * Function: scsel
                   9834:  *
                   9835:  * Description: Select all the SCAM devices.
                   9836:  *
                   9837:  *---------------------------------------------------------------------*/
                   9838: 
                   9839: #if defined(DOS)
                   9840: void scsel(USHORT p_port)
                   9841: #else
                   9842: void scsel(ULONG p_port)
                   9843: #endif
                   9844: {
                   9845: 
                   9846:    WR_HARPOON(p_port+hp_scsisig, SCSI_SEL);
                   9847:    scwiros(p_port, SCSI_MSG);
                   9848: 
                   9849:    WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY));
                   9850: 
                   9851: 
                   9852:    WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
                   9853:    WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) |
                   9854:       (UCHAR)(BIT(7)+BIT(6))));
                   9855: 
                   9856: 
                   9857:    WR_HARPOON(p_port+hp_scsisig, (SCSI_BSY | SCSI_IOBIT | SCSI_CD));
                   9858:    scwiros(p_port, SCSI_SEL);
                   9859: 
                   9860:    WR_HARPOON(p_port+hp_scsidata_0, (UCHAR)(RD_HARPOON(p_port+hp_scsidata_0) &
                   9861:       ~(UCHAR)BIT(6)));
                   9862:    scwirod(p_port, BIT(6));
                   9863: 
                   9864:    WR_HARPOON(p_port+hp_scsisig, (SCSI_SEL | SCSI_BSY | SCSI_IOBIT | SCSI_CD));
                   9865: }
                   9866: 
                   9867: 
                   9868: 
                   9869: /*---------------------------------------------------------------------
                   9870:  *
                   9871:  * Function: scxferc
                   9872:  *
                   9873:  * Description: Handshake the p_data (DB4-0) across the bus.
                   9874:  *
                   9875:  *---------------------------------------------------------------------*/
                   9876: 
                   9877: #if defined(DOS)
                   9878: UCHAR scxferc(USHORT p_port, UCHAR p_data)
                   9879: #else
                   9880: UCHAR scxferc(ULONG p_port, UCHAR p_data)
                   9881: #endif
                   9882: {
                   9883:    UCHAR curr_data, ret_data;
                   9884: 
                   9885:    curr_data = p_data | BIT(7) | BIT(5);   /*Start with DB7 & DB5 asserted. */
                   9886: 
                   9887:    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
                   9888: 
                   9889:    curr_data &= ~BIT(7);
                   9890: 
                   9891:    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
                   9892: 
                   9893:    scwirod(p_port,BIT(7));              /*Wait for DB7 to be released. */
                   9894:        while (!(RD_HARPOON(p_port+hp_scsidata_0) & BIT(5)));
                   9895: 
                   9896:    ret_data = (RD_HARPOON(p_port+hp_scsidata_0) & (UCHAR) 0x1F);
                   9897: 
                   9898:    curr_data |= BIT(6);
                   9899: 
                   9900:    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
                   9901: 
                   9902:    curr_data &= ~BIT(5);
                   9903: 
                   9904:    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
                   9905: 
                   9906:    scwirod(p_port,BIT(5));              /*Wait for DB5 to be released. */
                   9907: 
                   9908:    curr_data &= ~(BIT(4)|BIT(3)|BIT(2)|BIT(1)|BIT(0)); /*Release data bits */
                   9909:    curr_data |= BIT(7);
                   9910: 
                   9911:    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
                   9912: 
                   9913:    curr_data &= ~BIT(6);
                   9914: 
                   9915:    WR_HARPOON(p_port+hp_scsidata_0, curr_data);
                   9916: 
                   9917:    scwirod(p_port,BIT(6));              /*Wait for DB6 to be released. */
                   9918: 
                   9919:    return(ret_data);
                   9920: }
                   9921: 
                   9922: 
                   9923: /*---------------------------------------------------------------------
                   9924:  *
                   9925:  * Function: scsendi
                   9926:  *
                   9927:  * Description: Transfer our Identification string to determine if we
                   9928:  *              will be the dominant master.
                   9929:  *
                   9930:  *---------------------------------------------------------------------*/
                   9931: 
                   9932: #if defined(DOS)
                   9933: UCHAR scsendi(USHORT p_port, UCHAR p_id_string[])
                   9934: #else
                   9935: UCHAR scsendi(ULONG p_port, UCHAR p_id_string[])
                   9936: #endif
                   9937: {
                   9938:    UCHAR ret_data,byte_cnt,bit_cnt,defer;
                   9939: 
                   9940:    defer = FALSE;
                   9941: 
                   9942:    for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
                   9943: 
                   9944:       for (bit_cnt = 0x80; bit_cnt != 0 ; bit_cnt >>= 1) {
                   9945: 
                   9946:          if (defer)
                   9947:             ret_data = scxferc(p_port,00);
                   9948: 
                   9949:          else if (p_id_string[byte_cnt] & bit_cnt)
                   9950: 
                   9951:                ret_data = scxferc(p_port,02);
                   9952: 
                   9953:             else {
                   9954: 
                   9955:                ret_data = scxferc(p_port,01);
                   9956:                if (ret_data & 02)
                   9957:                   defer = TRUE;
                   9958:                }
                   9959: 
                   9960:          if ((ret_data & 0x1C) == 0x10)
                   9961:             return(0x00);  /*End of isolation stage, we won! */
                   9962: 
                   9963:          if (ret_data & 0x1C)
                   9964:             return(0xFF);
                   9965: 
                   9966:          if ((defer) && (!(ret_data & 0x1F)))
                   9967:             return(0x01);  /*End of isolation stage, we lost. */
                   9968: 
                   9969:          } /*bit loop */
                   9970: 
                   9971:       } /*byte loop */
                   9972: 
                   9973:    if (defer)
                   9974:       return(0x01);  /*We lost */
                   9975:    else
                   9976:       return(0);  /*We WON! Yeeessss! */
                   9977: }
                   9978: 
                   9979: 
                   9980: 
                   9981: /*---------------------------------------------------------------------
                   9982:  *
                   9983:  * Function: sciso
                   9984:  *
                   9985:  * Description: Transfer the Identification string.
                   9986:  *
                   9987:  *---------------------------------------------------------------------*/
                   9988: 
                   9989: #if defined(DOS)
                   9990: UCHAR sciso(USHORT p_port, UCHAR p_id_string[])
                   9991: #else
                   9992: UCHAR sciso(ULONG p_port, UCHAR p_id_string[])
                   9993: #endif
                   9994: {
                   9995:    UCHAR ret_data,the_data,byte_cnt,bit_cnt;
                   9996: 
                   9997:    the_data = 0;
                   9998: 
                   9999:    for (byte_cnt = 0; byte_cnt < ID_STRING_LENGTH; byte_cnt++) {
                   10000: 
                   10001:       for (bit_cnt = 0; bit_cnt < 8; bit_cnt++) {
                   10002: 
                   10003:          ret_data = scxferc(p_port,0);
                   10004: 
                   10005:          if (ret_data & 0xFC)
                   10006:             return(0xFF);
                   10007: 
                   10008:          else {
                   10009: 
                   10010:             the_data <<= 1;
                   10011:             if (ret_data & BIT(1)) {
                   10012:                the_data |= 1;
                   10013:                }
                   10014:             }
                   10015: 
                   10016:          if ((ret_data & 0x1F) == 0)
                   10017:           {
                   10018: /*
                   10019:                                if(bit_cnt != 0 || bit_cnt != 8)
                   10020:                                {
                   10021:                                        byte_cnt = 0;
                   10022:                                        bit_cnt = 0;
                   10023:                                        scxferc(p_port, SYNC_PTRN);
                   10024:                                        scxferc(p_port, ASSIGN_ID);
                   10025:                                        continue;
                   10026:                                }
                   10027: */
                   10028:             if (byte_cnt)
                   10029:                return(0x00);
                   10030:             else
                   10031:                return(0xFF);
                   10032:           }
                   10033: 
                   10034:          } /*bit loop */
                   10035: 
                   10036:       p_id_string[byte_cnt] = the_data;
                   10037: 
                   10038:       } /*byte loop */
                   10039: 
                   10040:    return(0);
                   10041: }
                   10042: 
                   10043: 
                   10044: 
                   10045: /*---------------------------------------------------------------------
                   10046:  *
                   10047:  * Function: scwirod
                   10048:  *
                   10049:  * Description: Sample the SCSI data bus making sure the signal has been
                   10050:  *              deasserted for the correct number of consecutive samples.
                   10051:  *
                   10052:  *---------------------------------------------------------------------*/
                   10053: 
                   10054: #if defined(DOS)
                   10055: void scwirod(USHORT p_port, UCHAR p_data_bit)
                   10056: #else
                   10057: void scwirod(ULONG p_port, UCHAR p_data_bit)
                   10058: #endif
                   10059: {
                   10060:    UCHAR i;
                   10061: 
                   10062:    i = 0;
                   10063:    while ( i < MAX_SCSI_TAR ) {
                   10064: 
                   10065:       if (RD_HARPOON(p_port+hp_scsidata_0) & p_data_bit)
                   10066: 
                   10067:          i = 0;
                   10068: 
                   10069:       else
                   10070: 
                   10071:          i++;
                   10072: 
                   10073:       }
                   10074: }
                   10075: 
                   10076: 
                   10077: 
                   10078: /*---------------------------------------------------------------------
                   10079:  *
                   10080:  * Function: scwiros
                   10081:  *
                   10082:  * Description: Sample the SCSI Signal lines making sure the signal has been
                   10083:  *              deasserted for the correct number of consecutive samples.
                   10084:  *
                   10085:  *---------------------------------------------------------------------*/
                   10086: 
                   10087: #if defined(DOS)
                   10088: void scwiros(USHORT p_port, UCHAR p_data_bit)
                   10089: #else
                   10090: void scwiros(ULONG p_port, UCHAR p_data_bit)
                   10091: #endif
                   10092: {
                   10093:    UCHAR i;
                   10094: 
                   10095:    i = 0;
                   10096:    while ( i < MAX_SCSI_TAR ) {
                   10097: 
                   10098:       if (RD_HARPOON(p_port+hp_scsisig) & p_data_bit)
                   10099: 
                   10100:          i = 0;
                   10101: 
                   10102:       else
                   10103: 
                   10104:          i++;
                   10105: 
                   10106:       }
                   10107: }
                   10108: 
                   10109: 
                   10110: /*---------------------------------------------------------------------
                   10111:  *
                   10112:  * Function: scvalq
                   10113:  *
                   10114:  * Description: Make sure we received a valid data byte.
                   10115:  *
                   10116:  *---------------------------------------------------------------------*/
                   10117: 
                   10118: UCHAR scvalq(UCHAR p_quintet)
                   10119: {
                   10120:    UCHAR count;
                   10121: 
                   10122:    for (count=1; count < 0x08; count<<=1) {
                   10123:       if (!(p_quintet & count))
                   10124:          p_quintet -= 0x80;
                   10125:       }
                   10126: 
                   10127:    if (p_quintet & 0x18)
                   10128:       return(FALSE);
                   10129: 
                   10130:    else
                   10131:       return(TRUE);
                   10132: }
                   10133: 
                   10134: 
                   10135: /*---------------------------------------------------------------------
                   10136:  *
                   10137:  * Function: scsell
                   10138:  *
                   10139:  * Description: Select the specified device ID using a selection timeout
                   10140:  *              less than 4ms.  If somebody responds then it is a legacy
                   10141:  *              drive and this ID must be marked as such.
                   10142:  *
                   10143:  *---------------------------------------------------------------------*/
                   10144: 
                   10145: #if defined(DOS)
                   10146: UCHAR scsell(USHORT p_port, UCHAR targ_id)
                   10147: #else
                   10148: UCHAR scsell(ULONG p_port, UCHAR targ_id)
                   10149: #endif
                   10150: {
                   10151: #if defined(DOS)
                   10152:    USHORT i;
                   10153: #else
                   10154:    ULONG i;
                   10155: #endif
                   10156: 
                   10157:    WR_HARPOON(p_port+hp_page_ctrl,
                   10158:       (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
                   10159: 
                   10160:    ARAM_ACCESS(p_port);
                   10161: 
                   10162:    WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER));
                   10163:    WR_HARPOON(p_port+hp_seltimeout,TO_4ms);
                   10164: 
                   10165: 
                   10166:    for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) {
                   10167:       WRW_HARPOON(i, (MPM_OP+ACOMMAND));
                   10168:       }
                   10169:    WRW_HARPOON(i, (BRH_OP+ALWAYS+    NP));
                   10170: 
                   10171:    WRW_HARPOON((p_port+hp_intstat),
                   10172:               (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
                   10173: 
                   10174:    WR_HARPOON(p_port+hp_select_id, targ_id);
                   10175: 
                   10176:    WR_HARPOON(p_port+hp_portctrl_0, SCSI_PORT);
                   10177:    WR_HARPOON(p_port+hp_autostart_3, (SELECT | CMD_ONLY_STRT));
                   10178:    WR_HARPOON(p_port+hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
                   10179: 
                   10180: 
                   10181:    while (!(RDW_HARPOON((p_port+hp_intstat)) &
                   10182:            (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {}
                   10183: 
                   10184:    if (RDW_HARPOON((p_port+hp_intstat)) & RESET)
                   10185:          Wait(p_port, TO_250ms);
                   10186: 
                   10187:    DISABLE_AUTO(p_port);
                   10188: 
                   10189:    WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) & ~SCAM_TIMER));
                   10190:    WR_HARPOON(p_port+hp_seltimeout,TO_290ms);
                   10191: 
                   10192:    SGRAM_ACCESS(p_port);
                   10193: 
                   10194:    if (RDW_HARPOON((p_port+hp_intstat)) & (RESET | TIMEOUT) ) {
                   10195: 
                   10196:       WRW_HARPOON((p_port+hp_intstat),
                   10197:                  (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
                   10198: 
                   10199:       WR_HARPOON(p_port+hp_page_ctrl,
                   10200:          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
                   10201: 
                   10202:       return(FALSE);  /*No legacy device */
                   10203:       }
                   10204: 
                   10205:    else {
                   10206: 
                   10207:       while(!(RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)) {
                   10208:                                if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
                   10209:                                        {
                   10210:                                        WR_HARPOON(p_port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
                   10211:                        ACCEPT_MSG(p_port);
                   10212:                                        }
                   10213:                }
                   10214: 
                   10215:       WRW_HARPOON((p_port+hp_intstat), CLR_ALL_INT_1);
                   10216: 
                   10217:       WR_HARPOON(p_port+hp_page_ctrl,
                   10218:          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
                   10219: 
                   10220:       return(TRUE);  /*Found one of them oldies! */
                   10221:       }
                   10222: }
                   10223: 
                   10224: #if defined(DOS)
                   10225: /*---------------------------------------------------------------------
                   10226:  *
                   10227:  * Function: scsell for DOS
                   10228:  *
                   10229:  * Description: Select the specified device ID using a selection timeout
                   10230:  *              less than 2ms.  This was specially required to solve
                   10231:  *              the problem with Plextor 12X CD-ROM drive. This drive
                   10232:  *                                      was responding the Selection at the end of 4ms and 
                   10233:  *                                      hanging the system.
                   10234:  *
                   10235:  *---------------------------------------------------------------------*/
                   10236: 
                   10237: UCHAR scsellDOS(USHORT p_port, UCHAR targ_id)
                   10238: {
                   10239:    USHORT i;
                   10240: 
                   10241:    WR_HARPOON(p_port+hp_page_ctrl,
                   10242:       (RD_HARPOON(p_port+hp_page_ctrl) | G_INT_DISABLE));
                   10243: 
                   10244:    ARAM_ACCESS(p_port);
                   10245: 
                   10246:    WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) | SCAM_TIMER));
                   10247:    WR_HARPOON(p_port+hp_seltimeout,TO_2ms);
                   10248: 
                   10249: 
                   10250:    for (i = p_port+CMD_STRT; i < p_port+CMD_STRT+12; i+=2) {
                   10251:       WRW_HARPOON(i, (MPM_OP+ACOMMAND));
                   10252:       }
                   10253:    WRW_HARPOON(i, (BRH_OP+ALWAYS+    NP));
                   10254: 
                   10255:    WRW_HARPOON((p_port+hp_intstat),
                   10256:               (RESET | TIMEOUT | SEL | BUS_FREE | AUTO_INT));
                   10257: 
                   10258:    WR_HARPOON(p_port+hp_select_id, targ_id);
                   10259: 
                   10260:    WR_HARPOON(p_port+hp_portctrl_0, SCSI_PORT);
                   10261:    WR_HARPOON(p_port+hp_autostart_3, (SELECT | CMD_ONLY_STRT));
                   10262:    WR_HARPOON(p_port+hp_scsictrl_0, (SEL_TAR | ENA_RESEL));
                   10263: 
                   10264: 
                   10265:    while (!(RDW_HARPOON((p_port+hp_intstat)) &
                   10266:            (RESET | PROG_HLT | TIMEOUT | AUTO_INT))) {}
                   10267: 
                   10268:    if (RDW_HARPOON((p_port+hp_intstat)) & RESET)
                   10269:          Wait(p_port, TO_250ms);
                   10270: 
                   10271:    DISABLE_AUTO(p_port);
                   10272: 
                   10273:    WR_HARPOON(p_port+hp_addstat,(RD_HARPOON(p_port+hp_addstat) & ~SCAM_TIMER));
                   10274:    WR_HARPOON(p_port+hp_seltimeout,TO_290ms);
                   10275: 
                   10276:    SGRAM_ACCESS(p_port);
                   10277: 
                   10278:    if (RDW_HARPOON((p_port+hp_intstat)) & (RESET | TIMEOUT) ) {
                   10279: 
                   10280:       WRW_HARPOON((p_port+hp_intstat),
                   10281:                  (RESET | TIMEOUT | SEL | BUS_FREE | PHASE));
                   10282: 
                   10283:       WR_HARPOON(p_port+hp_page_ctrl,
                   10284:          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
                   10285: 
                   10286:       return(FALSE);  /*No legacy device */
                   10287:       }
                   10288: 
                   10289:    else {
                   10290: 
                   10291:       while(!(RDW_HARPOON((p_port+hp_intstat)) & BUS_FREE)) {
                   10292:                                if (RD_HARPOON(p_port+hp_scsisig) & SCSI_REQ)
                   10293:                                        {
                   10294:                                        WR_HARPOON(p_port+hp_scsisig, (SCSI_ACK + S_ILL_PH));
                   10295:                        ACCEPT_MSG(p_port);
                   10296:                                        }
                   10297:                }
                   10298: 
                   10299:       WRW_HARPOON((p_port+hp_intstat), CLR_ALL_INT_1);
                   10300: 
                   10301:       WR_HARPOON(p_port+hp_page_ctrl,
                   10302:          (RD_HARPOON(p_port+hp_page_ctrl) & ~G_INT_DISABLE));
                   10303: 
                   10304:       return(TRUE);  /*Found one of them oldies! */
                   10305:       }
                   10306: }
                   10307: #endif  /* DOS */
                   10308: 
                   10309: /*---------------------------------------------------------------------
                   10310:  *
                   10311:  * Function: scwtsel
                   10312:  *
                   10313:  * Description: Wait to be selected by another SCAM initiator.
                   10314:  *
                   10315:  *---------------------------------------------------------------------*/
                   10316: 
                   10317: #if defined(DOS)
                   10318: void scwtsel(USHORT p_port)
                   10319: #else
                   10320: void scwtsel(ULONG p_port)
                   10321: #endif
                   10322: {
                   10323:    while(!(RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL)) {}
                   10324: }
                   10325: 
                   10326: 
                   10327: /*---------------------------------------------------------------------
                   10328:  *
                   10329:  * Function: inisci
                   10330:  *
                   10331:  * Description: Setup the data Structure with the info from the EEPROM.
                   10332:  *
                   10333:  *---------------------------------------------------------------------*/
                   10334: 
                   10335: #if defined(DOS)
                   10336: void inisci(UCHAR p_card, USHORT p_port, UCHAR p_our_id)
                   10337: #else
                   10338: void inisci(UCHAR p_card, ULONG p_port, UCHAR p_our_id)
                   10339: #endif
                   10340: {
                   10341:    UCHAR i,k,max_id;
                   10342:    USHORT ee_data;
                   10343:        PNVRamInfo pCurrNvRam;
                   10344: 
                   10345:        pCurrNvRam = BL_Card[p_card].pNvRamInfo;
                   10346: 
                   10347:    if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
                   10348:       max_id = 0x08;
                   10349: 
                   10350:    else
                   10351:       max_id = 0x10;
                   10352: 
                   10353:        if(pCurrNvRam){
                   10354:                for(i = 0; i < max_id; i++){
                   10355: 
                   10356:                        for(k = 0; k < 4; k++)
                   10357:                                scamInfo[i].id_string[k] = pCurrNvRam->niScamTbl[i][k];
                   10358:                        for(k = 4; k < ID_STRING_LENGTH; k++)
                   10359:                                scamInfo[i].id_string[k] = (UCHAR) 0x00;
                   10360: 
                   10361:              if(scamInfo[i].id_string[0] == 0x00)
                   10362:           scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
                   10363:              else
                   10364:              scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
                   10365: 
                   10366:                }
                   10367:        }else {
                   10368:           for (i=0; i < max_id; i++)
                   10369:           {
                   10370:        for (k=0; k < ID_STRING_LENGTH; k+=2)
                   10371:                 {
                   10372:              ee_data = utilEERead(p_port, (USHORT)((EE_SCAMBASE/2) +
                   10373:             (USHORT) (i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
                   10374:                scamInfo[i].id_string[k] = (UCHAR) ee_data;
                   10375:                 ee_data >>= 8;
                   10376:              scamInfo[i].id_string[k+1] = (UCHAR) ee_data;
                   10377:           }
                   10378: 
                   10379:              if ((scamInfo[i].id_string[0] == 0x00) ||
                   10380:               (scamInfo[i].id_string[0] == 0xFF))
                   10381: 
                   10382:           scamInfo[i].state = ID_UNUSED;  /*Default to unused ID. */
                   10383: 
                   10384:              else
                   10385:              scamInfo[i].state = ID_UNASSIGNED;  /*Default to unassigned ID. */
                   10386: 
                   10387:        }
                   10388:        }
                   10389:        for(k = 0; k < ID_STRING_LENGTH; k++)
                   10390:                scamInfo[p_our_id].id_string[k] = scamHAString[k];
                   10391: 
                   10392: }
                   10393: 
                   10394: /*---------------------------------------------------------------------
                   10395:  *
                   10396:  * Function: scmachid
                   10397:  *
                   10398:  * Description: Match the Device ID string with our values stored in
                   10399:  *              the EEPROM.
                   10400:  *
                   10401:  *---------------------------------------------------------------------*/
                   10402: 
                   10403: UCHAR scmachid(UCHAR p_card, UCHAR p_id_string[])
                   10404: {
                   10405: 
                   10406:    UCHAR i,k,match;
                   10407: 
                   10408: 
                   10409:    for (i=0; i < MAX_SCSI_TAR; i++) {
                   10410: 
                   10411: #if !defined(SCAM_LEV_2)
                   10412:       if (scamInfo[i].state == ID_UNASSIGNED)
                   10413:          {
                   10414: #endif
                   10415:          match = TRUE;
                   10416: 
                   10417:          for (k=0; k < ID_STRING_LENGTH; k++)
                   10418:             {
                   10419:             if (p_id_string[k] != scamInfo[i].id_string[k])
                   10420:                match = FALSE;
                   10421:             }
                   10422: 
                   10423:          if (match)
                   10424:             {
                   10425:             scamInfo[i].state = ID_ASSIGNED;
                   10426:             return(i);
                   10427:             }
                   10428: 
                   10429: #if !defined(SCAM_LEV_2)
                   10430:          }
                   10431: #endif
                   10432: 
                   10433:       }
                   10434: 
                   10435: 
                   10436: 
                   10437:    if (p_id_string[0] & BIT(5))
                   10438:       i = 8;
                   10439:    else
                   10440:       i = MAX_SCSI_TAR;
                   10441: 
                   10442:    if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04))
                   10443:       match = p_id_string[1] & (UCHAR) 0x1F;
                   10444:    else
                   10445:       match = 7;
                   10446: 
                   10447:    while (i > 0)
                   10448:       {
                   10449:       i--;
                   10450: 
                   10451:       if (scamInfo[match].state == ID_UNUSED)
                   10452:          {
                   10453:          for (k=0; k < ID_STRING_LENGTH; k++)
                   10454:             {
                   10455:             scamInfo[match].id_string[k] = p_id_string[k];
                   10456:             }
                   10457: 
                   10458:          scamInfo[match].state = ID_ASSIGNED;
                   10459: 
                   10460:                        if(BL_Card[p_card].pNvRamInfo == NULL)
                   10461:                 BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
                   10462:          return(match);
                   10463: 
                   10464:          }
                   10465: 
                   10466: 
                   10467:       match--;
                   10468: 
                   10469:       if (match == 0xFF)
                   10470:        {
                   10471:          if (p_id_string[0] & BIT(5))
                   10472:             match = 7;
                   10473:          else
                   10474:             match = MAX_SCSI_TAR-1;
                   10475:        }
                   10476:       }
                   10477: 
                   10478: 
                   10479: 
                   10480:    if (p_id_string[0] & BIT(7))
                   10481:       {
                   10482:       return(CLR_PRIORITY);
                   10483:       }
                   10484: 
                   10485: 
                   10486:    if (p_id_string[0] & BIT(5))
                   10487:       i = 8;
                   10488:    else
                   10489:       i = MAX_SCSI_TAR;
                   10490: 
                   10491:    if (((p_id_string[0] & 0x06) == 0x02) || ((p_id_string[0] & 0x06) == 0x04))
                   10492:       match = p_id_string[1] & (UCHAR) 0x1F;
                   10493:    else
                   10494:       match = 7;
                   10495: 
                   10496:    while (i > 0)
                   10497:       {
                   10498: 
                   10499:       i--;
                   10500: 
                   10501:       if (scamInfo[match].state == ID_UNASSIGNED)
                   10502:          {
                   10503:          for (k=0; k < ID_STRING_LENGTH; k++)
                   10504:             {
                   10505:             scamInfo[match].id_string[k] = p_id_string[k];
                   10506:             }
                   10507: 
                   10508:          scamInfo[match].id_string[0] |= BIT(7);
                   10509:          scamInfo[match].state = ID_ASSIGNED;
                   10510:                        if(BL_Card[p_card].pNvRamInfo == NULL)
                   10511:                 BL_Card[p_card].globalFlags |= F_UPDATE_EEPROM;
                   10512:          return(match);
                   10513: 
                   10514:          }
                   10515: 
                   10516: 
                   10517:       match--;
                   10518: 
                   10519:       if (match == 0xFF)
                   10520:        {
                   10521:          if (p_id_string[0] & BIT(5))
                   10522:             match = 7;
                   10523:          else
                   10524:             match = MAX_SCSI_TAR-1;
                   10525:        }
                   10526:       }
                   10527: 
                   10528:    return(NO_ID_AVAIL);
                   10529: }
                   10530: 
                   10531: 
                   10532: /*---------------------------------------------------------------------
                   10533:  *
                   10534:  * Function: scsavdi
                   10535:  *
                   10536:  * Description: Save off the device SCAM ID strings.
                   10537:  *
                   10538:  *---------------------------------------------------------------------*/
                   10539: 
                   10540: #if defined(DOS)
                   10541: void scsavdi(UCHAR p_card, USHORT p_port)
                   10542: #else
                   10543: void scsavdi(UCHAR p_card, ULONG p_port)
                   10544: #endif
                   10545: {
                   10546:    UCHAR i,k,max_id;
                   10547:    USHORT ee_data,sum_data;
                   10548: 
                   10549: 
                   10550:    sum_data = 0x0000;
                   10551: 
                   10552:    for (i = 1; i < EE_SCAMBASE/2; i++)
                   10553:       {
                   10554:       sum_data += utilEERead(p_port, i);
                   10555:       }
                   10556: 
                   10557: 
                   10558:    utilEEWriteOnOff(p_port,1);   /* Enable write access to the EEPROM */
                   10559: 
                   10560:    if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
                   10561:       max_id = 0x08;
                   10562: 
                   10563:    else
                   10564:       max_id = 0x10;
                   10565: 
                   10566:    for (i=0; i < max_id; i++)
                   10567:       {
                   10568: 
                   10569:       for (k=0; k < ID_STRING_LENGTH; k+=2)
                   10570:          {
                   10571:          ee_data = scamInfo[i].id_string[k+1];
                   10572:          ee_data <<= 8;
                   10573:          ee_data |= scamInfo[i].id_string[k];
                   10574:          sum_data += ee_data;
                   10575:          utilEEWrite(p_port, ee_data, (USHORT)((EE_SCAMBASE/2) +
                   10576:             (USHORT)(i*((USHORT)ID_STRING_LENGTH/2)) + (USHORT)(k/2)));
                   10577:          }
                   10578:       }
                   10579: 
                   10580: 
                   10581:    utilEEWrite(p_port, sum_data, EEPROM_CHECK_SUM/2);
                   10582:    utilEEWriteOnOff(p_port,0);   /* Turn off write access */
                   10583: }
                   10584: #ident "$Id: FlashPoint.c,v 1.1 1999/04/26 05:53:56 tb Exp $"
                   10585: /*----------------------------------------------------------------------
                   10586:  *
                   10587:  *
                   10588:  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
                   10589:  *
                   10590:  *   This file is available under both the GNU General Public License
                   10591:  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
                   10592:  *
                   10593:  *   $Workfile:   diagnose.c  $
                   10594:  *
                   10595:  *   Description:  Diagnostic funtions for testing the integrity of
                   10596:  *                 the HARPOON.
                   10597:  *
                   10598:  *   $Date: 1999/04/26 05:53:56 $
                   10599:  *
                   10600:  *   $Revision: 1.1 $
                   10601:  *
                   10602:  *----------------------------------------------------------------------*/
                   10603: 
                   10604: /*#include <globals.h>*/
                   10605: 
                   10606: #if (FW_TYPE==_UCB_MGR_)
                   10607:        /*#include <budi.h>*/
                   10608: #endif
                   10609: 
                   10610: /*#include <sccbmgr.h>*/
                   10611: /*#include <blx30.h>*/
                   10612: /*#include <target.h>*/
                   10613: /*#include <eeprom.h>*/
                   10614: /*#include <harpoon.h>*/
                   10615: 
                   10616: /*---------------------------------------------------------------------
                   10617:  *
                   10618:  * Function: XbowInit
                   10619:  *
                   10620:  * Description: Setup the Xbow for normal operation.
                   10621:  *
                   10622:  *---------------------------------------------------------------------*/
                   10623: 
                   10624: #if defined(DOS)
                   10625: void XbowInit(USHORT port, UCHAR ScamFlg)
                   10626: #else
                   10627: void XbowInit(ULONG port, UCHAR ScamFlg)
                   10628: #endif
                   10629: {
                   10630: UCHAR i;
                   10631: 
                   10632:        i = RD_HARPOON(port+hp_page_ctrl);
                   10633:        WR_HARPOON(port+hp_page_ctrl, (UCHAR) (i | G_INT_DISABLE));
                   10634: 
                   10635:    WR_HARPOON(port+hp_scsireset,0x00);
                   10636:    WR_HARPOON(port+hp_portctrl_1,HOST_MODE8);
                   10637: 
                   10638:    WR_HARPOON(port+hp_scsireset,(DMA_RESET | HPSCSI_RESET | PROG_RESET | \
                   10639:                                 FIFO_CLR));
                   10640: 
                   10641:    WR_HARPOON(port+hp_scsireset,SCSI_INI);
                   10642: 
                   10643:    WR_HARPOON(port+hp_clkctrl_0,CLKCTRL_DEFAULT);
                   10644: 
                   10645:    WR_HARPOON(port+hp_scsisig,0x00);         /*  Clear any signals we might */
                   10646:    WR_HARPOON(port+hp_scsictrl_0,ENA_SCAM_SEL);
                   10647: 
                   10648:    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
                   10649: 
                   10650: #if defined(SCAM_LEV_2)
                   10651:    default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
                   10652:                    BUS_FREE | XFER_CNT_0 | AUTO_INT;
                   10653: 
                   10654:    if ((ScamFlg & SCAM_ENABLED) && (ScamFlg & SCAM_LEVEL2))
                   10655:                default_intena |= SCAM_SEL;
                   10656: 
                   10657: #else
                   10658:    default_intena = RESET | RSEL | PROG_HLT | TIMEOUT |
                   10659:                    BUS_FREE | XFER_CNT_0 | AUTO_INT;
                   10660: #endif
                   10661:    WRW_HARPOON((port+hp_intena), default_intena);
                   10662: 
                   10663:    WR_HARPOON(port+hp_seltimeout,TO_290ms);
                   10664: 
                   10665:    /* Turn on SCSI_MODE8 for narrow cards to fix the
                   10666:       strapping issue with the DUAL CHANNEL card */
                   10667:    if (RD_HARPOON(port+hp_page_ctrl) & NARROW_SCSI_CARD)
                   10668:       WR_HARPOON(port+hp_addstat,SCSI_MODE8);
                   10669: 
                   10670: #if defined(NO_BIOS_OPTION)
                   10671: 
                   10672:    WR_HARPOON(port+hp_synctarg_0,NARROW_SCSI);
                   10673:    WR_HARPOON(port+hp_synctarg_1,NARROW_SCSI);
                   10674:    WR_HARPOON(port+hp_synctarg_2,NARROW_SCSI);
                   10675:    WR_HARPOON(port+hp_synctarg_3,NARROW_SCSI);
                   10676:    WR_HARPOON(port+hp_synctarg_4,NARROW_SCSI);
                   10677:    WR_HARPOON(port+hp_synctarg_5,NARROW_SCSI);
                   10678:    WR_HARPOON(port+hp_synctarg_6,NARROW_SCSI);
                   10679:    WR_HARPOON(port+hp_synctarg_7,NARROW_SCSI);
                   10680:    WR_HARPOON(port+hp_synctarg_8,NARROW_SCSI);
                   10681:    WR_HARPOON(port+hp_synctarg_9,NARROW_SCSI);
                   10682:    WR_HARPOON(port+hp_synctarg_10,NARROW_SCSI);
                   10683:    WR_HARPOON(port+hp_synctarg_11,NARROW_SCSI);
                   10684:    WR_HARPOON(port+hp_synctarg_12,NARROW_SCSI);
                   10685:    WR_HARPOON(port+hp_synctarg_13,NARROW_SCSI);
                   10686:    WR_HARPOON(port+hp_synctarg_14,NARROW_SCSI);
                   10687:    WR_HARPOON(port+hp_synctarg_15,NARROW_SCSI);
                   10688: 
                   10689: #endif
                   10690:        WR_HARPOON(port+hp_page_ctrl, i);
                   10691: 
                   10692: }
                   10693: 
                   10694: 
                   10695: /*---------------------------------------------------------------------
                   10696:  *
                   10697:  * Function: BusMasterInit
                   10698:  *
                   10699:  * Description: Initialize the BusMaster for normal operations.
                   10700:  *
                   10701:  *---------------------------------------------------------------------*/
                   10702: 
                   10703: #if defined(DOS)
                   10704: void BusMasterInit(USHORT p_port)
                   10705: #else
                   10706: void BusMasterInit(ULONG p_port)
                   10707: #endif
                   10708: {
                   10709: 
                   10710: 
                   10711:    WR_HARPOON(p_port+hp_sys_ctrl, DRVR_RST);
                   10712:    WR_HARPOON(p_port+hp_sys_ctrl, 0x00);
                   10713: 
                   10714:    WR_HARPOON(p_port+hp_host_blk_cnt, XFER_BLK64);
                   10715: 
                   10716: 
                   10717:    WR_HARPOON(p_port+hp_bm_ctrl, (BMCTRL_DEFAULT));
                   10718: 
                   10719:    WR_HARPOON(p_port+hp_ee_ctrl, (SCSI_TERM_ENA_H));
                   10720: 
                   10721: 
                   10722: #if defined(NT)
                   10723: 
                   10724:    WR_HARPOON(p_port+hp_pci_cmd_cfg, (RD_HARPOON(p_port+hp_pci_cmd_cfg)
                   10725:       & ~MEM_SPACE_ENA));
                   10726: 
                   10727: #endif
                   10728: 
                   10729:    RD_HARPOON(p_port+hp_int_status);        /*Clear interrupts. */
                   10730:    WR_HARPOON(p_port+hp_int_mask, (INT_CMD_COMPL | SCSI_INTERRUPT));
                   10731:    WR_HARPOON(p_port+hp_page_ctrl, (RD_HARPOON(p_port+hp_page_ctrl) &
                   10732:       ~SCATTER_EN));
                   10733: }
                   10734: 
                   10735: 
                   10736: /*---------------------------------------------------------------------
                   10737:  *
                   10738:  * Function: DiagXbow
                   10739:  *
                   10740:  * Description: Test Xbow integrity.  Non-zero return indicates an error.
                   10741:  *
                   10742:  *---------------------------------------------------------------------*/
                   10743: 
                   10744: #if defined(DOS)
                   10745: int DiagXbow(USHORT port)
                   10746: #else
                   10747: int DiagXbow(ULONG port)
                   10748: #endif
                   10749: {
                   10750:    unsigned char fifo_cnt,loop_cnt;
                   10751: 
                   10752:    unsigned char fifodata[5];
                   10753:    fifodata[0] = 0x00;
                   10754:    fifodata[1] = 0xFF;
                   10755:    fifodata[2] = 0x55;
                   10756:    fifodata[3] = 0xAA;
                   10757:    fifodata[4] = 0x00;
                   10758: 
                   10759: 
                   10760:    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
                   10761:    WRW_HARPOON((port+hp_intena), 0x0000);
                   10762: 
                   10763:    WR_HARPOON(port+hp_seltimeout,TO_5ms);
                   10764: 
                   10765:    WR_HARPOON(port+hp_portctrl_0,START_TO);
                   10766: 
                   10767: 
                   10768:    for(fifodata[4] = 0x01; fifodata[4] != (UCHAR) 0; fifodata[4] = fifodata[4] << 1) {
                   10769: 
                   10770:       WR_HARPOON(port+hp_selfid_0,fifodata[4]);
                   10771:       WR_HARPOON(port+hp_selfid_1,fifodata[4]);
                   10772: 
                   10773:       if ((RD_HARPOON(port+hp_selfid_0) != fifodata[4]) ||
                   10774:           (RD_HARPOON(port+hp_selfid_1) != fifodata[4]))
                   10775:          return(1);
                   10776:       }
                   10777: 
                   10778: 
                   10779:    for(loop_cnt = 0; loop_cnt < 4; loop_cnt++) {
                   10780: 
                   10781:       WR_HARPOON(port+hp_portctrl_0,(HOST_PORT | HOST_WRT | START_TO));
                   10782: 
                   10783: 
                   10784:       for (fifo_cnt = 0; fifo_cnt < FIFO_LEN; fifo_cnt++) {
                   10785: 
                   10786:          WR_HARPOON(port+hp_fifodata_0, fifodata[loop_cnt]);
                   10787:          }
                   10788: 
                   10789: 
                   10790:       if (!(RD_HARPOON(port+hp_xferstat) & FIFO_FULL))
                   10791:          return(1);
                   10792: 
                   10793: 
                   10794:       WR_HARPOON(port+hp_portctrl_0,(HOST_PORT | START_TO));
                   10795: 
                   10796:       for (fifo_cnt = 0; fifo_cnt < FIFO_LEN; fifo_cnt++) {
                   10797: 
                   10798:          if (RD_HARPOON(port+hp_fifodata_0) != fifodata[loop_cnt])
                   10799:             return(1);
                   10800:          }
                   10801: 
                   10802: 
                   10803:       if (!(RD_HARPOON(port+hp_xferstat) & FIFO_EMPTY))
                   10804:          return(1);
                   10805:       }
                   10806: 
                   10807: 
                   10808:    while(!(RDW_HARPOON((port+hp_intstat)) & TIMEOUT)) {}
                   10809: 
                   10810: 
                   10811:    WR_HARPOON(port+hp_seltimeout,TO_290ms);
                   10812: 
                   10813:    WRW_HARPOON((port+hp_intstat), CLR_ALL_INT);
                   10814: 
                   10815:    WRW_HARPOON((port+hp_intena), default_intena);
                   10816: 
                   10817:    return(0);
                   10818: }
                   10819: 
                   10820: 
                   10821: /*---------------------------------------------------------------------
                   10822:  *
                   10823:  * Function: DiagBusMaster
                   10824:  *
                   10825:  * Description: Test BusMaster integrity.  Non-zero return indicates an
                   10826:  *              error.
                   10827:  *
                   10828:  *---------------------------------------------------------------------*/
                   10829: 
                   10830: #if defined(DOS)
                   10831: int DiagBusMaster(USHORT port)
                   10832: #else
                   10833: int DiagBusMaster(ULONG port)
                   10834: #endif
                   10835: {
                   10836:    UCHAR testdata;
                   10837: 
                   10838:    for(testdata = (UCHAR) 1; testdata != (UCHAR)0; testdata = testdata << 1) {
                   10839: 
                   10840:       WR_HARPOON(port+hp_xfer_cnt_lo,testdata);
                   10841:       WR_HARPOON(port+hp_xfer_cnt_mi,testdata);
                   10842:       WR_HARPOON(port+hp_xfer_cnt_hi,testdata);
                   10843:       WR_HARPOON(port+hp_host_addr_lo,testdata);
                   10844:       WR_HARPOON(port+hp_host_addr_lmi,testdata);
                   10845:       WR_HARPOON(port+hp_host_addr_hmi,testdata);
                   10846:       WR_HARPOON(port+hp_host_addr_hi,testdata);
                   10847: 
                   10848:       if ((RD_HARPOON(port+hp_xfer_cnt_lo) != testdata)   ||
                   10849:           (RD_HARPOON(port+hp_xfer_cnt_mi) != testdata)   ||
                   10850:           (RD_HARPOON(port+hp_xfer_cnt_hi) != testdata)   ||
                   10851:           (RD_HARPOON(port+hp_host_addr_lo) != testdata)  ||
                   10852:           (RD_HARPOON(port+hp_host_addr_lmi) != testdata) ||
                   10853:           (RD_HARPOON(port+hp_host_addr_hmi) != testdata) ||
                   10854:           (RD_HARPOON(port+hp_host_addr_hi) != testdata))
                   10855: 
                   10856:          return(1);
                   10857:       }
                   10858:    RD_HARPOON(port+hp_int_status);        /*Clear interrupts. */
                   10859:    return(0);
                   10860: }
                   10861: 
                   10862: 
                   10863: 
                   10864: /*---------------------------------------------------------------------
                   10865:  *
                   10866:  * Function: DiagEEPROM
                   10867:  *
                   10868:  * Description: Verfiy checksum and 'Key' and initialize the EEPROM if
                   10869:  *              neccessary.
                   10870:  *
                   10871:  *---------------------------------------------------------------------*/
                   10872: 
                   10873: #if defined(DOS)
                   10874: void DiagEEPROM(USHORT p_port)
                   10875: #else
                   10876: void DiagEEPROM(ULONG p_port)
                   10877: #endif
                   10878: 
                   10879: {
                   10880:    USHORT index,temp,max_wd_cnt;
                   10881: 
                   10882:    if (RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD)
                   10883:       max_wd_cnt = EEPROM_WD_CNT;
                   10884:    else
                   10885:       max_wd_cnt = EEPROM_WD_CNT * 2;
                   10886: 
                   10887:    temp = utilEERead(p_port, FW_SIGNATURE/2);
                   10888: 
                   10889:    if (temp == 0x4641) {
                   10890: 
                   10891:       for (index = 2; index < max_wd_cnt; index++) {
                   10892: 
                   10893:          temp += utilEERead(p_port, index);
                   10894: 
                   10895:          }
                   10896: 
                   10897:       if (temp == utilEERead(p_port, EEPROM_CHECK_SUM/2)) {
                   10898: 
                   10899:          return;          /*EEPROM is Okay so return now! */
                   10900:          }
                   10901:       }
                   10902: 
                   10903: 
                   10904:    utilEEWriteOnOff(p_port,(UCHAR)1);
                   10905: 
                   10906:    for (index = 0; index < max_wd_cnt; index++) {
                   10907: 
                   10908:       utilEEWrite(p_port, 0x0000, index);
                   10909:       }
                   10910: 
                   10911:    temp = 0;
                   10912: 
                   10913:    utilEEWrite(p_port, 0x4641, FW_SIGNATURE/2);
                   10914:    temp += 0x4641;
                   10915:    utilEEWrite(p_port, 0x3920, MODEL_NUMB_0/2);
                   10916:    temp += 0x3920;
                   10917:    utilEEWrite(p_port, 0x3033, MODEL_NUMB_2/2);
                   10918:    temp += 0x3033;
                   10919:    utilEEWrite(p_port, 0x2020, MODEL_NUMB_4/2);
                   10920:    temp += 0x2020;
                   10921:    utilEEWrite(p_port, 0x70D3, SYSTEM_CONFIG/2);
                   10922:    temp += 0x70D3;
                   10923:    utilEEWrite(p_port, 0x0010, BIOS_CONFIG/2);
                   10924:    temp += 0x0010;
                   10925:    utilEEWrite(p_port, 0x0003, SCAM_CONFIG/2);
                   10926:    temp += 0x0003;
                   10927:    utilEEWrite(p_port, 0x0007, ADAPTER_SCSI_ID/2);
                   10928:    temp += 0x0007;
                   10929: 
                   10930:    utilEEWrite(p_port, 0x0000, IGNORE_B_SCAN/2);
                   10931:    temp += 0x0000;
                   10932:    utilEEWrite(p_port, 0x0000, SEND_START_ENA/2);
                   10933:    temp += 0x0000;
                   10934:    utilEEWrite(p_port, 0x0000, DEVICE_ENABLE/2);
                   10935:    temp += 0x0000;
                   10936: 
                   10937:    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL01/2);
                   10938:    temp += 0x4242;
                   10939:    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL23/2);
                   10940:    temp += 0x4242;
                   10941:    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL45/2);
                   10942:    temp += 0x4242;
                   10943:    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL67/2);
                   10944:    temp += 0x4242;
                   10945:    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBL89/2);
                   10946:    temp += 0x4242;
                   10947:    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLab/2);
                   10948:    temp += 0x4242;
                   10949:    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLcd/2);
                   10950:    temp += 0x4242;
                   10951:    utilEEWrite(p_port, 0x4242, SYNC_RATE_TBLef/2);
                   10952:    temp += 0x4242;
                   10953: 
                   10954: 
                   10955:    utilEEWrite(p_port, 0x6C46, 64/2);  /*PRODUCT ID */
                   10956:    temp += 0x6C46;
                   10957:    utilEEWrite(p_port, 0x7361, 66/2);  /* FlashPoint LT   */
                   10958:    temp += 0x7361;
                   10959:    utilEEWrite(p_port, 0x5068, 68/2);
                   10960:    temp += 0x5068;
                   10961:    utilEEWrite(p_port, 0x696F, 70/2);
                   10962:    temp += 0x696F;
                   10963:    utilEEWrite(p_port, 0x746E, 72/2);
                   10964:    temp += 0x746E;
                   10965:    utilEEWrite(p_port, 0x4C20, 74/2);
                   10966:    temp += 0x4C20;
                   10967:    utilEEWrite(p_port, 0x2054, 76/2);
                   10968:    temp += 0x2054;
                   10969:    utilEEWrite(p_port, 0x2020, 78/2);
                   10970:    temp += 0x2020;
                   10971: 
                   10972:    index = ((EE_SCAMBASE/2)+(7*16));
                   10973:    utilEEWrite(p_port, (0x0700+TYPE_CODE0), index);
                   10974:    temp += (0x0700+TYPE_CODE0);
                   10975:    index++;
                   10976:    utilEEWrite(p_port, 0x5542, index);            /*Vendor ID code */
                   10977:    temp += 0x5542;                                /* BUSLOGIC      */
                   10978:    index++;
                   10979:    utilEEWrite(p_port, 0x4C53, index);
                   10980:    temp += 0x4C53;
                   10981:    index++;
                   10982:    utilEEWrite(p_port, 0x474F, index);
                   10983:    temp += 0x474F;
                   10984:    index++;
                   10985:    utilEEWrite(p_port, 0x4349, index);
                   10986:    temp += 0x4349;
                   10987:    index++;
                   10988:    utilEEWrite(p_port, 0x5442, index);            /*Vendor unique code */
                   10989:    temp += 0x5442;                         /* BT- 930           */
                   10990:    index++;
                   10991:    utilEEWrite(p_port, 0x202D, index);
                   10992:    temp += 0x202D;
                   10993:    index++;
                   10994:    utilEEWrite(p_port, 0x3339, index);
                   10995:    temp += 0x3339;
                   10996:    index++;                                 /*Serial #          */
                   10997:    utilEEWrite(p_port, 0x2030, index);             /* 01234567         */
                   10998:    temp += 0x2030;
                   10999:    index++;
                   11000:    utilEEWrite(p_port, 0x5453, index);
                   11001:    temp += 0x5453;
                   11002:    index++;
                   11003:    utilEEWrite(p_port, 0x5645, index);
                   11004:    temp += 0x5645;
                   11005:    index++;
                   11006:    utilEEWrite(p_port, 0x2045, index);
                   11007:    temp += 0x2045;
                   11008:    index++;
                   11009:    utilEEWrite(p_port, 0x202F, index);
                   11010:    temp += 0x202F;
                   11011:    index++;
                   11012:    utilEEWrite(p_port, 0x4F4A, index);
                   11013:    temp += 0x4F4A;
                   11014:    index++;
                   11015:    utilEEWrite(p_port, 0x204E, index);
                   11016:    temp += 0x204E;
                   11017:    index++;
                   11018:    utilEEWrite(p_port, 0x3539, index);
                   11019:    temp += 0x3539;
                   11020: 
                   11021: 
                   11022: 
                   11023:    utilEEWrite(p_port, temp, EEPROM_CHECK_SUM/2);
                   11024: 
                   11025:    utilEEWriteOnOff(p_port,(UCHAR)0);
                   11026: 
                   11027: }
                   11028: 
                   11029: #ident "$Id: FlashPoint.c,v 1.1 1999/04/26 05:53:56 tb Exp $"
                   11030: /*----------------------------------------------------------------------
                   11031:  *
                   11032:  *
                   11033:  *   Copyright 1995-1996 by Mylex Corporation.  All Rights Reserved
                   11034:  *
                   11035:  *   This file is available under both the GNU General Public License
                   11036:  *   and a BSD-style copyright; see LICENSE.FlashPoint for details.
                   11037:  *
                   11038:  *   $Workfile:   utility.c  $
                   11039:  *
                   11040:  *   Description:  Utility functions relating to queueing and EEPROM
                   11041:  *                 manipulation and any other garbage functions.
                   11042:  *
                   11043:  *   $Date: 1999/04/26 05:53:56 $
                   11044:  *
                   11045:  *   $Revision: 1.1 $
                   11046:  *
                   11047:  *----------------------------------------------------------------------*/
                   11048: /*#include <globals.h>*/
                   11049: 
                   11050: #if (FW_TYPE==_UCB_MGR_)
                   11051:        /*#include <budi.h>*/
                   11052: #endif
                   11053: 
                   11054: /*#include <sccbmgr.h>*/
                   11055: /*#include <blx30.h>*/
                   11056: /*#include <target.h>*/
                   11057: /*#include <scsi2.h>*/
                   11058: /*#include <harpoon.h>*/
                   11059: 
                   11060: 
                   11061: /*
                   11062: extern SCCBCARD BL_Card[MAX_CARDS];
                   11063: extern SCCBMGR_TAR_INFO sccbMgrTbl[MAX_CARDS][MAX_SCSI_TAR];
                   11064: extern unsigned int SccbGlobalFlags;
                   11065: */
                   11066: 
                   11067: /*---------------------------------------------------------------------
                   11068:  *
                   11069:  * Function: Queue Search Select
                   11070:  *
                   11071:  * Description: Try to find a new command to execute.
                   11072:  *
                   11073:  *---------------------------------------------------------------------*/
                   11074: 
                   11075: void queueSearchSelect(PSCCBcard pCurrCard, UCHAR p_card)
                   11076: {
                   11077:    UCHAR scan_ptr, lun;
                   11078:    PSCCBMgr_tar_info currTar_Info;
                   11079:        PSCCB pOldSccb;
                   11080: 
                   11081:    scan_ptr = pCurrCard->scanIndex;
                   11082:        do 
                   11083:        {
                   11084:                currTar_Info = &sccbMgrTbl[p_card][scan_ptr];
                   11085:                if((pCurrCard->globalFlags & F_CONLUN_IO) && 
                   11086:                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING))
                   11087:                {
                   11088:                        if (currTar_Info->TarSelQ_Cnt != 0)
                   11089:                        {
                   11090: 
                   11091:                                scan_ptr++;
                   11092:                                if (scan_ptr == MAX_SCSI_TAR)
                   11093:                                        scan_ptr = 0;
                   11094:                                
                   11095:                                for(lun=0; lun < MAX_LUN; lun++)
                   11096:                                {
                   11097:                                        if(currTar_Info->TarLUNBusy[lun] == FALSE)
                   11098:                                        {
                   11099: 
                   11100:                                                pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
                   11101:                                                pOldSccb = NULL;
                   11102: 
                   11103:                                                while((pCurrCard->currentSCCB != NULL) &&
                   11104:                                                                 (lun != pCurrCard->currentSCCB->Lun))
                   11105:                                                {
                   11106:                                                        pOldSccb = pCurrCard->currentSCCB;
                   11107:                                                        pCurrCard->currentSCCB = (PSCCB)(pCurrCard->currentSCCB)->
                   11108:                                                                                                                                        Sccb_forwardlink;
                   11109:                                                }
                   11110:                                                if(pCurrCard->currentSCCB == NULL)
                   11111:                                                        continue;
                   11112:                                                if(pOldSccb != NULL)
                   11113:                                                {
                   11114:                                                        pOldSccb->Sccb_forwardlink = (PSCCB)(pCurrCard->currentSCCB)->
                   11115:                                                                                                                                        Sccb_forwardlink;
                   11116:                                                        pOldSccb->Sccb_backlink = (PSCCB)(pCurrCard->currentSCCB)->
                   11117:                                                                                                                                        Sccb_backlink;
                   11118:                                                        currTar_Info->TarSelQ_Cnt--;
                   11119:                                                }
                   11120:                                                else
                   11121:                                                {
                   11122:                                                        currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink;
                   11123:                                        
                   11124:                                                        if (currTar_Info->TarSelQ_Head == NULL)
                   11125:                                                        {
                   11126:                                                                currTar_Info->TarSelQ_Tail = NULL;
                   11127:                                                                currTar_Info->TarSelQ_Cnt = 0;
                   11128:                                                        }
                   11129:                                                        else
                   11130:                                                        {
                   11131:                                                                currTar_Info->TarSelQ_Cnt--;
                   11132:                                                                currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL;
                   11133:                                                        }
                   11134:                                                }
                   11135:                                        pCurrCard->scanIndex = scan_ptr;
                   11136: 
                   11137:                                        pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
                   11138: 
                   11139:                                        break;
                   11140:                                        }
                   11141:                                }
                   11142:                        }
                   11143: 
                   11144:                        else 
                   11145:                        {
                   11146:                                scan_ptr++;
                   11147:                                if (scan_ptr == MAX_SCSI_TAR) {
                   11148:                                        scan_ptr = 0;
                   11149:                                }
                   11150:                        }
                   11151: 
                   11152:                }
                   11153:                else
                   11154:                {
                   11155:                        if ((currTar_Info->TarSelQ_Cnt != 0) &&
                   11156:                                (currTar_Info->TarLUNBusy[0] == FALSE))
                   11157:                        {
                   11158: 
                   11159:                                pCurrCard->currentSCCB = currTar_Info->TarSelQ_Head;
                   11160: 
                   11161:                                currTar_Info->TarSelQ_Head = (PSCCB)(pCurrCard->currentSCCB)->Sccb_forwardlink;
                   11162: 
                   11163:                                if (currTar_Info->TarSelQ_Head == NULL)
                   11164:                                {
                   11165:                                        currTar_Info->TarSelQ_Tail = NULL;
                   11166:                                        currTar_Info->TarSelQ_Cnt = 0;
                   11167:                                }
                   11168:                                else
                   11169:                                {
                   11170:                                        currTar_Info->TarSelQ_Cnt--;
                   11171:                                        currTar_Info->TarSelQ_Head->Sccb_backlink = (PSCCB)NULL;
                   11172:                                }
                   11173: 
                   11174:                                scan_ptr++;
                   11175:                                if (scan_ptr == MAX_SCSI_TAR)
                   11176:                                        scan_ptr = 0;
                   11177: 
                   11178:                                pCurrCard->scanIndex = scan_ptr;
                   11179: 
                   11180:                                pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
                   11181: 
                   11182:                                break;
                   11183:                        }
                   11184: 
                   11185:                        else 
                   11186:                        {
                   11187:                                scan_ptr++;
                   11188:                                if (scan_ptr == MAX_SCSI_TAR) 
                   11189:                                {
                   11190:                                        scan_ptr = 0;
                   11191:                                }
                   11192:                        }
                   11193:                }
                   11194:        } while (scan_ptr != pCurrCard->scanIndex);
                   11195: }
                   11196: 
                   11197: 
                   11198: /*---------------------------------------------------------------------
                   11199:  *
                   11200:  * Function: Queue Select Fail
                   11201:  *
                   11202:  * Description: Add the current SCCB to the head of the Queue.
                   11203:  *
                   11204:  *---------------------------------------------------------------------*/
                   11205: 
                   11206: void queueSelectFail(PSCCBcard pCurrCard, UCHAR p_card)
                   11207: {
                   11208:    UCHAR thisTarg;
                   11209:    PSCCBMgr_tar_info currTar_Info;
                   11210: 
                   11211:    if (pCurrCard->currentSCCB != NULL)
                   11212:          {
                   11213:          thisTarg = (UCHAR)(((PSCCB)(pCurrCard->currentSCCB))->TargID);
                   11214:       currTar_Info = &sccbMgrTbl[p_card][thisTarg];
                   11215: 
                   11216:       pCurrCard->currentSCCB->Sccb_backlink = (PSCCB)NULL;
                   11217: 
                   11218:       pCurrCard->currentSCCB->Sccb_forwardlink = currTar_Info->TarSelQ_Head;
                   11219: 
                   11220:          if (currTar_Info->TarSelQ_Cnt == 0)
                   11221:                 {
                   11222:                 currTar_Info->TarSelQ_Tail = pCurrCard->currentSCCB;
                   11223:                 }
                   11224: 
                   11225:          else
                   11226:                 {
                   11227:                 currTar_Info->TarSelQ_Head->Sccb_backlink = pCurrCard->currentSCCB;
                   11228:                 }
                   11229: 
                   11230: 
                   11231:          currTar_Info->TarSelQ_Head = pCurrCard->currentSCCB;
                   11232: 
                   11233:          pCurrCard->currentSCCB = NULL;
                   11234:          currTar_Info->TarSelQ_Cnt++;
                   11235:          }
                   11236: }
                   11237: /*---------------------------------------------------------------------
                   11238:  *
                   11239:  * Function: Queue Command Complete
                   11240:  *
                   11241:  * Description: Call the callback function with the current SCCB.
                   11242:  *
                   11243:  *---------------------------------------------------------------------*/
                   11244: 
                   11245: void queueCmdComplete(PSCCBcard pCurrCard, PSCCB p_sccb, UCHAR p_card)
                   11246: {
                   11247: 
                   11248: #if (FW_TYPE==_UCB_MGR_)
                   11249: 
                   11250:    u08bits SCSIcmd;
                   11251:    CALL_BK_FN callback;
                   11252:    PSCCBMgr_tar_info currTar_Info;
                   11253: 
                   11254:    PUCB p_ucb;
                   11255:    p_ucb=p_sccb->Sccb_ucb_ptr;
                   11256: 
                   11257:    SCSIcmd = p_sccb->Cdb[0];
                   11258: 
                   11259: 
                   11260:    if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED))
                   11261:    {
                   11262: 
                   11263:       if ((p_ucb->UCB_opcode & OPC_CHK_UNDER_OVER_RUN)                     &&
                   11264:          (p_sccb->HostStatus == SCCB_COMPLETE)                             &&
                   11265:          (p_sccb->TargetStatus != SSCHECK))
                   11266: 
                   11267:          if ((SCSIcmd == SCSI_READ)             ||
                   11268:              (SCSIcmd == SCSI_WRITE)            ||
                   11269:              (SCSIcmd == SCSI_READ_EXTENDED)    ||
                   11270:              (SCSIcmd == SCSI_WRITE_EXTENDED)   ||
                   11271:              (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
                   11272:              (SCSIcmd == SCSI_START_STOP_UNIT)  ||
                   11273:              (pCurrCard->globalFlags & F_NO_FILTER)
                   11274:             )
                   11275:                p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
                   11276:    }
                   11277: 
                   11278:    p_ucb->UCB_status=SCCB_SUCCESS;
                   11279: 
                   11280:    if ((p_ucb->UCB_hbastat=p_sccb->HostStatus) || (p_ucb->UCB_scsistat=p_sccb->TargetStatus))
                   11281:    {
                   11282:       p_ucb->UCB_status=SCCB_ERROR;
                   11283:    }
                   11284: 
                   11285:    if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
                   11286:       (p_sccb->OperationCode == RESIDUAL_COMMAND))
                   11287:    {
                   11288: 
                   11289:          utilUpdateResidual(p_sccb);
                   11290: 
                   11291:          p_ucb->UCB_datalen=p_sccb->DataLength;
                   11292:    }
                   11293: 
                   11294:    pCurrCard->cmdCounter--;
                   11295:    if (!pCurrCard->cmdCounter)
                   11296:    {
                   11297: 
                   11298:       if (pCurrCard->globalFlags & F_GREEN_PC)
                   11299:       {
                   11300:          WR_HARPOON(pCurrCard->ioPort+hp_clkctrl_0,(PWR_DWN | CLKCTRL_DEFAULT));
                   11301:          WR_HARPOON(pCurrCard->ioPort+hp_sys_ctrl, STOP_CLK);
                   11302:       }
                   11303: 
                   11304:       WR_HARPOON(pCurrCard->ioPort+hp_semaphore,
                   11305:       (RD_HARPOON(pCurrCard->ioPort+hp_semaphore) & ~SCCB_MGR_ACTIVE));
                   11306:    }
                   11307: 
                   11308:        if(pCurrCard->discQCount != 0)
                   11309:        {
                   11310:       currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
                   11311:                if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
                   11312:                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   11313:                {
                   11314:                        pCurrCard->discQCount--;
                   11315:                        pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = NULL;
                   11316:                }
                   11317:                else
                   11318:                {
                   11319:                        if(p_sccb->Sccb_tag)
                   11320:                        {
                   11321:                                pCurrCard->discQCount--;
                   11322:                                pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
                   11323:                        }else
                   11324:                        {
                   11325:                                pCurrCard->discQCount--;
                   11326:                                pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
                   11327:                        }
                   11328:                }
                   11329: 
                   11330:        }
                   11331:    callback = (CALL_BK_FN)p_ucb->UCB_callback;
                   11332:    callback(p_ucb);
                   11333:    pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
                   11334:    pCurrCard->currentSCCB = NULL;
                   11335: }
                   11336: 
                   11337: 
                   11338: 
                   11339: 
                   11340: #else
                   11341: 
                   11342:    UCHAR i, SCSIcmd;
                   11343:    CALL_BK_FN callback;
                   11344:    PSCCBMgr_tar_info currTar_Info;
                   11345: 
                   11346:    SCSIcmd = p_sccb->Cdb[0];
                   11347: 
                   11348: 
                   11349:    if (!(p_sccb->Sccb_XferState & F_ALL_XFERRED)) {
                   11350: 
                   11351:          if ((p_sccb->ControlByte & (SCCB_DATA_XFER_OUT | SCCB_DATA_XFER_IN)) &&
                   11352:                 (p_sccb->HostStatus == SCCB_COMPLETE)                             &&
                   11353:                 (p_sccb->TargetStatus != SSCHECK))
                   11354: 
                   11355:                 if ((SCSIcmd == SCSI_READ)             ||
                   11356:                         (SCSIcmd == SCSI_WRITE)            ||
                   11357:                         (SCSIcmd == SCSI_READ_EXTENDED)    ||
                   11358:                         (SCSIcmd == SCSI_WRITE_EXTENDED)   ||
                   11359:                         (SCSIcmd == SCSI_WRITE_AND_VERIFY) ||
                   11360:                         (SCSIcmd == SCSI_START_STOP_UNIT)  ||
                   11361:                         (pCurrCard->globalFlags & F_NO_FILTER)
                   11362:                        )
                   11363:                           p_sccb->HostStatus = SCCB_DATA_UNDER_RUN;
                   11364:          }
                   11365: 
                   11366: 
                   11367:        if(p_sccb->SccbStatus == SCCB_IN_PROCESS)
                   11368:        {
                   11369:           if (p_sccb->HostStatus || p_sccb->TargetStatus)
                   11370:                  p_sccb->SccbStatus = SCCB_ERROR;
                   11371:           else
                   11372:                  p_sccb->SccbStatus = SCCB_SUCCESS;
                   11373:        }
                   11374: 
                   11375:    if (p_sccb->Sccb_XferState & F_AUTO_SENSE) {
                   11376: 
                   11377:          p_sccb->CdbLength = p_sccb->Save_CdbLen;
                   11378:          for (i=0; i < 6; i++) {
                   11379:                 p_sccb->Cdb[i] = p_sccb->Save_Cdb[i];
                   11380:                 }
                   11381:          }
                   11382: 
                   11383:    if ((p_sccb->OperationCode == RESIDUAL_SG_COMMAND) ||
                   11384:          (p_sccb->OperationCode == RESIDUAL_COMMAND)) {
                   11385: 
                   11386:                 utilUpdateResidual(p_sccb);
                   11387:                 }
                   11388: 
                   11389:    pCurrCard->cmdCounter--;
                   11390:    if (!pCurrCard->cmdCounter) {
                   11391: 
                   11392:          if (pCurrCard->globalFlags & F_GREEN_PC) {
                   11393:                 WR_HARPOON(pCurrCard->ioPort+hp_clkctrl_0,(PWR_DWN | CLKCTRL_DEFAULT));
                   11394:                 WR_HARPOON(pCurrCard->ioPort+hp_sys_ctrl, STOP_CLK);
                   11395:                 }
                   11396: 
                   11397:          WR_HARPOON(pCurrCard->ioPort+hp_semaphore,
                   11398:          (RD_HARPOON(pCurrCard->ioPort+hp_semaphore) & ~SCCB_MGR_ACTIVE));
                   11399: 
                   11400:          }
                   11401: 
                   11402:        if(pCurrCard->discQCount != 0)
                   11403:        {
                   11404:       currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
                   11405:                if(((pCurrCard->globalFlags & F_CONLUN_IO) &&
                   11406:                        ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   11407:                {
                   11408:                        pCurrCard->discQCount--;
                   11409:                        pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = NULL;
                   11410:                }
                   11411:                else
                   11412:                {
                   11413:                        if(p_sccb->Sccb_tag)
                   11414:                        {
                   11415:                                pCurrCard->discQCount--;
                   11416:                                pCurrCard->discQ_Tbl[p_sccb->Sccb_tag] = NULL;
                   11417:                        }else
                   11418:                        {
                   11419:                                pCurrCard->discQCount--;
                   11420:                                pCurrCard->discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = NULL;
                   11421:                        }
                   11422:                }
                   11423: 
                   11424:        }
                   11425: 
                   11426:        callback = (CALL_BK_FN)p_sccb->SccbCallback;
                   11427:    callback(p_sccb);
                   11428:    pCurrCard->globalFlags |= F_NEW_SCCB_CMD;
                   11429:    pCurrCard->currentSCCB = NULL;
                   11430: }
                   11431: #endif /* ( if FW_TYPE==...) */
                   11432: 
                   11433: 
                   11434: /*---------------------------------------------------------------------
                   11435:  *
                   11436:  * Function: Queue Disconnect
                   11437:  *
                   11438:  * Description: Add SCCB to our disconnect array.
                   11439:  *
                   11440:  *---------------------------------------------------------------------*/
                   11441: void queueDisconnect(PSCCB p_sccb, UCHAR p_card)
                   11442: {
                   11443:    PSCCBMgr_tar_info currTar_Info;
                   11444: 
                   11445:        currTar_Info = &sccbMgrTbl[p_card][p_sccb->TargID];
                   11446: 
                   11447:        if(((BL_Card[p_card].globalFlags & F_CONLUN_IO) &&
                   11448:                ((currTar_Info->TarStatus & TAR_TAG_Q_MASK) != TAG_Q_TRYING)))
                   11449:        {
                   11450:                BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[p_sccb->Lun]] = p_sccb;
                   11451:        }
                   11452:        else
                   11453:        {
                   11454:                if (p_sccb->Sccb_tag)
                   11455:                {
                   11456:                        BL_Card[p_card].discQ_Tbl[p_sccb->Sccb_tag] = p_sccb;
                   11457:                        sccbMgrTbl[p_card][p_sccb->TargID].TarLUNBusy[0] = FALSE;
                   11458:                        sccbMgrTbl[p_card][p_sccb->TargID].TarTagQ_Cnt++;
                   11459:                }else
                   11460:                {
                   11461:                        BL_Card[p_card].discQ_Tbl[currTar_Info->LunDiscQ_Idx[0]] = p_sccb;
                   11462:                }
                   11463:        }
                   11464:        BL_Card[p_card].currentSCCB = NULL;
                   11465: }
                   11466: 
                   11467: 
                   11468: /*---------------------------------------------------------------------
                   11469:  *
                   11470:  * Function: Queue Flush SCCB
                   11471:  *
                   11472:  * Description: Flush all SCCB's back to the host driver for this target.
                   11473:  *
                   11474:  *---------------------------------------------------------------------*/
                   11475: 
                   11476: void  queueFlushSccb(UCHAR p_card, UCHAR error_code)
                   11477: {
                   11478:    UCHAR qtag,thisTarg;
                   11479:    PSCCB currSCCB;
                   11480:    PSCCBMgr_tar_info currTar_Info;
                   11481: 
                   11482:    currSCCB = BL_Card[p_card].currentSCCB;
                   11483:        if(currSCCB != NULL)
                   11484:        {
                   11485:           thisTarg = (UCHAR)currSCCB->TargID;
                   11486:        currTar_Info = &sccbMgrTbl[p_card][thisTarg];
                   11487: 
                   11488:           for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
                   11489: 
                   11490:                  if (BL_Card[p_card].discQ_Tbl[qtag] && 
                   11491:                                        (BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
                   11492:                         {
                   11493: 
                   11494:                         BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
                   11495:                        
                   11496:                         queueCmdComplete(&BL_Card[p_card],BL_Card[p_card].discQ_Tbl[qtag], p_card);
                   11497: 
                   11498:                         BL_Card[p_card].discQ_Tbl[qtag] = NULL;
                   11499:                         currTar_Info->TarTagQ_Cnt--;
                   11500: 
                   11501:                         }
                   11502:                  }
                   11503:        }
                   11504: 
                   11505: }
                   11506: 
                   11507: /*---------------------------------------------------------------------
                   11508:  *
                   11509:  * Function: Queue Flush Target SCCB
                   11510:  *
                   11511:  * Description: Flush all SCCB's back to the host driver for this target.
                   11512:  *
                   11513:  *---------------------------------------------------------------------*/
                   11514: 
                   11515: void  queueFlushTargSccb(UCHAR p_card, UCHAR thisTarg, UCHAR error_code)
                   11516: {
                   11517:    UCHAR qtag;
                   11518:    PSCCBMgr_tar_info currTar_Info;
                   11519: 
                   11520:    currTar_Info = &sccbMgrTbl[p_card][thisTarg];
                   11521: 
                   11522:    for (qtag=0; qtag<QUEUE_DEPTH; qtag++) {
                   11523: 
                   11524:          if (BL_Card[p_card].discQ_Tbl[qtag] && 
                   11525:                                (BL_Card[p_card].discQ_Tbl[qtag]->TargID == thisTarg))
                   11526:                 {
                   11527: 
                   11528:                 BL_Card[p_card].discQ_Tbl[qtag]->HostStatus = (UCHAR)error_code;
                   11529: 
                   11530:                 queueCmdComplete(&BL_Card[p_card],BL_Card[p_card].discQ_Tbl[qtag], p_card);
                   11531: 
                   11532:                 BL_Card[p_card].discQ_Tbl[qtag] = NULL;
                   11533:                 currTar_Info->TarTagQ_Cnt--;
                   11534: 
                   11535:                 }
                   11536:          }
                   11537: 
                   11538: }
                   11539: 
                   11540: 
                   11541: 
                   11542: 
                   11543: 
                   11544: void queueAddSccb(PSCCB p_SCCB, UCHAR p_card)
                   11545: {
                   11546:    PSCCBMgr_tar_info currTar_Info;
                   11547:    currTar_Info = &sccbMgrTbl[p_card][p_SCCB->TargID];
                   11548: 
                   11549:    p_SCCB->Sccb_forwardlink = NULL;
                   11550: 
                   11551:    p_SCCB->Sccb_backlink = currTar_Info->TarSelQ_Tail;
                   11552: 
                   11553:    if (currTar_Info->TarSelQ_Cnt == 0) {
                   11554: 
                   11555:          currTar_Info->TarSelQ_Head = p_SCCB;
                   11556:          }
                   11557: 
                   11558:    else {
                   11559: 
                   11560:          currTar_Info->TarSelQ_Tail->Sccb_forwardlink = p_SCCB;
                   11561:          }
                   11562: 
                   11563: 
                   11564:    currTar_Info->TarSelQ_Tail = p_SCCB;
                   11565:    currTar_Info->TarSelQ_Cnt++;
                   11566: }
                   11567: 
                   11568: 
                   11569: /*---------------------------------------------------------------------
                   11570:  *
                   11571:  * Function: Queue Find SCCB
                   11572:  *
                   11573:  * Description: Search the target select Queue for this SCCB, and
                   11574:  *              remove it if found.
                   11575:  *
                   11576:  *---------------------------------------------------------------------*/
                   11577: 
                   11578: UCHAR queueFindSccb(PSCCB p_SCCB, UCHAR p_card)
                   11579: {
                   11580:    PSCCB q_ptr;
                   11581:    PSCCBMgr_tar_info currTar_Info;
                   11582: 
                   11583:    currTar_Info = &sccbMgrTbl[p_card][p_SCCB->TargID];
                   11584: 
                   11585:    q_ptr = currTar_Info->TarSelQ_Head;
                   11586: 
                   11587:    while(q_ptr != NULL) {
                   11588: 
                   11589:          if (q_ptr == p_SCCB) {
                   11590: 
                   11591: 
                   11592:                 if (currTar_Info->TarSelQ_Head == q_ptr) {
                   11593: 
                   11594:                        currTar_Info->TarSelQ_Head = q_ptr->Sccb_forwardlink;
                   11595:                        }
                   11596: 
                   11597:                 if (currTar_Info->TarSelQ_Tail == q_ptr) {
                   11598: 
                   11599:                        currTar_Info->TarSelQ_Tail = q_ptr->Sccb_backlink;
                   11600:                        }
                   11601: 
                   11602:                 if (q_ptr->Sccb_forwardlink != NULL) {
                   11603:                        q_ptr->Sccb_forwardlink->Sccb_backlink = q_ptr->Sccb_backlink;
                   11604:                        }
                   11605: 
                   11606:                 if (q_ptr->Sccb_backlink != NULL) {
                   11607:                        q_ptr->Sccb_backlink->Sccb_forwardlink = q_ptr->Sccb_forwardlink;
                   11608:                        }
                   11609: 
                   11610:                 currTar_Info->TarSelQ_Cnt--;
                   11611: 
                   11612:                 return(TRUE);
                   11613:                 }
                   11614: 
                   11615:          else {
                   11616:                 q_ptr = q_ptr->Sccb_forwardlink;
                   11617:                 }
                   11618:          }
                   11619: 
                   11620: 
                   11621:    return(FALSE);
                   11622: 
                   11623: }
                   11624: 
                   11625: 
                   11626: /*---------------------------------------------------------------------
                   11627:  *
                   11628:  * Function: Utility Update Residual Count
                   11629:  *
                   11630:  * Description: Update the XferCnt to the remaining byte count.
                   11631:  *              If we transferred all the data then just write zero.
                   11632:  *              If Non-SG transfer then report Total Cnt - Actual Transfer
                   11633:  *              Cnt.  For SG transfers add the count fields of all
                   11634:  *              remaining SG elements, as well as any partial remaining
                   11635:  *              element.
                   11636:  *
                   11637:  *---------------------------------------------------------------------*/
                   11638: 
                   11639: void  utilUpdateResidual(PSCCB p_SCCB)
                   11640: {
                   11641:    ULONG partial_cnt;
                   11642:    UINT  sg_index;
                   11643: #if defined(COMPILER_16_BIT) && !defined(DOS)
                   11644:    ULONG far *sg_ptr;
                   11645: #else
                   11646:    ULONG *sg_ptr;
                   11647: #endif
                   11648: 
                   11649:    if (p_SCCB->Sccb_XferState & F_ALL_XFERRED) {
                   11650: 
                   11651:          p_SCCB->DataLength = 0x0000;
                   11652:          }
                   11653: 
                   11654:    else if (p_SCCB->Sccb_XferState & F_SG_XFER) {
                   11655: 
                   11656:                 partial_cnt = 0x0000;
                   11657: 
                   11658:                 sg_index = p_SCCB->Sccb_sgseg;
                   11659: 
                   11660: #if defined(COMPILER_16_BIT) && !defined(DOS)
                   11661:                 sg_ptr = (ULONG far *)p_SCCB->DataPointer;
                   11662: #else
                   11663:                 sg_ptr = (ULONG *)p_SCCB->DataPointer;
                   11664: #endif
                   11665: 
                   11666:                 if (p_SCCB->Sccb_SGoffset) {
                   11667: 
                   11668:                        partial_cnt = p_SCCB->Sccb_SGoffset;
                   11669:                        sg_index++;
                   11670:                        }
                   11671: 
                   11672:                 while ( ((ULONG)sg_index * (ULONG)SG_ELEMENT_SIZE) <
                   11673:                        p_SCCB->DataLength ) {
                   11674: 
                   11675:                        partial_cnt += *(sg_ptr+(sg_index * 2));
                   11676:                        sg_index++;
                   11677:                        }
                   11678: 
                   11679:                 p_SCCB->DataLength = partial_cnt;
                   11680:                 }
                   11681: 
                   11682:          else {
                   11683: 
                   11684:                 p_SCCB->DataLength -= p_SCCB->Sccb_ATC;
                   11685:                 }
                   11686: }
                   11687: 
                   11688: 
                   11689: /*---------------------------------------------------------------------
                   11690:  *
                   11691:  * Function: Wait 1 Second
                   11692:  *
                   11693:  * Description: Wait for 1 second.
                   11694:  *
                   11695:  *---------------------------------------------------------------------*/
                   11696: 
                   11697: #if defined(DOS)
                   11698: void Wait1Second(USHORT p_port)
                   11699: #else
                   11700: void Wait1Second(ULONG p_port)
                   11701: #endif
                   11702: {
                   11703:    UCHAR i;
                   11704: 
                   11705:    for(i=0; i < 4; i++) {
                   11706: 
                   11707:          Wait(p_port, TO_250ms);
                   11708: 
                   11709:          if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST))
                   11710:                 break;
                   11711: 
                   11712:          if((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL))
                   11713:                 break;
                   11714:          }
                   11715: }
                   11716: 
                   11717: 
                   11718: /*---------------------------------------------------------------------
                   11719:  *
                   11720:  * Function: Wait
                   11721:  *
                   11722:  * Description: Wait the desired delay.
                   11723:  *
                   11724:  *---------------------------------------------------------------------*/
                   11725: 
                   11726: #if defined(DOS)
                   11727: void Wait(USHORT p_port, UCHAR p_delay)
                   11728: #else
                   11729: void Wait(ULONG p_port, UCHAR p_delay)
                   11730: #endif
                   11731: {
                   11732:    UCHAR old_timer;
                   11733:    UCHAR green_flag;
                   11734: 
                   11735:    old_timer = RD_HARPOON(p_port+hp_seltimeout);
                   11736: 
                   11737:    green_flag=RD_HARPOON(p_port+hp_clkctrl_0);
                   11738:    WR_HARPOON(p_port+hp_clkctrl_0, CLKCTRL_DEFAULT);
                   11739: 
                   11740:    WR_HARPOON(p_port+hp_seltimeout,p_delay);
                   11741:    WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
                   11742:    WRW_HARPOON((p_port+hp_intena), (default_intena & ~TIMEOUT));
                   11743: 
                   11744: 
                   11745:    WR_HARPOON(p_port+hp_portctrl_0,
                   11746:          (RD_HARPOON(p_port+hp_portctrl_0) | START_TO));
                   11747: 
                   11748:    while (!(RDW_HARPOON((p_port+hp_intstat)) & TIMEOUT)) {
                   11749: 
                   11750:          if ((RD_HARPOON(p_port+hp_scsictrl_0) & SCSI_RST))
                   11751:                 break;
                   11752: 
                   11753:          if ((RDW_HARPOON((p_port+hp_intstat)) & SCAM_SEL))
                   11754:                 break;
                   11755:          }
                   11756: 
                   11757:    WR_HARPOON(p_port+hp_portctrl_0,
                   11758:          (RD_HARPOON(p_port+hp_portctrl_0) & ~START_TO));
                   11759: 
                   11760:    WRW_HARPOON((p_port+hp_intstat), TIMEOUT);
                   11761:    WRW_HARPOON((p_port+hp_intena), default_intena);
                   11762: 
                   11763:    WR_HARPOON(p_port+hp_clkctrl_0,green_flag);
                   11764: 
                   11765:    WR_HARPOON(p_port+hp_seltimeout,old_timer);
                   11766: }
                   11767: 
                   11768: 
                   11769: /*---------------------------------------------------------------------
                   11770:  *
                   11771:  * Function: Enable/Disable Write to EEPROM
                   11772:  *
                   11773:  * Description: The EEPROM must first be enabled for writes
                   11774:  *              A total of 9 clocks are needed.
                   11775:  *
                   11776:  *---------------------------------------------------------------------*/
                   11777: 
                   11778: #if defined(DOS)
                   11779: void utilEEWriteOnOff(USHORT p_port,UCHAR p_mode)
                   11780: #else
                   11781: void utilEEWriteOnOff(ULONG p_port,UCHAR p_mode)
                   11782: #endif
                   11783: {
                   11784:    UCHAR ee_value;
                   11785: 
                   11786:    ee_value = (UCHAR)(RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H));
                   11787: 
                   11788:    if (p_mode)
                   11789: 
                   11790:          utilEESendCmdAddr(p_port, EWEN, EWEN_ADDR);
                   11791: 
                   11792:    else
                   11793: 
                   11794: 
                   11795:          utilEESendCmdAddr(p_port, EWDS, EWDS_ADDR);
                   11796: 
                   11797:    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
                   11798:    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);       /*Turn off Master Select */
                   11799: }
                   11800: 
                   11801: 
                   11802: /*---------------------------------------------------------------------
                   11803:  *
                   11804:  * Function: Write EEPROM
                   11805:  *
                   11806:  * Description: Write a word to the EEPROM at the specified
                   11807:  *              address.
                   11808:  *
                   11809:  *---------------------------------------------------------------------*/
                   11810: 
                   11811: #if defined(DOS)
                   11812: void utilEEWrite(USHORT p_port, USHORT ee_data, USHORT ee_addr)
                   11813: #else
                   11814: void utilEEWrite(ULONG p_port, USHORT ee_data, USHORT ee_addr)
                   11815: #endif
                   11816: {
                   11817: 
                   11818:    UCHAR ee_value;
                   11819:    USHORT i;
                   11820: 
                   11821:    ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))|
                   11822:                   (SEE_MS | SEE_CS));
                   11823: 
                   11824: 
                   11825: 
                   11826:    utilEESendCmdAddr(p_port, EE_WRITE, ee_addr);
                   11827: 
                   11828: 
                   11829:    ee_value |= (SEE_MS + SEE_CS);
                   11830: 
                   11831:    for(i = 0x8000; i != 0; i>>=1) {
                   11832: 
                   11833:          if (i & ee_data)
                   11834:         ee_value |= SEE_DO;
                   11835:          else
                   11836:         ee_value &= ~SEE_DO;
                   11837: 
                   11838:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11839:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11840:          ee_value |= SEE_CLK;          /* Clock  data! */
                   11841:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11842:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11843:          ee_value &= ~SEE_CLK;
                   11844:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11845:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11846:          }
                   11847:    ee_value &= (EXT_ARB_ACK | SCSI_TERM_ENA_H);
                   11848:    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS));
                   11849: 
                   11850:    Wait(p_port, TO_10ms);
                   11851: 
                   11852:    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS | SEE_CS)); /* Set CS to EEPROM */
                   11853:    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS));       /* Turn off CS */
                   11854:    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);       /* Turn off Master Select */
                   11855: }
                   11856: 
                   11857: /*---------------------------------------------------------------------
                   11858:  *
                   11859:  * Function: Read EEPROM
                   11860:  *
                   11861:  * Description: Read a word from the EEPROM at the desired
                   11862:  *              address.
                   11863:  *
                   11864:  *---------------------------------------------------------------------*/
                   11865: 
                   11866: #if defined(DOS)
                   11867: USHORT utilEERead(USHORT p_port, USHORT ee_addr)
                   11868: #else
                   11869: USHORT utilEERead(ULONG p_port, USHORT ee_addr)
                   11870: #endif
                   11871: {
                   11872:    USHORT i, ee_data1, ee_data2;
                   11873: 
                   11874:        i = 0;
                   11875:        ee_data1 = utilEEReadOrg(p_port, ee_addr);
                   11876:        do
                   11877:        {
                   11878:                ee_data2 = utilEEReadOrg(p_port, ee_addr);
                   11879: 
                   11880:                if(ee_data1 == ee_data2)
                   11881:                        return(ee_data1);
                   11882: 
                   11883:                ee_data1 = ee_data2;
                   11884:                i++;
                   11885: 
                   11886:        }while(i < 4);
                   11887: 
                   11888:        return(ee_data1);
                   11889: }
                   11890: 
                   11891: /*---------------------------------------------------------------------
                   11892:  *
                   11893:  * Function: Read EEPROM Original 
                   11894:  *
                   11895:  * Description: Read a word from the EEPROM at the desired
                   11896:  *              address.
                   11897:  *
                   11898:  *---------------------------------------------------------------------*/
                   11899: 
                   11900: #if defined(DOS)
                   11901: USHORT utilEEReadOrg(USHORT p_port, USHORT ee_addr)
                   11902: #else
                   11903: USHORT utilEEReadOrg(ULONG p_port, USHORT ee_addr)
                   11904: #endif
                   11905: {
                   11906: 
                   11907:    UCHAR ee_value;
                   11908:    USHORT i, ee_data;
                   11909: 
                   11910:    ee_value = (UCHAR)((RD_HARPOON(p_port+hp_ee_ctrl) & (EXT_ARB_ACK | SCSI_TERM_ENA_H))|
                   11911:                   (SEE_MS | SEE_CS));
                   11912: 
                   11913: 
                   11914:    utilEESendCmdAddr(p_port, EE_READ, ee_addr);
                   11915: 
                   11916: 
                   11917:    ee_value |= (SEE_MS + SEE_CS);
                   11918:    ee_data = 0;
                   11919: 
                   11920:    for(i = 1; i <= 16; i++) {
                   11921: 
                   11922:          ee_value |= SEE_CLK;          /* Clock  data! */
                   11923:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11924:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11925:          ee_value &= ~SEE_CLK;
                   11926:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11927:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11928: 
                   11929:          ee_data <<= 1;
                   11930: 
                   11931:          if (RD_HARPOON(p_port+hp_ee_ctrl) & SEE_DI)
                   11932:                 ee_data |= 1;
                   11933:          }
                   11934: 
                   11935:    ee_value &= ~(SEE_MS + SEE_CS);
                   11936:    WR_HARPOON(p_port+hp_ee_ctrl, (ee_value | SEE_MS)); /*Turn off CS */
                   11937:    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);   /*Turn off Master Select */
                   11938: 
                   11939:    return(ee_data);
                   11940: }
                   11941: 
                   11942: 
                   11943: /*---------------------------------------------------------------------
                   11944:  *
                   11945:  * Function: Send EE command and Address to the EEPROM
                   11946:  *
                   11947:  * Description: Transfers the correct command and sends the address
                   11948:  *              to the eeprom.
                   11949:  *
                   11950:  *---------------------------------------------------------------------*/
                   11951: 
                   11952: #if defined(DOS)
                   11953: void utilEESendCmdAddr(USHORT p_port, UCHAR ee_cmd, USHORT ee_addr)
                   11954: #else
                   11955: void utilEESendCmdAddr(ULONG p_port, UCHAR ee_cmd, USHORT ee_addr)
                   11956: #endif
                   11957: {
                   11958:    UCHAR ee_value;
                   11959:    UCHAR narrow_flg;
                   11960: 
                   11961:    USHORT i;
                   11962: 
                   11963: 
                   11964:    narrow_flg= (UCHAR)(RD_HARPOON(p_port+hp_page_ctrl) & NARROW_SCSI_CARD);
                   11965: 
                   11966: 
                   11967:    ee_value = SEE_MS;
                   11968:    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11969: 
                   11970:    ee_value |= SEE_CS;                             /* Set CS to EEPROM */
                   11971:    WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11972: 
                   11973: 
                   11974:    for(i = 0x04; i != 0; i>>=1) {
                   11975: 
                   11976:          if (i & ee_cmd)
                   11977:                 ee_value |= SEE_DO;
                   11978:          else
                   11979:                 ee_value &= ~SEE_DO;
                   11980: 
                   11981:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11982:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11983:          ee_value |= SEE_CLK;                         /* Clock  data! */
                   11984:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11985:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11986:          ee_value &= ~SEE_CLK;
                   11987:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11988:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   11989:          }
                   11990: 
                   11991: 
                   11992:    if (narrow_flg)
                   11993:          i = 0x0080;
                   11994: 
                   11995:    else
                   11996:          i = 0x0200;
                   11997: 
                   11998: 
                   11999:    while (i != 0) {
                   12000: 
                   12001:          if (i & ee_addr)
                   12002:                 ee_value |= SEE_DO;
                   12003:          else
                   12004:                 ee_value &= ~SEE_DO;
                   12005: 
                   12006:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   12007:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   12008:          ee_value |= SEE_CLK;                         /* Clock  data! */
                   12009:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   12010:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   12011:          ee_value &= ~SEE_CLK;
                   12012:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   12013:          WR_HARPOON(p_port+hp_ee_ctrl, ee_value);
                   12014: 
                   12015:          i >>= 1;
                   12016:          }
                   12017: }
                   12018: 
                   12019: USHORT CalcCrc16(UCHAR buffer[])
                   12020: {
                   12021:    USHORT crc=0;
                   12022:        int i,j;
                   12023:    USHORT ch;
                   12024:    for (i=0; i < ID_STRING_LENGTH; i++)
                   12025:    {
                   12026:       ch = (USHORT) buffer[i];
                   12027:           for(j=0; j < 8; j++)
                   12028:           {
                   12029:                   if ((crc ^ ch) & 1)
                   12030:             crc = (crc >> 1) ^ CRCMASK;
                   12031:                   else
                   12032:             crc >>= 1;
                   12033:                   ch >>= 1;
                   12034:           }
                   12035:    }
                   12036:        return(crc);
                   12037: }
                   12038: 
                   12039: UCHAR CalcLrc(UCHAR buffer[])
                   12040: {
                   12041:        int i;
                   12042:        UCHAR lrc;
                   12043:        lrc = 0;
                   12044:        for(i = 0; i < ID_STRING_LENGTH; i++)
                   12045:                lrc ^= buffer[i];
                   12046:        return(lrc);
                   12047: }
                   12048: 
                   12049: 
                   12050: 
                   12051: /*
                   12052:   The following inline definitions avoid type conflicts.
                   12053: */
                   12054: 
                   12055: static inline unsigned char
                   12056: FlashPoint__ProbeHostAdapter(FlashPoint_Info_T *FlashPointInfo)
                   12057: {
                   12058:   return FlashPoint_ProbeHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
                   12059: }
                   12060: 
                   12061: 
                   12062: static inline FlashPoint_CardHandle_T
                   12063: FlashPoint__HardwareResetHostAdapter(FlashPoint_Info_T *FlashPointInfo)
                   12064: {
                   12065:   return FlashPoint_HardwareResetHostAdapter((PSCCBMGR_INFO) FlashPointInfo);
                   12066: }
                   12067: 
                   12068: static inline void
                   12069: FlashPoint__ReleaseHostAdapter(FlashPoint_CardHandle_T CardHandle)
                   12070: {
                   12071:   FlashPoint_ReleaseHostAdapter(CardHandle);
                   12072: }
                   12073: 
                   12074: 
                   12075: static inline void
                   12076: FlashPoint__StartCCB(FlashPoint_CardHandle_T CardHandle, BusLogic_CCB_T *CCB)
                   12077: {
                   12078:   FlashPoint_StartCCB(CardHandle, (PSCCB) CCB);
                   12079: }
                   12080: 
                   12081: 
                   12082: static inline void
                   12083: FlashPoint__AbortCCB(FlashPoint_CardHandle_T CardHandle, BusLogic_CCB_T *CCB)
                   12084: {
                   12085:   FlashPoint_AbortCCB(CardHandle, (PSCCB) CCB);
                   12086: }
                   12087: 
                   12088: 
                   12089: static inline boolean
                   12090: FlashPoint__InterruptPending(FlashPoint_CardHandle_T CardHandle)
                   12091: {
                   12092:   return FlashPoint_InterruptPending(CardHandle);
                   12093: }
                   12094: 
                   12095: 
                   12096: static inline int
                   12097: FlashPoint__HandleInterrupt(FlashPoint_CardHandle_T CardHandle)
                   12098: {
                   12099:   return FlashPoint_HandleInterrupt(CardHandle);
                   12100: }
                   12101: 
                   12102: 
                   12103: #define FlashPoint_ProbeHostAdapter        FlashPoint__ProbeHostAdapter
                   12104: #define FlashPoint_HardwareResetHostAdapter FlashPoint__HardwareResetHostAdapter
                   12105: #define FlashPoint_ReleaseHostAdapter      FlashPoint__ReleaseHostAdapter
                   12106: #define FlashPoint_StartCCB                FlashPoint__StartCCB
                   12107: #define FlashPoint_AbortCCB                FlashPoint__AbortCCB
                   12108: #define FlashPoint_InterruptPending        FlashPoint__InterruptPending
                   12109: #define FlashPoint_HandleInterrupt         FlashPoint__HandleInterrupt
                   12110: 
                   12111: 
                   12112: /*
                   12113:   FlashPoint_InquireTargetInfo returns the Synchronous Period, Synchronous
                   12114:   Offset, and Wide Transfers Active information for TargetID on CardHandle.
                   12115: */
                   12116: 
                   12117: void FlashPoint_InquireTargetInfo(FlashPoint_CardHandle_T CardHandle,
                   12118:                                  int TargetID,
                   12119:                                  unsigned char *SynchronousPeriod,
                   12120:                                  unsigned char *SynchronousOffset,
                   12121:                                  unsigned char *WideTransfersActive)
                   12122: {
                   12123:   SCCBMGR_TAR_INFO *TargetInfo =
                   12124:     &sccbMgrTbl[((SCCBCARD *)CardHandle)->cardIndex][TargetID];
                   12125:   if ((TargetInfo->TarSyncCtrl & SYNC_OFFSET) > 0)
                   12126:     {
                   12127:       *SynchronousPeriod = 5 * ((TargetInfo->TarSyncCtrl >> 5) + 1);
                   12128:       *SynchronousOffset = TargetInfo->TarSyncCtrl & SYNC_OFFSET;
                   12129:     }
                   12130:   else
                   12131:     {
                   12132:       *SynchronousPeriod = 0;
                   12133:       *SynchronousOffset = 0;
                   12134:     }
                   12135:   *WideTransfersActive = (TargetInfo->TarSyncCtrl & NARROW_SCSI ? 0 : 1);
                   12136: }
                   12137: 
                   12138: 
                   12139: #else  /* CONFIG_SCSI_OMIT_FLASHPOINT */
                   12140: 
                   12141: 
                   12142: /*
                   12143:   Define prototypes for the FlashPoint SCCB Manager Functions.
                   12144: */
                   12145: 
                   12146: extern unsigned char FlashPoint_ProbeHostAdapter(FlashPoint_Info_T *);
                   12147: extern FlashPoint_CardHandle_T
                   12148:        FlashPoint_HardwareResetHostAdapter(FlashPoint_Info_T *);
                   12149: extern void FlashPoint_StartCCB(FlashPoint_CardHandle_T, BusLogic_CCB_T *);
                   12150: extern int FlashPoint_AbortCCB(FlashPoint_CardHandle_T, BusLogic_CCB_T *);
                   12151: extern boolean FlashPoint_InterruptPending(FlashPoint_CardHandle_T);
                   12152: extern int FlashPoint_HandleInterrupt(FlashPoint_CardHandle_T);
                   12153: extern void FlashPoint_ReleaseHostAdapter(FlashPoint_CardHandle_T);
                   12154: extern void FlashPoint_InquireTargetInfo(FlashPoint_CardHandle_T,
                   12155:                                         int, unsigned char *,
                   12156:                                         unsigned char *, unsigned char *);
                   12157: 
                   12158: 
                   12159: #endif /* CONFIG_SCSI_OMIT_FLASHPOINT */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.