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