File: /usr/src/linux/drivers/scsi/BusLogic.h

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