BusLogic.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:52k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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