Linux-2.6.12-rc2

Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.

Let it rip!
diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h
new file mode 100644
index 0000000..1aaa656
--- /dev/null
+++ b/drivers/scsi/BusLogic.h
@@ -0,0 +1,1359 @@
+/*
+
+  Linux Driver for BusLogic MultiMaster and FlashPoint SCSI Host Adapters
+
+  Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>
+
+  This program is free software; you may redistribute and/or modify it under
+  the terms of the GNU General Public License Version 2 as published by the
+  Free Software Foundation.
+
+  This program is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
+  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+  for complete details.
+
+  The author respectfully requests that any modifications to this software be
+  sent directly to him for evaluation and testing.
+
+  Special thanks to Wayne Yen, Jin-Lon Hon, and Alex Win of BusLogic, whose
+  advice has been invaluable, to David Gentzel, for writing the original Linux
+  BusLogic driver, and to Paul Gortmaker, for being such a dedicated test site.
+
+  Finally, special thanks to Mylex/BusLogic for making the FlashPoint SCCB
+  Manager available as freely redistributable source code.
+
+*/
+
+#ifndef _BUSLOGIC_H
+#define _BUSLOGIC_H
+
+#include <linux/config.h>
+
+#ifndef PACKED
+#define PACKED __attribute__((packed))
+#endif
+
+/*
+  FlashPoint support is only available for the Intel x86 Architecture with
+  CONFIG_PCI set.
+*/
+
+#ifndef __i386__
+#undef CONFIG_SCSI_OMIT_FLASHPOINT
+#define CONFIG_SCSI_OMIT_FLASHPOINT
+#endif
+
+#ifndef CONFIG_PCI
+#undef CONFIG_SCSI_OMIT_FLASHPOINT
+#define CONFIG_SCSI_OMIT_FLASHPOINT
+#define BusLogic_InitializeProbeInfoListISA BusLogic_InitializeProbeInfoList
+#endif
+
+
+/*
+  Define the maximum number of BusLogic Host Adapters supported by this driver.
+*/
+
+#define BusLogic_MaxHostAdapters		16
+
+
+/*
+  Define the maximum number of Target Devices supported by this driver.
+*/
+
+#define BusLogic_MaxTargetDevices		16
+
+
+/*
+  Define the maximum number of Scatter/Gather Segments used by this driver.
+  For optimal performance, it is important that this limit be at least as
+  large as the largest single request generated by the I/O Subsystem.
+*/
+
+#define BusLogic_ScatterGatherLimit		128
+
+
+/*
+  Define the maximum, maximum automatic, minimum automatic, and default Queue
+  Depth to allow for Target Devices depending on whether or not they support
+  Tagged Queuing and whether or not ISA Bounce Buffers are required.
+*/
+
+#define BusLogic_MaxTaggedQueueDepth		64
+#define BusLogic_MaxAutomaticTaggedQueueDepth	28
+#define BusLogic_MinAutomaticTaggedQueueDepth	7
+#define BusLogic_TaggedQueueDepthBB		3
+#define BusLogic_UntaggedQueueDepth		3
+#define BusLogic_UntaggedQueueDepthBB		2
+
+
+/*
+  Define the default amount of time in seconds to wait between a Host Adapter
+  Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI commands.
+  Some SCSI devices get confused if they receive SCSI commands too soon after
+  a SCSI Bus Reset.
+*/
+
+#define BusLogic_DefaultBusSettleTime		2
+
+
+/*
+  Define the maximum number of Mailboxes that should be used for MultiMaster
+  Host Adapters.  This number is chosen to be larger than the maximum Host
+  Adapter Queue Depth and small enough so that the Host Adapter structure
+  does not cross an allocation block size boundary.
+*/
+
+#define BusLogic_MaxMailboxes			211
+
+
+/*
+  Define the number of CCBs that should be allocated as a group to optimize
+  Kernel memory allocation.
+*/
+
+#define BusLogic_CCB_AllocationGroupSize	7
+
+
+/*
+  Define the Host Adapter Line and Message Buffer Sizes.
+*/
+
+#define BusLogic_LineBufferSize			100
+#define BusLogic_MessageBufferSize		9700
+
+
+/*
+  Define the Driver Message Levels.
+*/
+
+enum BusLogic_MessageLevel {
+	BusLogic_AnnounceLevel = 0,
+	BusLogic_InfoLevel = 1,
+	BusLogic_NoticeLevel = 2,
+	BusLogic_WarningLevel = 3,
+	BusLogic_ErrorLevel = 4
+};
+
+static char *BusLogic_MessageLevelMap[] = { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING, KERN_ERR };
+
+
+/*
+  Define Driver Message macros.
+*/
+
+#define BusLogic_Announce(Format, Arguments...) \
+  BusLogic_Message(BusLogic_AnnounceLevel, Format, ##Arguments)
+
+#define BusLogic_Info(Format, Arguments...) \
+  BusLogic_Message(BusLogic_InfoLevel, Format, ##Arguments)
+
+#define BusLogic_Notice(Format, Arguments...) \
+  BusLogic_Message(BusLogic_NoticeLevel, Format, ##Arguments)
+
+#define BusLogic_Warning(Format, Arguments...) \
+  BusLogic_Message(BusLogic_WarningLevel, Format, ##Arguments)
+
+#define BusLogic_Error(Format, Arguments...) \
+  BusLogic_Message(BusLogic_ErrorLevel, Format, ##Arguments)
+
+
+/*
+  Define the types of BusLogic Host Adapters that are supported and the number
+  of I/O Addresses required by each type.
+*/
+
+enum BusLogic_HostAdapterType {
+	BusLogic_MultiMaster = 1,
+	BusLogic_FlashPoint = 2
+} PACKED;
+
+#define BusLogic_MultiMasterAddressCount	4
+#define BusLogic_FlashPointAddressCount		256
+
+static int BusLogic_HostAdapterAddressCount[3] = { 0, BusLogic_MultiMasterAddressCount, BusLogic_FlashPointAddressCount };
+
+
+/*
+  Define macros for testing the Host Adapter Type.
+*/
+
+#ifndef CONFIG_SCSI_OMIT_FLASHPOINT
+
+#define BusLogic_MultiMasterHostAdapterP(HostAdapter) \
+  (HostAdapter->HostAdapterType == BusLogic_MultiMaster)
+
+#define BusLogic_FlashPointHostAdapterP(HostAdapter) \
+  (HostAdapter->HostAdapterType == BusLogic_FlashPoint)
+
+#else
+
+#define BusLogic_MultiMasterHostAdapterP(HostAdapter) \
+  (true)
+
+#define BusLogic_FlashPointHostAdapterP(HostAdapter) \
+  (false)
+
+#endif
+
+
+/*
+  Define the possible Host Adapter Bus Types.
+*/
+
+enum BusLogic_HostAdapterBusType {
+	BusLogic_Unknown_Bus = 0,
+	BusLogic_ISA_Bus = 1,
+	BusLogic_EISA_Bus = 2,
+	BusLogic_PCI_Bus = 3,
+	BusLogic_VESA_Bus = 4,
+	BusLogic_MCA_Bus = 5
+} PACKED;
+
+static char *BusLogic_HostAdapterBusNames[] = { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" };
+
+static enum BusLogic_HostAdapterBusType BusLogic_HostAdapterBusTypes[] = {
+	BusLogic_VESA_Bus,	/* BT-4xx */
+	BusLogic_ISA_Bus,	/* BT-5xx */
+	BusLogic_MCA_Bus,	/* BT-6xx */
+	BusLogic_EISA_Bus,	/* BT-7xx */
+	BusLogic_Unknown_Bus,	/* BT-8xx */
+	BusLogic_PCI_Bus	/* BT-9xx */
+};
+
+/*
+  Define the possible Host Adapter BIOS Disk Geometry Translations.
+*/
+
+enum BusLogic_BIOS_DiskGeometryTranslation {
+	BusLogic_BIOS_Disk_Not_Installed = 0,
+	BusLogic_BIOS_Disk_Installed_64x32 = 1,
+	BusLogic_BIOS_Disk_Installed_128x32 = 2,
+	BusLogic_BIOS_Disk_Installed_255x63 = 3
+} PACKED;
+
+
+/*
+  Define a Boolean data type.
+*/
+
+typedef enum {
+	false,
+	true
+} PACKED boolean;
+
+/*
+  Define a 10^18 Statistics Byte Counter data type.
+*/
+
+struct BusLogic_ByteCounter {
+	unsigned int Units;
+	unsigned int Billions;
+};
+
+
+/*
+  Define the structure for I/O Address and Bus Probing Information.
+*/
+
+struct BusLogic_ProbeInfo {
+	enum BusLogic_HostAdapterType HostAdapterType;
+	enum BusLogic_HostAdapterBusType HostAdapterBusType;
+	unsigned long IO_Address;
+	unsigned long PCI_Address;
+	struct pci_dev *PCI_Device;
+	unsigned char Bus;
+	unsigned char Device;
+	unsigned char IRQ_Channel;
+};
+
+/*
+  Define the Probe Options.
+*/
+
+struct BusLogic_ProbeOptions {
+	boolean NoProbe:1;	/* Bit 0 */
+	boolean NoProbeISA:1;	/* Bit 1 */
+	boolean NoProbePCI:1;	/* Bit 2 */
+	boolean NoSortPCI:1;	/* Bit 3 */
+	boolean MultiMasterFirst:1;	/* Bit 4 */
+	boolean FlashPointFirst:1;	/* Bit 5 */
+	boolean LimitedProbeISA:1;	/* Bit 6 */
+	boolean Probe330:1;	/* Bit 7 */
+	boolean Probe334:1;	/* Bit 8 */
+	boolean Probe230:1;	/* Bit 9 */
+	boolean Probe234:1;	/* Bit 10 */
+	boolean Probe130:1;	/* Bit 11 */
+	boolean Probe134:1;	/* Bit 12 */
+};
+
+/*
+  Define the Global Options.
+*/
+
+struct BusLogic_GlobalOptions {
+	boolean TraceProbe:1;	/* Bit 0 */
+	boolean TraceHardwareReset:1;	/* Bit 1 */
+	boolean TraceConfiguration:1;	/* Bit 2 */
+	boolean TraceErrors:1;	/* Bit 3 */
+};
+
+/*
+  Define the Local Options.
+*/
+
+struct BusLogic_LocalOptions {
+	boolean InhibitTargetInquiry:1;	/* Bit 0 */
+};
+
+/*
+  Define the BusLogic SCSI Host Adapter I/O Register Offsets.
+*/
+
+#define BusLogic_ControlRegisterOffset		0	/* WO register */
+#define BusLogic_StatusRegisterOffset		0	/* RO register */
+#define BusLogic_CommandParameterRegisterOffset	1	/* WO register */
+#define BusLogic_DataInRegisterOffset		1	/* RO register */
+#define BusLogic_InterruptRegisterOffset	2	/* RO register */
+#define BusLogic_GeometryRegisterOffset		3	/* RO register */
+
+/*
+  Define the structure of the write-only Control Register.
+*/
+
+union BusLogic_ControlRegister {
+	unsigned char All;
+	struct {
+		unsigned char:4;	/* Bits 0-3 */
+		boolean SCSIBusReset:1;	/* Bit 4 */
+		boolean InterruptReset:1;	/* Bit 5 */
+		boolean SoftReset:1;	/* Bit 6 */
+		boolean HardReset:1;	/* Bit 7 */
+	} cr;
+};
+
+/*
+  Define the structure of the read-only Status Register.
+*/
+
+union BusLogic_StatusRegister {
+	unsigned char All;
+	struct {
+		boolean CommandInvalid:1;	/* Bit 0 */
+		boolean Reserved:1;	/* Bit 1 */
+		boolean DataInRegisterReady:1;	/* Bit 2 */
+		boolean CommandParameterRegisterBusy:1;	/* Bit 3 */
+		boolean HostAdapterReady:1;	/* Bit 4 */
+		boolean InitializationRequired:1;	/* Bit 5 */
+		boolean DiagnosticFailure:1;	/* Bit 6 */
+		boolean DiagnosticActive:1;	/* Bit 7 */
+	} sr;
+};
+
+/*
+  Define the structure of the read-only Interrupt Register.
+*/
+
+union BusLogic_InterruptRegister {
+	unsigned char All;
+	struct {
+		boolean IncomingMailboxLoaded:1;	/* Bit 0 */
+		boolean OutgoingMailboxAvailable:1;	/* Bit 1 */
+		boolean CommandComplete:1;	/* Bit 2 */
+		boolean ExternalBusReset:1;	/* Bit 3 */
+		unsigned char Reserved:3;	/* Bits 4-6 */
+		boolean InterruptValid:1;	/* Bit 7 */
+	} ir;
+};
+
+/*
+  Define the structure of the read-only Geometry Register.
+*/
+
+union BusLogic_GeometryRegister {
+	unsigned char All;
+	struct {
+		enum BusLogic_BIOS_DiskGeometryTranslation Drive0Geometry:2;	/* Bits 0-1 */
+		enum BusLogic_BIOS_DiskGeometryTranslation Drive1Geometry:2;	/* Bits 2-3 */
+		unsigned char:3;	/* Bits 4-6 */
+		boolean ExtendedTranslationEnabled:1;	/* Bit 7 */
+	} gr;
+};
+
+/*
+  Define the BusLogic SCSI Host Adapter Command Register Operation Codes.
+*/
+
+enum BusLogic_OperationCode {
+	BusLogic_TestCommandCompleteInterrupt = 0x00,
+	BusLogic_InitializeMailbox = 0x01,
+	BusLogic_ExecuteMailboxCommand = 0x02,
+	BusLogic_ExecuteBIOSCommand = 0x03,
+	BusLogic_InquireBoardID = 0x04,
+	BusLogic_EnableOutgoingMailboxAvailableInt = 0x05,
+	BusLogic_SetSCSISelectionTimeout = 0x06,
+	BusLogic_SetPreemptTimeOnBus = 0x07,
+	BusLogic_SetTimeOffBus = 0x08,
+	BusLogic_SetBusTransferRate = 0x09,
+	BusLogic_InquireInstalledDevicesID0to7 = 0x0A,
+	BusLogic_InquireConfiguration = 0x0B,
+	BusLogic_EnableTargetMode = 0x0C,
+	BusLogic_InquireSetupInformation = 0x0D,
+	BusLogic_WriteAdapterLocalRAM = 0x1A,
+	BusLogic_ReadAdapterLocalRAM = 0x1B,
+	BusLogic_WriteBusMasterChipFIFO = 0x1C,
+	BusLogic_ReadBusMasterChipFIFO = 0x1D,
+	BusLogic_EchoCommandData = 0x1F,
+	BusLogic_HostAdapterDiagnostic = 0x20,
+	BusLogic_SetAdapterOptions = 0x21,
+	BusLogic_InquireInstalledDevicesID8to15 = 0x23,
+	BusLogic_InquireTargetDevices = 0x24,
+	BusLogic_DisableHostAdapterInterrupt = 0x25,
+	BusLogic_InitializeExtendedMailbox = 0x81,
+	BusLogic_ExecuteSCSICommand = 0x83,
+	BusLogic_InquireFirmwareVersion3rdDigit = 0x84,
+	BusLogic_InquireFirmwareVersionLetter = 0x85,
+	BusLogic_InquirePCIHostAdapterInformation = 0x86,
+	BusLogic_InquireHostAdapterModelNumber = 0x8B,
+	BusLogic_InquireSynchronousPeriod = 0x8C,
+	BusLogic_InquireExtendedSetupInformation = 0x8D,
+	BusLogic_EnableStrictRoundRobinMode = 0x8F,
+	BusLogic_StoreHostAdapterLocalRAM = 0x90,
+	BusLogic_FetchHostAdapterLocalRAM = 0x91,
+	BusLogic_StoreLocalDataInEEPROM = 0x92,
+	BusLogic_UploadAutoSCSICode = 0x94,
+	BusLogic_ModifyIOAddress = 0x95,
+	BusLogic_SetCCBFormat = 0x96,
+	BusLogic_WriteInquiryBuffer = 0x9A,
+	BusLogic_ReadInquiryBuffer = 0x9B,
+	BusLogic_FlashROMUploadDownload = 0xA7,
+	BusLogic_ReadSCAMData = 0xA8,
+	BusLogic_WriteSCAMData = 0xA9
+};
+
+/*
+  Define the Inquire Board ID reply structure.
+*/
+
+struct BusLogic_BoardID {
+	unsigned char BoardType;	/* Byte 0 */
+	unsigned char CustomFeatures;	/* Byte 1 */
+	unsigned char FirmwareVersion1stDigit;	/* Byte 2 */
+	unsigned char FirmwareVersion2ndDigit;	/* Byte 3 */
+};
+
+/*
+  Define the Inquire Configuration reply structure.
+*/
+
+struct BusLogic_Configuration {
+	unsigned char:5;	/* Byte 0 Bits 0-4 */
+	boolean DMA_Channel5:1;	/* Byte 0 Bit 5 */
+	boolean DMA_Channel6:1;	/* Byte 0 Bit 6 */
+	boolean DMA_Channel7:1;	/* Byte 0 Bit 7 */
+	boolean IRQ_Channel9:1;	/* Byte 1 Bit 0 */
+	boolean IRQ_Channel10:1;	/* Byte 1 Bit 1 */
+	boolean IRQ_Channel11:1;	/* Byte 1 Bit 2 */
+	boolean IRQ_Channel12:1;	/* Byte 1 Bit 3 */
+	unsigned char:1;	/* Byte 1 Bit 4 */
+	boolean IRQ_Channel14:1;	/* Byte 1 Bit 5 */
+	boolean IRQ_Channel15:1;	/* Byte 1 Bit 6 */
+	unsigned char:1;	/* Byte 1 Bit 7 */
+	unsigned char HostAdapterID:4;	/* Byte 2 Bits 0-3 */
+	unsigned char:4;	/* Byte 2 Bits 4-7 */
+};
+
+/*
+  Define the Inquire Setup Information reply structure.
+*/
+
+struct BusLogic_SynchronousValue {
+	unsigned char Offset:4;	/* Bits 0-3 */
+	unsigned char TransferPeriod:3;	/* Bits 4-6 */
+	boolean Synchronous:1;	/* Bit 7 */
+};
+
+struct BusLogic_SetupInformation {
+	boolean SynchronousInitiationEnabled:1;	/* Byte 0 Bit 0 */
+	boolean ParityCheckingEnabled:1;	/* Byte 0 Bit 1 */
+	unsigned char:6;	/* Byte 0 Bits 2-7 */
+	unsigned char BusTransferRate;	/* Byte 1 */
+	unsigned char PreemptTimeOnBus;	/* Byte 2 */
+	unsigned char TimeOffBus;	/* Byte 3 */
+	unsigned char MailboxCount;	/* Byte 4 */
+	unsigned char MailboxAddress[3];	/* Bytes 5-7 */
+	struct BusLogic_SynchronousValue SynchronousValuesID0to7[8];	/* Bytes 8-15 */
+	unsigned char DisconnectPermittedID0to7;	/* Byte 16 */
+	unsigned char Signature;	/* Byte 17 */
+	unsigned char CharacterD;	/* Byte 18 */
+	unsigned char HostBusType;	/* Byte 19 */
+	unsigned char WideTransfersPermittedID0to7;	/* Byte 20 */
+	unsigned char WideTransfersActiveID0to7;	/* Byte 21 */
+	struct BusLogic_SynchronousValue SynchronousValuesID8to15[8];	/* Bytes 22-29 */
+	unsigned char DisconnectPermittedID8to15;	/* Byte 30 */
+	unsigned char:8;	/* Byte 31 */
+	unsigned char WideTransfersPermittedID8to15;	/* Byte 32 */
+	unsigned char WideTransfersActiveID8to15;	/* Byte 33 */
+};
+
+/*
+  Define the Initialize Extended Mailbox request structure.
+*/
+
+struct BusLogic_ExtendedMailboxRequest {
+	unsigned char MailboxCount;	/* Byte 0 */
+	u32 BaseMailboxAddress;	/* Bytes 1-4 */
+} PACKED;
+
+
+/*
+  Define the Inquire PCI Host Adapter Information reply type.  The ISA
+  Compatible I/O Port values are defined here and are also used with
+  the Modify I/O Address command.
+*/
+
+enum BusLogic_ISACompatibleIOPort {
+	BusLogic_IO_330 = 0,
+	BusLogic_IO_334 = 1,
+	BusLogic_IO_230 = 2,
+	BusLogic_IO_234 = 3,
+	BusLogic_IO_130 = 4,
+	BusLogic_IO_134 = 5,
+	BusLogic_IO_Disable = 6,
+	BusLogic_IO_Disable2 = 7
+} PACKED;
+
+struct BusLogic_PCIHostAdapterInformation {
+	enum BusLogic_ISACompatibleIOPort ISACompatibleIOPort;	/* Byte 0 */
+	unsigned char PCIAssignedIRQChannel;	/* Byte 1 */
+	boolean LowByteTerminated:1;	/* Byte 2 Bit 0 */
+	boolean HighByteTerminated:1;	/* Byte 2 Bit 1 */
+	unsigned char:2;	/* Byte 2 Bits 2-3 */
+	boolean JP1:1;		/* Byte 2 Bit 4 */
+	boolean JP2:1;		/* Byte 2 Bit 5 */
+	boolean JP3:1;		/* Byte 2 Bit 6 */
+	boolean GenericInfoValid:1;	/* Byte 2 Bit 7 */
+	unsigned char:8;	/* Byte 3 */
+};
+
+/*
+  Define the Inquire Extended Setup Information reply structure.
+*/
+
+struct BusLogic_ExtendedSetupInformation {
+	unsigned char BusType;	/* Byte 0 */
+	unsigned char BIOS_Address;	/* Byte 1 */
+	unsigned short ScatterGatherLimit;	/* Bytes 2-3 */
+	unsigned char MailboxCount;	/* Byte 4 */
+	u32 BaseMailboxAddress;	/* Bytes 5-8 */
+	struct {
+		unsigned char:2;	/* Byte 9 Bits 0-1 */
+		boolean FastOnEISA:1;	/* Byte 9 Bit 2 */
+		unsigned char:3;	/* Byte 9 Bits 3-5 */
+		boolean LevelSensitiveInterrupt:1;	/* Byte 9 Bit 6 */
+		unsigned char:1;	/* Byte 9 Bit 7 */
+	} Misc;
+	unsigned char FirmwareRevision[3];	/* Bytes 10-12 */
+	boolean HostWideSCSI:1;	/* Byte 13 Bit 0 */
+	boolean HostDifferentialSCSI:1;	/* Byte 13 Bit 1 */
+	boolean HostSupportsSCAM:1;	/* Byte 13 Bit 2 */
+	boolean HostUltraSCSI:1;	/* Byte 13 Bit 3 */
+	boolean HostSmartTermination:1;	/* Byte 13 Bit 4 */
+	unsigned char:3;	/* Byte 13 Bits 5-7 */
+} PACKED;
+
+/*
+  Define the Enable Strict Round Robin Mode request type.
+*/
+
+enum BusLogic_RoundRobinModeRequest {
+	BusLogic_AggressiveRoundRobinMode = 0,
+	BusLogic_StrictRoundRobinMode = 1
+} PACKED;
+
+
+/*
+  Define the Fetch Host Adapter Local RAM request type.
+*/
+
+#define BusLogic_BIOS_BaseOffset		0
+#define BusLogic_AutoSCSI_BaseOffset		64
+
+struct BusLogic_FetchHostAdapterLocalRAMRequest {
+	unsigned char ByteOffset;	/* Byte 0 */
+	unsigned char ByteCount;	/* Byte 1 */
+};
+
+/*
+  Define the Host Adapter Local RAM AutoSCSI structure.
+*/
+
+struct BusLogic_AutoSCSIData {
+	unsigned char InternalFactorySignature[2];	/* Bytes 0-1 */
+	unsigned char InformationByteCount;	/* Byte 2 */
+	unsigned char HostAdapterType[6];	/* Bytes 3-8 */
+	unsigned char:8;	/* Byte 9 */
+	boolean FloppyEnabled:1;	/* Byte 10 Bit 0 */
+	boolean FloppySecondary:1;	/* Byte 10 Bit 1 */
+	boolean LevelSensitiveInterrupt:1;	/* Byte 10 Bit 2 */
+	unsigned char:2;	/* Byte 10 Bits 3-4 */
+	unsigned char SystemRAMAreaForBIOS:3;	/* Byte 10 Bits 5-7 */
+	unsigned char DMA_Channel:7;	/* Byte 11 Bits 0-6 */
+	boolean DMA_AutoConfiguration:1;	/* Byte 11 Bit 7 */
+	unsigned char IRQ_Channel:7;	/* Byte 12 Bits 0-6 */
+	boolean IRQ_AutoConfiguration:1;	/* Byte 12 Bit 7 */
+	unsigned char DMA_TransferRate;	/* Byte 13 */
+	unsigned char SCSI_ID;	/* Byte 14 */
+	boolean LowByteTerminated:1;	/* Byte 15 Bit 0 */
+	boolean ParityCheckingEnabled:1;	/* Byte 15 Bit 1 */
+	boolean HighByteTerminated:1;	/* Byte 15 Bit 2 */
+	boolean NoisyCablingEnvironment:1;	/* Byte 15 Bit 3 */
+	boolean FastSynchronousNegotiation:1;	/* Byte 15 Bit 4 */
+	boolean BusResetEnabled:1;	/* Byte 15 Bit 5 */
+	 boolean:1;		/* Byte 15 Bit 6 */
+	boolean ActiveNegationEnabled:1;	/* Byte 15 Bit 7 */
+	unsigned char BusOnDelay;	/* Byte 16 */
+	unsigned char BusOffDelay;	/* Byte 17 */
+	boolean HostAdapterBIOSEnabled:1;	/* Byte 18 Bit 0 */
+	boolean BIOSRedirectionOfINT19Enabled:1;	/* Byte 18 Bit 1 */
+	boolean ExtendedTranslationEnabled:1;	/* Byte 18 Bit 2 */
+	boolean MapRemovableAsFixedEnabled:1;	/* Byte 18 Bit 3 */
+	 boolean:1;		/* Byte 18 Bit 4 */
+	boolean BIOSSupportsMoreThan2DrivesEnabled:1;	/* Byte 18 Bit 5 */
+	boolean BIOSInterruptModeEnabled:1;	/* Byte 18 Bit 6 */
+	boolean FlopticalSupportEnabled:1;	/* Byte 19 Bit 7 */
+	unsigned short DeviceEnabled;	/* Bytes 19-20 */
+	unsigned short WidePermitted;	/* Bytes 21-22 */
+	unsigned short FastPermitted;	/* Bytes 23-24 */
+	unsigned short SynchronousPermitted;	/* Bytes 25-26 */
+	unsigned short DisconnectPermitted;	/* Bytes 27-28 */
+	unsigned short SendStartUnitCommand;	/* Bytes 29-30 */
+	unsigned short IgnoreInBIOSScan;	/* Bytes 31-32 */
+	unsigned char PCIInterruptPin:2;	/* Byte 33 Bits 0-1 */
+	unsigned char HostAdapterIOPortAddress:2;	/* Byte 33 Bits 2-3 */
+	boolean StrictRoundRobinModeEnabled:1;	/* Byte 33 Bit 4 */
+	boolean VESABusSpeedGreaterThan33MHz:1;	/* Byte 33 Bit 5 */
+	boolean VESABurstWriteEnabled:1;	/* Byte 33 Bit 6 */
+	boolean VESABurstReadEnabled:1;	/* Byte 33 Bit 7 */
+	unsigned short UltraPermitted;	/* Bytes 34-35 */
+	unsigned int:32;	/* Bytes 36-39 */
+	unsigned char:8;	/* Byte 40 */
+	unsigned char AutoSCSIMaximumLUN;	/* Byte 41 */
+	 boolean:1;		/* Byte 42 Bit 0 */
+	boolean SCAM_Dominant:1;	/* Byte 42 Bit 1 */
+	boolean SCAM_Enabled:1;	/* Byte 42 Bit 2 */
+	boolean SCAM_Level2:1;	/* Byte 42 Bit 3 */
+	unsigned char:4;	/* Byte 42 Bits 4-7 */
+	boolean INT13ExtensionEnabled:1;	/* Byte 43 Bit 0 */
+	 boolean:1;		/* Byte 43 Bit 1 */
+	boolean CDROMBootEnabled:1;	/* Byte 43 Bit 2 */
+	unsigned char:5;	/* Byte 43 Bits 3-7 */
+	unsigned char BootTargetID:4;	/* Byte 44 Bits 0-3 */
+	unsigned char BootChannel:4;	/* Byte 44 Bits 4-7 */
+	unsigned char ForceBusDeviceScanningOrder:1;	/* Byte 45 Bit 0 */
+	unsigned char:7;	/* Byte 45 Bits 1-7 */
+	unsigned short NonTaggedToAlternateLUNPermitted;	/* Bytes 46-47 */
+	unsigned short RenegotiateSyncAfterCheckCondition;	/* Bytes 48-49 */
+	unsigned char Reserved[10];	/* Bytes 50-59 */
+	unsigned char ManufacturingDiagnostic[2];	/* Bytes 60-61 */
+	unsigned short Checksum;	/* Bytes 62-63 */
+} PACKED;
+
+/*
+  Define the Host Adapter Local RAM Auto SCSI Byte 45 structure.
+*/
+
+struct BusLogic_AutoSCSIByte45 {
+	unsigned char ForceBusDeviceScanningOrder:1;	/* Bit 0 */
+	unsigned char:7;	/* Bits 1-7 */
+};
+
+/*
+  Define the Host Adapter Local RAM BIOS Drive Map Byte structure.
+*/
+
+#define BusLogic_BIOS_DriveMapOffset		17
+
+struct BusLogic_BIOSDriveMapByte {
+	unsigned char TargetIDBit3:1;	/* Bit 0 */
+	unsigned char:2;	/* Bits 1-2 */
+	enum BusLogic_BIOS_DiskGeometryTranslation DiskGeometry:2;	/* Bits 3-4 */
+	unsigned char TargetID:3;	/* Bits 5-7 */
+};
+
+/*
+  Define the Set CCB Format request type.  Extended LUN Format CCBs are
+  necessary to support more than 8 Logical Units per Target Device.
+*/
+
+enum BusLogic_SetCCBFormatRequest {
+	BusLogic_LegacyLUNFormatCCB = 0,
+	BusLogic_ExtendedLUNFormatCCB = 1
+} PACKED;
+
+/*
+  Define the Outgoing Mailbox Action Codes.
+*/
+
+enum BusLogic_ActionCode {
+	BusLogic_OutgoingMailboxFree = 0x00,
+	BusLogic_MailboxStartCommand = 0x01,
+	BusLogic_MailboxAbortCommand = 0x02
+} PACKED;
+
+
+/*
+  Define the Incoming Mailbox Completion Codes.  The MultiMaster Firmware
+  only uses codes 0 - 4.  The FlashPoint SCCB Manager has no mailboxes, so
+  completion codes are stored in the CCB; it only uses codes 1, 2, 4, and 5.
+*/
+
+enum BusLogic_CompletionCode {
+	BusLogic_IncomingMailboxFree = 0x00,
+	BusLogic_CommandCompletedWithoutError = 0x01,
+	BusLogic_CommandAbortedAtHostRequest = 0x02,
+	BusLogic_AbortedCommandNotFound = 0x03,
+	BusLogic_CommandCompletedWithError = 0x04,
+	BusLogic_InvalidCCB = 0x05
+} PACKED;
+
+/*
+  Define the Command Control Block (CCB) Opcodes.
+*/
+
+enum BusLogic_CCB_Opcode {
+	BusLogic_InitiatorCCB = 0x00,
+	BusLogic_TargetCCB = 0x01,
+	BusLogic_InitiatorCCB_ScatterGather = 0x02,
+	BusLogic_InitiatorCCB_ResidualDataLength = 0x03,
+	BusLogic_InitiatorCCB_ScatterGatherResidual = 0x04,
+	BusLogic_BusDeviceReset = 0x81
+} PACKED;
+
+
+/*
+  Define the CCB Data Direction Codes.
+*/
+
+enum BusLogic_DataDirection {
+	BusLogic_UncheckedDataTransfer = 0,
+	BusLogic_DataInLengthChecked = 1,
+	BusLogic_DataOutLengthChecked = 2,
+	BusLogic_NoDataTransfer = 3
+};
+
+
+/*
+  Define the Host Adapter Status Codes.  The MultiMaster Firmware does not
+  return status code 0x0C; it uses 0x12 for both overruns and underruns.
+*/
+
+enum BusLogic_HostAdapterStatus {
+	BusLogic_CommandCompletedNormally = 0x00,
+	BusLogic_LinkedCommandCompleted = 0x0A,
+	BusLogic_LinkedCommandCompletedWithFlag = 0x0B,
+	BusLogic_DataUnderRun = 0x0C,
+	BusLogic_SCSISelectionTimeout = 0x11,
+	BusLogic_DataOverRun = 0x12,
+	BusLogic_UnexpectedBusFree = 0x13,
+	BusLogic_InvalidBusPhaseRequested = 0x14,
+	BusLogic_InvalidOutgoingMailboxActionCode = 0x15,
+	BusLogic_InvalidCommandOperationCode = 0x16,
+	BusLogic_LinkedCCBhasInvalidLUN = 0x17,
+	BusLogic_InvalidCommandParameter = 0x1A,
+	BusLogic_AutoRequestSenseFailed = 0x1B,
+	BusLogic_TaggedQueuingMessageRejected = 0x1C,
+	BusLogic_UnsupportedMessageReceived = 0x1D,
+	BusLogic_HostAdapterHardwareFailed = 0x20,
+	BusLogic_TargetFailedResponseToATN = 0x21,
+	BusLogic_HostAdapterAssertedRST = 0x22,
+	BusLogic_OtherDeviceAssertedRST = 0x23,
+	BusLogic_TargetDeviceReconnectedImproperly = 0x24,
+	BusLogic_HostAdapterAssertedBusDeviceReset = 0x25,
+	BusLogic_AbortQueueGenerated = 0x26,
+	BusLogic_HostAdapterSoftwareError = 0x27,
+	BusLogic_HostAdapterHardwareTimeoutError = 0x30,
+	BusLogic_SCSIParityErrorDetected = 0x34
+} PACKED;
+
+
+/*
+  Define the SCSI Target Device Status Codes.
+*/
+
+enum BusLogic_TargetDeviceStatus {
+	BusLogic_OperationGood = 0x00,
+	BusLogic_CheckCondition = 0x02,
+	BusLogic_DeviceBusy = 0x08
+} PACKED;
+
+/*
+  Define the Queue Tag Codes.
+*/
+
+enum BusLogic_QueueTag {
+	BusLogic_SimpleQueueTag = 0,
+	BusLogic_HeadOfQueueTag = 1,
+	BusLogic_OrderedQueueTag = 2,
+	BusLogic_ReservedQT = 3
+};
+
+/*
+  Define the SCSI Command Descriptor Block (CDB).
+*/
+
+#define BusLogic_CDB_MaxLength			12
+
+typedef unsigned char SCSI_CDB_T[BusLogic_CDB_MaxLength];
+
+
+/*
+  Define the Scatter/Gather Segment structure required by the MultiMaster
+  Firmware Interface and the FlashPoint SCCB Manager.
+*/
+
+struct BusLogic_ScatterGatherSegment {
+	u32 SegmentByteCount;	/* Bytes 0-3 */
+	u32 SegmentDataPointer;	/* Bytes 4-7 */
+};
+
+/*
+  Define the Driver CCB Status Codes.
+*/
+
+enum BusLogic_CCB_Status {
+	BusLogic_CCB_Free = 0,
+	BusLogic_CCB_Active = 1,
+	BusLogic_CCB_Completed = 2,
+	BusLogic_CCB_Reset = 3
+} PACKED;
+
+
+/*
+  Define the 32 Bit Mode Command Control Block (CCB) structure.  The first 40
+  bytes are defined by and common to both the MultiMaster Firmware and the
+  FlashPoint SCCB Manager.  The next 60 bytes are defined by the FlashPoint
+  SCCB Manager.  The remaining components are defined by the Linux BusLogic
+  Driver.  Extended LUN Format CCBs differ from Legacy LUN Format 32 Bit Mode
+  CCBs only in having the TagEnable and QueueTag fields moved from byte 17 to
+  byte 1, and the Logical Unit field in byte 17 expanded to 6 bits.  In theory,
+  Extended LUN Format CCBs can support up to 64 Logical Units, but in practice
+  many devices will respond improperly to Logical Units between 32 and 63, and
+  the SCSI-2 specification defines Bit 5 as LUNTAR.  Extended LUN Format CCBs
+  are used by recent versions of the MultiMaster Firmware, as well as by the
+  FlashPoint SCCB Manager; the FlashPoint SCCB Manager only supports 32 Logical
+  Units.  Since 64 Logical Units are unlikely to be needed in practice, and
+  since they are problematic for the above reasons, and since limiting them to
+  5 bits simplifies the CCB structure definition, this driver only supports
+  32 Logical Units per Target Device.
+*/
+
+struct BusLogic_CCB {
+	/*
+	   MultiMaster Firmware and FlashPoint SCCB Manager Common Portion.
+	 */
+	enum BusLogic_CCB_Opcode Opcode;	/* Byte 0 */
+	unsigned char:3;	/* Byte 1 Bits 0-2 */
+	enum BusLogic_DataDirection DataDirection:2;	/* Byte 1 Bits 3-4 */
+	boolean TagEnable:1;	/* Byte 1 Bit 5 */
+	enum BusLogic_QueueTag QueueTag:2;	/* Byte 1 Bits 6-7 */
+	unsigned char CDB_Length;	/* Byte 2 */
+	unsigned char SenseDataLength;	/* Byte 3 */
+	u32 DataLength;		/* Bytes 4-7 */
+	u32 DataPointer;	/* Bytes 8-11 */
+	unsigned char:8;	/* Byte 12 */
+	unsigned char:8;	/* Byte 13 */
+	enum BusLogic_HostAdapterStatus HostAdapterStatus;	/* Byte 14 */
+	enum BusLogic_TargetDeviceStatus TargetDeviceStatus;	/* Byte 15 */
+	unsigned char TargetID;	/* Byte 16 */
+	unsigned char LogicalUnit:5;	/* Byte 17 Bits 0-4 */
+	boolean LegacyTagEnable:1;	/* Byte 17 Bit 5 */
+	enum BusLogic_QueueTag LegacyQueueTag:2;	/* Byte 17 Bits 6-7 */
+	SCSI_CDB_T CDB;		/* Bytes 18-29 */
+	unsigned char:8;	/* Byte 30 */
+	unsigned char:8;	/* Byte 31 */
+	unsigned int:32;	/* Bytes 32-35 */
+	u32 SenseDataPointer;	/* Bytes 36-39 */
+	/*
+	   FlashPoint SCCB Manager Defined Portion.
+	 */
+	void (*CallbackFunction) (struct BusLogic_CCB *);	/* Bytes 40-43 */
+	u32 BaseAddress;	/* Bytes 44-47 */
+	enum BusLogic_CompletionCode CompletionCode;	/* Byte 48 */
+#ifndef CONFIG_SCSI_OMIT_FLASHPOINT
+	unsigned char:8;	/* Byte 49 */
+	unsigned short OS_Flags;	/* Bytes 50-51 */
+	unsigned char Private[48];	/* Bytes 52-99 */
+#endif
+	/*
+	   BusLogic Linux Driver Defined Portion.
+	 */
+	dma_addr_t AllocationGroupHead;
+	unsigned int AllocationGroupSize;
+	u32 DMA_Handle;
+	enum BusLogic_CCB_Status Status;
+	unsigned long SerialNumber;
+	struct scsi_cmnd *Command;
+	struct BusLogic_HostAdapter *HostAdapter;
+	struct BusLogic_CCB *Next;
+	struct BusLogic_CCB *NextAll;
+	struct BusLogic_ScatterGatherSegment
+	 ScatterGatherList[BusLogic_ScatterGatherLimit];
+};
+
+/*
+  Define the 32 Bit Mode Outgoing Mailbox structure.
+*/
+
+struct BusLogic_OutgoingMailbox {
+	u32 CCB;		/* Bytes 0-3 */
+	unsigned int:24;	/* Bytes 4-6 */
+	enum BusLogic_ActionCode ActionCode;	/* Byte 7 */
+};
+
+/*
+  Define the 32 Bit Mode Incoming Mailbox structure.
+*/
+
+struct BusLogic_IncomingMailbox {
+	u32 CCB;		/* Bytes 0-3 */
+	enum BusLogic_HostAdapterStatus HostAdapterStatus;	/* Byte 4 */
+	enum BusLogic_TargetDeviceStatus TargetDeviceStatus;	/* Byte 5 */
+	unsigned char:8;	/* Byte 6 */
+	enum BusLogic_CompletionCode CompletionCode;	/* Byte 7 */
+};
+
+
+/*
+  Define the BusLogic Driver Options structure.
+*/
+
+struct BusLogic_DriverOptions {
+	unsigned short TaggedQueuingPermitted;
+	unsigned short TaggedQueuingPermittedMask;
+	unsigned short BusSettleTime;
+	struct BusLogic_LocalOptions LocalOptions;
+	unsigned char CommonQueueDepth;
+	unsigned char QueueDepth[BusLogic_MaxTargetDevices];
+};
+
+/*
+  Define the Host Adapter Target Flags structure.
+*/
+
+struct BusLogic_TargetFlags {
+	boolean TargetExists:1;
+	boolean TaggedQueuingSupported:1;
+	boolean WideTransfersSupported:1;
+	boolean TaggedQueuingActive:1;
+	boolean WideTransfersActive:1;
+	boolean CommandSuccessfulFlag:1;
+	boolean TargetInfoReported:1;
+};
+
+/*
+  Define the Host Adapter Target Statistics structure.
+*/
+
+#define BusLogic_SizeBuckets			10
+
+typedef unsigned int BusLogic_CommandSizeBuckets_T[BusLogic_SizeBuckets];
+
+struct BusLogic_TargetStatistics {
+	unsigned int CommandsAttempted;
+	unsigned int CommandsCompleted;
+	unsigned int ReadCommands;
+	unsigned int WriteCommands;
+	struct BusLogic_ByteCounter TotalBytesRead;
+	struct BusLogic_ByteCounter TotalBytesWritten;
+	BusLogic_CommandSizeBuckets_T ReadCommandSizeBuckets;
+	BusLogic_CommandSizeBuckets_T WriteCommandSizeBuckets;
+	unsigned short CommandAbortsRequested;
+	unsigned short CommandAbortsAttempted;
+	unsigned short CommandAbortsCompleted;
+	unsigned short BusDeviceResetsRequested;
+	unsigned short BusDeviceResetsAttempted;
+	unsigned short BusDeviceResetsCompleted;
+	unsigned short HostAdapterResetsRequested;
+	unsigned short HostAdapterResetsAttempted;
+	unsigned short HostAdapterResetsCompleted;
+};
+
+/*
+  Define the FlashPoint Card Handle data type.
+*/
+
+#define FlashPoint_BadCardHandle		0xFFFFFFFF
+
+typedef unsigned int FlashPoint_CardHandle_T;
+
+
+/*
+  Define the FlashPoint Information structure.  This structure is defined
+  by the FlashPoint SCCB Manager.
+*/
+
+struct FlashPoint_Info {
+	u32 BaseAddress;	/* Bytes 0-3 */
+	boolean Present;	/* Byte 4 */
+	unsigned char IRQ_Channel;	/* Byte 5 */
+	unsigned char SCSI_ID;	/* Byte 6 */
+	unsigned char SCSI_LUN;	/* Byte 7 */
+	unsigned short FirmwareRevision;	/* Bytes 8-9 */
+	unsigned short SynchronousPermitted;	/* Bytes 10-11 */
+	unsigned short FastPermitted;	/* Bytes 12-13 */
+	unsigned short UltraPermitted;	/* Bytes 14-15 */
+	unsigned short DisconnectPermitted;	/* Bytes 16-17 */
+	unsigned short WidePermitted;	/* Bytes 18-19 */
+	boolean ParityCheckingEnabled:1;	/* Byte 20 Bit 0 */
+	boolean HostWideSCSI:1;	/* Byte 20 Bit 1 */
+	boolean HostSoftReset:1;	/* Byte 20 Bit 2 */
+	boolean ExtendedTranslationEnabled:1;	/* Byte 20 Bit 3 */
+	boolean LowByteTerminated:1;	/* Byte 20 Bit 4 */
+	boolean HighByteTerminated:1;	/* Byte 20 Bit 5 */
+	boolean ReportDataUnderrun:1;	/* Byte 20 Bit 6 */
+	boolean SCAM_Enabled:1;	/* Byte 20 Bit 7 */
+	boolean SCAM_Level2:1;	/* Byte 21 Bit 0 */
+	unsigned char:7;	/* Byte 21 Bits 1-7 */
+	unsigned char Family;	/* Byte 22 */
+	unsigned char BusType;	/* Byte 23 */
+	unsigned char ModelNumber[3];	/* Bytes 24-26 */
+	unsigned char RelativeCardNumber;	/* Byte 27 */
+	unsigned char Reserved[4];	/* Bytes 28-31 */
+	unsigned int OS_Reserved;	/* Bytes 32-35 */
+	unsigned char TranslationInfo[4];	/* Bytes 36-39 */
+	unsigned int Reserved2[5];	/* Bytes 40-59 */
+	unsigned int SecondaryRange;	/* Bytes 60-63 */
+};
+
+/*
+  Define the BusLogic Driver Host Adapter structure.
+*/
+
+struct BusLogic_HostAdapter {
+	struct Scsi_Host *SCSI_Host;
+	struct pci_dev *PCI_Device;
+	enum BusLogic_HostAdapterType HostAdapterType;
+	enum BusLogic_HostAdapterBusType HostAdapterBusType;
+	unsigned long IO_Address;
+	unsigned long PCI_Address;
+	unsigned short AddressCount;
+	unsigned char HostNumber;
+	unsigned char ModelName[9];
+	unsigned char FirmwareVersion[6];
+	unsigned char FullModelName[18];
+	unsigned char Bus;
+	unsigned char Device;
+	unsigned char IRQ_Channel;
+	unsigned char DMA_Channel;
+	unsigned char SCSI_ID;
+	boolean IRQ_ChannelAcquired:1;
+	boolean DMA_ChannelAcquired:1;
+	boolean ExtendedTranslationEnabled:1;
+	boolean ParityCheckingEnabled:1;
+	boolean BusResetEnabled:1;
+	boolean LevelSensitiveInterrupt:1;
+	boolean HostWideSCSI:1;
+	boolean HostDifferentialSCSI:1;
+	boolean HostSupportsSCAM:1;
+	boolean HostUltraSCSI:1;
+	boolean ExtendedLUNSupport:1;
+	boolean TerminationInfoValid:1;
+	boolean LowByteTerminated:1;
+	boolean HighByteTerminated:1;
+	boolean BounceBuffersRequired:1;
+	boolean StrictRoundRobinModeSupport:1;
+	boolean SCAM_Enabled:1;
+	boolean SCAM_Level2:1;
+	boolean HostAdapterInitialized:1;
+	boolean HostAdapterExternalReset:1;
+	boolean HostAdapterInternalError:1;
+	boolean ProcessCompletedCCBsActive;
+	volatile boolean HostAdapterCommandCompleted;
+	unsigned short HostAdapterScatterGatherLimit;
+	unsigned short DriverScatterGatherLimit;
+	unsigned short MaxTargetDevices;
+	unsigned short MaxLogicalUnits;
+	unsigned short MailboxCount;
+	unsigned short InitialCCBs;
+	unsigned short IncrementalCCBs;
+	unsigned short AllocatedCCBs;
+	unsigned short DriverQueueDepth;
+	unsigned short HostAdapterQueueDepth;
+	unsigned short UntaggedQueueDepth;
+	unsigned short CommonQueueDepth;
+	unsigned short BusSettleTime;
+	unsigned short SynchronousPermitted;
+	unsigned short FastPermitted;
+	unsigned short UltraPermitted;
+	unsigned short WidePermitted;
+	unsigned short DisconnectPermitted;
+	unsigned short TaggedQueuingPermitted;
+	unsigned short ExternalHostAdapterResets;
+	unsigned short HostAdapterInternalErrors;
+	unsigned short TargetDeviceCount;
+	unsigned short MessageBufferLength;
+	u32 BIOS_Address;
+	struct BusLogic_DriverOptions *DriverOptions;
+	struct FlashPoint_Info FlashPointInfo;
+	FlashPoint_CardHandle_T CardHandle;
+	struct list_head host_list;
+	struct BusLogic_CCB *All_CCBs;
+	struct BusLogic_CCB *Free_CCBs;
+	struct BusLogic_CCB *FirstCompletedCCB;
+	struct BusLogic_CCB *LastCompletedCCB;
+	struct BusLogic_CCB *BusDeviceResetPendingCCB[BusLogic_MaxTargetDevices];
+	struct BusLogic_TargetFlags TargetFlags[BusLogic_MaxTargetDevices];
+	unsigned char QueueDepth[BusLogic_MaxTargetDevices];
+	unsigned char SynchronousPeriod[BusLogic_MaxTargetDevices];
+	unsigned char SynchronousOffset[BusLogic_MaxTargetDevices];
+	unsigned char ActiveCommands[BusLogic_MaxTargetDevices];
+	unsigned int CommandsSinceReset[BusLogic_MaxTargetDevices];
+	unsigned long LastSequencePoint[BusLogic_MaxTargetDevices];
+	unsigned long LastResetAttempted[BusLogic_MaxTargetDevices];
+	unsigned long LastResetCompleted[BusLogic_MaxTargetDevices];
+	struct BusLogic_OutgoingMailbox *FirstOutgoingMailbox;
+	struct BusLogic_OutgoingMailbox *LastOutgoingMailbox;
+	struct BusLogic_OutgoingMailbox *NextOutgoingMailbox;
+	struct BusLogic_IncomingMailbox *FirstIncomingMailbox;
+	struct BusLogic_IncomingMailbox *LastIncomingMailbox;
+	struct BusLogic_IncomingMailbox *NextIncomingMailbox;
+	struct BusLogic_TargetStatistics TargetStatistics[BusLogic_MaxTargetDevices];
+	unsigned char *MailboxSpace;
+	dma_addr_t MailboxSpaceHandle;
+	unsigned int MailboxSize;
+	unsigned long CCB_Offset;
+	char MessageBuffer[BusLogic_MessageBufferSize];
+};
+
+/*
+  Define a structure for the BIOS Disk Parameters.
+*/
+
+struct BIOS_DiskParameters {
+	int Heads;
+	int Sectors;
+	int Cylinders;
+};
+
+/*
+  Define a structure for the SCSI Inquiry command results.
+*/
+
+struct SCSI_Inquiry {
+	unsigned char PeripheralDeviceType:5;	/* Byte 0 Bits 0-4 */
+	unsigned char PeripheralQualifier:3;	/* Byte 0 Bits 5-7 */
+	unsigned char DeviceTypeModifier:7;	/* Byte 1 Bits 0-6 */
+	boolean RMB:1;		/* Byte 1 Bit 7 */
+	unsigned char ANSI_ApprovedVersion:3;	/* Byte 2 Bits 0-2 */
+	unsigned char ECMA_Version:3;	/* Byte 2 Bits 3-5 */
+	unsigned char ISO_Version:2;	/* Byte 2 Bits 6-7 */
+	unsigned char ResponseDataFormat:4;	/* Byte 3 Bits 0-3 */
+	unsigned char:2;	/* Byte 3 Bits 4-5 */
+	boolean TrmIOP:1;	/* Byte 3 Bit 6 */
+	boolean AENC:1;		/* Byte 3 Bit 7 */
+	unsigned char AdditionalLength;	/* Byte 4 */
+	unsigned char:8;	/* Byte 5 */
+	unsigned char:8;	/* Byte 6 */
+	boolean SftRe:1;	/* Byte 7 Bit 0 */
+	boolean CmdQue:1;	/* Byte 7 Bit 1 */
+	 boolean:1;		/* Byte 7 Bit 2 */
+	boolean Linked:1;	/* Byte 7 Bit 3 */
+	boolean Sync:1;		/* Byte 7 Bit 4 */
+	boolean WBus16:1;	/* Byte 7 Bit 5 */
+	boolean WBus32:1;	/* Byte 7 Bit 6 */
+	boolean RelAdr:1;	/* Byte 7 Bit 7 */
+	unsigned char VendorIdentification[8];	/* Bytes 8-15 */
+	unsigned char ProductIdentification[16];	/* Bytes 16-31 */
+	unsigned char ProductRevisionLevel[4];	/* Bytes 32-35 */
+};
+
+
+/*
+  Define functions to provide an abstraction for reading and writing the
+  Host Adapter I/O Registers.
+*/
+
+static inline void BusLogic_SCSIBusReset(struct BusLogic_HostAdapter *HostAdapter)
+{
+	union BusLogic_ControlRegister ControlRegister;
+	ControlRegister.All = 0;
+	ControlRegister.cr.SCSIBusReset = true;
+	outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
+}
+
+static inline void BusLogic_InterruptReset(struct BusLogic_HostAdapter *HostAdapter)
+{
+	union BusLogic_ControlRegister ControlRegister;
+	ControlRegister.All = 0;
+	ControlRegister.cr.InterruptReset = true;
+	outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
+}
+
+static inline void BusLogic_SoftReset(struct BusLogic_HostAdapter *HostAdapter)
+{
+	union BusLogic_ControlRegister ControlRegister;
+	ControlRegister.All = 0;
+	ControlRegister.cr.SoftReset = true;
+	outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
+}
+
+static inline void BusLogic_HardReset(struct BusLogic_HostAdapter *HostAdapter)
+{
+	union BusLogic_ControlRegister ControlRegister;
+	ControlRegister.All = 0;
+	ControlRegister.cr.HardReset = true;
+	outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
+}
+
+static inline unsigned char BusLogic_ReadStatusRegister(struct BusLogic_HostAdapter *HostAdapter)
+{
+	return inb(HostAdapter->IO_Address + BusLogic_StatusRegisterOffset);
+}
+
+static inline void BusLogic_WriteCommandParameterRegister(struct BusLogic_HostAdapter
+							  *HostAdapter, unsigned char Value)
+{
+	outb(Value, HostAdapter->IO_Address + BusLogic_CommandParameterRegisterOffset);
+}
+
+static inline unsigned char BusLogic_ReadDataInRegister(struct BusLogic_HostAdapter *HostAdapter)
+{
+	return inb(HostAdapter->IO_Address + BusLogic_DataInRegisterOffset);
+}
+
+static inline unsigned char BusLogic_ReadInterruptRegister(struct BusLogic_HostAdapter *HostAdapter)
+{
+	return inb(HostAdapter->IO_Address + BusLogic_InterruptRegisterOffset);
+}
+
+static inline unsigned char BusLogic_ReadGeometryRegister(struct BusLogic_HostAdapter *HostAdapter)
+{
+	return inb(HostAdapter->IO_Address + BusLogic_GeometryRegisterOffset);
+}
+
+/*
+  BusLogic_StartMailboxCommand issues an Execute Mailbox Command, which
+  notifies the Host Adapter that an entry has been made in an Outgoing
+  Mailbox.
+*/
+
+static inline void BusLogic_StartMailboxCommand(struct BusLogic_HostAdapter *HostAdapter)
+{
+	BusLogic_WriteCommandParameterRegister(HostAdapter, BusLogic_ExecuteMailboxCommand);
+}
+
+/*
+  BusLogic_Delay waits for Seconds to elapse.
+*/
+
+static inline void BusLogic_Delay(int Seconds)
+{
+	mdelay(1000 * Seconds);
+}
+
+/*
+  Virtual_to_Bus and Bus_to_Virtual map between Kernel Virtual Addresses
+  and PCI/VLB/EISA/ISA Bus Addresses.
+*/
+
+static inline u32 Virtual_to_Bus(void *VirtualAddress)
+{
+	return (u32) virt_to_bus(VirtualAddress);
+}
+
+static inline void *Bus_to_Virtual(u32 BusAddress)
+{
+	return (void *) bus_to_virt(BusAddress);
+}
+
+/*
+  Virtual_to_32Bit_Virtual maps between Kernel Virtual Addresses and
+  32 bit Kernel Virtual Addresses.  This avoids compilation warnings
+  on 64 bit architectures.
+*/
+
+static inline u32 Virtual_to_32Bit_Virtual(void *VirtualAddress)
+{
+	return (u32) (unsigned long) VirtualAddress;
+}
+
+/*
+  BusLogic_IncrementErrorCounter increments Error Counter by 1, stopping at
+  65535 rather than wrapping around to 0.
+*/
+
+static inline void BusLogic_IncrementErrorCounter(unsigned short *ErrorCounter)
+{
+	if (*ErrorCounter < 65535)
+		(*ErrorCounter)++;
+}
+
+/*
+  BusLogic_IncrementByteCounter increments Byte Counter by Amount.
+*/
+
+static inline void BusLogic_IncrementByteCounter(struct BusLogic_ByteCounter
+						 *ByteCounter, unsigned int Amount)
+{
+	ByteCounter->Units += Amount;
+	if (ByteCounter->Units > 999999999) {
+		ByteCounter->Units -= 1000000000;
+		ByteCounter->Billions++;
+	}
+}
+
+/*
+  BusLogic_IncrementSizeBucket increments the Bucket for Amount.
+*/
+
+static inline void BusLogic_IncrementSizeBucket(BusLogic_CommandSizeBuckets_T CommandSizeBuckets, unsigned int Amount)
+{
+	int Index = 0;
+	if (Amount < 8 * 1024) {
+		if (Amount < 2 * 1024)
+			Index = (Amount < 1 * 1024 ? 0 : 1);
+		else
+			Index = (Amount < 4 * 1024 ? 2 : 3);
+	} else if (Amount < 128 * 1024) {
+		if (Amount < 32 * 1024)
+			Index = (Amount < 16 * 1024 ? 4 : 5);
+		else
+			Index = (Amount < 64 * 1024 ? 6 : 7);
+	} else
+		Index = (Amount < 256 * 1024 ? 8 : 9);
+	CommandSizeBuckets[Index]++;
+}
+
+/*
+  Define the version number of the FlashPoint Firmware (SCCB Manager).
+*/
+
+#define FlashPoint_FirmwareVersion		"5.02"
+
+/*
+  Define the possible return values from FlashPoint_HandleInterrupt.
+*/
+
+#define FlashPoint_NormalInterrupt		0x00
+#define FlashPoint_InternalError		0xFE
+#define FlashPoint_ExternalBusReset		0xFF
+
+/*
+  Define prototypes for the forward referenced BusLogic Driver
+  Internal Functions.
+*/
+
+static const char *BusLogic_DriverInfo(struct Scsi_Host *);
+static int BusLogic_QueueCommand(struct scsi_cmnd *, void (*CompletionRoutine) (struct scsi_cmnd *));
+static int BusLogic_BIOSDiskParameters(struct scsi_device *, struct block_device *, sector_t, int *);
+static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *, char *, char **, off_t, int, int);
+static int BusLogic_SlaveConfigure(struct scsi_device *);
+static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *);
+static irqreturn_t BusLogic_InterruptHandler(int, void *, struct pt_regs *);
+static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *, boolean HardReset);
+static void BusLogic_Message(enum BusLogic_MessageLevel, char *, struct BusLogic_HostAdapter *, ...);
+static int __init BusLogic_Setup(char *);
+
+#endif				/* _BUSLOGIC_H */