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 37typedef kdev_t KernelDevice_T; 38typedef unsigned long ProcessorFlags_T; 39typedef struct pt_regs Registers_T; 40typedef struct partition PartitionTable_T; 41typedef struct pci_dev PCI_Device_T; 42typedef Scsi_Host_Template SCSI_Host_Template_T; 43typedef struct Scsi_Host SCSI_Host_T; 44typedef struct scsi_device SCSI_Device_T; 45typedef struct scsi_disk SCSI_Disk_T; 46typedef struct scsi_cmnd SCSI_Command_T; 47typedef struct scatterlist SCSI_ScatterList_T; 48 49 50/* 51 Define prototypes for the BusLogic Driver Interface Functions. 52*/ 53 54extern const char *BusLogic_DriverInfo(SCSI_Host_T *); 55extern int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *); 56extern int BusLogic_ReleaseHostAdapter(SCSI_Host_T *); 57extern int BusLogic_QueueCommand(SCSI_Command_T *, 58 void (*CompletionRoutine)(SCSI_Command_T *)); 59extern int BusLogic_AbortCommand(SCSI_Command_T *); 60extern int BusLogic_ResetCommand(SCSI_Command_T *, unsigned int); 61extern int BusLogic_BIOSDiskParameters(SCSI_Disk_T *, KernelDevice_T, int *); 62extern 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 187typedef 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} 195BusLogic_MessageLevel_T; 196 197static 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 227typedef enum 228{ 229 BusLogic_MultiMaster = 1, 230 BusLogic_FlashPoint = 2 231} 232__attribute__ ((packed)) 233BusLogic_HostAdapterType_T; 234 235#define BusLogic_MultiMasterAddressCount 4 236#define BusLogic_FlashPointAddressCount 256 237 238static 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 270typedef 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)) 280BusLogic_HostAdapterBusType_T; 281 282static char 283 *BusLogic_HostAdapterBusNames[] = 284 { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" }; 285 286static 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 300typedef 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)) 308BusLogic_BIOS_DiskGeometryTranslation_T; 309 310 311/* 312 Define a Boolean data type. 313*/ 314 315typedef enum { false, true } __attribute__ ((packed)) boolean; 316 317 318/* 319 Define a 32 bit I/O Address data type. 320*/ 321 322typedef unsigned int BusLogic_IO_Address_T; 323 324 325/* 326 Define a 32 bit PCI Bus Address data type. 327*/ 328 329typedef unsigned int BusLogic_PCI_Address_T; 330 331 332/* 333 Define a 32 bit Base Address data type. 334*/ 335 336typedef unsigned int BusLogic_Base_Address_T; 337 338 339/* 340 Define a 32 bit Bus Address data type. 341*/ 342 343typedef unsigned int BusLogic_BusAddress_T; 344 345 346/* 347 Define a 32 bit Byte Count data type. 348*/ 349 350typedef unsigned int BusLogic_ByteCount_T; 351 352 353/* 354 Define a 10^18 Statistics Byte Counter data type. 355*/ 356 357typedef struct BusLogic_ByteCounter 358{ 359 unsigned int Units; 360 unsigned int Billions; 361} 362BusLogic_ByteCounter_T; 363 364 365/* 366 Define the structure for I/O Address and Bus Probing Information. 367*/ 368 369typedef 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} 379BusLogic_ProbeInfo_T; 380 381 382/* 383 Define the Probe Options. 384*/ 385 386typedef 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} 402BusLogic_ProbeOptions_T; 403 404 405/* 406 Define the Global Options. 407*/ 408 409typedef 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} 416BusLogic_GlobalOptions_T; 417 418 419/* 420 Define the Local Options. 421*/ 422 423typedef struct BusLogic_LocalOptions 424{ 425 boolean InhibitTargetInquiry:1; /* Bit 0 */ 426} 427BusLogic_LocalOptions_T; 428 429 430/* 431 Define the Error Recovery Strategy Options. 432*/ 433 434typedef 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)) 442BusLogic_ErrorRecoveryStrategy_T; 443 444static 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 467typedef 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} 478BusLogic_ControlRegister_T; 479 480 481/* 482 Define the structure of the read-only Status Register. 483*/ 484 485typedef 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} 499BusLogic_StatusRegister_T; 500 501 502/* 503 Define the structure of the read-only Interrupt Register. 504*/ 505 506typedef 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} 518BusLogic_InterruptRegister_T; 519 520 521/* 522 Define the structure of the read-only Geometry Register. 523*/ 524 525typedef 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} 535BusLogic_GeometryRegister_T; 536 537 538/* 539 Define the BusLogic SCSI Host Adapter Command Register Operation Codes. 540*/ 541 542typedef 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} 589BusLogic_OperationCode_T; 590 591 592/* 593 Define the Inquire Board ID reply structure. 594*/ 595 596typedef 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} 603BusLogic_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 613typedef 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 623typedef unsigned short BusLogic_InstalledDevices_T; 624 625 626/* 627 Define the Inquire Configuration reply structure. 628*/ 629 630typedef 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} 647BusLogic_Configuration_T; 648 649 650/* 651 Define the Inquire Setup Information reply structure. 652*/ 653 654typedef 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} 660BusLogic_SynchronousValue_T; 661 662typedef BusLogic_SynchronousValue_T 663 BusLogic_SynchronousValues8_T[8]; 664 665typedef BusLogic_SynchronousValue_T 666 BusLogic_SynchronousValues_T[BusLogic_MaxTargetDevices]; 667 668typedef 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} 691BusLogic_SetupInformation_T; 692 693 694/* 695 Define the Initialize Extended Mailbox request structure. 696*/ 697 698typedef struct BusLogic_ExtendedMailboxRequest 699{ 700 unsigned char MailboxCount; /* Byte 0 */ 701 BusLogic_BusAddress_T BaseMailboxAddress; /* Bytes 1-4 */ 702} 703__attribute__ ((packed)) 704BusLogic_ExtendedMailboxRequest_T; 705 706 707/* 708 Define the Inquire Firmware Version 3rd Digit reply type. 709*/ 710 711typedef unsigned char BusLogic_FirmwareVersion3rdDigit_T; 712 713 714/* 715 Define the Inquire Firmware Version Letter reply type. 716*/ 717 718typedef 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 727typedef 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)) 739BusLogic_ISACompatibleIOPort_T; 740 741typedef 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} 754BusLogic_PCIHostAdapterInformation_T; 755 756 757/* 758 Define the Inquire Host Adapter Model Number reply type. 759*/ 760 761typedef 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 770typedef unsigned char BusLogic_SynchronousPeriod_T[BusLogic_MaxTargetDevices]; 771 772 773/* 774 Define the Inquire Extended Setup Information reply structure. 775*/ 776 777typedef 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)) 798BusLogic_ExtendedSetupInformation_T; 799 800 801/* 802 Define the Enable Strict Round Robin Mode request type. 803*/ 804 805typedef enum BusLogic_RoundRobinModeRequest 806{ 807 BusLogic_AggressiveRoundRobinMode = 0, 808 BusLogic_StrictRoundRobinMode = 1 809} 810__attribute__ ((packed)) 811BusLogic_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 821typedef struct BusLogic_FetchHostAdapterLocalRAMRequest 822{ 823 unsigned char ByteOffset; /* Byte 0 */ 824 unsigned char ByteCount; /* Byte 1 */ 825} 826BusLogic_FetchHostAdapterLocalRAMRequest_T; 827 828 829/* 830 Define the Host Adapter Local RAM AutoSCSI structure. 831*/ 832 833typedef 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)) 905BusLogic_AutoSCSIData_T; 906 907 908/* 909 Define the Host Adapter Local RAM Auto SCSI Byte 45 structure. 910*/ 911 912typedef struct BusLogic_AutoSCSIByte45 913{ 914 unsigned char ForceBusDeviceScanningOrder:1; /* Bit 0 */ 915 unsigned char :7; /* Bits 1-7 */ 916} 917BusLogic_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 926typedef 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} 933BusLogic_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 943typedef 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 951typedef enum BusLogic_SetCCBFormatRequest 952{ 953 BusLogic_LegacyLUNFormatCCB = 0, 954 BusLogic_ExtendedLUNFormatCCB = 1 955} 956__attribute__ ((packed)) 957BusLogic_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 966typedef unsigned char BusLogic_RequestedReplyLength_T; 967 968 969/* 970 Define the Outgoing Mailbox Action Codes. 971*/ 972 973typedef enum 974{ 975 BusLogic_OutgoingMailboxFree = 0x00, 976 BusLogic_MailboxStartCommand = 0x01, 977 BusLogic_MailboxAbortCommand = 0x02 978} 979__attribute__ ((packed)) 980BusLogic_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 989typedef 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)) 999BusLogic_CompletionCode_T; 1000 1001 1002/* 1003 Define the Command Control Block (CCB) Opcodes. 1004*/ 1005 1006typedef 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)) 1016BusLogic_CCB_Opcode_T; 1017 1018 1019/* 1020 Define the CCB Data Direction Codes. 1021*/ 1022 1023typedef enum 1024{ 1025 BusLogic_UncheckedDataTransfer = 0, 1026 BusLogic_DataInLengthChecked = 1, 1027 BusLogic_DataOutLengthChecked = 2, 1028 BusLogic_NoDataTransfer = 3 1029} 1030BusLogic_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 1038typedef 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)) 1067BusLogic_HostAdapterStatus_T; 1068 1069 1070/* 1071 Define the SCSI Target Device Status Codes. 1072*/ 1073 1074typedef enum 1075{ 1076 BusLogic_OperationGood = 0x00, 1077 BusLogic_CheckCondition = 0x02, 1078 BusLogic_DeviceBusy = 0x08 1079} 1080__attribute__ ((packed)) 1081BusLogic_TargetDeviceStatus_T; 1082 1083 1084/* 1085 Define the Queue Tag Codes. 1086*/ 1087 1088typedef enum 1089{ 1090 BusLogic_SimpleQueueTag = 0, 1091 BusLogic_HeadOfQueueTag = 1, 1092 BusLogic_OrderedQueueTag = 2, 1093 BusLogic_ReservedQT = 3 1094} 1095BusLogic_QueueTag_T; 1096 1097 1098/* 1099 Define the SCSI Command Descriptor Block (CDB). 1100*/ 1101 1102#define BusLogic_CDB_MaxLength 12 1103 1104typedef 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 1112typedef struct BusLogic_ScatterGatherSegment 1113{ 1114 BusLogic_ByteCount_T SegmentByteCount; /* Bytes 0-3 */ 1115 BusLogic_BusAddress_T SegmentDataPointer; /* Bytes 4-7 */ 1116} 1117BusLogic_ScatterGatherSegment_T; 1118 1119 1120/* 1121 Define the Driver CCB Status Codes. 1122*/ 1123 1124typedef 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)) 1132BusLogic_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 1154typedef 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} 1205BusLogic_CCB_T; 1206 1207 1208/* 1209 Define the 32 Bit Mode Outgoing Mailbox structure. 1210*/ 1211 1212typedef 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} 1218BusLogic_OutgoingMailbox_T; 1219 1220 1221/* 1222 Define the 32 Bit Mode Incoming Mailbox structure. 1223*/ 1224 1225typedef 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} 1233BusLogic_IncomingMailbox_T; 1234 1235 1236/* 1237 Define the BusLogic Driver Options structure. 1238*/ 1239 1240typedef 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} 1251BusLogic_DriverOptions_T; 1252 1253 1254/* 1255 Define the Host Adapter Target Flags structure. 1256*/ 1257 1258typedef 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} 1268BusLogic_TargetFlags_T; 1269 1270 1271/* 1272 Define the Host Adapter Target Statistics structure. 1273*/ 1274 1275#define BusLogic_SizeBuckets 10 1276 1277typedef unsigned int BusLogic_CommandSizeBuckets_T[BusLogic_SizeBuckets]; 1278 1279typedef 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} 1299BusLogic_TargetStatistics_T; 1300 1301 1302/* 1303 Define the FlashPoint Card Handle data type. 1304*/ 1305 1306#define FlashPoint_BadCardHandle 0xFFFFFFFF 1307 1308typedef 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 1316typedef 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} 1349FlashPoint_Info_T; 1350 1351 1352/* 1353 Define the BusLogic Driver Host Adapter structure. 1354*/ 1355 1356typedef 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} 1452BusLogic_HostAdapter_T; 1453 1454 1455/* 1456 Define a structure for the BIOS Disk Parameters. 1457*/ 1458 1459typedef struct BIOS_DiskParameters 1460{ 1461 int Heads; 1462 int Sectors; 1463 int Cylinders; 1464} 1465BIOS_DiskParameters_T; 1466 1467 1468/* 1469 Define a structure for the SCSI Inquiry command results. 1470*/ 1471 1472typedef 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} 1500SCSI_Inquiry_T; 1501 1502 1503/* 1504 BusLogic_AcquireHostAdapterLock acquires exclusive access to Host Adapter. 1505*/ 1506 1507static inline 1508void 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 1518static inline 1519void 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 1530static inline 1531void 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 1543static inline 1544void 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 1556static inline 1557void 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 1566static inline 1567void 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 1576static inline 1577void 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 1586static inline 1587void 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 1596static inline 1597unsigned char BusLogic_ReadStatusRegister(BusLogic_HostAdapter_T *HostAdapter) 1598{ 1599 return inb(HostAdapter->IO_Address + BusLogic_StatusRegisterOffset); 1600} 1601 1602static inline 1603void BusLogic_WriteCommandParameterRegister(BusLogic_HostAdapter_T 1604 *HostAdapter, 1605 unsigned char Value) 1606{ 1607 outb(Value, 1608 HostAdapter->IO_Address + BusLogic_CommandParameterRegisterOffset); 1609} 1610 1611static inline 1612unsigned char BusLogic_ReadDataInRegister(BusLogic_HostAdapter_T *HostAdapter) 1613{ 1614 return inb(HostAdapter->IO_Address + BusLogic_DataInRegisterOffset); 1615} 1616 1617static inline 1618unsigned char BusLogic_ReadInterruptRegister(BusLogic_HostAdapter_T 1619 *HostAdapter) 1620{ 1621 return inb(HostAdapter->IO_Address + BusLogic_InterruptRegisterOffset); 1622} 1623 1624static inline 1625unsigned 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 1638static inline 1639void 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 1650static 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 1666static inline BusLogic_BusAddress_T Virtual_to_Bus(void *VirtualAddress) 1667{ 1668 return (BusLogic_BusAddress_T) virt_to_bus(VirtualAddress); 1669} 1670 1671static 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 1683static inline 1684BusLogic_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 1695static 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 1705static 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 1722static 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 1765static void BusLogic_QueueCompletedCCB(BusLogic_CCB_T *); 1766static void BusLogic_InterruptHandler(int, void *, Registers_T *); 1767static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *, 1768 SCSI_Command_T *, unsigned int); 1769static void BusLogic_Message(BusLogic_MessageLevel_T, char *, 1770 BusLogic_HostAdapter_T *, ...); 1771 1772/* 1773 Declare the Initialization Functions. 1774*/ 1775 1776static void BusLogic_AnnounceDriver(BusLogic_HostAdapter_T *) __init; 1777static void BusLogic_RegisterHostAdapter(BusLogic_HostAdapter_T *) __init; 1778static void BusLogic_UnregisterHostAdapter(BusLogic_HostAdapter_T *) __init; 1779static boolean BusLogic_CreateInitialCCBs(BusLogic_HostAdapter_T *) __init; 1780static void BusLogic_DestroyCCBs(BusLogic_HostAdapter_T *) __init; 1781static void BusLogic_AppendProbeAddressISA(BusLogic_IO_Address_T) __init; 1782static void 1783BusLogic_InitializeProbeInfoListISA(BusLogic_HostAdapter_T *) __init; 1784static void BusLogic_SortProbeInfo(BusLogic_ProbeInfo_T *, int) __init; 1785static int 1786BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T *) __init; 1787static int 1788BusLogic_InitializeFlashPointProbeInfo(BusLogic_HostAdapter_T *) __init; 1789static void BusLogic_InitializeProbeInfoList(BusLogic_HostAdapter_T *) __init; 1790static boolean BusLogic_Failure(BusLogic_HostAdapter_T *, char *) __init; 1791static boolean BusLogic_ProbeHostAdapter(BusLogic_HostAdapter_T *) __init; 1792static boolean BusLogic_CheckHostAdapter(BusLogic_HostAdapter_T *) __init; 1793static boolean 1794BusLogic_ReadHostAdapterConfiguration(BusLogic_HostAdapter_T *) __init; 1795static boolean 1796BusLogic_ReportHostAdapterConfiguration(BusLogic_HostAdapter_T *) __init; 1797static boolean BusLogic_AcquireResources(BusLogic_HostAdapter_T *) __init; 1798static void BusLogic_ReleaseResources(BusLogic_HostAdapter_T *) __init; 1799static boolean BusLogic_TargetDeviceInquiry(BusLogic_HostAdapter_T *) __init; 1800static void BusLogic_InitializeHostStructure(BusLogic_HostAdapter_T *, 1801 SCSI_Host_T *) __init; 1802int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *) __init; 1803int BusLogic_ReleaseHostAdapter(SCSI_Host_T *) __init; 1804static boolean BusLogic_ParseKeyword(char **, char *) __init; 1805static int BusLogic_ParseDriverOptions(char *) __init; 1806static int BusLogic_Setup(char *) __init; 1807 1808 1809#endif /* BusLogic_DriverVersion */ 1810