linux/drivers/scsi/BusLogic.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3
   4  Linux Driver for BusLogic MultiMaster and FlashPoint SCSI Host Adapters
   5
   6  Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>
   7
   8
   9  The author respectfully requests that any modifications to this software be
  10  sent directly to him for evaluation and testing.
  11
  12  Special thanks to Wayne Yen, Jin-Lon Hon, and Alex Win of BusLogic, whose
  13  advice has been invaluable, to David Gentzel, for writing the original Linux
  14  BusLogic driver, and to Paul Gortmaker, for being such a dedicated test site.
  15
  16  Finally, special thanks to Mylex/BusLogic for making the FlashPoint SCCB
  17  Manager available as freely redistributable source code.
  18
  19*/
  20
  21#ifndef _BUSLOGIC_H
  22#define _BUSLOGIC_H
  23
  24
  25#ifndef PACKED
  26#define PACKED __attribute__((packed))
  27#endif
  28
  29/*
  30  Define the maximum number of BusLogic Host Adapters supported by this driver.
  31*/
  32
  33#define BLOGIC_MAX_ADAPTERS             16
  34
  35
  36/*
  37  Define the maximum number of Target Devices supported by this driver.
  38*/
  39
  40#define BLOGIC_MAXDEV                   16
  41
  42
  43/*
  44  Define the maximum number of Scatter/Gather Segments used by this driver.
  45  For optimal performance, it is important that this limit be at least as
  46  large as the largest single request generated by the I/O Subsystem.
  47*/
  48
  49#define BLOGIC_SG_LIMIT         128
  50
  51
  52/*
  53  Define the maximum, maximum automatic, minimum automatic, and default Queue
  54  Depth to allow for Target Devices depending on whether or not they support
  55  Tagged Queuing and whether or not ISA Bounce Buffers are required.
  56*/
  57
  58#define BLOGIC_MAX_TAG_DEPTH            64
  59#define BLOGIC_MAX_AUTO_TAG_DEPTH       28
  60#define BLOGIC_MIN_AUTO_TAG_DEPTH       7
  61#define BLOGIC_TAG_DEPTH_BB             3
  62#define BLOGIC_UNTAG_DEPTH              3
  63#define BLOGIC_UNTAG_DEPTH_BB           2
  64
  65
  66/*
  67  Define the default amount of time in seconds to wait between a Host Adapter
  68  Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI commands.
  69  Some SCSI devices get confused if they receive SCSI commands too soon after
  70  a SCSI Bus Reset.
  71*/
  72
  73#define BLOGIC_BUS_SETTLE_TIME          2
  74
  75
  76/*
  77  Define the maximum number of Mailboxes that should be used for MultiMaster
  78  Host Adapters.  This number is chosen to be larger than the maximum Host
  79  Adapter Queue Depth and small enough so that the Host Adapter structure
  80  does not cross an allocation block size boundary.
  81*/
  82
  83#define BLOGIC_MAX_MAILBOX              211
  84
  85
  86/*
  87  Define the number of CCBs that should be allocated as a group to optimize
  88  Kernel memory allocation.
  89*/
  90
  91#define BLOGIC_CCB_GRP_ALLOCSIZE        7
  92
  93
  94/*
  95  Define the Host Adapter Line and Message Buffer Sizes.
  96*/
  97
  98#define BLOGIC_LINEBUF_SIZE             100
  99#define BLOGIC_MSGBUF_SIZE              9700
 100
 101
 102/*
 103  Define the Driver Message Levels.
 104*/
 105
 106enum blogic_msglevel {
 107        BLOGIC_ANNOUNCE_LEVEL = 0,
 108        BLOGIC_INFO_LEVEL = 1,
 109        BLOGIC_NOTICE_LEVEL = 2,
 110        BLOGIC_WARN_LEVEL = 3,
 111        BLOGIC_ERR_LEVEL = 4
 112};
 113
 114static char *blogic_msglevelmap[] = { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING, KERN_ERR };
 115
 116
 117/*
 118  Define Driver Message macros.
 119*/
 120
 121#define blogic_announce(format, args...) \
 122        blogic_msg(BLOGIC_ANNOUNCE_LEVEL, format, ##args)
 123
 124#define blogic_info(format, args...) \
 125        blogic_msg(BLOGIC_INFO_LEVEL, format, ##args)
 126
 127#define blogic_notice(format, args...) \
 128        blogic_msg(BLOGIC_NOTICE_LEVEL, format, ##args)
 129
 130#define blogic_warn(format, args...) \
 131        blogic_msg(BLOGIC_WARN_LEVEL, format, ##args)
 132
 133#define blogic_err(format, args...) \
 134        blogic_msg(BLOGIC_ERR_LEVEL, format, ##args)
 135
 136
 137/*
 138  Define the types of BusLogic Host Adapters that are supported and the number
 139  of I/O Addresses required by each type.
 140*/
 141
 142enum blogic_adapter_type {
 143        BLOGIC_MULTIMASTER = 1,
 144        BLOGIC_FLASHPOINT = 2
 145} PACKED;
 146
 147#define BLOGIC_MULTIMASTER_ADDR_COUNT   4
 148#define BLOGIC_FLASHPOINT_ADDR_COUNT    256
 149
 150static int blogic_adapter_addr_count[3] = { 0, BLOGIC_MULTIMASTER_ADDR_COUNT, BLOGIC_FLASHPOINT_ADDR_COUNT };
 151
 152
 153/*
 154  Define macros for testing the Host Adapter Type.
 155*/
 156
 157#ifdef CONFIG_SCSI_FLASHPOINT
 158
 159#define blogic_multimaster_type(adapter) \
 160        (adapter->adapter_type == BLOGIC_MULTIMASTER)
 161
 162#define blogic_flashpoint_type(adapter) \
 163        (adapter->adapter_type == BLOGIC_FLASHPOINT)
 164
 165#else
 166
 167#define blogic_multimaster_type(adapter)        (true)
 168#define blogic_flashpoint_type(adapter)         (false)
 169
 170#endif
 171
 172
 173/*
 174  Define the possible Host Adapter Bus Types.
 175*/
 176
 177enum blogic_adapter_bus_type {
 178        BLOGIC_UNKNOWN_BUS = 0,
 179        BLOGIC_ISA_BUS = 1,
 180        BLOGIC_EISA_BUS = 2,
 181        BLOGIC_PCI_BUS = 3,
 182        BLOGIC_VESA_BUS = 4,
 183        BLOGIC_MCA_BUS = 5
 184} PACKED;
 185
 186static char *blogic_adapter_busnames[] = { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" };
 187
 188static enum blogic_adapter_bus_type blogic_adater_bus_types[] = {
 189        BLOGIC_VESA_BUS,        /* BT-4xx */
 190        BLOGIC_ISA_BUS,         /* BT-5xx */
 191        BLOGIC_MCA_BUS,         /* BT-6xx */
 192        BLOGIC_EISA_BUS,        /* BT-7xx */
 193        BLOGIC_UNKNOWN_BUS,     /* BT-8xx */
 194        BLOGIC_PCI_BUS          /* BT-9xx */
 195};
 196
 197/*
 198  Define the possible Host Adapter BIOS Disk Geometry Translations.
 199*/
 200
 201enum blogic_bios_diskgeometry {
 202        BLOGIC_BIOS_NODISK = 0,
 203        BLOGIC_BIOS_DISK64x32 = 1,
 204        BLOGIC_BIOS_DISK128x32 = 2,
 205        BLOGIC_BIOS_DISK255x63 = 3
 206} PACKED;
 207
 208
 209/*
 210  Define a 10^18 Statistics Byte Counter data type.
 211*/
 212
 213struct blogic_byte_count {
 214        unsigned int units;
 215        unsigned int billions;
 216};
 217
 218
 219/*
 220  Define the structure for I/O Address and Bus Probing Information.
 221*/
 222
 223struct blogic_probeinfo {
 224        enum blogic_adapter_type adapter_type;
 225        enum blogic_adapter_bus_type adapter_bus_type;
 226        unsigned long io_addr;
 227        unsigned long pci_addr;
 228        struct pci_dev *pci_device;
 229        unsigned char bus;
 230        unsigned char dev;
 231        unsigned char irq_ch;
 232};
 233
 234/*
 235  Define the Probe Options.
 236*/
 237
 238struct blogic_probe_options {
 239        bool noprobe:1;                 /* Bit 0 */
 240        bool noprobe_isa:1;             /* Bit 1 */
 241        bool noprobe_pci:1;             /* Bit 2 */
 242        bool nosort_pci:1;              /* Bit 3 */
 243        bool multimaster_first:1;       /* Bit 4 */
 244        bool flashpoint_first:1;        /* Bit 5 */
 245        bool limited_isa:1;             /* Bit 6 */
 246        bool probe330:1;                /* Bit 7 */
 247        bool probe334:1;                /* Bit 8 */
 248        bool probe230:1;                /* Bit 9 */
 249        bool probe234:1;                /* Bit 10 */
 250        bool probe130:1;                /* Bit 11 */
 251        bool probe134:1;                /* Bit 12 */
 252};
 253
 254/*
 255  Define the Global Options.
 256*/
 257
 258struct blogic_global_options {
 259        bool trace_probe:1;     /* Bit 0 */
 260        bool trace_hw_reset:1;  /* Bit 1 */
 261        bool trace_config:1;    /* Bit 2 */
 262        bool trace_err:1;       /* Bit 3 */
 263};
 264
 265/*
 266  Define the BusLogic SCSI Host Adapter I/O Register Offsets.
 267*/
 268
 269#define BLOGIC_CNTRL_REG        0       /* WO register */
 270#define BLOGIC_STATUS_REG       0       /* RO register */
 271#define BLOGIC_CMD_PARM_REG     1       /* WO register */
 272#define BLOGIC_DATAIN_REG       1       /* RO register */
 273#define BLOGIC_INT_REG          2       /* RO register */
 274#define BLOGIC_GEOMETRY_REG     3       /* RO register */
 275
 276/*
 277  Define the structure of the write-only Control Register.
 278*/
 279
 280union blogic_cntrl_reg {
 281        unsigned char all;
 282        struct {
 283                unsigned char:4;        /* Bits 0-3 */
 284                bool bus_reset:1;       /* Bit 4 */
 285                bool int_reset:1;       /* Bit 5 */
 286                bool soft_reset:1;      /* Bit 6 */
 287                bool hard_reset:1;      /* Bit 7 */
 288        } cr;
 289};
 290
 291/*
 292  Define the structure of the read-only Status Register.
 293*/
 294
 295union blogic_stat_reg {
 296        unsigned char all;
 297        struct {
 298                bool cmd_invalid:1;     /* Bit 0 */
 299                bool rsvd:1;            /* Bit 1 */
 300                bool datain_ready:1;    /* Bit 2 */
 301                bool cmd_param_busy:1;  /* Bit 3 */
 302                bool adapter_ready:1;   /* Bit 4 */
 303                bool init_reqd:1;       /* Bit 5 */
 304                bool diag_failed:1;     /* Bit 6 */
 305                bool diag_active:1;     /* Bit 7 */
 306        } sr;
 307};
 308
 309/*
 310  Define the structure of the read-only Interrupt Register.
 311*/
 312
 313union blogic_int_reg {
 314        unsigned char all;
 315        struct {
 316                bool mailin_loaded:1;   /* Bit 0 */
 317                bool mailout_avail:1;   /* Bit 1 */
 318                bool cmd_complete:1;    /* Bit 2 */
 319                bool ext_busreset:1;    /* Bit 3 */
 320                unsigned char rsvd:3;   /* Bits 4-6 */
 321                bool int_valid:1;       /* Bit 7 */
 322        } ir;
 323};
 324
 325/*
 326  Define the structure of the read-only Geometry Register.
 327*/
 328
 329union blogic_geo_reg {
 330        unsigned char all;
 331        struct {
 332                enum blogic_bios_diskgeometry d0_geo:2; /* Bits 0-1 */
 333                enum blogic_bios_diskgeometry d1_geo:2; /* Bits 2-3 */
 334                unsigned char:3;        /* Bits 4-6 */
 335                bool ext_trans_enable:1;        /* Bit 7 */
 336        } gr;
 337};
 338
 339/*
 340  Define the BusLogic SCSI Host Adapter Command Register Operation Codes.
 341*/
 342
 343enum blogic_opcode {
 344        BLOGIC_TEST_CMP_COMPLETE = 0x00,
 345        BLOGIC_INIT_MBOX = 0x01,
 346        BLOGIC_EXEC_MBOX_CMD = 0x02,
 347        BLOGIC_EXEC_BIOS_CMD = 0x03,
 348        BLOGIC_GET_BOARD_ID = 0x04,
 349        BLOGIC_ENABLE_OUTBOX_AVAIL_INT = 0x05,
 350        BLOGIC_SET_SELECT_TIMEOUT = 0x06,
 351        BLOGIC_SET_PREEMPT_TIME = 0x07,
 352        BLOGIC_SET_TIMEOFF_BUS = 0x08,
 353        BLOGIC_SET_TXRATE = 0x09,
 354        BLOGIC_INQ_DEV0TO7 = 0x0A,
 355        BLOGIC_INQ_CONFIG = 0x0B,
 356        BLOGIC_TGT_MODE = 0x0C,
 357        BLOGIC_INQ_SETUPINFO = 0x0D,
 358        BLOGIC_WRITE_LOCALRAM = 0x1A,
 359        BLOGIC_READ_LOCALRAM = 0x1B,
 360        BLOGIC_WRITE_BUSMASTER_FIFO = 0x1C,
 361        BLOGIC_READ_BUSMASTER_FIFO = 0x1D,
 362        BLOGIC_ECHO_CMDDATA = 0x1F,
 363        BLOGIC_ADAPTER_DIAG = 0x20,
 364        BLOGIC_SET_OPTIONS = 0x21,
 365        BLOGIC_INQ_DEV8TO15 = 0x23,
 366        BLOGIC_INQ_DEV = 0x24,
 367        BLOGIC_DISABLE_INT = 0x25,
 368        BLOGIC_INIT_EXT_MBOX = 0x81,
 369        BLOGIC_EXEC_SCS_CMD = 0x83,
 370        BLOGIC_INQ_FWVER_D3 = 0x84,
 371        BLOGIC_INQ_FWVER_LETTER = 0x85,
 372        BLOGIC_INQ_PCI_INFO = 0x86,
 373        BLOGIC_INQ_MODELNO = 0x8B,
 374        BLOGIC_INQ_SYNC_PERIOD = 0x8C,
 375        BLOGIC_INQ_EXTSETUP = 0x8D,
 376        BLOGIC_STRICT_RR = 0x8F,
 377        BLOGIC_STORE_LOCALRAM = 0x90,
 378        BLOGIC_FETCH_LOCALRAM = 0x91,
 379        BLOGIC_STORE_TO_EEPROM = 0x92,
 380        BLOGIC_LOAD_AUTOSCSICODE = 0x94,
 381        BLOGIC_MOD_IOADDR = 0x95,
 382        BLOGIC_SETCCB_FMT = 0x96,
 383        BLOGIC_WRITE_INQBUF = 0x9A,
 384        BLOGIC_READ_INQBUF = 0x9B,
 385        BLOGIC_FLASH_LOAD = 0xA7,
 386        BLOGIC_READ_SCAMDATA = 0xA8,
 387        BLOGIC_WRITE_SCAMDATA = 0xA9
 388};
 389
 390/*
 391  Define the Inquire Board ID reply structure.
 392*/
 393
 394struct blogic_board_id {
 395        unsigned char type;             /* Byte 0 */
 396        unsigned char custom_features;  /* Byte 1 */
 397        unsigned char fw_ver_digit1;    /* Byte 2 */
 398        unsigned char fw_ver_digit2;    /* Byte 3 */
 399};
 400
 401/*
 402  Define the Inquire Configuration reply structure.
 403*/
 404
 405struct blogic_config {
 406        unsigned char:5;        /* Byte 0 Bits 0-4 */
 407        bool dma_ch5:1;         /* Byte 0 Bit 5 */
 408        bool dma_ch6:1;         /* Byte 0 Bit 6 */
 409        bool dma_ch7:1;         /* Byte 0 Bit 7 */
 410        bool irq_ch9:1;         /* Byte 1 Bit 0 */
 411        bool irq_ch10:1;        /* Byte 1 Bit 1 */
 412        bool irq_ch11:1;        /* Byte 1 Bit 2 */
 413        bool irq_ch12:1;        /* Byte 1 Bit 3 */
 414        unsigned char:1;        /* Byte 1 Bit 4 */
 415        bool irq_ch14:1;        /* Byte 1 Bit 5 */
 416        bool irq_ch15:1;        /* Byte 1 Bit 6 */
 417        unsigned char:1;        /* Byte 1 Bit 7 */
 418        unsigned char id:4;     /* Byte 2 Bits 0-3 */
 419        unsigned char:4;        /* Byte 2 Bits 4-7 */
 420};
 421
 422/*
 423  Define the Inquire Setup Information reply structure.
 424*/
 425
 426struct blogic_syncval {
 427        unsigned char offset:4;         /* Bits 0-3 */
 428        unsigned char tx_period:3;      /* Bits 4-6 */
 429        bool sync:1;                    /* Bit 7 */
 430};
 431
 432struct blogic_setup_info {
 433        bool sync:1;                            /* Byte 0 Bit 0 */
 434        bool parity:1;                          /* Byte 0 Bit 1 */
 435        unsigned char:6;                        /* Byte 0 Bits 2-7 */
 436        unsigned char tx_rate;                  /* Byte 1 */
 437        unsigned char preempt_time;             /* Byte 2 */
 438        unsigned char timeoff_bus;              /* Byte 3 */
 439        unsigned char mbox_count;               /* Byte 4 */
 440        unsigned char mbox_addr[3];             /* Bytes 5-7 */
 441        struct blogic_syncval sync0to7[8];      /* Bytes 8-15 */
 442        unsigned char disconnect_ok0to7;        /* Byte 16 */
 443        unsigned char sig;                      /* Byte 17 */
 444        unsigned char char_d;                   /* Byte 18 */
 445        unsigned char bus_type;                 /* Byte 19 */
 446        unsigned char wide_tx_ok0to7;           /* Byte 20 */
 447        unsigned char wide_tx_active0to7;       /* Byte 21 */
 448        struct blogic_syncval sync8to15[8];     /* Bytes 22-29 */
 449        unsigned char disconnect_ok8to15;       /* Byte 30 */
 450        unsigned char:8;                        /* Byte 31 */
 451        unsigned char wide_tx_ok8to15;          /* Byte 32 */
 452        unsigned char wide_tx_active8to15;      /* Byte 33 */
 453};
 454
 455/*
 456  Define the Initialize Extended Mailbox request structure.
 457*/
 458
 459struct blogic_extmbox_req {
 460        unsigned char mbox_count;       /* Byte 0 */
 461        u32 base_mbox_addr;             /* Bytes 1-4 */
 462} PACKED;
 463
 464
 465/*
 466  Define the Inquire PCI Host Adapter Information reply type.  The ISA
 467  Compatible I/O Port values are defined here and are also used with
 468  the Modify I/O Address command.
 469*/
 470
 471enum blogic_isa_ioport {
 472        BLOGIC_IO_330 = 0,
 473        BLOGIC_IO_334 = 1,
 474        BLOGIC_IO_230 = 2,
 475        BLOGIC_IO_234 = 3,
 476        BLOGIC_IO_130 = 4,
 477        BLOGIC_IO_134 = 5,
 478        BLOGIC_IO_DISABLE = 6,
 479        BLOGIC_IO_DISABLE2 = 7
 480} PACKED;
 481
 482struct blogic_adapter_info {
 483        enum blogic_isa_ioport isa_port;        /* Byte 0 */
 484        unsigned char irq_ch;           /* Byte 1 */
 485        bool low_term:1;                /* Byte 2 Bit 0 */
 486        bool high_term:1;               /* Byte 2 Bit 1 */
 487        unsigned char:2;                /* Byte 2 Bits 2-3 */
 488        bool JP1:1;                     /* Byte 2 Bit 4 */
 489        bool JP2:1;                     /* Byte 2 Bit 5 */
 490        bool JP3:1;                     /* Byte 2 Bit 6 */
 491        bool genericinfo_valid:1;       /* Byte 2 Bit 7 */
 492        unsigned char:8;                /* Byte 3 */
 493};
 494
 495/*
 496  Define the Inquire Extended Setup Information reply structure.
 497*/
 498
 499struct blogic_ext_setup {
 500        unsigned char bus_type;         /* Byte 0 */
 501        unsigned char bios_addr;        /* Byte 1 */
 502        unsigned short sg_limit;        /* Bytes 2-3 */
 503        unsigned char mbox_count;       /* Byte 4 */
 504        u32 base_mbox_addr;             /* Bytes 5-8 */
 505        struct {
 506                unsigned char:2;        /* Byte 9 Bits 0-1 */
 507                bool fast_on_eisa:1;    /* Byte 9 Bit 2 */
 508                unsigned char:3;        /* Byte 9 Bits 3-5 */
 509                bool level_int:1;       /* Byte 9 Bit 6 */
 510                unsigned char:1;        /* Byte 9 Bit 7 */
 511        } misc;
 512        unsigned char fw_rev[3];        /* Bytes 10-12 */
 513        bool wide:1;                    /* Byte 13 Bit 0 */
 514        bool differential:1;            /* Byte 13 Bit 1 */
 515        bool scam:1;                    /* Byte 13 Bit 2 */
 516        bool ultra:1;                   /* Byte 13 Bit 3 */
 517        bool smart_term:1;              /* Byte 13 Bit 4 */
 518        unsigned char:3;                /* Byte 13 Bits 5-7 */
 519} PACKED;
 520
 521/*
 522  Define the Enable Strict Round Robin Mode request type.
 523*/
 524
 525enum blogic_rr_req {
 526        BLOGIC_AGGRESSIVE_RR = 0,
 527        BLOGIC_STRICT_RR_MODE = 1
 528} PACKED;
 529
 530
 531/*
 532  Define the Fetch Host Adapter Local RAM request type.
 533*/
 534
 535#define BLOGIC_BIOS_BASE                0
 536#define BLOGIC_AUTOSCSI_BASE            64
 537
 538struct blogic_fetch_localram {
 539        unsigned char offset;   /* Byte 0 */
 540        unsigned char count;    /* Byte 1 */
 541};
 542
 543/*
 544  Define the Host Adapter Local RAM AutoSCSI structure.
 545*/
 546
 547struct blogic_autoscsi {
 548        unsigned char factory_sig[2];           /* Bytes 0-1 */
 549        unsigned char info_bytes;               /* Byte 2 */
 550        unsigned char adapter_type[6];          /* Bytes 3-8 */
 551        unsigned char:8;                        /* Byte 9 */
 552        bool floppy:1;                          /* Byte 10 Bit 0 */
 553        bool floppy_sec:1;                      /* Byte 10 Bit 1 */
 554        bool level_int:1;                       /* Byte 10 Bit 2 */
 555        unsigned char:2;                        /* Byte 10 Bits 3-4 */
 556        unsigned char systemram_bios:3;         /* Byte 10 Bits 5-7 */
 557        unsigned char dma_ch:7;                 /* Byte 11 Bits 0-6 */
 558        bool dma_autoconf:1;                    /* Byte 11 Bit 7 */
 559        unsigned char irq_ch:7;                 /* Byte 12 Bits 0-6 */
 560        bool irq_autoconf:1;                    /* Byte 12 Bit 7 */
 561        unsigned char dma_tx_rate;              /* Byte 13 */
 562        unsigned char scsi_id;                  /* Byte 14 */
 563        bool low_term:1;                        /* Byte 15 Bit 0 */
 564        bool parity:1;                          /* Byte 15 Bit 1 */
 565        bool high_term:1;                       /* Byte 15 Bit 2 */
 566        bool noisy_cable:1;                     /* Byte 15 Bit 3 */
 567        bool fast_sync_neg:1;                   /* Byte 15 Bit 4 */
 568        bool reset_enabled:1;                   /* Byte 15 Bit 5 */
 569        bool:1;                                 /* Byte 15 Bit 6 */
 570        bool active_negation:1;                 /* Byte 15 Bit 7 */
 571        unsigned char bus_on_delay;             /* Byte 16 */
 572        unsigned char bus_off_delay;            /* Byte 17 */
 573        bool bios_enabled:1;                    /* Byte 18 Bit 0 */
 574        bool int19_redir_enabled:1;             /* Byte 18 Bit 1 */
 575        bool ext_trans_enable:1;                /* Byte 18 Bit 2 */
 576        bool removable_as_fixed:1;              /* Byte 18 Bit 3 */
 577        bool:1;                                 /* Byte 18 Bit 4 */
 578        bool morethan2_drives:1;                /* Byte 18 Bit 5 */
 579        bool bios_int:1;                        /* Byte 18 Bit 6 */
 580        bool floptical:1;                       /* Byte 19 Bit 7 */
 581        unsigned short dev_enabled;             /* Bytes 19-20 */
 582        unsigned short wide_ok;                 /* Bytes 21-22 */
 583        unsigned short fast_ok;                 /* Bytes 23-24 */
 584        unsigned short sync_ok;                 /* Bytes 25-26 */
 585        unsigned short discon_ok;               /* Bytes 27-28 */
 586        unsigned short send_start_unit;         /* Bytes 29-30 */
 587        unsigned short ignore_bios_scan;        /* Bytes 31-32 */
 588        unsigned char pci_int_pin:2;            /* Byte 33 Bits 0-1 */
 589        unsigned char adapter_ioport:2;         /* Byte 33 Bits 2-3 */
 590        bool strict_rr_enabled:1;               /* Byte 33 Bit 4 */
 591        bool vesabus_33mhzplus:1;               /* Byte 33 Bit 5 */
 592        bool vesa_burst_write:1;                /* Byte 33 Bit 6 */
 593        bool vesa_burst_read:1;                 /* Byte 33 Bit 7 */
 594        unsigned short ultra_ok;                /* Bytes 34-35 */
 595        unsigned int:32;                        /* Bytes 36-39 */
 596        unsigned char:8;                        /* Byte 40 */
 597        unsigned char autoscsi_maxlun;          /* Byte 41 */
 598        bool:1;                                 /* Byte 42 Bit 0 */
 599        bool scam_dominant:1;                   /* Byte 42 Bit 1 */
 600        bool scam_enabled:1;                    /* Byte 42 Bit 2 */
 601        bool scam_lev2:1;                       /* Byte 42 Bit 3 */
 602        unsigned char:4;                        /* Byte 42 Bits 4-7 */
 603        bool int13_exten:1;                     /* Byte 43 Bit 0 */
 604        bool:1;                                 /* Byte 43 Bit 1 */
 605        bool cd_boot:1;                         /* Byte 43 Bit 2 */
 606        unsigned char:5;                        /* Byte 43 Bits 3-7 */
 607        unsigned char boot_id:4;                /* Byte 44 Bits 0-3 */
 608        unsigned char boot_ch:4;                /* Byte 44 Bits 4-7 */
 609        unsigned char force_scan_order:1;       /* Byte 45 Bit 0 */
 610        unsigned char:7;                        /* Byte 45 Bits 1-7 */
 611        unsigned short nontagged_to_alt_ok;     /* Bytes 46-47 */
 612        unsigned short reneg_sync_on_check;     /* Bytes 48-49 */
 613        unsigned char rsvd[10];                 /* Bytes 50-59 */
 614        unsigned char manuf_diag[2];            /* Bytes 60-61 */
 615        unsigned short cksum;                   /* Bytes 62-63 */
 616} PACKED;
 617
 618/*
 619  Define the Host Adapter Local RAM Auto SCSI Byte 45 structure.
 620*/
 621
 622struct blogic_autoscsi_byte45 {
 623        unsigned char force_scan_order:1;       /* Bit 0 */
 624        unsigned char:7;        /* Bits 1-7 */
 625};
 626
 627/*
 628  Define the Host Adapter Local RAM BIOS Drive Map Byte structure.
 629*/
 630
 631#define BLOGIC_BIOS_DRVMAP              17
 632
 633struct blogic_bios_drvmap {
 634        unsigned char tgt_idbit3:1;                     /* Bit 0 */
 635        unsigned char:2;                                /* Bits 1-2 */
 636        enum blogic_bios_diskgeometry diskgeom:2;       /* Bits 3-4 */
 637        unsigned char tgt_id:3;                         /* Bits 5-7 */
 638};
 639
 640/*
 641  Define the Set CCB Format request type.  Extended LUN Format CCBs are
 642  necessary to support more than 8 Logical Units per Target Device.
 643*/
 644
 645enum blogic_setccb_fmt {
 646        BLOGIC_LEGACY_LUN_CCB = 0,
 647        BLOGIC_EXT_LUN_CCB = 1
 648} PACKED;
 649
 650/*
 651  Define the Outgoing Mailbox Action Codes.
 652*/
 653
 654enum blogic_action {
 655        BLOGIC_OUTBOX_FREE = 0x00,
 656        BLOGIC_MBOX_START = 0x01,
 657        BLOGIC_MBOX_ABORT = 0x02
 658} PACKED;
 659
 660
 661/*
 662  Define the Incoming Mailbox Completion Codes.  The MultiMaster Firmware
 663  only uses codes 0 - 4.  The FlashPoint SCCB Manager has no mailboxes, so
 664  completion codes are stored in the CCB; it only uses codes 1, 2, 4, and 5.
 665*/
 666
 667enum blogic_cmplt_code {
 668        BLOGIC_INBOX_FREE = 0x00,
 669        BLOGIC_CMD_COMPLETE_GOOD = 0x01,
 670        BLOGIC_CMD_ABORT_BY_HOST = 0x02,
 671        BLOGIC_CMD_NOTFOUND = 0x03,
 672        BLOGIC_CMD_COMPLETE_ERROR = 0x04,
 673        BLOGIC_INVALID_CCB = 0x05
 674} PACKED;
 675
 676/*
 677  Define the Command Control Block (CCB) Opcodes.
 678*/
 679
 680enum blogic_ccb_opcode {
 681        BLOGIC_INITIATOR_CCB = 0x00,
 682        BLOGIC_TGT_CCB = 0x01,
 683        BLOGIC_INITIATOR_CCB_SG = 0x02,
 684        BLOGIC_INITIATOR_CCBB_RESIDUAL = 0x03,
 685        BLOGIC_INITIATOR_CCB_SG_RESIDUAL = 0x04,
 686        BLOGIC_BDR = 0x81
 687} PACKED;
 688
 689
 690/*
 691  Define the CCB Data Direction Codes.
 692*/
 693
 694enum blogic_datadir {
 695        BLOGIC_UNCHECKED_TX = 0,
 696        BLOGIC_DATAIN_CHECKED = 1,
 697        BLOGIC_DATAOUT_CHECKED = 2,
 698        BLOGIC_NOTX = 3
 699};
 700
 701
 702/*
 703  Define the Host Adapter Status Codes.  The MultiMaster Firmware does not
 704  return status code 0x0C; it uses 0x12 for both overruns and underruns.
 705*/
 706
 707enum blogic_adapter_status {
 708        BLOGIC_CMD_CMPLT_NORMAL = 0x00,
 709        BLOGIC_LINK_CMD_CMPLT = 0x0A,
 710        BLOGIC_LINK_CMD_CMPLT_FLAG = 0x0B,
 711        BLOGIC_DATA_UNDERRUN = 0x0C,
 712        BLOGIC_SELECT_TIMEOUT = 0x11,
 713        BLOGIC_DATA_OVERRUN = 0x12,
 714        BLOGIC_NOEXPECT_BUSFREE = 0x13,
 715        BLOGIC_INVALID_BUSPHASE = 0x14,
 716        BLOGIC_INVALID_OUTBOX_CODE = 0x15,
 717        BLOGIC_INVALID_CMD_CODE = 0x16,
 718        BLOGIC_LINKCCB_BADLUN = 0x17,
 719        BLOGIC_BAD_CMD_PARAM = 0x1A,
 720        BLOGIC_AUTOREQSENSE_FAIL = 0x1B,
 721        BLOGIC_TAGQUEUE_REJECT = 0x1C,
 722        BLOGIC_BAD_MSG_RCVD = 0x1D,
 723        BLOGIC_HW_FAIL = 0x20,
 724        BLOGIC_NORESPONSE_TO_ATN = 0x21,
 725        BLOGIC_HW_RESET = 0x22,
 726        BLOGIC_RST_FROM_OTHERDEV = 0x23,
 727        BLOGIC_BAD_RECONNECT = 0x24,
 728        BLOGIC_HW_BDR = 0x25,
 729        BLOGIC_ABRT_QUEUE = 0x26,
 730        BLOGIC_ADAPTER_SW_ERROR = 0x27,
 731        BLOGIC_HW_TIMEOUT = 0x30,
 732        BLOGIC_PARITY_ERR = 0x34
 733} PACKED;
 734
 735
 736/*
 737  Define the SCSI Target Device Status Codes.
 738*/
 739
 740enum blogic_tgt_status {
 741        BLOGIC_OP_GOOD = 0x00,
 742        BLOGIC_CHECKCONDITION = 0x02,
 743        BLOGIC_DEVBUSY = 0x08
 744} PACKED;
 745
 746/*
 747  Define the Queue Tag Codes.
 748*/
 749
 750enum blogic_queuetag {
 751        BLOGIC_SIMPLETAG = 0,
 752        BLOGIC_HEADTAG = 1,
 753        BLOGIC_ORDEREDTAG = 2,
 754        BLOGIC_RSVDTAG = 3
 755};
 756
 757/*
 758  Define the SCSI Command Descriptor Block (CDB).
 759*/
 760
 761#define BLOGIC_CDB_MAXLEN                       12
 762
 763
 764/*
 765  Define the Scatter/Gather Segment structure required by the MultiMaster
 766  Firmware Interface and the FlashPoint SCCB Manager.
 767*/
 768
 769struct blogic_sg_seg {
 770        u32 segbytes;   /* Bytes 0-3 */
 771        u32 segdata;    /* Bytes 4-7 */
 772};
 773
 774/*
 775  Define the Driver CCB Status Codes.
 776*/
 777
 778enum blogic_ccb_status {
 779        BLOGIC_CCB_FREE = 0,
 780        BLOGIC_CCB_ACTIVE = 1,
 781        BLOGIC_CCB_COMPLETE = 2,
 782        BLOGIC_CCB_RESET = 3
 783} PACKED;
 784
 785
 786/*
 787  Define the 32 Bit Mode Command Control Block (CCB) structure.  The first 40
 788  bytes are defined by and common to both the MultiMaster Firmware and the
 789  FlashPoint SCCB Manager.  The next 60 bytes are defined by the FlashPoint
 790  SCCB Manager.  The remaining components are defined by the Linux BusLogic
 791  Driver.  Extended LUN Format CCBs differ from Legacy LUN Format 32 Bit Mode
 792  CCBs only in having the TagEnable and QueueTag fields moved from byte 17 to
 793  byte 1, and the Logical Unit field in byte 17 expanded to 6 bits.  In theory,
 794  Extended LUN Format CCBs can support up to 64 Logical Units, but in practice
 795  many devices will respond improperly to Logical Units between 32 and 63, and
 796  the SCSI-2 specification defines Bit 5 as LUNTAR.  Extended LUN Format CCBs
 797  are used by recent versions of the MultiMaster Firmware, as well as by the
 798  FlashPoint SCCB Manager; the FlashPoint SCCB Manager only supports 32 Logical
 799  Units.  Since 64 Logical Units are unlikely to be needed in practice, and
 800  since they are problematic for the above reasons, and since limiting them to
 801  5 bits simplifies the CCB structure definition, this driver only supports
 802  32 Logical Units per Target Device.
 803*/
 804
 805struct blogic_ccb {
 806        /*
 807           MultiMaster Firmware and FlashPoint SCCB Manager Common Portion.
 808         */
 809        enum blogic_ccb_opcode opcode;                  /* Byte 0 */
 810        unsigned char:3;                                /* Byte 1 Bits 0-2 */
 811        enum blogic_datadir datadir:2;                  /* Byte 1 Bits 3-4 */
 812        bool tag_enable:1;                              /* Byte 1 Bit 5 */
 813        enum blogic_queuetag queuetag:2;                /* Byte 1 Bits 6-7 */
 814        unsigned char cdblen;                           /* Byte 2 */
 815        unsigned char sense_datalen;                    /* Byte 3 */
 816        u32 datalen;                                    /* Bytes 4-7 */
 817        void *data;                                     /* Bytes 8-11 */
 818        unsigned char:8;                                /* Byte 12 */
 819        unsigned char:8;                                /* Byte 13 */
 820        enum blogic_adapter_status adapter_status;      /* Byte 14 */
 821        enum blogic_tgt_status tgt_status;              /* Byte 15 */
 822        unsigned char tgt_id;                           /* Byte 16 */
 823        unsigned char lun:5;                            /* Byte 17 Bits 0-4 */
 824        bool legacytag_enable:1;                        /* Byte 17 Bit 5 */
 825        enum blogic_queuetag legacy_tag:2;              /* Byte 17 Bits 6-7 */
 826        unsigned char cdb[BLOGIC_CDB_MAXLEN];           /* Bytes 18-29 */
 827        unsigned char:8;                                /* Byte 30 */
 828        unsigned char:8;                                /* Byte 31 */
 829        u32 rsvd_int;                                   /* Bytes 32-35 */
 830        u32 sensedata;                                  /* Bytes 36-39 */
 831        /*
 832           FlashPoint SCCB Manager Defined Portion.
 833         */
 834        void (*callback) (struct blogic_ccb *);         /* Bytes 40-43 */
 835        u32 base_addr;                                  /* Bytes 44-47 */
 836        enum blogic_cmplt_code comp_code;               /* Byte 48 */
 837#ifdef CONFIG_SCSI_FLASHPOINT
 838        unsigned char:8;                                /* Byte 49 */
 839        u16 os_flags;                                   /* Bytes 50-51 */
 840        unsigned char private[24];                      /* Bytes 52-99 */
 841        void *rsvd1;
 842        void *rsvd2;
 843        unsigned char private2[16];
 844#endif
 845        /*
 846           BusLogic Linux Driver Defined Portion.
 847         */
 848        dma_addr_t allocgrp_head;
 849        unsigned int allocgrp_size;
 850        u32 dma_handle;
 851        enum blogic_ccb_status status;
 852        unsigned long serial;
 853        struct scsi_cmnd *command;
 854        struct blogic_adapter *adapter;
 855        struct blogic_ccb *next;
 856        struct blogic_ccb *next_all;
 857        struct blogic_sg_seg sglist[BLOGIC_SG_LIMIT];
 858};
 859
 860/*
 861  Define the 32 Bit Mode Outgoing Mailbox structure.
 862*/
 863
 864struct blogic_outbox {
 865        u32 ccb;                        /* Bytes 0-3 */
 866        u32:24;                         /* Bytes 4-6 */
 867        enum blogic_action action;      /* Byte 7 */
 868};
 869
 870/*
 871  Define the 32 Bit Mode Incoming Mailbox structure.
 872*/
 873
 874struct blogic_inbox {
 875        u32 ccb;                                        /* Bytes 0-3 */
 876        enum blogic_adapter_status adapter_status;      /* Byte 4 */
 877        enum blogic_tgt_status tgt_status;              /* Byte 5 */
 878        unsigned char:8;                                /* Byte 6 */
 879        enum blogic_cmplt_code comp_code;               /* Byte 7 */
 880};
 881
 882
 883/*
 884  Define the BusLogic Driver Options structure.
 885*/
 886
 887struct blogic_drvr_options {
 888        unsigned short tagq_ok;
 889        unsigned short tagq_ok_mask;
 890        unsigned short bus_settle_time;
 891        unsigned short stop_tgt_inquiry;
 892        unsigned char common_qdepth;
 893        unsigned char qdepth[BLOGIC_MAXDEV];
 894};
 895
 896/*
 897  Define the Host Adapter Target Flags structure.
 898*/
 899
 900struct blogic_tgt_flags {
 901        bool tgt_exists:1;
 902        bool tagq_ok:1;
 903        bool wide_ok:1;
 904        bool tagq_active:1;
 905        bool wide_active:1;
 906        bool cmd_good:1;
 907        bool tgt_info_in:1;
 908};
 909
 910/*
 911  Define the Host Adapter Target Statistics structure.
 912*/
 913
 914#define BLOGIC_SZ_BUCKETS                       10
 915
 916struct blogic_tgt_stats {
 917        unsigned int cmds_tried;
 918        unsigned int cmds_complete;
 919        unsigned int read_cmds;
 920        unsigned int write_cmds;
 921        struct blogic_byte_count bytesread;
 922        struct blogic_byte_count byteswritten;
 923        unsigned int read_sz_buckets[BLOGIC_SZ_BUCKETS];
 924        unsigned int write_sz_buckets[BLOGIC_SZ_BUCKETS];
 925        unsigned short aborts_request;
 926        unsigned short aborts_tried;
 927        unsigned short aborts_done;
 928        unsigned short bdr_request;
 929        unsigned short bdr_tried;
 930        unsigned short bdr_done;
 931        unsigned short adapter_reset_req;
 932        unsigned short adapter_reset_attempt;
 933        unsigned short adapter_reset_done;
 934};
 935
 936/*
 937  Define the FlashPoint Card Handle data type.
 938*/
 939
 940#define FPOINT_BADCARD_HANDLE           0xFFFFFFFFL
 941
 942
 943/*
 944  Define the FlashPoint Information structure.  This structure is defined
 945  by the FlashPoint SCCB Manager.
 946*/
 947
 948struct fpoint_info {
 949        u32 base_addr;                          /* Bytes 0-3 */
 950        bool present;                           /* Byte 4 */
 951        unsigned char irq_ch;                   /* Byte 5 */
 952        unsigned char scsi_id;                  /* Byte 6 */
 953        unsigned char scsi_lun;                 /* Byte 7 */
 954        u16 fw_rev;                             /* Bytes 8-9 */
 955        u16 sync_ok;                            /* Bytes 10-11 */
 956        u16 fast_ok;                            /* Bytes 12-13 */
 957        u16 ultra_ok;                           /* Bytes 14-15 */
 958        u16 discon_ok;                          /* Bytes 16-17 */
 959        u16 wide_ok;                            /* Bytes 18-19 */
 960        bool parity:1;                          /* Byte 20 Bit 0 */
 961        bool wide:1;                            /* Byte 20 Bit 1 */
 962        bool softreset:1;                       /* Byte 20 Bit 2 */
 963        bool ext_trans_enable:1;                /* Byte 20 Bit 3 */
 964        bool low_term:1;                        /* Byte 20 Bit 4 */
 965        bool high_term:1;                       /* Byte 20 Bit 5 */
 966        bool report_underrun:1;                 /* Byte 20 Bit 6 */
 967        bool scam_enabled:1;                    /* Byte 20 Bit 7 */
 968        bool scam_lev2:1;                       /* Byte 21 Bit 0 */
 969        unsigned char:7;                        /* Byte 21 Bits 1-7 */
 970        unsigned char family;                   /* Byte 22 */
 971        unsigned char bus_type;                 /* Byte 23 */
 972        unsigned char model[3];                 /* Bytes 24-26 */
 973        unsigned char relative_cardnum;         /* Byte 27 */
 974        unsigned char rsvd[4];                  /* Bytes 28-31 */
 975        u32 os_rsvd;                            /* Bytes 32-35 */
 976        unsigned char translation_info[4];      /* Bytes 36-39 */
 977        u32 rsvd2[5];                           /* Bytes 40-59 */
 978        u32 sec_range;                          /* Bytes 60-63 */
 979};
 980
 981/*
 982  Define the BusLogic Driver Host Adapter structure.
 983*/
 984
 985struct blogic_adapter {
 986        struct Scsi_Host *scsi_host;
 987        struct pci_dev *pci_device;
 988        enum blogic_adapter_type adapter_type;
 989        enum blogic_adapter_bus_type adapter_bus_type;
 990        unsigned long io_addr;
 991        unsigned long pci_addr;
 992        unsigned short addr_count;
 993        unsigned char host_no;
 994        unsigned char model[9];
 995        unsigned char fw_ver[6];
 996        unsigned char full_model[18];
 997        unsigned char bus;
 998        unsigned char dev;
 999        unsigned char irq_ch;
1000        unsigned char dma_ch;
1001        unsigned char scsi_id;
1002        bool irq_acquired:1;
1003        bool dma_chan_acquired:1;
1004        bool ext_trans_enable:1;
1005        bool parity:1;
1006        bool reset_enabled:1;
1007        bool level_int:1;
1008        bool wide:1;
1009        bool differential:1;
1010        bool scam:1;
1011        bool ultra:1;
1012        bool ext_lun:1;
1013        bool terminfo_valid:1;
1014        bool low_term:1;
1015        bool high_term:1;
1016        bool need_bouncebuf:1;
1017        bool strict_rr:1;
1018        bool scam_enabled:1;
1019        bool scam_lev2:1;
1020        bool adapter_initd:1;
1021        bool adapter_extreset:1;
1022        bool adapter_intern_err:1;
1023        bool processing_ccbs;
1024        volatile bool adapter_cmd_complete;
1025        unsigned short adapter_sglimit;
1026        unsigned short drvr_sglimit;
1027        unsigned short maxdev;
1028        unsigned short maxlun;
1029        unsigned short mbox_count;
1030        unsigned short initccbs;
1031        unsigned short inc_ccbs;
1032        unsigned short alloc_ccbs;
1033        unsigned short drvr_qdepth;
1034        unsigned short adapter_qdepth;
1035        unsigned short untag_qdepth;
1036        unsigned short common_qdepth;
1037        unsigned short bus_settle_time;
1038        unsigned short sync_ok;
1039        unsigned short fast_ok;
1040        unsigned short ultra_ok;
1041        unsigned short wide_ok;
1042        unsigned short discon_ok;
1043        unsigned short tagq_ok;
1044        unsigned short ext_resets;
1045        unsigned short adapter_intern_errors;
1046        unsigned short tgt_count;
1047        unsigned short msgbuflen;
1048        u32 bios_addr;
1049        struct blogic_drvr_options *drvr_opts;
1050        struct fpoint_info fpinfo;
1051        void *cardhandle;
1052        struct list_head host_list;
1053        struct blogic_ccb *all_ccbs;
1054        struct blogic_ccb *free_ccbs;
1055        struct blogic_ccb *firstccb;
1056        struct blogic_ccb *lastccb;
1057        struct blogic_ccb *bdr_pend[BLOGIC_MAXDEV];
1058        struct blogic_tgt_flags tgt_flags[BLOGIC_MAXDEV];
1059        unsigned char qdepth[BLOGIC_MAXDEV];
1060        unsigned char sync_period[BLOGIC_MAXDEV];
1061        unsigned char sync_offset[BLOGIC_MAXDEV];
1062        unsigned char active_cmds[BLOGIC_MAXDEV];
1063        unsigned int cmds_since_rst[BLOGIC_MAXDEV];
1064        unsigned long last_seqpoint[BLOGIC_MAXDEV];
1065        unsigned long last_resettried[BLOGIC_MAXDEV];
1066        unsigned long last_resetdone[BLOGIC_MAXDEV];
1067        struct blogic_outbox *first_outbox;
1068        struct blogic_outbox *last_outbox;
1069        struct blogic_outbox *next_outbox;
1070        struct blogic_inbox *first_inbox;
1071        struct blogic_inbox *last_inbox;
1072        struct blogic_inbox *next_inbox;
1073        struct blogic_tgt_stats tgt_stats[BLOGIC_MAXDEV];
1074        unsigned char *mbox_space;
1075        dma_addr_t mbox_space_handle;
1076        unsigned int mbox_sz;
1077        unsigned long ccb_offset;
1078        char msgbuf[BLOGIC_MSGBUF_SIZE];
1079};
1080
1081/*
1082  Define a structure for the BIOS Disk Parameters.
1083*/
1084
1085struct bios_diskparam {
1086        int heads;
1087        int sectors;
1088        int cylinders;
1089};
1090
1091/*
1092  Define a structure for the SCSI Inquiry command results.
1093*/
1094
1095struct scsi_inquiry {
1096        unsigned char devtype:5;        /* Byte 0 Bits 0-4 */
1097        unsigned char dev_qual:3;       /* Byte 0 Bits 5-7 */
1098        unsigned char dev_modifier:7;   /* Byte 1 Bits 0-6 */
1099        bool rmb:1;                     /* Byte 1 Bit 7 */
1100        unsigned char ansi_ver:3;       /* Byte 2 Bits 0-2 */
1101        unsigned char ecma_ver:3;       /* Byte 2 Bits 3-5 */
1102        unsigned char iso_ver:2;        /* Byte 2 Bits 6-7 */
1103        unsigned char resp_fmt:4;       /* Byte 3 Bits 0-3 */
1104        unsigned char:2;                /* Byte 3 Bits 4-5 */
1105        bool TrmIOP:1;                  /* Byte 3 Bit 6 */
1106        bool AENC:1;                    /* Byte 3 Bit 7 */
1107        unsigned char addl_len;         /* Byte 4 */
1108        unsigned char:8;                /* Byte 5 */
1109        unsigned char:8;                /* Byte 6 */
1110        bool SftRe:1;                   /* Byte 7 Bit 0 */
1111        bool CmdQue:1;                  /* Byte 7 Bit 1 */
1112        bool:1;                         /* Byte 7 Bit 2 */
1113        bool linked:1;                  /* Byte 7 Bit 3 */
1114        bool sync:1;                    /* Byte 7 Bit 4 */
1115        bool WBus16:1;                  /* Byte 7 Bit 5 */
1116        bool WBus32:1;                  /* Byte 7 Bit 6 */
1117        bool RelAdr:1;                  /* Byte 7 Bit 7 */
1118        unsigned char vendor[8];        /* Bytes 8-15 */
1119        unsigned char product[16];      /* Bytes 16-31 */
1120        unsigned char product_rev[4];   /* Bytes 32-35 */
1121};
1122
1123
1124/*
1125  Define functions to provide an abstraction for reading and writing the
1126  Host Adapter I/O Registers.
1127*/
1128
1129static inline void blogic_busreset(struct blogic_adapter *adapter)
1130{
1131        union blogic_cntrl_reg cr;
1132        cr.all = 0;
1133        cr.cr.bus_reset = true;
1134        outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG);
1135}
1136
1137static inline void blogic_intreset(struct blogic_adapter *adapter)
1138{
1139        union blogic_cntrl_reg cr;
1140        cr.all = 0;
1141        cr.cr.int_reset = true;
1142        outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG);
1143}
1144
1145static inline void blogic_softreset(struct blogic_adapter *adapter)
1146{
1147        union blogic_cntrl_reg cr;
1148        cr.all = 0;
1149        cr.cr.soft_reset = true;
1150        outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG);
1151}
1152
1153static inline void blogic_hardreset(struct blogic_adapter *adapter)
1154{
1155        union blogic_cntrl_reg cr;
1156        cr.all = 0;
1157        cr.cr.hard_reset = true;
1158        outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG);
1159}
1160
1161static inline unsigned char blogic_rdstatus(struct blogic_adapter *adapter)
1162{
1163        return inb(adapter->io_addr + BLOGIC_STATUS_REG);
1164}
1165
1166static inline void blogic_setcmdparam(struct blogic_adapter *adapter,
1167                                        unsigned char value)
1168{
1169        outb(value, adapter->io_addr + BLOGIC_CMD_PARM_REG);
1170}
1171
1172static inline unsigned char blogic_rddatain(struct blogic_adapter *adapter)
1173{
1174        return inb(adapter->io_addr + BLOGIC_DATAIN_REG);
1175}
1176
1177static inline unsigned char blogic_rdint(struct blogic_adapter *adapter)
1178{
1179        return inb(adapter->io_addr + BLOGIC_INT_REG);
1180}
1181
1182static inline unsigned char blogic_rdgeom(struct blogic_adapter *adapter)
1183{
1184        return inb(adapter->io_addr + BLOGIC_GEOMETRY_REG);
1185}
1186
1187/*
1188  blogic_execmbox issues an Execute Mailbox Command, which
1189  notifies the Host Adapter that an entry has been made in an Outgoing
1190  Mailbox.
1191*/
1192
1193static inline void blogic_execmbox(struct blogic_adapter *adapter)
1194{
1195        blogic_setcmdparam(adapter, BLOGIC_EXEC_MBOX_CMD);
1196}
1197
1198/*
1199  blogic_delay waits for Seconds to elapse.
1200*/
1201
1202static inline void blogic_delay(int seconds)
1203{
1204        mdelay(1000 * seconds);
1205}
1206
1207/*
1208  virt_to_32bit_virt maps between Kernel Virtual Addresses and
1209  32 bit Kernel Virtual Addresses.  This avoids compilation warnings
1210  on 64 bit architectures.
1211*/
1212
1213static inline u32 virt_to_32bit_virt(void *virt_addr)
1214{
1215        return (u32) (unsigned long) virt_addr;
1216}
1217
1218/*
1219  blogic_inc_count increments counter by 1, stopping at
1220  65535 rather than wrapping around to 0.
1221*/
1222
1223static inline void blogic_inc_count(unsigned short *count)
1224{
1225        if (*count < 65535)
1226                (*count)++;
1227}
1228
1229/*
1230  blogic_addcount increments Byte Counter by Amount.
1231*/
1232
1233static inline void blogic_addcount(struct blogic_byte_count *bytecount,
1234                                        unsigned int amount)
1235{
1236        bytecount->units += amount;
1237        if (bytecount->units > 999999999) {
1238                bytecount->units -= 1000000000;
1239                bytecount->billions++;
1240        }
1241}
1242
1243/*
1244  blogic_incszbucket increments the Bucket for Amount.
1245*/
1246
1247static inline void blogic_incszbucket(unsigned int *cmdsz_buckets,
1248                                        unsigned int amount)
1249{
1250        int index = 0;
1251        if (amount < 8 * 1024) {
1252                if (amount < 2 * 1024)
1253                        index = (amount < 1 * 1024 ? 0 : 1);
1254                else
1255                        index = (amount < 4 * 1024 ? 2 : 3);
1256        } else if (amount < 128 * 1024) {
1257                if (amount < 32 * 1024)
1258                        index = (amount < 16 * 1024 ? 4 : 5);
1259                else
1260                        index = (amount < 64 * 1024 ? 6 : 7);
1261        } else
1262                index = (amount < 256 * 1024 ? 8 : 9);
1263        cmdsz_buckets[index]++;
1264}
1265
1266/*
1267  Define the version number of the FlashPoint Firmware (SCCB Manager).
1268*/
1269
1270#define FLASHPOINT_FW_VER               "5.02"
1271
1272/*
1273  Define the possible return values from FlashPoint_HandleInterrupt.
1274*/
1275
1276#define FPOINT_NORMAL_INT               0x00
1277#define FPOINT_INTERN_ERR               0xFE
1278#define FPOINT_EXT_RESET                0xFF
1279
1280/*
1281  Define prototypes for the forward referenced BusLogic Driver
1282  Internal Functions.
1283*/
1284
1285static const char *blogic_drvr_info(struct Scsi_Host *);
1286static int blogic_qcmd(struct Scsi_Host *h, struct scsi_cmnd *);
1287static int blogic_diskparam(struct scsi_device *, struct block_device *, sector_t, int *);
1288static int blogic_slaveconfig(struct scsi_device *);
1289static void blogic_qcompleted_ccb(struct blogic_ccb *);
1290static irqreturn_t blogic_inthandler(int, void *);
1291static int blogic_resetadapter(struct blogic_adapter *, bool hard_reset);
1292static void blogic_msg(enum blogic_msglevel, char *, struct blogic_adapter *, ...);
1293static int __init blogic_setup(char *);
1294
1295#endif                          /* _BUSLOGIC_H */
1296