|
|
1.1 ! root 1: /* ! 2: ! 3: Linux Driver for BusLogic MultiMaster SCSI Host Adapters ! 4: ! 5: Copyright 1995 by Leonard N. Zubkoff <[email protected]> ! 6: ! 7: See BusLogic.c for licensing information. ! 8: ! 9: */ ! 10: ! 11: ! 12: /* ! 13: Define types for some of the structures that interface with the rest ! 14: of the Linux Kernel and SCSI Subsystem. ! 15: */ ! 16: ! 17: typedef struct pt_regs Registers_T; ! 18: typedef Scsi_Host_Template SCSI_Host_Template_T; ! 19: typedef struct Scsi_Host SCSI_Host_T; ! 20: typedef struct scsi_disk SCSI_Disk_T; ! 21: typedef struct scsi_cmnd SCSI_Command_T; ! 22: typedef struct scatterlist SCSI_ScatterList_T; ! 23: typedef kdev_t KernelDevice_T; ! 24: ! 25: ! 26: /* ! 27: Define prototypes for the BusLogic Driver Interface Functions. ! 28: */ ! 29: ! 30: const char *BusLogic_DriverInfo(SCSI_Host_T *); ! 31: int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *); ! 32: int BusLogic_ReleaseHostAdapter(SCSI_Host_T *); ! 33: int BusLogic_QueueCommand(SCSI_Command_T *, ! 34: void (*CompletionRoutine)(SCSI_Command_T *)); ! 35: int BusLogic_AbortCommand(SCSI_Command_T *); ! 36: int BusLogic_ResetCommand(SCSI_Command_T *); ! 37: int BusLogic_BIOSDiskParameters(SCSI_Disk_T *, KernelDevice_T, int *); ! 38: ! 39: ! 40: /* ! 41: Define the BusLogic SCSI Host Template structure. ! 42: */ ! 43: ! 44: #define BUSLOGIC \ ! 45: { NULL, /* Next */ \ ! 46: NULL, /* Usage Count Pointer */ \ ! 47: NULL, /* /proc Directory Entry */ \ ! 48: NULL, /* /proc Info Function */ \ ! 49: "BusLogic", /* Driver Name */ \ ! 50: BusLogic_DetectHostAdapter, /* Detect Host Adapter */ \ ! 51: BusLogic_ReleaseHostAdapter, /* Release Host Adapter */ \ ! 52: BusLogic_DriverInfo, /* Driver Info Function */ \ ! 53: NULL, /* Command Function */ \ ! 54: BusLogic_QueueCommand, /* Queue Command Function */ \ ! 55: BusLogic_AbortCommand, /* Abort Command Function */ \ ! 56: BusLogic_ResetCommand, /* Reset Command Function */ \ ! 57: NULL, /* Slave Attach Function */ \ ! 58: BusLogic_BIOSDiskParameters, /* Disk BIOS Parameters */ \ ! 59: 0, /* Can Queue */ \ ! 60: 0, /* This ID */ \ ! 61: 0, /* Scatter/Gather Table Size */ \ ! 62: 0, /* SCSI Commands per LUN */ \ ! 63: 0, /* Present */ \ ! 64: 1, /* Default Unchecked ISA DMA */ \ ! 65: ENABLE_CLUSTERING } /* Enable Clustering */ ! 66: ! 67: ! 68: /* ! 69: BusLogic_DriverVersion protects the private portion of this file. ! 70: */ ! 71: ! 72: #ifdef BusLogic_DriverVersion ! 73: ! 74: ! 75: /* ! 76: Define the maximum number of BusLogic Host Adapters that are supported. ! 77: */ ! 78: ! 79: #define BusLogic_MaxHostAdapters 10 ! 80: ! 81: ! 82: /* ! 83: Define the maximum number of I/O Addresses that may be probed. ! 84: */ ! 85: ! 86: #define BusLogic_IO_MaxProbeAddresses 16 ! 87: ! 88: ! 89: /* ! 90: Define the maximum number of Target IDs supported by this driver. ! 91: */ ! 92: ! 93: #define BusLogic_MaxTargetIDs 16 ! 94: ! 95: ! 96: /* ! 97: Define the number of Incoming and Outgoing Mailboxes used by this driver. ! 98: The maximum possible value is 255, since the MailboxCount parameter to the ! 99: Initialize Extended Mailbox command is limited to a single byte. ! 100: */ ! 101: ! 102: #define BusLogic_MailboxCount 64 ! 103: ! 104: ! 105: /* ! 106: Define the number of Command Control Blocks (CCBs) to create during ! 107: initialization for each Host Adapter. Additional CCBs will be allocated ! 108: if necessary as commands are queued. ! 109: */ ! 110: ! 111: #define BusLogic_InitialCCBs 32 ! 112: ! 113: ! 114: /* ! 115: Define the maximum number of Scatter/Gather Segments used by this driver. ! 116: For maximum performance, it is important that this limit be at least as ! 117: large as the maximum single request generated by the routine make_request. ! 118: */ ! 119: ! 120: #define BusLogic_ScatterGatherLimit 128 ! 121: ! 122: ! 123: /* ! 124: Define the default number of Concurrent Commands per Logical Unit to allow ! 125: for Target Devices depending on whether or not ISA bounce buffers are ! 126: required. ! 127: */ ! 128: ! 129: #define BusLogic_Concurrency 7 ! 130: #define BusLogic_Concurrency_BB 1 ! 131: ! 132: ! 133: /* ! 134: Define the default amount of time in seconds to wait between a Host Adapter ! 135: Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI commands. ! 136: Some SCSI devices get confused if they receive SCSI commands too soon after ! 137: a SCSI Bus Reset. ! 138: */ ! 139: ! 140: #define BusLogic_DefaultBusSettleTime 2 ! 141: ! 142: ! 143: /* ! 144: Define the possible Local Options. ! 145: */ ! 146: ! 147: #define BusLogic_InhibitTargetInquiry 1 ! 148: ! 149: ! 150: /* ! 151: Define the possible Global Options. ! 152: */ ! 153: ! 154: #define BusLogic_TraceProbe 1 ! 155: #define BusLogic_TraceHardReset 2 ! 156: #define BusLogic_TraceConfiguration 4 ! 157: #define BusLogic_TraceErrors 8 ! 158: ! 159: ! 160: /* ! 161: Define the possible Error Recovery Options. ! 162: */ ! 163: ! 164: #define BusLogic_ErrorRecoveryDefault 0 ! 165: #define BusLogic_ErrorRecoveryHardReset 1 ! 166: #define BusLogic_ErrorRecoveryBusDeviceReset 2 ! 167: #define BusLogic_ErrorRecoveryNone 3 ! 168: ! 169: static char ! 170: *BusLogic_ErrorRecoveryOptions[] = ! 171: { "Default", "Hard Reset", "Bus Device Reset", "None" }, ! 172: *BusLogic_ErrorRecoveryOptions2[] = ! 173: { "D", "H", "B", "N" }; ! 174: ! 175: ! 176: /* ! 177: Define a boolean data type. ! 178: */ ! 179: ! 180: #define false 0 ! 181: #define true 1 ! 182: typedef unsigned char boolean; ! 183: ! 184: ! 185: /* ! 186: Define the BusLogic SCSI Host Adapter I/O Register Offsets. ! 187: */ ! 188: ! 189: #define BusLogic_IO_PortCount 4 /* I/O Registers */ ! 190: #define BusLogic_ControlRegister 0 /* WO register */ ! 191: #define BusLogic_StatusRegister 0 /* RO register */ ! 192: #define BusLogic_CommandParameterRegister 1 /* WO register */ ! 193: #define BusLogic_DataInRegister 1 /* RO register */ ! 194: #define BusLogic_InterruptRegister 2 /* RO register */ ! 195: #define BusLogic_GeometryRegister 3 /* RO, undocumented */ ! 196: ! 197: ! 198: /* ! 199: Define the bits in the write-only Control Register. ! 200: */ ! 201: ! 202: #define BusLogic_ReservedCR 0x0F ! 203: #define BusLogic_SCSIBusReset 0x10 ! 204: #define BusLogic_InterruptReset 0x20 ! 205: #define BusLogic_SoftReset 0x40 ! 206: #define BusLogic_HardReset 0x80 ! 207: ! 208: ! 209: /* ! 210: Define the bits in the read-only Status Register. ! 211: */ ! 212: ! 213: #define BusLogic_CommandInvalid 0x01 ! 214: #define BusLogic_ReservedSR 0x02 ! 215: #define BusLogic_DataInRegisterReady 0x04 ! 216: #define BusLogic_CommandParameterRegisterBusy 0x08 ! 217: #define BusLogic_HostAdapterReady 0x10 ! 218: #define BusLogic_InitializationRequired 0x20 ! 219: #define BusLogic_DiagnosticFailure 0x40 ! 220: #define BusLogic_DiagnosticActive 0x80 ! 221: ! 222: ! 223: /* ! 224: Define the bits in the read-only Interrupt Register. ! 225: */ ! 226: ! 227: #define BusLogic_IncomingMailboxLoaded 0x01 ! 228: #define BusLogic_OutgoingMailboxAvailable 0x02 ! 229: #define BusLogic_CommandComplete 0x04 ! 230: #define BusLogic_SCSIResetState 0x08 ! 231: #define BusLogic_ReservedIR 0x70 ! 232: #define BusLogic_InterruptValid 0x80 ! 233: ! 234: ! 235: /* ! 236: Define the bits in the undocumented read-only Geometry Register. ! 237: */ ! 238: ! 239: #define BusLogic_Drive0Geometry 0x03 ! 240: #define BusLogic_Drive1Geometry 0x0C ! 241: #define BusLogic_ReservedGR 0x70 ! 242: #define BusLogic_ExtendedTranslationEnabled 0x80 ! 243: ! 244: ! 245: /* ! 246: Define the BusLogic SCSI Host Adapter Command Register Operation Codes. ! 247: */ ! 248: ! 249: typedef enum ! 250: { ! 251: BusLogic_TestCommandCompleteInterrupt = 0x00, /* documented */ ! 252: BusLogic_InitializeMailbox = 0x01, /* documented */ ! 253: BusLogic_StartMailboxCommand = 0x02, /* documented */ ! 254: BusLogic_StartBIOSCommand = 0x03, /* documented */ ! 255: BusLogic_InquireBoardID = 0x04, /* documented */ ! 256: BusLogic_EnableOutgoingMailboxAvailableIRQ = 0x05, /* documented */ ! 257: BusLogic_SetSCSISelectionTimeout = 0x06, /* documented */ ! 258: BusLogic_SetPreemptTimeOnBus = 0x07, /* documented */ ! 259: BusLogic_SetTimeOffBus = 0x08, /* ISA Bus only */ ! 260: BusLogic_SetBusTransferRate = 0x09, /* ISA Bus only */ ! 261: BusLogic_InquireInstalledDevicesID0to7 = 0x0A, /* documented */ ! 262: BusLogic_InquireConfiguration = 0x0B, /* documented */ ! 263: BusLogic_SetTargetMode = 0x0C, /* now undocumented */ ! 264: BusLogic_InquireSetupInformation = 0x0D, /* documented */ ! 265: BusLogic_WriteAdapterLocalRAM = 0x1A, /* documented */ ! 266: BusLogic_ReadAdapterLocalRAM = 0x1B, /* documented */ ! 267: BusLogic_WriteBusMasterChipFIFO = 0x1C, /* documented */ ! 268: BusLogic_ReadBusMasterChipFIFO = 0x1D, /* documented */ ! 269: BusLogic_EchoCommandData = 0x1F, /* documented */ ! 270: BusLogic_HostAdapterDiagnostic = 0x20, /* documented */ ! 271: BusLogic_SetAdapterOptions = 0x21, /* documented */ ! 272: BusLogic_InquireInstalledDevicesID8to15 = 0x23, /* Wide only */ ! 273: BusLogic_InitializeExtendedMailbox = 0x81, /* documented */ ! 274: BusLogic_InquireFirmwareVersion3rdDigit = 0x84, /* undocumented */ ! 275: BusLogic_InquireFirmwareVersionLetter = 0x85, /* undocumented */ ! 276: BusLogic_InquireBoardModelNumber = 0x8B, /* undocumented */ ! 277: BusLogic_InquireSynchronousPeriod = 0x8C, /* undocumented */ ! 278: BusLogic_InquireExtendedSetupInformation = 0x8D, /* documented */ ! 279: BusLogic_EnableStrictRoundRobinMode = 0x8F, /* documented */ ! 280: BusLogic_ModifyIOAddress = 0x95, /* PCI only */ ! 281: BusLogic_EnableWideModeCCB = 0x96 /* Wide only */ ! 282: } ! 283: BusLogic_OperationCode_T; ! 284: ! 285: ! 286: /* ! 287: Define the Inquire Board ID reply structure. ! 288: */ ! 289: ! 290: typedef struct BusLogic_BoardID ! 291: { ! 292: unsigned char BoardType; ! 293: unsigned char CustomFeatures; ! 294: unsigned char FirmwareVersion1stDigit; ! 295: unsigned char FirmwareVersion2ndDigit; ! 296: } ! 297: BusLogic_BoardID_T; ! 298: ! 299: ! 300: /* ! 301: Define the Inquire Installed Devices ID 0 to 7 and Inquire Installed ! 302: Devices ID 8 to 15 reply type. For each Target ID, a byte is returned ! 303: where bit 0 set indicates that Logical Unit 0 exists, bit 1 set indicates ! 304: that Logical Unit 1 exists, and so on. ! 305: */ ! 306: ! 307: typedef unsigned char BusLogic_InstalledDevices8_T[8]; ! 308: ! 309: typedef unsigned char BusLogic_InstalledDevices_T[BusLogic_MaxTargetIDs]; ! 310: ! 311: ! 312: /* ! 313: Define the Inquire Configuration reply structure. ! 314: */ ! 315: ! 316: typedef struct BusLogic_Configuration ! 317: { ! 318: unsigned char :5; /* Byte 0: DMA Channel */ ! 319: boolean DMA_Channel5:1; ! 320: boolean DMA_Channel6:1; ! 321: boolean DMA_Channel7:1; ! 322: boolean IRQ_Channel9:1; /* Byte 1: IRQ Channel */ ! 323: boolean IRQ_Channel10:1; ! 324: boolean IRQ_Channel11:1; ! 325: boolean IRQ_Channel12:1; ! 326: unsigned char :1; ! 327: boolean IRQ_Channel14:1; ! 328: boolean IRQ_Channel15:1; ! 329: unsigned char :1; ! 330: unsigned char HostAdapterID:4; /* Byte 2: Host Adapter ID */ ! 331: unsigned char :4; ! 332: } ! 333: BusLogic_Configuration_T; ! 334: ! 335: ! 336: /* ! 337: Define the Inquire Setup Information reply structure. ! 338: */ ! 339: ! 340: typedef struct BusLogic_SynchronousValue ! 341: { ! 342: unsigned char Offset:4; ! 343: unsigned char TransferPeriod:3; ! 344: boolean Synchronous:1; ! 345: } ! 346: BusLogic_SynchronousValue_T; ! 347: ! 348: typedef BusLogic_SynchronousValue_T ! 349: BusLogic_SynchronousValues8_T[8]; ! 350: ! 351: typedef BusLogic_SynchronousValue_T ! 352: BusLogic_SynchronousValues_T[BusLogic_MaxTargetIDs]; ! 353: ! 354: typedef struct BusLogic_SetupInformation ! 355: { ! 356: boolean SynchronousInitiationEnabled:1; /* Byte 0 */ ! 357: boolean ParityCheckEnabled:1; ! 358: unsigned char :6; ! 359: unsigned char BusTransferRate; /* Byte 1 */ ! 360: unsigned char PreemptTimeOnBus; /* Byte 2 */ ! 361: unsigned char TimeOffBus; /* Byte 3 */ ! 362: unsigned char MailboxCount; /* Byte 4 */ ! 363: unsigned char MailboxAddress[3]; /* Bytes 5-7 */ ! 364: BusLogic_SynchronousValues8_T SynchronousValuesID0to7; /* Bytes 8-15 */ ! 365: unsigned char DisconnectPermittedID0to7; /* Byte 16 */ ! 366: unsigned char Signature; /* Byte 17 */ ! 367: unsigned char CharacterD; /* Byte 18 */ ! 368: unsigned char BusLetter; /* Byte 19 */ ! 369: unsigned char :8; /* Byte 20 */ ! 370: unsigned char :8; /* Byte 21 */ ! 371: BusLogic_SynchronousValues8_T SynchronousValuesID8to15; /* Bytes 22-29 */ ! 372: unsigned char DisconnectPermittedID8to15; /* Byte 30 */ ! 373: } ! 374: BusLogic_SetupInformation_T; ! 375: ! 376: ! 377: /* ! 378: Define the Initialize Extended Mailbox request structure. ! 379: */ ! 380: ! 381: typedef struct BusLogic_ExtendedMailboxRequest ! 382: { ! 383: unsigned char MailboxCount; ! 384: void *BaseMailboxAddress __attribute__ ((packed)); ! 385: } ! 386: BusLogic_ExtendedMailboxRequest_T; ! 387: ! 388: ! 389: /* ! 390: Define the Inquire Firmware Version 3rd Digit reply type. ! 391: */ ! 392: ! 393: typedef unsigned char BusLogic_FirmwareVersion3rdDigit_T; ! 394: ! 395: ! 396: /* ! 397: Define the Inquire Firmware Version Letter reply type. ! 398: */ ! 399: ! 400: typedef unsigned char BusLogic_FirmwareVersionLetter_T; ! 401: ! 402: ! 403: /* ! 404: Define the Inquire Board Model Number reply type. ! 405: */ ! 406: ! 407: typedef unsigned char BusLogic_BoardModelNumber_T[5]; ! 408: ! 409: ! 410: /* ! 411: Define the Inquire Synchronous Period reply type. For each Target ID, a byte ! 412: is returned which represents the Synchronous Transfer Period in units of 10 ! 413: nanoseconds. ! 414: */ ! 415: ! 416: typedef unsigned char BusLogic_SynchronousPeriod_T[BusLogic_MaxTargetIDs]; ! 417: ! 418: ! 419: /* ! 420: Define the Inquire Extended Setup Information reply structure. ! 421: */ ! 422: ! 423: typedef struct BusLogic_ExtendedSetupInformation ! 424: { ! 425: unsigned char BusType; /* Byte 0 */ ! 426: unsigned char BIOS_Address; /* Byte 1 */ ! 427: unsigned short ScatterGatherLimit; /* Bytes 2-3 */ ! 428: unsigned char MailboxCount; /* Byte 4 */ ! 429: void *BaseMailboxAddress __attribute__ ((packed)); /* Bytes 5-8 */ ! 430: struct { unsigned char :6; /* Byte 9 */ ! 431: boolean LevelSensitiveInterrupts:1; ! 432: unsigned char :1; } Misc; ! 433: unsigned char FirmwareRevision[3]; /* Bytes 10-12 */ ! 434: boolean HostWideSCSI:1; /* Byte 13 Bit 0 */ ! 435: boolean HostDifferentialSCSI:1; /* Byte 13 Bit 1 */ ! 436: unsigned char :6; ! 437: } ! 438: BusLogic_ExtendedSetupInformation_T; ! 439: ! 440: ! 441: /* ! 442: Define the Enable Strict Round Robin Mode request type. ! 443: */ ! 444: ! 445: #define BusLogic_AggressiveRoundRobinMode 0x00 ! 446: #define BusLogic_StrictRoundRobinMode 0x01 ! 447: ! 448: typedef unsigned char BusLogic_RoundRobinModeRequest_T; ! 449: ! 450: ! 451: /* ! 452: Define the Modify I/O Address request type. On PCI Host Adapters, the ! 453: Modify I/O Address command allows modification of the ISA compatible I/O ! 454: Address that the Host Adapter responds to; it does not affect the PCI ! 455: compliant I/O Address assigned at system initialization. ! 456: */ ! 457: ! 458: #define BusLogic_ModifyIO_330 0x00 ! 459: #define BusLogic_ModifyIO_334 0x01 ! 460: #define BusLogic_ModifyIO_230 0x02 ! 461: #define BusLogic_ModifyIO_234 0x03 ! 462: #define BusLogic_ModifyIO_130 0x04 ! 463: #define BusLogic_ModifyIO_134 0x05 ! 464: #define BusLogic_ModifyIO_Disable 0x06 ! 465: #define BusLogic_ModifyIO_Disable2 0x07 ! 466: ! 467: typedef unsigned char BusLogic_ModifyIOAddressRequest_T; ! 468: ! 469: ! 470: /* ! 471: Define the Enable Wide Mode SCSI CCB request type. Wide Mode CCBs are ! 472: necessary to support more than 8 Logical Units per Target. ! 473: */ ! 474: ! 475: #define BusLogic_NormalModeCCB 0x00 ! 476: #define BusLogic_WideModeCCB 0x01 ! 477: ! 478: typedef unsigned char BusLogic_WideModeCCBRequest_T; ! 479: ! 480: ! 481: /* ! 482: Define the Requested Reply Length type used by the Inquire Setup Information, ! 483: Inquire Board Model Number, Inquire Synchronous Period, and Inquire Extended ! 484: Setup Information commands. ! 485: */ ! 486: ! 487: typedef unsigned char BusLogic_RequestedReplyLength_T; ! 488: ! 489: ! 490: /* ! 491: Define a Lock data structure. Until a true symmetric multiprocessing kernel ! 492: is available, locking is implemented as saving the processor flags and ! 493: disabling interrupts, and unlocking restores the saved processor flags. ! 494: */ ! 495: ! 496: typedef unsigned long BusLogic_Lock_T; ! 497: ! 498: ! 499: /* ! 500: Define the Outgoing Mailbox Action Codes. ! 501: */ ! 502: ! 503: typedef enum ! 504: { ! 505: BusLogic_OutgoingMailboxFree = 0, ! 506: BusLogic_MailboxStartCommand = 1, ! 507: BusLogic_MailboxAbortCommand = 2 ! 508: } ! 509: BusLogic_ActionCode_T; ! 510: ! 511: ! 512: /* ! 513: Define the Incoming Mailbox Completion Codes. ! 514: */ ! 515: ! 516: typedef enum ! 517: { ! 518: BusLogic_IncomingMailboxFree = 0, ! 519: BusLogic_CommandCompletedWithoutError = 1, ! 520: BusLogic_CommandAbortedAtHostRequest = 2, ! 521: BusLogic_AbortedCommandNotFound = 3, ! 522: BusLogic_CommandCompletedWithError = 4 ! 523: } ! 524: BusLogic_CompletionCode_T; ! 525: ! 526: ! 527: /* ! 528: Define the Command Control Block (CCB) Opcodes. ! 529: */ ! 530: ! 531: typedef enum ! 532: { ! 533: BusLogic_InitiatorCCB = 0x00, ! 534: BusLogic_TargetCCB = 0x01, ! 535: BusLogic_InitiatorCCB_ScatterGather = 0x02, ! 536: BusLogic_InitiatorCCB_ResidualDataLength = 0x03, ! 537: BusLogic_InitiatorCCB_ScatterGatherResidual = 0x04, ! 538: BusLogic_SCSIBusDeviceReset = 0x81 ! 539: } ! 540: BusLogic_CCB_Opcode_T; ! 541: ! 542: ! 543: /* ! 544: Define the CCB Data Direction Codes. ! 545: */ ! 546: ! 547: typedef enum ! 548: { ! 549: BusLogic_UncheckedDataTransfer = 0x00, ! 550: BusLogic_DataInLengthChecked = 0x01, ! 551: BusLogic_DataOutLengthChecked = 0x02, ! 552: BusLogic_NoDataTransfer = 0x03 ! 553: } ! 554: BusLogic_DataDirection_T; ! 555: ! 556: ! 557: /* ! 558: Define the Host Adapter Status Codes. ! 559: */ ! 560: ! 561: typedef enum ! 562: { ! 563: BusLogic_CommandCompletedNormally = 0x00, ! 564: BusLogic_LinkedCommandCompleted = 0x0A, ! 565: BusLogic_LinkedCommandCompletedWithFlag = 0x0B, ! 566: BusLogic_SCSISelectionTimeout = 0x11, ! 567: BusLogic_DataOverUnderRun = 0x12, ! 568: BusLogic_UnexpectedBusFree = 0x13, ! 569: BusLogic_InvalidBusPhaseRequested = 0x14, ! 570: BusLogic_InvalidOutgoingMailboxActionCode = 0x15, ! 571: BusLogic_InvalidCommandOperationCode = 0x16, ! 572: BusLogic_LinkedCCBhasInvalidLUN = 0x17, ! 573: BusLogic_InvalidCommandParameter = 0x1A, ! 574: BusLogic_AutoRequestSenseFailed = 0x1B, ! 575: BusLogic_TaggedQueuingMessageRejected = 0x1C, ! 576: BusLogic_UnsupportedMessageReceived = 0x1D, ! 577: BusLogic_HostAdapterHardwareFailed = 0x20, ! 578: BusLogic_TargetFailedResponseToATN = 0x21, ! 579: BusLogic_HostAdapterAssertedRST = 0x22, ! 580: BusLogic_OtherDeviceAssertedRST = 0x23, ! 581: BusLogic_TargetDeviceReconnectedImproperly = 0x24, ! 582: BusLogic_HostAdapterAssertedBusDeviceReset = 0x25, ! 583: BusLogic_AbortQueueGenerated = 0x26, ! 584: BusLogic_HostAdapterSoftwareError = 0x27, ! 585: BusLogic_HostAdapterHardwareTimeoutError = 0x30, ! 586: BusLogic_SCSIParityErrorDetected = 0x34 ! 587: } ! 588: BusLogic_HostAdapterStatus_T; ! 589: ! 590: ! 591: /* ! 592: Define the SCSI Target Device Status Codes. ! 593: */ ! 594: ! 595: typedef enum ! 596: { ! 597: BusLogic_OperationGood = 0x00, ! 598: BusLogic_CheckCondition = 0x02, ! 599: BusLogic_DeviceBusy = 0x08 ! 600: } ! 601: BusLogic_TargetDeviceStatus_T; ! 602: ! 603: ! 604: /* ! 605: Define the Queue Tag Codes. ! 606: */ ! 607: ! 608: typedef enum ! 609: { ! 610: BusLogic_SimpleQueueTag = 0x00, ! 611: BusLogic_HeadOfQueueTag = 0x01, ! 612: BusLogic_OrderedQueueTag = 0x02, ! 613: BusLogic_ReservedQT = 0x03 ! 614: } ! 615: BusLogic_QueueTag_T; ! 616: ! 617: ! 618: /* ! 619: Define the SCSI Command Descriptor Block (CDB). ! 620: */ ! 621: ! 622: #define BusLogic_CDB_MaxLength 12 ! 623: ! 624: typedef unsigned char SCSI_CDB_T[BusLogic_CDB_MaxLength]; ! 625: ! 626: ! 627: /* ! 628: Define the SCSI Sense Data. ! 629: */ ! 630: ! 631: #define BusLogic_SenseDataMaxLength 255 ! 632: ! 633: typedef unsigned char SCSI_SenseData_T[BusLogic_SenseDataMaxLength]; ! 634: ! 635: ! 636: /* ! 637: Define the Scatter/Gather Segment structure required by the Host Adapter ! 638: Firmware Interface. ! 639: */ ! 640: ! 641: typedef struct BusLogic_ScatterGatherSegment ! 642: { ! 643: unsigned long SegmentByteCount; ! 644: void *SegmentDataPointer; ! 645: } ! 646: BusLogic_ScatterGatherSegment_T; ! 647: ! 648: ! 649: /* ! 650: Define the 32 Bit Mode Command Control Block (CCB) structure. The first 40 ! 651: bytes are defined by the Host Adapter Firmware Interface. The remaining ! 652: components are defined by the Linux BusLogic Driver. Wide Mode CCBs differ ! 653: from standard 32 Bit Mode CCBs only in having the TagEnable and QueueTag ! 654: fields moved from byte 17 to byte 1, and the Logical Unit field in byte 17 ! 655: expanded to 6 bits; unfortunately, using a union of structs containing ! 656: enumeration type bitfields to provide both definitions leads to packing ! 657: problems, so the following definition is used which requires setting ! 658: TagEnable to Logical Unit bit 5 in Wide Mode CCBs. ! 659: */ ! 660: ! 661: typedef struct BusLogic_CCB ! 662: { ! 663: /* ! 664: BusLogic Host Adapter Firmware Portion. ! 665: */ ! 666: BusLogic_CCB_Opcode_T Opcode:8; /* Byte 0 */ ! 667: unsigned char :3; /* Byte 1 Bits 0-2 */ ! 668: BusLogic_DataDirection_T DataDirection:2; /* Byte 1 Bits 3-4 */ ! 669: boolean WideModeTagEnable:1; /* Byte 1 Bit 5 */ ! 670: BusLogic_QueueTag_T WideModeQueueTag:2; /* Byte 1 Bits 6-7 */ ! 671: unsigned char CDB_Length; /* Byte 2 */ ! 672: unsigned char SenseDataLength; /* Byte 3 */ ! 673: unsigned long DataLength; /* Bytes 4-7 */ ! 674: void *DataPointer; /* Bytes 8-11 */ ! 675: unsigned char :8; /* Byte 12 */ ! 676: unsigned char :8; /* Byte 13 */ ! 677: BusLogic_HostAdapterStatus_T HostAdapterStatus:8; /* Byte 14 */ ! 678: BusLogic_TargetDeviceStatus_T TargetDeviceStatus:8; /* Byte 15 */ ! 679: unsigned char TargetID; /* Byte 16 */ ! 680: unsigned char LogicalUnit:5; /* Byte 17 Bits 0-4 */ ! 681: boolean TagEnable:1; /* Byte 17 Bit 5 */ ! 682: BusLogic_QueueTag_T QueueTag:2; /* Byte 17 Bits 6-7 */ ! 683: SCSI_CDB_T CDB; /* Bytes 18-29 */ ! 684: unsigned char :8; /* Byte 30 */ ! 685: unsigned char :8; /* Byte 31 */ ! 686: unsigned long :32; /* Bytes 32-35 */ ! 687: SCSI_SenseData_T *SenseDataPointer; /* Bytes 36-39 */ ! 688: /* ! 689: BusLogic Linux Driver Portion. ! 690: */ ! 691: struct BusLogic_HostAdapter *HostAdapter; ! 692: SCSI_Command_T *Command; ! 693: enum { BusLogic_CCB_Free = 0, ! 694: BusLogic_CCB_Active = 1, ! 695: BusLogic_CCB_Completed = 2, ! 696: BusLogic_CCB_Reset = 3 } Status; ! 697: BusLogic_CompletionCode_T MailboxCompletionCode; ! 698: unsigned int SerialNumber; ! 699: struct BusLogic_CCB *Next; ! 700: struct BusLogic_CCB *NextAll; ! 701: BusLogic_ScatterGatherSegment_T ! 702: ScatterGatherList[BusLogic_ScatterGatherLimit]; ! 703: } ! 704: BusLogic_CCB_T; ! 705: ! 706: ! 707: /* ! 708: Define the 32 Bit Mode Outgoing Mailbox structure. ! 709: */ ! 710: ! 711: typedef struct BusLogic_OutgoingMailbox ! 712: { ! 713: BusLogic_CCB_T *CCB; ! 714: unsigned long :24; ! 715: BusLogic_ActionCode_T ActionCode:8; ! 716: } ! 717: BusLogic_OutgoingMailbox_T; ! 718: ! 719: ! 720: /* ! 721: Define the 32 Bit Mode Incoming Mailbox structure. ! 722: */ ! 723: ! 724: typedef struct BusLogic_IncomingMailbox ! 725: { ! 726: BusLogic_CCB_T *CCB; ! 727: BusLogic_HostAdapterStatus_T HostAdapterStatus:8; ! 728: BusLogic_TargetDeviceStatus_T TargetDeviceStatus:8; ! 729: unsigned char :8; ! 730: BusLogic_CompletionCode_T CompletionCode:8; ! 731: } ! 732: BusLogic_IncomingMailbox_T; ! 733: ! 734: ! 735: /* ! 736: Define the possible Bus Types. ! 737: */ ! 738: ! 739: typedef enum ! 740: { ! 741: BusLogic_Unknown_Bus = 0, ! 742: BusLogic_ISA_Bus = 1, ! 743: BusLogic_MCA_Bus = 2, ! 744: BusLogic_EISA_Bus = 3, ! 745: BusLogic_VESA_Bus = 4, ! 746: BusLogic_PCI_Bus = 5 ! 747: } ! 748: BusLogic_BusType_T; ! 749: ! 750: static char ! 751: *BusLogic_BusNames[] = ! 752: { "Unknown", "ISA", "MCA", "EISA", "VESA", "PCI" }; ! 753: ! 754: ! 755: /* ! 756: Define the Linux BusLogic Driver Command Line Entry structure. ! 757: */ ! 758: ! 759: typedef struct BusLogic_CommandLineEntry ! 760: { ! 761: unsigned short IO_Address; ! 762: unsigned short Concurrency; ! 763: unsigned short BusSettleTime; ! 764: unsigned short LocalOptions; ! 765: unsigned short TaggedQueuingPermitted; ! 766: unsigned short TaggedQueuingPermittedMask; ! 767: unsigned char ErrorRecoveryOption[BusLogic_MaxTargetIDs]; ! 768: } ! 769: BusLogic_CommandLineEntry_T; ! 770: ! 771: ! 772: /* ! 773: Define the Linux BusLogic Driver Host Adapter structure. ! 774: */ ! 775: ! 776: typedef struct BusLogic_HostAdapter ! 777: { ! 778: SCSI_Host_T *SCSI_Host; ! 779: unsigned char HostNumber; ! 780: unsigned char ModelName[9]; ! 781: unsigned char FirmwareVersion[6]; ! 782: unsigned char BoardName[18]; ! 783: unsigned char InterruptLabel[62]; ! 784: unsigned short IO_Address; ! 785: unsigned char IRQ_Channel; ! 786: unsigned char DMA_Channel; ! 787: unsigned char SCSI_ID; ! 788: BusLogic_BusType_T BusType:3; ! 789: boolean IRQ_ChannelAcquired:1; ! 790: boolean DMA_ChannelAcquired:1; ! 791: boolean SynchronousInitiation:1; ! 792: boolean ParityChecking:1; ! 793: boolean ExtendedTranslation:1; ! 794: boolean LevelSensitiveInterrupts:1; ! 795: boolean HostWideSCSI:1; ! 796: boolean HostDifferentialSCSI:1; ! 797: boolean HostAdapterResetPending:1; ! 798: boolean BounceBuffersRequired:1; ! 799: volatile boolean HostAdapterCommandCompleted:1; ! 800: unsigned short HostAdapterScatterGatherLimit; ! 801: unsigned short DriverScatterGatherLimit; ! 802: unsigned short MaxTargetIDs; ! 803: unsigned short MaxLogicalUnits; ! 804: unsigned short Concurrency; ! 805: unsigned short BusSettleTime; ! 806: unsigned short LocalOptions; ! 807: unsigned short DisconnectPermitted; ! 808: unsigned short TaggedQueuingPermitted; ! 809: unsigned long BIOS_Address; ! 810: BusLogic_InstalledDevices_T InstalledDevices; ! 811: BusLogic_SynchronousValues_T SynchronousValues; ! 812: BusLogic_SynchronousPeriod_T SynchronousPeriod; ! 813: BusLogic_Lock_T Lock; ! 814: struct BusLogic_HostAdapter *Next; ! 815: BusLogic_CommandLineEntry_T *CommandLineEntry; ! 816: BusLogic_CCB_T *All_CCBs; ! 817: BusLogic_CCB_T *Free_CCBs; ! 818: unsigned char ErrorRecoveryOption[BusLogic_MaxTargetIDs]; ! 819: unsigned char CommandSuccessfulFlag[BusLogic_MaxTargetIDs]; ! 820: unsigned long ReadWriteOperationCount[BusLogic_MaxTargetIDs]; ! 821: unsigned char QueuedOperationCount[BusLogic_MaxTargetIDs]; ! 822: unsigned long LastSequencePoint[BusLogic_MaxTargetIDs]; ! 823: BusLogic_OutgoingMailbox_T *FirstOutgoingMailbox; ! 824: BusLogic_OutgoingMailbox_T *LastOutgoingMailbox; ! 825: BusLogic_OutgoingMailbox_T *NextOutgoingMailbox; ! 826: BusLogic_IncomingMailbox_T *FirstIncomingMailbox; ! 827: BusLogic_IncomingMailbox_T *LastIncomingMailbox; ! 828: BusLogic_IncomingMailbox_T *NextIncomingMailbox; ! 829: BusLogic_OutgoingMailbox_T OutgoingMailboxes[BusLogic_MailboxCount]; ! 830: BusLogic_IncomingMailbox_T IncomingMailboxes[BusLogic_MailboxCount]; ! 831: } ! 832: BusLogic_HostAdapter_T; ! 833: ! 834: ! 835: /* ! 836: Define a symbolic structure for the BIOS Disk Parameters. ! 837: */ ! 838: ! 839: typedef struct BIOS_DiskParameters ! 840: { ! 841: int Heads; ! 842: int Sectors; ! 843: int Cylinders; ! 844: } ! 845: BIOS_DiskParameters_T; ! 846: ! 847: ! 848: /* ! 849: BusLogic_LockHostAdapter acquires exclusive access to Host Adapter. ! 850: */ ! 851: ! 852: static inline ! 853: void BusLogic_LockHostAdapter(BusLogic_HostAdapter_T *HostAdapter) ! 854: { ! 855: save_flags(HostAdapter->Lock); ! 856: cli(); ! 857: } ! 858: ! 859: ! 860: /* ! 861: BusLogic_UnlockHostAdapter releases exclusive access to Host Adapter. ! 862: */ ! 863: ! 864: static inline ! 865: void BusLogic_UnlockHostAdapter(BusLogic_HostAdapter_T *HostAdapter) ! 866: { ! 867: restore_flags(HostAdapter->Lock); ! 868: } ! 869: ! 870: ! 871: /* ! 872: BusLogic_LockHostAdapterID acquires exclusive access to Host Adapter, ! 873: but is only called when interrupts are disabled. ! 874: */ ! 875: ! 876: static inline ! 877: void BusLogic_LockHostAdapterID(BusLogic_HostAdapter_T *HostAdapter) ! 878: { ! 879: } ! 880: ! 881: ! 882: /* ! 883: BusLogic_UnlockHostAdapterID releases exclusive access to Host Adapter, ! 884: but is only called when interrupts are disabled. ! 885: */ ! 886: ! 887: static inline ! 888: void BusLogic_UnlockHostAdapterID(BusLogic_HostAdapter_T *HostAdapter) ! 889: { ! 890: } ! 891: ! 892: ! 893: /* ! 894: Define functions to provide an abstraction for reading and writing the ! 895: Host Adapter I/O Registers. ! 896: */ ! 897: ! 898: static inline ! 899: void BusLogic_WriteControlRegister(BusLogic_HostAdapter_T *HostAdapter, ! 900: unsigned char Value) ! 901: { ! 902: outb(Value, HostAdapter->IO_Address + BusLogic_ControlRegister); ! 903: } ! 904: ! 905: static inline ! 906: unsigned char BusLogic_ReadStatusRegister(BusLogic_HostAdapter_T *HostAdapter) ! 907: { ! 908: return inb(HostAdapter->IO_Address + BusLogic_StatusRegister); ! 909: } ! 910: ! 911: static inline ! 912: void BusLogic_WriteCommandParameterRegister(BusLogic_HostAdapter_T *HostAdapter, ! 913: unsigned char Value) ! 914: { ! 915: outb(Value, HostAdapter->IO_Address + BusLogic_CommandParameterRegister); ! 916: } ! 917: ! 918: static inline ! 919: unsigned char BusLogic_ReadDataInRegister(BusLogic_HostAdapter_T *HostAdapter) ! 920: { ! 921: return inb(HostAdapter->IO_Address + BusLogic_DataInRegister); ! 922: } ! 923: ! 924: static inline ! 925: unsigned char BusLogic_ReadInterruptRegister(BusLogic_HostAdapter_T ! 926: *HostAdapter) ! 927: { ! 928: return inb(HostAdapter->IO_Address + BusLogic_InterruptRegister); ! 929: } ! 930: ! 931: static inline ! 932: unsigned char BusLogic_ReadGeometryRegister(BusLogic_HostAdapter_T *HostAdapter) ! 933: { ! 934: return inb(HostAdapter->IO_Address + BusLogic_GeometryRegister); ! 935: } ! 936: ! 937: ! 938: /* ! 939: BusLogic_StartMailboxScan issues a Start Mailbox Scan command, which ! 940: notifies the Host Adapter that an entry has been made in an Outgoing ! 941: Mailbox. ! 942: */ ! 943: ! 944: static inline ! 945: void BusLogic_StartMailboxScan(BusLogic_HostAdapter_T *HostAdapter) ! 946: { ! 947: BusLogic_WriteCommandParameterRegister(HostAdapter, ! 948: BusLogic_StartMailboxCommand); ! 949: } ! 950: ! 951: ! 952: /* ! 953: BusLogic_Delay waits for Seconds to elapse. ! 954: */ ! 955: ! 956: static inline void BusLogic_Delay(int Seconds) ! 957: { ! 958: unsigned long TimeoutJiffies = jiffies + Seconds * HZ; ! 959: unsigned long ProcessorFlags; ! 960: save_flags(ProcessorFlags); ! 961: sti(); ! 962: while (jiffies < TimeoutJiffies) ; ! 963: restore_flags(ProcessorFlags); ! 964: } ! 965: ! 966: ! 967: /* ! 968: Define prototypes for the forward referenced BusLogic Driver ! 969: Internal Functions. ! 970: */ ! 971: ! 972: static void BusLogic_InterruptHandler(int, Registers_T *); ! 973: static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *, ! 974: SCSI_Command_T *); ! 975: ! 976: ! 977: #endif /* BusLogic_DriverVersion */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.