| /* | |
| 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 | |
| /* | |
| 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. | |
| */ | |
| #ifdef CONFIG_SCSI_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 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 { | |
| bool NoProbe:1; /* Bit 0 */ | |
| bool NoProbeISA:1; /* Bit 1 */ | |
| bool NoProbePCI:1; /* Bit 2 */ | |
| bool NoSortPCI:1; /* Bit 3 */ | |
| bool MultiMasterFirst:1;/* Bit 4 */ | |
| bool FlashPointFirst:1; /* Bit 5 */ | |
| bool LimitedProbeISA:1; /* Bit 6 */ | |
| bool Probe330:1; /* Bit 7 */ | |
| bool Probe334:1; /* Bit 8 */ | |
| bool Probe230:1; /* Bit 9 */ | |
| bool Probe234:1; /* Bit 10 */ | |
| bool Probe130:1; /* Bit 11 */ | |
| bool Probe134:1; /* Bit 12 */ | |
| }; | |
| /* | |
| Define the Global Options. | |
| */ | |
| struct BusLogic_GlobalOptions { | |
| bool TraceProbe:1; /* Bit 0 */ | |
| bool TraceHardwareReset:1; /* Bit 1 */ | |
| bool TraceConfiguration:1; /* Bit 2 */ | |
| bool TraceErrors:1; /* Bit 3 */ | |
| }; | |
| /* | |
| Define the Local Options. | |
| */ | |
| struct BusLogic_LocalOptions { | |
| bool 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 */ | |
| bool SCSIBusReset:1; /* Bit 4 */ | |
| bool InterruptReset:1; /* Bit 5 */ | |
| bool SoftReset:1; /* Bit 6 */ | |
| bool HardReset:1; /* Bit 7 */ | |
| } cr; | |
| }; | |
| /* | |
| Define the structure of the read-only Status Register. | |
| */ | |
| union BusLogic_StatusRegister { | |
| unsigned char All; | |
| struct { | |
| bool CommandInvalid:1; /* Bit 0 */ | |
| bool Reserved:1; /* Bit 1 */ | |
| bool DataInRegisterReady:1; /* Bit 2 */ | |
| bool CommandParameterRegisterBusy:1; /* Bit 3 */ | |
| bool HostAdapterReady:1; /* Bit 4 */ | |
| bool InitializationRequired:1; /* Bit 5 */ | |
| bool DiagnosticFailure:1; /* Bit 6 */ | |
| bool DiagnosticActive:1; /* Bit 7 */ | |
| } sr; | |
| }; | |
| /* | |
| Define the structure of the read-only Interrupt Register. | |
| */ | |
| union BusLogic_InterruptRegister { | |
| unsigned char All; | |
| struct { | |
| bool IncomingMailboxLoaded:1; /* Bit 0 */ | |
| bool OutgoingMailboxAvailable:1;/* Bit 1 */ | |
| bool CommandComplete:1; /* Bit 2 */ | |
| bool ExternalBusReset:1; /* Bit 3 */ | |
| unsigned char Reserved:3; /* Bits 4-6 */ | |
| bool 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 */ | |
| bool 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 */ | |
| bool DMA_Channel5:1; /* Byte 0 Bit 5 */ | |
| bool DMA_Channel6:1; /* Byte 0 Bit 6 */ | |
| bool DMA_Channel7:1; /* Byte 0 Bit 7 */ | |
| bool IRQ_Channel9:1; /* Byte 1 Bit 0 */ | |
| bool IRQ_Channel10:1; /* Byte 1 Bit 1 */ | |
| bool IRQ_Channel11:1; /* Byte 1 Bit 2 */ | |
| bool IRQ_Channel12:1; /* Byte 1 Bit 3 */ | |
| unsigned char:1; /* Byte 1 Bit 4 */ | |
| bool IRQ_Channel14:1; /* Byte 1 Bit 5 */ | |
| bool 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 */ | |
| bool Synchronous:1; /* Bit 7 */ | |
| }; | |
| struct BusLogic_SetupInformation { | |
| bool SynchronousInitiationEnabled:1; /* Byte 0 Bit 0 */ | |
| bool 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 */ | |
| bool LowByteTerminated:1; /* Byte 2 Bit 0 */ | |
| bool HighByteTerminated:1; /* Byte 2 Bit 1 */ | |
| unsigned char:2; /* Byte 2 Bits 2-3 */ | |
| bool JP1:1; /* Byte 2 Bit 4 */ | |
| bool JP2:1; /* Byte 2 Bit 5 */ | |
| bool JP3:1; /* Byte 2 Bit 6 */ | |
| bool 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 */ | |
| bool FastOnEISA:1; /* Byte 9 Bit 2 */ | |
| unsigned char:3; /* Byte 9 Bits 3-5 */ | |
| bool LevelSensitiveInterrupt:1; /* Byte 9 Bit 6 */ | |
| unsigned char:1; /* Byte 9 Bit 7 */ | |
| } Misc; | |
| unsigned char FirmwareRevision[3]; /* Bytes 10-12 */ | |
| bool HostWideSCSI:1; /* Byte 13 Bit 0 */ | |
| bool HostDifferentialSCSI:1; /* Byte 13 Bit 1 */ | |
| bool HostSupportsSCAM:1; /* Byte 13 Bit 2 */ | |
| bool HostUltraSCSI:1; /* Byte 13 Bit 3 */ | |
| bool 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 */ | |
| bool FloppyEnabled:1; /* Byte 10 Bit 0 */ | |
| bool FloppySecondary:1; /* Byte 10 Bit 1 */ | |
| bool 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 */ | |
| bool DMA_AutoConfiguration:1; /* Byte 11 Bit 7 */ | |
| unsigned char IRQ_Channel:7; /* Byte 12 Bits 0-6 */ | |
| bool IRQ_AutoConfiguration:1; /* Byte 12 Bit 7 */ | |
| unsigned char DMA_TransferRate; /* Byte 13 */ | |
| unsigned char SCSI_ID; /* Byte 14 */ | |
| bool LowByteTerminated:1; /* Byte 15 Bit 0 */ | |
| bool ParityCheckingEnabled:1; /* Byte 15 Bit 1 */ | |
| bool HighByteTerminated:1; /* Byte 15 Bit 2 */ | |
| bool NoisyCablingEnvironment:1; /* Byte 15 Bit 3 */ | |
| bool FastSynchronousNegotiation:1; /* Byte 15 Bit 4 */ | |
| bool BusResetEnabled:1; /* Byte 15 Bit 5 */ | |
| bool:1; /* Byte 15 Bit 6 */ | |
| bool ActiveNegationEnabled:1; /* Byte 15 Bit 7 */ | |
| unsigned char BusOnDelay; /* Byte 16 */ | |
| unsigned char BusOffDelay; /* Byte 17 */ | |
| bool HostAdapterBIOSEnabled:1; /* Byte 18 Bit 0 */ | |
| bool BIOSRedirectionOfINT19Enabled:1; /* Byte 18 Bit 1 */ | |
| bool ExtendedTranslationEnabled:1; /* Byte 18 Bit 2 */ | |
| bool MapRemovableAsFixedEnabled:1; /* Byte 18 Bit 3 */ | |
| bool:1; /* Byte 18 Bit 4 */ | |
| bool BIOSSupportsMoreThan2DrivesEnabled:1; /* Byte 18 Bit 5 */ | |
| bool BIOSInterruptModeEnabled:1; /* Byte 18 Bit 6 */ | |
| bool 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 */ | |
| bool StrictRoundRobinModeEnabled:1; /* Byte 33 Bit 4 */ | |
| bool VESABusSpeedGreaterThan33MHz:1; /* Byte 33 Bit 5 */ | |
| bool VESABurstWriteEnabled:1; /* Byte 33 Bit 6 */ | |
| bool 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 */ | |
| bool:1; /* Byte 42 Bit 0 */ | |
| bool SCAM_Dominant:1; /* Byte 42 Bit 1 */ | |
| bool SCAM_Enabled:1; /* Byte 42 Bit 2 */ | |
| bool SCAM_Level2:1; /* Byte 42 Bit 3 */ | |
| unsigned char:4; /* Byte 42 Bits 4-7 */ | |
| bool INT13ExtensionEnabled:1; /* Byte 43 Bit 0 */ | |
| bool:1; /* Byte 43 Bit 1 */ | |
| bool 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 */ | |
| bool 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 */ | |
| bool 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 */ | |
| #ifdef CONFIG_SCSI_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 { | |
| bool TargetExists:1; | |
| bool TaggedQueuingSupported:1; | |
| bool WideTransfersSupported:1; | |
| bool TaggedQueuingActive:1; | |
| bool WideTransfersActive:1; | |
| bool CommandSuccessfulFlag:1; | |
| bool 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 */ | |
| bool 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 */ | |
| bool ParityCheckingEnabled:1; /* Byte 20 Bit 0 */ | |
| bool HostWideSCSI:1; /* Byte 20 Bit 1 */ | |
| bool HostSoftReset:1; /* Byte 20 Bit 2 */ | |
| bool ExtendedTranslationEnabled:1; /* Byte 20 Bit 3 */ | |
| bool LowByteTerminated:1; /* Byte 20 Bit 4 */ | |
| bool HighByteTerminated:1; /* Byte 20 Bit 5 */ | |
| bool ReportDataUnderrun:1; /* Byte 20 Bit 6 */ | |
| bool SCAM_Enabled:1; /* Byte 20 Bit 7 */ | |
| bool 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; | |
| bool IRQ_ChannelAcquired:1; | |
| bool DMA_ChannelAcquired:1; | |
| bool ExtendedTranslationEnabled:1; | |
| bool ParityCheckingEnabled:1; | |
| bool BusResetEnabled:1; | |
| bool LevelSensitiveInterrupt:1; | |
| bool HostWideSCSI:1; | |
| bool HostDifferentialSCSI:1; | |
| bool HostSupportsSCAM:1; | |
| bool HostUltraSCSI:1; | |
| bool ExtendedLUNSupport:1; | |
| bool TerminationInfoValid:1; | |
| bool LowByteTerminated:1; | |
| bool HighByteTerminated:1; | |
| bool BounceBuffersRequired:1; | |
| bool StrictRoundRobinModeSupport:1; | |
| bool SCAM_Enabled:1; | |
| bool SCAM_Level2:1; | |
| bool HostAdapterInitialized:1; | |
| bool HostAdapterExternalReset:1; | |
| bool HostAdapterInternalError:1; | |
| bool ProcessCompletedCCBsActive; | |
| volatile bool 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 */ | |
| bool 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 */ | |
| bool TrmIOP:1; /* Byte 3 Bit 6 */ | |
| bool AENC:1; /* Byte 3 Bit 7 */ | |
| unsigned char AdditionalLength; /* Byte 4 */ | |
| unsigned char:8; /* Byte 5 */ | |
| unsigned char:8; /* Byte 6 */ | |
| bool SftRe:1; /* Byte 7 Bit 0 */ | |
| bool CmdQue:1; /* Byte 7 Bit 1 */ | |
| bool:1; /* Byte 7 Bit 2 */ | |
| bool Linked:1; /* Byte 7 Bit 3 */ | |
| bool Sync:1; /* Byte 7 Bit 4 */ | |
| bool WBus16:1; /* Byte 7 Bit 5 */ | |
| bool WBus32:1; /* Byte 7 Bit 6 */ | |
| bool 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_Host *h, 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 *); | |
| static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *, bool HardReset); | |
| static void BusLogic_Message(enum BusLogic_MessageLevel, char *, struct BusLogic_HostAdapter *, ...); | |
| static int __init BusLogic_Setup(char *); | |
| #endif /* _BUSLOGIC_H */ |