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