added mtd driver
[linux-2.4.git] / 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 */