Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003 
0004   Linux Driver for BusLogic MultiMaster and FlashPoint SCSI Host Adapters
0005 
0006   Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com>
0007 
0008 
0009   The author respectfully requests that any modifications to this software be
0010   sent directly to him for evaluation and testing.
0011 
0012   Special thanks to Wayne Yen, Jin-Lon Hon, and Alex Win of BusLogic, whose
0013   advice has been invaluable, to David Gentzel, for writing the original Linux
0014   BusLogic driver, and to Paul Gortmaker, for being such a dedicated test site.
0015 
0016   Finally, special thanks to Mylex/BusLogic for making the FlashPoint SCCB
0017   Manager available as freely redistributable source code.
0018 
0019 */
0020 
0021 #ifndef _BUSLOGIC_H
0022 #define _BUSLOGIC_H
0023 
0024 
0025 #ifndef PACKED
0026 #define PACKED __attribute__((packed))
0027 #endif
0028 
0029 /*
0030   Define the maximum number of BusLogic Host Adapters supported by this driver.
0031 */
0032 
0033 #define BLOGIC_MAX_ADAPTERS     16
0034 
0035 
0036 /*
0037   Define the maximum number of Target Devices supported by this driver.
0038 */
0039 
0040 #define BLOGIC_MAXDEV           16
0041 
0042 
0043 /*
0044   Define the maximum number of Scatter/Gather Segments used by this driver.
0045   For optimal performance, it is important that this limit be at least as
0046   large as the largest single request generated by the I/O Subsystem.
0047 */
0048 
0049 #define BLOGIC_SG_LIMIT     128
0050 
0051 
0052 /*
0053   Define the maximum, maximum automatic, minimum automatic, and default Queue
0054   Depth to allow for Target Devices depending on whether or not they support
0055   Tagged Queuing and whether or not ISA Bounce Buffers are required.
0056 */
0057 
0058 #define BLOGIC_MAX_TAG_DEPTH        64
0059 #define BLOGIC_MAX_AUTO_TAG_DEPTH   28
0060 #define BLOGIC_MIN_AUTO_TAG_DEPTH   7
0061 #define BLOGIC_TAG_DEPTH_BB     3
0062 #define BLOGIC_UNTAG_DEPTH      3
0063 #define BLOGIC_UNTAG_DEPTH_BB       2
0064 
0065 
0066 /*
0067   Define the default amount of time in seconds to wait between a Host Adapter
0068   Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI commands.
0069   Some SCSI devices get confused if they receive SCSI commands too soon after
0070   a SCSI Bus Reset.
0071 */
0072 
0073 #define BLOGIC_BUS_SETTLE_TIME      2
0074 
0075 
0076 /*
0077   Define the maximum number of Mailboxes that should be used for MultiMaster
0078   Host Adapters.  This number is chosen to be larger than the maximum Host
0079   Adapter Queue Depth and small enough so that the Host Adapter structure
0080   does not cross an allocation block size boundary.
0081 */
0082 
0083 #define BLOGIC_MAX_MAILBOX      211
0084 
0085 
0086 /*
0087   Define the number of CCBs that should be allocated as a group to optimize
0088   Kernel memory allocation.
0089 */
0090 
0091 #define BLOGIC_CCB_GRP_ALLOCSIZE    7
0092 
0093 
0094 /*
0095   Define the Host Adapter Line and Message Buffer Sizes.
0096 */
0097 
0098 #define BLOGIC_LINEBUF_SIZE     100
0099 #define BLOGIC_MSGBUF_SIZE      9700
0100 
0101 
0102 /*
0103   Define the Driver Message Levels.
0104 */
0105 
0106 enum blogic_msglevel {
0107     BLOGIC_ANNOUNCE_LEVEL = 0,
0108     BLOGIC_INFO_LEVEL = 1,
0109     BLOGIC_NOTICE_LEVEL = 2,
0110     BLOGIC_WARN_LEVEL = 3,
0111     BLOGIC_ERR_LEVEL = 4
0112 };
0113 
0114 static char *blogic_msglevelmap[] = { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING, KERN_ERR };
0115 
0116 
0117 /*
0118   Define Driver Message macros.
0119 */
0120 
0121 #define blogic_announce(format, args...) \
0122     blogic_msg(BLOGIC_ANNOUNCE_LEVEL, format, ##args)
0123 
0124 #define blogic_info(format, args...) \
0125     blogic_msg(BLOGIC_INFO_LEVEL, format, ##args)
0126 
0127 #define blogic_notice(format, args...) \
0128     blogic_msg(BLOGIC_NOTICE_LEVEL, format, ##args)
0129 
0130 #define blogic_warn(format, args...) \
0131     blogic_msg(BLOGIC_WARN_LEVEL, format, ##args)
0132 
0133 #define blogic_err(format, args...) \
0134     blogic_msg(BLOGIC_ERR_LEVEL, format, ##args)
0135 
0136 
0137 /*
0138   Define the types of BusLogic Host Adapters that are supported and the number
0139   of I/O Addresses required by each type.
0140 */
0141 
0142 enum blogic_adapter_type {
0143     BLOGIC_MULTIMASTER = 1,
0144     BLOGIC_FLASHPOINT = 2
0145 } PACKED;
0146 
0147 #define BLOGIC_MULTIMASTER_ADDR_COUNT   4
0148 #define BLOGIC_FLASHPOINT_ADDR_COUNT    256
0149 
0150 static int blogic_adapter_addr_count[3] = { 0, BLOGIC_MULTIMASTER_ADDR_COUNT, BLOGIC_FLASHPOINT_ADDR_COUNT };
0151 
0152 
0153 /*
0154   Define macros for testing the Host Adapter Type.
0155 */
0156 
0157 #ifdef CONFIG_SCSI_FLASHPOINT
0158 
0159 #define blogic_multimaster_type(adapter) \
0160     (adapter->adapter_type == BLOGIC_MULTIMASTER)
0161 
0162 #define blogic_flashpoint_type(adapter) \
0163     (adapter->adapter_type == BLOGIC_FLASHPOINT)
0164 
0165 #else
0166 
0167 #define blogic_multimaster_type(adapter)    (true)
0168 #define blogic_flashpoint_type(adapter)     (false)
0169 
0170 #endif
0171 
0172 
0173 /*
0174   Define the possible Host Adapter Bus Types.
0175 */
0176 
0177 enum blogic_adapter_bus_type {
0178     BLOGIC_UNKNOWN_BUS = 0,
0179     BLOGIC_ISA_BUS = 1,
0180     BLOGIC_EISA_BUS = 2,
0181     BLOGIC_PCI_BUS = 3,
0182     BLOGIC_VESA_BUS = 4,
0183     BLOGIC_MCA_BUS = 5
0184 } PACKED;
0185 
0186 static char *blogic_adapter_busnames[] = { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" };
0187 
0188 static enum blogic_adapter_bus_type blogic_adater_bus_types[] = {
0189     BLOGIC_VESA_BUS,    /* BT-4xx */
0190     BLOGIC_ISA_BUS,     /* BT-5xx */
0191     BLOGIC_MCA_BUS,     /* BT-6xx */
0192     BLOGIC_EISA_BUS,    /* BT-7xx */
0193     BLOGIC_UNKNOWN_BUS, /* BT-8xx */
0194     BLOGIC_PCI_BUS      /* BT-9xx */
0195 };
0196 
0197 /*
0198   Define the possible Host Adapter BIOS Disk Geometry Translations.
0199 */
0200 
0201 enum blogic_bios_diskgeometry {
0202     BLOGIC_BIOS_NODISK = 0,
0203     BLOGIC_BIOS_DISK64x32 = 1,
0204     BLOGIC_BIOS_DISK128x32 = 2,
0205     BLOGIC_BIOS_DISK255x63 = 3
0206 } PACKED;
0207 
0208 
0209 /*
0210   Define a 10^18 Statistics Byte Counter data type.
0211 */
0212 
0213 struct blogic_byte_count {
0214     unsigned int units;
0215     unsigned int billions;
0216 };
0217 
0218 
0219 /*
0220   Define the structure for I/O Address and Bus Probing Information.
0221 */
0222 
0223 struct blogic_probeinfo {
0224     enum blogic_adapter_type adapter_type;
0225     enum blogic_adapter_bus_type adapter_bus_type;
0226     unsigned long io_addr;
0227     unsigned long pci_addr;
0228     struct pci_dev *pci_device;
0229     unsigned char bus;
0230     unsigned char dev;
0231     unsigned char irq_ch;
0232 };
0233 
0234 /*
0235   Define the Probe Options.
0236 */
0237 
0238 struct blogic_probe_options {
0239     bool noprobe:1;         /* Bit 0 */
0240     bool noprobe_pci:1;     /* Bit 2 */
0241     bool nosort_pci:1;      /* Bit 3 */
0242     bool multimaster_first:1;   /* Bit 4 */
0243     bool flashpoint_first:1;    /* Bit 5 */
0244 };
0245 
0246 /*
0247   Define the Global Options.
0248 */
0249 
0250 struct blogic_global_options {
0251     bool trace_probe:1; /* Bit 0 */
0252     bool trace_hw_reset:1;  /* Bit 1 */
0253     bool trace_config:1;    /* Bit 2 */
0254     bool trace_err:1;   /* Bit 3 */
0255 };
0256 
0257 /*
0258   Define the BusLogic SCSI Host Adapter I/O Register Offsets.
0259 */
0260 
0261 #define BLOGIC_CNTRL_REG    0   /* WO register */
0262 #define BLOGIC_STATUS_REG   0   /* RO register */
0263 #define BLOGIC_CMD_PARM_REG 1   /* WO register */
0264 #define BLOGIC_DATAIN_REG   1   /* RO register */
0265 #define BLOGIC_INT_REG      2   /* RO register */
0266 #define BLOGIC_GEOMETRY_REG 3   /* RO register */
0267 
0268 /*
0269   Define the structure of the write-only Control Register.
0270 */
0271 
0272 union blogic_cntrl_reg {
0273     unsigned char all;
0274     struct {
0275         unsigned char:4;    /* Bits 0-3 */
0276         bool bus_reset:1;   /* Bit 4 */
0277         bool int_reset:1;   /* Bit 5 */
0278         bool soft_reset:1;  /* Bit 6 */
0279         bool hard_reset:1;  /* Bit 7 */
0280     } cr;
0281 };
0282 
0283 /*
0284   Define the structure of the read-only Status Register.
0285 */
0286 
0287 union blogic_stat_reg {
0288     unsigned char all;
0289     struct {
0290         bool cmd_invalid:1; /* Bit 0 */
0291         bool rsvd:1;        /* Bit 1 */
0292         bool datain_ready:1;    /* Bit 2 */
0293         bool cmd_param_busy:1;  /* Bit 3 */
0294         bool adapter_ready:1;   /* Bit 4 */
0295         bool init_reqd:1;   /* Bit 5 */
0296         bool diag_failed:1; /* Bit 6 */
0297         bool diag_active:1; /* Bit 7 */
0298     } sr;
0299 };
0300 
0301 /*
0302   Define the structure of the read-only Interrupt Register.
0303 */
0304 
0305 union blogic_int_reg {
0306     unsigned char all;
0307     struct {
0308         bool mailin_loaded:1;   /* Bit 0 */
0309         bool mailout_avail:1;   /* Bit 1 */
0310         bool cmd_complete:1;    /* Bit 2 */
0311         bool ext_busreset:1;    /* Bit 3 */
0312         unsigned char rsvd:3;   /* Bits 4-6 */
0313         bool int_valid:1;   /* Bit 7 */
0314     } ir;
0315 };
0316 
0317 /*
0318   Define the structure of the read-only Geometry Register.
0319 */
0320 
0321 union blogic_geo_reg {
0322     unsigned char all;
0323     struct {
0324         enum blogic_bios_diskgeometry d0_geo:2; /* Bits 0-1 */
0325         enum blogic_bios_diskgeometry d1_geo:2; /* Bits 2-3 */
0326         unsigned char:3;    /* Bits 4-6 */
0327         bool ext_trans_enable:1;    /* Bit 7 */
0328     } gr;
0329 };
0330 
0331 /*
0332   Define the BusLogic SCSI Host Adapter Command Register Operation Codes.
0333 */
0334 
0335 enum blogic_opcode {
0336     BLOGIC_TEST_CMP_COMPLETE = 0x00,
0337     BLOGIC_INIT_MBOX = 0x01,
0338     BLOGIC_EXEC_MBOX_CMD = 0x02,
0339     BLOGIC_EXEC_BIOS_CMD = 0x03,
0340     BLOGIC_GET_BOARD_ID = 0x04,
0341     BLOGIC_ENABLE_OUTBOX_AVAIL_INT = 0x05,
0342     BLOGIC_SET_SELECT_TIMEOUT = 0x06,
0343     BLOGIC_SET_PREEMPT_TIME = 0x07,
0344     BLOGIC_SET_TIMEOFF_BUS = 0x08,
0345     BLOGIC_SET_TXRATE = 0x09,
0346     BLOGIC_INQ_DEV0TO7 = 0x0A,
0347     BLOGIC_INQ_CONFIG = 0x0B,
0348     BLOGIC_TGT_MODE = 0x0C,
0349     BLOGIC_INQ_SETUPINFO = 0x0D,
0350     BLOGIC_WRITE_LOCALRAM = 0x1A,
0351     BLOGIC_READ_LOCALRAM = 0x1B,
0352     BLOGIC_WRITE_BUSMASTER_FIFO = 0x1C,
0353     BLOGIC_READ_BUSMASTER_FIFO = 0x1D,
0354     BLOGIC_ECHO_CMDDATA = 0x1F,
0355     BLOGIC_ADAPTER_DIAG = 0x20,
0356     BLOGIC_SET_OPTIONS = 0x21,
0357     BLOGIC_INQ_DEV8TO15 = 0x23,
0358     BLOGIC_INQ_DEV = 0x24,
0359     BLOGIC_DISABLE_INT = 0x25,
0360     BLOGIC_INIT_EXT_MBOX = 0x81,
0361     BLOGIC_EXEC_SCS_CMD = 0x83,
0362     BLOGIC_INQ_FWVER_D3 = 0x84,
0363     BLOGIC_INQ_FWVER_LETTER = 0x85,
0364     BLOGIC_INQ_PCI_INFO = 0x86,
0365     BLOGIC_INQ_MODELNO = 0x8B,
0366     BLOGIC_INQ_SYNC_PERIOD = 0x8C,
0367     BLOGIC_INQ_EXTSETUP = 0x8D,
0368     BLOGIC_STRICT_RR = 0x8F,
0369     BLOGIC_STORE_LOCALRAM = 0x90,
0370     BLOGIC_FETCH_LOCALRAM = 0x91,
0371     BLOGIC_STORE_TO_EEPROM = 0x92,
0372     BLOGIC_LOAD_AUTOSCSICODE = 0x94,
0373     BLOGIC_MOD_IOADDR = 0x95,
0374     BLOGIC_SETCCB_FMT = 0x96,
0375     BLOGIC_WRITE_INQBUF = 0x9A,
0376     BLOGIC_READ_INQBUF = 0x9B,
0377     BLOGIC_FLASH_LOAD = 0xA7,
0378     BLOGIC_READ_SCAMDATA = 0xA8,
0379     BLOGIC_WRITE_SCAMDATA = 0xA9
0380 };
0381 
0382 /*
0383   Define the Inquire Board ID reply structure.
0384 */
0385 
0386 struct blogic_board_id {
0387     unsigned char type;     /* Byte 0 */
0388     unsigned char custom_features;  /* Byte 1 */
0389     unsigned char fw_ver_digit1;    /* Byte 2 */
0390     unsigned char fw_ver_digit2;    /* Byte 3 */
0391 };
0392 
0393 /*
0394   Define the Inquire Configuration reply structure.
0395 */
0396 
0397 struct blogic_config {
0398     unsigned char:5;    /* Byte 0 Bits 0-4 */
0399     bool dma_ch5:1;     /* Byte 0 Bit 5 */
0400     bool dma_ch6:1;     /* Byte 0 Bit 6 */
0401     bool dma_ch7:1;     /* Byte 0 Bit 7 */
0402     bool irq_ch9:1;     /* Byte 1 Bit 0 */
0403     bool irq_ch10:1;    /* Byte 1 Bit 1 */
0404     bool irq_ch11:1;    /* Byte 1 Bit 2 */
0405     bool irq_ch12:1;    /* Byte 1 Bit 3 */
0406     unsigned char:1;    /* Byte 1 Bit 4 */
0407     bool irq_ch14:1;    /* Byte 1 Bit 5 */
0408     bool irq_ch15:1;    /* Byte 1 Bit 6 */
0409     unsigned char:1;    /* Byte 1 Bit 7 */
0410     unsigned char id:4; /* Byte 2 Bits 0-3 */
0411     unsigned char:4;    /* Byte 2 Bits 4-7 */
0412 };
0413 
0414 /*
0415   Define the Inquire Setup Information reply structure.
0416 */
0417 
0418 struct blogic_syncval {
0419     unsigned char offset:4;     /* Bits 0-3 */
0420     unsigned char tx_period:3;  /* Bits 4-6 */
0421     bool sync:1;            /* Bit 7 */
0422 };
0423 
0424 struct blogic_setup_info {
0425     bool sync:1;                /* Byte 0 Bit 0 */
0426     bool parity:1;              /* Byte 0 Bit 1 */
0427     unsigned char:6;            /* Byte 0 Bits 2-7 */
0428     unsigned char tx_rate;          /* Byte 1 */
0429     unsigned char preempt_time;     /* Byte 2 */
0430     unsigned char timeoff_bus;      /* Byte 3 */
0431     unsigned char mbox_count;       /* Byte 4 */
0432     unsigned char mbox_addr[3];     /* Bytes 5-7 */
0433     struct blogic_syncval sync0to7[8];  /* Bytes 8-15 */
0434     unsigned char disconnect_ok0to7;    /* Byte 16 */
0435     unsigned char sig;          /* Byte 17 */
0436     unsigned char char_d;           /* Byte 18 */
0437     unsigned char bus_type;         /* Byte 19 */
0438     unsigned char wide_tx_ok0to7;       /* Byte 20 */
0439     unsigned char wide_tx_active0to7;   /* Byte 21 */
0440     struct blogic_syncval sync8to15[8]; /* Bytes 22-29 */
0441     unsigned char disconnect_ok8to15;   /* Byte 30 */
0442     unsigned char:8;            /* Byte 31 */
0443     unsigned char wide_tx_ok8to15;      /* Byte 32 */
0444     unsigned char wide_tx_active8to15;  /* Byte 33 */
0445 };
0446 
0447 /*
0448   Define the Initialize Extended Mailbox request structure.
0449 */
0450 
0451 struct blogic_extmbox_req {
0452     unsigned char mbox_count;   /* Byte 0 */
0453     u32 base_mbox_addr;     /* Bytes 1-4 */
0454 } PACKED;
0455 
0456 
0457 /*
0458   Define the Inquire PCI Host Adapter Information reply type.  The ISA
0459   Compatible I/O Port values are defined here and are also used with
0460   the Modify I/O Address command.
0461 */
0462 
0463 enum blogic_isa_ioport {
0464     BLOGIC_IO_330 = 0,
0465     BLOGIC_IO_334 = 1,
0466     BLOGIC_IO_230 = 2,
0467     BLOGIC_IO_234 = 3,
0468     BLOGIC_IO_130 = 4,
0469     BLOGIC_IO_134 = 5,
0470     BLOGIC_IO_DISABLE = 6,
0471     BLOGIC_IO_DISABLE2 = 7
0472 } PACKED;
0473 
0474 struct blogic_adapter_info {
0475     enum blogic_isa_ioport isa_port;    /* Byte 0 */
0476     unsigned char irq_ch;       /* Byte 1 */
0477     bool low_term:1;        /* Byte 2 Bit 0 */
0478     bool high_term:1;       /* Byte 2 Bit 1 */
0479     unsigned char:2;        /* Byte 2 Bits 2-3 */
0480     bool JP1:1;         /* Byte 2 Bit 4 */
0481     bool JP2:1;         /* Byte 2 Bit 5 */
0482     bool JP3:1;         /* Byte 2 Bit 6 */
0483     bool genericinfo_valid:1;   /* Byte 2 Bit 7 */
0484     unsigned char:8;        /* Byte 3 */
0485 };
0486 
0487 /*
0488   Define the Inquire Extended Setup Information reply structure.
0489 */
0490 
0491 struct blogic_ext_setup {
0492     unsigned char bus_type;     /* Byte 0 */
0493     unsigned char bios_addr;    /* Byte 1 */
0494     unsigned short sg_limit;    /* Bytes 2-3 */
0495     unsigned char mbox_count;   /* Byte 4 */
0496     u32 base_mbox_addr;     /* Bytes 5-8 */
0497     struct {
0498         unsigned char:2;    /* Byte 9 Bits 0-1 */
0499         bool fast_on_eisa:1;    /* Byte 9 Bit 2 */
0500         unsigned char:3;    /* Byte 9 Bits 3-5 */
0501         bool level_int:1;   /* Byte 9 Bit 6 */
0502         unsigned char:1;    /* Byte 9 Bit 7 */
0503     } misc;
0504     unsigned char fw_rev[3];    /* Bytes 10-12 */
0505     bool wide:1;            /* Byte 13 Bit 0 */
0506     bool differential:1;        /* Byte 13 Bit 1 */
0507     bool scam:1;            /* Byte 13 Bit 2 */
0508     bool ultra:1;           /* Byte 13 Bit 3 */
0509     bool smart_term:1;      /* Byte 13 Bit 4 */
0510     unsigned char:3;        /* Byte 13 Bits 5-7 */
0511 } PACKED;
0512 
0513 /*
0514   Define the Enable Strict Round Robin Mode request type.
0515 */
0516 
0517 enum blogic_rr_req {
0518     BLOGIC_AGGRESSIVE_RR = 0,
0519     BLOGIC_STRICT_RR_MODE = 1
0520 } PACKED;
0521 
0522 
0523 /*
0524   Define the Fetch Host Adapter Local RAM request type.
0525 */
0526 
0527 #define BLOGIC_BIOS_BASE        0
0528 #define BLOGIC_AUTOSCSI_BASE        64
0529 
0530 struct blogic_fetch_localram {
0531     unsigned char offset;   /* Byte 0 */
0532     unsigned char count;    /* Byte 1 */
0533 };
0534 
0535 /*
0536   Define the Host Adapter Local RAM AutoSCSI structure.
0537 */
0538 
0539 struct blogic_autoscsi {
0540     unsigned char factory_sig[2];       /* Bytes 0-1 */
0541     unsigned char info_bytes;       /* Byte 2 */
0542     unsigned char adapter_type[6];      /* Bytes 3-8 */
0543     unsigned char:8;            /* Byte 9 */
0544     bool floppy:1;              /* Byte 10 Bit 0 */
0545     bool floppy_sec:1;          /* Byte 10 Bit 1 */
0546     bool level_int:1;           /* Byte 10 Bit 2 */
0547     unsigned char:2;            /* Byte 10 Bits 3-4 */
0548     unsigned char systemram_bios:3;     /* Byte 10 Bits 5-7 */
0549     unsigned char dma_ch:7;         /* Byte 11 Bits 0-6 */
0550     bool dma_autoconf:1;            /* Byte 11 Bit 7 */
0551     unsigned char irq_ch:7;         /* Byte 12 Bits 0-6 */
0552     bool irq_autoconf:1;            /* Byte 12 Bit 7 */
0553     unsigned char dma_tx_rate;      /* Byte 13 */
0554     unsigned char scsi_id;          /* Byte 14 */
0555     bool low_term:1;            /* Byte 15 Bit 0 */
0556     bool parity:1;              /* Byte 15 Bit 1 */
0557     bool high_term:1;           /* Byte 15 Bit 2 */
0558     bool noisy_cable:1;         /* Byte 15 Bit 3 */
0559     bool fast_sync_neg:1;           /* Byte 15 Bit 4 */
0560     bool reset_enabled:1;           /* Byte 15 Bit 5 */
0561     bool:1;                 /* Byte 15 Bit 6 */
0562     bool active_negation:1;         /* Byte 15 Bit 7 */
0563     unsigned char bus_on_delay;     /* Byte 16 */
0564     unsigned char bus_off_delay;        /* Byte 17 */
0565     bool bios_enabled:1;            /* Byte 18 Bit 0 */
0566     bool int19_redir_enabled:1;     /* Byte 18 Bit 1 */
0567     bool ext_trans_enable:1;        /* Byte 18 Bit 2 */
0568     bool removable_as_fixed:1;      /* Byte 18 Bit 3 */
0569     bool:1;                 /* Byte 18 Bit 4 */
0570     bool morethan2_drives:1;        /* Byte 18 Bit 5 */
0571     bool bios_int:1;            /* Byte 18 Bit 6 */
0572     bool floptical:1;           /* Byte 19 Bit 7 */
0573     unsigned short dev_enabled;     /* Bytes 19-20 */
0574     unsigned short wide_ok;         /* Bytes 21-22 */
0575     unsigned short fast_ok;         /* Bytes 23-24 */
0576     unsigned short sync_ok;         /* Bytes 25-26 */
0577     unsigned short discon_ok;       /* Bytes 27-28 */
0578     unsigned short send_start_unit;     /* Bytes 29-30 */
0579     unsigned short ignore_bios_scan;    /* Bytes 31-32 */
0580     unsigned char pci_int_pin:2;        /* Byte 33 Bits 0-1 */
0581     unsigned char adapter_ioport:2;     /* Byte 33 Bits 2-3 */
0582     bool strict_rr_enabled:1;       /* Byte 33 Bit 4 */
0583     bool vesabus_33mhzplus:1;       /* Byte 33 Bit 5 */
0584     bool vesa_burst_write:1;        /* Byte 33 Bit 6 */
0585     bool vesa_burst_read:1;         /* Byte 33 Bit 7 */
0586     unsigned short ultra_ok;        /* Bytes 34-35 */
0587     unsigned int:32;            /* Bytes 36-39 */
0588     unsigned char:8;            /* Byte 40 */
0589     unsigned char autoscsi_maxlun;      /* Byte 41 */
0590     bool:1;                 /* Byte 42 Bit 0 */
0591     bool scam_dominant:1;           /* Byte 42 Bit 1 */
0592     bool scam_enabled:1;            /* Byte 42 Bit 2 */
0593     bool scam_lev2:1;           /* Byte 42 Bit 3 */
0594     unsigned char:4;            /* Byte 42 Bits 4-7 */
0595     bool int13_exten:1;         /* Byte 43 Bit 0 */
0596     bool:1;                 /* Byte 43 Bit 1 */
0597     bool cd_boot:1;             /* Byte 43 Bit 2 */
0598     unsigned char:5;            /* Byte 43 Bits 3-7 */
0599     unsigned char boot_id:4;        /* Byte 44 Bits 0-3 */
0600     unsigned char boot_ch:4;        /* Byte 44 Bits 4-7 */
0601     unsigned char force_scan_order:1;   /* Byte 45 Bit 0 */
0602     unsigned char:7;            /* Byte 45 Bits 1-7 */
0603     unsigned short nontagged_to_alt_ok; /* Bytes 46-47 */
0604     unsigned short reneg_sync_on_check; /* Bytes 48-49 */
0605     unsigned char rsvd[10];         /* Bytes 50-59 */
0606     unsigned char manuf_diag[2];        /* Bytes 60-61 */
0607     unsigned short cksum;           /* Bytes 62-63 */
0608 } PACKED;
0609 
0610 /*
0611   Define the Host Adapter Local RAM Auto SCSI Byte 45 structure.
0612 */
0613 
0614 struct blogic_autoscsi_byte45 {
0615     unsigned char force_scan_order:1;   /* Bit 0 */
0616     unsigned char:7;    /* Bits 1-7 */
0617 };
0618 
0619 /*
0620   Define the Host Adapter Local RAM BIOS Drive Map Byte structure.
0621 */
0622 
0623 #define BLOGIC_BIOS_DRVMAP      17
0624 
0625 struct blogic_bios_drvmap {
0626     unsigned char tgt_idbit3:1;         /* Bit 0 */
0627     unsigned char:2;                /* Bits 1-2 */
0628     enum blogic_bios_diskgeometry diskgeom:2;   /* Bits 3-4 */
0629     unsigned char tgt_id:3;             /* Bits 5-7 */
0630 };
0631 
0632 /*
0633   Define the Set CCB Format request type.  Extended LUN Format CCBs are
0634   necessary to support more than 8 Logical Units per Target Device.
0635 */
0636 
0637 enum blogic_setccb_fmt {
0638     BLOGIC_LEGACY_LUN_CCB = 0,
0639     BLOGIC_EXT_LUN_CCB = 1
0640 } PACKED;
0641 
0642 /*
0643   Define the Outgoing Mailbox Action Codes.
0644 */
0645 
0646 enum blogic_action {
0647     BLOGIC_OUTBOX_FREE = 0x00,
0648     BLOGIC_MBOX_START = 0x01,
0649     BLOGIC_MBOX_ABORT = 0x02
0650 } PACKED;
0651 
0652 
0653 /*
0654   Define the Incoming Mailbox Completion Codes.  The MultiMaster Firmware
0655   only uses codes 0 - 4.  The FlashPoint SCCB Manager has no mailboxes, so
0656   completion codes are stored in the CCB; it only uses codes 1, 2, 4, and 5.
0657 */
0658 
0659 enum blogic_cmplt_code {
0660     BLOGIC_INBOX_FREE = 0x00,
0661     BLOGIC_CMD_COMPLETE_GOOD = 0x01,
0662     BLOGIC_CMD_ABORT_BY_HOST = 0x02,
0663     BLOGIC_CMD_NOTFOUND = 0x03,
0664     BLOGIC_CMD_COMPLETE_ERROR = 0x04,
0665     BLOGIC_INVALID_CCB = 0x05
0666 } PACKED;
0667 
0668 /*
0669   Define the Command Control Block (CCB) Opcodes.
0670 */
0671 
0672 enum blogic_ccb_opcode {
0673     BLOGIC_INITIATOR_CCB = 0x00,
0674     BLOGIC_TGT_CCB = 0x01,
0675     BLOGIC_INITIATOR_CCB_SG = 0x02,
0676     BLOGIC_INITIATOR_CCBB_RESIDUAL = 0x03,
0677     BLOGIC_INITIATOR_CCB_SG_RESIDUAL = 0x04,
0678     BLOGIC_BDR = 0x81
0679 } PACKED;
0680 
0681 
0682 /*
0683   Define the CCB Data Direction Codes.
0684 */
0685 
0686 enum blogic_datadir {
0687     BLOGIC_UNCHECKED_TX = 0,
0688     BLOGIC_DATAIN_CHECKED = 1,
0689     BLOGIC_DATAOUT_CHECKED = 2,
0690     BLOGIC_NOTX = 3
0691 };
0692 
0693 
0694 /*
0695   Define the Host Adapter Status Codes.  The MultiMaster Firmware does not
0696   return status code 0x0C; it uses 0x12 for both overruns and underruns.
0697 */
0698 
0699 enum blogic_adapter_status {
0700     BLOGIC_CMD_CMPLT_NORMAL = 0x00,
0701     BLOGIC_LINK_CMD_CMPLT = 0x0A,
0702     BLOGIC_LINK_CMD_CMPLT_FLAG = 0x0B,
0703     BLOGIC_DATA_UNDERRUN = 0x0C,
0704     BLOGIC_SELECT_TIMEOUT = 0x11,
0705     BLOGIC_DATA_OVERRUN = 0x12,
0706     BLOGIC_NOEXPECT_BUSFREE = 0x13,
0707     BLOGIC_INVALID_BUSPHASE = 0x14,
0708     BLOGIC_INVALID_OUTBOX_CODE = 0x15,
0709     BLOGIC_INVALID_CMD_CODE = 0x16,
0710     BLOGIC_LINKCCB_BADLUN = 0x17,
0711     BLOGIC_BAD_CMD_PARAM = 0x1A,
0712     BLOGIC_AUTOREQSENSE_FAIL = 0x1B,
0713     BLOGIC_TAGQUEUE_REJECT = 0x1C,
0714     BLOGIC_BAD_MSG_RCVD = 0x1D,
0715     BLOGIC_HW_FAIL = 0x20,
0716     BLOGIC_NORESPONSE_TO_ATN = 0x21,
0717     BLOGIC_HW_RESET = 0x22,
0718     BLOGIC_RST_FROM_OTHERDEV = 0x23,
0719     BLOGIC_BAD_RECONNECT = 0x24,
0720     BLOGIC_HW_BDR = 0x25,
0721     BLOGIC_ABRT_QUEUE = 0x26,
0722     BLOGIC_ADAPTER_SW_ERROR = 0x27,
0723     BLOGIC_HW_TIMEOUT = 0x30,
0724     BLOGIC_PARITY_ERR = 0x34
0725 } PACKED;
0726 
0727 
0728 /*
0729   Define the SCSI Target Device Status Codes.
0730 */
0731 
0732 enum blogic_tgt_status {
0733     BLOGIC_OP_GOOD = 0x00,
0734     BLOGIC_CHECKCONDITION = 0x02,
0735     BLOGIC_DEVBUSY = 0x08
0736 } PACKED;
0737 
0738 /*
0739   Define the Queue Tag Codes.
0740 */
0741 
0742 enum blogic_queuetag {
0743     BLOGIC_SIMPLETAG = 0,
0744     BLOGIC_HEADTAG = 1,
0745     BLOGIC_ORDEREDTAG = 2,
0746     BLOGIC_RSVDTAG = 3
0747 };
0748 
0749 /*
0750   Define the SCSI Command Descriptor Block (CDB).
0751 */
0752 
0753 #define BLOGIC_CDB_MAXLEN           12
0754 
0755 
0756 /*
0757   Define the Scatter/Gather Segment structure required by the MultiMaster
0758   Firmware Interface and the FlashPoint SCCB Manager.
0759 */
0760 
0761 struct blogic_sg_seg {
0762     u32 segbytes;   /* Bytes 0-3 */
0763     u32 segdata;    /* Bytes 4-7 */
0764 };
0765 
0766 /*
0767   Define the Driver CCB Status Codes.
0768 */
0769 
0770 enum blogic_ccb_status {
0771     BLOGIC_CCB_FREE = 0,
0772     BLOGIC_CCB_ACTIVE = 1,
0773     BLOGIC_CCB_COMPLETE = 2,
0774     BLOGIC_CCB_RESET = 3
0775 } PACKED;
0776 
0777 
0778 /*
0779   Define the 32 Bit Mode Command Control Block (CCB) structure.  The first 40
0780   bytes are defined by and common to both the MultiMaster Firmware and the
0781   FlashPoint SCCB Manager.  The next 60 bytes are defined by the FlashPoint
0782   SCCB Manager.  The remaining components are defined by the Linux BusLogic
0783   Driver.  Extended LUN Format CCBs differ from Legacy LUN Format 32 Bit Mode
0784   CCBs only in having the TagEnable and QueueTag fields moved from byte 17 to
0785   byte 1, and the Logical Unit field in byte 17 expanded to 6 bits.  In theory,
0786   Extended LUN Format CCBs can support up to 64 Logical Units, but in practice
0787   many devices will respond improperly to Logical Units between 32 and 63, and
0788   the SCSI-2 specification defines Bit 5 as LUNTAR.  Extended LUN Format CCBs
0789   are used by recent versions of the MultiMaster Firmware, as well as by the
0790   FlashPoint SCCB Manager; the FlashPoint SCCB Manager only supports 32 Logical
0791   Units.  Since 64 Logical Units are unlikely to be needed in practice, and
0792   since they are problematic for the above reasons, and since limiting them to
0793   5 bits simplifies the CCB structure definition, this driver only supports
0794   32 Logical Units per Target Device.
0795 */
0796 
0797 struct blogic_ccb {
0798     /*
0799        MultiMaster Firmware and FlashPoint SCCB Manager Common Portion.
0800      */
0801     enum blogic_ccb_opcode opcode;          /* Byte 0 */
0802     unsigned char:3;                /* Byte 1 Bits 0-2 */
0803     enum blogic_datadir datadir:2;          /* Byte 1 Bits 3-4 */
0804     bool tag_enable:1;              /* Byte 1 Bit 5 */
0805     enum blogic_queuetag queuetag:2;        /* Byte 1 Bits 6-7 */
0806     unsigned char cdblen;               /* Byte 2 */
0807     unsigned char sense_datalen;            /* Byte 3 */
0808     u32 datalen;                    /* Bytes 4-7 */
0809     u32 data;                   /* Bytes 8-11 */
0810     unsigned char:8;                /* Byte 12 */
0811     unsigned char:8;                /* Byte 13 */
0812     enum blogic_adapter_status adapter_status;  /* Byte 14 */
0813     enum blogic_tgt_status tgt_status;      /* Byte 15 */
0814     unsigned char tgt_id;               /* Byte 16 */
0815     unsigned char lun:5;                /* Byte 17 Bits 0-4 */
0816     bool legacytag_enable:1;            /* Byte 17 Bit 5 */
0817     enum blogic_queuetag legacy_tag:2;      /* Byte 17 Bits 6-7 */
0818     unsigned char cdb[BLOGIC_CDB_MAXLEN];       /* Bytes 18-29 */
0819     unsigned char:8;                /* Byte 30 */
0820     unsigned char:8;                /* Byte 31 */
0821     u32 rsvd_int;                   /* Bytes 32-35 */
0822     u32 sensedata;                  /* Bytes 36-39 */
0823     /*
0824        FlashPoint SCCB Manager Defined Portion.
0825      */
0826     void (*callback) (struct blogic_ccb *);     /* Bytes 40-43 */
0827     u32 base_addr;                  /* Bytes 44-47 */
0828     enum blogic_cmplt_code comp_code;       /* Byte 48 */
0829 #ifdef CONFIG_SCSI_FLASHPOINT
0830     unsigned char:8;                /* Byte 49 */
0831     u16 os_flags;                   /* Bytes 50-51 */
0832     unsigned char private[24];          /* Bytes 52-99 */
0833     void *rsvd1;
0834     void *rsvd2;
0835     unsigned char private2[16];
0836 #endif
0837     /*
0838        BusLogic Linux Driver Defined Portion.
0839      */
0840     dma_addr_t allocgrp_head;
0841     unsigned int allocgrp_size;
0842     u32 dma_handle;
0843     enum blogic_ccb_status status;
0844     unsigned long serial;
0845     struct scsi_cmnd *command;
0846     struct blogic_adapter *adapter;
0847     struct blogic_ccb *next;
0848     struct blogic_ccb *next_all;
0849     struct blogic_sg_seg sglist[BLOGIC_SG_LIMIT];
0850 };
0851 
0852 /*
0853   Define the 32 Bit Mode Outgoing Mailbox structure.
0854 */
0855 
0856 struct blogic_outbox {
0857     u32 ccb;            /* Bytes 0-3 */
0858     u32:24;             /* Bytes 4-6 */
0859     enum blogic_action action;  /* Byte 7 */
0860 };
0861 
0862 /*
0863   Define the 32 Bit Mode Incoming Mailbox structure.
0864 */
0865 
0866 struct blogic_inbox {
0867     u32 ccb;                    /* Bytes 0-3 */
0868     enum blogic_adapter_status adapter_status;  /* Byte 4 */
0869     enum blogic_tgt_status tgt_status;      /* Byte 5 */
0870     unsigned char:8;                /* Byte 6 */
0871     enum blogic_cmplt_code comp_code;       /* Byte 7 */
0872 };
0873 
0874 
0875 /*
0876   Define the BusLogic Driver Options structure.
0877 */
0878 
0879 struct blogic_drvr_options {
0880     unsigned short tagq_ok;
0881     unsigned short tagq_ok_mask;
0882     unsigned short bus_settle_time;
0883     unsigned short stop_tgt_inquiry;
0884     unsigned char common_qdepth;
0885     unsigned char qdepth[BLOGIC_MAXDEV];
0886 };
0887 
0888 /*
0889   Define the Host Adapter Target Flags structure.
0890 */
0891 
0892 struct blogic_tgt_flags {
0893     bool tgt_exists:1;
0894     bool tagq_ok:1;
0895     bool wide_ok:1;
0896     bool tagq_active:1;
0897     bool wide_active:1;
0898     bool cmd_good:1;
0899     bool tgt_info_in:1;
0900 };
0901 
0902 /*
0903   Define the Host Adapter Target Statistics structure.
0904 */
0905 
0906 #define BLOGIC_SZ_BUCKETS           10
0907 
0908 struct blogic_tgt_stats {
0909     unsigned int cmds_tried;
0910     unsigned int cmds_complete;
0911     unsigned int read_cmds;
0912     unsigned int write_cmds;
0913     struct blogic_byte_count bytesread;
0914     struct blogic_byte_count byteswritten;
0915     unsigned int read_sz_buckets[BLOGIC_SZ_BUCKETS];
0916     unsigned int write_sz_buckets[BLOGIC_SZ_BUCKETS];
0917     unsigned short aborts_request;
0918     unsigned short aborts_tried;
0919     unsigned short aborts_done;
0920     unsigned short bdr_request;
0921     unsigned short bdr_tried;
0922     unsigned short bdr_done;
0923     unsigned short adapter_reset_req;
0924     unsigned short adapter_reset_attempt;
0925     unsigned short adapter_reset_done;
0926 };
0927 
0928 /*
0929   Define the FlashPoint Card Handle data type.
0930 */
0931 
0932 #define FPOINT_BADCARD_HANDLE       0xFFFFFFFFL
0933 
0934 
0935 /*
0936   Define the FlashPoint Information structure.  This structure is defined
0937   by the FlashPoint SCCB Manager.
0938 */
0939 
0940 struct fpoint_info {
0941     u32 base_addr;              /* Bytes 0-3 */
0942     bool present;               /* Byte 4 */
0943     unsigned char irq_ch;           /* Byte 5 */
0944     unsigned char scsi_id;          /* Byte 6 */
0945     unsigned char scsi_lun;         /* Byte 7 */
0946     u16 fw_rev;             /* Bytes 8-9 */
0947     u16 sync_ok;                /* Bytes 10-11 */
0948     u16 fast_ok;                /* Bytes 12-13 */
0949     u16 ultra_ok;               /* Bytes 14-15 */
0950     u16 discon_ok;              /* Bytes 16-17 */
0951     u16 wide_ok;                /* Bytes 18-19 */
0952     bool parity:1;              /* Byte 20 Bit 0 */
0953     bool wide:1;                /* Byte 20 Bit 1 */
0954     bool softreset:1;           /* Byte 20 Bit 2 */
0955     bool ext_trans_enable:1;        /* Byte 20 Bit 3 */
0956     bool low_term:1;            /* Byte 20 Bit 4 */
0957     bool high_term:1;           /* Byte 20 Bit 5 */
0958     bool report_underrun:1;         /* Byte 20 Bit 6 */
0959     bool scam_enabled:1;            /* Byte 20 Bit 7 */
0960     bool scam_lev2:1;           /* Byte 21 Bit 0 */
0961     unsigned char:7;            /* Byte 21 Bits 1-7 */
0962     unsigned char family;           /* Byte 22 */
0963     unsigned char bus_type;         /* Byte 23 */
0964     unsigned char model[3];         /* Bytes 24-26 */
0965     unsigned char relative_cardnum;     /* Byte 27 */
0966     unsigned char rsvd[4];          /* Bytes 28-31 */
0967     u32 os_rsvd;                /* Bytes 32-35 */
0968     unsigned char translation_info[4];  /* Bytes 36-39 */
0969     u32 rsvd2[5];               /* Bytes 40-59 */
0970     u32 sec_range;              /* Bytes 60-63 */
0971 };
0972 
0973 /*
0974   Define the BusLogic Driver Host Adapter structure.
0975 */
0976 
0977 struct blogic_adapter {
0978     struct Scsi_Host *scsi_host;
0979     struct pci_dev *pci_device;
0980     enum blogic_adapter_type adapter_type;
0981     enum blogic_adapter_bus_type adapter_bus_type;
0982     unsigned long io_addr;
0983     unsigned long pci_addr;
0984     unsigned short addr_count;
0985     unsigned char host_no;
0986     unsigned char model[9];
0987     unsigned char fw_ver[6];
0988     unsigned char full_model[18];
0989     unsigned char bus;
0990     unsigned char dev;
0991     unsigned char irq_ch;
0992     unsigned char scsi_id;
0993     bool irq_acquired:1;
0994     bool ext_trans_enable:1;
0995     bool parity:1;
0996     bool reset_enabled:1;
0997     bool level_int:1;
0998     bool wide:1;
0999     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 
1074 struct 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 
1084 struct 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 
1118 static 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 
1126 static 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 
1134 static 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 
1142 static 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 
1150 static inline unsigned char blogic_rdstatus(struct blogic_adapter *adapter)
1151 {
1152     return inb(adapter->io_addr + BLOGIC_STATUS_REG);
1153 }
1154 
1155 static 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 
1161 static inline unsigned char blogic_rddatain(struct blogic_adapter *adapter)
1162 {
1163     return inb(adapter->io_addr + BLOGIC_DATAIN_REG);
1164 }
1165 
1166 static inline unsigned char blogic_rdint(struct blogic_adapter *adapter)
1167 {
1168     return inb(adapter->io_addr + BLOGIC_INT_REG);
1169 }
1170 
1171 static 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 
1182 static 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 
1191 static 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 
1202 static 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 
1212 static 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 
1222 static 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 
1236 static 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 
1274 static const char *blogic_drvr_info(struct Scsi_Host *);
1275 static int blogic_qcmd(struct Scsi_Host *h, struct scsi_cmnd *);
1276 static int blogic_diskparam(struct scsi_device *, struct block_device *, sector_t, int *);
1277 static int blogic_slaveconfig(struct scsi_device *);
1278 static void blogic_qcompleted_ccb(struct blogic_ccb *);
1279 static irqreturn_t blogic_inthandler(int, void *);
1280 static int blogic_resetadapter(struct blogic_adapter *, bool hard_reset);
1281 static void blogic_msg(enum blogic_msglevel, char *, struct blogic_adapter *, ...);
1282 static int __init blogic_setup(char *);
1283 
1284 #endif              /* _BUSLOGIC_H */