Annotation of Gnu-Mach/linux/src/drivers/scsi/FlashPoint.c, revision 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.