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