Annotation of Gnu-Mach/linux/src/drivers/scsi/BusLogic.h, revision 1.1

1.1     ! root        1: /*
        !             2: 
        !             3:   Linux Driver for BusLogic MultiMaster and FlashPoint SCSI Host Adapters
        !             4: 
        !             5:   Copyright 1995-1998 by Leonard N. Zubkoff <[email protected]>
        !             6: 
        !             7:   This program is free software; you may redistribute and/or modify it under
        !             8:   the terms of the GNU General Public License Version 2 as published by the
        !             9:   Free Software Foundation.
        !            10: 
        !            11:   This program is distributed in the hope that it will be useful, but
        !            12:   WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
        !            13:   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
        !            14:   for complete details.
        !            15: 
        !            16:   The author respectfully requests that any modifications to this software be
        !            17:   sent directly to him for evaluation and testing.
        !            18: 
        !            19:   Special thanks to Wayne Yen, Jin-Lon Hon, and Alex Win of BusLogic, whose
        !            20:   advice has been invaluable, to David Gentzel, for writing the original Linux
        !            21:   BusLogic driver, and to Paul Gortmaker, for being such a dedicated test site.
        !            22: 
        !            23:   Finally, special thanks to Mylex/BusLogic for making the FlashPoint SCCB
        !            24:   Manager available as freely redistributable source code.
        !            25: 
        !            26: */
        !            27: 
        !            28: 
        !            29: #include <linux/config.h>
        !            30: 
        !            31: 
        !            32: /*
        !            33:   Define types for some of the structures that interface with the rest
        !            34:   of the Linux Kernel and SCSI Subsystem.
        !            35: */
        !            36: 
        !            37: typedef kdev_t KernelDevice_T;
        !            38: typedef struct proc_dir_entry PROC_DirectoryEntry_T;
        !            39: typedef unsigned long ProcessorFlags_T;
        !            40: typedef struct pt_regs Registers_T;
        !            41: typedef struct partition PartitionTable_T;
        !            42: typedef Scsi_Host_Template SCSI_Host_Template_T;
        !            43: typedef struct Scsi_Host SCSI_Host_T;
        !            44: typedef struct scsi_device SCSI_Device_T;
        !            45: typedef struct scsi_disk SCSI_Disk_T;
        !            46: typedef struct scsi_cmnd SCSI_Command_T;
        !            47: typedef struct scatterlist SCSI_ScatterList_T;
        !            48: 
        !            49: 
        !            50: /*
        !            51:   Define prototypes for the BusLogic Driver Interface Functions.
        !            52: */
        !            53: 
        !            54: extern PROC_DirectoryEntry_T BusLogic_ProcDirectoryEntry;
        !            55: extern const char *BusLogic_DriverInfo(SCSI_Host_T *);
        !            56: extern int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *);
        !            57: extern int BusLogic_ReleaseHostAdapter(SCSI_Host_T *);
        !            58: extern int BusLogic_QueueCommand(SCSI_Command_T *,
        !            59:                                 void (*CompletionRoutine)(SCSI_Command_T *));
        !            60: extern int BusLogic_AbortCommand(SCSI_Command_T *);
        !            61: extern int BusLogic_ResetCommand(SCSI_Command_T *, unsigned int);
        !            62: extern int BusLogic_BIOSDiskParameters(SCSI_Disk_T *, KernelDevice_T, int *);
        !            63: extern int BusLogic_ProcDirectoryInfo(char *, char **, off_t, int, int, int);
        !            64: 
        !            65: 
        !            66: /*
        !            67:   Define the BusLogic SCSI Host Template structure.
        !            68: */
        !            69: 
        !            70: #define BUSLOGIC                                                              \
        !            71:   { proc_dir:       &BusLogic_ProcDirectoryEntry, /* ProcFS Directory Entry */ \
        !            72:     proc_info:      BusLogic_ProcDirectoryInfo,          /* ProcFS Info Function   */ \
        !            73:     name:           "BusLogic",                          /* Driver Name            */ \
        !            74:     detect:         BusLogic_DetectHostAdapter,          /* Detect Host Adapter    */ \
        !            75:     release:        BusLogic_ReleaseHostAdapter,  /* Release Host Adapter   */ \
        !            76:     info:           BusLogic_DriverInfo,         /* Driver Info Function   */ \
        !            77:     queuecommand:   BusLogic_QueueCommand,       /* Queue Command Function */ \
        !            78:     abort:          BusLogic_AbortCommand,       /* Abort Command Function */ \
        !            79:     reset:          BusLogic_ResetCommand,       /* Reset Command Function */ \
        !            80:     bios_param:     BusLogic_BIOSDiskParameters,  /* BIOS Disk Parameters   */ \
        !            81:     unchecked_isa_dma: 1,                        /* Default Initial Value  */ \
        !            82:     use_clustering: ENABLE_CLUSTERING }                  /* Enable Clustering      */
        !            83: 
        !            84: 
        !            85: /*
        !            86:   BusLogic_DriverVersion protects the private portion of this file.
        !            87: */
        !            88: 
        !            89: #ifdef BusLogic_DriverVersion
        !            90: 
        !            91: 
        !            92: /*
        !            93:   FlashPoint support is only available for the Intel x86 Architecture with
        !            94:   CONFIG_PCI set.
        !            95: */
        !            96: 
        !            97: #ifndef __i386__
        !            98: #undef CONFIG_SCSI_OMIT_FLASHPOINT
        !            99: #define CONFIG_SCSI_OMIT_FLASHPOINT
        !           100: #endif
        !           101: 
        !           102: #ifndef CONFIG_PCI
        !           103: #undef CONFIG_SCSI_OMIT_FLASHPOINT
        !           104: #define CONFIG_SCSI_OMIT_FLASHPOINT
        !           105: #define BusLogic_InitializeProbeInfoListISA \
        !           106:   BusLogic_InitializeProbeInfoList
        !           107: #endif
        !           108: 
        !           109: 
        !           110: /*
        !           111:   Define the maximum number of BusLogic Host Adapters supported by this driver.
        !           112: */
        !           113: 
        !           114: #define BusLogic_MaxHostAdapters               16
        !           115: 
        !           116: 
        !           117: /*
        !           118:   Define the maximum number of Target Devices supported by this driver.
        !           119: */
        !           120: 
        !           121: #define BusLogic_MaxTargetDevices              16
        !           122: 
        !           123: 
        !           124: /*
        !           125:   Define the maximum number of Scatter/Gather Segments used by this driver.
        !           126:   For optimal performance, it is important that this limit be at least as
        !           127:   large as the largest single request generated by the I/O Subsystem.
        !           128: */
        !           129: 
        !           130: #define BusLogic_ScatterGatherLimit            128
        !           131: 
        !           132: 
        !           133: /*
        !           134:   Define the maximum, maximum automatic, minimum automatic, and default Queue
        !           135:   Depth to allow for Target Devices depending on whether or not they support
        !           136:   Tagged Queuing and whether or not ISA Bounce Buffers are required.
        !           137: */
        !           138: 
        !           139: #define BusLogic_MaxTaggedQueueDepth           64
        !           140: #define BusLogic_MaxAutomaticTaggedQueueDepth  28
        !           141: #define BusLogic_MinAutomaticTaggedQueueDepth  7
        !           142: #define BusLogic_TaggedQueueDepthBB            3
        !           143: #define BusLogic_UntaggedQueueDepth            3
        !           144: #define BusLogic_UntaggedQueueDepthBB          2
        !           145: 
        !           146: 
        !           147: /*
        !           148:   Define the default amount of time in seconds to wait between a Host Adapter
        !           149:   Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI commands.
        !           150:   Some SCSI devices get confused if they receive SCSI commands too soon after
        !           151:   a SCSI Bus Reset.
        !           152: */
        !           153: 
        !           154: #define BusLogic_DefaultBusSettleTime          2
        !           155: 
        !           156: 
        !           157: /*
        !           158:   Define the maximum number of Mailboxes that should be used for MultiMaster
        !           159:   Host Adapters.  This number is chosen to be larger than the maximum Host
        !           160:   Adapter Queue Depth and small enough so that the Host Adapter structure
        !           161:   does not cross an allocation block size boundary.
        !           162: */
        !           163: 
        !           164: #define BusLogic_MaxMailboxes                  211
        !           165: 
        !           166: 
        !           167: /*
        !           168:   Define the number of CCBs that should be allocated as a group to optimize
        !           169:   Kernel memory allocation.
        !           170: */
        !           171: 
        !           172: #define BusLogic_CCB_AllocationGroupSize       7
        !           173: 
        !           174: 
        !           175: /*
        !           176:   Define the Host Adapter Line and Message Buffer Sizes.
        !           177: */
        !           178: 
        !           179: #define BusLogic_LineBufferSize                        100
        !           180: #define BusLogic_MessageBufferSize             9700
        !           181: 
        !           182: 
        !           183: /*
        !           184:   Define the Driver Message Levels.
        !           185: */
        !           186: 
        !           187: typedef enum BusLogic_MessageLevel
        !           188: {
        !           189:   BusLogic_AnnounceLevel =                     0,
        !           190:   BusLogic_InfoLevel =                         1,
        !           191:   BusLogic_NoticeLevel =                       2,
        !           192:   BusLogic_WarningLevel =                      3,
        !           193:   BusLogic_ErrorLevel =                                4
        !           194: }
        !           195: BusLogic_MessageLevel_T;
        !           196: 
        !           197: static char
        !           198:   *BusLogic_MessageLevelMap[] =
        !           199:     { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING, KERN_ERR };
        !           200: 
        !           201: 
        !           202: /*
        !           203:   Define Driver Message macros.
        !           204: */
        !           205: 
        !           206: #define BusLogic_Announce(Format, Arguments...) \
        !           207:   BusLogic_Message(BusLogic_AnnounceLevel, Format, ##Arguments)
        !           208: 
        !           209: #define BusLogic_Info(Format, Arguments...) \
        !           210:   BusLogic_Message(BusLogic_InfoLevel, Format, ##Arguments)
        !           211: 
        !           212: #define BusLogic_Notice(Format, Arguments...) \
        !           213:   BusLogic_Message(BusLogic_NoticeLevel, Format, ##Arguments)
        !           214: 
        !           215: #define BusLogic_Warning(Format, Arguments...) \
        !           216:   BusLogic_Message(BusLogic_WarningLevel, Format, ##Arguments)
        !           217: 
        !           218: #define BusLogic_Error(Format, Arguments...) \
        !           219:   BusLogic_Message(BusLogic_ErrorLevel, Format, ##Arguments)
        !           220: 
        !           221: 
        !           222: /*
        !           223:   Define the types of BusLogic Host Adapters that are supported and the number
        !           224:   of I/O Addresses required by each type.
        !           225: */
        !           226: 
        !           227: typedef enum
        !           228: {
        !           229:   BusLogic_MultiMaster =                       1,
        !           230:   BusLogic_FlashPoint =                                2
        !           231: }
        !           232: __attribute__ ((packed))
        !           233: BusLogic_HostAdapterType_T;
        !           234: 
        !           235: #define BusLogic_MultiMasterAddressCount       4
        !           236: #define BusLogic_FlashPointAddressCount                256
        !           237: 
        !           238: static int
        !           239:   BusLogic_HostAdapterAddressCount[3] =
        !           240:     { 0, BusLogic_MultiMasterAddressCount, BusLogic_FlashPointAddressCount };
        !           241: 
        !           242: 
        !           243: /*
        !           244:   Define macros for testing the Host Adapter Type.
        !           245: */
        !           246: 
        !           247: #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
        !           248: 
        !           249: #define BusLogic_MultiMasterHostAdapterP(HostAdapter) \
        !           250:   (HostAdapter->HostAdapterType == BusLogic_MultiMaster)
        !           251: 
        !           252: #define BusLogic_FlashPointHostAdapterP(HostAdapter) \
        !           253:   (HostAdapter->HostAdapterType == BusLogic_FlashPoint)
        !           254: 
        !           255: #else
        !           256: 
        !           257: #define BusLogic_MultiMasterHostAdapterP(HostAdapter) \
        !           258:   (true)
        !           259: 
        !           260: #define BusLogic_FlashPointHostAdapterP(HostAdapter) \
        !           261:   (false)
        !           262: 
        !           263: #endif
        !           264: 
        !           265: 
        !           266: /*
        !           267:   Define the possible Host Adapter Bus Types.
        !           268: */
        !           269: 
        !           270: typedef enum
        !           271: {
        !           272:   BusLogic_Unknown_Bus =                       0,
        !           273:   BusLogic_ISA_Bus =                           1,
        !           274:   BusLogic_EISA_Bus =                          2,
        !           275:   BusLogic_PCI_Bus =                           3,
        !           276:   BusLogic_VESA_Bus =                          4,
        !           277:   BusLogic_MCA_Bus =                           5
        !           278: }
        !           279: __attribute__ ((packed))
        !           280: BusLogic_HostAdapterBusType_T;
        !           281: 
        !           282: static char
        !           283:   *BusLogic_HostAdapterBusNames[] =
        !           284:     { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" };
        !           285: 
        !           286: static BusLogic_HostAdapterBusType_T
        !           287:   BusLogic_HostAdapterBusTypes[] =
        !           288:     { BusLogic_VESA_Bus,                               /* BT-4xx */
        !           289:       BusLogic_ISA_Bus,                                        /* BT-5xx */
        !           290:       BusLogic_MCA_Bus,                                        /* BT-6xx */
        !           291:       BusLogic_EISA_Bus,                               /* BT-7xx */
        !           292:       BusLogic_Unknown_Bus,                            /* BT-8xx */
        !           293:       BusLogic_PCI_Bus };                              /* BT-9xx */
        !           294: 
        !           295: 
        !           296: /*
        !           297:   Define the possible Host Adapter BIOS Disk Geometry Translations.
        !           298: */
        !           299: 
        !           300: typedef enum BusLogic_BIOS_DiskGeometryTranslation
        !           301: {
        !           302:   BusLogic_BIOS_Disk_Not_Installed =           0,
        !           303:   BusLogic_BIOS_Disk_Installed_64x32 =         1,
        !           304:   BusLogic_BIOS_Disk_Installed_128x32 =                2,
        !           305:   BusLogic_BIOS_Disk_Installed_255x63 =                3
        !           306: }
        !           307: __attribute__ ((packed))
        !           308: BusLogic_BIOS_DiskGeometryTranslation_T;
        !           309: 
        !           310: 
        !           311: /*
        !           312:   Define a Boolean data type.
        !           313: */
        !           314: 
        !           315: typedef enum { false, true } __attribute__ ((packed)) boolean;
        !           316: 
        !           317: 
        !           318: /*
        !           319:   Define a 32 bit I/O Address data type.
        !           320: */
        !           321: 
        !           322: typedef unsigned int BusLogic_IO_Address_T;
        !           323: 
        !           324: 
        !           325: /*
        !           326:   Define a 32 bit PCI Bus Address data type.
        !           327: */
        !           328: 
        !           329: typedef unsigned int BusLogic_PCI_Address_T;
        !           330: 
        !           331: 
        !           332: /*
        !           333:   Define a 32 bit Base Address data type.
        !           334: */
        !           335: 
        !           336: typedef unsigned int BusLogic_Base_Address_T;
        !           337: 
        !           338: 
        !           339: /*
        !           340:   Define a 32 bit Bus Address data type.
        !           341: */
        !           342: 
        !           343: typedef unsigned int BusLogic_BusAddress_T;
        !           344: 
        !           345: 
        !           346: /*
        !           347:   Define a 32 bit Byte Count data type.
        !           348: */
        !           349: 
        !           350: typedef unsigned int BusLogic_ByteCount_T;
        !           351: 
        !           352: 
        !           353: /*
        !           354:   Define a 10^18 Statistics Byte Counter data type.
        !           355: */
        !           356: 
        !           357: typedef struct BusLogic_ByteCounter
        !           358: {
        !           359:   unsigned int Units;
        !           360:   unsigned int Billions;
        !           361: }
        !           362: BusLogic_ByteCounter_T;
        !           363: 
        !           364: 
        !           365: /*
        !           366:   Define the structure for I/O Address and Bus Probing Information.
        !           367: */
        !           368: 
        !           369: typedef struct BusLogic_ProbeInfo
        !           370: {
        !           371:   BusLogic_HostAdapterType_T HostAdapterType;
        !           372:   BusLogic_HostAdapterBusType_T HostAdapterBusType;
        !           373:   BusLogic_IO_Address_T IO_Address;
        !           374:   BusLogic_PCI_Address_T PCI_Address;
        !           375:   unsigned char Bus;
        !           376:   unsigned char Device;
        !           377:   unsigned char IRQ_Channel;
        !           378: }
        !           379: BusLogic_ProbeInfo_T;
        !           380: 
        !           381: 
        !           382: /*
        !           383:   Define the Probe Options.
        !           384: */
        !           385: 
        !           386: typedef struct BusLogic_ProbeOptions
        !           387: {
        !           388:   boolean NoProbe:1;                                   /* Bit 0 */
        !           389:   boolean NoProbeISA:1;                                        /* Bit 1 */
        !           390:   boolean NoProbePCI:1;                                        /* Bit 2 */
        !           391:   boolean NoSortPCI:1;                                 /* Bit 3 */
        !           392:   boolean MultiMasterFirst:1;                          /* Bit 4 */
        !           393:   boolean FlashPointFirst:1;                           /* Bit 5 */
        !           394:   boolean LimitedProbeISA:1;                           /* Bit 6 */
        !           395:   boolean Probe330:1;                                  /* Bit 7 */
        !           396:   boolean Probe334:1;                                  /* Bit 8 */
        !           397:   boolean Probe230:1;                                  /* Bit 9 */
        !           398:   boolean Probe234:1;                                  /* Bit 10 */
        !           399:   boolean Probe130:1;                                  /* Bit 11 */
        !           400:   boolean Probe134:1;                                  /* Bit 12 */
        !           401: }
        !           402: BusLogic_ProbeOptions_T;
        !           403: 
        !           404: 
        !           405: /*
        !           406:   Define the Global Options.
        !           407: */
        !           408: 
        !           409: typedef struct BusLogic_GlobalOptions
        !           410: {
        !           411:   boolean TraceProbe:1;                                        /* Bit 0 */
        !           412:   boolean TraceHardwareReset:1;                                /* Bit 1 */
        !           413:   boolean TraceConfiguration:1;                                /* Bit 2 */
        !           414:   boolean TraceErrors:1;                               /* Bit 3 */
        !           415: }
        !           416: BusLogic_GlobalOptions_T;
        !           417: 
        !           418: 
        !           419: /*
        !           420:   Define the Local Options.
        !           421: */
        !           422: 
        !           423: typedef struct BusLogic_LocalOptions
        !           424: {
        !           425:   boolean InhibitTargetInquiry:1;                      /* Bit 0 */
        !           426: }
        !           427: BusLogic_LocalOptions_T;
        !           428: 
        !           429: 
        !           430: /*
        !           431:   Define the Error Recovery Strategy Options.
        !           432: */
        !           433: 
        !           434: typedef enum
        !           435: {
        !           436:   BusLogic_ErrorRecovery_Default =             0,
        !           437:   BusLogic_ErrorRecovery_BusDeviceReset =      1,
        !           438:   BusLogic_ErrorRecovery_HardReset =           2,
        !           439:   BusLogic_ErrorRecovery_None =                        3
        !           440: }
        !           441: __attribute__ ((packed))
        !           442: BusLogic_ErrorRecoveryStrategy_T;
        !           443: 
        !           444: static char
        !           445:   *BusLogic_ErrorRecoveryStrategyNames[] =
        !           446:     { "Default", "Bus Device Reset", "Hard Reset", "None" },
        !           447:   BusLogic_ErrorRecoveryStrategyLetters[] =
        !           448:     { 'D', 'B', 'H', 'N' };
        !           449: 
        !           450: 
        !           451: /*
        !           452:   Define the BusLogic SCSI Host Adapter I/O Register Offsets.
        !           453: */
        !           454: 
        !           455: #define BusLogic_ControlRegisterOffset         0       /* WO register */
        !           456: #define BusLogic_StatusRegisterOffset          0       /* RO register */
        !           457: #define BusLogic_CommandParameterRegisterOffset        1       /* WO register */
        !           458: #define BusLogic_DataInRegisterOffset          1       /* RO register */
        !           459: #define BusLogic_InterruptRegisterOffset       2       /* RO register */
        !           460: #define BusLogic_GeometryRegisterOffset                3       /* RO register */
        !           461: 
        !           462: 
        !           463: /*
        !           464:   Define the structure of the write-only Control Register.
        !           465: */
        !           466: 
        !           467: typedef union BusLogic_ControlRegister
        !           468: {
        !           469:   unsigned char All;
        !           470:   struct {
        !           471:     unsigned char :4;                                  /* Bits 0-3 */
        !           472:     boolean SCSIBusReset:1;                            /* Bit 4 */
        !           473:     boolean InterruptReset:1;                          /* Bit 5 */
        !           474:     boolean SoftReset:1;                               /* Bit 6 */
        !           475:     boolean HardReset:1;                               /* Bit 7 */
        !           476:   } Bits;
        !           477: }
        !           478: BusLogic_ControlRegister_T;
        !           479: 
        !           480: 
        !           481: /*
        !           482:   Define the structure of the read-only Status Register.
        !           483: */
        !           484: 
        !           485: typedef union BusLogic_StatusRegister
        !           486: {
        !           487:   unsigned char All;
        !           488:   struct {
        !           489:     boolean CommandInvalid:1;                          /* Bit 0 */
        !           490:     boolean Reserved:1;                                        /* Bit 1 */
        !           491:     boolean DataInRegisterReady:1;                     /* Bit 2 */
        !           492:     boolean CommandParameterRegisterBusy:1;            /* Bit 3 */
        !           493:     boolean HostAdapterReady:1;                                /* Bit 4 */
        !           494:     boolean InitializationRequired:1;                  /* Bit 5 */
        !           495:     boolean DiagnosticFailure:1;                       /* Bit 6 */
        !           496:     boolean DiagnosticActive:1;                                /* Bit 7 */
        !           497:   } Bits;
        !           498: }
        !           499: BusLogic_StatusRegister_T;
        !           500: 
        !           501: 
        !           502: /*
        !           503:   Define the structure of the read-only Interrupt Register.
        !           504: */
        !           505: 
        !           506: typedef union BusLogic_InterruptRegister
        !           507: {
        !           508:   unsigned char All;
        !           509:   struct {
        !           510:     boolean IncomingMailboxLoaded:1;                   /* Bit 0 */
        !           511:     boolean OutgoingMailboxAvailable:1;                        /* Bit 1 */
        !           512:     boolean CommandComplete:1;                         /* Bit 2 */
        !           513:     boolean ExternalBusReset:1;                                /* Bit 3 */
        !           514:     unsigned char Reserved:3;                          /* Bits 4-6 */
        !           515:     boolean InterruptValid:1;                          /* Bit 7 */
        !           516:   } Bits;
        !           517: }
        !           518: BusLogic_InterruptRegister_T;
        !           519: 
        !           520: 
        !           521: /*
        !           522:   Define the structure of the read-only Geometry Register.
        !           523: */
        !           524: 
        !           525: typedef union BusLogic_GeometryRegister
        !           526: {
        !           527:   unsigned char All;
        !           528:   struct {
        !           529:     BusLogic_BIOS_DiskGeometryTranslation_T Drive0Geometry:2; /* Bits 0-1 */
        !           530:     BusLogic_BIOS_DiskGeometryTranslation_T Drive1Geometry:2; /* Bits 2-3 */
        !           531:     unsigned char :3;                                  /* Bits 4-6 */
        !           532:     boolean ExtendedTranslationEnabled:1;              /* Bit 7 */
        !           533:   } Bits;
        !           534: }
        !           535: BusLogic_GeometryRegister_T;
        !           536: 
        !           537: 
        !           538: /*
        !           539:   Define the BusLogic SCSI Host Adapter Command Register Operation Codes.
        !           540: */
        !           541: 
        !           542: typedef enum
        !           543: {
        !           544:   BusLogic_TestCommandCompleteInterrupt =      0x00,
        !           545:   BusLogic_InitializeMailbox =                 0x01,
        !           546:   BusLogic_ExecuteMailboxCommand =             0x02,
        !           547:   BusLogic_ExecuteBIOSCommand =                        0x03,
        !           548:   BusLogic_InquireBoardID =                    0x04,
        !           549:   BusLogic_EnableOutgoingMailboxAvailableInt = 0x05,
        !           550:   BusLogic_SetSCSISelectionTimeout =           0x06,
        !           551:   BusLogic_SetPreemptTimeOnBus =               0x07,
        !           552:   BusLogic_SetTimeOffBus =                     0x08,
        !           553:   BusLogic_SetBusTransferRate =                        0x09,
        !           554:   BusLogic_InquireInstalledDevicesID0to7 =     0x0A,
        !           555:   BusLogic_InquireConfiguration =              0x0B,
        !           556:   BusLogic_EnableTargetMode =                  0x0C,
        !           557:   BusLogic_InquireSetupInformation =           0x0D,
        !           558:   BusLogic_WriteAdapterLocalRAM =              0x1A,
        !           559:   BusLogic_ReadAdapterLocalRAM =               0x1B,
        !           560:   BusLogic_WriteBusMasterChipFIFO =            0x1C,
        !           561:   BusLogic_ReadBusMasterChipFIFO =             0x1D,
        !           562:   BusLogic_EchoCommandData =                   0x1F,
        !           563:   BusLogic_HostAdapterDiagnostic =             0x20,
        !           564:   BusLogic_SetAdapterOptions =                 0x21,
        !           565:   BusLogic_InquireInstalledDevicesID8to15 =    0x23,
        !           566:   BusLogic_InquireTargetDevices =              0x24,
        !           567:   BusLogic_DisableHostAdapterInterrupt =       0x25,
        !           568:   BusLogic_InitializeExtendedMailbox =         0x81,
        !           569:   BusLogic_ExecuteSCSICommand =                        0x83,
        !           570:   BusLogic_InquireFirmwareVersion3rdDigit =    0x84,
        !           571:   BusLogic_InquireFirmwareVersionLetter =      0x85,
        !           572:   BusLogic_InquirePCIHostAdapterInformation =  0x86,
        !           573:   BusLogic_InquireHostAdapterModelNumber =     0x8B,
        !           574:   BusLogic_InquireSynchronousPeriod =          0x8C,
        !           575:   BusLogic_InquireExtendedSetupInformation =   0x8D,
        !           576:   BusLogic_EnableStrictRoundRobinMode =                0x8F,
        !           577:   BusLogic_StoreHostAdapterLocalRAM =          0x90,
        !           578:   BusLogic_FetchHostAdapterLocalRAM =          0x91,
        !           579:   BusLogic_StoreLocalDataInEEPROM =            0x92,
        !           580:   BusLogic_UploadAutoSCSICode =                        0x94,
        !           581:   BusLogic_ModifyIOAddress =                   0x95,
        !           582:   BusLogic_SetCCBFormat =                      0x96,
        !           583:   BusLogic_WriteInquiryBuffer =                        0x9A,
        !           584:   BusLogic_ReadInquiryBuffer =                 0x9B,
        !           585:   BusLogic_FlashROMUploadDownload =            0xA7,
        !           586:   BusLogic_ReadSCAMData =                      0xA8,
        !           587:   BusLogic_WriteSCAMData =                     0xA9
        !           588: }
        !           589: BusLogic_OperationCode_T;
        !           590: 
        !           591: 
        !           592: /*
        !           593:   Define the Inquire Board ID reply structure.
        !           594: */
        !           595: 
        !           596: typedef struct BusLogic_BoardID
        !           597: {
        !           598:   unsigned char BoardType;                             /* Byte 0 */
        !           599:   unsigned char CustomFeatures;                                /* Byte 1 */
        !           600:   unsigned char FirmwareVersion1stDigit;               /* Byte 2 */
        !           601:   unsigned char FirmwareVersion2ndDigit;               /* Byte 3 */
        !           602: }
        !           603: BusLogic_BoardID_T;
        !           604: 
        !           605: 
        !           606: /*
        !           607:   Define the Inquire Installed Devices ID 0 to 7 and Inquire Installed
        !           608:   Devices ID 8 to 15 reply type.  For each Target Device, a byte is returned
        !           609:   where bit 0 set indicates that Logical Unit 0 exists, bit 1 set indicates
        !           610:   that Logical Unit 1 exists, and so on.
        !           611: */
        !           612: 
        !           613: typedef unsigned char BusLogic_InstalledDevices8_T[8];
        !           614: 
        !           615: 
        !           616: /*
        !           617:   Define the Inquire Target Devices reply type.  Inquire Target Devices only
        !           618:   tests Logical Unit 0 of each Target Device unlike the Inquire Installed
        !           619:   Devices commands which test Logical Units 0 - 7.  Two bytes are returned,
        !           620:   where byte 0 bit 0 set indicates that Target Device 0 exists, and so on.
        !           621: */
        !           622: 
        !           623: typedef unsigned short BusLogic_InstalledDevices_T;
        !           624: 
        !           625: 
        !           626: /*
        !           627:   Define the Inquire Configuration reply structure.
        !           628: */
        !           629: 
        !           630: typedef struct BusLogic_Configuration
        !           631: {
        !           632:   unsigned char :5;                                    /* Byte 0 Bits 0-4 */
        !           633:   boolean DMA_Channel5:1;                              /* Byte 0 Bit 5 */
        !           634:   boolean DMA_Channel6:1;                              /* Byte 0 Bit 6 */
        !           635:   boolean DMA_Channel7:1;                              /* Byte 0 Bit 7 */
        !           636:   boolean IRQ_Channel9:1;                              /* Byte 1 Bit 0 */
        !           637:   boolean IRQ_Channel10:1;                             /* Byte 1 Bit 1 */
        !           638:   boolean IRQ_Channel11:1;                             /* Byte 1 Bit 2 */
        !           639:   boolean IRQ_Channel12:1;                             /* Byte 1 Bit 3 */
        !           640:   unsigned char :1;                                    /* Byte 1 Bit 4 */
        !           641:   boolean IRQ_Channel14:1;                             /* Byte 1 Bit 5 */
        !           642:   boolean IRQ_Channel15:1;                             /* Byte 1 Bit 6 */
        !           643:   unsigned char :1;                                    /* Byte 1 Bit 7 */
        !           644:   unsigned char HostAdapterID:4;                       /* Byte 2 Bits 0-3 */
        !           645:   unsigned char :4;                                    /* Byte 2 Bits 4-7 */
        !           646: }
        !           647: BusLogic_Configuration_T;
        !           648: 
        !           649: 
        !           650: /*
        !           651:   Define the Inquire Setup Information reply structure.
        !           652: */
        !           653: 
        !           654: typedef struct BusLogic_SynchronousValue
        !           655: {
        !           656:   unsigned char Offset:4;                              /* Bits 0-3 */
        !           657:   unsigned char TransferPeriod:3;                      /* Bits 4-6 */
        !           658:   boolean Synchronous:1;                               /* Bit 7 */
        !           659: }
        !           660: BusLogic_SynchronousValue_T;
        !           661: 
        !           662: typedef BusLogic_SynchronousValue_T
        !           663:   BusLogic_SynchronousValues8_T[8];
        !           664: 
        !           665: typedef BusLogic_SynchronousValue_T
        !           666:   BusLogic_SynchronousValues_T[BusLogic_MaxTargetDevices];
        !           667: 
        !           668: typedef struct BusLogic_SetupInformation
        !           669: {
        !           670:   boolean SynchronousInitiationEnabled:1;              /* Byte 0 Bit 0 */
        !           671:   boolean ParityCheckingEnabled:1;                     /* Byte 0 Bit 1 */
        !           672:   unsigned char :6;                                    /* Byte 0 Bits 2-7 */
        !           673:   unsigned char BusTransferRate;                       /* Byte 1 */
        !           674:   unsigned char PreemptTimeOnBus;                      /* Byte 2 */
        !           675:   unsigned char TimeOffBus;                            /* Byte 3 */
        !           676:   unsigned char MailboxCount;                          /* Byte 4 */
        !           677:   unsigned char MailboxAddress[3];                     /* Bytes 5-7 */
        !           678:   BusLogic_SynchronousValues8_T SynchronousValuesID0to7; /* Bytes 8-15 */
        !           679:   unsigned char DisconnectPermittedID0to7;             /* Byte 16 */
        !           680:   unsigned char Signature;                             /* Byte 17 */
        !           681:   unsigned char CharacterD;                            /* Byte 18 */
        !           682:   unsigned char HostBusType;                           /* Byte 19 */
        !           683:   unsigned char WideTransfersPermittedID0to7;          /* Byte 20 */
        !           684:   unsigned char WideTransfersActiveID0to7;             /* Byte 21 */
        !           685:   BusLogic_SynchronousValues8_T SynchronousValuesID8to15; /* Bytes 22-29 */
        !           686:   unsigned char DisconnectPermittedID8to15;            /* Byte 30 */
        !           687:   unsigned char :8;                                    /* Byte 31 */
        !           688:   unsigned char WideTransfersPermittedID8to15;         /* Byte 32 */
        !           689:   unsigned char WideTransfersActiveID8to15;            /* Byte 33 */
        !           690: }
        !           691: BusLogic_SetupInformation_T;
        !           692: 
        !           693: 
        !           694: /*
        !           695:   Define the Initialize Extended Mailbox request structure.
        !           696: */
        !           697: 
        !           698: typedef struct BusLogic_ExtendedMailboxRequest
        !           699: {
        !           700:   unsigned char MailboxCount;                          /* Byte 0 */
        !           701:   BusLogic_BusAddress_T BaseMailboxAddress;            /* Bytes 1-4 */
        !           702: }
        !           703: __attribute__ ((packed))
        !           704: BusLogic_ExtendedMailboxRequest_T;
        !           705: 
        !           706: 
        !           707: /*
        !           708:   Define the Inquire Firmware Version 3rd Digit reply type.
        !           709: */
        !           710: 
        !           711: typedef unsigned char BusLogic_FirmwareVersion3rdDigit_T;
        !           712: 
        !           713: 
        !           714: /*
        !           715:   Define the Inquire Firmware Version Letter reply type.
        !           716: */
        !           717: 
        !           718: typedef unsigned char BusLogic_FirmwareVersionLetter_T;
        !           719: 
        !           720: 
        !           721: /*
        !           722:   Define the Inquire PCI Host Adapter Information reply type.  The ISA
        !           723:   Compatible I/O Port values are defined here and are also used with
        !           724:   the Modify I/O Address command.
        !           725: */
        !           726: 
        !           727: typedef enum BusLogic_ISACompatibleIOPort
        !           728: {
        !           729:   BusLogic_IO_330 =                            0,
        !           730:   BusLogic_IO_334 =                            1,
        !           731:   BusLogic_IO_230 =                            2,
        !           732:   BusLogic_IO_234 =                            3,
        !           733:   BusLogic_IO_130 =                            4,
        !           734:   BusLogic_IO_134 =                            5,
        !           735:   BusLogic_IO_Disable =                                6,
        !           736:   BusLogic_IO_Disable2 =                       7
        !           737: }
        !           738: __attribute__ ((packed))
        !           739: BusLogic_ISACompatibleIOPort_T;
        !           740: 
        !           741: typedef struct BusLogic_PCIHostAdapterInformation
        !           742: {
        !           743:   BusLogic_ISACompatibleIOPort_T ISACompatibleIOPort;  /* Byte 0 */
        !           744:   unsigned char PCIAssignedIRQChannel;                 /* Byte 1 */
        !           745:   boolean LowByteTerminated:1;                         /* Byte 2 Bit 0 */
        !           746:   boolean HighByteTerminated:1;                                /* Byte 2 Bit 1 */
        !           747:   unsigned char :2;                                    /* Byte 2 Bits 2-3 */
        !           748:   boolean JP1:1;                                       /* Byte 2 Bit 4 */
        !           749:   boolean JP2:1;                                       /* Byte 2 Bit 5 */
        !           750:   boolean JP3:1;                                       /* Byte 2 Bit 6 */
        !           751:   boolean GenericInfoValid:1;                          /* Byte 2 Bit 7 */
        !           752:   unsigned char :8;                                    /* Byte 3 */
        !           753: }
        !           754: BusLogic_PCIHostAdapterInformation_T;
        !           755: 
        !           756: 
        !           757: /*
        !           758:   Define the Inquire Host Adapter Model Number reply type.
        !           759: */
        !           760: 
        !           761: typedef unsigned char BusLogic_HostAdapterModelNumber_T[5];
        !           762: 
        !           763: 
        !           764: /*
        !           765:   Define the Inquire Synchronous Period reply type.  For each Target Device,
        !           766:   a byte is returned which represents the Synchronous Transfer Period in units
        !           767:   of 10 nanoseconds.
        !           768: */
        !           769: 
        !           770: typedef unsigned char BusLogic_SynchronousPeriod_T[BusLogic_MaxTargetDevices];
        !           771: 
        !           772: 
        !           773: /*
        !           774:   Define the Inquire Extended Setup Information reply structure.
        !           775: */
        !           776: 
        !           777: typedef struct BusLogic_ExtendedSetupInformation
        !           778: {
        !           779:   unsigned char BusType;                               /* Byte 0 */
        !           780:   unsigned char BIOS_Address;                          /* Byte 1 */
        !           781:   unsigned short ScatterGatherLimit;                   /* Bytes 2-3 */
        !           782:   unsigned char MailboxCount;                          /* Byte 4 */
        !           783:   BusLogic_BusAddress_T BaseMailboxAddress;            /* Bytes 5-8 */
        !           784:   struct { unsigned char :2;                           /* Byte 9 Bits 0-1 */
        !           785:           boolean FastOnEISA:1;                        /* Byte 9 Bit 2 */
        !           786:           unsigned char :3;                            /* Byte 9 Bits 3-5 */
        !           787:           boolean LevelSensitiveInterrupt:1;           /* Byte 9 Bit 6 */
        !           788:           unsigned char :1; } Misc;                    /* Byte 9 Bit 7 */
        !           789:   unsigned char FirmwareRevision[3];                   /* Bytes 10-12 */
        !           790:   boolean HostWideSCSI:1;                              /* Byte 13 Bit 0 */
        !           791:   boolean HostDifferentialSCSI:1;                      /* Byte 13 Bit 1 */
        !           792:   boolean HostSupportsSCAM:1;                          /* Byte 13 Bit 2 */
        !           793:   boolean HostUltraSCSI:1;                             /* Byte 13 Bit 3 */
        !           794:   boolean HostSmartTermination:1;                      /* Byte 13 Bit 4 */
        !           795:   unsigned char :3;                                    /* Byte 13 Bits 5-7 */
        !           796: }
        !           797: __attribute__ ((packed))
        !           798: BusLogic_ExtendedSetupInformation_T;
        !           799: 
        !           800: 
        !           801: /*
        !           802:   Define the Enable Strict Round Robin Mode request type.
        !           803: */
        !           804: 
        !           805: typedef enum BusLogic_RoundRobinModeRequest
        !           806: {
        !           807:   BusLogic_AggressiveRoundRobinMode =          0,
        !           808:   BusLogic_StrictRoundRobinMode =              1
        !           809: }
        !           810: __attribute__ ((packed))
        !           811: BusLogic_RoundRobinModeRequest_T;
        !           812: 
        !           813: 
        !           814: /*
        !           815:   Define the Fetch Host Adapter Local RAM request type.
        !           816: */
        !           817: 
        !           818: #define BusLogic_BIOS_BaseOffset               0
        !           819: #define BusLogic_AutoSCSI_BaseOffset           64
        !           820: 
        !           821: typedef struct BusLogic_FetchHostAdapterLocalRAMRequest
        !           822: {
        !           823:   unsigned char ByteOffset;                            /* Byte 0 */
        !           824:   unsigned char ByteCount;                             /* Byte 1 */
        !           825: }
        !           826: BusLogic_FetchHostAdapterLocalRAMRequest_T;
        !           827: 
        !           828: 
        !           829: /*
        !           830:   Define the Host Adapter Local RAM AutoSCSI structure.
        !           831: */
        !           832: 
        !           833: typedef struct BusLogic_AutoSCSIData
        !           834: {
        !           835:   unsigned char InternalFactorySignature[2];           /* Bytes 0-1 */
        !           836:   unsigned char InformationByteCount;                  /* Byte 2 */
        !           837:   unsigned char HostAdapterType[6];                    /* Bytes 3-8 */
        !           838:   unsigned char :8;                                    /* Byte 9 */
        !           839:   boolean FloppyEnabled:1;                             /* Byte 10 Bit 0 */
        !           840:   boolean FloppySecondary:1;                           /* Byte 10 Bit 1 */
        !           841:   boolean LevelSensitiveInterrupt:1;                   /* Byte 10 Bit 2 */
        !           842:   unsigned char :2;                                    /* Byte 10 Bits 3-4 */
        !           843:   unsigned char SystemRAMAreaForBIOS:3;                        /* Byte 10 Bits 5-7 */
        !           844:   unsigned char DMA_Channel:7;                         /* Byte 11 Bits 0-6 */
        !           845:   boolean DMA_AutoConfiguration:1;                     /* Byte 11 Bit 7 */
        !           846:   unsigned char IRQ_Channel:7;                         /* Byte 12 Bits 0-6 */
        !           847:   boolean IRQ_AutoConfiguration:1;                     /* Byte 12 Bit 7 */
        !           848:   unsigned char DMA_TransferRate;                      /* Byte 13 */
        !           849:   unsigned char SCSI_ID;                               /* Byte 14 */
        !           850:   boolean LowByteTerminated:1;                         /* Byte 15 Bit 0 */
        !           851:   boolean ParityCheckingEnabled:1;                     /* Byte 15 Bit 1 */
        !           852:   boolean HighByteTerminated:1;                                /* Byte 15 Bit 2 */
        !           853:   boolean NoisyCablingEnvironment:1;                   /* Byte 15 Bit 3 */
        !           854:   boolean FastSynchronousNegotiation:1;                        /* Byte 15 Bit 4 */
        !           855:   boolean BusResetEnabled:1;                           /* Byte 15 Bit 5 */
        !           856:   boolean :1;                                          /* Byte 15 Bit 6 */
        !           857:   boolean ActiveNegationEnabled:1;                     /* Byte 15 Bit 7 */
        !           858:   unsigned char BusOnDelay;                            /* Byte 16 */
        !           859:   unsigned char BusOffDelay;                           /* Byte 17 */
        !           860:   boolean HostAdapterBIOSEnabled:1;                    /* Byte 18 Bit 0 */
        !           861:   boolean BIOSRedirectionOfINT19Enabled:1;             /* Byte 18 Bit 1 */
        !           862:   boolean ExtendedTranslationEnabled:1;                        /* Byte 18 Bit 2 */
        !           863:   boolean MapRemovableAsFixedEnabled:1;                        /* Byte 18 Bit 3 */
        !           864:   boolean :1;                                          /* Byte 18 Bit 4 */
        !           865:   boolean BIOSSupportsMoreThan2DrivesEnabled:1;                /* Byte 18 Bit 5 */
        !           866:   boolean BIOSInterruptModeEnabled:1;                  /* Byte 18 Bit 6 */
        !           867:   boolean FlopticalSupportEnabled:1;                   /* Byte 19 Bit 7 */
        !           868:   unsigned short DeviceEnabled;                                /* Bytes 19-20 */
        !           869:   unsigned short WidePermitted;                                /* Bytes 21-22 */
        !           870:   unsigned short FastPermitted;                                /* Bytes 23-24 */
        !           871:   unsigned short SynchronousPermitted;                 /* Bytes 25-26 */
        !           872:   unsigned short DisconnectPermitted;                  /* Bytes 27-28 */
        !           873:   unsigned short SendStartUnitCommand;                 /* Bytes 29-30 */
        !           874:   unsigned short IgnoreInBIOSScan;                     /* Bytes 31-32 */
        !           875:   unsigned char PCIInterruptPin:2;                     /* Byte 33 Bits 0-1 */
        !           876:   unsigned char HostAdapterIOPortAddress:2;            /* Byte 33 Bits 2-3 */
        !           877:   boolean StrictRoundRobinModeEnabled:1;               /* Byte 33 Bit 4 */
        !           878:   boolean VESABusSpeedGreaterThan33MHz:1;              /* Byte 33 Bit 5 */
        !           879:   boolean VESABurstWriteEnabled:1;                     /* Byte 33 Bit 6 */
        !           880:   boolean VESABurstReadEnabled:1;                      /* Byte 33 Bit 7 */
        !           881:   unsigned short UltraPermitted;                       /* Bytes 34-35 */
        !           882:   unsigned int :32;                                    /* Bytes 36-39 */
        !           883:   unsigned char :8;                                    /* Byte 40 */
        !           884:   unsigned char AutoSCSIMaximumLUN;                    /* Byte 41 */
        !           885:   boolean :1;                                          /* Byte 42 Bit 0 */
        !           886:   boolean SCAM_Dominant:1;                             /* Byte 42 Bit 1 */
        !           887:   boolean SCAM_Enabled:1;                              /* Byte 42 Bit 2 */
        !           888:   boolean SCAM_Level2:1;                               /* Byte 42 Bit 3 */
        !           889:   unsigned char :4;                                    /* Byte 42 Bits 4-7 */
        !           890:   boolean INT13ExtensionEnabled:1;                     /* Byte 43 Bit 0 */
        !           891:   boolean :1;                                          /* Byte 43 Bit 1 */
        !           892:   boolean CDROMBootEnabled:1;                          /* Byte 43 Bit 2 */
        !           893:   unsigned char :5;                                    /* Byte 43 Bits 3-7 */
        !           894:   unsigned char BootTargetID:4;                                /* Byte 44 Bits 0-3 */
        !           895:   unsigned char BootChannel:4;                         /* Byte 44 Bits 4-7 */
        !           896:   unsigned char ForceBusDeviceScanningOrder:1;         /* Byte 45 Bit 0 */
        !           897:   unsigned char :7;                                    /* Byte 45 Bits 1-7 */
        !           898:   unsigned short NonTaggedToAlternateLUNPermitted;     /* Bytes 46-47 */
        !           899:   unsigned short RenegotiateSyncAfterCheckCondition;   /* Bytes 48-49 */
        !           900:   unsigned char Reserved[10];                          /* Bytes 50-59 */
        !           901:   unsigned char ManufacturingDiagnostic[2];            /* Bytes 60-61 */
        !           902:   unsigned short Checksum;                             /* Bytes 62-63 */
        !           903: }
        !           904: __attribute__ ((packed))
        !           905: BusLogic_AutoSCSIData_T;
        !           906: 
        !           907: 
        !           908: /*
        !           909:   Define the Host Adapter Local RAM Auto SCSI Byte 45 structure.
        !           910: */
        !           911: 
        !           912: typedef struct BusLogic_AutoSCSIByte45
        !           913: {
        !           914:   unsigned char ForceBusDeviceScanningOrder:1;         /* Bit 0 */
        !           915:   unsigned char :7;                                    /* Bits 1-7 */
        !           916: }
        !           917: BusLogic_AutoSCSIByte45_T;
        !           918: 
        !           919: 
        !           920: /*
        !           921:   Define the Host Adapter Local RAM BIOS Drive Map Byte structure.
        !           922: */
        !           923: 
        !           924: #define BusLogic_BIOS_DriveMapOffset           17
        !           925: 
        !           926: typedef struct BusLogic_BIOSDriveMapByte
        !           927: {
        !           928:   unsigned char TargetIDBit3:1;                                /* Bit 0 */
        !           929:   unsigned char :2;                                    /* Bits 1-2 */
        !           930:   BusLogic_BIOS_DiskGeometryTranslation_T DiskGeometry:2; /* Bits 3-4 */
        !           931:   unsigned char TargetID:3;                            /* Bits 5-7 */
        !           932: }
        !           933: BusLogic_BIOSDriveMapByte_T;
        !           934: 
        !           935: 
        !           936: /*
        !           937:   Define the Modify I/O Address request type.  On PCI Host Adapters, the
        !           938:   Modify I/O Address command allows modification of the ISA compatible I/O
        !           939:   Address that the Host Adapter responds to; it does not affect the PCI
        !           940:   compliant I/O Address assigned at system initialization.
        !           941: */
        !           942: 
        !           943: typedef BusLogic_ISACompatibleIOPort_T BusLogic_ModifyIOAddressRequest_T;
        !           944: 
        !           945: 
        !           946: /*
        !           947:   Define the Set CCB Format request type.  Extended LUN Format CCBs are
        !           948:   necessary to support more than 8 Logical Units per Target Device.
        !           949: */
        !           950: 
        !           951: typedef enum BusLogic_SetCCBFormatRequest
        !           952: {
        !           953:   BusLogic_LegacyLUNFormatCCB =                        0,
        !           954:   BusLogic_ExtendedLUNFormatCCB =              1
        !           955: }
        !           956: __attribute__ ((packed))
        !           957: BusLogic_SetCCBFormatRequest_T;
        !           958: 
        !           959: 
        !           960: /*
        !           961:   Define the Requested Reply Length type used by the Inquire Setup Information,
        !           962:   Inquire Host Adapter Model Number, Inquire Synchronous Period, and Inquire
        !           963:   Extended Setup Information commands.
        !           964: */
        !           965: 
        !           966: typedef unsigned char BusLogic_RequestedReplyLength_T;
        !           967: 
        !           968: 
        !           969: /*
        !           970:   Define the Outgoing Mailbox Action Codes.
        !           971: */
        !           972: 
        !           973: typedef enum
        !           974: {
        !           975:   BusLogic_OutgoingMailboxFree =               0x00,
        !           976:   BusLogic_MailboxStartCommand =               0x01,
        !           977:   BusLogic_MailboxAbortCommand =               0x02
        !           978: }
        !           979: __attribute__ ((packed))
        !           980: BusLogic_ActionCode_T;
        !           981: 
        !           982: 
        !           983: /*
        !           984:   Define the Incoming Mailbox Completion Codes.  The MultiMaster Firmware
        !           985:   only uses codes 0 - 4.  The FlashPoint SCCB Manager has no mailboxes, so
        !           986:   completion codes are stored in the CCB; it only uses codes 1, 2, 4, and 5.
        !           987: */
        !           988: 
        !           989: typedef enum
        !           990: {
        !           991:   BusLogic_IncomingMailboxFree =               0x00,
        !           992:   BusLogic_CommandCompletedWithoutError =      0x01,
        !           993:   BusLogic_CommandAbortedAtHostRequest =       0x02,
        !           994:   BusLogic_AbortedCommandNotFound =            0x03,
        !           995:   BusLogic_CommandCompletedWithError =         0x04,
        !           996:   BusLogic_InvalidCCB =                                0x05
        !           997: }
        !           998: __attribute__ ((packed))
        !           999: BusLogic_CompletionCode_T;
        !          1000: 
        !          1001: 
        !          1002: /*
        !          1003:   Define the Command Control Block (CCB) Opcodes.
        !          1004: */
        !          1005: 
        !          1006: typedef enum
        !          1007: {
        !          1008:   BusLogic_InitiatorCCB =                      0x00,
        !          1009:   BusLogic_TargetCCB =                         0x01,
        !          1010:   BusLogic_InitiatorCCB_ScatterGather =                0x02,
        !          1011:   BusLogic_InitiatorCCB_ResidualDataLength =   0x03,
        !          1012:   BusLogic_InitiatorCCB_ScatterGatherResidual =        0x04,
        !          1013:   BusLogic_BusDeviceReset =                    0x81
        !          1014: }
        !          1015: __attribute__ ((packed))
        !          1016: BusLogic_CCB_Opcode_T;
        !          1017: 
        !          1018: 
        !          1019: /*
        !          1020:   Define the CCB Data Direction Codes.
        !          1021: */
        !          1022: 
        !          1023: typedef enum
        !          1024: {
        !          1025:   BusLogic_UncheckedDataTransfer =             0,
        !          1026:   BusLogic_DataInLengthChecked =               1,
        !          1027:   BusLogic_DataOutLengthChecked =              2,
        !          1028:   BusLogic_NoDataTransfer =                    3
        !          1029: }
        !          1030: BusLogic_DataDirection_T;
        !          1031: 
        !          1032: 
        !          1033: /*
        !          1034:   Define the Host Adapter Status Codes.  The MultiMaster Firmware does not
        !          1035:   return status code 0x0C; it uses 0x12 for both overruns and underruns.
        !          1036: */
        !          1037: 
        !          1038: typedef enum
        !          1039: {
        !          1040:   BusLogic_CommandCompletedNormally =          0x00,
        !          1041:   BusLogic_LinkedCommandCompleted =            0x0A,
        !          1042:   BusLogic_LinkedCommandCompletedWithFlag =    0x0B,
        !          1043:   BusLogic_DataUnderRun =                      0x0C,
        !          1044:   BusLogic_SCSISelectionTimeout =              0x11,
        !          1045:   BusLogic_DataOverRun =                       0x12,
        !          1046:   BusLogic_UnexpectedBusFree =                 0x13,
        !          1047:   BusLogic_InvalidBusPhaseRequested =          0x14,
        !          1048:   BusLogic_InvalidOutgoingMailboxActionCode =  0x15,
        !          1049:   BusLogic_InvalidCommandOperationCode =       0x16,
        !          1050:   BusLogic_LinkedCCBhasInvalidLUN =            0x17,
        !          1051:   BusLogic_InvalidCommandParameter =           0x1A,
        !          1052:   BusLogic_AutoRequestSenseFailed =            0x1B,
        !          1053:   BusLogic_TaggedQueuingMessageRejected =      0x1C,
        !          1054:   BusLogic_UnsupportedMessageReceived =                0x1D,
        !          1055:   BusLogic_HostAdapterHardwareFailed =         0x20,
        !          1056:   BusLogic_TargetFailedResponseToATN =         0x21,
        !          1057:   BusLogic_HostAdapterAssertedRST =            0x22,
        !          1058:   BusLogic_OtherDeviceAssertedRST =            0x23,
        !          1059:   BusLogic_TargetDeviceReconnectedImproperly = 0x24,
        !          1060:   BusLogic_HostAdapterAssertedBusDeviceReset = 0x25,
        !          1061:   BusLogic_AbortQueueGenerated =               0x26,
        !          1062:   BusLogic_HostAdapterSoftwareError =          0x27,
        !          1063:   BusLogic_HostAdapterHardwareTimeoutError =   0x30,
        !          1064:   BusLogic_SCSIParityErrorDetected =           0x34
        !          1065: }
        !          1066: __attribute__ ((packed))
        !          1067: BusLogic_HostAdapterStatus_T;
        !          1068: 
        !          1069: 
        !          1070: /*
        !          1071:   Define the SCSI Target Device Status Codes.
        !          1072: */
        !          1073: 
        !          1074: typedef enum
        !          1075: {
        !          1076:   BusLogic_OperationGood =                     0x00,
        !          1077:   BusLogic_CheckCondition =                    0x02,
        !          1078:   BusLogic_DeviceBusy =                                0x08
        !          1079: }
        !          1080: __attribute__ ((packed))
        !          1081: BusLogic_TargetDeviceStatus_T;
        !          1082: 
        !          1083: 
        !          1084: /*
        !          1085:   Define the Queue Tag Codes.
        !          1086: */
        !          1087: 
        !          1088: typedef enum
        !          1089: {
        !          1090:   BusLogic_SimpleQueueTag =                    0,
        !          1091:   BusLogic_HeadOfQueueTag =                    1,
        !          1092:   BusLogic_OrderedQueueTag =                   2,
        !          1093:   BusLogic_ReservedQT =                                3
        !          1094: }
        !          1095: BusLogic_QueueTag_T;
        !          1096: 
        !          1097: 
        !          1098: /*
        !          1099:   Define the SCSI Command Descriptor Block (CDB).
        !          1100: */
        !          1101: 
        !          1102: #define BusLogic_CDB_MaxLength                 12
        !          1103: 
        !          1104: typedef unsigned char SCSI_CDB_T[BusLogic_CDB_MaxLength];
        !          1105: 
        !          1106: 
        !          1107: /*
        !          1108:   Define the Scatter/Gather Segment structure required by the MultiMaster
        !          1109:   Firmware Interface and the FlashPoint SCCB Manager.
        !          1110: */
        !          1111: 
        !          1112: typedef struct BusLogic_ScatterGatherSegment
        !          1113: {
        !          1114:   BusLogic_ByteCount_T SegmentByteCount;               /* Bytes 0-3 */
        !          1115:   BusLogic_BusAddress_T SegmentDataPointer;            /* Bytes 4-7 */
        !          1116: }
        !          1117: BusLogic_ScatterGatherSegment_T;
        !          1118: 
        !          1119: 
        !          1120: /*
        !          1121:   Define the Driver CCB Status Codes.
        !          1122: */
        !          1123: 
        !          1124: typedef enum
        !          1125: {
        !          1126:   BusLogic_CCB_Free =                          0,
        !          1127:   BusLogic_CCB_Active =                                1,
        !          1128:   BusLogic_CCB_Completed =                     2,
        !          1129:   BusLogic_CCB_Reset =                         3
        !          1130: }
        !          1131: __attribute__ ((packed))
        !          1132: BusLogic_CCB_Status_T;
        !          1133: 
        !          1134: 
        !          1135: /*
        !          1136:   Define the 32 Bit Mode Command Control Block (CCB) structure.  The first 40
        !          1137:   bytes are defined by and common to both the MultiMaster Firmware and the
        !          1138:   FlashPoint SCCB Manager.  The next 60 bytes are defined by the FlashPoint
        !          1139:   SCCB Manager.  The remaining components are defined by the Linux BusLogic
        !          1140:   Driver.  Extended LUN Format CCBs differ from Legacy LUN Format 32 Bit Mode
        !          1141:   CCBs only in having the TagEnable and QueueTag fields moved from byte 17 to
        !          1142:   byte 1, and the Logical Unit field in byte 17 expanded to 6 bits.  In theory,
        !          1143:   Extended LUN Format CCBs can support up to 64 Logical Units, but in practice
        !          1144:   many devices will respond improperly to Logical Units between 32 and 63, and
        !          1145:   the SCSI-2 specification defines Bit 5 as LUNTAR.  Extended LUN Format CCBs
        !          1146:   are used by recent versions of the MultiMaster Firmware, as well as by the
        !          1147:   FlashPoint SCCB Manager; the FlashPoint SCCB Manager only supports 32 Logical
        !          1148:   Units.  Since 64 Logical Units are unlikely to be needed in practice, and
        !          1149:   since they are problematic for the above reasons, and since limiting them to
        !          1150:   5 bits simplifies the CCB structure definition, this driver only supports
        !          1151:   32 Logical Units per Target Device.
        !          1152: */
        !          1153: 
        !          1154: typedef struct BusLogic_CCB
        !          1155: {
        !          1156:   /*
        !          1157:     MultiMaster Firmware and FlashPoint SCCB Manager Common Portion.
        !          1158:   */
        !          1159:   BusLogic_CCB_Opcode_T Opcode;                                /* Byte 0 */
        !          1160:   unsigned char :3;                                    /* Byte 1 Bits 0-2 */
        !          1161:   BusLogic_DataDirection_T DataDirection:2;            /* Byte 1 Bits 3-4 */
        !          1162:   boolean TagEnable:1;                                 /* Byte 1 Bit 5 */
        !          1163:   BusLogic_QueueTag_T QueueTag:2;                      /* Byte 1 Bits 6-7 */
        !          1164:   unsigned char CDB_Length;                            /* Byte 2 */
        !          1165:   unsigned char SenseDataLength;                       /* Byte 3 */
        !          1166:   BusLogic_ByteCount_T DataLength;                     /* Bytes 4-7 */
        !          1167:   BusLogic_BusAddress_T DataPointer;                   /* Bytes 8-11 */
        !          1168:   unsigned char :8;                                    /* Byte 12 */
        !          1169:   unsigned char :8;                                    /* Byte 13 */
        !          1170:   BusLogic_HostAdapterStatus_T HostAdapterStatus;      /* Byte 14 */
        !          1171:   BusLogic_TargetDeviceStatus_T TargetDeviceStatus;    /* Byte 15 */
        !          1172:   unsigned char TargetID;                              /* Byte 16 */
        !          1173:   unsigned char LogicalUnit:5;                         /* Byte 17 Bits 0-4 */
        !          1174:   boolean LegacyTagEnable:1;                           /* Byte 17 Bit 5 */
        !          1175:   BusLogic_QueueTag_T LegacyQueueTag:2;                        /* Byte 17 Bits 6-7 */
        !          1176:   SCSI_CDB_T CDB;                                      /* Bytes 18-29 */
        !          1177:   unsigned char :8;                                    /* Byte 30 */
        !          1178:   unsigned char :8;                                    /* Byte 31 */
        !          1179:   unsigned int :32;                                    /* Bytes 32-35 */
        !          1180:   BusLogic_BusAddress_T SenseDataPointer;              /* Bytes 36-39 */
        !          1181:   /*
        !          1182:     FlashPoint SCCB Manager Defined Portion.
        !          1183:   */
        !          1184:   void (*CallbackFunction)(struct BusLogic_CCB *);     /* Bytes 40-43 */
        !          1185:   BusLogic_Base_Address_T BaseAddress;                 /* Bytes 44-47 */
        !          1186:   BusLogic_CompletionCode_T CompletionCode;            /* Byte 48 */
        !          1187: #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
        !          1188:   unsigned char :8;                                    /* Byte 49 */
        !          1189:   unsigned short OS_Flags;                             /* Bytes 50-51 */
        !          1190:   unsigned char Private[48];                           /* Bytes 52-99 */
        !          1191: #endif
        !          1192:   /*
        !          1193:     BusLogic Linux Driver Defined Portion.
        !          1194:   */
        !          1195:   boolean AllocationGroupHead;
        !          1196:   BusLogic_CCB_Status_T Status;
        !          1197:   unsigned long SerialNumber;
        !          1198:   SCSI_Command_T *Command;
        !          1199:   struct BusLogic_HostAdapter *HostAdapter;
        !          1200:   struct BusLogic_CCB *Next;
        !          1201:   struct BusLogic_CCB *NextAll;
        !          1202:   BusLogic_ScatterGatherSegment_T
        !          1203:     ScatterGatherList[BusLogic_ScatterGatherLimit];
        !          1204: }
        !          1205: BusLogic_CCB_T;
        !          1206: 
        !          1207: 
        !          1208: /*
        !          1209:   Define the 32 Bit Mode Outgoing Mailbox structure.
        !          1210: */
        !          1211: 
        !          1212: typedef struct BusLogic_OutgoingMailbox
        !          1213: {
        !          1214:   BusLogic_BusAddress_T CCB;                           /* Bytes 0-3 */
        !          1215:   unsigned int :24;                                    /* Bytes 4-6 */
        !          1216:   BusLogic_ActionCode_T ActionCode;                    /* Byte 7 */
        !          1217: }
        !          1218: BusLogic_OutgoingMailbox_T;
        !          1219: 
        !          1220: 
        !          1221: /*
        !          1222:   Define the 32 Bit Mode Incoming Mailbox structure.
        !          1223: */
        !          1224: 
        !          1225: typedef struct BusLogic_IncomingMailbox
        !          1226: {
        !          1227:   BusLogic_BusAddress_T CCB;                           /* Bytes 0-3 */
        !          1228:   BusLogic_HostAdapterStatus_T HostAdapterStatus;      /* Byte 4 */
        !          1229:   BusLogic_TargetDeviceStatus_T TargetDeviceStatus;    /* Byte 5 */
        !          1230:   unsigned char :8;                                    /* Byte 6 */
        !          1231:   BusLogic_CompletionCode_T CompletionCode;            /* Byte 7 */
        !          1232: }
        !          1233: BusLogic_IncomingMailbox_T;
        !          1234: 
        !          1235: 
        !          1236: /*
        !          1237:   Define the BusLogic Driver Options structure.
        !          1238: */
        !          1239: 
        !          1240: typedef struct BusLogic_DriverOptions
        !          1241: {
        !          1242:   unsigned short TaggedQueuingPermitted;
        !          1243:   unsigned short TaggedQueuingPermittedMask;
        !          1244:   unsigned short BusSettleTime;
        !          1245:   BusLogic_LocalOptions_T LocalOptions;
        !          1246:   unsigned char CommonQueueDepth;
        !          1247:   unsigned char QueueDepth[BusLogic_MaxTargetDevices];
        !          1248:   BusLogic_ErrorRecoveryStrategy_T
        !          1249:     ErrorRecoveryStrategy[BusLogic_MaxTargetDevices];
        !          1250: }
        !          1251: BusLogic_DriverOptions_T;
        !          1252: 
        !          1253: 
        !          1254: /*
        !          1255:   Define the Host Adapter Target Flags structure.
        !          1256: */
        !          1257: 
        !          1258: typedef struct BusLogic_TargetFlags
        !          1259: {
        !          1260:   boolean TargetExists:1;
        !          1261:   boolean TaggedQueuingSupported:1;
        !          1262:   boolean WideTransfersSupported:1;
        !          1263:   boolean TaggedQueuingActive:1;
        !          1264:   boolean WideTransfersActive:1;
        !          1265:   boolean CommandSuccessfulFlag:1;
        !          1266:   boolean TargetInfoReported:1;
        !          1267: }
        !          1268: BusLogic_TargetFlags_T;
        !          1269: 
        !          1270: 
        !          1271: /*
        !          1272:   Define the Host Adapter Target Statistics structure.
        !          1273: */
        !          1274: 
        !          1275: #define BusLogic_SizeBuckets                   10
        !          1276: 
        !          1277: typedef unsigned int BusLogic_CommandSizeBuckets_T[BusLogic_SizeBuckets];
        !          1278: 
        !          1279: typedef struct BusLogic_TargetStatistics
        !          1280: {
        !          1281:   unsigned int CommandsAttempted;
        !          1282:   unsigned int CommandsCompleted;
        !          1283:   unsigned int ReadCommands;
        !          1284:   unsigned int WriteCommands;
        !          1285:   BusLogic_ByteCounter_T TotalBytesRead;
        !          1286:   BusLogic_ByteCounter_T TotalBytesWritten;
        !          1287:   BusLogic_CommandSizeBuckets_T ReadCommandSizeBuckets;
        !          1288:   BusLogic_CommandSizeBuckets_T WriteCommandSizeBuckets;
        !          1289:   unsigned short CommandAbortsRequested;
        !          1290:   unsigned short CommandAbortsAttempted;
        !          1291:   unsigned short CommandAbortsCompleted;
        !          1292:   unsigned short BusDeviceResetsRequested;
        !          1293:   unsigned short BusDeviceResetsAttempted;
        !          1294:   unsigned short BusDeviceResetsCompleted;
        !          1295:   unsigned short HostAdapterResetsRequested;
        !          1296:   unsigned short HostAdapterResetsAttempted;
        !          1297:   unsigned short HostAdapterResetsCompleted;
        !          1298: }
        !          1299: BusLogic_TargetStatistics_T;
        !          1300: 
        !          1301: 
        !          1302: /*
        !          1303:   Define the FlashPoint Card Handle data type.
        !          1304: */
        !          1305: 
        !          1306: #define FlashPoint_BadCardHandle               0xFFFFFFFF
        !          1307: 
        !          1308: typedef unsigned int FlashPoint_CardHandle_T;
        !          1309: 
        !          1310: 
        !          1311: /*
        !          1312:   Define the FlashPoint Information structure.  This structure is defined
        !          1313:   by the FlashPoint SCCB Manager.
        !          1314: */
        !          1315: 
        !          1316: typedef struct FlashPoint_Info
        !          1317: {
        !          1318:   BusLogic_Base_Address_T BaseAddress;                 /* Bytes 0-3 */
        !          1319:   boolean Present;                                     /* Byte 4 */
        !          1320:   unsigned char IRQ_Channel;                           /* Byte 5 */
        !          1321:   unsigned char SCSI_ID;                               /* Byte 6 */
        !          1322:   unsigned char SCSI_LUN;                              /* Byte 7 */
        !          1323:   unsigned short FirmwareRevision;                     /* Bytes 8-9 */
        !          1324:   unsigned short SynchronousPermitted;                 /* Bytes 10-11 */
        !          1325:   unsigned short FastPermitted;                                /* Bytes 12-13 */
        !          1326:   unsigned short UltraPermitted;                       /* Bytes 14-15 */
        !          1327:   unsigned short DisconnectPermitted;                  /* Bytes 16-17 */
        !          1328:   unsigned short WidePermitted;                                /* Bytes 18-19 */
        !          1329:   boolean ParityCheckingEnabled:1;                     /* Byte 20 Bit 0 */
        !          1330:   boolean HostWideSCSI:1;                              /* Byte 20 Bit 1 */
        !          1331:   boolean HostSoftReset:1;                             /* Byte 20 Bit 2 */
        !          1332:   boolean ExtendedTranslationEnabled:1;                        /* Byte 20 Bit 3 */
        !          1333:   boolean LowByteTerminated:1;                         /* Byte 20 Bit 4 */
        !          1334:   boolean HighByteTerminated:1;                                /* Byte 20 Bit 5 */
        !          1335:   boolean ReportDataUnderrun:1;                                /* Byte 20 Bit 6 */
        !          1336:   boolean SCAM_Enabled:1;                              /* Byte 20 Bit 7 */
        !          1337:   boolean SCAM_Level2:1;                               /* Byte 21 Bit 0 */
        !          1338:   unsigned char :7;                                    /* Byte 21 Bits 1-7 */
        !          1339:   unsigned char Family;                                        /* Byte 22 */
        !          1340:   unsigned char BusType;                               /* Byte 23 */
        !          1341:   unsigned char ModelNumber[3];                                /* Bytes 24-26 */
        !          1342:   unsigned char RelativeCardNumber;                    /* Byte 27 */
        !          1343:   unsigned char Reserved[4];                           /* Bytes 28-31 */
        !          1344:   unsigned int OS_Reserved;                            /* Bytes 32-35 */
        !          1345:   unsigned char TranslationInfo[4];                    /* Bytes 36-39 */
        !          1346:   unsigned int Reserved2[5];                           /* Bytes 40-59 */
        !          1347:   unsigned int SecondaryRange;                         /* Bytes 60-63 */
        !          1348: }
        !          1349: FlashPoint_Info_T;
        !          1350: 
        !          1351: 
        !          1352: /*
        !          1353:   Define the BusLogic Driver Host Adapter structure.
        !          1354: */
        !          1355: 
        !          1356: typedef struct BusLogic_HostAdapter
        !          1357: {
        !          1358:   SCSI_Host_T *SCSI_Host;
        !          1359:   BusLogic_HostAdapterType_T HostAdapterType;
        !          1360:   BusLogic_HostAdapterBusType_T HostAdapterBusType;
        !          1361:   BusLogic_IO_Address_T IO_Address;
        !          1362:   BusLogic_PCI_Address_T PCI_Address;
        !          1363:   unsigned short AddressCount;
        !          1364:   unsigned char HostNumber;
        !          1365:   unsigned char ModelName[9];
        !          1366:   unsigned char FirmwareVersion[6];
        !          1367:   unsigned char FullModelName[18];
        !          1368:   unsigned char Bus;
        !          1369:   unsigned char Device;
        !          1370:   unsigned char IRQ_Channel;
        !          1371:   unsigned char DMA_Channel;
        !          1372:   unsigned char SCSI_ID;
        !          1373:   boolean IRQ_ChannelAcquired:1;
        !          1374:   boolean DMA_ChannelAcquired:1;
        !          1375:   boolean ExtendedTranslationEnabled:1;
        !          1376:   boolean ParityCheckingEnabled:1;
        !          1377:   boolean BusResetEnabled:1;
        !          1378:   boolean LevelSensitiveInterrupt:1;
        !          1379:   boolean HostWideSCSI:1;
        !          1380:   boolean HostDifferentialSCSI:1;
        !          1381:   boolean HostSupportsSCAM:1;
        !          1382:   boolean HostUltraSCSI:1;
        !          1383:   boolean ExtendedLUNSupport:1;
        !          1384:   boolean TerminationInfoValid:1;
        !          1385:   boolean LowByteTerminated:1;
        !          1386:   boolean HighByteTerminated:1;
        !          1387:   boolean BounceBuffersRequired:1;
        !          1388:   boolean StrictRoundRobinModeSupport:1;
        !          1389:   boolean SCAM_Enabled:1;
        !          1390:   boolean SCAM_Level2:1;
        !          1391:   boolean HostAdapterInitialized:1;
        !          1392:   boolean HostAdapterExternalReset:1;
        !          1393:   boolean HostAdapterInternalError:1;
        !          1394:   boolean ProcessCompletedCCBsActive;
        !          1395:   volatile boolean HostAdapterCommandCompleted;
        !          1396:   unsigned short HostAdapterScatterGatherLimit;
        !          1397:   unsigned short DriverScatterGatherLimit;
        !          1398:   unsigned short MaxTargetDevices;
        !          1399:   unsigned short MaxLogicalUnits;
        !          1400:   unsigned short MailboxCount;
        !          1401:   unsigned short InitialCCBs;
        !          1402:   unsigned short IncrementalCCBs;
        !          1403:   unsigned short AllocatedCCBs;
        !          1404:   unsigned short DriverQueueDepth;
        !          1405:   unsigned short HostAdapterQueueDepth;
        !          1406:   unsigned short UntaggedQueueDepth;
        !          1407:   unsigned short CommonQueueDepth;
        !          1408:   unsigned short BusSettleTime;
        !          1409:   unsigned short SynchronousPermitted;
        !          1410:   unsigned short FastPermitted;
        !          1411:   unsigned short UltraPermitted;
        !          1412:   unsigned short WidePermitted;
        !          1413:   unsigned short DisconnectPermitted;
        !          1414:   unsigned short TaggedQueuingPermitted;
        !          1415:   unsigned short ExternalHostAdapterResets;
        !          1416:   unsigned short HostAdapterInternalErrors;
        !          1417:   unsigned short TargetDeviceCount;
        !          1418:   unsigned short MessageBufferLength;
        !          1419:   BusLogic_BusAddress_T BIOS_Address;
        !          1420:   BusLogic_DriverOptions_T *DriverOptions;
        !          1421:   FlashPoint_Info_T FlashPointInfo;
        !          1422:   FlashPoint_CardHandle_T CardHandle;
        !          1423:   struct BusLogic_HostAdapter *Next;
        !          1424:   BusLogic_CCB_T *All_CCBs;
        !          1425:   BusLogic_CCB_T *Free_CCBs;
        !          1426:   BusLogic_CCB_T *FirstCompletedCCB;
        !          1427:   BusLogic_CCB_T *LastCompletedCCB;
        !          1428:   BusLogic_CCB_T *BusDeviceResetPendingCCB[BusLogic_MaxTargetDevices];
        !          1429:   BusLogic_ErrorRecoveryStrategy_T
        !          1430:     ErrorRecoveryStrategy[BusLogic_MaxTargetDevices];
        !          1431:   BusLogic_TargetFlags_T TargetFlags[BusLogic_MaxTargetDevices];
        !          1432:   unsigned char QueueDepth[BusLogic_MaxTargetDevices];
        !          1433:   unsigned char SynchronousPeriod[BusLogic_MaxTargetDevices];
        !          1434:   unsigned char SynchronousOffset[BusLogic_MaxTargetDevices];
        !          1435:   unsigned char ActiveCommands[BusLogic_MaxTargetDevices];
        !          1436:   unsigned int CommandsSinceReset[BusLogic_MaxTargetDevices];
        !          1437:   unsigned long LastSequencePoint[BusLogic_MaxTargetDevices];
        !          1438:   unsigned long LastResetAttempted[BusLogic_MaxTargetDevices];
        !          1439:   unsigned long LastResetCompleted[BusLogic_MaxTargetDevices];
        !          1440:   BusLogic_OutgoingMailbox_T *FirstOutgoingMailbox;
        !          1441:   BusLogic_OutgoingMailbox_T *LastOutgoingMailbox;
        !          1442:   BusLogic_OutgoingMailbox_T *NextOutgoingMailbox;
        !          1443:   BusLogic_IncomingMailbox_T *FirstIncomingMailbox;
        !          1444:   BusLogic_IncomingMailbox_T *LastIncomingMailbox;
        !          1445:   BusLogic_IncomingMailbox_T *NextIncomingMailbox;
        !          1446:   BusLogic_TargetStatistics_T TargetStatistics[BusLogic_MaxTargetDevices];
        !          1447:   unsigned char MailboxSpace[BusLogic_MaxMailboxes
        !          1448:                             * (sizeof(BusLogic_OutgoingMailbox_T)
        !          1449:                                + sizeof(BusLogic_IncomingMailbox_T))];
        !          1450:   char MessageBuffer[BusLogic_MessageBufferSize];
        !          1451: }
        !          1452: BusLogic_HostAdapter_T;
        !          1453: 
        !          1454: 
        !          1455: /*
        !          1456:   Define a structure for the BIOS Disk Parameters.
        !          1457: */
        !          1458: 
        !          1459: typedef struct BIOS_DiskParameters
        !          1460: {
        !          1461:   int Heads;
        !          1462:   int Sectors;
        !          1463:   int Cylinders;
        !          1464: }
        !          1465: BIOS_DiskParameters_T;
        !          1466: 
        !          1467: 
        !          1468: /*
        !          1469:   Define a structure for the SCSI Inquiry command results.
        !          1470: */
        !          1471: 
        !          1472: typedef struct SCSI_Inquiry
        !          1473: {
        !          1474:   unsigned char PeripheralDeviceType:5;                        /* Byte 0 Bits 0-4 */
        !          1475:   unsigned char PeripheralQualifier:3;                 /* Byte 0 Bits 5-7 */
        !          1476:   unsigned char DeviceTypeModifier:7;                  /* Byte 1 Bits 0-6 */
        !          1477:   boolean RMB:1;                                       /* Byte 1 Bit 7 */
        !          1478:   unsigned char ANSI_ApprovedVersion:3;                        /* Byte 2 Bits 0-2 */
        !          1479:   unsigned char ECMA_Version:3;                                /* Byte 2 Bits 3-5 */
        !          1480:   unsigned char ISO_Version:2;                         /* Byte 2 Bits 6-7 */
        !          1481:   unsigned char ResponseDataFormat:4;                  /* Byte 3 Bits 0-3 */
        !          1482:   unsigned char :2;                                    /* Byte 3 Bits 4-5 */
        !          1483:   boolean TrmIOP:1;                                    /* Byte 3 Bit 6 */
        !          1484:   boolean AENC:1;                                      /* Byte 3 Bit 7 */
        !          1485:   unsigned char AdditionalLength;                      /* Byte 4 */
        !          1486:   unsigned char :8;                                    /* Byte 5 */
        !          1487:   unsigned char :8;                                    /* Byte 6 */
        !          1488:   boolean SftRe:1;                                     /* Byte 7 Bit 0 */
        !          1489:   boolean CmdQue:1;                                    /* Byte 7 Bit 1 */
        !          1490:   boolean :1;                                          /* Byte 7 Bit 2 */
        !          1491:   boolean Linked:1;                                    /* Byte 7 Bit 3 */
        !          1492:   boolean Sync:1;                                      /* Byte 7 Bit 4 */
        !          1493:   boolean WBus16:1;                                    /* Byte 7 Bit 5 */
        !          1494:   boolean WBus32:1;                                    /* Byte 7 Bit 6 */
        !          1495:   boolean RelAdr:1;                                    /* Byte 7 Bit 7 */
        !          1496:   unsigned char VendorIdentification[8];               /* Bytes 8-15 */
        !          1497:   unsigned char ProductIdentification[16];             /* Bytes 16-31 */
        !          1498:   unsigned char ProductRevisionLevel[4];               /* Bytes 32-35 */
        !          1499: }
        !          1500: SCSI_Inquiry_T;
        !          1501: 
        !          1502: 
        !          1503: /*
        !          1504:   BusLogic_AcquireHostAdapterLock acquires exclusive access to Host Adapter.
        !          1505: */
        !          1506: 
        !          1507: static inline
        !          1508: void BusLogic_AcquireHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter,
        !          1509:                                     ProcessorFlags_T *ProcessorFlags)
        !          1510: {
        !          1511:   save_flags(*ProcessorFlags);
        !          1512:   cli();
        !          1513: }
        !          1514: 
        !          1515: 
        !          1516: /*
        !          1517:   BusLogic_ReleaseHostAdapterLock releases exclusive access to Host Adapter.
        !          1518: */
        !          1519: 
        !          1520: static inline
        !          1521: void BusLogic_ReleaseHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter,
        !          1522:                                     ProcessorFlags_T *ProcessorFlags)
        !          1523: {
        !          1524:   restore_flags(*ProcessorFlags);
        !          1525: }
        !          1526: 
        !          1527: 
        !          1528: /*
        !          1529:   BusLogic_AcquireHostAdapterLockIH acquires exclusive access to Host Adapter,
        !          1530:   but is only called from the interrupt handler when interrupts are disabled.
        !          1531: */
        !          1532: 
        !          1533: static inline
        !          1534: void BusLogic_AcquireHostAdapterLockIH(BusLogic_HostAdapter_T *HostAdapter,
        !          1535:                                       ProcessorFlags_T *ProcessorFlags)
        !          1536: {
        !          1537: }
        !          1538: 
        !          1539: 
        !          1540: /*
        !          1541:   BusLogic_ReleaseHostAdapterLockIH releases exclusive access to Host Adapter,
        !          1542:   but is only called from the interrupt handler when interrupts are disabled.
        !          1543: */
        !          1544: 
        !          1545: static inline
        !          1546: void BusLogic_ReleaseHostAdapterLockIH(BusLogic_HostAdapter_T *HostAdapter,
        !          1547:                                       ProcessorFlags_T *ProcessorFlags)
        !          1548: {
        !          1549: }
        !          1550: 
        !          1551: 
        !          1552: /*
        !          1553:   Define functions to provide an abstraction for reading and writing the
        !          1554:   Host Adapter I/O Registers.
        !          1555: */
        !          1556: 
        !          1557: static inline
        !          1558: void BusLogic_SCSIBusReset(BusLogic_HostAdapter_T *HostAdapter)
        !          1559: {
        !          1560:   BusLogic_ControlRegister_T ControlRegister;
        !          1561:   ControlRegister.All = 0;
        !          1562:   ControlRegister.Bits.SCSIBusReset = true;
        !          1563:   outb(ControlRegister.All,
        !          1564:        HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
        !          1565: }
        !          1566: 
        !          1567: static inline
        !          1568: void BusLogic_InterruptReset(BusLogic_HostAdapter_T *HostAdapter)
        !          1569: {
        !          1570:   BusLogic_ControlRegister_T ControlRegister;
        !          1571:   ControlRegister.All = 0;
        !          1572:   ControlRegister.Bits.InterruptReset = true;
        !          1573:   outb(ControlRegister.All,
        !          1574:        HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
        !          1575: }
        !          1576: 
        !          1577: static inline
        !          1578: void BusLogic_SoftReset(BusLogic_HostAdapter_T *HostAdapter)
        !          1579: {
        !          1580:   BusLogic_ControlRegister_T ControlRegister;
        !          1581:   ControlRegister.All = 0;
        !          1582:   ControlRegister.Bits.SoftReset = true;
        !          1583:   outb(ControlRegister.All,
        !          1584:        HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
        !          1585: }
        !          1586: 
        !          1587: static inline
        !          1588: void BusLogic_HardReset(BusLogic_HostAdapter_T *HostAdapter)
        !          1589: {
        !          1590:   BusLogic_ControlRegister_T ControlRegister;
        !          1591:   ControlRegister.All = 0;
        !          1592:   ControlRegister.Bits.HardReset = true;
        !          1593:   outb(ControlRegister.All,
        !          1594:        HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
        !          1595: }
        !          1596: 
        !          1597: static inline
        !          1598: unsigned char BusLogic_ReadStatusRegister(BusLogic_HostAdapter_T *HostAdapter)
        !          1599: {
        !          1600:   return inb(HostAdapter->IO_Address + BusLogic_StatusRegisterOffset);
        !          1601: }
        !          1602: 
        !          1603: static inline
        !          1604: void BusLogic_WriteCommandParameterRegister(BusLogic_HostAdapter_T
        !          1605:                                              *HostAdapter,
        !          1606:                                            unsigned char Value)
        !          1607: {
        !          1608:   outb(Value,
        !          1609:        HostAdapter->IO_Address + BusLogic_CommandParameterRegisterOffset);
        !          1610: }
        !          1611: 
        !          1612: static inline
        !          1613: unsigned char BusLogic_ReadDataInRegister(BusLogic_HostAdapter_T *HostAdapter)
        !          1614: {
        !          1615:   return inb(HostAdapter->IO_Address + BusLogic_DataInRegisterOffset);
        !          1616: }
        !          1617: 
        !          1618: static inline
        !          1619: unsigned char BusLogic_ReadInterruptRegister(BusLogic_HostAdapter_T
        !          1620:                                             *HostAdapter)
        !          1621: {
        !          1622:   return inb(HostAdapter->IO_Address + BusLogic_InterruptRegisterOffset);
        !          1623: }
        !          1624: 
        !          1625: static inline
        !          1626: unsigned char BusLogic_ReadGeometryRegister(BusLogic_HostAdapter_T
        !          1627:                                            *HostAdapter)
        !          1628: {
        !          1629:   return inb(HostAdapter->IO_Address + BusLogic_GeometryRegisterOffset);
        !          1630: }
        !          1631: 
        !          1632: 
        !          1633: /*
        !          1634:   BusLogic_StartMailboxCommand issues an Execute Mailbox Command, which
        !          1635:   notifies the Host Adapter that an entry has been made in an Outgoing
        !          1636:   Mailbox.
        !          1637: */
        !          1638: 
        !          1639: static inline
        !          1640: void BusLogic_StartMailboxCommand(BusLogic_HostAdapter_T *HostAdapter)
        !          1641: {
        !          1642:   BusLogic_WriteCommandParameterRegister(HostAdapter,
        !          1643:                                         BusLogic_ExecuteMailboxCommand);
        !          1644: }
        !          1645: 
        !          1646: 
        !          1647: /*
        !          1648:   BusLogic_Delay waits for Seconds to elapse.
        !          1649: */
        !          1650: 
        !          1651: static inline void BusLogic_Delay(int Seconds)
        !          1652: {
        !          1653:   int Milliseconds = 1000 * Seconds;
        !          1654:   unsigned long ProcessorFlags;
        !          1655:   save_flags(ProcessorFlags);
        !          1656:   sti();
        !          1657:   while (--Milliseconds >= 0) udelay(1000);
        !          1658:   restore_flags(ProcessorFlags);
        !          1659: }
        !          1660: 
        !          1661: 
        !          1662: /*
        !          1663:   Virtual_to_Bus and Bus_to_Virtual map between Kernel Virtual Addresses
        !          1664:   and PCI/VLB/EISA/ISA Bus Addresses.
        !          1665: */
        !          1666: 
        !          1667: static inline BusLogic_BusAddress_T Virtual_to_Bus(void *VirtualAddress)
        !          1668: {
        !          1669:   return (BusLogic_BusAddress_T) virt_to_bus(VirtualAddress);
        !          1670: }
        !          1671: 
        !          1672: static inline void *Bus_to_Virtual(BusLogic_BusAddress_T BusAddress)
        !          1673: {
        !          1674:   return (void *) bus_to_virt(BusAddress);
        !          1675: }
        !          1676: 
        !          1677: 
        !          1678: /*
        !          1679:   Virtual_to_32Bit_Virtual maps between Kernel Virtual Addresses and
        !          1680:   32 bit Kernel Virtual Addresses.  This avoids compilation warnings
        !          1681:   on 64 bit architectures.
        !          1682: */
        !          1683: 
        !          1684: static inline
        !          1685: BusLogic_BusAddress_T Virtual_to_32Bit_Virtual(void *VirtualAddress)
        !          1686: {
        !          1687:   return (BusLogic_BusAddress_T) (unsigned long) VirtualAddress;
        !          1688: }
        !          1689: 
        !          1690: 
        !          1691: /*
        !          1692:   BusLogic_IncrementErrorCounter increments Error Counter by 1, stopping at
        !          1693:   65535 rather than wrapping around to 0.
        !          1694: */
        !          1695: 
        !          1696: static inline void BusLogic_IncrementErrorCounter(unsigned short *ErrorCounter)
        !          1697: {
        !          1698:   if (*ErrorCounter < 65535) (*ErrorCounter)++;
        !          1699: }
        !          1700: 
        !          1701: 
        !          1702: /*
        !          1703:   BusLogic_IncrementByteCounter increments Byte Counter by Amount.
        !          1704: */
        !          1705: 
        !          1706: static inline void BusLogic_IncrementByteCounter(BusLogic_ByteCounter_T
        !          1707:                                                   *ByteCounter,
        !          1708:                                                 unsigned int Amount)
        !          1709: {
        !          1710:   ByteCounter->Units += Amount;
        !          1711:   if (ByteCounter->Units > 999999999)
        !          1712:     {
        !          1713:       ByteCounter->Units -= 1000000000;
        !          1714:       ByteCounter->Billions++;
        !          1715:     }
        !          1716: }
        !          1717: 
        !          1718: 
        !          1719: /*
        !          1720:   BusLogic_IncrementSizeBucket increments the Bucket for Amount.
        !          1721: */
        !          1722: 
        !          1723: static inline void BusLogic_IncrementSizeBucket(BusLogic_CommandSizeBuckets_T
        !          1724:                                                  CommandSizeBuckets,
        !          1725:                                                unsigned int Amount)
        !          1726: {
        !          1727:   int Index = 0;
        !          1728:   if (Amount < 8*1024)
        !          1729:     {
        !          1730:       if (Amount < 2*1024)
        !          1731:        Index = (Amount < 1*1024 ? 0 : 1);
        !          1732:       else Index = (Amount < 4*1024 ? 2 : 3);
        !          1733:     }
        !          1734:   else if (Amount < 128*1024)
        !          1735:     {
        !          1736:       if (Amount < 32*1024)
        !          1737:        Index = (Amount < 16*1024 ? 4 : 5);
        !          1738:       else Index = (Amount < 64*1024 ? 6 : 7);
        !          1739:     }
        !          1740:   else Index = (Amount < 256*1024 ? 8 : 9);
        !          1741:   CommandSizeBuckets[Index]++;
        !          1742: }
        !          1743: 
        !          1744: 
        !          1745: /*
        !          1746:   Define the version number of the FlashPoint Firmware (SCCB Manager).
        !          1747: */
        !          1748: 
        !          1749: #define FlashPoint_FirmwareVersion             "5.02"
        !          1750: 
        !          1751: 
        !          1752: /*
        !          1753:   Define the possible return values from FlashPoint_HandleInterrupt.
        !          1754: */
        !          1755: 
        !          1756: #define FlashPoint_NormalInterrupt             0x00
        !          1757: #define FlashPoint_InternalError               0xFE
        !          1758: #define FlashPoint_ExternalBusReset            0xFF
        !          1759: 
        !          1760: 
        !          1761: /*
        !          1762:   Define prototypes for the forward referenced BusLogic Driver
        !          1763:   Internal Functions.
        !          1764: */
        !          1765: 
        !          1766: static void BusLogic_QueueCompletedCCB(BusLogic_CCB_T *);
        !          1767: static void BusLogic_InterruptHandler(int, void *, Registers_T *);
        !          1768: static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *,
        !          1769:                                     SCSI_Command_T *, unsigned int);
        !          1770: static void BusLogic_Message(BusLogic_MessageLevel_T, char *,
        !          1771:                             BusLogic_HostAdapter_T *, ...);
        !          1772: static void BusLogic_ParseDriverOptions(char *);
        !          1773: 
        !          1774: 
        !          1775: #endif /* BusLogic_DriverVersion */

unix.superglobalmegacorp.com

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