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