162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci Linux Driver for BusLogic MultiMaster and FlashPoint SCSI Host Adapters 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci Copyright 1995-1998 by Leonard N. Zubkoff <lnz@dandelion.com> 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci The author respectfully requests that any modifications to this software be 1062306a36Sopenharmony_ci sent directly to him for evaluation and testing. 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci Special thanks to Wayne Yen, Jin-Lon Hon, and Alex Win of BusLogic, whose 1362306a36Sopenharmony_ci advice has been invaluable, to David Gentzel, for writing the original Linux 1462306a36Sopenharmony_ci BusLogic driver, and to Paul Gortmaker, for being such a dedicated test site. 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci Finally, special thanks to Mylex/BusLogic for making the FlashPoint SCCB 1762306a36Sopenharmony_ci Manager available as freely redistributable source code. 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci*/ 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#ifndef _BUSLOGIC_H 2262306a36Sopenharmony_ci#define _BUSLOGIC_H 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#ifndef PACKED 2662306a36Sopenharmony_ci#define PACKED __attribute__((packed)) 2762306a36Sopenharmony_ci#endif 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* 3062306a36Sopenharmony_ci Define the maximum number of BusLogic Host Adapters supported by this driver. 3162306a36Sopenharmony_ci*/ 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define BLOGIC_MAX_ADAPTERS 16 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* 3762306a36Sopenharmony_ci Define the maximum number of Target Devices supported by this driver. 3862306a36Sopenharmony_ci*/ 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define BLOGIC_MAXDEV 16 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* 4462306a36Sopenharmony_ci Define the maximum number of Scatter/Gather Segments used by this driver. 4562306a36Sopenharmony_ci For optimal performance, it is important that this limit be at least as 4662306a36Sopenharmony_ci large as the largest single request generated by the I/O Subsystem. 4762306a36Sopenharmony_ci*/ 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define BLOGIC_SG_LIMIT 128 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* 5362306a36Sopenharmony_ci Define the maximum, maximum automatic, minimum automatic, and default Queue 5462306a36Sopenharmony_ci Depth to allow for Target Devices depending on whether or not they support 5562306a36Sopenharmony_ci Tagged Queuing and whether or not ISA Bounce Buffers are required. 5662306a36Sopenharmony_ci*/ 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci#define BLOGIC_MAX_TAG_DEPTH 64 5962306a36Sopenharmony_ci#define BLOGIC_MAX_AUTO_TAG_DEPTH 28 6062306a36Sopenharmony_ci#define BLOGIC_MIN_AUTO_TAG_DEPTH 7 6162306a36Sopenharmony_ci#define BLOGIC_TAG_DEPTH_BB 3 6262306a36Sopenharmony_ci#define BLOGIC_UNTAG_DEPTH 3 6362306a36Sopenharmony_ci#define BLOGIC_UNTAG_DEPTH_BB 2 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* 6762306a36Sopenharmony_ci Define the default amount of time in seconds to wait between a Host Adapter 6862306a36Sopenharmony_ci Hard Reset which initiates a SCSI Bus Reset and issuing any SCSI commands. 6962306a36Sopenharmony_ci Some SCSI devices get confused if they receive SCSI commands too soon after 7062306a36Sopenharmony_ci a SCSI Bus Reset. 7162306a36Sopenharmony_ci*/ 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci#define BLOGIC_BUS_SETTLE_TIME 2 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* 7762306a36Sopenharmony_ci Define the maximum number of Mailboxes that should be used for MultiMaster 7862306a36Sopenharmony_ci Host Adapters. This number is chosen to be larger than the maximum Host 7962306a36Sopenharmony_ci Adapter Queue Depth and small enough so that the Host Adapter structure 8062306a36Sopenharmony_ci does not cross an allocation block size boundary. 8162306a36Sopenharmony_ci*/ 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define BLOGIC_MAX_MAILBOX 211 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/* 8762306a36Sopenharmony_ci Define the number of CCBs that should be allocated as a group to optimize 8862306a36Sopenharmony_ci Kernel memory allocation. 8962306a36Sopenharmony_ci*/ 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci#define BLOGIC_CCB_GRP_ALLOCSIZE 7 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci/* 9562306a36Sopenharmony_ci Define the Host Adapter Line and Message Buffer Sizes. 9662306a36Sopenharmony_ci*/ 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci#define BLOGIC_LINEBUF_SIZE 100 9962306a36Sopenharmony_ci#define BLOGIC_MSGBUF_SIZE 9700 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* 10362306a36Sopenharmony_ci Define the Driver Message Levels. 10462306a36Sopenharmony_ci*/ 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cienum blogic_msglevel { 10762306a36Sopenharmony_ci BLOGIC_ANNOUNCE_LEVEL = 0, 10862306a36Sopenharmony_ci BLOGIC_INFO_LEVEL = 1, 10962306a36Sopenharmony_ci BLOGIC_NOTICE_LEVEL = 2, 11062306a36Sopenharmony_ci BLOGIC_WARN_LEVEL = 3, 11162306a36Sopenharmony_ci BLOGIC_ERR_LEVEL = 4 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cistatic char *blogic_msglevelmap[] = { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE, KERN_WARNING, KERN_ERR }; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci/* 11862306a36Sopenharmony_ci Define Driver Message macros. 11962306a36Sopenharmony_ci*/ 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci#define blogic_announce(format, args...) \ 12262306a36Sopenharmony_ci blogic_msg(BLOGIC_ANNOUNCE_LEVEL, format, ##args) 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci#define blogic_info(format, args...) \ 12562306a36Sopenharmony_ci blogic_msg(BLOGIC_INFO_LEVEL, format, ##args) 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci#define blogic_notice(format, args...) \ 12862306a36Sopenharmony_ci blogic_msg(BLOGIC_NOTICE_LEVEL, format, ##args) 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#define blogic_warn(format, args...) \ 13162306a36Sopenharmony_ci blogic_msg(BLOGIC_WARN_LEVEL, format, ##args) 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci#define blogic_err(format, args...) \ 13462306a36Sopenharmony_ci blogic_msg(BLOGIC_ERR_LEVEL, format, ##args) 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci/* 13862306a36Sopenharmony_ci Define the types of BusLogic Host Adapters that are supported and the number 13962306a36Sopenharmony_ci of I/O Addresses required by each type. 14062306a36Sopenharmony_ci*/ 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_cienum blogic_adapter_type { 14362306a36Sopenharmony_ci BLOGIC_MULTIMASTER = 1, 14462306a36Sopenharmony_ci BLOGIC_FLASHPOINT = 2 14562306a36Sopenharmony_ci} PACKED; 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci#define BLOGIC_MULTIMASTER_ADDR_COUNT 4 14862306a36Sopenharmony_ci#define BLOGIC_FLASHPOINT_ADDR_COUNT 256 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_cistatic int blogic_adapter_addr_count[3] = { 0, BLOGIC_MULTIMASTER_ADDR_COUNT, BLOGIC_FLASHPOINT_ADDR_COUNT }; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci/* 15462306a36Sopenharmony_ci Define macros for testing the Host Adapter Type. 15562306a36Sopenharmony_ci*/ 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci#ifdef CONFIG_SCSI_FLASHPOINT 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci#define blogic_multimaster_type(adapter) \ 16062306a36Sopenharmony_ci (adapter->adapter_type == BLOGIC_MULTIMASTER) 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci#define blogic_flashpoint_type(adapter) \ 16362306a36Sopenharmony_ci (adapter->adapter_type == BLOGIC_FLASHPOINT) 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci#else 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci#define blogic_multimaster_type(adapter) (true) 16862306a36Sopenharmony_ci#define blogic_flashpoint_type(adapter) (false) 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci#endif 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci/* 17462306a36Sopenharmony_ci Define the possible Host Adapter Bus Types. 17562306a36Sopenharmony_ci*/ 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cienum blogic_adapter_bus_type { 17862306a36Sopenharmony_ci BLOGIC_UNKNOWN_BUS = 0, 17962306a36Sopenharmony_ci BLOGIC_ISA_BUS = 1, 18062306a36Sopenharmony_ci BLOGIC_EISA_BUS = 2, 18162306a36Sopenharmony_ci BLOGIC_PCI_BUS = 3, 18262306a36Sopenharmony_ci BLOGIC_VESA_BUS = 4, 18362306a36Sopenharmony_ci BLOGIC_MCA_BUS = 5 18462306a36Sopenharmony_ci} PACKED; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cistatic char *blogic_adapter_busnames[] = { "Unknown", "ISA", "EISA", "PCI", "VESA", "MCA" }; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistatic enum blogic_adapter_bus_type blogic_adater_bus_types[] = { 18962306a36Sopenharmony_ci BLOGIC_VESA_BUS, /* BT-4xx */ 19062306a36Sopenharmony_ci BLOGIC_ISA_BUS, /* BT-5xx */ 19162306a36Sopenharmony_ci BLOGIC_MCA_BUS, /* BT-6xx */ 19262306a36Sopenharmony_ci BLOGIC_EISA_BUS, /* BT-7xx */ 19362306a36Sopenharmony_ci BLOGIC_UNKNOWN_BUS, /* BT-8xx */ 19462306a36Sopenharmony_ci BLOGIC_PCI_BUS /* BT-9xx */ 19562306a36Sopenharmony_ci}; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci/* 19862306a36Sopenharmony_ci Define the possible Host Adapter BIOS Disk Geometry Translations. 19962306a36Sopenharmony_ci*/ 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cienum blogic_bios_diskgeometry { 20262306a36Sopenharmony_ci BLOGIC_BIOS_NODISK = 0, 20362306a36Sopenharmony_ci BLOGIC_BIOS_DISK64x32 = 1, 20462306a36Sopenharmony_ci BLOGIC_BIOS_DISK128x32 = 2, 20562306a36Sopenharmony_ci BLOGIC_BIOS_DISK255x63 = 3 20662306a36Sopenharmony_ci} PACKED; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci/* 21062306a36Sopenharmony_ci Define a 10^18 Statistics Byte Counter data type. 21162306a36Sopenharmony_ci*/ 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_cistruct blogic_byte_count { 21462306a36Sopenharmony_ci unsigned int units; 21562306a36Sopenharmony_ci unsigned int billions; 21662306a36Sopenharmony_ci}; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci/* 22062306a36Sopenharmony_ci Define the structure for I/O Address and Bus Probing Information. 22162306a36Sopenharmony_ci*/ 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cistruct blogic_probeinfo { 22462306a36Sopenharmony_ci enum blogic_adapter_type adapter_type; 22562306a36Sopenharmony_ci enum blogic_adapter_bus_type adapter_bus_type; 22662306a36Sopenharmony_ci unsigned long io_addr; 22762306a36Sopenharmony_ci unsigned long pci_addr; 22862306a36Sopenharmony_ci struct pci_dev *pci_device; 22962306a36Sopenharmony_ci unsigned char bus; 23062306a36Sopenharmony_ci unsigned char dev; 23162306a36Sopenharmony_ci unsigned char irq_ch; 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci/* 23562306a36Sopenharmony_ci Define the Probe Options. 23662306a36Sopenharmony_ci*/ 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistruct blogic_probe_options { 23962306a36Sopenharmony_ci bool noprobe:1; /* Bit 0 */ 24062306a36Sopenharmony_ci bool noprobe_pci:1; /* Bit 2 */ 24162306a36Sopenharmony_ci bool nosort_pci:1; /* Bit 3 */ 24262306a36Sopenharmony_ci bool multimaster_first:1; /* Bit 4 */ 24362306a36Sopenharmony_ci bool flashpoint_first:1; /* Bit 5 */ 24462306a36Sopenharmony_ci}; 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_ci/* 24762306a36Sopenharmony_ci Define the Global Options. 24862306a36Sopenharmony_ci*/ 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cistruct blogic_global_options { 25162306a36Sopenharmony_ci bool trace_probe:1; /* Bit 0 */ 25262306a36Sopenharmony_ci bool trace_hw_reset:1; /* Bit 1 */ 25362306a36Sopenharmony_ci bool trace_config:1; /* Bit 2 */ 25462306a36Sopenharmony_ci bool trace_err:1; /* Bit 3 */ 25562306a36Sopenharmony_ci}; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci/* 25862306a36Sopenharmony_ci Define the BusLogic SCSI Host Adapter I/O Register Offsets. 25962306a36Sopenharmony_ci*/ 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci#define BLOGIC_CNTRL_REG 0 /* WO register */ 26262306a36Sopenharmony_ci#define BLOGIC_STATUS_REG 0 /* RO register */ 26362306a36Sopenharmony_ci#define BLOGIC_CMD_PARM_REG 1 /* WO register */ 26462306a36Sopenharmony_ci#define BLOGIC_DATAIN_REG 1 /* RO register */ 26562306a36Sopenharmony_ci#define BLOGIC_INT_REG 2 /* RO register */ 26662306a36Sopenharmony_ci#define BLOGIC_GEOMETRY_REG 3 /* RO register */ 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci/* 26962306a36Sopenharmony_ci Define the structure of the write-only Control Register. 27062306a36Sopenharmony_ci*/ 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ciunion blogic_cntrl_reg { 27362306a36Sopenharmony_ci unsigned char all; 27462306a36Sopenharmony_ci struct { 27562306a36Sopenharmony_ci unsigned char:4; /* Bits 0-3 */ 27662306a36Sopenharmony_ci bool bus_reset:1; /* Bit 4 */ 27762306a36Sopenharmony_ci bool int_reset:1; /* Bit 5 */ 27862306a36Sopenharmony_ci bool soft_reset:1; /* Bit 6 */ 27962306a36Sopenharmony_ci bool hard_reset:1; /* Bit 7 */ 28062306a36Sopenharmony_ci } cr; 28162306a36Sopenharmony_ci}; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci/* 28462306a36Sopenharmony_ci Define the structure of the read-only Status Register. 28562306a36Sopenharmony_ci*/ 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ciunion blogic_stat_reg { 28862306a36Sopenharmony_ci unsigned char all; 28962306a36Sopenharmony_ci struct { 29062306a36Sopenharmony_ci bool cmd_invalid:1; /* Bit 0 */ 29162306a36Sopenharmony_ci bool rsvd:1; /* Bit 1 */ 29262306a36Sopenharmony_ci bool datain_ready:1; /* Bit 2 */ 29362306a36Sopenharmony_ci bool cmd_param_busy:1; /* Bit 3 */ 29462306a36Sopenharmony_ci bool adapter_ready:1; /* Bit 4 */ 29562306a36Sopenharmony_ci bool init_reqd:1; /* Bit 5 */ 29662306a36Sopenharmony_ci bool diag_failed:1; /* Bit 6 */ 29762306a36Sopenharmony_ci bool diag_active:1; /* Bit 7 */ 29862306a36Sopenharmony_ci } sr; 29962306a36Sopenharmony_ci}; 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci/* 30262306a36Sopenharmony_ci Define the structure of the read-only Interrupt Register. 30362306a36Sopenharmony_ci*/ 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ciunion blogic_int_reg { 30662306a36Sopenharmony_ci unsigned char all; 30762306a36Sopenharmony_ci struct { 30862306a36Sopenharmony_ci bool mailin_loaded:1; /* Bit 0 */ 30962306a36Sopenharmony_ci bool mailout_avail:1; /* Bit 1 */ 31062306a36Sopenharmony_ci bool cmd_complete:1; /* Bit 2 */ 31162306a36Sopenharmony_ci bool ext_busreset:1; /* Bit 3 */ 31262306a36Sopenharmony_ci unsigned char rsvd:3; /* Bits 4-6 */ 31362306a36Sopenharmony_ci bool int_valid:1; /* Bit 7 */ 31462306a36Sopenharmony_ci } ir; 31562306a36Sopenharmony_ci}; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci/* 31862306a36Sopenharmony_ci Define the structure of the read-only Geometry Register. 31962306a36Sopenharmony_ci*/ 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ciunion blogic_geo_reg { 32262306a36Sopenharmony_ci unsigned char all; 32362306a36Sopenharmony_ci struct { 32462306a36Sopenharmony_ci enum blogic_bios_diskgeometry d0_geo:2; /* Bits 0-1 */ 32562306a36Sopenharmony_ci enum blogic_bios_diskgeometry d1_geo:2; /* Bits 2-3 */ 32662306a36Sopenharmony_ci unsigned char:3; /* Bits 4-6 */ 32762306a36Sopenharmony_ci bool ext_trans_enable:1; /* Bit 7 */ 32862306a36Sopenharmony_ci } gr; 32962306a36Sopenharmony_ci}; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci/* 33262306a36Sopenharmony_ci Define the BusLogic SCSI Host Adapter Command Register Operation Codes. 33362306a36Sopenharmony_ci*/ 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_cienum blogic_opcode { 33662306a36Sopenharmony_ci BLOGIC_TEST_CMP_COMPLETE = 0x00, 33762306a36Sopenharmony_ci BLOGIC_INIT_MBOX = 0x01, 33862306a36Sopenharmony_ci BLOGIC_EXEC_MBOX_CMD = 0x02, 33962306a36Sopenharmony_ci BLOGIC_EXEC_BIOS_CMD = 0x03, 34062306a36Sopenharmony_ci BLOGIC_GET_BOARD_ID = 0x04, 34162306a36Sopenharmony_ci BLOGIC_ENABLE_OUTBOX_AVAIL_INT = 0x05, 34262306a36Sopenharmony_ci BLOGIC_SET_SELECT_TIMEOUT = 0x06, 34362306a36Sopenharmony_ci BLOGIC_SET_PREEMPT_TIME = 0x07, 34462306a36Sopenharmony_ci BLOGIC_SET_TIMEOFF_BUS = 0x08, 34562306a36Sopenharmony_ci BLOGIC_SET_TXRATE = 0x09, 34662306a36Sopenharmony_ci BLOGIC_INQ_DEV0TO7 = 0x0A, 34762306a36Sopenharmony_ci BLOGIC_INQ_CONFIG = 0x0B, 34862306a36Sopenharmony_ci BLOGIC_TGT_MODE = 0x0C, 34962306a36Sopenharmony_ci BLOGIC_INQ_SETUPINFO = 0x0D, 35062306a36Sopenharmony_ci BLOGIC_WRITE_LOCALRAM = 0x1A, 35162306a36Sopenharmony_ci BLOGIC_READ_LOCALRAM = 0x1B, 35262306a36Sopenharmony_ci BLOGIC_WRITE_BUSMASTER_FIFO = 0x1C, 35362306a36Sopenharmony_ci BLOGIC_READ_BUSMASTER_FIFO = 0x1D, 35462306a36Sopenharmony_ci BLOGIC_ECHO_CMDDATA = 0x1F, 35562306a36Sopenharmony_ci BLOGIC_ADAPTER_DIAG = 0x20, 35662306a36Sopenharmony_ci BLOGIC_SET_OPTIONS = 0x21, 35762306a36Sopenharmony_ci BLOGIC_INQ_DEV8TO15 = 0x23, 35862306a36Sopenharmony_ci BLOGIC_INQ_DEV = 0x24, 35962306a36Sopenharmony_ci BLOGIC_DISABLE_INT = 0x25, 36062306a36Sopenharmony_ci BLOGIC_INIT_EXT_MBOX = 0x81, 36162306a36Sopenharmony_ci BLOGIC_EXEC_SCS_CMD = 0x83, 36262306a36Sopenharmony_ci BLOGIC_INQ_FWVER_D3 = 0x84, 36362306a36Sopenharmony_ci BLOGIC_INQ_FWVER_LETTER = 0x85, 36462306a36Sopenharmony_ci BLOGIC_INQ_PCI_INFO = 0x86, 36562306a36Sopenharmony_ci BLOGIC_INQ_MODELNO = 0x8B, 36662306a36Sopenharmony_ci BLOGIC_INQ_SYNC_PERIOD = 0x8C, 36762306a36Sopenharmony_ci BLOGIC_INQ_EXTSETUP = 0x8D, 36862306a36Sopenharmony_ci BLOGIC_STRICT_RR = 0x8F, 36962306a36Sopenharmony_ci BLOGIC_STORE_LOCALRAM = 0x90, 37062306a36Sopenharmony_ci BLOGIC_FETCH_LOCALRAM = 0x91, 37162306a36Sopenharmony_ci BLOGIC_STORE_TO_EEPROM = 0x92, 37262306a36Sopenharmony_ci BLOGIC_LOAD_AUTOSCSICODE = 0x94, 37362306a36Sopenharmony_ci BLOGIC_MOD_IOADDR = 0x95, 37462306a36Sopenharmony_ci BLOGIC_SETCCB_FMT = 0x96, 37562306a36Sopenharmony_ci BLOGIC_WRITE_INQBUF = 0x9A, 37662306a36Sopenharmony_ci BLOGIC_READ_INQBUF = 0x9B, 37762306a36Sopenharmony_ci BLOGIC_FLASH_LOAD = 0xA7, 37862306a36Sopenharmony_ci BLOGIC_READ_SCAMDATA = 0xA8, 37962306a36Sopenharmony_ci BLOGIC_WRITE_SCAMDATA = 0xA9 38062306a36Sopenharmony_ci}; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci/* 38362306a36Sopenharmony_ci Define the Inquire Board ID reply structure. 38462306a36Sopenharmony_ci*/ 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cistruct blogic_board_id { 38762306a36Sopenharmony_ci unsigned char type; /* Byte 0 */ 38862306a36Sopenharmony_ci unsigned char custom_features; /* Byte 1 */ 38962306a36Sopenharmony_ci unsigned char fw_ver_digit1; /* Byte 2 */ 39062306a36Sopenharmony_ci unsigned char fw_ver_digit2; /* Byte 3 */ 39162306a36Sopenharmony_ci}; 39262306a36Sopenharmony_ci 39362306a36Sopenharmony_ci/* 39462306a36Sopenharmony_ci Define the Inquire Configuration reply structure. 39562306a36Sopenharmony_ci*/ 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_cistruct blogic_config { 39862306a36Sopenharmony_ci unsigned char:5; /* Byte 0 Bits 0-4 */ 39962306a36Sopenharmony_ci bool dma_ch5:1; /* Byte 0 Bit 5 */ 40062306a36Sopenharmony_ci bool dma_ch6:1; /* Byte 0 Bit 6 */ 40162306a36Sopenharmony_ci bool dma_ch7:1; /* Byte 0 Bit 7 */ 40262306a36Sopenharmony_ci bool irq_ch9:1; /* Byte 1 Bit 0 */ 40362306a36Sopenharmony_ci bool irq_ch10:1; /* Byte 1 Bit 1 */ 40462306a36Sopenharmony_ci bool irq_ch11:1; /* Byte 1 Bit 2 */ 40562306a36Sopenharmony_ci bool irq_ch12:1; /* Byte 1 Bit 3 */ 40662306a36Sopenharmony_ci unsigned char:1; /* Byte 1 Bit 4 */ 40762306a36Sopenharmony_ci bool irq_ch14:1; /* Byte 1 Bit 5 */ 40862306a36Sopenharmony_ci bool irq_ch15:1; /* Byte 1 Bit 6 */ 40962306a36Sopenharmony_ci unsigned char:1; /* Byte 1 Bit 7 */ 41062306a36Sopenharmony_ci unsigned char id:4; /* Byte 2 Bits 0-3 */ 41162306a36Sopenharmony_ci unsigned char:4; /* Byte 2 Bits 4-7 */ 41262306a36Sopenharmony_ci}; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci/* 41562306a36Sopenharmony_ci Define the Inquire Setup Information reply structure. 41662306a36Sopenharmony_ci*/ 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_cistruct blogic_syncval { 41962306a36Sopenharmony_ci unsigned char offset:4; /* Bits 0-3 */ 42062306a36Sopenharmony_ci unsigned char tx_period:3; /* Bits 4-6 */ 42162306a36Sopenharmony_ci bool sync:1; /* Bit 7 */ 42262306a36Sopenharmony_ci}; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_cistruct blogic_setup_info { 42562306a36Sopenharmony_ci bool sync:1; /* Byte 0 Bit 0 */ 42662306a36Sopenharmony_ci bool parity:1; /* Byte 0 Bit 1 */ 42762306a36Sopenharmony_ci unsigned char:6; /* Byte 0 Bits 2-7 */ 42862306a36Sopenharmony_ci unsigned char tx_rate; /* Byte 1 */ 42962306a36Sopenharmony_ci unsigned char preempt_time; /* Byte 2 */ 43062306a36Sopenharmony_ci unsigned char timeoff_bus; /* Byte 3 */ 43162306a36Sopenharmony_ci unsigned char mbox_count; /* Byte 4 */ 43262306a36Sopenharmony_ci unsigned char mbox_addr[3]; /* Bytes 5-7 */ 43362306a36Sopenharmony_ci struct blogic_syncval sync0to7[8]; /* Bytes 8-15 */ 43462306a36Sopenharmony_ci unsigned char disconnect_ok0to7; /* Byte 16 */ 43562306a36Sopenharmony_ci unsigned char sig; /* Byte 17 */ 43662306a36Sopenharmony_ci unsigned char char_d; /* Byte 18 */ 43762306a36Sopenharmony_ci unsigned char bus_type; /* Byte 19 */ 43862306a36Sopenharmony_ci unsigned char wide_tx_ok0to7; /* Byte 20 */ 43962306a36Sopenharmony_ci unsigned char wide_tx_active0to7; /* Byte 21 */ 44062306a36Sopenharmony_ci struct blogic_syncval sync8to15[8]; /* Bytes 22-29 */ 44162306a36Sopenharmony_ci unsigned char disconnect_ok8to15; /* Byte 30 */ 44262306a36Sopenharmony_ci unsigned char:8; /* Byte 31 */ 44362306a36Sopenharmony_ci unsigned char wide_tx_ok8to15; /* Byte 32 */ 44462306a36Sopenharmony_ci unsigned char wide_tx_active8to15; /* Byte 33 */ 44562306a36Sopenharmony_ci}; 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci/* 44862306a36Sopenharmony_ci Define the Initialize Extended Mailbox request structure. 44962306a36Sopenharmony_ci*/ 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_cistruct blogic_extmbox_req { 45262306a36Sopenharmony_ci unsigned char mbox_count; /* Byte 0 */ 45362306a36Sopenharmony_ci u32 base_mbox_addr; /* Bytes 1-4 */ 45462306a36Sopenharmony_ci} PACKED; 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci/* 45862306a36Sopenharmony_ci Define the Inquire PCI Host Adapter Information reply type. The ISA 45962306a36Sopenharmony_ci Compatible I/O Port values are defined here and are also used with 46062306a36Sopenharmony_ci the Modify I/O Address command. 46162306a36Sopenharmony_ci*/ 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_cienum blogic_isa_ioport { 46462306a36Sopenharmony_ci BLOGIC_IO_330 = 0, 46562306a36Sopenharmony_ci BLOGIC_IO_334 = 1, 46662306a36Sopenharmony_ci BLOGIC_IO_230 = 2, 46762306a36Sopenharmony_ci BLOGIC_IO_234 = 3, 46862306a36Sopenharmony_ci BLOGIC_IO_130 = 4, 46962306a36Sopenharmony_ci BLOGIC_IO_134 = 5, 47062306a36Sopenharmony_ci BLOGIC_IO_DISABLE = 6, 47162306a36Sopenharmony_ci BLOGIC_IO_DISABLE2 = 7 47262306a36Sopenharmony_ci} PACKED; 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_cistruct blogic_adapter_info { 47562306a36Sopenharmony_ci enum blogic_isa_ioport isa_port; /* Byte 0 */ 47662306a36Sopenharmony_ci unsigned char irq_ch; /* Byte 1 */ 47762306a36Sopenharmony_ci bool low_term:1; /* Byte 2 Bit 0 */ 47862306a36Sopenharmony_ci bool high_term:1; /* Byte 2 Bit 1 */ 47962306a36Sopenharmony_ci unsigned char:2; /* Byte 2 Bits 2-3 */ 48062306a36Sopenharmony_ci bool JP1:1; /* Byte 2 Bit 4 */ 48162306a36Sopenharmony_ci bool JP2:1; /* Byte 2 Bit 5 */ 48262306a36Sopenharmony_ci bool JP3:1; /* Byte 2 Bit 6 */ 48362306a36Sopenharmony_ci bool genericinfo_valid:1; /* Byte 2 Bit 7 */ 48462306a36Sopenharmony_ci unsigned char:8; /* Byte 3 */ 48562306a36Sopenharmony_ci}; 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci/* 48862306a36Sopenharmony_ci Define the Inquire Extended Setup Information reply structure. 48962306a36Sopenharmony_ci*/ 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_cistruct blogic_ext_setup { 49262306a36Sopenharmony_ci unsigned char bus_type; /* Byte 0 */ 49362306a36Sopenharmony_ci unsigned char bios_addr; /* Byte 1 */ 49462306a36Sopenharmony_ci unsigned short sg_limit; /* Bytes 2-3 */ 49562306a36Sopenharmony_ci unsigned char mbox_count; /* Byte 4 */ 49662306a36Sopenharmony_ci u32 base_mbox_addr; /* Bytes 5-8 */ 49762306a36Sopenharmony_ci struct { 49862306a36Sopenharmony_ci unsigned char:2; /* Byte 9 Bits 0-1 */ 49962306a36Sopenharmony_ci bool fast_on_eisa:1; /* Byte 9 Bit 2 */ 50062306a36Sopenharmony_ci unsigned char:3; /* Byte 9 Bits 3-5 */ 50162306a36Sopenharmony_ci bool level_int:1; /* Byte 9 Bit 6 */ 50262306a36Sopenharmony_ci unsigned char:1; /* Byte 9 Bit 7 */ 50362306a36Sopenharmony_ci } misc; 50462306a36Sopenharmony_ci unsigned char fw_rev[3]; /* Bytes 10-12 */ 50562306a36Sopenharmony_ci bool wide:1; /* Byte 13 Bit 0 */ 50662306a36Sopenharmony_ci bool differential:1; /* Byte 13 Bit 1 */ 50762306a36Sopenharmony_ci bool scam:1; /* Byte 13 Bit 2 */ 50862306a36Sopenharmony_ci bool ultra:1; /* Byte 13 Bit 3 */ 50962306a36Sopenharmony_ci bool smart_term:1; /* Byte 13 Bit 4 */ 51062306a36Sopenharmony_ci unsigned char:3; /* Byte 13 Bits 5-7 */ 51162306a36Sopenharmony_ci} PACKED; 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci/* 51462306a36Sopenharmony_ci Define the Enable Strict Round Robin Mode request type. 51562306a36Sopenharmony_ci*/ 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cienum blogic_rr_req { 51862306a36Sopenharmony_ci BLOGIC_AGGRESSIVE_RR = 0, 51962306a36Sopenharmony_ci BLOGIC_STRICT_RR_MODE = 1 52062306a36Sopenharmony_ci} PACKED; 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci/* 52462306a36Sopenharmony_ci Define the Fetch Host Adapter Local RAM request type. 52562306a36Sopenharmony_ci*/ 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci#define BLOGIC_BIOS_BASE 0 52862306a36Sopenharmony_ci#define BLOGIC_AUTOSCSI_BASE 64 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_cistruct blogic_fetch_localram { 53162306a36Sopenharmony_ci unsigned char offset; /* Byte 0 */ 53262306a36Sopenharmony_ci unsigned char count; /* Byte 1 */ 53362306a36Sopenharmony_ci}; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci/* 53662306a36Sopenharmony_ci Define the Host Adapter Local RAM AutoSCSI structure. 53762306a36Sopenharmony_ci*/ 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_cistruct blogic_autoscsi { 54062306a36Sopenharmony_ci unsigned char factory_sig[2]; /* Bytes 0-1 */ 54162306a36Sopenharmony_ci unsigned char info_bytes; /* Byte 2 */ 54262306a36Sopenharmony_ci unsigned char adapter_type[6]; /* Bytes 3-8 */ 54362306a36Sopenharmony_ci unsigned char:8; /* Byte 9 */ 54462306a36Sopenharmony_ci bool floppy:1; /* Byte 10 Bit 0 */ 54562306a36Sopenharmony_ci bool floppy_sec:1; /* Byte 10 Bit 1 */ 54662306a36Sopenharmony_ci bool level_int:1; /* Byte 10 Bit 2 */ 54762306a36Sopenharmony_ci unsigned char:2; /* Byte 10 Bits 3-4 */ 54862306a36Sopenharmony_ci unsigned char systemram_bios:3; /* Byte 10 Bits 5-7 */ 54962306a36Sopenharmony_ci unsigned char dma_ch:7; /* Byte 11 Bits 0-6 */ 55062306a36Sopenharmony_ci bool dma_autoconf:1; /* Byte 11 Bit 7 */ 55162306a36Sopenharmony_ci unsigned char irq_ch:7; /* Byte 12 Bits 0-6 */ 55262306a36Sopenharmony_ci bool irq_autoconf:1; /* Byte 12 Bit 7 */ 55362306a36Sopenharmony_ci unsigned char dma_tx_rate; /* Byte 13 */ 55462306a36Sopenharmony_ci unsigned char scsi_id; /* Byte 14 */ 55562306a36Sopenharmony_ci bool low_term:1; /* Byte 15 Bit 0 */ 55662306a36Sopenharmony_ci bool parity:1; /* Byte 15 Bit 1 */ 55762306a36Sopenharmony_ci bool high_term:1; /* Byte 15 Bit 2 */ 55862306a36Sopenharmony_ci bool noisy_cable:1; /* Byte 15 Bit 3 */ 55962306a36Sopenharmony_ci bool fast_sync_neg:1; /* Byte 15 Bit 4 */ 56062306a36Sopenharmony_ci bool reset_enabled:1; /* Byte 15 Bit 5 */ 56162306a36Sopenharmony_ci bool:1; /* Byte 15 Bit 6 */ 56262306a36Sopenharmony_ci bool active_negation:1; /* Byte 15 Bit 7 */ 56362306a36Sopenharmony_ci unsigned char bus_on_delay; /* Byte 16 */ 56462306a36Sopenharmony_ci unsigned char bus_off_delay; /* Byte 17 */ 56562306a36Sopenharmony_ci bool bios_enabled:1; /* Byte 18 Bit 0 */ 56662306a36Sopenharmony_ci bool int19_redir_enabled:1; /* Byte 18 Bit 1 */ 56762306a36Sopenharmony_ci bool ext_trans_enable:1; /* Byte 18 Bit 2 */ 56862306a36Sopenharmony_ci bool removable_as_fixed:1; /* Byte 18 Bit 3 */ 56962306a36Sopenharmony_ci bool:1; /* Byte 18 Bit 4 */ 57062306a36Sopenharmony_ci bool morethan2_drives:1; /* Byte 18 Bit 5 */ 57162306a36Sopenharmony_ci bool bios_int:1; /* Byte 18 Bit 6 */ 57262306a36Sopenharmony_ci bool floptical:1; /* Byte 19 Bit 7 */ 57362306a36Sopenharmony_ci unsigned short dev_enabled; /* Bytes 19-20 */ 57462306a36Sopenharmony_ci unsigned short wide_ok; /* Bytes 21-22 */ 57562306a36Sopenharmony_ci unsigned short fast_ok; /* Bytes 23-24 */ 57662306a36Sopenharmony_ci unsigned short sync_ok; /* Bytes 25-26 */ 57762306a36Sopenharmony_ci unsigned short discon_ok; /* Bytes 27-28 */ 57862306a36Sopenharmony_ci unsigned short send_start_unit; /* Bytes 29-30 */ 57962306a36Sopenharmony_ci unsigned short ignore_bios_scan; /* Bytes 31-32 */ 58062306a36Sopenharmony_ci unsigned char pci_int_pin:2; /* Byte 33 Bits 0-1 */ 58162306a36Sopenharmony_ci unsigned char adapter_ioport:2; /* Byte 33 Bits 2-3 */ 58262306a36Sopenharmony_ci bool strict_rr_enabled:1; /* Byte 33 Bit 4 */ 58362306a36Sopenharmony_ci bool vesabus_33mhzplus:1; /* Byte 33 Bit 5 */ 58462306a36Sopenharmony_ci bool vesa_burst_write:1; /* Byte 33 Bit 6 */ 58562306a36Sopenharmony_ci bool vesa_burst_read:1; /* Byte 33 Bit 7 */ 58662306a36Sopenharmony_ci unsigned short ultra_ok; /* Bytes 34-35 */ 58762306a36Sopenharmony_ci unsigned int:32; /* Bytes 36-39 */ 58862306a36Sopenharmony_ci unsigned char:8; /* Byte 40 */ 58962306a36Sopenharmony_ci unsigned char autoscsi_maxlun; /* Byte 41 */ 59062306a36Sopenharmony_ci bool:1; /* Byte 42 Bit 0 */ 59162306a36Sopenharmony_ci bool scam_dominant:1; /* Byte 42 Bit 1 */ 59262306a36Sopenharmony_ci bool scam_enabled:1; /* Byte 42 Bit 2 */ 59362306a36Sopenharmony_ci bool scam_lev2:1; /* Byte 42 Bit 3 */ 59462306a36Sopenharmony_ci unsigned char:4; /* Byte 42 Bits 4-7 */ 59562306a36Sopenharmony_ci bool int13_exten:1; /* Byte 43 Bit 0 */ 59662306a36Sopenharmony_ci bool:1; /* Byte 43 Bit 1 */ 59762306a36Sopenharmony_ci bool cd_boot:1; /* Byte 43 Bit 2 */ 59862306a36Sopenharmony_ci unsigned char:5; /* Byte 43 Bits 3-7 */ 59962306a36Sopenharmony_ci unsigned char boot_id:4; /* Byte 44 Bits 0-3 */ 60062306a36Sopenharmony_ci unsigned char boot_ch:4; /* Byte 44 Bits 4-7 */ 60162306a36Sopenharmony_ci unsigned char force_scan_order:1; /* Byte 45 Bit 0 */ 60262306a36Sopenharmony_ci unsigned char:7; /* Byte 45 Bits 1-7 */ 60362306a36Sopenharmony_ci unsigned short nontagged_to_alt_ok; /* Bytes 46-47 */ 60462306a36Sopenharmony_ci unsigned short reneg_sync_on_check; /* Bytes 48-49 */ 60562306a36Sopenharmony_ci unsigned char rsvd[10]; /* Bytes 50-59 */ 60662306a36Sopenharmony_ci unsigned char manuf_diag[2]; /* Bytes 60-61 */ 60762306a36Sopenharmony_ci unsigned short cksum; /* Bytes 62-63 */ 60862306a36Sopenharmony_ci} PACKED; 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci/* 61162306a36Sopenharmony_ci Define the Host Adapter Local RAM Auto SCSI Byte 45 structure. 61262306a36Sopenharmony_ci*/ 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_cistruct blogic_autoscsi_byte45 { 61562306a36Sopenharmony_ci unsigned char force_scan_order:1; /* Bit 0 */ 61662306a36Sopenharmony_ci unsigned char:7; /* Bits 1-7 */ 61762306a36Sopenharmony_ci}; 61862306a36Sopenharmony_ci 61962306a36Sopenharmony_ci/* 62062306a36Sopenharmony_ci Define the Host Adapter Local RAM BIOS Drive Map Byte structure. 62162306a36Sopenharmony_ci*/ 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci#define BLOGIC_BIOS_DRVMAP 17 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_cistruct blogic_bios_drvmap { 62662306a36Sopenharmony_ci unsigned char tgt_idbit3:1; /* Bit 0 */ 62762306a36Sopenharmony_ci unsigned char:2; /* Bits 1-2 */ 62862306a36Sopenharmony_ci enum blogic_bios_diskgeometry diskgeom:2; /* Bits 3-4 */ 62962306a36Sopenharmony_ci unsigned char tgt_id:3; /* Bits 5-7 */ 63062306a36Sopenharmony_ci}; 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci/* 63362306a36Sopenharmony_ci Define the Set CCB Format request type. Extended LUN Format CCBs are 63462306a36Sopenharmony_ci necessary to support more than 8 Logical Units per Target Device. 63562306a36Sopenharmony_ci*/ 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_cienum blogic_setccb_fmt { 63862306a36Sopenharmony_ci BLOGIC_LEGACY_LUN_CCB = 0, 63962306a36Sopenharmony_ci BLOGIC_EXT_LUN_CCB = 1 64062306a36Sopenharmony_ci} PACKED; 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci/* 64362306a36Sopenharmony_ci Define the Outgoing Mailbox Action Codes. 64462306a36Sopenharmony_ci*/ 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_cienum blogic_action { 64762306a36Sopenharmony_ci BLOGIC_OUTBOX_FREE = 0x00, 64862306a36Sopenharmony_ci BLOGIC_MBOX_START = 0x01, 64962306a36Sopenharmony_ci BLOGIC_MBOX_ABORT = 0x02 65062306a36Sopenharmony_ci} PACKED; 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci/* 65462306a36Sopenharmony_ci Define the Incoming Mailbox Completion Codes. The MultiMaster Firmware 65562306a36Sopenharmony_ci only uses codes 0 - 4. The FlashPoint SCCB Manager has no mailboxes, so 65662306a36Sopenharmony_ci completion codes are stored in the CCB; it only uses codes 1, 2, 4, and 5. 65762306a36Sopenharmony_ci*/ 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_cienum blogic_cmplt_code { 66062306a36Sopenharmony_ci BLOGIC_INBOX_FREE = 0x00, 66162306a36Sopenharmony_ci BLOGIC_CMD_COMPLETE_GOOD = 0x01, 66262306a36Sopenharmony_ci BLOGIC_CMD_ABORT_BY_HOST = 0x02, 66362306a36Sopenharmony_ci BLOGIC_CMD_NOTFOUND = 0x03, 66462306a36Sopenharmony_ci BLOGIC_CMD_COMPLETE_ERROR = 0x04, 66562306a36Sopenharmony_ci BLOGIC_INVALID_CCB = 0x05 66662306a36Sopenharmony_ci} PACKED; 66762306a36Sopenharmony_ci 66862306a36Sopenharmony_ci/* 66962306a36Sopenharmony_ci Define the Command Control Block (CCB) Opcodes. 67062306a36Sopenharmony_ci*/ 67162306a36Sopenharmony_ci 67262306a36Sopenharmony_cienum blogic_ccb_opcode { 67362306a36Sopenharmony_ci BLOGIC_INITIATOR_CCB = 0x00, 67462306a36Sopenharmony_ci BLOGIC_TGT_CCB = 0x01, 67562306a36Sopenharmony_ci BLOGIC_INITIATOR_CCB_SG = 0x02, 67662306a36Sopenharmony_ci BLOGIC_INITIATOR_CCBB_RESIDUAL = 0x03, 67762306a36Sopenharmony_ci BLOGIC_INITIATOR_CCB_SG_RESIDUAL = 0x04, 67862306a36Sopenharmony_ci BLOGIC_BDR = 0x81 67962306a36Sopenharmony_ci} PACKED; 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_ci/* 68362306a36Sopenharmony_ci Define the CCB Data Direction Codes. 68462306a36Sopenharmony_ci*/ 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_cienum blogic_datadir { 68762306a36Sopenharmony_ci BLOGIC_UNCHECKED_TX = 0, 68862306a36Sopenharmony_ci BLOGIC_DATAIN_CHECKED = 1, 68962306a36Sopenharmony_ci BLOGIC_DATAOUT_CHECKED = 2, 69062306a36Sopenharmony_ci BLOGIC_NOTX = 3 69162306a36Sopenharmony_ci}; 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ci/* 69562306a36Sopenharmony_ci Define the Host Adapter Status Codes. The MultiMaster Firmware does not 69662306a36Sopenharmony_ci return status code 0x0C; it uses 0x12 for both overruns and underruns. 69762306a36Sopenharmony_ci*/ 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_cienum blogic_adapter_status { 70062306a36Sopenharmony_ci BLOGIC_CMD_CMPLT_NORMAL = 0x00, 70162306a36Sopenharmony_ci BLOGIC_LINK_CMD_CMPLT = 0x0A, 70262306a36Sopenharmony_ci BLOGIC_LINK_CMD_CMPLT_FLAG = 0x0B, 70362306a36Sopenharmony_ci BLOGIC_DATA_UNDERRUN = 0x0C, 70462306a36Sopenharmony_ci BLOGIC_SELECT_TIMEOUT = 0x11, 70562306a36Sopenharmony_ci BLOGIC_DATA_OVERRUN = 0x12, 70662306a36Sopenharmony_ci BLOGIC_NOEXPECT_BUSFREE = 0x13, 70762306a36Sopenharmony_ci BLOGIC_INVALID_BUSPHASE = 0x14, 70862306a36Sopenharmony_ci BLOGIC_INVALID_OUTBOX_CODE = 0x15, 70962306a36Sopenharmony_ci BLOGIC_INVALID_CMD_CODE = 0x16, 71062306a36Sopenharmony_ci BLOGIC_LINKCCB_BADLUN = 0x17, 71162306a36Sopenharmony_ci BLOGIC_BAD_CMD_PARAM = 0x1A, 71262306a36Sopenharmony_ci BLOGIC_AUTOREQSENSE_FAIL = 0x1B, 71362306a36Sopenharmony_ci BLOGIC_TAGQUEUE_REJECT = 0x1C, 71462306a36Sopenharmony_ci BLOGIC_BAD_MSG_RCVD = 0x1D, 71562306a36Sopenharmony_ci BLOGIC_HW_FAIL = 0x20, 71662306a36Sopenharmony_ci BLOGIC_NORESPONSE_TO_ATN = 0x21, 71762306a36Sopenharmony_ci BLOGIC_HW_RESET = 0x22, 71862306a36Sopenharmony_ci BLOGIC_RST_FROM_OTHERDEV = 0x23, 71962306a36Sopenharmony_ci BLOGIC_BAD_RECONNECT = 0x24, 72062306a36Sopenharmony_ci BLOGIC_HW_BDR = 0x25, 72162306a36Sopenharmony_ci BLOGIC_ABRT_QUEUE = 0x26, 72262306a36Sopenharmony_ci BLOGIC_ADAPTER_SW_ERROR = 0x27, 72362306a36Sopenharmony_ci BLOGIC_HW_TIMEOUT = 0x30, 72462306a36Sopenharmony_ci BLOGIC_PARITY_ERR = 0x34 72562306a36Sopenharmony_ci} PACKED; 72662306a36Sopenharmony_ci 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_ci/* 72962306a36Sopenharmony_ci Define the SCSI Target Device Status Codes. 73062306a36Sopenharmony_ci*/ 73162306a36Sopenharmony_ci 73262306a36Sopenharmony_cienum blogic_tgt_status { 73362306a36Sopenharmony_ci BLOGIC_OP_GOOD = 0x00, 73462306a36Sopenharmony_ci BLOGIC_CHECKCONDITION = 0x02, 73562306a36Sopenharmony_ci BLOGIC_DEVBUSY = 0x08 73662306a36Sopenharmony_ci} PACKED; 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci/* 73962306a36Sopenharmony_ci Define the Queue Tag Codes. 74062306a36Sopenharmony_ci*/ 74162306a36Sopenharmony_ci 74262306a36Sopenharmony_cienum blogic_queuetag { 74362306a36Sopenharmony_ci BLOGIC_SIMPLETAG = 0, 74462306a36Sopenharmony_ci BLOGIC_HEADTAG = 1, 74562306a36Sopenharmony_ci BLOGIC_ORDEREDTAG = 2, 74662306a36Sopenharmony_ci BLOGIC_RSVDTAG = 3 74762306a36Sopenharmony_ci}; 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_ci/* 75062306a36Sopenharmony_ci Define the SCSI Command Descriptor Block (CDB). 75162306a36Sopenharmony_ci*/ 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci#define BLOGIC_CDB_MAXLEN 12 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ci/* 75762306a36Sopenharmony_ci Define the Scatter/Gather Segment structure required by the MultiMaster 75862306a36Sopenharmony_ci Firmware Interface and the FlashPoint SCCB Manager. 75962306a36Sopenharmony_ci*/ 76062306a36Sopenharmony_ci 76162306a36Sopenharmony_cistruct blogic_sg_seg { 76262306a36Sopenharmony_ci u32 segbytes; /* Bytes 0-3 */ 76362306a36Sopenharmony_ci u32 segdata; /* Bytes 4-7 */ 76462306a36Sopenharmony_ci}; 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci/* 76762306a36Sopenharmony_ci Define the Driver CCB Status Codes. 76862306a36Sopenharmony_ci*/ 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_cienum blogic_ccb_status { 77162306a36Sopenharmony_ci BLOGIC_CCB_FREE = 0, 77262306a36Sopenharmony_ci BLOGIC_CCB_ACTIVE = 1, 77362306a36Sopenharmony_ci BLOGIC_CCB_COMPLETE = 2, 77462306a36Sopenharmony_ci BLOGIC_CCB_RESET = 3 77562306a36Sopenharmony_ci} PACKED; 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci/* 77962306a36Sopenharmony_ci Define the 32 Bit Mode Command Control Block (CCB) structure. The first 40 78062306a36Sopenharmony_ci bytes are defined by and common to both the MultiMaster Firmware and the 78162306a36Sopenharmony_ci FlashPoint SCCB Manager. The next 60 bytes are defined by the FlashPoint 78262306a36Sopenharmony_ci SCCB Manager. The remaining components are defined by the Linux BusLogic 78362306a36Sopenharmony_ci Driver. Extended LUN Format CCBs differ from Legacy LUN Format 32 Bit Mode 78462306a36Sopenharmony_ci CCBs only in having the TagEnable and QueueTag fields moved from byte 17 to 78562306a36Sopenharmony_ci byte 1, and the Logical Unit field in byte 17 expanded to 6 bits. In theory, 78662306a36Sopenharmony_ci Extended LUN Format CCBs can support up to 64 Logical Units, but in practice 78762306a36Sopenharmony_ci many devices will respond improperly to Logical Units between 32 and 63, and 78862306a36Sopenharmony_ci the SCSI-2 specification defines Bit 5 as LUNTAR. Extended LUN Format CCBs 78962306a36Sopenharmony_ci are used by recent versions of the MultiMaster Firmware, as well as by the 79062306a36Sopenharmony_ci FlashPoint SCCB Manager; the FlashPoint SCCB Manager only supports 32 Logical 79162306a36Sopenharmony_ci Units. Since 64 Logical Units are unlikely to be needed in practice, and 79262306a36Sopenharmony_ci since they are problematic for the above reasons, and since limiting them to 79362306a36Sopenharmony_ci 5 bits simplifies the CCB structure definition, this driver only supports 79462306a36Sopenharmony_ci 32 Logical Units per Target Device. 79562306a36Sopenharmony_ci*/ 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_cistruct blogic_ccb { 79862306a36Sopenharmony_ci /* 79962306a36Sopenharmony_ci MultiMaster Firmware and FlashPoint SCCB Manager Common Portion. 80062306a36Sopenharmony_ci */ 80162306a36Sopenharmony_ci enum blogic_ccb_opcode opcode; /* Byte 0 */ 80262306a36Sopenharmony_ci unsigned char:3; /* Byte 1 Bits 0-2 */ 80362306a36Sopenharmony_ci enum blogic_datadir datadir:2; /* Byte 1 Bits 3-4 */ 80462306a36Sopenharmony_ci bool tag_enable:1; /* Byte 1 Bit 5 */ 80562306a36Sopenharmony_ci enum blogic_queuetag queuetag:2; /* Byte 1 Bits 6-7 */ 80662306a36Sopenharmony_ci unsigned char cdblen; /* Byte 2 */ 80762306a36Sopenharmony_ci unsigned char sense_datalen; /* Byte 3 */ 80862306a36Sopenharmony_ci u32 datalen; /* Bytes 4-7 */ 80962306a36Sopenharmony_ci u32 data; /* Bytes 8-11 */ 81062306a36Sopenharmony_ci unsigned char:8; /* Byte 12 */ 81162306a36Sopenharmony_ci unsigned char:8; /* Byte 13 */ 81262306a36Sopenharmony_ci enum blogic_adapter_status adapter_status; /* Byte 14 */ 81362306a36Sopenharmony_ci enum blogic_tgt_status tgt_status; /* Byte 15 */ 81462306a36Sopenharmony_ci unsigned char tgt_id; /* Byte 16 */ 81562306a36Sopenharmony_ci unsigned char lun:5; /* Byte 17 Bits 0-4 */ 81662306a36Sopenharmony_ci bool legacytag_enable:1; /* Byte 17 Bit 5 */ 81762306a36Sopenharmony_ci enum blogic_queuetag legacy_tag:2; /* Byte 17 Bits 6-7 */ 81862306a36Sopenharmony_ci unsigned char cdb[BLOGIC_CDB_MAXLEN]; /* Bytes 18-29 */ 81962306a36Sopenharmony_ci unsigned char:8; /* Byte 30 */ 82062306a36Sopenharmony_ci unsigned char:8; /* Byte 31 */ 82162306a36Sopenharmony_ci u32 rsvd_int; /* Bytes 32-35 */ 82262306a36Sopenharmony_ci u32 sensedata; /* Bytes 36-39 */ 82362306a36Sopenharmony_ci /* 82462306a36Sopenharmony_ci FlashPoint SCCB Manager Defined Portion. 82562306a36Sopenharmony_ci */ 82662306a36Sopenharmony_ci void (*callback) (struct blogic_ccb *); /* Bytes 40-43 */ 82762306a36Sopenharmony_ci u32 base_addr; /* Bytes 44-47 */ 82862306a36Sopenharmony_ci enum blogic_cmplt_code comp_code; /* Byte 48 */ 82962306a36Sopenharmony_ci#ifdef CONFIG_SCSI_FLASHPOINT 83062306a36Sopenharmony_ci unsigned char:8; /* Byte 49 */ 83162306a36Sopenharmony_ci u16 os_flags; /* Bytes 50-51 */ 83262306a36Sopenharmony_ci unsigned char private[24]; /* Bytes 52-99 */ 83362306a36Sopenharmony_ci void *rsvd1; 83462306a36Sopenharmony_ci void *rsvd2; 83562306a36Sopenharmony_ci unsigned char private2[16]; 83662306a36Sopenharmony_ci#endif 83762306a36Sopenharmony_ci /* 83862306a36Sopenharmony_ci BusLogic Linux Driver Defined Portion. 83962306a36Sopenharmony_ci */ 84062306a36Sopenharmony_ci dma_addr_t allocgrp_head; 84162306a36Sopenharmony_ci unsigned int allocgrp_size; 84262306a36Sopenharmony_ci u32 dma_handle; 84362306a36Sopenharmony_ci enum blogic_ccb_status status; 84462306a36Sopenharmony_ci unsigned long serial; 84562306a36Sopenharmony_ci struct scsi_cmnd *command; 84662306a36Sopenharmony_ci struct blogic_adapter *adapter; 84762306a36Sopenharmony_ci struct blogic_ccb *next; 84862306a36Sopenharmony_ci struct blogic_ccb *next_all; 84962306a36Sopenharmony_ci struct blogic_sg_seg sglist[BLOGIC_SG_LIMIT]; 85062306a36Sopenharmony_ci}; 85162306a36Sopenharmony_ci 85262306a36Sopenharmony_ci/* 85362306a36Sopenharmony_ci Define the 32 Bit Mode Outgoing Mailbox structure. 85462306a36Sopenharmony_ci*/ 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_cistruct blogic_outbox { 85762306a36Sopenharmony_ci u32 ccb; /* Bytes 0-3 */ 85862306a36Sopenharmony_ci u32:24; /* Bytes 4-6 */ 85962306a36Sopenharmony_ci enum blogic_action action; /* Byte 7 */ 86062306a36Sopenharmony_ci}; 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci/* 86362306a36Sopenharmony_ci Define the 32 Bit Mode Incoming Mailbox structure. 86462306a36Sopenharmony_ci*/ 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_cistruct blogic_inbox { 86762306a36Sopenharmony_ci u32 ccb; /* Bytes 0-3 */ 86862306a36Sopenharmony_ci enum blogic_adapter_status adapter_status; /* Byte 4 */ 86962306a36Sopenharmony_ci enum blogic_tgt_status tgt_status; /* Byte 5 */ 87062306a36Sopenharmony_ci unsigned char:8; /* Byte 6 */ 87162306a36Sopenharmony_ci enum blogic_cmplt_code comp_code; /* Byte 7 */ 87262306a36Sopenharmony_ci}; 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci 87562306a36Sopenharmony_ci/* 87662306a36Sopenharmony_ci Define the BusLogic Driver Options structure. 87762306a36Sopenharmony_ci*/ 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_cistruct blogic_drvr_options { 88062306a36Sopenharmony_ci unsigned short tagq_ok; 88162306a36Sopenharmony_ci unsigned short tagq_ok_mask; 88262306a36Sopenharmony_ci unsigned short bus_settle_time; 88362306a36Sopenharmony_ci unsigned short stop_tgt_inquiry; 88462306a36Sopenharmony_ci unsigned char common_qdepth; 88562306a36Sopenharmony_ci unsigned char qdepth[BLOGIC_MAXDEV]; 88662306a36Sopenharmony_ci}; 88762306a36Sopenharmony_ci 88862306a36Sopenharmony_ci/* 88962306a36Sopenharmony_ci Define the Host Adapter Target Flags structure. 89062306a36Sopenharmony_ci*/ 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_cistruct blogic_tgt_flags { 89362306a36Sopenharmony_ci bool tgt_exists:1; 89462306a36Sopenharmony_ci bool tagq_ok:1; 89562306a36Sopenharmony_ci bool wide_ok:1; 89662306a36Sopenharmony_ci bool tagq_active:1; 89762306a36Sopenharmony_ci bool wide_active:1; 89862306a36Sopenharmony_ci bool cmd_good:1; 89962306a36Sopenharmony_ci bool tgt_info_in:1; 90062306a36Sopenharmony_ci}; 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_ci/* 90362306a36Sopenharmony_ci Define the Host Adapter Target Statistics structure. 90462306a36Sopenharmony_ci*/ 90562306a36Sopenharmony_ci 90662306a36Sopenharmony_ci#define BLOGIC_SZ_BUCKETS 10 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_cistruct blogic_tgt_stats { 90962306a36Sopenharmony_ci unsigned int cmds_tried; 91062306a36Sopenharmony_ci unsigned int cmds_complete; 91162306a36Sopenharmony_ci unsigned int read_cmds; 91262306a36Sopenharmony_ci unsigned int write_cmds; 91362306a36Sopenharmony_ci struct blogic_byte_count bytesread; 91462306a36Sopenharmony_ci struct blogic_byte_count byteswritten; 91562306a36Sopenharmony_ci unsigned int read_sz_buckets[BLOGIC_SZ_BUCKETS]; 91662306a36Sopenharmony_ci unsigned int write_sz_buckets[BLOGIC_SZ_BUCKETS]; 91762306a36Sopenharmony_ci unsigned short aborts_request; 91862306a36Sopenharmony_ci unsigned short aborts_tried; 91962306a36Sopenharmony_ci unsigned short aborts_done; 92062306a36Sopenharmony_ci unsigned short bdr_request; 92162306a36Sopenharmony_ci unsigned short bdr_tried; 92262306a36Sopenharmony_ci unsigned short bdr_done; 92362306a36Sopenharmony_ci unsigned short adapter_reset_req; 92462306a36Sopenharmony_ci unsigned short adapter_reset_attempt; 92562306a36Sopenharmony_ci unsigned short adapter_reset_done; 92662306a36Sopenharmony_ci}; 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci/* 92962306a36Sopenharmony_ci Define the FlashPoint Card Handle data type. 93062306a36Sopenharmony_ci*/ 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci#define FPOINT_BADCARD_HANDLE 0xFFFFFFFFL 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci 93562306a36Sopenharmony_ci/* 93662306a36Sopenharmony_ci Define the FlashPoint Information structure. This structure is defined 93762306a36Sopenharmony_ci by the FlashPoint SCCB Manager. 93862306a36Sopenharmony_ci*/ 93962306a36Sopenharmony_ci 94062306a36Sopenharmony_cistruct fpoint_info { 94162306a36Sopenharmony_ci u32 base_addr; /* Bytes 0-3 */ 94262306a36Sopenharmony_ci bool present; /* Byte 4 */ 94362306a36Sopenharmony_ci unsigned char irq_ch; /* Byte 5 */ 94462306a36Sopenharmony_ci unsigned char scsi_id; /* Byte 6 */ 94562306a36Sopenharmony_ci unsigned char scsi_lun; /* Byte 7 */ 94662306a36Sopenharmony_ci u16 fw_rev; /* Bytes 8-9 */ 94762306a36Sopenharmony_ci u16 sync_ok; /* Bytes 10-11 */ 94862306a36Sopenharmony_ci u16 fast_ok; /* Bytes 12-13 */ 94962306a36Sopenharmony_ci u16 ultra_ok; /* Bytes 14-15 */ 95062306a36Sopenharmony_ci u16 discon_ok; /* Bytes 16-17 */ 95162306a36Sopenharmony_ci u16 wide_ok; /* Bytes 18-19 */ 95262306a36Sopenharmony_ci bool parity:1; /* Byte 20 Bit 0 */ 95362306a36Sopenharmony_ci bool wide:1; /* Byte 20 Bit 1 */ 95462306a36Sopenharmony_ci bool softreset:1; /* Byte 20 Bit 2 */ 95562306a36Sopenharmony_ci bool ext_trans_enable:1; /* Byte 20 Bit 3 */ 95662306a36Sopenharmony_ci bool low_term:1; /* Byte 20 Bit 4 */ 95762306a36Sopenharmony_ci bool high_term:1; /* Byte 20 Bit 5 */ 95862306a36Sopenharmony_ci bool report_underrun:1; /* Byte 20 Bit 6 */ 95962306a36Sopenharmony_ci bool scam_enabled:1; /* Byte 20 Bit 7 */ 96062306a36Sopenharmony_ci bool scam_lev2:1; /* Byte 21 Bit 0 */ 96162306a36Sopenharmony_ci unsigned char:7; /* Byte 21 Bits 1-7 */ 96262306a36Sopenharmony_ci unsigned char family; /* Byte 22 */ 96362306a36Sopenharmony_ci unsigned char bus_type; /* Byte 23 */ 96462306a36Sopenharmony_ci unsigned char model[3]; /* Bytes 24-26 */ 96562306a36Sopenharmony_ci unsigned char relative_cardnum; /* Byte 27 */ 96662306a36Sopenharmony_ci unsigned char rsvd[4]; /* Bytes 28-31 */ 96762306a36Sopenharmony_ci u32 os_rsvd; /* Bytes 32-35 */ 96862306a36Sopenharmony_ci unsigned char translation_info[4]; /* Bytes 36-39 */ 96962306a36Sopenharmony_ci u32 rsvd2[5]; /* Bytes 40-59 */ 97062306a36Sopenharmony_ci u32 sec_range; /* Bytes 60-63 */ 97162306a36Sopenharmony_ci}; 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci/* 97462306a36Sopenharmony_ci Define the BusLogic Driver Host Adapter structure. 97562306a36Sopenharmony_ci*/ 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_cistruct blogic_adapter { 97862306a36Sopenharmony_ci struct Scsi_Host *scsi_host; 97962306a36Sopenharmony_ci struct pci_dev *pci_device; 98062306a36Sopenharmony_ci enum blogic_adapter_type adapter_type; 98162306a36Sopenharmony_ci enum blogic_adapter_bus_type adapter_bus_type; 98262306a36Sopenharmony_ci unsigned long io_addr; 98362306a36Sopenharmony_ci unsigned long pci_addr; 98462306a36Sopenharmony_ci unsigned short addr_count; 98562306a36Sopenharmony_ci unsigned char host_no; 98662306a36Sopenharmony_ci unsigned char model[9]; 98762306a36Sopenharmony_ci unsigned char fw_ver[6]; 98862306a36Sopenharmony_ci unsigned char full_model[18]; 98962306a36Sopenharmony_ci unsigned char bus; 99062306a36Sopenharmony_ci unsigned char dev; 99162306a36Sopenharmony_ci unsigned char irq_ch; 99262306a36Sopenharmony_ci unsigned char scsi_id; 99362306a36Sopenharmony_ci bool irq_acquired:1; 99462306a36Sopenharmony_ci bool ext_trans_enable:1; 99562306a36Sopenharmony_ci bool parity:1; 99662306a36Sopenharmony_ci bool reset_enabled:1; 99762306a36Sopenharmony_ci bool level_int:1; 99862306a36Sopenharmony_ci bool wide:1; 99962306a36Sopenharmony_ci bool differential:1; 100062306a36Sopenharmony_ci bool scam:1; 100162306a36Sopenharmony_ci bool ultra:1; 100262306a36Sopenharmony_ci bool ext_lun:1; 100362306a36Sopenharmony_ci bool terminfo_valid:1; 100462306a36Sopenharmony_ci bool low_term:1; 100562306a36Sopenharmony_ci bool high_term:1; 100662306a36Sopenharmony_ci bool strict_rr:1; 100762306a36Sopenharmony_ci bool scam_enabled:1; 100862306a36Sopenharmony_ci bool scam_lev2:1; 100962306a36Sopenharmony_ci bool adapter_initd:1; 101062306a36Sopenharmony_ci bool adapter_extreset:1; 101162306a36Sopenharmony_ci bool adapter_intern_err:1; 101262306a36Sopenharmony_ci bool processing_ccbs; 101362306a36Sopenharmony_ci volatile bool adapter_cmd_complete; 101462306a36Sopenharmony_ci unsigned short adapter_sglimit; 101562306a36Sopenharmony_ci unsigned short drvr_sglimit; 101662306a36Sopenharmony_ci unsigned short maxdev; 101762306a36Sopenharmony_ci unsigned short maxlun; 101862306a36Sopenharmony_ci unsigned short mbox_count; 101962306a36Sopenharmony_ci unsigned short initccbs; 102062306a36Sopenharmony_ci unsigned short inc_ccbs; 102162306a36Sopenharmony_ci unsigned short alloc_ccbs; 102262306a36Sopenharmony_ci unsigned short drvr_qdepth; 102362306a36Sopenharmony_ci unsigned short adapter_qdepth; 102462306a36Sopenharmony_ci unsigned short untag_qdepth; 102562306a36Sopenharmony_ci unsigned short common_qdepth; 102662306a36Sopenharmony_ci unsigned short bus_settle_time; 102762306a36Sopenharmony_ci unsigned short sync_ok; 102862306a36Sopenharmony_ci unsigned short fast_ok; 102962306a36Sopenharmony_ci unsigned short ultra_ok; 103062306a36Sopenharmony_ci unsigned short wide_ok; 103162306a36Sopenharmony_ci unsigned short discon_ok; 103262306a36Sopenharmony_ci unsigned short tagq_ok; 103362306a36Sopenharmony_ci unsigned short ext_resets; 103462306a36Sopenharmony_ci unsigned short adapter_intern_errors; 103562306a36Sopenharmony_ci unsigned short tgt_count; 103662306a36Sopenharmony_ci unsigned short msgbuflen; 103762306a36Sopenharmony_ci u32 bios_addr; 103862306a36Sopenharmony_ci struct blogic_drvr_options *drvr_opts; 103962306a36Sopenharmony_ci struct fpoint_info fpinfo; 104062306a36Sopenharmony_ci void *cardhandle; 104162306a36Sopenharmony_ci struct list_head host_list; 104262306a36Sopenharmony_ci struct blogic_ccb *all_ccbs; 104362306a36Sopenharmony_ci struct blogic_ccb *free_ccbs; 104462306a36Sopenharmony_ci struct blogic_ccb *firstccb; 104562306a36Sopenharmony_ci struct blogic_ccb *lastccb; 104662306a36Sopenharmony_ci struct blogic_ccb *bdr_pend[BLOGIC_MAXDEV]; 104762306a36Sopenharmony_ci struct blogic_tgt_flags tgt_flags[BLOGIC_MAXDEV]; 104862306a36Sopenharmony_ci unsigned char qdepth[BLOGIC_MAXDEV]; 104962306a36Sopenharmony_ci unsigned char sync_period[BLOGIC_MAXDEV]; 105062306a36Sopenharmony_ci unsigned char sync_offset[BLOGIC_MAXDEV]; 105162306a36Sopenharmony_ci unsigned char active_cmds[BLOGIC_MAXDEV]; 105262306a36Sopenharmony_ci unsigned int cmds_since_rst[BLOGIC_MAXDEV]; 105362306a36Sopenharmony_ci unsigned long last_seqpoint[BLOGIC_MAXDEV]; 105462306a36Sopenharmony_ci unsigned long last_resettried[BLOGIC_MAXDEV]; 105562306a36Sopenharmony_ci unsigned long last_resetdone[BLOGIC_MAXDEV]; 105662306a36Sopenharmony_ci struct blogic_outbox *first_outbox; 105762306a36Sopenharmony_ci struct blogic_outbox *last_outbox; 105862306a36Sopenharmony_ci struct blogic_outbox *next_outbox; 105962306a36Sopenharmony_ci struct blogic_inbox *first_inbox; 106062306a36Sopenharmony_ci struct blogic_inbox *last_inbox; 106162306a36Sopenharmony_ci struct blogic_inbox *next_inbox; 106262306a36Sopenharmony_ci struct blogic_tgt_stats tgt_stats[BLOGIC_MAXDEV]; 106362306a36Sopenharmony_ci unsigned char *mbox_space; 106462306a36Sopenharmony_ci dma_addr_t mbox_space_handle; 106562306a36Sopenharmony_ci unsigned int mbox_sz; 106662306a36Sopenharmony_ci unsigned long ccb_offset; 106762306a36Sopenharmony_ci char msgbuf[BLOGIC_MSGBUF_SIZE]; 106862306a36Sopenharmony_ci}; 106962306a36Sopenharmony_ci 107062306a36Sopenharmony_ci/* 107162306a36Sopenharmony_ci Define a structure for the BIOS Disk Parameters. 107262306a36Sopenharmony_ci*/ 107362306a36Sopenharmony_ci 107462306a36Sopenharmony_cistruct bios_diskparam { 107562306a36Sopenharmony_ci int heads; 107662306a36Sopenharmony_ci int sectors; 107762306a36Sopenharmony_ci int cylinders; 107862306a36Sopenharmony_ci}; 107962306a36Sopenharmony_ci 108062306a36Sopenharmony_ci/* 108162306a36Sopenharmony_ci Define a structure for the SCSI Inquiry command results. 108262306a36Sopenharmony_ci*/ 108362306a36Sopenharmony_ci 108462306a36Sopenharmony_cistruct scsi_inquiry { 108562306a36Sopenharmony_ci unsigned char devtype:5; /* Byte 0 Bits 0-4 */ 108662306a36Sopenharmony_ci unsigned char dev_qual:3; /* Byte 0 Bits 5-7 */ 108762306a36Sopenharmony_ci unsigned char dev_modifier:7; /* Byte 1 Bits 0-6 */ 108862306a36Sopenharmony_ci bool rmb:1; /* Byte 1 Bit 7 */ 108962306a36Sopenharmony_ci unsigned char ansi_ver:3; /* Byte 2 Bits 0-2 */ 109062306a36Sopenharmony_ci unsigned char ecma_ver:3; /* Byte 2 Bits 3-5 */ 109162306a36Sopenharmony_ci unsigned char iso_ver:2; /* Byte 2 Bits 6-7 */ 109262306a36Sopenharmony_ci unsigned char resp_fmt:4; /* Byte 3 Bits 0-3 */ 109362306a36Sopenharmony_ci unsigned char:2; /* Byte 3 Bits 4-5 */ 109462306a36Sopenharmony_ci bool TrmIOP:1; /* Byte 3 Bit 6 */ 109562306a36Sopenharmony_ci bool AENC:1; /* Byte 3 Bit 7 */ 109662306a36Sopenharmony_ci unsigned char addl_len; /* Byte 4 */ 109762306a36Sopenharmony_ci unsigned char:8; /* Byte 5 */ 109862306a36Sopenharmony_ci unsigned char:8; /* Byte 6 */ 109962306a36Sopenharmony_ci bool SftRe:1; /* Byte 7 Bit 0 */ 110062306a36Sopenharmony_ci bool CmdQue:1; /* Byte 7 Bit 1 */ 110162306a36Sopenharmony_ci bool:1; /* Byte 7 Bit 2 */ 110262306a36Sopenharmony_ci bool linked:1; /* Byte 7 Bit 3 */ 110362306a36Sopenharmony_ci bool sync:1; /* Byte 7 Bit 4 */ 110462306a36Sopenharmony_ci bool WBus16:1; /* Byte 7 Bit 5 */ 110562306a36Sopenharmony_ci bool WBus32:1; /* Byte 7 Bit 6 */ 110662306a36Sopenharmony_ci bool RelAdr:1; /* Byte 7 Bit 7 */ 110762306a36Sopenharmony_ci unsigned char vendor[8]; /* Bytes 8-15 */ 110862306a36Sopenharmony_ci unsigned char product[16]; /* Bytes 16-31 */ 110962306a36Sopenharmony_ci unsigned char product_rev[4]; /* Bytes 32-35 */ 111062306a36Sopenharmony_ci}; 111162306a36Sopenharmony_ci 111262306a36Sopenharmony_ci 111362306a36Sopenharmony_ci/* 111462306a36Sopenharmony_ci Define functions to provide an abstraction for reading and writing the 111562306a36Sopenharmony_ci Host Adapter I/O Registers. 111662306a36Sopenharmony_ci*/ 111762306a36Sopenharmony_ci 111862306a36Sopenharmony_cistatic inline void blogic_busreset(struct blogic_adapter *adapter) 111962306a36Sopenharmony_ci{ 112062306a36Sopenharmony_ci union blogic_cntrl_reg cr; 112162306a36Sopenharmony_ci cr.all = 0; 112262306a36Sopenharmony_ci cr.cr.bus_reset = true; 112362306a36Sopenharmony_ci outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG); 112462306a36Sopenharmony_ci} 112562306a36Sopenharmony_ci 112662306a36Sopenharmony_cistatic inline void blogic_intreset(struct blogic_adapter *adapter) 112762306a36Sopenharmony_ci{ 112862306a36Sopenharmony_ci union blogic_cntrl_reg cr; 112962306a36Sopenharmony_ci cr.all = 0; 113062306a36Sopenharmony_ci cr.cr.int_reset = true; 113162306a36Sopenharmony_ci outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG); 113262306a36Sopenharmony_ci} 113362306a36Sopenharmony_ci 113462306a36Sopenharmony_cistatic inline void blogic_softreset(struct blogic_adapter *adapter) 113562306a36Sopenharmony_ci{ 113662306a36Sopenharmony_ci union blogic_cntrl_reg cr; 113762306a36Sopenharmony_ci cr.all = 0; 113862306a36Sopenharmony_ci cr.cr.soft_reset = true; 113962306a36Sopenharmony_ci outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG); 114062306a36Sopenharmony_ci} 114162306a36Sopenharmony_ci 114262306a36Sopenharmony_cistatic inline void blogic_hardreset(struct blogic_adapter *adapter) 114362306a36Sopenharmony_ci{ 114462306a36Sopenharmony_ci union blogic_cntrl_reg cr; 114562306a36Sopenharmony_ci cr.all = 0; 114662306a36Sopenharmony_ci cr.cr.hard_reset = true; 114762306a36Sopenharmony_ci outb(cr.all, adapter->io_addr + BLOGIC_CNTRL_REG); 114862306a36Sopenharmony_ci} 114962306a36Sopenharmony_ci 115062306a36Sopenharmony_cistatic inline unsigned char blogic_rdstatus(struct blogic_adapter *adapter) 115162306a36Sopenharmony_ci{ 115262306a36Sopenharmony_ci return inb(adapter->io_addr + BLOGIC_STATUS_REG); 115362306a36Sopenharmony_ci} 115462306a36Sopenharmony_ci 115562306a36Sopenharmony_cistatic inline void blogic_setcmdparam(struct blogic_adapter *adapter, 115662306a36Sopenharmony_ci unsigned char value) 115762306a36Sopenharmony_ci{ 115862306a36Sopenharmony_ci outb(value, adapter->io_addr + BLOGIC_CMD_PARM_REG); 115962306a36Sopenharmony_ci} 116062306a36Sopenharmony_ci 116162306a36Sopenharmony_cistatic inline unsigned char blogic_rddatain(struct blogic_adapter *adapter) 116262306a36Sopenharmony_ci{ 116362306a36Sopenharmony_ci return inb(adapter->io_addr + BLOGIC_DATAIN_REG); 116462306a36Sopenharmony_ci} 116562306a36Sopenharmony_ci 116662306a36Sopenharmony_cistatic inline unsigned char blogic_rdint(struct blogic_adapter *adapter) 116762306a36Sopenharmony_ci{ 116862306a36Sopenharmony_ci return inb(adapter->io_addr + BLOGIC_INT_REG); 116962306a36Sopenharmony_ci} 117062306a36Sopenharmony_ci 117162306a36Sopenharmony_cistatic inline unsigned char blogic_rdgeom(struct blogic_adapter *adapter) 117262306a36Sopenharmony_ci{ 117362306a36Sopenharmony_ci return inb(adapter->io_addr + BLOGIC_GEOMETRY_REG); 117462306a36Sopenharmony_ci} 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ci/* 117762306a36Sopenharmony_ci blogic_execmbox issues an Execute Mailbox Command, which 117862306a36Sopenharmony_ci notifies the Host Adapter that an entry has been made in an Outgoing 117962306a36Sopenharmony_ci Mailbox. 118062306a36Sopenharmony_ci*/ 118162306a36Sopenharmony_ci 118262306a36Sopenharmony_cistatic inline void blogic_execmbox(struct blogic_adapter *adapter) 118362306a36Sopenharmony_ci{ 118462306a36Sopenharmony_ci blogic_setcmdparam(adapter, BLOGIC_EXEC_MBOX_CMD); 118562306a36Sopenharmony_ci} 118662306a36Sopenharmony_ci 118762306a36Sopenharmony_ci/* 118862306a36Sopenharmony_ci blogic_delay waits for Seconds to elapse. 118962306a36Sopenharmony_ci*/ 119062306a36Sopenharmony_ci 119162306a36Sopenharmony_cistatic inline void blogic_delay(int seconds) 119262306a36Sopenharmony_ci{ 119362306a36Sopenharmony_ci mdelay(1000 * seconds); 119462306a36Sopenharmony_ci} 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_ci/* 119762306a36Sopenharmony_ci virt_to_32bit_virt maps between Kernel Virtual Addresses and 119862306a36Sopenharmony_ci 32 bit Kernel Virtual Addresses. This avoids compilation warnings 119962306a36Sopenharmony_ci on 64 bit architectures. 120062306a36Sopenharmony_ci*/ 120162306a36Sopenharmony_ci 120262306a36Sopenharmony_cistatic inline u32 virt_to_32bit_virt(void *virt_addr) 120362306a36Sopenharmony_ci{ 120462306a36Sopenharmony_ci return (u32) (unsigned long) virt_addr; 120562306a36Sopenharmony_ci} 120662306a36Sopenharmony_ci 120762306a36Sopenharmony_ci/* 120862306a36Sopenharmony_ci blogic_inc_count increments counter by 1, stopping at 120962306a36Sopenharmony_ci 65535 rather than wrapping around to 0. 121062306a36Sopenharmony_ci*/ 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_cistatic inline void blogic_inc_count(unsigned short *count) 121362306a36Sopenharmony_ci{ 121462306a36Sopenharmony_ci if (*count < 65535) 121562306a36Sopenharmony_ci (*count)++; 121662306a36Sopenharmony_ci} 121762306a36Sopenharmony_ci 121862306a36Sopenharmony_ci/* 121962306a36Sopenharmony_ci blogic_addcount increments Byte Counter by Amount. 122062306a36Sopenharmony_ci*/ 122162306a36Sopenharmony_ci 122262306a36Sopenharmony_cistatic inline void blogic_addcount(struct blogic_byte_count *bytecount, 122362306a36Sopenharmony_ci unsigned int amount) 122462306a36Sopenharmony_ci{ 122562306a36Sopenharmony_ci bytecount->units += amount; 122662306a36Sopenharmony_ci if (bytecount->units > 999999999) { 122762306a36Sopenharmony_ci bytecount->units -= 1000000000; 122862306a36Sopenharmony_ci bytecount->billions++; 122962306a36Sopenharmony_ci } 123062306a36Sopenharmony_ci} 123162306a36Sopenharmony_ci 123262306a36Sopenharmony_ci/* 123362306a36Sopenharmony_ci blogic_incszbucket increments the Bucket for Amount. 123462306a36Sopenharmony_ci*/ 123562306a36Sopenharmony_ci 123662306a36Sopenharmony_cistatic inline void blogic_incszbucket(unsigned int *cmdsz_buckets, 123762306a36Sopenharmony_ci unsigned int amount) 123862306a36Sopenharmony_ci{ 123962306a36Sopenharmony_ci int index = 0; 124062306a36Sopenharmony_ci if (amount < 8 * 1024) { 124162306a36Sopenharmony_ci if (amount < 2 * 1024) 124262306a36Sopenharmony_ci index = (amount < 1 * 1024 ? 0 : 1); 124362306a36Sopenharmony_ci else 124462306a36Sopenharmony_ci index = (amount < 4 * 1024 ? 2 : 3); 124562306a36Sopenharmony_ci } else if (amount < 128 * 1024) { 124662306a36Sopenharmony_ci if (amount < 32 * 1024) 124762306a36Sopenharmony_ci index = (amount < 16 * 1024 ? 4 : 5); 124862306a36Sopenharmony_ci else 124962306a36Sopenharmony_ci index = (amount < 64 * 1024 ? 6 : 7); 125062306a36Sopenharmony_ci } else 125162306a36Sopenharmony_ci index = (amount < 256 * 1024 ? 8 : 9); 125262306a36Sopenharmony_ci cmdsz_buckets[index]++; 125362306a36Sopenharmony_ci} 125462306a36Sopenharmony_ci 125562306a36Sopenharmony_ci/* 125662306a36Sopenharmony_ci Define the version number of the FlashPoint Firmware (SCCB Manager). 125762306a36Sopenharmony_ci*/ 125862306a36Sopenharmony_ci 125962306a36Sopenharmony_ci#define FLASHPOINT_FW_VER "5.02" 126062306a36Sopenharmony_ci 126162306a36Sopenharmony_ci/* 126262306a36Sopenharmony_ci Define the possible return values from FlashPoint_HandleInterrupt. 126362306a36Sopenharmony_ci*/ 126462306a36Sopenharmony_ci 126562306a36Sopenharmony_ci#define FPOINT_NORMAL_INT 0x00 126662306a36Sopenharmony_ci#define FPOINT_INTERN_ERR 0xFE 126762306a36Sopenharmony_ci#define FPOINT_EXT_RESET 0xFF 126862306a36Sopenharmony_ci 126962306a36Sopenharmony_ci/* 127062306a36Sopenharmony_ci Define prototypes for the forward referenced BusLogic Driver 127162306a36Sopenharmony_ci Internal Functions. 127262306a36Sopenharmony_ci*/ 127362306a36Sopenharmony_ci 127462306a36Sopenharmony_cistatic const char *blogic_drvr_info(struct Scsi_Host *); 127562306a36Sopenharmony_cistatic int blogic_qcmd(struct Scsi_Host *h, struct scsi_cmnd *); 127662306a36Sopenharmony_cistatic int blogic_diskparam(struct scsi_device *, struct block_device *, sector_t, int *); 127762306a36Sopenharmony_cistatic int blogic_slaveconfig(struct scsi_device *); 127862306a36Sopenharmony_cistatic void blogic_qcompleted_ccb(struct blogic_ccb *); 127962306a36Sopenharmony_cistatic irqreturn_t blogic_inthandler(int, void *); 128062306a36Sopenharmony_cistatic int blogic_resetadapter(struct blogic_adapter *, bool hard_reset); 128162306a36Sopenharmony_cistatic void blogic_msg(enum blogic_msglevel, char *, struct blogic_adapter *, ...); 128262306a36Sopenharmony_cistatic int __init blogic_setup(char *); 128362306a36Sopenharmony_ci 128462306a36Sopenharmony_ci#endif /* _BUSLOGIC_H */ 1285