/*

  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


#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 */
