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