root/drivers/scsi/BusLogic.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. BusLogic_LockHostAdapter
  2. BusLogic_UnlockHostAdapter
  3. BusLogic_LockHostAdapterID
  4. BusLogic_UnlockHostAdapterID
  5. BusLogic_WriteControlRegister
  6. BusLogic_ReadStatusRegister
  7. BusLogic_WriteCommandParameterRegister
  8. BusLogic_ReadDataInRegister
  9. BusLogic_ReadInterruptRegister
  10. BusLogic_ReadGeometryRegister
  11. BusLogic_StartMailboxScan
  12. BusLogic_Delay

   1 /*
   2 
   3   Linux Driver for BusLogic MultiMaster SCSI Host Adapters
   4 
   5   Copyright 1995 by Leonard N. Zubkoff <lnz@dandelion.com>
   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)
     /* [previous][next][first][last][top][bottom][index][help] */
 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)
     /* [previous][next][first][last][top][bottom][index][help] */
 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)
     /* [previous][next][first][last][top][bottom][index][help] */
 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)
     /* [previous][next][first][last][top][bottom][index][help] */
 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,
     /* [previous][next][first][last][top][bottom][index][help] */
 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)
     /* [previous][next][first][last][top][bottom][index][help] */
 907 {
 908   return inb(HostAdapter->IO_Address + BusLogic_StatusRegister);
 909 }
 910 
 911 static inline
 912 void BusLogic_WriteCommandParameterRegister(BusLogic_HostAdapter_T *HostAdapter,
     /* [previous][next][first][last][top][bottom][index][help] */
 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)
     /* [previous][next][first][last][top][bottom][index][help] */
 920 {
 921   return inb(HostAdapter->IO_Address + BusLogic_DataInRegister);
 922 }
 923 
 924 static inline
 925 unsigned char BusLogic_ReadInterruptRegister(BusLogic_HostAdapter_T
     /* [previous][next][first][last][top][bottom][index][help] */
 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)
     /* [previous][next][first][last][top][bottom][index][help] */
 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)
     /* [previous][next][first][last][top][bottom][index][help] */
 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)
     /* [previous][next][first][last][top][bottom][index][help] */
 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, void *, Registers_T *);
 973 static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *,
 974                                      SCSI_Command_T *);
 975 
 976 
 977 #endif /* BusLogic_DriverVersion */

/* [previous][next][first][last][top][bottom][index][help] */