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