3 Linux Driver for BusLogic MultiMaster and FlashPoint SCSI Host Adapters
5 Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>
7 This program is free software; you may redistribute and/or modify it under
8 the terms of the GNU General Public License Version 2 as published by the
9 Free Software Foundation.
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 The author respectfully requests that any modifications to this software be
17 sent directly to him for evaluation and testing.
19 Special thanks to Wayne Yen, Jin-Lon Hon, and Alex Win of BusLogic, whose
20 advice has been invaluable, to David Gentzel, for writing the original Linux
21 BusLogic driver, and to Paul Gortmaker, for being such a dedicated test site.
23 Finally, special thanks to Mylex/BusLogic for making the FlashPoint SCCB
24 Manager available as freely redistributable source code.
33 #define PACKED __attribute__((packed))
37 FlashPoint support is only available for the Intel x86 Architecture with
42 #undef CONFIG_SCSI_OMIT_FLASHPOINT
43 #define CONFIG_SCSI_OMIT_FLASHPOINT
47 #undef CONFIG_SCSI_OMIT_FLASHPOINT
48 #define CONFIG_SCSI_OMIT_FLASHPOINT
49 #define BusLogic_InitializeProbeInfoListISA BusLogic_InitializeProbeInfoList
54 Define the maximum number of BusLogic Host Adapters supported by this driver.
57 #define BusLogic_MaxHostAdapters 16
61 Define the maximum number of Target Devices supported by this driver.
64 #define BusLogic_MaxTargetDevices 16
68 Define the maximum number of Scatter/Gather Segments used by this driver.
69 For optimal performance, it is important that this limit be at least as
70 large as the largest single request generated by the I/O Subsystem.
73 #define BusLogic_ScatterGatherLimit 128
77 Define the maximum, maximum automatic, minimum automatic, and default Queue
78 Depth to allow for Target Devices depending on whether or not they support
79 Tagged Queuing and whether or not ISA Bounce Buffers are required.
82 #define BusLogic_MaxTaggedQueueDepth 64
83 #define BusLogic_MaxAutomaticTaggedQueueDepth 28
84 #define BusLogic_MinAutomaticTaggedQueueDepth 7
85 #define BusLogic_TaggedQueueDepthBB 3
86 #define BusLogic_UntaggedQueueDepth 3
87 #define BusLogic_UntaggedQueueDepthBB 2
91 Define the default amount of time in seconds to wait between a Host Adapter
92 Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI commands.
93 Some SCSI devices get confused if they receive SCSI commands too soon after
97 #define BusLogic_DefaultBusSettleTime 2
101 Define the maximum number of Mailboxes that should be used for MultiMaster
102 Host Adapters. This number is chosen to be larger than the maximum Host
103 Adapter Queue Depth and small enough so that the Host Adapter structure
104 does not cross an allocation block size boundary.
107 #define BusLogic_MaxMailboxes 211
111 Define the number of CCBs that should be allocated as a group to optimize
112 Kernel memory allocation.
115 #define BusLogic_CCB_AllocationGroupSize 7
119 Define the Host Adapter Line and Message Buffer Sizes.
122 #define BusLogic_LineBufferSize 100
123 #define BusLogic_MessageBufferSize 9700
127 Define the Driver Message Levels.
130 enum BusLogic_MessageLevel {
131 BusLogic_AnnounceLevel = 0,
132 BusLogic_InfoLevel = 1,
133 BusLogic_NoticeLevel = 2,
134 BusLogic_WarningLevel = 3,
135 BusLogic_ErrorLevel = 4
138 static char *BusLogic_MessageLevelMap[] = { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING, KERN_ERR };
142 Define Driver Message macros.
145 #define BusLogic_Announce(Format, Arguments...) \
146 BusLogic_Message(BusLogic_AnnounceLevel, Format, ##Arguments)
148 #define BusLogic_Info(Format, Arguments...) \
149 BusLogic_Message(BusLogic_InfoLevel, Format, ##Arguments)
151 #define BusLogic_Notice(Format, Arguments...) \
152 BusLogic_Message(BusLogic_NoticeLevel, Format, ##Arguments)
154 #define BusLogic_Warning(Format, Arguments...) \
155 BusLogic_Message(BusLogic_WarningLevel, Format, ##Arguments)
157 #define BusLogic_Error(Format, Arguments...) \
158 BusLogic_Message(BusLogic_ErrorLevel, Format, ##Arguments)
162 Define the types of BusLogic Host Adapters that are supported and the number
163 of I/O Addresses required by each type.
166 enum BusLogic_HostAdapterType {
167 BusLogic_MultiMaster = 1,
168 BusLogic_FlashPoint = 2
171 #define BusLogic_MultiMasterAddressCount 4
172 #define BusLogic_FlashPointAddressCount 256
174 static int BusLogic_HostAdapterAddressCount[3] = { 0, BusLogic_MultiMasterAddressCount, BusLogic_FlashPointAddressCount };
178 Define macros for testing the Host Adapter Type.
181 #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
183 #define BusLogic_MultiMasterHostAdapterP(HostAdapter) \
184 (HostAdapter->HostAdapterType == BusLogic_MultiMaster)
186 #define BusLogic_FlashPointHostAdapterP(HostAdapter) \
187 (HostAdapter->HostAdapterType == BusLogic_FlashPoint)
191 #define BusLogic_MultiMasterHostAdapterP(HostAdapter) \
194 #define BusLogic_FlashPointHostAdapterP(HostAdapter) \
201 Define the possible Host Adapter Bus Types.
204 enum BusLogic_HostAdapterBusType {
205 BusLogic_Unknown_Bus = 0,
206 BusLogic_ISA_Bus = 1,
207 BusLogic_EISA_Bus = 2,
208 BusLogic_PCI_Bus = 3,
209 BusLogic_VESA_Bus = 4,
213 static char *BusLogic_HostAdapterBusNames[] = { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" };
215 static enum BusLogic_HostAdapterBusType BusLogic_HostAdapterBusTypes[] = {
216 BusLogic_VESA_Bus, /* BT-4xx */
217 BusLogic_ISA_Bus, /* BT-5xx */
218 BusLogic_MCA_Bus, /* BT-6xx */
219 BusLogic_EISA_Bus, /* BT-7xx */
220 BusLogic_Unknown_Bus, /* BT-8xx */
221 BusLogic_PCI_Bus /* BT-9xx */
225 Define the possible Host Adapter BIOS Disk Geometry Translations.
228 enum BusLogic_BIOS_DiskGeometryTranslation {
229 BusLogic_BIOS_Disk_Not_Installed = 0,
230 BusLogic_BIOS_Disk_Installed_64x32 = 1,
231 BusLogic_BIOS_Disk_Installed_128x32 = 2,
232 BusLogic_BIOS_Disk_Installed_255x63 = 3
237 Define a 10^18 Statistics Byte Counter data type.
240 struct BusLogic_ByteCounter {
242 unsigned int Billions;
247 Define the structure for I/O Address and Bus Probing Information.
250 struct BusLogic_ProbeInfo {
251 enum BusLogic_HostAdapterType HostAdapterType;
252 enum BusLogic_HostAdapterBusType HostAdapterBusType;
253 unsigned long IO_Address;
254 unsigned long PCI_Address;
255 struct pci_dev *PCI_Device;
257 unsigned char Device;
258 unsigned char IRQ_Channel;
262 Define the Probe Options.
265 struct BusLogic_ProbeOptions {
266 bool NoProbe:1; /* Bit 0 */
267 bool NoProbeISA:1; /* Bit 1 */
268 bool NoProbePCI:1; /* Bit 2 */
269 bool NoSortPCI:1; /* Bit 3 */
270 bool MultiMasterFirst:1;/* Bit 4 */
271 bool FlashPointFirst:1; /* Bit 5 */
272 bool LimitedProbeISA:1; /* Bit 6 */
273 bool Probe330:1; /* Bit 7 */
274 bool Probe334:1; /* Bit 8 */
275 bool Probe230:1; /* Bit 9 */
276 bool Probe234:1; /* Bit 10 */
277 bool Probe130:1; /* Bit 11 */
278 bool Probe134:1; /* Bit 12 */
282 Define the Global Options.
285 struct BusLogic_GlobalOptions {
286 bool TraceProbe:1; /* Bit 0 */
287 bool TraceHardwareReset:1; /* Bit 1 */
288 bool TraceConfiguration:1; /* Bit 2 */
289 bool TraceErrors:1; /* Bit 3 */
293 Define the Local Options.
296 struct BusLogic_LocalOptions {
297 bool InhibitTargetInquiry:1; /* Bit 0 */
301 Define the BusLogic SCSI Host Adapter I/O Register Offsets.
304 #define BusLogic_ControlRegisterOffset 0 /* WO register */
305 #define BusLogic_StatusRegisterOffset 0 /* RO register */
306 #define BusLogic_CommandParameterRegisterOffset 1 /* WO register */
307 #define BusLogic_DataInRegisterOffset 1 /* RO register */
308 #define BusLogic_InterruptRegisterOffset 2 /* RO register */
309 #define BusLogic_GeometryRegisterOffset 3 /* RO register */
312 Define the structure of the write-only Control Register.
315 union BusLogic_ControlRegister {
318 unsigned char:4; /* Bits 0-3 */
319 bool SCSIBusReset:1; /* Bit 4 */
320 bool InterruptReset:1; /* Bit 5 */
321 bool SoftReset:1; /* Bit 6 */
322 bool HardReset:1; /* Bit 7 */
327 Define the structure of the read-only Status Register.
330 union BusLogic_StatusRegister {
333 bool CommandInvalid:1; /* Bit 0 */
334 bool Reserved:1; /* Bit 1 */
335 bool DataInRegisterReady:1; /* Bit 2 */
336 bool CommandParameterRegisterBusy:1; /* Bit 3 */
337 bool HostAdapterReady:1; /* Bit 4 */
338 bool InitializationRequired:1; /* Bit 5 */
339 bool DiagnosticFailure:1; /* Bit 6 */
340 bool DiagnosticActive:1; /* Bit 7 */
345 Define the structure of the read-only Interrupt Register.
348 union BusLogic_InterruptRegister {
351 bool IncomingMailboxLoaded:1; /* Bit 0 */
352 bool OutgoingMailboxAvailable:1;/* Bit 1 */
353 bool CommandComplete:1; /* Bit 2 */
354 bool ExternalBusReset:1; /* Bit 3 */
355 unsigned char Reserved:3; /* Bits 4-6 */
356 bool InterruptValid:1; /* Bit 7 */
361 Define the structure of the read-only Geometry Register.
364 union BusLogic_GeometryRegister {
367 enum BusLogic_BIOS_DiskGeometryTranslation Drive0Geometry:2; /* Bits 0-1 */
368 enum BusLogic_BIOS_DiskGeometryTranslation Drive1Geometry:2; /* Bits 2-3 */
369 unsigned char:3; /* Bits 4-6 */
370 bool ExtendedTranslationEnabled:1; /* Bit 7 */
375 Define the BusLogic SCSI Host Adapter Command Register Operation Codes.
378 enum BusLogic_OperationCode {
379 BusLogic_TestCommandCompleteInterrupt = 0x00,
380 BusLogic_InitializeMailbox = 0x01,
381 BusLogic_ExecuteMailboxCommand = 0x02,
382 BusLogic_ExecuteBIOSCommand = 0x03,
383 BusLogic_InquireBoardID = 0x04,
384 BusLogic_EnableOutgoingMailboxAvailableInt = 0x05,
385 BusLogic_SetSCSISelectionTimeout = 0x06,
386 BusLogic_SetPreemptTimeOnBus = 0x07,
387 BusLogic_SetTimeOffBus = 0x08,
388 BusLogic_SetBusTransferRate = 0x09,
389 BusLogic_InquireInstalledDevicesID0to7 = 0x0A,
390 BusLogic_InquireConfiguration = 0x0B,
391 BusLogic_EnableTargetMode = 0x0C,
392 BusLogic_InquireSetupInformation = 0x0D,
393 BusLogic_WriteAdapterLocalRAM = 0x1A,
394 BusLogic_ReadAdapterLocalRAM = 0x1B,
395 BusLogic_WriteBusMasterChipFIFO = 0x1C,
396 BusLogic_ReadBusMasterChipFIFO = 0x1D,
397 BusLogic_EchoCommandData = 0x1F,
398 BusLogic_HostAdapterDiagnostic = 0x20,
399 BusLogic_SetAdapterOptions = 0x21,
400 BusLogic_InquireInstalledDevicesID8to15 = 0x23,
401 BusLogic_InquireTargetDevices = 0x24,
402 BusLogic_DisableHostAdapterInterrupt = 0x25,
403 BusLogic_InitializeExtendedMailbox = 0x81,
404 BusLogic_ExecuteSCSICommand = 0x83,
405 BusLogic_InquireFirmwareVersion3rdDigit = 0x84,
406 BusLogic_InquireFirmwareVersionLetter = 0x85,
407 BusLogic_InquirePCIHostAdapterInformation = 0x86,
408 BusLogic_InquireHostAdapterModelNumber = 0x8B,
409 BusLogic_InquireSynchronousPeriod = 0x8C,
410 BusLogic_InquireExtendedSetupInformation = 0x8D,
411 BusLogic_EnableStrictRoundRobinMode = 0x8F,
412 BusLogic_StoreHostAdapterLocalRAM = 0x90,
413 BusLogic_FetchHostAdapterLocalRAM = 0x91,
414 BusLogic_StoreLocalDataInEEPROM = 0x92,
415 BusLogic_UploadAutoSCSICode = 0x94,
416 BusLogic_ModifyIOAddress = 0x95,
417 BusLogic_SetCCBFormat = 0x96,
418 BusLogic_WriteInquiryBuffer = 0x9A,
419 BusLogic_ReadInquiryBuffer = 0x9B,
420 BusLogic_FlashROMUploadDownload = 0xA7,
421 BusLogic_ReadSCAMData = 0xA8,
422 BusLogic_WriteSCAMData = 0xA9
426 Define the Inquire Board ID reply structure.
429 struct BusLogic_BoardID {
430 unsigned char BoardType; /* Byte 0 */
431 unsigned char CustomFeatures; /* Byte 1 */
432 unsigned char FirmwareVersion1stDigit; /* Byte 2 */
433 unsigned char FirmwareVersion2ndDigit; /* Byte 3 */
437 Define the Inquire Configuration reply structure.
440 struct BusLogic_Configuration {
441 unsigned char:5; /* Byte 0 Bits 0-4 */
442 bool DMA_Channel5:1; /* Byte 0 Bit 5 */
443 bool DMA_Channel6:1; /* Byte 0 Bit 6 */
444 bool DMA_Channel7:1; /* Byte 0 Bit 7 */
445 bool IRQ_Channel9:1; /* Byte 1 Bit 0 */
446 bool IRQ_Channel10:1; /* Byte 1 Bit 1 */
447 bool IRQ_Channel11:1; /* Byte 1 Bit 2 */
448 bool IRQ_Channel12:1; /* Byte 1 Bit 3 */
449 unsigned char:1; /* Byte 1 Bit 4 */
450 bool IRQ_Channel14:1; /* Byte 1 Bit 5 */
451 bool IRQ_Channel15:1; /* Byte 1 Bit 6 */
452 unsigned char:1; /* Byte 1 Bit 7 */
453 unsigned char HostAdapterID:4; /* Byte 2 Bits 0-3 */
454 unsigned char:4; /* Byte 2 Bits 4-7 */
458 Define the Inquire Setup Information reply structure.
461 struct BusLogic_SynchronousValue {
462 unsigned char Offset:4; /* Bits 0-3 */
463 unsigned char TransferPeriod:3; /* Bits 4-6 */
464 bool Synchronous:1; /* Bit 7 */
467 struct BusLogic_SetupInformation {
468 bool SynchronousInitiationEnabled:1; /* Byte 0 Bit 0 */
469 bool ParityCheckingEnabled:1; /* Byte 0 Bit 1 */
470 unsigned char:6; /* Byte 0 Bits 2-7 */
471 unsigned char BusTransferRate; /* Byte 1 */
472 unsigned char PreemptTimeOnBus; /* Byte 2 */
473 unsigned char TimeOffBus; /* Byte 3 */
474 unsigned char MailboxCount; /* Byte 4 */
475 unsigned char MailboxAddress[3]; /* Bytes 5-7 */
476 struct BusLogic_SynchronousValue SynchronousValuesID0to7[8]; /* Bytes 8-15 */
477 unsigned char DisconnectPermittedID0to7; /* Byte 16 */
478 unsigned char Signature; /* Byte 17 */
479 unsigned char CharacterD; /* Byte 18 */
480 unsigned char HostBusType; /* Byte 19 */
481 unsigned char WideTransfersPermittedID0to7; /* Byte 20 */
482 unsigned char WideTransfersActiveID0to7; /* Byte 21 */
483 struct BusLogic_SynchronousValue SynchronousValuesID8to15[8]; /* Bytes 22-29 */
484 unsigned char DisconnectPermittedID8to15; /* Byte 30 */
485 unsigned char:8; /* Byte 31 */
486 unsigned char WideTransfersPermittedID8to15; /* Byte 32 */
487 unsigned char WideTransfersActiveID8to15; /* Byte 33 */
491 Define the Initialize Extended Mailbox request structure.
494 struct BusLogic_ExtendedMailboxRequest {
495 unsigned char MailboxCount; /* Byte 0 */
496 u32 BaseMailboxAddress; /* Bytes 1-4 */
501 Define the Inquire PCI Host Adapter Information reply type. The ISA
502 Compatible I/O Port values are defined here and are also used with
503 the Modify I/O Address command.
506 enum BusLogic_ISACompatibleIOPort {
513 BusLogic_IO_Disable = 6,
514 BusLogic_IO_Disable2 = 7
517 struct BusLogic_PCIHostAdapterInformation {
518 enum BusLogic_ISACompatibleIOPort ISACompatibleIOPort; /* Byte 0 */
519 unsigned char PCIAssignedIRQChannel; /* Byte 1 */
520 bool LowByteTerminated:1; /* Byte 2 Bit 0 */
521 bool HighByteTerminated:1; /* Byte 2 Bit 1 */
522 unsigned char:2; /* Byte 2 Bits 2-3 */
523 bool JP1:1; /* Byte 2 Bit 4 */
524 bool JP2:1; /* Byte 2 Bit 5 */
525 bool JP3:1; /* Byte 2 Bit 6 */
526 bool GenericInfoValid:1;/* Byte 2 Bit 7 */
527 unsigned char:8; /* Byte 3 */
531 Define the Inquire Extended Setup Information reply structure.
534 struct BusLogic_ExtendedSetupInformation {
535 unsigned char BusType; /* Byte 0 */
536 unsigned char BIOS_Address; /* Byte 1 */
537 unsigned short ScatterGatherLimit; /* Bytes 2-3 */
538 unsigned char MailboxCount; /* Byte 4 */
539 u32 BaseMailboxAddress; /* Bytes 5-8 */
541 unsigned char:2; /* Byte 9 Bits 0-1 */
542 bool FastOnEISA:1; /* Byte 9 Bit 2 */
543 unsigned char:3; /* Byte 9 Bits 3-5 */
544 bool LevelSensitiveInterrupt:1; /* Byte 9 Bit 6 */
545 unsigned char:1; /* Byte 9 Bit 7 */
547 unsigned char FirmwareRevision[3]; /* Bytes 10-12 */
548 bool HostWideSCSI:1; /* Byte 13 Bit 0 */
549 bool HostDifferentialSCSI:1; /* Byte 13 Bit 1 */
550 bool HostSupportsSCAM:1; /* Byte 13 Bit 2 */
551 bool HostUltraSCSI:1; /* Byte 13 Bit 3 */
552 bool HostSmartTermination:1; /* Byte 13 Bit 4 */
553 unsigned char:3; /* Byte 13 Bits 5-7 */
557 Define the Enable Strict Round Robin Mode request type.
560 enum BusLogic_RoundRobinModeRequest {
561 BusLogic_AggressiveRoundRobinMode = 0,
562 BusLogic_StrictRoundRobinMode = 1
567 Define the Fetch Host Adapter Local RAM request type.
570 #define BusLogic_BIOS_BaseOffset 0
571 #define BusLogic_AutoSCSI_BaseOffset 64
573 struct BusLogic_FetchHostAdapterLocalRAMRequest {
574 unsigned char ByteOffset; /* Byte 0 */
575 unsigned char ByteCount; /* Byte 1 */
579 Define the Host Adapter Local RAM AutoSCSI structure.
582 struct BusLogic_AutoSCSIData {
583 unsigned char InternalFactorySignature[2]; /* Bytes 0-1 */
584 unsigned char InformationByteCount; /* Byte 2 */
585 unsigned char HostAdapterType[6]; /* Bytes 3-8 */
586 unsigned char:8; /* Byte 9 */
587 bool FloppyEnabled:1; /* Byte 10 Bit 0 */
588 bool FloppySecondary:1; /* Byte 10 Bit 1 */
589 bool LevelSensitiveInterrupt:1; /* Byte 10 Bit 2 */
590 unsigned char:2; /* Byte 10 Bits 3-4 */
591 unsigned char SystemRAMAreaForBIOS:3; /* Byte 10 Bits 5-7 */
592 unsigned char DMA_Channel:7; /* Byte 11 Bits 0-6 */
593 bool DMA_AutoConfiguration:1; /* Byte 11 Bit 7 */
594 unsigned char IRQ_Channel:7; /* Byte 12 Bits 0-6 */
595 bool IRQ_AutoConfiguration:1; /* Byte 12 Bit 7 */
596 unsigned char DMA_TransferRate; /* Byte 13 */
597 unsigned char SCSI_ID; /* Byte 14 */
598 bool LowByteTerminated:1; /* Byte 15 Bit 0 */
599 bool ParityCheckingEnabled:1; /* Byte 15 Bit 1 */
600 bool HighByteTerminated:1; /* Byte 15 Bit 2 */
601 bool NoisyCablingEnvironment:1; /* Byte 15 Bit 3 */
602 bool FastSynchronousNegotiation:1; /* Byte 15 Bit 4 */
603 bool BusResetEnabled:1; /* Byte 15 Bit 5 */
604 bool:1; /* Byte 15 Bit 6 */
605 bool ActiveNegationEnabled:1; /* Byte 15 Bit 7 */
606 unsigned char BusOnDelay; /* Byte 16 */
607 unsigned char BusOffDelay; /* Byte 17 */
608 bool HostAdapterBIOSEnabled:1; /* Byte 18 Bit 0 */
609 bool BIOSRedirectionOfINT19Enabled:1; /* Byte 18 Bit 1 */
610 bool ExtendedTranslationEnabled:1; /* Byte 18 Bit 2 */
611 bool MapRemovableAsFixedEnabled:1; /* Byte 18 Bit 3 */
612 bool:1; /* Byte 18 Bit 4 */
613 bool BIOSSupportsMoreThan2DrivesEnabled:1; /* Byte 18 Bit 5 */
614 bool BIOSInterruptModeEnabled:1; /* Byte 18 Bit 6 */
615 bool FlopticalSupportEnabled:1; /* Byte 19 Bit 7 */
616 unsigned short DeviceEnabled; /* Bytes 19-20 */
617 unsigned short WidePermitted; /* Bytes 21-22 */
618 unsigned short FastPermitted; /* Bytes 23-24 */
619 unsigned short SynchronousPermitted; /* Bytes 25-26 */
620 unsigned short DisconnectPermitted; /* Bytes 27-28 */
621 unsigned short SendStartUnitCommand; /* Bytes 29-30 */
622 unsigned short IgnoreInBIOSScan; /* Bytes 31-32 */
623 unsigned char PCIInterruptPin:2; /* Byte 33 Bits 0-1 */
624 unsigned char HostAdapterIOPortAddress:2; /* Byte 33 Bits 2-3 */
625 bool StrictRoundRobinModeEnabled:1; /* Byte 33 Bit 4 */
626 bool VESABusSpeedGreaterThan33MHz:1; /* Byte 33 Bit 5 */
627 bool VESABurstWriteEnabled:1; /* Byte 33 Bit 6 */
628 bool VESABurstReadEnabled:1; /* Byte 33 Bit 7 */
629 unsigned short UltraPermitted; /* Bytes 34-35 */
630 unsigned int:32; /* Bytes 36-39 */
631 unsigned char:8; /* Byte 40 */
632 unsigned char AutoSCSIMaximumLUN; /* Byte 41 */
633 bool:1; /* Byte 42 Bit 0 */
634 bool SCAM_Dominant:1; /* Byte 42 Bit 1 */
635 bool SCAM_Enabled:1; /* Byte 42 Bit 2 */
636 bool SCAM_Level2:1; /* Byte 42 Bit 3 */
637 unsigned char:4; /* Byte 42 Bits 4-7 */
638 bool INT13ExtensionEnabled:1; /* Byte 43 Bit 0 */
639 bool:1; /* Byte 43 Bit 1 */
640 bool CDROMBootEnabled:1; /* Byte 43 Bit 2 */
641 unsigned char:5; /* Byte 43 Bits 3-7 */
642 unsigned char BootTargetID:4; /* Byte 44 Bits 0-3 */
643 unsigned char BootChannel:4; /* Byte 44 Bits 4-7 */
644 unsigned char ForceBusDeviceScanningOrder:1; /* Byte 45 Bit 0 */
645 unsigned char:7; /* Byte 45 Bits 1-7 */
646 unsigned short NonTaggedToAlternateLUNPermitted; /* Bytes 46-47 */
647 unsigned short RenegotiateSyncAfterCheckCondition; /* Bytes 48-49 */
648 unsigned char Reserved[10]; /* Bytes 50-59 */
649 unsigned char ManufacturingDiagnostic[2]; /* Bytes 60-61 */
650 unsigned short Checksum; /* Bytes 62-63 */
654 Define the Host Adapter Local RAM Auto SCSI Byte 45 structure.
657 struct BusLogic_AutoSCSIByte45 {
658 unsigned char ForceBusDeviceScanningOrder:1; /* Bit 0 */
659 unsigned char:7; /* Bits 1-7 */
663 Define the Host Adapter Local RAM BIOS Drive Map Byte structure.
666 #define BusLogic_BIOS_DriveMapOffset 17
668 struct BusLogic_BIOSDriveMapByte {
669 unsigned char TargetIDBit3:1; /* Bit 0 */
670 unsigned char:2; /* Bits 1-2 */
671 enum BusLogic_BIOS_DiskGeometryTranslation DiskGeometry:2; /* Bits 3-4 */
672 unsigned char TargetID:3; /* Bits 5-7 */
676 Define the Set CCB Format request type. Extended LUN Format CCBs are
677 necessary to support more than 8 Logical Units per Target Device.
680 enum BusLogic_SetCCBFormatRequest {
681 BusLogic_LegacyLUNFormatCCB = 0,
682 BusLogic_ExtendedLUNFormatCCB = 1
686 Define the Outgoing Mailbox Action Codes.
689 enum BusLogic_ActionCode {
690 BusLogic_OutgoingMailboxFree = 0x00,
691 BusLogic_MailboxStartCommand = 0x01,
692 BusLogic_MailboxAbortCommand = 0x02
697 Define the Incoming Mailbox Completion Codes. The MultiMaster Firmware
698 only uses codes 0 - 4. The FlashPoint SCCB Manager has no mailboxes, so
699 completion codes are stored in the CCB; it only uses codes 1, 2, 4, and 5.
702 enum BusLogic_CompletionCode {
703 BusLogic_IncomingMailboxFree = 0x00,
704 BusLogic_CommandCompletedWithoutError = 0x01,
705 BusLogic_CommandAbortedAtHostRequest = 0x02,
706 BusLogic_AbortedCommandNotFound = 0x03,
707 BusLogic_CommandCompletedWithError = 0x04,
708 BusLogic_InvalidCCB = 0x05
712 Define the Command Control Block (CCB) Opcodes.
715 enum BusLogic_CCB_Opcode {
716 BusLogic_InitiatorCCB = 0x00,
717 BusLogic_TargetCCB = 0x01,
718 BusLogic_InitiatorCCB_ScatterGather = 0x02,
719 BusLogic_InitiatorCCB_ResidualDataLength = 0x03,
720 BusLogic_InitiatorCCB_ScatterGatherResidual = 0x04,
721 BusLogic_BusDeviceReset = 0x81
726 Define the CCB Data Direction Codes.
729 enum BusLogic_DataDirection {
730 BusLogic_UncheckedDataTransfer = 0,
731 BusLogic_DataInLengthChecked = 1,
732 BusLogic_DataOutLengthChecked = 2,
733 BusLogic_NoDataTransfer = 3
738 Define the Host Adapter Status Codes. The MultiMaster Firmware does not
739 return status code 0x0C; it uses 0x12 for both overruns and underruns.
742 enum BusLogic_HostAdapterStatus {
743 BusLogic_CommandCompletedNormally = 0x00,
744 BusLogic_LinkedCommandCompleted = 0x0A,
745 BusLogic_LinkedCommandCompletedWithFlag = 0x0B,
746 BusLogic_DataUnderRun = 0x0C,
747 BusLogic_SCSISelectionTimeout = 0x11,
748 BusLogic_DataOverRun = 0x12,
749 BusLogic_UnexpectedBusFree = 0x13,
750 BusLogic_InvalidBusPhaseRequested = 0x14,
751 BusLogic_InvalidOutgoingMailboxActionCode = 0x15,
752 BusLogic_InvalidCommandOperationCode = 0x16,
753 BusLogic_LinkedCCBhasInvalidLUN = 0x17,
754 BusLogic_InvalidCommandParameter = 0x1A,
755 BusLogic_AutoRequestSenseFailed = 0x1B,
756 BusLogic_TaggedQueuingMessageRejected = 0x1C,
757 BusLogic_UnsupportedMessageReceived = 0x1D,
758 BusLogic_HostAdapterHardwareFailed = 0x20,
759 BusLogic_TargetFailedResponseToATN = 0x21,
760 BusLogic_HostAdapterAssertedRST = 0x22,
761 BusLogic_OtherDeviceAssertedRST = 0x23,
762 BusLogic_TargetDeviceReconnectedImproperly = 0x24,
763 BusLogic_HostAdapterAssertedBusDeviceReset = 0x25,
764 BusLogic_AbortQueueGenerated = 0x26,
765 BusLogic_HostAdapterSoftwareError = 0x27,
766 BusLogic_HostAdapterHardwareTimeoutError = 0x30,
767 BusLogic_SCSIParityErrorDetected = 0x34
772 Define the SCSI Target Device Status Codes.
775 enum BusLogic_TargetDeviceStatus {
776 BusLogic_OperationGood = 0x00,
777 BusLogic_CheckCondition = 0x02,
778 BusLogic_DeviceBusy = 0x08
782 Define the Queue Tag Codes.
785 enum BusLogic_QueueTag {
786 BusLogic_SimpleQueueTag = 0,
787 BusLogic_HeadOfQueueTag = 1,
788 BusLogic_OrderedQueueTag = 2,
789 BusLogic_ReservedQT = 3
793 Define the SCSI Command Descriptor Block (CDB).
796 #define BusLogic_CDB_MaxLength 12
798 typedef unsigned char SCSI_CDB_T[BusLogic_CDB_MaxLength];
802 Define the Scatter/Gather Segment structure required by the MultiMaster
803 Firmware Interface and the FlashPoint SCCB Manager.
806 struct BusLogic_ScatterGatherSegment {
807 u32 SegmentByteCount; /* Bytes 0-3 */
808 u32 SegmentDataPointer; /* Bytes 4-7 */
812 Define the Driver CCB Status Codes.
815 enum BusLogic_CCB_Status {
816 BusLogic_CCB_Free = 0,
817 BusLogic_CCB_Active = 1,
818 BusLogic_CCB_Completed = 2,
819 BusLogic_CCB_Reset = 3
824 Define the 32 Bit Mode Command Control Block (CCB) structure. The first 40
825 bytes are defined by and common to both the MultiMaster Firmware and the
826 FlashPoint SCCB Manager. The next 60 bytes are defined by the FlashPoint
827 SCCB Manager. The remaining components are defined by the Linux BusLogic
828 Driver. Extended LUN Format CCBs differ from Legacy LUN Format 32 Bit Mode
829 CCBs only in having the TagEnable and QueueTag fields moved from byte 17 to
830 byte 1, and the Logical Unit field in byte 17 expanded to 6 bits. In theory,
831 Extended LUN Format CCBs can support up to 64 Logical Units, but in practice
832 many devices will respond improperly to Logical Units between 32 and 63, and
833 the SCSI-2 specification defines Bit 5 as LUNTAR. Extended LUN Format CCBs
834 are used by recent versions of the MultiMaster Firmware, as well as by the
835 FlashPoint SCCB Manager; the FlashPoint SCCB Manager only supports 32 Logical
836 Units. Since 64 Logical Units are unlikely to be needed in practice, and
837 since they are problematic for the above reasons, and since limiting them to
838 5 bits simplifies the CCB structure definition, this driver only supports
839 32 Logical Units per Target Device.
842 struct BusLogic_CCB {
844 MultiMaster Firmware and FlashPoint SCCB Manager Common Portion.
846 enum BusLogic_CCB_Opcode Opcode; /* Byte 0 */
847 unsigned char:3; /* Byte 1 Bits 0-2 */
848 enum BusLogic_DataDirection DataDirection:2; /* Byte 1 Bits 3-4 */
849 bool TagEnable:1; /* Byte 1 Bit 5 */
850 enum BusLogic_QueueTag QueueTag:2; /* Byte 1 Bits 6-7 */
851 unsigned char CDB_Length; /* Byte 2 */
852 unsigned char SenseDataLength; /* Byte 3 */
853 u32 DataLength; /* Bytes 4-7 */
854 u32 DataPointer; /* Bytes 8-11 */
855 unsigned char:8; /* Byte 12 */
856 unsigned char:8; /* Byte 13 */
857 enum BusLogic_HostAdapterStatus HostAdapterStatus; /* Byte 14 */
858 enum BusLogic_TargetDeviceStatus TargetDeviceStatus; /* Byte 15 */
859 unsigned char TargetID; /* Byte 16 */
860 unsigned char LogicalUnit:5; /* Byte 17 Bits 0-4 */
861 bool LegacyTagEnable:1; /* Byte 17 Bit 5 */
862 enum BusLogic_QueueTag LegacyQueueTag:2; /* Byte 17 Bits 6-7 */
863 SCSI_CDB_T CDB; /* Bytes 18-29 */
864 unsigned char:8; /* Byte 30 */
865 unsigned char:8; /* Byte 31 */
866 unsigned int:32; /* Bytes 32-35 */
867 u32 SenseDataPointer; /* Bytes 36-39 */
869 FlashPoint SCCB Manager Defined Portion.
871 void (*CallbackFunction) (struct BusLogic_CCB *); /* Bytes 40-43 */
872 u32 BaseAddress; /* Bytes 44-47 */
873 enum BusLogic_CompletionCode CompletionCode; /* Byte 48 */
874 #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
875 unsigned char:8; /* Byte 49 */
876 unsigned short OS_Flags; /* Bytes 50-51 */
877 unsigned char Private[48]; /* Bytes 52-99 */
880 BusLogic Linux Driver Defined Portion.
882 dma_addr_t AllocationGroupHead;
883 unsigned int AllocationGroupSize;
885 enum BusLogic_CCB_Status Status;
886 unsigned long SerialNumber;
887 struct scsi_cmnd *Command;
888 struct BusLogic_HostAdapter *HostAdapter;
889 struct BusLogic_CCB *Next;
890 struct BusLogic_CCB *NextAll;
891 struct BusLogic_ScatterGatherSegment
892 ScatterGatherList[BusLogic_ScatterGatherLimit];
896 Define the 32 Bit Mode Outgoing Mailbox structure.
899 struct BusLogic_OutgoingMailbox {
900 u32 CCB; /* Bytes 0-3 */
901 unsigned int:24; /* Bytes 4-6 */
902 enum BusLogic_ActionCode ActionCode; /* Byte 7 */
906 Define the 32 Bit Mode Incoming Mailbox structure.
909 struct BusLogic_IncomingMailbox {
910 u32 CCB; /* Bytes 0-3 */
911 enum BusLogic_HostAdapterStatus HostAdapterStatus; /* Byte 4 */
912 enum BusLogic_TargetDeviceStatus TargetDeviceStatus; /* Byte 5 */
913 unsigned char:8; /* Byte 6 */
914 enum BusLogic_CompletionCode CompletionCode; /* Byte 7 */
919 Define the BusLogic Driver Options structure.
922 struct BusLogic_DriverOptions {
923 unsigned short TaggedQueuingPermitted;
924 unsigned short TaggedQueuingPermittedMask;
925 unsigned short BusSettleTime;
926 struct BusLogic_LocalOptions LocalOptions;
927 unsigned char CommonQueueDepth;
928 unsigned char QueueDepth[BusLogic_MaxTargetDevices];
932 Define the Host Adapter Target Flags structure.
935 struct BusLogic_TargetFlags {
937 bool TaggedQueuingSupported:1;
938 bool WideTransfersSupported:1;
939 bool TaggedQueuingActive:1;
940 bool WideTransfersActive:1;
941 bool CommandSuccessfulFlag:1;
942 bool TargetInfoReported:1;
946 Define the Host Adapter Target Statistics structure.
949 #define BusLogic_SizeBuckets 10
951 typedef unsigned int BusLogic_CommandSizeBuckets_T[BusLogic_SizeBuckets];
953 struct BusLogic_TargetStatistics {
954 unsigned int CommandsAttempted;
955 unsigned int CommandsCompleted;
956 unsigned int ReadCommands;
957 unsigned int WriteCommands;
958 struct BusLogic_ByteCounter TotalBytesRead;
959 struct BusLogic_ByteCounter TotalBytesWritten;
960 BusLogic_CommandSizeBuckets_T ReadCommandSizeBuckets;
961 BusLogic_CommandSizeBuckets_T WriteCommandSizeBuckets;
962 unsigned short CommandAbortsRequested;
963 unsigned short CommandAbortsAttempted;
964 unsigned short CommandAbortsCompleted;
965 unsigned short BusDeviceResetsRequested;
966 unsigned short BusDeviceResetsAttempted;
967 unsigned short BusDeviceResetsCompleted;
968 unsigned short HostAdapterResetsRequested;
969 unsigned short HostAdapterResetsAttempted;
970 unsigned short HostAdapterResetsCompleted;
974 Define the FlashPoint Card Handle data type.
977 #define FlashPoint_BadCardHandle 0xFFFFFFFF
979 typedef unsigned int FlashPoint_CardHandle_T;
983 Define the FlashPoint Information structure. This structure is defined
984 by the FlashPoint SCCB Manager.
987 struct FlashPoint_Info {
988 u32 BaseAddress; /* Bytes 0-3 */
989 bool Present; /* Byte 4 */
990 unsigned char IRQ_Channel; /* Byte 5 */
991 unsigned char SCSI_ID; /* Byte 6 */
992 unsigned char SCSI_LUN; /* Byte 7 */
993 unsigned short FirmwareRevision; /* Bytes 8-9 */
994 unsigned short SynchronousPermitted; /* Bytes 10-11 */
995 unsigned short FastPermitted; /* Bytes 12-13 */
996 unsigned short UltraPermitted; /* Bytes 14-15 */
997 unsigned short DisconnectPermitted; /* Bytes 16-17 */
998 unsigned short WidePermitted; /* Bytes 18-19 */
999 bool ParityCheckingEnabled:1; /* Byte 20 Bit 0 */
1000 bool HostWideSCSI:1; /* Byte 20 Bit 1 */
1001 bool HostSoftReset:1; /* Byte 20 Bit 2 */
1002 bool ExtendedTranslationEnabled:1; /* Byte 20 Bit 3 */
1003 bool LowByteTerminated:1; /* Byte 20 Bit 4 */
1004 bool HighByteTerminated:1; /* Byte 20 Bit 5 */
1005 bool ReportDataUnderrun:1; /* Byte 20 Bit 6 */
1006 bool SCAM_Enabled:1; /* Byte 20 Bit 7 */
1007 bool SCAM_Level2:1; /* Byte 21 Bit 0 */
1008 unsigned char:7; /* Byte 21 Bits 1-7 */
1009 unsigned char Family; /* Byte 22 */
1010 unsigned char BusType; /* Byte 23 */
1011 unsigned char ModelNumber[3]; /* Bytes 24-26 */
1012 unsigned char RelativeCardNumber; /* Byte 27 */
1013 unsigned char Reserved[4]; /* Bytes 28-31 */
1014 unsigned int OS_Reserved; /* Bytes 32-35 */
1015 unsigned char TranslationInfo[4]; /* Bytes 36-39 */
1016 unsigned int Reserved2[5]; /* Bytes 40-59 */
1017 unsigned int SecondaryRange; /* Bytes 60-63 */
1021 Define the BusLogic Driver Host Adapter structure.
1024 struct BusLogic_HostAdapter {
1025 struct Scsi_Host *SCSI_Host;
1026 struct pci_dev *PCI_Device;
1027 enum BusLogic_HostAdapterType HostAdapterType;
1028 enum BusLogic_HostAdapterBusType HostAdapterBusType;
1029 unsigned long IO_Address;
1030 unsigned long PCI_Address;
1031 unsigned short AddressCount;
1032 unsigned char HostNumber;
1033 unsigned char ModelName[9];
1034 unsigned char FirmwareVersion[6];
1035 unsigned char FullModelName[18];
1037 unsigned char Device;
1038 unsigned char IRQ_Channel;
1039 unsigned char DMA_Channel;
1040 unsigned char SCSI_ID;
1041 bool IRQ_ChannelAcquired:1;
1042 bool DMA_ChannelAcquired:1;
1043 bool ExtendedTranslationEnabled:1;
1044 bool ParityCheckingEnabled:1;
1045 bool BusResetEnabled:1;
1046 bool LevelSensitiveInterrupt:1;
1047 bool HostWideSCSI:1;
1048 bool HostDifferentialSCSI:1;
1049 bool HostSupportsSCAM:1;
1050 bool HostUltraSCSI:1;
1051 bool ExtendedLUNSupport:1;
1052 bool TerminationInfoValid:1;
1053 bool LowByteTerminated:1;
1054 bool HighByteTerminated:1;
1055 bool BounceBuffersRequired:1;
1056 bool StrictRoundRobinModeSupport:1;
1057 bool SCAM_Enabled:1;
1059 bool HostAdapterInitialized:1;
1060 bool HostAdapterExternalReset:1;
1061 bool HostAdapterInternalError:1;
1062 bool ProcessCompletedCCBsActive;
1063 volatile bool HostAdapterCommandCompleted;
1064 unsigned short HostAdapterScatterGatherLimit;
1065 unsigned short DriverScatterGatherLimit;
1066 unsigned short MaxTargetDevices;
1067 unsigned short MaxLogicalUnits;
1068 unsigned short MailboxCount;
1069 unsigned short InitialCCBs;
1070 unsigned short IncrementalCCBs;
1071 unsigned short AllocatedCCBs;
1072 unsigned short DriverQueueDepth;
1073 unsigned short HostAdapterQueueDepth;
1074 unsigned short UntaggedQueueDepth;
1075 unsigned short CommonQueueDepth;
1076 unsigned short BusSettleTime;
1077 unsigned short SynchronousPermitted;
1078 unsigned short FastPermitted;
1079 unsigned short UltraPermitted;
1080 unsigned short WidePermitted;
1081 unsigned short DisconnectPermitted;
1082 unsigned short TaggedQueuingPermitted;
1083 unsigned short ExternalHostAdapterResets;
1084 unsigned short HostAdapterInternalErrors;
1085 unsigned short TargetDeviceCount;
1086 unsigned short MessageBufferLength;
1088 struct BusLogic_DriverOptions *DriverOptions;
1089 struct FlashPoint_Info FlashPointInfo;
1090 FlashPoint_CardHandle_T CardHandle;
1091 struct list_head host_list;
1092 struct BusLogic_CCB *All_CCBs;
1093 struct BusLogic_CCB *Free_CCBs;
1094 struct BusLogic_CCB *FirstCompletedCCB;
1095 struct BusLogic_CCB *LastCompletedCCB;
1096 struct BusLogic_CCB *BusDeviceResetPendingCCB[BusLogic_MaxTargetDevices];
1097 struct BusLogic_TargetFlags TargetFlags[BusLogic_MaxTargetDevices];
1098 unsigned char QueueDepth[BusLogic_MaxTargetDevices];
1099 unsigned char SynchronousPeriod[BusLogic_MaxTargetDevices];
1100 unsigned char SynchronousOffset[BusLogic_MaxTargetDevices];
1101 unsigned char ActiveCommands[BusLogic_MaxTargetDevices];
1102 unsigned int CommandsSinceReset[BusLogic_MaxTargetDevices];
1103 unsigned long LastSequencePoint[BusLogic_MaxTargetDevices];
1104 unsigned long LastResetAttempted[BusLogic_MaxTargetDevices];
1105 unsigned long LastResetCompleted[BusLogic_MaxTargetDevices];
1106 struct BusLogic_OutgoingMailbox *FirstOutgoingMailbox;
1107 struct BusLogic_OutgoingMailbox *LastOutgoingMailbox;
1108 struct BusLogic_OutgoingMailbox *NextOutgoingMailbox;
1109 struct BusLogic_IncomingMailbox *FirstIncomingMailbox;
1110 struct BusLogic_IncomingMailbox *LastIncomingMailbox;
1111 struct BusLogic_IncomingMailbox *NextIncomingMailbox;
1112 struct BusLogic_TargetStatistics TargetStatistics[BusLogic_MaxTargetDevices];
1113 unsigned char *MailboxSpace;
1114 dma_addr_t MailboxSpaceHandle;
1115 unsigned int MailboxSize;
1116 unsigned long CCB_Offset;
1117 char MessageBuffer[BusLogic_MessageBufferSize];
1121 Define a structure for the BIOS Disk Parameters.
1124 struct BIOS_DiskParameters {
1131 Define a structure for the SCSI Inquiry command results.
1134 struct SCSI_Inquiry {
1135 unsigned char PeripheralDeviceType:5; /* Byte 0 Bits 0-4 */
1136 unsigned char PeripheralQualifier:3; /* Byte 0 Bits 5-7 */
1137 unsigned char DeviceTypeModifier:7; /* Byte 1 Bits 0-6 */
1138 bool RMB:1; /* Byte 1 Bit 7 */
1139 unsigned char ANSI_ApprovedVersion:3; /* Byte 2 Bits 0-2 */
1140 unsigned char ECMA_Version:3; /* Byte 2 Bits 3-5 */
1141 unsigned char ISO_Version:2; /* Byte 2 Bits 6-7 */
1142 unsigned char ResponseDataFormat:4; /* Byte 3 Bits 0-3 */
1143 unsigned char:2; /* Byte 3 Bits 4-5 */
1144 bool TrmIOP:1; /* Byte 3 Bit 6 */
1145 bool AENC:1; /* Byte 3 Bit 7 */
1146 unsigned char AdditionalLength; /* Byte 4 */
1147 unsigned char:8; /* Byte 5 */
1148 unsigned char:8; /* Byte 6 */
1149 bool SftRe:1; /* Byte 7 Bit 0 */
1150 bool CmdQue:1; /* Byte 7 Bit 1 */
1151 bool:1; /* Byte 7 Bit 2 */
1152 bool Linked:1; /* Byte 7 Bit 3 */
1153 bool Sync:1; /* Byte 7 Bit 4 */
1154 bool WBus16:1; /* Byte 7 Bit 5 */
1155 bool WBus32:1; /* Byte 7 Bit 6 */
1156 bool RelAdr:1; /* Byte 7 Bit 7 */
1157 unsigned char VendorIdentification[8]; /* Bytes 8-15 */
1158 unsigned char ProductIdentification[16]; /* Bytes 16-31 */
1159 unsigned char ProductRevisionLevel[4]; /* Bytes 32-35 */
1164 Define functions to provide an abstraction for reading and writing the
1165 Host Adapter I/O Registers.
1168 static inline void BusLogic_SCSIBusReset(struct BusLogic_HostAdapter *HostAdapter)
1170 union BusLogic_ControlRegister ControlRegister;
1171 ControlRegister.All = 0;
1172 ControlRegister.cr.SCSIBusReset = true;
1173 outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
1176 static inline void BusLogic_InterruptReset(struct BusLogic_HostAdapter *HostAdapter)
1178 union BusLogic_ControlRegister ControlRegister;
1179 ControlRegister.All = 0;
1180 ControlRegister.cr.InterruptReset = true;
1181 outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
1184 static inline void BusLogic_SoftReset(struct BusLogic_HostAdapter *HostAdapter)
1186 union BusLogic_ControlRegister ControlRegister;
1187 ControlRegister.All = 0;
1188 ControlRegister.cr.SoftReset = true;
1189 outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
1192 static inline void BusLogic_HardReset(struct BusLogic_HostAdapter *HostAdapter)
1194 union BusLogic_ControlRegister ControlRegister;
1195 ControlRegister.All = 0;
1196 ControlRegister.cr.HardReset = true;
1197 outb(ControlRegister.All, HostAdapter->IO_Address + BusLogic_ControlRegisterOffset);
1200 static inline unsigned char BusLogic_ReadStatusRegister(struct BusLogic_HostAdapter *HostAdapter)
1202 return inb(HostAdapter->IO_Address + BusLogic_StatusRegisterOffset);
1205 static inline void BusLogic_WriteCommandParameterRegister(struct BusLogic_HostAdapter
1206 *HostAdapter, unsigned char Value)
1208 outb(Value, HostAdapter->IO_Address + BusLogic_CommandParameterRegisterOffset);
1211 static inline unsigned char BusLogic_ReadDataInRegister(struct BusLogic_HostAdapter *HostAdapter)
1213 return inb(HostAdapter->IO_Address + BusLogic_DataInRegisterOffset);
1216 static inline unsigned char BusLogic_ReadInterruptRegister(struct BusLogic_HostAdapter *HostAdapter)
1218 return inb(HostAdapter->IO_Address + BusLogic_InterruptRegisterOffset);
1221 static inline unsigned char BusLogic_ReadGeometryRegister(struct BusLogic_HostAdapter *HostAdapter)
1223 return inb(HostAdapter->IO_Address + BusLogic_GeometryRegisterOffset);
1227 BusLogic_StartMailboxCommand issues an Execute Mailbox Command, which
1228 notifies the Host Adapter that an entry has been made in an Outgoing
1232 static inline void BusLogic_StartMailboxCommand(struct BusLogic_HostAdapter *HostAdapter)
1234 BusLogic_WriteCommandParameterRegister(HostAdapter, BusLogic_ExecuteMailboxCommand);
1238 BusLogic_Delay waits for Seconds to elapse.
1241 static inline void BusLogic_Delay(int Seconds)
1243 mdelay(1000 * Seconds);
1247 Virtual_to_Bus and Bus_to_Virtual map between Kernel Virtual Addresses
1248 and PCI/VLB/EISA/ISA Bus Addresses.
1251 static inline u32 Virtual_to_Bus(void *VirtualAddress)
1253 return (u32) virt_to_bus(VirtualAddress);
1256 static inline void *Bus_to_Virtual(u32 BusAddress)
1258 return (void *) bus_to_virt(BusAddress);
1262 Virtual_to_32Bit_Virtual maps between Kernel Virtual Addresses and
1263 32 bit Kernel Virtual Addresses. This avoids compilation warnings
1264 on 64 bit architectures.
1267 static inline u32 Virtual_to_32Bit_Virtual(void *VirtualAddress)
1269 return (u32) (unsigned long) VirtualAddress;
1273 BusLogic_IncrementErrorCounter increments Error Counter by 1, stopping at
1274 65535 rather than wrapping around to 0.
1277 static inline void BusLogic_IncrementErrorCounter(unsigned short *ErrorCounter)
1279 if (*ErrorCounter < 65535)
1284 BusLogic_IncrementByteCounter increments Byte Counter by Amount.
1287 static inline void BusLogic_IncrementByteCounter(struct BusLogic_ByteCounter
1288 *ByteCounter, unsigned int Amount)
1290 ByteCounter->Units += Amount;
1291 if (ByteCounter->Units > 999999999) {
1292 ByteCounter->Units -= 1000000000;
1293 ByteCounter->Billions++;
1298 BusLogic_IncrementSizeBucket increments the Bucket for Amount.
1301 static inline void BusLogic_IncrementSizeBucket(BusLogic_CommandSizeBuckets_T CommandSizeBuckets, unsigned int Amount)
1304 if (Amount < 8 * 1024) {
1305 if (Amount < 2 * 1024)
1306 Index = (Amount < 1 * 1024 ? 0 : 1);
1308 Index = (Amount < 4 * 1024 ? 2 : 3);
1309 } else if (Amount < 128 * 1024) {
1310 if (Amount < 32 * 1024)
1311 Index = (Amount < 16 * 1024 ? 4 : 5);
1313 Index = (Amount < 64 * 1024 ? 6 : 7);
1315 Index = (Amount < 256 * 1024 ? 8 : 9);
1316 CommandSizeBuckets[Index]++;
1320 Define the version number of the FlashPoint Firmware (SCCB Manager).
1323 #define FlashPoint_FirmwareVersion "5.02"
1326 Define the possible return values from FlashPoint_HandleInterrupt.
1329 #define FlashPoint_NormalInterrupt 0x00
1330 #define FlashPoint_InternalError 0xFE
1331 #define FlashPoint_ExternalBusReset 0xFF
1334 Define prototypes for the forward referenced BusLogic Driver
1338 static const char *BusLogic_DriverInfo(struct Scsi_Host *);
1339 static int BusLogic_QueueCommand(struct scsi_cmnd *, void (*CompletionRoutine) (struct scsi_cmnd *));
1340 static int BusLogic_BIOSDiskParameters(struct scsi_device *, struct block_device *, sector_t, int *);
1341 static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *, char *, char **, off_t, int, int);
1342 static int BusLogic_SlaveConfigure(struct scsi_device *);
1343 static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *);
1344 static irqreturn_t BusLogic_InterruptHandler(int, void *);
1345 static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *, bool HardReset);
1346 static void BusLogic_Message(enum BusLogic_MessageLevel, char *, struct BusLogic_HostAdapter *, ...);
1347 static int __init BusLogic_Setup(char *);
1349 #endif /* _BUSLOGIC_H */