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