blob: 9792e5af5252c4a6378490667fe64f5318c64dac [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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
Linus Torvalds1da177e2005-04-16 15:20:36 -070031
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
130enum BusLogic_MessageLevel {
131 BusLogic_AnnounceLevel = 0,
132 BusLogic_InfoLevel = 1,
133 BusLogic_NoticeLevel = 2,
134 BusLogic_WarningLevel = 3,
135 BusLogic_ErrorLevel = 4
136};
137
138static 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
166enum BusLogic_HostAdapterType {
167 BusLogic_MultiMaster = 1,
168 BusLogic_FlashPoint = 2
169} PACKED;
170
171#define BusLogic_MultiMasterAddressCount 4
172#define BusLogic_FlashPointAddressCount 256
173
174static 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
204enum 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
213static char *BusLogic_HostAdapterBusNames[] = { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" };
214
215static 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
228enum 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
240typedef enum {
241 false,
242 true
243} PACKED boolean;
244
245/*
246 Define a 10^18 Statistics Byte Counter data type.
247*/
248
249struct 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
259struct 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
274struct 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
294struct 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
305struct 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
324union 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
339union 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
357union 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
373union 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
387enum 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
438struct 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
449struct 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
470struct 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
476struct 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
503struct 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
515enum 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
526struct 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
543struct 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
569enum 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
582struct 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
591struct 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
666struct 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
677struct 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
689enum BusLogic_SetCCBFormatRequest {
690 BusLogic_LegacyLUNFormatCCB = 0,
691 BusLogic_ExtendedLUNFormatCCB = 1
692} PACKED;
693
694/*
695 Define the Outgoing Mailbox Action Codes.
696*/
697
698enum 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
711enum 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
724enum 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
738enum 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
751enum 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
784enum 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
794enum 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
807typedef 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
815struct 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
824enum 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
851struct 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
908struct 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
918struct 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
931struct 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
944struct 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
960typedef unsigned int BusLogic_CommandSizeBuckets_T[BusLogic_SizeBuckets];
961
962struct 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
988typedef 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
996struct 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
1033struct 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
1133struct 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
1143struct 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
1177static 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
1185static 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
1193static 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
1201static 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
1209static inline unsigned char BusLogic_ReadStatusRegister(struct BusLogic_HostAdapter *HostAdapter)
1210{
1211 return inb(HostAdapter->IO_Address + BusLogic_StatusRegisterOffset);
1212}
1213
1214static inline void BusLogic_WriteCommandParameterRegister(struct BusLogic_HostAdapter
1215 *HostAdapter, unsigned char Value)
1216{
1217 outb(Value, HostAdapter->IO_Address + BusLogic_CommandParameterRegisterOffset);
1218}
1219
1220static inline unsigned char BusLogic_ReadDataInRegister(struct BusLogic_HostAdapter *HostAdapter)
1221{
1222 return inb(HostAdapter->IO_Address + BusLogic_DataInRegisterOffset);
1223}
1224
1225static inline unsigned char BusLogic_ReadInterruptRegister(struct BusLogic_HostAdapter *HostAdapter)
1226{
1227 return inb(HostAdapter->IO_Address + BusLogic_InterruptRegisterOffset);
1228}
1229
1230static 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
1241static 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
1250static 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
1260static inline u32 Virtual_to_Bus(void *VirtualAddress)
1261{
1262 return (u32) virt_to_bus(VirtualAddress);
1263}
1264
1265static 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
1276static 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
1286static 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
1296static 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
1310static 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
1347static const char *BusLogic_DriverInfo(struct Scsi_Host *);
1348static int BusLogic_QueueCommand(struct scsi_cmnd *, void (*CompletionRoutine) (struct scsi_cmnd *));
1349static int BusLogic_BIOSDiskParameters(struct scsi_device *, struct block_device *, sector_t, int *);
1350static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *, char *, char **, off_t, int, int);
1351static int BusLogic_SlaveConfigure(struct scsi_device *);
1352static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *);
1353static irqreturn_t BusLogic_InterruptHandler(int, void *, struct pt_regs *);
1354static int BusLogic_ResetHostAdapter(struct BusLogic_HostAdapter *, boolean HardReset);
1355static void BusLogic_Message(enum BusLogic_MessageLevel, char *, struct BusLogic_HostAdapter *, ...);
1356static int __init BusLogic_Setup(char *);
1357
1358#endif /* _BUSLOGIC_H */