[SCSI] qla2xxx: Add ISP82XX support.
Enhanced the driver to support new FCoE host bus adapter. Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
Родитель
c446c1f990
Коммит
a9083016a5
|
@ -1,4 +1,5 @@
|
|||
qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
|
||||
qla_dbg.o qla_sup.o qla_attr.o qla_mid.o qla_dfs.o qla_bsg.o
|
||||
qla_dbg.o qla_sup.o qla_attr.o qla_mid.o qla_dfs.o qla_bsg.o \
|
||||
qla_nx.o
|
||||
|
||||
obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o
|
||||
|
|
|
@ -41,6 +41,12 @@ qla2x00_sysfs_write_fw_dump(struct kobject *kobj,
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
int reading;
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
DEBUG2(qla_printk(KERN_INFO, ha,
|
||||
"Firmware dump not supported for ISP82xx\n"));
|
||||
return count;
|
||||
}
|
||||
|
||||
if (off != 0)
|
||||
return (0);
|
||||
|
||||
|
@ -313,8 +319,8 @@ qla2x00_sysfs_write_optrom_ctl(struct kobject *kobj,
|
|||
else if (start == (ha->flt_region_boot * 4) ||
|
||||
start == (ha->flt_region_fw * 4))
|
||||
valid = 1;
|
||||
else if (IS_QLA25XX(ha) || IS_QLA81XX(ha))
|
||||
valid = 1;
|
||||
else if (IS_QLA25XX(ha) || IS_QLA8XXX_TYPE(ha))
|
||||
valid = 1;
|
||||
if (!valid) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"Invalid start region 0x%x/0x%x.\n", start, size);
|
||||
|
@ -517,6 +523,7 @@ qla2x00_sysfs_write_reset(struct kobject *kobj,
|
|||
struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
|
||||
struct device, kobj)));
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
|
||||
int type;
|
||||
|
||||
if (off != 0)
|
||||
|
@ -551,6 +558,20 @@ qla2x00_sysfs_write_reset(struct kobject *kobj,
|
|||
"MPI reset failed on (%ld).\n", vha->host_no);
|
||||
scsi_unblock_requests(vha->host);
|
||||
break;
|
||||
case 0x2025e:
|
||||
if (!IS_QLA82XX(ha) || vha != base_vha) {
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"FCoE ctx reset not supported for host%ld.\n",
|
||||
vha->host_no);
|
||||
return count;
|
||||
}
|
||||
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"Issuing FCoE CTX reset on host%ld.\n", vha->host_no);
|
||||
set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
|
||||
qla2xxx_wake_dpc(vha);
|
||||
qla2x00_wait_for_fcoe_ctx_reset(vha);
|
||||
break;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
@ -836,7 +857,7 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
|
|||
continue;
|
||||
if (iter->is4GBp_only == 2 && !IS_QLA25XX(vha->hw))
|
||||
continue;
|
||||
if (iter->is4GBp_only == 3 && !IS_QLA81XX(vha->hw))
|
||||
if (iter->is4GBp_only == 3 && !(IS_QLA8XXX_TYPE(vha->hw)))
|
||||
continue;
|
||||
|
||||
ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
|
||||
|
@ -860,7 +881,7 @@ qla2x00_free_sysfs_attr(scsi_qla_host_t *vha)
|
|||
continue;
|
||||
if (iter->is4GBp_only == 2 && !IS_QLA25XX(ha))
|
||||
continue;
|
||||
if (iter->is4GBp_only == 3 && !IS_QLA81XX(ha))
|
||||
if (iter->is4GBp_only == 3 && !!(IS_QLA8XXX_TYPE(vha->hw)))
|
||||
continue;
|
||||
|
||||
sysfs_remove_bin_file(&host->shost_gendev.kobj,
|
||||
|
@ -1233,7 +1254,7 @@ qla2x00_vlan_id_show(struct device *dev, struct device_attribute *attr,
|
|||
{
|
||||
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
|
||||
|
||||
if (!IS_QLA81XX(vha->hw))
|
||||
if (!IS_QLA8XXX_TYPE(vha->hw))
|
||||
return snprintf(buf, PAGE_SIZE, "\n");
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n", vha->fcoe_vlan_id);
|
||||
|
@ -1245,7 +1266,7 @@ qla2x00_vn_port_mac_address_show(struct device *dev,
|
|||
{
|
||||
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
|
||||
|
||||
if (!IS_QLA81XX(vha->hw))
|
||||
if (!IS_QLA8XXX_TYPE(vha->hw))
|
||||
return snprintf(buf, PAGE_SIZE, "\n");
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||
|
@ -1922,7 +1943,7 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
|
|||
fc_host_max_npiv_vports(vha->host) = ha->max_npiv_vports;
|
||||
fc_host_npiv_vports_inuse(vha->host) = ha->cur_vport_count;
|
||||
|
||||
if (IS_QLA81XX(ha))
|
||||
if (IS_QLA8XXX_TYPE(ha))
|
||||
speed = FC_PORTSPEED_10GBIT;
|
||||
else if (IS_QLA25XX(ha))
|
||||
speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT |
|
||||
|
|
|
@ -769,6 +769,9 @@ qla24xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
|
|||
void *nxt;
|
||||
struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return;
|
||||
|
||||
risc_address = ext_mem_cnt = 0;
|
||||
flags = 0;
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <scsi/scsi_bsg_fc.h>
|
||||
|
||||
#include "qla_bsg.h"
|
||||
#include "qla_nx.h"
|
||||
#define QLA2XXX_DRIVER_NAME "qla2xxx"
|
||||
|
||||
/*
|
||||
|
@ -207,6 +208,7 @@ typedef struct srb {
|
|||
* SRB flag definitions
|
||||
*/
|
||||
#define SRB_DMA_VALID BIT_0 /* Command sent to ISP */
|
||||
#define SRB_FCP_CMND_DMA_VALID BIT_12 /* FCP command in IOCB */
|
||||
|
||||
/*
|
||||
* SRB extensions.
|
||||
|
@ -417,6 +419,7 @@ typedef union {
|
|||
struct device_reg_2xxx isp;
|
||||
struct device_reg_24xx isp24;
|
||||
struct device_reg_25xxmq isp25mq;
|
||||
struct device_reg_82xx isp82;
|
||||
} device_reg_t;
|
||||
|
||||
#define ISP_REQ_Q_IN(ha, reg) \
|
||||
|
@ -2112,6 +2115,7 @@ struct isp_operations {
|
|||
|
||||
int (*get_flash_version) (struct scsi_qla_host *, void *);
|
||||
int (*start_scsi) (srb_t *);
|
||||
int (*abort_isp) (struct scsi_qla_host *);
|
||||
};
|
||||
|
||||
/* MSI-X Support *************************************************************/
|
||||
|
@ -2386,7 +2390,8 @@ struct qla_hw_data {
|
|||
#define DT_ISP2532 BIT_11
|
||||
#define DT_ISP8432 BIT_12
|
||||
#define DT_ISP8001 BIT_13
|
||||
#define DT_ISP_LAST (DT_ISP8001 << 1)
|
||||
#define DT_ISP8021 BIT_14
|
||||
#define DT_ISP_LAST (DT_ISP8021 << 1)
|
||||
|
||||
#define DT_IIDMA BIT_26
|
||||
#define DT_FWI2 BIT_27
|
||||
|
@ -2409,6 +2414,7 @@ struct qla_hw_data {
|
|||
#define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532)
|
||||
#define IS_QLA8432(ha) (DT_MASK(ha) & DT_ISP8432)
|
||||
#define IS_QLA8001(ha) (DT_MASK(ha) & DT_ISP8001)
|
||||
#define IS_QLA82XX(ha) (DT_MASK(ha) & DT_ISP8021)
|
||||
|
||||
#define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \
|
||||
IS_QLA6312(ha) || IS_QLA6322(ha))
|
||||
|
@ -2419,8 +2425,10 @@ struct qla_hw_data {
|
|||
#define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \
|
||||
IS_QLA84XX(ha))
|
||||
#define IS_QLA81XX(ha) (IS_QLA8001(ha))
|
||||
#define IS_QLA8XXX_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA82XX(ha))
|
||||
#define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \
|
||||
IS_QLA25XX(ha) || IS_QLA81XX(ha))
|
||||
IS_QLA25XX(ha) || IS_QLA81XX(ha) || \
|
||||
IS_QLA82XX(ha))
|
||||
#define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha))
|
||||
#define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha)) && \
|
||||
(ha)->flags.msix_enabled)
|
||||
|
@ -2603,6 +2611,7 @@ struct qla_hw_data {
|
|||
uint32_t flt_region_npiv_conf;
|
||||
uint32_t flt_region_gold_fw;
|
||||
uint32_t flt_region_fcp_prio;
|
||||
uint32_t flt_region_bootload;
|
||||
|
||||
/* Needed for BEACON */
|
||||
uint16_t beacon_blink_led;
|
||||
|
@ -2634,6 +2643,38 @@ struct qla_hw_data {
|
|||
|
||||
/* FCP_CMND priority support */
|
||||
struct qla_fcp_prio_cfg *fcp_prio_cfg;
|
||||
|
||||
struct dma_pool *dl_dma_pool;
|
||||
#define DSD_LIST_DMA_POOL_SIZE 512
|
||||
|
||||
struct dma_pool *fcp_cmnd_dma_pool;
|
||||
mempool_t *ctx_mempool;
|
||||
#define FCP_CMND_DMA_POOL_SIZE 512
|
||||
|
||||
unsigned long nx_pcibase; /* Base I/O address */
|
||||
uint8_t *nxdb_rd_ptr; /* Doorbell read pointer */
|
||||
unsigned long nxdb_wr_ptr; /* Door bell write pointer */
|
||||
unsigned long first_page_group_start;
|
||||
unsigned long first_page_group_end;
|
||||
|
||||
uint32_t crb_win;
|
||||
uint32_t curr_window;
|
||||
uint32_t ddr_mn_window;
|
||||
unsigned long mn_win_crb;
|
||||
unsigned long ms_win_crb;
|
||||
int qdr_sn_window;
|
||||
uint32_t nx_dev_init_timeout;
|
||||
uint32_t nx_reset_timeout;
|
||||
rwlock_t hw_lock;
|
||||
uint16_t portnum; /* port number */
|
||||
int link_width;
|
||||
struct fw_blob *hablob;
|
||||
struct qla82xx_legacy_intr_set nx_legacy_intr;
|
||||
|
||||
uint16_t gbl_dsd_inuse;
|
||||
uint16_t gbl_dsd_avail;
|
||||
struct list_head gbl_dsd_list;
|
||||
#define NUM_DSD_CHAIN 4096
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -2686,10 +2727,13 @@ typedef struct scsi_qla_host {
|
|||
#define VP_DPC_NEEDED 14 /* wake up for VP dpc handling */
|
||||
#define UNLOADING 15
|
||||
#define NPIV_CONFIG_NEEDED 16
|
||||
#define ISP_UNRECOVERABLE 17
|
||||
#define FCOE_CTX_RESET_NEEDED 18 /* Initiate FCoE context reset */
|
||||
|
||||
uint32_t device_flags;
|
||||
#define SWITCH_FOUND BIT_0
|
||||
#define DFLG_NO_CABLE BIT_1
|
||||
#define DFLG_DEV_FAILED BIT_5
|
||||
|
||||
/* ISP configuration data. */
|
||||
uint16_t loop_id; /* Host adapter loop id */
|
||||
|
@ -2747,6 +2791,8 @@ typedef struct scsi_qla_host {
|
|||
#define VP_ERR_ADAP_NORESOURCES 5
|
||||
struct qla_hw_data *hw;
|
||||
struct req_que *req;
|
||||
int fw_heartbeat_counter;
|
||||
int seconds_since_last_heartbeat;
|
||||
} scsi_qla_host_t;
|
||||
|
||||
/*
|
||||
|
@ -2799,6 +2845,10 @@ typedef struct scsi_qla_host {
|
|||
#define OPTROM_SIZE_24XX 0x100000
|
||||
#define OPTROM_SIZE_25XX 0x200000
|
||||
#define OPTROM_SIZE_81XX 0x400000
|
||||
#define OPTROM_SIZE_82XX 0x800000
|
||||
|
||||
#define OPTROM_BURST_SIZE 0x1000
|
||||
#define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4)
|
||||
|
||||
#include "qla_gbl.h"
|
||||
#include "qla_dbg.h"
|
||||
|
|
|
@ -44,6 +44,7 @@ extern int qla2x00_local_device_login(scsi_qla_host_t *, fc_port_t *);
|
|||
extern void qla2x00_update_fcports(scsi_qla_host_t *);
|
||||
|
||||
extern int qla2x00_abort_isp(scsi_qla_host_t *);
|
||||
extern void qla2x00_abort_isp_cleanup(scsi_qla_host_t *);
|
||||
|
||||
extern void qla2x00_update_fcport(scsi_qla_host_t *, fc_port_t *);
|
||||
|
||||
|
@ -79,6 +80,9 @@ extern int ql2xmaxqueues;
|
|||
extern int ql2xmultique_tag;
|
||||
extern int ql2xfwloadbin;
|
||||
extern int ql2xetsenable;
|
||||
extern int ql2xshiftctondsd;
|
||||
extern int ql2xdbwr;
|
||||
extern int ql2xdontresethba;
|
||||
|
||||
extern int qla2x00_loop_reset(scsi_qla_host_t *);
|
||||
extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int);
|
||||
|
@ -135,6 +139,7 @@ extern struct fw_blob *qla2x00_request_firmware(scsi_qla_host_t *);
|
|||
|
||||
extern int qla2x00_wait_for_hba_online(scsi_qla_host_t *);
|
||||
extern int qla2x00_wait_for_chip_reset(scsi_qla_host_t *);
|
||||
extern int qla2x00_wait_for_fcoe_ctx_reset(scsi_qla_host_t *);
|
||||
|
||||
extern void qla2xxx_wake_dpc(struct scsi_qla_host *);
|
||||
extern void qla2x00_alert_all_vps(struct rsp_que *, uint16_t *);
|
||||
|
@ -157,6 +162,9 @@ int __qla2x00_marker(struct scsi_qla_host *, struct req_que *, struct rsp_que *,
|
|||
uint16_t, uint16_t, uint8_t);
|
||||
extern int qla2x00_start_sp(srb_t *);
|
||||
extern void qla2x00_ctx_sp_free(srb_t *);
|
||||
extern uint16_t qla24xx_calc_iocbs(uint16_t);
|
||||
extern void qla24xx_build_scsi_iocbs(srb_t *, struct cmd_type_7 *, uint16_t);
|
||||
|
||||
|
||||
/*
|
||||
* Global Function Prototypes in qla_mbx.c source file.
|
||||
|
@ -343,6 +351,7 @@ qla24xx_process_response_queue(struct scsi_qla_host *, struct rsp_que *);
|
|||
extern int qla2x00_request_irqs(struct qla_hw_data *, struct rsp_que *);
|
||||
extern void qla2x00_free_irqs(scsi_qla_host_t *);
|
||||
|
||||
extern int qla2x00_get_data_rate(scsi_qla_host_t *);
|
||||
/*
|
||||
* Global Function Prototypes in qla_sup.c source file.
|
||||
*/
|
||||
|
@ -466,6 +475,82 @@ extern void qla25xx_wrt_req_reg(struct qla_hw_data *, uint16_t, uint16_t);
|
|||
extern void qla25xx_wrt_rsp_reg(struct qla_hw_data *, uint16_t, uint16_t);
|
||||
extern void qla24xx_wrt_rsp_reg(struct qla_hw_data *, uint16_t, uint16_t);
|
||||
|
||||
/* qla82xx related functions */
|
||||
|
||||
/* PCI related functions */
|
||||
extern int qla82xx_pci_config(struct scsi_qla_host *);
|
||||
extern int qla82xx_pci_mem_read_2M(struct qla_hw_data *, u64, void *, int);
|
||||
extern int qla82xx_pci_mem_write_2M(struct qla_hw_data *, u64, void *, int);
|
||||
extern char *qla82xx_pci_info_str(struct scsi_qla_host *, char *);
|
||||
extern int qla82xx_pci_region_offset(struct pci_dev *, int);
|
||||
extern int qla82xx_pci_region_len(struct pci_dev *, int);
|
||||
extern int qla82xx_iospace_config(struct qla_hw_data *);
|
||||
|
||||
/* Initialization related functions */
|
||||
extern void qla82xx_reset_chip(struct scsi_qla_host *);
|
||||
extern void qla82xx_config_rings(struct scsi_qla_host *);
|
||||
extern int qla82xx_nvram_config(struct scsi_qla_host *);
|
||||
extern int qla82xx_pinit_from_rom(scsi_qla_host_t *);
|
||||
extern int qla82xx_load_firmware(scsi_qla_host_t *);
|
||||
extern int qla82xx_reset_hw(scsi_qla_host_t *);
|
||||
extern int qla82xx_load_risc_blob(scsi_qla_host_t *, uint32_t *);
|
||||
extern void qla82xx_watchdog(scsi_qla_host_t *);
|
||||
|
||||
/* Firmware and flash related functions */
|
||||
extern int qla82xx_load_risc(scsi_qla_host_t *, uint32_t *);
|
||||
extern uint8_t *qla82xx_read_optrom_data(struct scsi_qla_host *, uint8_t *,
|
||||
uint32_t, uint32_t);
|
||||
extern int qla82xx_write_optrom_data(struct scsi_qla_host *, uint8_t *,
|
||||
uint32_t, uint32_t);
|
||||
|
||||
/* Mailbox related functions */
|
||||
extern int qla82xx_abort_isp(scsi_qla_host_t *);
|
||||
extern int qla82xx_restart_isp(scsi_qla_host_t *);
|
||||
|
||||
/* IOCB related functions */
|
||||
extern int qla82xx_start_scsi(srb_t *);
|
||||
|
||||
/* Interrupt related */
|
||||
extern irqreturn_t qla82xx_intr_handler(int, void *);
|
||||
extern irqreturn_t qla82xx_msi_handler(int, void *);
|
||||
extern irqreturn_t qla82xx_msix_default(int, void *);
|
||||
extern irqreturn_t qla82xx_msix_rsp_q(int, void *);
|
||||
extern void qla82xx_enable_intrs(struct qla_hw_data *);
|
||||
extern void qla82xx_disable_intrs(struct qla_hw_data *);
|
||||
extern void qla82xx_mbx_completion(scsi_qla_host_t *, uint16_t);
|
||||
extern void qla82xx_poll(int, void *);
|
||||
extern void qla82xx_init_flags(struct qla_hw_data *);
|
||||
|
||||
/* ISP 8021 hardware related */
|
||||
extern int qla82xx_crb_win_lock(struct qla_hw_data *);
|
||||
extern void qla82xx_crb_win_unlock(struct qla_hw_data *);
|
||||
extern int qla82xx_pci_get_crb_addr_2M(struct qla_hw_data *, ulong *);
|
||||
extern int qla82xx_wr_32(struct qla_hw_data *, ulong, u32);
|
||||
extern int qla82xx_rd_32(struct qla_hw_data *, ulong);
|
||||
extern int qla82xx_rdmem(struct qla_hw_data *, u64, void *, int);
|
||||
extern int qla82xx_wrmem(struct qla_hw_data *, u64, void *, int);
|
||||
extern int qla82xx_check_for_bad_spd(struct qla_hw_data *);
|
||||
extern int qla82xx_load_fw(scsi_qla_host_t *);
|
||||
extern int qla82xx_rom_lock(struct qla_hw_data *);
|
||||
extern void qla82xx_rom_unlock(struct qla_hw_data *);
|
||||
extern int qla82xx_rom_fast_read(struct qla_hw_data *, int , int *);
|
||||
extern int qla82xx_do_rom_fast_read(struct qla_hw_data *, int, int *);
|
||||
extern unsigned long qla82xx_decode_crb_addr(unsigned long);
|
||||
|
||||
/* ISP 8021 IDC */
|
||||
extern void qla82xx_clear_drv_active(struct qla_hw_data *);
|
||||
extern int qla82xx_idc_lock(struct qla_hw_data *);
|
||||
extern void qla82xx_idc_unlock(struct qla_hw_data *);
|
||||
extern int qla82xx_device_state_handler(scsi_qla_host_t *);
|
||||
|
||||
extern void qla2x00_set_model_info(scsi_qla_host_t *, uint8_t *,
|
||||
size_t, char *);
|
||||
extern int qla82xx_mbx_intr_enable(scsi_qla_host_t *);
|
||||
extern int qla82xx_mbx_intr_disable(scsi_qla_host_t *);
|
||||
extern void qla82xx_start_iocbs(srb_t *);
|
||||
extern int qla82xx_fcoe_ctx_reset(scsi_qla_host_t *);
|
||||
extern void qla82xx_wait_for_pending_commands(scsi_qla_host_t *);
|
||||
|
||||
/* BSG related functions */
|
||||
extern int qla24xx_bsg_request(struct fc_bsg_job *);
|
||||
extern int qla24xx_bsg_timeout(struct fc_bsg_job *);
|
||||
|
|
|
@ -1535,7 +1535,7 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha)
|
|||
eiter = (struct ct_fdmi_port_attr *) (entries + size);
|
||||
eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED);
|
||||
eiter->len = __constant_cpu_to_be16(4 + 4);
|
||||
if (IS_QLA81XX(ha))
|
||||
if (IS_QLA8XXX_TYPE(ha))
|
||||
eiter->a.sup_speed = __constant_cpu_to_be32(
|
||||
FDMI_PORT_SPEED_10GB);
|
||||
else if (IS_QLA25XX(ha))
|
||||
|
|
|
@ -328,6 +328,7 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha)
|
|||
if (rval)
|
||||
return (rval);
|
||||
}
|
||||
|
||||
if (IS_QLA84XX(ha)) {
|
||||
ha->cs84xx = qla84xx_get_chip(vha);
|
||||
if (!ha->cs84xx) {
|
||||
|
@ -961,6 +962,9 @@ qla24xx_chip_diag(scsi_qla_host_t *vha)
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
struct req_que *req = ha->req_q_map[0];
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return QLA_SUCCESS;
|
||||
|
||||
ha->fw_transfer_size = REQUEST_ENTRY_SIZE * req->length;
|
||||
|
||||
rval = qla2x00_mbx_reg_test(vha);
|
||||
|
@ -1183,6 +1187,12 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
|
|||
unsigned long flags;
|
||||
uint16_t fw_major_version;
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
rval = ha->isp_ops->load_risc(vha, &srisc_address);
|
||||
if (rval == QLA_SUCCESS)
|
||||
goto enable_82xx_npiv;
|
||||
}
|
||||
|
||||
if (!IS_FWI2_CAPABLE(ha) && !IS_QLA2100(ha) && !IS_QLA2200(ha)) {
|
||||
/* Disable SRAM, Instruction RAM and GP RAM parity. */
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
@ -1208,6 +1218,7 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
|
|||
rval = qla2x00_execute_fw(vha, srisc_address);
|
||||
/* Retrieve firmware information. */
|
||||
if (rval == QLA_SUCCESS) {
|
||||
enable_82xx_npiv:
|
||||
fw_major_version = ha->fw_major_version;
|
||||
rval = qla2x00_get_fw_version(vha,
|
||||
&ha->fw_major_version,
|
||||
|
@ -1232,8 +1243,10 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
|
|||
&ha->fw_xcb_count, NULL, NULL,
|
||||
&ha->max_npiv_vports, NULL);
|
||||
|
||||
if (!fw_major_version && ql2xallocfwdump)
|
||||
qla2x00_alloc_fw_dump(vha);
|
||||
if (!fw_major_version && ql2xallocfwdump) {
|
||||
if (!IS_QLA82XX(ha))
|
||||
qla2x00_alloc_fw_dump(vha);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
DEBUG2(printk(KERN_INFO
|
||||
|
@ -1390,6 +1403,9 @@ qla24xx_update_fw_options(scsi_qla_host_t *vha)
|
|||
int rval;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return;
|
||||
|
||||
/* Update Serial Link options. */
|
||||
if ((le16_to_cpu(ha->fw_seriallink_options24[0]) & BIT_0) == 0)
|
||||
return;
|
||||
|
@ -1824,7 +1840,7 @@ qla2x00_configure_hba(scsi_qla_host_t *vha)
|
|||
return(rval);
|
||||
}
|
||||
|
||||
static inline void
|
||||
inline void
|
||||
qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len,
|
||||
char *def)
|
||||
{
|
||||
|
@ -1832,7 +1848,7 @@ qla2x00_set_model_info(scsi_qla_host_t *vha, uint8_t *model, size_t len,
|
|||
uint16_t index;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
int use_tbl = !IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) &&
|
||||
!IS_QLA81XX(ha);
|
||||
!IS_QLA8XXX_TYPE(ha);
|
||||
|
||||
if (memcmp(model, BINZERO, len) != 0) {
|
||||
strncpy(ha->model_number, model, len);
|
||||
|
@ -3552,6 +3568,45 @@ qla2x00_update_fcports(scsi_qla_host_t *base_vha)
|
|||
qla2x00_rport_del(fcport);
|
||||
}
|
||||
|
||||
void
|
||||
qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
|
||||
{
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
struct scsi_qla_host *vp, *base_vha = pci_get_drvdata(ha->pdev);
|
||||
struct scsi_qla_host *tvp;
|
||||
|
||||
vha->flags.online = 0;
|
||||
ha->flags.chip_reset_done = 0;
|
||||
clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
ha->qla_stats.total_isp_aborts++;
|
||||
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"Performing ISP error recovery - ha= %p.\n", ha);
|
||||
|
||||
/* Chip reset does not apply to 82XX */
|
||||
if (!IS_QLA82XX(ha))
|
||||
ha->isp_ops->reset_chip(vha);
|
||||
|
||||
atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
|
||||
if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
|
||||
atomic_set(&vha->loop_state, LOOP_DOWN);
|
||||
qla2x00_mark_all_devices_lost(vha, 0);
|
||||
list_for_each_entry_safe(vp, tvp, &base_vha->hw->vp_list, list)
|
||||
qla2x00_mark_all_devices_lost(vp, 0);
|
||||
} else {
|
||||
if (!atomic_read(&vha->loop_down_timer))
|
||||
atomic_set(&vha->loop_down_timer,
|
||||
LOOP_DOWN_TIME);
|
||||
}
|
||||
|
||||
/* Make sure for ISP 82XX IO DMA is complete */
|
||||
if (IS_QLA82XX(ha))
|
||||
qla82xx_wait_for_pending_commands(vha);
|
||||
|
||||
/* Requeue all commands in outstanding command list. */
|
||||
qla2x00_abort_all_cmds(vha, DID_RESET << 16);
|
||||
}
|
||||
|
||||
/*
|
||||
* qla2x00_abort_isp
|
||||
* Resets ISP and aborts all outstanding commands.
|
||||
|
@ -3573,27 +3628,7 @@ qla2x00_abort_isp(scsi_qla_host_t *vha)
|
|||
struct req_que *req = ha->req_q_map[0];
|
||||
|
||||
if (vha->flags.online) {
|
||||
vha->flags.online = 0;
|
||||
ha->flags.chip_reset_done = 0;
|
||||
clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
ha->qla_stats.total_isp_aborts++;
|
||||
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"Performing ISP error recovery - ha= %p.\n", ha);
|
||||
ha->isp_ops->reset_chip(vha);
|
||||
|
||||
atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
|
||||
if (atomic_read(&vha->loop_state) != LOOP_DOWN) {
|
||||
atomic_set(&vha->loop_state, LOOP_DOWN);
|
||||
qla2x00_mark_all_devices_lost(vha, 0);
|
||||
} else {
|
||||
if (!atomic_read(&vha->loop_down_timer))
|
||||
atomic_set(&vha->loop_down_timer,
|
||||
LOOP_DOWN_TIME);
|
||||
}
|
||||
|
||||
/* Requeue all commands in outstanding command list. */
|
||||
qla2x00_abort_all_cmds(vha, DID_RESET << 16);
|
||||
qla2x00_abort_isp_cleanup(vha);
|
||||
|
||||
if (unlikely(pci_channel_offline(ha->pdev) &&
|
||||
ha->flags.pci_channel_io_perm_failure)) {
|
||||
|
@ -3849,6 +3884,9 @@ qla24xx_reset_adapter(scsi_qla_host_t *vha)
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return;
|
||||
|
||||
vha->flags.online = 0;
|
||||
ha->isp_ops->disable_intrs(ha);
|
||||
|
||||
|
@ -3912,6 +3950,8 @@ qla24xx_nvram_config(scsi_qla_host_t *vha)
|
|||
}
|
||||
ha->nvram_size = sizeof(struct nvram_24xx);
|
||||
ha->vpd_size = FA_NVRAM_VPD_SIZE;
|
||||
if (IS_QLA82XX(ha))
|
||||
ha->vpd_size = FA_VPD_SIZE_82XX;
|
||||
|
||||
/* Get VPD data into cache */
|
||||
ha->vpd = ha->nvram + VPD_OFFSET;
|
||||
|
@ -4775,7 +4815,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
|
|||
* Setup driver NVRAM options.
|
||||
*/
|
||||
qla2x00_set_model_info(vha, nv->model_name, sizeof(nv->model_name),
|
||||
"QLE81XX");
|
||||
"QLE8XXX");
|
||||
|
||||
/* Use alternate WWN? */
|
||||
if (nv->host_p & __constant_cpu_to_le32(BIT_15)) {
|
||||
|
@ -4898,6 +4938,147 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
|
|||
return (rval);
|
||||
}
|
||||
|
||||
int
|
||||
qla82xx_restart_isp(scsi_qla_host_t *vha)
|
||||
{
|
||||
int status, rval;
|
||||
uint32_t wait_time;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
struct req_que *req = ha->req_q_map[0];
|
||||
struct rsp_que *rsp = ha->rsp_q_map[0];
|
||||
struct scsi_qla_host *vp;
|
||||
struct scsi_qla_host *tvp;
|
||||
|
||||
status = qla2x00_init_rings(vha);
|
||||
if (!status) {
|
||||
clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
|
||||
ha->flags.chip_reset_done = 1;
|
||||
|
||||
status = qla2x00_fw_ready(vha);
|
||||
if (!status) {
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"%s(): Start configure loop, "
|
||||
"status = %d\n", __func__, status);
|
||||
|
||||
/* Issue a marker after FW becomes ready. */
|
||||
qla2x00_marker(vha, req, rsp, 0, 0, MK_SYNC_ALL);
|
||||
|
||||
vha->flags.online = 1;
|
||||
/* Wait at most MAX_TARGET RSCNs for a stable link. */
|
||||
wait_time = 256;
|
||||
do {
|
||||
clear_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
||||
qla2x00_configure_loop(vha);
|
||||
wait_time--;
|
||||
} while (!atomic_read(&vha->loop_down_timer) &&
|
||||
!(test_bit(ISP_ABORT_NEEDED, &vha->dpc_flags)) &&
|
||||
wait_time &&
|
||||
(test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags)));
|
||||
}
|
||||
|
||||
/* if no cable then assume it's good */
|
||||
if ((vha->device_flags & DFLG_NO_CABLE))
|
||||
status = 0;
|
||||
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"%s(): Configure loop done, status = 0x%x\n",
|
||||
__func__, status);
|
||||
}
|
||||
|
||||
if (!status) {
|
||||
clear_bit(RESET_MARKER_NEEDED, &vha->dpc_flags);
|
||||
|
||||
if (!atomic_read(&vha->loop_down_timer)) {
|
||||
/*
|
||||
* Issue marker command only when we are going
|
||||
* to start the I/O .
|
||||
*/
|
||||
vha->marker_needed = 1;
|
||||
}
|
||||
|
||||
vha->flags.online = 1;
|
||||
|
||||
ha->isp_ops->enable_intrs(ha);
|
||||
|
||||
ha->isp_abort_cnt = 0;
|
||||
clear_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
|
||||
|
||||
if (ha->fce) {
|
||||
ha->flags.fce_enabled = 1;
|
||||
memset(ha->fce, 0,
|
||||
fce_calc_size(ha->fce_bufs));
|
||||
rval = qla2x00_enable_fce_trace(vha,
|
||||
ha->fce_dma, ha->fce_bufs, ha->fce_mb,
|
||||
&ha->fce_bufs);
|
||||
if (rval) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"Unable to reinitialize FCE "
|
||||
"(%d).\n", rval);
|
||||
ha->flags.fce_enabled = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (ha->eft) {
|
||||
memset(ha->eft, 0, EFT_SIZE);
|
||||
rval = qla2x00_enable_eft_trace(vha,
|
||||
ha->eft_dma, EFT_NUM_BUFFERS);
|
||||
if (rval) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"Unable to reinitialize EFT "
|
||||
"(%d).\n", rval);
|
||||
}
|
||||
}
|
||||
} else { /* failed the ISP abort */
|
||||
vha->flags.online = 1;
|
||||
if (test_bit(ISP_ABORT_RETRY, &vha->dpc_flags)) {
|
||||
if (ha->isp_abort_cnt == 0) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"ISP error recovery failed - "
|
||||
"board disabled\n");
|
||||
/*
|
||||
* The next call disables the board
|
||||
* completely.
|
||||
*/
|
||||
ha->isp_ops->reset_adapter(vha);
|
||||
vha->flags.online = 0;
|
||||
clear_bit(ISP_ABORT_RETRY,
|
||||
&vha->dpc_flags);
|
||||
status = 0;
|
||||
} else { /* schedule another ISP abort */
|
||||
ha->isp_abort_cnt--;
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"qla%ld: ISP abort - "
|
||||
"retry remaining %d\n",
|
||||
vha->host_no, ha->isp_abort_cnt);
|
||||
status = 1;
|
||||
}
|
||||
} else {
|
||||
ha->isp_abort_cnt = MAX_RETRIES_OF_ISP_ABORT;
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"(%ld): ISP error recovery "
|
||||
"- retrying (%d) more times\n",
|
||||
vha->host_no, ha->isp_abort_cnt);
|
||||
set_bit(ISP_ABORT_RETRY, &vha->dpc_flags);
|
||||
status = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!status) {
|
||||
DEBUG(printk(KERN_INFO
|
||||
"qla82xx_restart_isp(%ld): succeeded.\n",
|
||||
vha->host_no));
|
||||
list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) {
|
||||
if (vp->vp_idx)
|
||||
qla2x00_vp_abort_isp(vp);
|
||||
}
|
||||
} else {
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"qla82xx_restart_isp: **** FAILED ****\n");
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
void
|
||||
qla81xx_update_fw_options(scsi_qla_host_t *vha)
|
||||
{
|
||||
|
|
|
@ -37,7 +37,10 @@ qla2x00_poll(struct rsp_que *rsp)
|
|||
unsigned long flags;
|
||||
struct qla_hw_data *ha = rsp->hw;
|
||||
local_irq_save(flags);
|
||||
ha->isp_ops->intr_handler(0, rsp);
|
||||
if (IS_QLA82XX(ha))
|
||||
qla82xx_poll(0, rsp);
|
||||
else
|
||||
ha->isp_ops->intr_handler(0, rsp);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
|
|
|
@ -506,7 +506,10 @@ qla2x00_req_pkt(struct scsi_qla_host *vha, struct req_que *req,
|
|||
cnt = (uint16_t)
|
||||
RD_REG_DWORD(®->isp25mq.req_q_out);
|
||||
else {
|
||||
if (IS_FWI2_CAPABLE(ha))
|
||||
if (IS_QLA82XX(ha))
|
||||
cnt = (uint16_t)RD_REG_DWORD(
|
||||
®->isp82.req_q_out);
|
||||
else if (IS_FWI2_CAPABLE(ha))
|
||||
cnt = (uint16_t)RD_REG_DWORD(
|
||||
®->isp24.req_q_out);
|
||||
else
|
||||
|
@ -579,11 +582,29 @@ qla2x00_isp_cmd(struct scsi_qla_host *vha, struct req_que *req)
|
|||
req->ring_ptr++;
|
||||
|
||||
/* Set chip new ring index. */
|
||||
if (ha->mqenable) {
|
||||
if (IS_QLA82XX(ha)) {
|
||||
uint32_t dbval = 0x04 | (ha->portnum << 5);
|
||||
|
||||
/* write, read and verify logic */
|
||||
dbval = dbval | (req->id << 8) | (req->ring_index << 16);
|
||||
if (ql2xdbwr)
|
||||
qla82xx_wr_32(ha, ha->nxdb_wr_ptr, dbval);
|
||||
else {
|
||||
WRT_REG_DWORD(
|
||||
(unsigned long __iomem *)ha->nxdb_wr_ptr,
|
||||
dbval);
|
||||
wmb();
|
||||
while (RD_REG_DWORD(ha->nxdb_rd_ptr) != dbval) {
|
||||
WRT_REG_DWORD((unsigned long __iomem *)
|
||||
ha->nxdb_wr_ptr, dbval);
|
||||
wmb();
|
||||
}
|
||||
}
|
||||
} else if (ha->mqenable) {
|
||||
/* Set chip new ring index. */
|
||||
WRT_REG_DWORD(®->isp25mq.req_q_in, req->ring_index);
|
||||
RD_REG_DWORD(&ioreg->hccr);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if (IS_FWI2_CAPABLE(ha)) {
|
||||
WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index);
|
||||
RD_REG_DWORD_RELAXED(®->isp24.req_q_in);
|
||||
|
@ -604,7 +625,7 @@ qla2x00_isp_cmd(struct scsi_qla_host *vha, struct req_que *req)
|
|||
*
|
||||
* Returns the number of IOCB entries needed to store @dsds.
|
||||
*/
|
||||
static inline uint16_t
|
||||
inline uint16_t
|
||||
qla24xx_calc_iocbs(uint16_t dsds)
|
||||
{
|
||||
uint16_t iocbs;
|
||||
|
@ -626,7 +647,7 @@ qla24xx_calc_iocbs(uint16_t dsds)
|
|||
* @cmd_pkt: Command type 3 IOCB
|
||||
* @tot_dsds: Total number of segments to transfer
|
||||
*/
|
||||
static inline void
|
||||
inline void
|
||||
qla24xx_build_scsi_iocbs(srb_t *sp, struct cmd_type_7 *cmd_pkt,
|
||||
uint16_t tot_dsds)
|
||||
{
|
||||
|
@ -931,24 +952,31 @@ qla2x00_start_iocbs(srb_t *sp)
|
|||
device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id);
|
||||
struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp;
|
||||
|
||||
/* Adjust ring index. */
|
||||
req->ring_index++;
|
||||
if (req->ring_index == req->length) {
|
||||
req->ring_index = 0;
|
||||
req->ring_ptr = req->ring;
|
||||
} else
|
||||
req->ring_ptr++;
|
||||
|
||||
/* Set chip new ring index. */
|
||||
if (ha->mqenable) {
|
||||
WRT_REG_DWORD(®->isp25mq.req_q_in, req->ring_index);
|
||||
RD_REG_DWORD(&ioreg->hccr);
|
||||
} else if (IS_FWI2_CAPABLE(ha)) {
|
||||
WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index);
|
||||
RD_REG_DWORD_RELAXED(®->isp24.req_q_in);
|
||||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_start_iocbs(sp);
|
||||
} else {
|
||||
WRT_REG_WORD(ISP_REQ_Q_IN(ha, ®->isp), req->ring_index);
|
||||
RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, ®->isp));
|
||||
/* Adjust ring index. */
|
||||
req->ring_index++;
|
||||
if (req->ring_index == req->length) {
|
||||
req->ring_index = 0;
|
||||
req->ring_ptr = req->ring;
|
||||
} else
|
||||
req->ring_ptr++;
|
||||
|
||||
/* Set chip new ring index. */
|
||||
if (ha->mqenable) {
|
||||
WRT_REG_DWORD(®->isp25mq.req_q_in, req->ring_index);
|
||||
RD_REG_DWORD(&ioreg->hccr);
|
||||
} else if (IS_QLA82XX(ha)) {
|
||||
qla82xx_start_iocbs(sp);
|
||||
} else if (IS_FWI2_CAPABLE(ha)) {
|
||||
WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index);
|
||||
RD_REG_DWORD_RELAXED(®->isp24.req_q_in);
|
||||
} else {
|
||||
WRT_REG_WORD(ISP_REQ_Q_IN(ha, ®->isp),
|
||||
req->ring_index);
|
||||
RD_REG_WORD_RELAXED(ISP_REQ_Q_IN(ha, ®->isp));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -326,7 +326,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
|
|||
|
||||
/* Setup to process RIO completion. */
|
||||
handle_cnt = 0;
|
||||
if (IS_QLA81XX(ha))
|
||||
if (IS_QLA8XXX_TYPE(ha))
|
||||
goto skip_rio;
|
||||
switch (mb[0]) {
|
||||
case MBA_SCSI_COMPLETION:
|
||||
|
@ -544,7 +544,7 @@ skip_rio:
|
|||
if (IS_QLA2100(ha))
|
||||
break;
|
||||
|
||||
if (IS_QLA81XX(ha))
|
||||
if (IS_QLA8XXX_TYPE(ha))
|
||||
DEBUG2(printk("scsi(%ld): DCBX Completed -- %04x %04x "
|
||||
"%04x\n", vha->host_no, mb[1], mb[2], mb[3]));
|
||||
else
|
||||
|
@ -845,7 +845,7 @@ qla2x00_process_completed_request(struct scsi_qla_host *vha,
|
|||
qla2x00_sp_compl(ha, sp);
|
||||
} else {
|
||||
DEBUG2(printk("scsi(%ld) Req:%d: Invalid ISP SCSI completion"
|
||||
" handle(%d)\n", vha->host_no, req->id, index));
|
||||
" handle(0x%x)\n", vha->host_no, req->id, index));
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"Invalid ISP SCSI completion handle\n");
|
||||
|
||||
|
@ -1337,6 +1337,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|||
handle = (uint32_t) LSW(sts->handle);
|
||||
que = MSW(sts->handle);
|
||||
req = ha->req_q_map[que];
|
||||
|
||||
/* Fast path completion. */
|
||||
if (comp_status == CS_COMPLETE && scsi_status == 0) {
|
||||
qla2x00_process_completed_request(vha, req, handle);
|
||||
|
@ -1806,6 +1807,7 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,
|
|||
struct rsp_que *rsp)
|
||||
{
|
||||
struct sts_entry_24xx *pkt;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (!vha->flags.online)
|
||||
return;
|
||||
|
@ -1866,7 +1868,11 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,
|
|||
}
|
||||
|
||||
/* Adjust ring index */
|
||||
WRT_REG_DWORD(rsp->rsp_q_out, rsp->ring_index);
|
||||
if (IS_QLA82XX(ha)) {
|
||||
struct device_reg_82xx __iomem *reg = &ha->iobase->isp82;
|
||||
WRT_REG_DWORD(®->rsp_q_out[0], rsp->ring_index);
|
||||
} else
|
||||
WRT_REG_DWORD(rsp->rsp_q_out, rsp->ring_index);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2169,6 +2175,11 @@ static struct qla_init_msix_entry msix_entries[3] = {
|
|||
{ "qla2xxx (multiq)", qla25xx_msix_rsp_q },
|
||||
};
|
||||
|
||||
static struct qla_init_msix_entry qla82xx_msix_entries[2] = {
|
||||
{ "qla2xxx (default)", qla82xx_msix_default },
|
||||
{ "qla2xxx (rsp_q)", qla82xx_msix_rsp_q },
|
||||
};
|
||||
|
||||
static void
|
||||
qla24xx_disable_msix(struct qla_hw_data *ha)
|
||||
{
|
||||
|
@ -2195,7 +2206,7 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
|
|||
struct qla_msix_entry *qentry;
|
||||
|
||||
entries = kzalloc(sizeof(struct msix_entry) * ha->msix_count,
|
||||
GFP_KERNEL);
|
||||
GFP_KERNEL);
|
||||
if (!entries)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -2240,8 +2251,15 @@ msix_failed:
|
|||
/* Enable MSI-X vectors for the base queue */
|
||||
for (i = 0; i < 2; i++) {
|
||||
qentry = &ha->msix_entries[i];
|
||||
ret = request_irq(qentry->vector, msix_entries[i].handler,
|
||||
0, msix_entries[i].name, rsp);
|
||||
if (IS_QLA82XX(ha)) {
|
||||
ret = request_irq(qentry->vector,
|
||||
qla82xx_msix_entries[i].handler,
|
||||
0, qla82xx_msix_entries[i].name, rsp);
|
||||
} else {
|
||||
ret = request_irq(qentry->vector,
|
||||
msix_entries[i].handler,
|
||||
0, msix_entries[i].name, rsp);
|
||||
}
|
||||
if (ret) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"MSI-X: Unable to register handler -- %x/%d.\n",
|
||||
|
@ -2272,7 +2290,7 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
|
|||
|
||||
/* If possible, enable MSI-X. */
|
||||
if (!IS_QLA2432(ha) && !IS_QLA2532(ha) &&
|
||||
!IS_QLA8432(ha) && !IS_QLA8001(ha))
|
||||
!IS_QLA8432(ha) && !IS_QLA8XXX_TYPE(ha))
|
||||
goto skip_msi;
|
||||
|
||||
if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
|
||||
|
@ -2302,7 +2320,7 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
|
|||
goto clear_risc_ints;
|
||||
}
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"MSI-X: Falling back-to INTa mode -- %d.\n", ret);
|
||||
"MSI-X: Falling back-to MSI mode -- %d.\n", ret);
|
||||
skip_msix:
|
||||
|
||||
if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) &&
|
||||
|
@ -2313,7 +2331,9 @@ skip_msix:
|
|||
if (!ret) {
|
||||
DEBUG2(qla_printk(KERN_INFO, ha, "MSI: Enabled.\n"));
|
||||
ha->flags.msi_enabled = 1;
|
||||
}
|
||||
} else
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"MSI-X: Falling back-to INTa mode -- %d.\n", ret);
|
||||
skip_msi:
|
||||
|
||||
ret = request_irq(ha->pdev->irq, ha->isp_ops->intr_handler,
|
||||
|
@ -2331,7 +2351,7 @@ clear_risc_ints:
|
|||
* FIXME: Noted that 8014s were being dropped during NK testing.
|
||||
* Timing deltas during MSI-X/INTa transitions?
|
||||
*/
|
||||
if (IS_QLA81XX(ha))
|
||||
if (IS_QLA81XX(ha) || IS_QLA82XX(ha))
|
||||
goto fail;
|
||||
spin_lock_irq(&ha->hardware_lock);
|
||||
if (IS_FWI2_CAPABLE(ha)) {
|
||||
|
|
|
@ -49,6 +49,14 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
if (ha->pdev->error_state > pci_channel_io_frozen)
|
||||
return QLA_FUNCTION_TIMEOUT;
|
||||
|
||||
if (vha->device_flags & DFLG_DEV_FAILED) {
|
||||
DEBUG2_3_11(qla_printk(KERN_WARNING, ha,
|
||||
"%s(%ld): Device in failed state, "
|
||||
"timeout MBX Exiting.\n",
|
||||
__func__, base_vha->host_no));
|
||||
return QLA_FUNCTION_TIMEOUT;
|
||||
}
|
||||
|
||||
reg = ha->iobase;
|
||||
io_lock_on = base_vha->flags.init_done;
|
||||
|
||||
|
@ -85,7 +93,9 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
||||
/* Load mailbox registers. */
|
||||
if (IS_FWI2_CAPABLE(ha))
|
||||
if (IS_QLA82XX(ha))
|
||||
optr = (uint16_t __iomem *)®->isp82.mailbox_in[0];
|
||||
else if (IS_FWI2_CAPABLE(ha) && !IS_QLA82XX(ha))
|
||||
optr = (uint16_t __iomem *)®->isp24.mailbox0;
|
||||
else
|
||||
optr = (uint16_t __iomem *)MAILBOX_REG(ha, ®->isp, 0);
|
||||
|
@ -133,7 +143,18 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
if ((!abort_active && io_lock_on) || IS_NOPOLLING_TYPE(ha)) {
|
||||
set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags);
|
||||
|
||||
if (IS_FWI2_CAPABLE(ha))
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (RD_REG_DWORD(®->isp82.hint) &
|
||||
HINT_MBX_INT_PENDING) {
|
||||
spin_unlock_irqrestore(&ha->hardware_lock,
|
||||
flags);
|
||||
DEBUG2_3_11(printk(KERN_INFO
|
||||
"%s(%ld): Pending Mailbox timeout. "
|
||||
"Exiting.\n", __func__, base_vha->host_no));
|
||||
return QLA_FUNCTION_TIMEOUT;
|
||||
}
|
||||
WRT_REG_DWORD(®->isp82.hint, HINT_MBX_INT_PENDING);
|
||||
} else if (IS_FWI2_CAPABLE(ha))
|
||||
WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT);
|
||||
else
|
||||
WRT_REG_WORD(®->isp.hccr, HCCR_SET_HOST_INT);
|
||||
|
@ -147,7 +168,18 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
DEBUG3_11(printk("%s(%ld): cmd=%x POLLING MODE.\n", __func__,
|
||||
base_vha->host_no, command));
|
||||
|
||||
if (IS_FWI2_CAPABLE(ha))
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (RD_REG_DWORD(®->isp82.hint) &
|
||||
HINT_MBX_INT_PENDING) {
|
||||
spin_unlock_irqrestore(&ha->hardware_lock,
|
||||
flags);
|
||||
DEBUG2_3_11(printk(KERN_INFO
|
||||
"%s(%ld): Pending Mailbox timeout. "
|
||||
"Exiting.\n", __func__, base_vha->host_no));
|
||||
return QLA_FUNCTION_TIMEOUT;
|
||||
}
|
||||
WRT_REG_DWORD(®->isp82.hint, HINT_MBX_INT_PENDING);
|
||||
} else if (IS_FWI2_CAPABLE(ha))
|
||||
WRT_REG_DWORD(®->isp24.hccr, HCCRX_SET_HOST_INT);
|
||||
else
|
||||
WRT_REG_WORD(®->isp.hccr, HCCR_SET_HOST_INT);
|
||||
|
@ -264,7 +296,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
|
||||
set_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
|
||||
clear_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags);
|
||||
if (qla2x00_abort_isp(base_vha)) {
|
||||
if (ha->isp_ops->abort_isp(base_vha)) {
|
||||
/* Failed. retry later. */
|
||||
set_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags);
|
||||
}
|
||||
|
@ -952,7 +984,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa,
|
|||
mcp->mb[9] = vha->vp_idx;
|
||||
mcp->out_mb = MBX_9|MBX_0;
|
||||
mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
|
||||
if (IS_QLA81XX(vha->hw))
|
||||
if (IS_QLA8XXX_TYPE(vha->hw))
|
||||
mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->flags = 0;
|
||||
|
@ -978,7 +1010,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa,
|
|||
DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n",
|
||||
vha->host_no));
|
||||
|
||||
if (IS_QLA81XX(vha->hw)) {
|
||||
if (IS_QLA8XXX_TYPE(vha->hw)) {
|
||||
vha->fcoe_vlan_id = mcp->mb[9] & 0xfff;
|
||||
vha->fcoe_fcf_idx = mcp->mb[10];
|
||||
vha->fcoe_vn_port_mac[5] = mcp->mb[11] >> 8;
|
||||
|
@ -1076,6 +1108,10 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size)
|
|||
DEBUG11(printk("qla2x00_init_firmware(%ld): entered.\n",
|
||||
vha->host_no));
|
||||
|
||||
if (IS_QLA82XX(ha) && ql2xdbwr)
|
||||
qla82xx_wr_32(ha, ha->nxdb_wr_ptr,
|
||||
(0x04 | (ha->portnum << 5) | (0 << 8) | (0 << 16)));
|
||||
|
||||
if (ha->flags.npiv_supported)
|
||||
mcp->mb[0] = MBC_MID_INITIALIZE_FIRMWARE;
|
||||
else
|
||||
|
@ -1408,7 +1444,7 @@ qla2x00_lip_reset(scsi_qla_host_t *vha)
|
|||
|
||||
DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
|
||||
|
||||
if (IS_QLA81XX(vha->hw)) {
|
||||
if (IS_QLA8XXX_TYPE(vha->hw)) {
|
||||
/* Logout across all FCFs. */
|
||||
mcp->mb[0] = MBC_LIP_FULL_LOGIN;
|
||||
mcp->mb[1] = BIT_1;
|
||||
|
@ -2797,7 +2833,7 @@ qla2x00_set_idma_speed(scsi_qla_host_t *vha, uint16_t loop_id,
|
|||
mcp->mb[0] = MBC_PORT_PARAMS;
|
||||
mcp->mb[1] = loop_id;
|
||||
mcp->mb[2] = BIT_0;
|
||||
if (IS_QLA81XX(vha->hw))
|
||||
if (IS_QLA8XXX_TYPE(vha->hw))
|
||||
mcp->mb[3] = port_speed & (BIT_5|BIT_4|BIT_3|BIT_2|BIT_1|BIT_0);
|
||||
else
|
||||
mcp->mb[3] = port_speed & (BIT_2|BIT_1|BIT_0);
|
||||
|
@ -3586,7 +3622,7 @@ qla2x00_get_xgmac_stats(scsi_qla_host_t *vha, dma_addr_t stats_dma,
|
|||
mbx_cmd_t mc;
|
||||
mbx_cmd_t *mcp = &mc;
|
||||
|
||||
if (!IS_QLA81XX(vha->hw))
|
||||
if (!IS_QLA8XXX_TYPE(vha->hw))
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
|
||||
|
@ -3624,7 +3660,7 @@ qla2x00_get_dcbx_params(scsi_qla_host_t *vha, dma_addr_t tlv_dma,
|
|||
mbx_cmd_t mc;
|
||||
mbx_cmd_t *mcp = &mc;
|
||||
|
||||
if (!IS_QLA81XX(vha->hw))
|
||||
if (!IS_QLA8XXX_TYPE(vha->hw))
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no));
|
||||
|
@ -3685,7 +3721,8 @@ qla2x00_read_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t *data)
|
|||
}
|
||||
|
||||
int
|
||||
qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, uint16_t *mresp)
|
||||
qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
|
||||
uint16_t *mresp)
|
||||
{
|
||||
int rval;
|
||||
mbx_cmd_t mc;
|
||||
|
@ -3720,7 +3757,7 @@ qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, uint16_t *
|
|||
|
||||
mcp->out_mb = MBX_21|MBX_20|MBX_19|MBX_18|MBX_17|MBX_16|MBX_15|
|
||||
MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0;
|
||||
if (IS_QLA81XX(vha->hw))
|
||||
if (IS_QLA8XXX_TYPE(vha->hw))
|
||||
mcp->out_mb |= MBX_2;
|
||||
mcp->in_mb = MBX_19|MBX_18|MBX_3|MBX_2|MBX_1|MBX_0;
|
||||
|
||||
|
@ -3732,9 +3769,11 @@ qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, uint16_t *
|
|||
|
||||
if (rval != QLA_SUCCESS) {
|
||||
DEBUG2(printk(KERN_WARNING
|
||||
"(%ld): failed=%x mb[0]=0x%x "
|
||||
"mb[1]=0x%x mb[2]=0x%x mb[3]=0x%x mb[18]=0x%x mb[19]=0x%x. \n", vha->host_no, rval,
|
||||
mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], mcp->mb[18], mcp->mb[19]));
|
||||
"(%ld): failed=%x mb[0]=0x%x "
|
||||
"mb[1]=0x%x mb[2]=0x%x mb[3]=0x%x mb[18]=0x%x "
|
||||
"mb[19]=0x%x.\n",
|
||||
vha->host_no, rval, mcp->mb[0], mcp->mb[1], mcp->mb[2],
|
||||
mcp->mb[3], mcp->mb[18], mcp->mb[19]));
|
||||
} else {
|
||||
DEBUG2(printk(KERN_WARNING
|
||||
"scsi(%ld): done.\n", vha->host_no));
|
||||
|
@ -3748,7 +3787,8 @@ qla2x00_loopback_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, uint16_t *
|
|||
}
|
||||
|
||||
int
|
||||
qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, uint16_t *mresp)
|
||||
qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq,
|
||||
uint16_t *mresp)
|
||||
{
|
||||
int rval;
|
||||
mbx_cmd_t mc;
|
||||
|
@ -3760,9 +3800,10 @@ qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, uint16_t *mres
|
|||
memset(mcp->mb, 0 , sizeof(mcp->mb));
|
||||
mcp->mb[0] = MBC_DIAGNOSTIC_ECHO;
|
||||
mcp->mb[1] = mreq->options | BIT_6; /* BIT_6 specifies 64bit address */
|
||||
if (IS_QLA81XX(ha))
|
||||
if (IS_QLA8XXX_TYPE(ha)) {
|
||||
mcp->mb[1] |= BIT_15;
|
||||
mcp->mb[2] = IS_QLA81XX(ha) ? vha->fcoe_fcf_idx : 0;
|
||||
mcp->mb[2] = vha->fcoe_fcf_idx;
|
||||
}
|
||||
mcp->mb[16] = LSW(mreq->rcv_dma);
|
||||
mcp->mb[17] = MSW(mreq->rcv_dma);
|
||||
mcp->mb[6] = LSW(MSD(mreq->rcv_dma));
|
||||
|
@ -3777,13 +3818,13 @@ qla2x00_echo_test(scsi_qla_host_t *vha, struct msg_echo_lb *mreq, uint16_t *mres
|
|||
|
||||
mcp->out_mb = MBX_21|MBX_20|MBX_17|MBX_16|MBX_15|
|
||||
MBX_14|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0;
|
||||
if (IS_QLA81XX(ha))
|
||||
if (IS_QLA8XXX_TYPE(ha))
|
||||
mcp->out_mb |= MBX_2;
|
||||
|
||||
mcp->in_mb = MBX_0;
|
||||
if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha))
|
||||
if (IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA8XXX_TYPE(ha))
|
||||
mcp->in_mb |= MBX_1;
|
||||
if (IS_QLA81XX(ha))
|
||||
if (IS_QLA8XXX_TYPE(ha))
|
||||
mcp->in_mb |= MBX_3;
|
||||
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
|
@ -3875,7 +3916,8 @@ qla2x00_get_data_rate(scsi_qla_host_t *vha)
|
|||
if (!IS_FWI2_CAPABLE(ha))
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
DEBUG11(printk(KERN_INFO "%s(%ld): entered.\n", __func__, vha->host_no));
|
||||
DEBUG11(qla_printk(KERN_INFO, ha,
|
||||
"%s(%ld): entered.\n", __func__, vha->host_no));
|
||||
|
||||
mcp->mb[0] = MBC_DATA_RATE;
|
||||
mcp->mb[1] = 0;
|
||||
|
@ -3943,3 +3985,75 @@ qla24xx_set_fcp_prio(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t priority,
|
|||
|
||||
return rval;
|
||||
}
|
||||
|
||||
int
|
||||
qla82xx_mbx_intr_enable(scsi_qla_host_t *vha)
|
||||
{
|
||||
int rval;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
mbx_cmd_t mc;
|
||||
mbx_cmd_t *mcp = &mc;
|
||||
|
||||
if (!IS_FWI2_CAPABLE(ha))
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
DEBUG11(qla_printk(KERN_INFO, ha,
|
||||
"%s(%ld): entered.\n", __func__, vha->host_no));
|
||||
|
||||
memset(mcp, 0, sizeof(mbx_cmd_t));
|
||||
mcp->mb[0] = MBC_TOGGLE_INTR;
|
||||
mcp->mb[1] = 1;
|
||||
|
||||
mcp->out_mb = MBX_1|MBX_0;
|
||||
mcp->in_mb = MBX_0;
|
||||
mcp->tov = 30;
|
||||
mcp->flags = 0;
|
||||
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
DEBUG2_3_11(qla_printk(KERN_WARNING, ha,
|
||||
"%s(%ld): failed=%x mb[0]=%x.\n", __func__,
|
||||
vha->host_no, rval, mcp->mb[0]));
|
||||
} else {
|
||||
DEBUG11(qla_printk(KERN_INFO, ha,
|
||||
"%s(%ld): done.\n", __func__, vha->host_no));
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
int
|
||||
qla82xx_mbx_intr_disable(scsi_qla_host_t *vha)
|
||||
{
|
||||
int rval;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
mbx_cmd_t mc;
|
||||
mbx_cmd_t *mcp = &mc;
|
||||
|
||||
if (!IS_QLA82XX(ha))
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
DEBUG11(qla_printk(KERN_INFO, ha,
|
||||
"%s(%ld): entered.\n", __func__, vha->host_no));
|
||||
|
||||
memset(mcp, 0, sizeof(mbx_cmd_t));
|
||||
mcp->mb[0] = MBC_TOGGLE_INTR;
|
||||
mcp->mb[1] = 0;
|
||||
|
||||
mcp->out_mb = MBX_1|MBX_0;
|
||||
mcp->in_mb = MBX_0;
|
||||
mcp->tov = 30;
|
||||
mcp->flags = 0;
|
||||
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
DEBUG2_3_11(qla_printk(KERN_WARNING, ha,
|
||||
"%s(%ld): failed=%x mb[0]=%x.\n", __func__,
|
||||
vha->host_no, rval, mcp->mb[0]));
|
||||
} else {
|
||||
DEBUG11(qla_printk(KERN_INFO, ha,
|
||||
"%s(%ld): done.\n", __func__, vha->host_no));
|
||||
}
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,888 @@
|
|||
/*
|
||||
* QLogic Fibre Channel HBA Driver
|
||||
* Copyright (c) 2003-2008 QLogic Corporation
|
||||
*
|
||||
* See LICENSE.qla2xxx for copyright and licensing details.
|
||||
*/
|
||||
#ifndef __QLA_NX_H
|
||||
#define __QLA_NX_H
|
||||
|
||||
/*
|
||||
* Following are the states of the Phantom. Phantom will set them and
|
||||
* Host will read to check if the fields are correct.
|
||||
*/
|
||||
#define PHAN_INITIALIZE_FAILED 0xffff
|
||||
#define PHAN_INITIALIZE_COMPLETE 0xff01
|
||||
|
||||
/* Host writes the following to notify that it has done the init-handshake */
|
||||
#define PHAN_INITIALIZE_ACK 0xf00f
|
||||
#define PHAN_PEG_RCV_INITIALIZED 0xff01
|
||||
|
||||
/*CRB_RELATED*/
|
||||
#define QLA82XX_CRB_BASE QLA82XX_CAM_RAM(0x200)
|
||||
#define QLA82XX_REG(X) (QLA82XX_CRB_BASE+(X))
|
||||
|
||||
#define CRB_CMDPEG_STATE QLA82XX_REG(0x50)
|
||||
#define CRB_RCVPEG_STATE QLA82XX_REG(0x13c)
|
||||
#define BOOT_LOADER_DIMM_STATUS QLA82XX_REG(0x54)
|
||||
#define CRB_DMA_SHIFT QLA82XX_REG(0xcc)
|
||||
|
||||
#define QLA82XX_HW_H0_CH_HUB_ADR 0x05
|
||||
#define QLA82XX_HW_H1_CH_HUB_ADR 0x0E
|
||||
#define QLA82XX_HW_H2_CH_HUB_ADR 0x03
|
||||
#define QLA82XX_HW_H3_CH_HUB_ADR 0x01
|
||||
#define QLA82XX_HW_H4_CH_HUB_ADR 0x06
|
||||
#define QLA82XX_HW_H5_CH_HUB_ADR 0x07
|
||||
#define QLA82XX_HW_H6_CH_HUB_ADR 0x08
|
||||
|
||||
/* Hub 0 */
|
||||
#define QLA82XX_HW_MN_CRB_AGT_ADR 0x15
|
||||
#define QLA82XX_HW_MS_CRB_AGT_ADR 0x25
|
||||
|
||||
/* Hub 1 */
|
||||
#define QLA82XX_HW_PS_CRB_AGT_ADR 0x73
|
||||
#define QLA82XX_HW_QMS_CRB_AGT_ADR 0x00
|
||||
#define QLA82XX_HW_RPMX3_CRB_AGT_ADR 0x0b
|
||||
#define QLA82XX_HW_SQGS0_CRB_AGT_ADR 0x01
|
||||
#define QLA82XX_HW_SQGS1_CRB_AGT_ADR 0x02
|
||||
#define QLA82XX_HW_SQGS2_CRB_AGT_ADR 0x03
|
||||
#define QLA82XX_HW_SQGS3_CRB_AGT_ADR 0x04
|
||||
#define QLA82XX_HW_C2C0_CRB_AGT_ADR 0x58
|
||||
#define QLA82XX_HW_C2C1_CRB_AGT_ADR 0x59
|
||||
#define QLA82XX_HW_C2C2_CRB_AGT_ADR 0x5a
|
||||
#define QLA82XX_HW_RPMX2_CRB_AGT_ADR 0x0a
|
||||
#define QLA82XX_HW_RPMX4_CRB_AGT_ADR 0x0c
|
||||
#define QLA82XX_HW_RPMX7_CRB_AGT_ADR 0x0f
|
||||
#define QLA82XX_HW_RPMX9_CRB_AGT_ADR 0x12
|
||||
#define QLA82XX_HW_SMB_CRB_AGT_ADR 0x18
|
||||
|
||||
/* Hub 2 */
|
||||
#define QLA82XX_HW_NIU_CRB_AGT_ADR 0x31
|
||||
#define QLA82XX_HW_I2C0_CRB_AGT_ADR 0x19
|
||||
#define QLA82XX_HW_I2C1_CRB_AGT_ADR 0x29
|
||||
|
||||
#define QLA82XX_HW_SN_CRB_AGT_ADR 0x10
|
||||
#define QLA82XX_HW_I2Q_CRB_AGT_ADR 0x20
|
||||
#define QLA82XX_HW_LPC_CRB_AGT_ADR 0x22
|
||||
#define QLA82XX_HW_ROMUSB_CRB_AGT_ADR 0x21
|
||||
#define QLA82XX_HW_QM_CRB_AGT_ADR 0x66
|
||||
#define QLA82XX_HW_SQG0_CRB_AGT_ADR 0x60
|
||||
#define QLA82XX_HW_SQG1_CRB_AGT_ADR 0x61
|
||||
#define QLA82XX_HW_SQG2_CRB_AGT_ADR 0x62
|
||||
#define QLA82XX_HW_SQG3_CRB_AGT_ADR 0x63
|
||||
#define QLA82XX_HW_RPMX1_CRB_AGT_ADR 0x09
|
||||
#define QLA82XX_HW_RPMX5_CRB_AGT_ADR 0x0d
|
||||
#define QLA82XX_HW_RPMX6_CRB_AGT_ADR 0x0e
|
||||
#define QLA82XX_HW_RPMX8_CRB_AGT_ADR 0x11
|
||||
|
||||
/* Hub 3 */
|
||||
#define QLA82XX_HW_PH_CRB_AGT_ADR 0x1A
|
||||
#define QLA82XX_HW_SRE_CRB_AGT_ADR 0x50
|
||||
#define QLA82XX_HW_EG_CRB_AGT_ADR 0x51
|
||||
#define QLA82XX_HW_RPMX0_CRB_AGT_ADR 0x08
|
||||
|
||||
/* Hub 4 */
|
||||
#define QLA82XX_HW_PEGN0_CRB_AGT_ADR 0x40
|
||||
#define QLA82XX_HW_PEGN1_CRB_AGT_ADR 0x41
|
||||
#define QLA82XX_HW_PEGN2_CRB_AGT_ADR 0x42
|
||||
#define QLA82XX_HW_PEGN3_CRB_AGT_ADR 0x43
|
||||
#define QLA82XX_HW_PEGNI_CRB_AGT_ADR 0x44
|
||||
#define QLA82XX_HW_PEGND_CRB_AGT_ADR 0x45
|
||||
#define QLA82XX_HW_PEGNC_CRB_AGT_ADR 0x46
|
||||
#define QLA82XX_HW_PEGR0_CRB_AGT_ADR 0x47
|
||||
#define QLA82XX_HW_PEGR1_CRB_AGT_ADR 0x48
|
||||
#define QLA82XX_HW_PEGR2_CRB_AGT_ADR 0x49
|
||||
#define QLA82XX_HW_PEGR3_CRB_AGT_ADR 0x4a
|
||||
#define QLA82XX_HW_PEGN4_CRB_AGT_ADR 0x4b
|
||||
|
||||
/* Hub 5 */
|
||||
#define QLA82XX_HW_PEGS0_CRB_AGT_ADR 0x40
|
||||
#define QLA82XX_HW_PEGS1_CRB_AGT_ADR 0x41
|
||||
#define QLA82XX_HW_PEGS2_CRB_AGT_ADR 0x42
|
||||
#define QLA82XX_HW_PEGS3_CRB_AGT_ADR 0x43
|
||||
#define QLA82XX_HW_PEGSI_CRB_AGT_ADR 0x44
|
||||
#define QLA82XX_HW_PEGSD_CRB_AGT_ADR 0x45
|
||||
#define QLA82XX_HW_PEGSC_CRB_AGT_ADR 0x46
|
||||
|
||||
/* Hub 6 */
|
||||
#define QLA82XX_HW_CAS0_CRB_AGT_ADR 0x46
|
||||
#define QLA82XX_HW_CAS1_CRB_AGT_ADR 0x47
|
||||
#define QLA82XX_HW_CAS2_CRB_AGT_ADR 0x48
|
||||
#define QLA82XX_HW_CAS3_CRB_AGT_ADR 0x49
|
||||
#define QLA82XX_HW_NCM_CRB_AGT_ADR 0x16
|
||||
#define QLA82XX_HW_TMR_CRB_AGT_ADR 0x17
|
||||
#define QLA82XX_HW_XDMA_CRB_AGT_ADR 0x05
|
||||
#define QLA82XX_HW_OCM0_CRB_AGT_ADR 0x06
|
||||
#define QLA82XX_HW_OCM1_CRB_AGT_ADR 0x07
|
||||
|
||||
/* This field defines PCI/X adr [25:20] of agents on the CRB */
|
||||
/* */
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PH 0
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PS 1
|
||||
#define QLA82XX_HW_PX_MAP_CRB_MN 2
|
||||
#define QLA82XX_HW_PX_MAP_CRB_MS 3
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SRE 5
|
||||
#define QLA82XX_HW_PX_MAP_CRB_NIU 6
|
||||
#define QLA82XX_HW_PX_MAP_CRB_QMN 7
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SQN0 8
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SQN1 9
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SQN2 10
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SQN3 11
|
||||
#define QLA82XX_HW_PX_MAP_CRB_QMS 12
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SQS0 13
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SQS1 14
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SQS2 15
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SQS3 16
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGN0 17
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGN1 18
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGN2 19
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGN3 20
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGN4 QLA82XX_HW_PX_MAP_CRB_SQS2
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGND 21
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGNI 22
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGS0 23
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGS1 24
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGS2 25
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGS3 26
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGSD 27
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGSI 28
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SN 29
|
||||
#define QLA82XX_HW_PX_MAP_CRB_EG 31
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PH2 32
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PS2 33
|
||||
#define QLA82XX_HW_PX_MAP_CRB_CAM 34
|
||||
#define QLA82XX_HW_PX_MAP_CRB_CAS0 35
|
||||
#define QLA82XX_HW_PX_MAP_CRB_CAS1 36
|
||||
#define QLA82XX_HW_PX_MAP_CRB_CAS2 37
|
||||
#define QLA82XX_HW_PX_MAP_CRB_C2C0 38
|
||||
#define QLA82XX_HW_PX_MAP_CRB_C2C1 39
|
||||
#define QLA82XX_HW_PX_MAP_CRB_TIMR 40
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX1 42
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX2 43
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX3 44
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX4 45
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX5 46
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX6 47
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX7 48
|
||||
#define QLA82XX_HW_PX_MAP_CRB_XDMA 49
|
||||
#define QLA82XX_HW_PX_MAP_CRB_I2Q 50
|
||||
#define QLA82XX_HW_PX_MAP_CRB_ROMUSB 51
|
||||
#define QLA82XX_HW_PX_MAP_CRB_CAS3 52
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX0 53
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX8 54
|
||||
#define QLA82XX_HW_PX_MAP_CRB_RPMX9 55
|
||||
#define QLA82XX_HW_PX_MAP_CRB_OCM0 56
|
||||
#define QLA82XX_HW_PX_MAP_CRB_OCM1 57
|
||||
#define QLA82XX_HW_PX_MAP_CRB_SMB 58
|
||||
#define QLA82XX_HW_PX_MAP_CRB_I2C0 59
|
||||
#define QLA82XX_HW_PX_MAP_CRB_I2C1 60
|
||||
#define QLA82XX_HW_PX_MAP_CRB_LPC 61
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGNC 62
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGR0 63
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGR1 4
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGR2 30
|
||||
#define QLA82XX_HW_PX_MAP_CRB_PGR3 41
|
||||
|
||||
/* This field defines CRB adr [31:20] of the agents */
|
||||
/* */
|
||||
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_MN ((QLA82XX_HW_H0_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_MN_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PH ((QLA82XX_HW_H0_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PH_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_MS ((QLA82XX_HW_H0_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_MS_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PS ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PS_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SS ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SS_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX3 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX3_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_QMS ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_QMS_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SQS0 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SQGS0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SQS1 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SQGS1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SQS2 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SQGS2_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SQS3 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SQGS3_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_C2C0 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_C2C0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_C2C1 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_C2C1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX2 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX2_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX4 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX4_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX7 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX7_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX9 ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX9_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SMB ((QLA82XX_HW_H1_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SMB_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_NIU ((QLA82XX_HW_H2_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_NIU_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_I2C0 ((QLA82XX_HW_H2_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_I2C0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_I2C1 ((QLA82XX_HW_H2_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_I2C1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SRE ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SRE_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_EG ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_EG_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX0 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_QMN ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_QM_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SQN0 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SQG0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SQN1 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SQG1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SQN2 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SQG2_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SQN3 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SQG3_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX1 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX5 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX5_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX6 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX6_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_RPMX8 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_RPMX8_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_CAS0 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_CAS0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_CAS1 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_CAS1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_CAS2 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_CAS2_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_CAS3 ((QLA82XX_HW_H3_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_CAS3_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGNI ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGNI_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGND ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGND_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGN0 ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGN0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGN1 ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGN1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGN2 ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGN2_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGN3 ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGN3_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGN4 ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGN4_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGNC ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGNC_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGR0 ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGR0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGR1 ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGR1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGR2 ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGR2_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGR3 ((QLA82XX_HW_H4_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGR3_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGSI ((QLA82XX_HW_H5_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGSI_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGSD ((QLA82XX_HW_H5_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGSD_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGS0 ((QLA82XX_HW_H5_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGS0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGS1 ((QLA82XX_HW_H5_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGS1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGS2 ((QLA82XX_HW_H5_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGS2_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGS3 ((QLA82XX_HW_H5_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGS3_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_PGSC ((QLA82XX_HW_H5_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_PEGSC_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_CAM ((QLA82XX_HW_H6_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_NCM_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_TIMR ((QLA82XX_HW_H6_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_TMR_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_XDMA ((QLA82XX_HW_H6_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_XDMA_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_SN ((QLA82XX_HW_H6_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_SN_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_I2Q ((QLA82XX_HW_H6_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_I2Q_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_ROMUSB ((QLA82XX_HW_H6_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_ROMUSB_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_OCM0 ((QLA82XX_HW_H6_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_OCM0_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_OCM1 ((QLA82XX_HW_H6_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_OCM1_CRB_AGT_ADR)
|
||||
#define QLA82XX_HW_CRB_HUB_AGT_ADR_LPC ((QLA82XX_HW_H6_CH_HUB_ADR << 7) | \
|
||||
QLA82XX_HW_LPC_CRB_AGT_ADR)
|
||||
|
||||
#define ROMUSB_GLB (QLA82XX_CRB_ROMUSB + 0x00000)
|
||||
#define QLA82XX_ROMUSB_GLB_PEGTUNE_DONE (ROMUSB_GLB + 0x005c)
|
||||
#define QLA82XX_ROMUSB_GLB_STATUS (ROMUSB_GLB + 0x0004)
|
||||
#define QLA82XX_ROMUSB_GLB_SW_RESET (ROMUSB_GLB + 0x0008)
|
||||
#define QLA82XX_ROMUSB_ROM_ADDRESS (ROMUSB_ROM + 0x0008)
|
||||
#define QLA82XX_ROMUSB_ROM_WDATA (ROMUSB_ROM + 0x000c)
|
||||
#define QLA82XX_ROMUSB_ROM_ABYTE_CNT (ROMUSB_ROM + 0x0010)
|
||||
#define QLA82XX_ROMUSB_ROM_DUMMY_BYTE_CNT (ROMUSB_ROM + 0x0014)
|
||||
#define QLA82XX_ROMUSB_ROM_RDATA (ROMUSB_ROM + 0x0018)
|
||||
|
||||
#define ROMUSB_ROM (QLA82XX_CRB_ROMUSB + 0x10000)
|
||||
#define QLA82XX_ROMUSB_ROM_INSTR_OPCODE (ROMUSB_ROM + 0x0004)
|
||||
#define QLA82XX_ROMUSB_GLB_CAS_RST (ROMUSB_GLB + 0x0038)
|
||||
|
||||
/* Lock IDs for ROM lock */
|
||||
#define ROM_LOCK_DRIVER 0x0d417340
|
||||
|
||||
#define QLA82XX_PCI_CRB_WINDOWSIZE 0x00100000 /* all are 1MB windows */
|
||||
#define QLA82XX_PCI_CRB_WINDOW(A) \
|
||||
(QLA82XX_PCI_CRBSPACE + (A)*QLA82XX_PCI_CRB_WINDOWSIZE)
|
||||
#define QLA82XX_CRB_C2C_0 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_C2C0)
|
||||
#define QLA82XX_CRB_C2C_1 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_C2C1)
|
||||
#define QLA82XX_CRB_C2C_2 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_C2C2)
|
||||
#define QLA82XX_CRB_CAM \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_CAM)
|
||||
#define QLA82XX_CRB_CASPER \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_CAS)
|
||||
#define QLA82XX_CRB_CASPER_0 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_CAS0)
|
||||
#define QLA82XX_CRB_CASPER_1 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_CAS1)
|
||||
#define QLA82XX_CRB_CASPER_2 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_CAS2)
|
||||
#define QLA82XX_CRB_DDR_MD \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_MS)
|
||||
#define QLA82XX_CRB_DDR_NET \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_MN)
|
||||
#define QLA82XX_CRB_EPG \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_EG)
|
||||
#define QLA82XX_CRB_I2Q \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_I2Q)
|
||||
#define QLA82XX_CRB_NIU \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_NIU)
|
||||
|
||||
#define QLA82XX_CRB_PCIX_HOST \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PH)
|
||||
#define QLA82XX_CRB_PCIX_HOST2 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PH2)
|
||||
#define QLA82XX_CRB_PCIX_MD \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PS)
|
||||
#define QLA82XX_CRB_PCIE \
|
||||
QLA82XX_CRB_PCIX_MD
|
||||
|
||||
/* window 1 pcie slot */
|
||||
#define QLA82XX_CRB_PCIE2 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PS2)
|
||||
#define QLA82XX_CRB_PEG_MD_0 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGS0)
|
||||
#define QLA82XX_CRB_PEG_MD_1 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGS1)
|
||||
#define QLA82XX_CRB_PEG_MD_2 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGS2)
|
||||
#define QLA82XX_CRB_PEG_MD_3 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGS3)
|
||||
#define QLA82XX_CRB_PEG_MD_3 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGS3)
|
||||
#define QLA82XX_CRB_PEG_MD_D \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGSD)
|
||||
#define QLA82XX_CRB_PEG_MD_I \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGSI)
|
||||
#define QLA82XX_CRB_PEG_NET_0 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGN0)
|
||||
#define QLA82XX_CRB_PEG_NET_1 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGN1)
|
||||
#define QLA82XX_CRB_PEG_NET_2 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGN2)
|
||||
#define QLA82XX_CRB_PEG_NET_3 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGN3)
|
||||
#define QLA82XX_CRB_PEG_NET_4 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGN4)
|
||||
#define QLA82XX_CRB_PEG_NET_D \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGND)
|
||||
#define QLA82XX_CRB_PEG_NET_I \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_PGNI)
|
||||
#define QLA82XX_CRB_PQM_MD \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_QMS)
|
||||
#define QLA82XX_CRB_PQM_NET \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_QMN)
|
||||
#define QLA82XX_CRB_QDR_MD \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SS)
|
||||
#define QLA82XX_CRB_QDR_NET \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SN)
|
||||
#define QLA82XX_CRB_ROMUSB \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_ROMUSB)
|
||||
#define QLA82XX_CRB_RPMX_0 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_RPMX0)
|
||||
#define QLA82XX_CRB_RPMX_1 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_RPMX1)
|
||||
#define QLA82XX_CRB_RPMX_2 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_RPMX2)
|
||||
#define QLA82XX_CRB_RPMX_3 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_RPMX3)
|
||||
#define QLA82XX_CRB_RPMX_4 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_RPMX4)
|
||||
#define QLA82XX_CRB_RPMX_5 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_RPMX5)
|
||||
#define QLA82XX_CRB_RPMX_6 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_RPMX6)
|
||||
#define QLA82XX_CRB_RPMX_7 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_RPMX7)
|
||||
#define QLA82XX_CRB_SQM_MD_0 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SQS0)
|
||||
#define QLA82XX_CRB_SQM_MD_1 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SQS1)
|
||||
#define QLA82XX_CRB_SQM_MD_2 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SQS2)
|
||||
#define QLA82XX_CRB_SQM_MD_3 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SQS3)
|
||||
#define QLA82XX_CRB_SQM_NET_0 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SQN0)
|
||||
#define QLA82XX_CRB_SQM_NET_1 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SQN1)
|
||||
#define QLA82XX_CRB_SQM_NET_2 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SQN2)
|
||||
#define QLA82XX_CRB_SQM_NET_3 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SQN3)
|
||||
#define QLA82XX_CRB_SRE \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SRE)
|
||||
#define QLA82XX_CRB_TIMER \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_TIMR)
|
||||
#define QLA82XX_CRB_XDMA \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_XDMA)
|
||||
#define QLA82XX_CRB_I2C0 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_I2C0)
|
||||
#define QLA82XX_CRB_I2C1 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_I2C1)
|
||||
#define QLA82XX_CRB_OCM0 \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_OCM0)
|
||||
#define QLA82XX_CRB_SMB \
|
||||
QLA82XX_PCI_CRB_WINDOW(QLA82XX_HW_PX_MAP_CRB_SMB)
|
||||
#define QLA82XX_CRB_MAX \
|
||||
QLA82XX_PCI_CRB_WINDOW(64)
|
||||
|
||||
/*
|
||||
* ====================== BASE ADDRESSES ON-CHIP ======================
|
||||
* Base addresses of major components on-chip.
|
||||
* ====================== BASE ADDRESSES ON-CHIP ======================
|
||||
*/
|
||||
#define QLA82XX_ADDR_DDR_NET (0x0000000000000000ULL)
|
||||
#define QLA82XX_ADDR_DDR_NET_MAX (0x000000000fffffffULL)
|
||||
|
||||
/* Imbus address bit used to indicate a host address. This bit is
|
||||
* eliminated by the pcie bar and bar select before presentation
|
||||
* over pcie. */
|
||||
/* host memory via IMBUS */
|
||||
#define QLA82XX_P2_ADDR_PCIE (0x0000000800000000ULL)
|
||||
#define QLA82XX_P3_ADDR_PCIE (0x0000008000000000ULL)
|
||||
#define QLA82XX_ADDR_PCIE_MAX (0x0000000FFFFFFFFFULL)
|
||||
#define QLA82XX_ADDR_OCM0 (0x0000000200000000ULL)
|
||||
#define QLA82XX_ADDR_OCM0_MAX (0x00000002000fffffULL)
|
||||
#define QLA82XX_ADDR_OCM1 (0x0000000200400000ULL)
|
||||
#define QLA82XX_ADDR_OCM1_MAX (0x00000002004fffffULL)
|
||||
#define QLA82XX_ADDR_QDR_NET (0x0000000300000000ULL)
|
||||
|
||||
#define QLA82XX_P2_ADDR_QDR_NET_MAX (0x00000003001fffffULL)
|
||||
#define QLA82XX_P3_ADDR_QDR_NET_MAX (0x0000000303ffffffULL)
|
||||
|
||||
#define QLA82XX_PCI_CRBSPACE (unsigned long)0x06000000
|
||||
#define QLA82XX_PCI_DIRECT_CRB (unsigned long)0x04400000
|
||||
#define QLA82XX_PCI_CAMQM (unsigned long)0x04800000
|
||||
#define QLA82XX_PCI_CAMQM_MAX (unsigned long)0x04ffffff
|
||||
#define QLA82XX_PCI_DDR_NET (unsigned long)0x00000000
|
||||
#define QLA82XX_PCI_QDR_NET (unsigned long)0x04000000
|
||||
#define QLA82XX_PCI_QDR_NET_MAX (unsigned long)0x043fffff
|
||||
|
||||
/*
|
||||
* Register offsets for MN
|
||||
*/
|
||||
#define MIU_CONTROL (0x000)
|
||||
#define MIU_TAG (0x004)
|
||||
#define MIU_TEST_AGT_CTRL (0x090)
|
||||
#define MIU_TEST_AGT_ADDR_LO (0x094)
|
||||
#define MIU_TEST_AGT_ADDR_HI (0x098)
|
||||
#define MIU_TEST_AGT_WRDATA_LO (0x0a0)
|
||||
#define MIU_TEST_AGT_WRDATA_HI (0x0a4)
|
||||
#define MIU_TEST_AGT_WRDATA(i) (0x0a0+(4*(i)))
|
||||
#define MIU_TEST_AGT_RDDATA_LO (0x0a8)
|
||||
#define MIU_TEST_AGT_RDDATA_HI (0x0ac)
|
||||
#define MIU_TEST_AGT_RDDATA(i) (0x0a8+(4*(i)))
|
||||
#define MIU_TEST_AGT_ADDR_MASK 0xfffffff8
|
||||
#define MIU_TEST_AGT_UPPER_ADDR(off) (0)
|
||||
|
||||
/* MIU_TEST_AGT_CTRL flags. work for SIU as well */
|
||||
#define MIU_TA_CTL_START 1
|
||||
#define MIU_TA_CTL_ENABLE 2
|
||||
#define MIU_TA_CTL_WRITE 4
|
||||
#define MIU_TA_CTL_BUSY 8
|
||||
|
||||
/*CAM RAM */
|
||||
# define QLA82XX_CAM_RAM_BASE (QLA82XX_CRB_CAM + 0x02000)
|
||||
# define QLA82XX_CAM_RAM(reg) (QLA82XX_CAM_RAM_BASE + (reg))
|
||||
|
||||
#define QLA82XX_PEG_TUNE_MN_SPD_ZEROED 0x80000000
|
||||
#define QLA82XX_BOOT_LOADER_MN_ISSUE 0xff00ffff
|
||||
#define QLA82XX_PORT_MODE_ADDR (QLA82XX_CAM_RAM(0x24))
|
||||
#define QLA82XX_PEG_HALT_STATUS1 (QLA82XX_CAM_RAM(0xa8))
|
||||
#define QLA82XX_PEG_HALT_STATUS2 (QLA82XX_CAM_RAM(0xac))
|
||||
#define QLA82XX_PEG_ALIVE_COUNTER (QLA82XX_CAM_RAM(0xb0))
|
||||
|
||||
#define QLA82XX_CAMRAM_DB1 (QLA82XX_CAM_RAM(0x1b8))
|
||||
#define QLA82XX_CAMRAM_DB2 (QLA82XX_CAM_RAM(0x1bc))
|
||||
|
||||
#define HALT_STATUS_UNRECOVERABLE 0x80000000
|
||||
#define HALT_STATUS_RECOVERABLE 0x40000000
|
||||
|
||||
/* Driver Coexistence Defines */
|
||||
#define QLA82XX_CRB_DRV_ACTIVE (QLA82XX_CAM_RAM(0x138))
|
||||
#define QLA82XX_CRB_DEV_STATE (QLA82XX_CAM_RAM(0x140))
|
||||
#define QLA82XX_CRB_DEV_PART_INFO (QLA82XX_CAM_RAM(0x14c))
|
||||
#define QLA82XX_CRB_DRV_IDC_VERSION (QLA82XX_CAM_RAM(0x174))
|
||||
#define QLA82XX_CRB_DRV_STATE (QLA82XX_CAM_RAM(0x144))
|
||||
#define QLA82XX_CRB_DRV_SCRATCH (QLA82XX_CAM_RAM(0x148))
|
||||
#define QLA82XX_CRB_DEV_PART_INFO (QLA82XX_CAM_RAM(0x14c))
|
||||
|
||||
/* Every driver should use these Device State */
|
||||
#define QLA82XX_DEV_COLD 1
|
||||
#define QLA82XX_DEV_INITIALIZING 2
|
||||
#define QLA82XX_DEV_READY 3
|
||||
#define QLA82XX_DEV_NEED_RESET 4
|
||||
#define QLA82XX_DEV_NEED_QUIESCENT 5
|
||||
#define QLA82XX_DEV_FAILED 6
|
||||
#define QLA82XX_DEV_QUIESCENT 7
|
||||
|
||||
#define QLA82XX_IDC_VERSION 1
|
||||
#define QLA82XX_ROM_DEV_INIT_TIMEOUT 30
|
||||
#define QLA82XX_ROM_DRV_RESET_ACK_TIMEOUT 10
|
||||
|
||||
#define QLA82XX_ROM_LOCK_ID (QLA82XX_CAM_RAM(0x100))
|
||||
#define QLA82XX_CRB_WIN_LOCK_ID (QLA82XX_CAM_RAM(0x124))
|
||||
#define QLA82XX_FW_VERSION_MAJOR (QLA82XX_CAM_RAM(0x150))
|
||||
#define QLA82XX_FW_VERSION_MINOR (QLA82XX_CAM_RAM(0x154))
|
||||
#define QLA82XX_FW_VERSION_SUB (QLA82XX_CAM_RAM(0x158))
|
||||
#define QLA82XX_PCIE_REG(reg) (QLA82XX_CRB_PCIE + (reg))
|
||||
|
||||
#define PCIE_CHICKEN3 (0x120c8)
|
||||
#define PCIE_SETUP_FUNCTION (0x12040)
|
||||
#define PCIE_SETUP_FUNCTION2 (0x12048)
|
||||
|
||||
#define QLA82XX_PCIX_PS_REG(reg) (QLA82XX_CRB_PCIX_MD + (reg))
|
||||
#define QLA82XX_PCIX_PS2_REG(reg) (QLA82XX_CRB_PCIE2 + (reg))
|
||||
|
||||
#define PCIE_SEM2_LOCK (0x1c010) /* Flash lock */
|
||||
#define PCIE_SEM2_UNLOCK (0x1c014) /* Flash unlock */
|
||||
#define PCIE_SEM5_LOCK (0x1c028) /* Coexistence lock */
|
||||
#define PCIE_SEM5_UNLOCK (0x1c02c) /* Coexistence unlock */
|
||||
#define PCIE_SEM7_LOCK (0x1c038) /* crb win lock */
|
||||
#define PCIE_SEM7_UNLOCK (0x1c03c) /* crbwin unlock*/
|
||||
|
||||
/* Different drive state */
|
||||
#define QLA82XX_DRVST_NOT_RDY 0
|
||||
#define QLA82XX_DRVST_RST_RDY 1
|
||||
#define QLA82XX_DRVST_QSNT_RDY 2
|
||||
|
||||
/*
|
||||
* The PCI VendorID and DeviceID for our board.
|
||||
*/
|
||||
#define PCI_DEVICE_ID_QLOGIC_ISP8021 0x8021
|
||||
|
||||
#define QLA82XX_MSIX_TBL_SPACE 8192
|
||||
#define QLA82XX_PCI_REG_MSIX_TBL 0x44
|
||||
#define QLA82XX_PCI_MSIX_CONTROL 0x40
|
||||
|
||||
struct crb_128M_2M_sub_block_map {
|
||||
unsigned valid;
|
||||
unsigned start_128M;
|
||||
unsigned end_128M;
|
||||
unsigned start_2M;
|
||||
};
|
||||
|
||||
struct crb_128M_2M_block_map {
|
||||
struct crb_128M_2M_sub_block_map sub_block[16];
|
||||
};
|
||||
|
||||
struct crb_addr_pair {
|
||||
long addr;
|
||||
long data;
|
||||
};
|
||||
|
||||
#define ADDR_ERROR ((unsigned long) 0xffffffff)
|
||||
#define MAX_CTL_CHECK 1000
|
||||
|
||||
/***************************************************************************
|
||||
* PCI related defines.
|
||||
**************************************************************************/
|
||||
|
||||
/*
|
||||
* Interrupt related defines.
|
||||
*/
|
||||
#define PCIX_TARGET_STATUS (0x10118)
|
||||
#define PCIX_TARGET_STATUS_F1 (0x10160)
|
||||
#define PCIX_TARGET_STATUS_F2 (0x10164)
|
||||
#define PCIX_TARGET_STATUS_F3 (0x10168)
|
||||
#define PCIX_TARGET_STATUS_F4 (0x10360)
|
||||
#define PCIX_TARGET_STATUS_F5 (0x10364)
|
||||
#define PCIX_TARGET_STATUS_F6 (0x10368)
|
||||
#define PCIX_TARGET_STATUS_F7 (0x1036c)
|
||||
|
||||
#define PCIX_TARGET_MASK (0x10128)
|
||||
#define PCIX_TARGET_MASK_F1 (0x10170)
|
||||
#define PCIX_TARGET_MASK_F2 (0x10174)
|
||||
#define PCIX_TARGET_MASK_F3 (0x10178)
|
||||
#define PCIX_TARGET_MASK_F4 (0x10370)
|
||||
#define PCIX_TARGET_MASK_F5 (0x10374)
|
||||
#define PCIX_TARGET_MASK_F6 (0x10378)
|
||||
#define PCIX_TARGET_MASK_F7 (0x1037c)
|
||||
|
||||
/*
|
||||
* Message Signaled Interrupts
|
||||
*/
|
||||
#define PCIX_MSI_F0 (0x13000)
|
||||
#define PCIX_MSI_F1 (0x13004)
|
||||
#define PCIX_MSI_F2 (0x13008)
|
||||
#define PCIX_MSI_F3 (0x1300c)
|
||||
#define PCIX_MSI_F4 (0x13010)
|
||||
#define PCIX_MSI_F5 (0x13014)
|
||||
#define PCIX_MSI_F6 (0x13018)
|
||||
#define PCIX_MSI_F7 (0x1301c)
|
||||
#define PCIX_MSI_F(FUNC) (0x13000 + ((FUNC) * 4))
|
||||
#define PCIX_INT_VECTOR (0x10100)
|
||||
#define PCIX_INT_MASK (0x10104)
|
||||
|
||||
/*
|
||||
* Interrupt state machine and other bits.
|
||||
*/
|
||||
#define PCIE_MISCCFG_RC (0x1206c)
|
||||
|
||||
#define ISR_INT_TARGET_STATUS \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_STATUS))
|
||||
#define ISR_INT_TARGET_STATUS_F1 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_STATUS_F1))
|
||||
#define ISR_INT_TARGET_STATUS_F2 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_STATUS_F2))
|
||||
#define ISR_INT_TARGET_STATUS_F3 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_STATUS_F3))
|
||||
#define ISR_INT_TARGET_STATUS_F4 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_STATUS_F4))
|
||||
#define ISR_INT_TARGET_STATUS_F5 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_STATUS_F5))
|
||||
#define ISR_INT_TARGET_STATUS_F6 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_STATUS_F6))
|
||||
#define ISR_INT_TARGET_STATUS_F7 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_STATUS_F7))
|
||||
|
||||
#define ISR_INT_TARGET_MASK \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_MASK))
|
||||
#define ISR_INT_TARGET_MASK_F1 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_MASK_F1))
|
||||
#define ISR_INT_TARGET_MASK_F2 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_MASK_F2))
|
||||
#define ISR_INT_TARGET_MASK_F3 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_MASK_F3))
|
||||
#define ISR_INT_TARGET_MASK_F4 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_MASK_F4))
|
||||
#define ISR_INT_TARGET_MASK_F5 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_MASK_F5))
|
||||
#define ISR_INT_TARGET_MASK_F6 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_MASK_F6))
|
||||
#define ISR_INT_TARGET_MASK_F7 \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_TARGET_MASK_F7))
|
||||
|
||||
#define ISR_INT_VECTOR \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_INT_VECTOR))
|
||||
#define ISR_INT_MASK \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_INT_MASK))
|
||||
#define ISR_INT_STATE_REG \
|
||||
(QLA82XX_PCIX_PS_REG(PCIE_MISCCFG_RC))
|
||||
|
||||
#define ISR_MSI_INT_TRIGGER(FUNC) \
|
||||
(QLA82XX_PCIX_PS_REG(PCIX_MSI_F(FUNC)))
|
||||
|
||||
#define ISR_IS_LEGACY_INTR_IDLE(VAL) (((VAL) & 0x300) == 0)
|
||||
#define ISR_IS_LEGACY_INTR_TRIGGERED(VAL) (((VAL) & 0x300) == 0x200)
|
||||
|
||||
/*
|
||||
* PCI Interrupt Vector Values.
|
||||
*/
|
||||
#define PCIX_INT_VECTOR_BIT_F0 0x0080
|
||||
#define PCIX_INT_VECTOR_BIT_F1 0x0100
|
||||
#define PCIX_INT_VECTOR_BIT_F2 0x0200
|
||||
#define PCIX_INT_VECTOR_BIT_F3 0x0400
|
||||
#define PCIX_INT_VECTOR_BIT_F4 0x0800
|
||||
#define PCIX_INT_VECTOR_BIT_F5 0x1000
|
||||
#define PCIX_INT_VECTOR_BIT_F6 0x2000
|
||||
#define PCIX_INT_VECTOR_BIT_F7 0x4000
|
||||
|
||||
struct qla82xx_legacy_intr_set {
|
||||
uint32_t int_vec_bit;
|
||||
uint32_t tgt_status_reg;
|
||||
uint32_t tgt_mask_reg;
|
||||
uint32_t pci_int_reg;
|
||||
};
|
||||
|
||||
#define QLA82XX_LEGACY_INTR_CONFIG \
|
||||
{ \
|
||||
{ \
|
||||
.int_vec_bit = PCIX_INT_VECTOR_BIT_F0, \
|
||||
.tgt_status_reg = ISR_INT_TARGET_STATUS, \
|
||||
.tgt_mask_reg = ISR_INT_TARGET_MASK, \
|
||||
.pci_int_reg = ISR_MSI_INT_TRIGGER(0) }, \
|
||||
\
|
||||
{ \
|
||||
.int_vec_bit = PCIX_INT_VECTOR_BIT_F1, \
|
||||
.tgt_status_reg = ISR_INT_TARGET_STATUS_F1, \
|
||||
.tgt_mask_reg = ISR_INT_TARGET_MASK_F1, \
|
||||
.pci_int_reg = ISR_MSI_INT_TRIGGER(1) }, \
|
||||
\
|
||||
{ \
|
||||
.int_vec_bit = PCIX_INT_VECTOR_BIT_F2, \
|
||||
.tgt_status_reg = ISR_INT_TARGET_STATUS_F2, \
|
||||
.tgt_mask_reg = ISR_INT_TARGET_MASK_F2, \
|
||||
.pci_int_reg = ISR_MSI_INT_TRIGGER(2) }, \
|
||||
\
|
||||
{ \
|
||||
.int_vec_bit = PCIX_INT_VECTOR_BIT_F3, \
|
||||
.tgt_status_reg = ISR_INT_TARGET_STATUS_F3, \
|
||||
.tgt_mask_reg = ISR_INT_TARGET_MASK_F3, \
|
||||
.pci_int_reg = ISR_MSI_INT_TRIGGER(3) }, \
|
||||
\
|
||||
{ \
|
||||
.int_vec_bit = PCIX_INT_VECTOR_BIT_F4, \
|
||||
.tgt_status_reg = ISR_INT_TARGET_STATUS_F4, \
|
||||
.tgt_mask_reg = ISR_INT_TARGET_MASK_F4, \
|
||||
.pci_int_reg = ISR_MSI_INT_TRIGGER(4) }, \
|
||||
\
|
||||
{ \
|
||||
.int_vec_bit = PCIX_INT_VECTOR_BIT_F5, \
|
||||
.tgt_status_reg = ISR_INT_TARGET_STATUS_F5, \
|
||||
.tgt_mask_reg = ISR_INT_TARGET_MASK_F5, \
|
||||
.pci_int_reg = ISR_MSI_INT_TRIGGER(5) }, \
|
||||
\
|
||||
{ \
|
||||
.int_vec_bit = PCIX_INT_VECTOR_BIT_F6, \
|
||||
.tgt_status_reg = ISR_INT_TARGET_STATUS_F6, \
|
||||
.tgt_mask_reg = ISR_INT_TARGET_MASK_F6, \
|
||||
.pci_int_reg = ISR_MSI_INT_TRIGGER(6) }, \
|
||||
\
|
||||
{ \
|
||||
.int_vec_bit = PCIX_INT_VECTOR_BIT_F7, \
|
||||
.tgt_status_reg = ISR_INT_TARGET_STATUS_F7, \
|
||||
.tgt_mask_reg = ISR_INT_TARGET_MASK_F7, \
|
||||
.pci_int_reg = ISR_MSI_INT_TRIGGER(7) }, \
|
||||
}
|
||||
|
||||
#define BOOTLD_START 0x10000
|
||||
#define IMAGE_START 0x100000
|
||||
#define FLASH_ADDR_START 0x43000
|
||||
|
||||
/* Magic number to let user know flash is programmed */
|
||||
#define QLA82XX_BDINFO_MAGIC 0x12345678
|
||||
#define FW_SIZE_OFFSET (0x3e840c)
|
||||
|
||||
#define QLA82XX_IS_REVISION_P3PLUS(_rev_) ((_rev_) >= 0x50)
|
||||
#define MIU_TEST_AGT_WRDATA_UPPER_LO (0x0b0)
|
||||
#define MIU_TEST_AGT_WRDATA_UPPER_HI (0x0b4)
|
||||
|
||||
#ifndef readq
|
||||
static inline u64 readq(void __iomem *addr)
|
||||
{
|
||||
return readl(addr) | (((u64) readl(addr + 4)) << 32LL);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef writeq
|
||||
static inline void writeq(u64 val, void __iomem *addr)
|
||||
{
|
||||
writel(((u32) (val)), (addr));
|
||||
writel(((u32) (val >> 32)), (addr + 4));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Request and response queue size */
|
||||
#define REQUEST_ENTRY_CNT_82XX 128 /* Number of request entries. */
|
||||
#define RESPONSE_ENTRY_CNT_82XX 128 /* Number of response entries.*/
|
||||
|
||||
/*
|
||||
* ISP 8021 I/O Register Set structure definitions.
|
||||
*/
|
||||
struct device_reg_82xx {
|
||||
uint32_t req_q_out[64]; /* Request Queue out-Pointer (64 * 4) */
|
||||
uint32_t rsp_q_in[64]; /* Response Queue In-Pointer. */
|
||||
uint32_t rsp_q_out[64]; /* Response Queue Out-Pointer. */
|
||||
|
||||
uint16_t mailbox_in[32]; /* Mail box In registers */
|
||||
uint16_t unused_1[32];
|
||||
uint32_t hint; /* Host interrupt register */
|
||||
#define HINT_MBX_INT_PENDING BIT_0
|
||||
uint16_t unused_2[62];
|
||||
uint16_t mailbox_out[32]; /* Mail box Out registers */
|
||||
uint32_t unused_3[48];
|
||||
|
||||
uint32_t host_status; /* host status */
|
||||
#define HSRX_RISC_INT BIT_15 /* RISC to Host interrupt. */
|
||||
#define HSRX_RISC_PAUSED BIT_8 /* RISC Paused. */
|
||||
uint32_t host_int; /* Interrupt status. */
|
||||
#define ISRX_NX_RISC_INT BIT_0 /* RISC interrupt. */
|
||||
};
|
||||
|
||||
struct fcp_cmnd {
|
||||
struct scsi_lun lun;
|
||||
uint8_t crn;
|
||||
uint8_t task_attribute;
|
||||
uint8_t task_managment;
|
||||
uint8_t additional_cdb_len;
|
||||
uint8_t cdb[260]; /* 256 for CDB len and 4 for FCP_DL */
|
||||
};
|
||||
|
||||
struct dsd_dma {
|
||||
struct list_head list;
|
||||
dma_addr_t dsd_list_dma;
|
||||
void *dsd_addr;
|
||||
};
|
||||
|
||||
#define QLA_DSDS_PER_IOCB 37
|
||||
#define QLA_DSD_SIZE 12
|
||||
struct ct6_dsd {
|
||||
uint16_t fcp_cmnd_len;
|
||||
dma_addr_t fcp_cmnd_dma;
|
||||
struct fcp_cmnd *fcp_cmnd;
|
||||
int dsd_use_cnt;
|
||||
struct list_head dsd_list;
|
||||
};
|
||||
|
||||
#define MBC_TOGGLE_INTR 0x10
|
||||
|
||||
/* Flash offset */
|
||||
#define FLT_REG_BOOTLOAD_82XX 0x72
|
||||
#define FLT_REG_BOOT_CODE_82XX 0x78
|
||||
#define FLT_REG_FW_82XX 0x74
|
||||
#define FLT_REG_GOLD_FW_82XX 0x75
|
||||
#define FLT_REG_VPD_82XX 0x81
|
||||
|
||||
#define FA_VPD_SIZE_82XX 0x400
|
||||
|
||||
#define FA_FLASH_LAYOUT_ADDR_82 0xFC400
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Definitions specific to M25P flash
|
||||
*
|
||||
*******************************************************************************
|
||||
* Instructions
|
||||
*/
|
||||
#define M25P_INSTR_WREN 0x06
|
||||
#define M25P_INSTR_WRDI 0x04
|
||||
#define M25P_INSTR_RDID 0x9f
|
||||
#define M25P_INSTR_RDSR 0x05
|
||||
#define M25P_INSTR_WRSR 0x01
|
||||
#define M25P_INSTR_READ 0x03
|
||||
#define M25P_INSTR_FAST_READ 0x0b
|
||||
#define M25P_INSTR_PP 0x02
|
||||
#define M25P_INSTR_SE 0xd8
|
||||
#define M25P_INSTR_BE 0xc7
|
||||
#define M25P_INSTR_DP 0xb9
|
||||
#define M25P_INSTR_RES 0xab
|
||||
|
||||
#endif
|
|
@ -29,6 +29,11 @@ char qla2x00_version_str[40];
|
|||
*/
|
||||
static struct kmem_cache *srb_cachep;
|
||||
|
||||
/*
|
||||
* CT6 CTX allocation cache
|
||||
*/
|
||||
static struct kmem_cache *ctx_cachep;
|
||||
|
||||
int ql2xlogintimeout = 20;
|
||||
module_param(ql2xlogintimeout, int, S_IRUGO|S_IRUSR);
|
||||
MODULE_PARM_DESC(ql2xlogintimeout,
|
||||
|
@ -65,6 +70,12 @@ MODULE_PARM_DESC(ql2xextended_error_logging,
|
|||
"Option to enable extended error logging, "
|
||||
"Default is 0 - no logging. 1 - log errors.");
|
||||
|
||||
int ql2xshiftctondsd = 6;
|
||||
module_param(ql2xshiftctondsd, int, S_IRUGO|S_IRUSR);
|
||||
MODULE_PARM_DESC(ql2xshiftctondsd,
|
||||
"Set to control shifting of command type processing "
|
||||
"based on total number of SG elements.");
|
||||
|
||||
static void qla2x00_free_device(scsi_qla_host_t *);
|
||||
|
||||
int ql2xfdmienable=1;
|
||||
|
@ -114,6 +125,21 @@ MODULE_PARM_DESC(ql2xetsenable,
|
|||
"Enables firmware ETS burst."
|
||||
"Default is 0 - skip ETS enablement.");
|
||||
|
||||
int ql2xdbwr;
|
||||
module_param(ql2xdbwr, int, S_IRUGO|S_IRUSR);
|
||||
MODULE_PARM_DESC(ql2xdbwr,
|
||||
"Option to specify scheme for request queue posting\n"
|
||||
" 0 -- Regular doorbell.\n"
|
||||
" 1 -- CAMRAM doorbell (faster).\n");
|
||||
|
||||
int ql2xdontresethba;
|
||||
module_param(ql2xdontresethba, int, S_IRUGO|S_IRUSR);
|
||||
MODULE_PARM_DESC(ql2xdontresethba,
|
||||
"Option to specify reset behaviour\n"
|
||||
" 0 (Default) -- Reset on failure.\n"
|
||||
" 1 -- Do not reset on failure.\n");
|
||||
|
||||
|
||||
/*
|
||||
* SCSI host template entry points
|
||||
*/
|
||||
|
@ -183,6 +209,10 @@ qla2x00_start_timer(scsi_qla_host_t *vha, void *func, unsigned long interval)
|
|||
static inline void
|
||||
qla2x00_restart_timer(scsi_qla_host_t *vha, unsigned long interval)
|
||||
{
|
||||
/* Currently used for 82XX only. */
|
||||
if (vha->device_flags & DFLG_DEV_FAILED)
|
||||
return;
|
||||
|
||||
mod_timer(&vha->timer, jiffies + interval * HZ);
|
||||
}
|
||||
|
||||
|
@ -739,7 +769,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
|
|||
|
||||
if (sp == NULL)
|
||||
continue;
|
||||
if (sp->ctx)
|
||||
if ((sp->ctx) && !(sp->flags & SRB_FCP_CMND_DMA_VALID))
|
||||
continue;
|
||||
if (sp->cmd != cmd)
|
||||
continue;
|
||||
|
@ -834,6 +864,24 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *vha, unsigned int t,
|
|||
return status;
|
||||
}
|
||||
|
||||
void qla82xx_wait_for_pending_commands(scsi_qla_host_t *vha)
|
||||
{
|
||||
int cnt;
|
||||
srb_t *sp;
|
||||
struct req_que *req = vha->req;
|
||||
|
||||
DEBUG2(qla_printk(KERN_INFO, vha->hw,
|
||||
"Waiting for pending commands\n"));
|
||||
for (cnt = 1; cnt < MAX_OUTSTANDING_COMMANDS; cnt++) {
|
||||
sp = req->outstanding_cmds[cnt];
|
||||
if (qla2x00_eh_wait_for_pending_commands(vha, 0, 0,
|
||||
sp, WAIT_HOST) == QLA_SUCCESS) {
|
||||
DEBUG2(qla_printk(KERN_INFO, vha->hw,
|
||||
"Done wait for pending commands\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static char *reset_errors[] = {
|
||||
"HBA not online",
|
||||
"HBA not ready",
|
||||
|
@ -1020,11 +1068,19 @@ qla2xxx_eh_host_reset(struct scsi_cmnd *cmd)
|
|||
if (qla2x00_vp_abort_isp(vha))
|
||||
goto eh_host_reset_lock;
|
||||
} else {
|
||||
if (IS_QLA82XX(vha->hw)) {
|
||||
if (!qla82xx_fcoe_ctx_reset(vha)) {
|
||||
/* Ctx reset success */
|
||||
ret = SUCCESS;
|
||||
goto eh_host_reset_lock;
|
||||
}
|
||||
/* fall thru if ctx reset failed */
|
||||
}
|
||||
if (ha->wq)
|
||||
flush_workqueue(ha->wq);
|
||||
|
||||
set_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
|
||||
if (qla2x00_abort_isp(base_vha)) {
|
||||
if (ha->isp_ops->abort_isp(base_vha)) {
|
||||
clear_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
|
||||
/* failed. schedule dpc to try */
|
||||
set_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags);
|
||||
|
@ -1078,7 +1134,7 @@ qla2x00_loop_reset(scsi_qla_host_t *vha)
|
|||
}
|
||||
}
|
||||
|
||||
if (ha->flags.enable_lip_full_login && !IS_QLA81XX(ha)) {
|
||||
if (ha->flags.enable_lip_full_login && !IS_QLA8XXX_TYPE(ha)) {
|
||||
ret = qla2x00_full_login_lip(vha);
|
||||
if (ret != QLA_SUCCESS) {
|
||||
DEBUG2_3(printk("%s(%ld): failed: "
|
||||
|
@ -1125,7 +1181,8 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
|
|||
sp = req->outstanding_cmds[cnt];
|
||||
if (sp) {
|
||||
req->outstanding_cmds[cnt] = NULL;
|
||||
if (!sp->ctx) {
|
||||
if (!sp->ctx ||
|
||||
(sp->flags & SRB_FCP_CMND_DMA_VALID)) {
|
||||
sp->cmd->result = res;
|
||||
qla2x00_sp_compl(ha, sp);
|
||||
} else {
|
||||
|
@ -1387,6 +1444,7 @@ static struct isp_operations qla2100_isp_ops = {
|
|||
.write_optrom = qla2x00_write_optrom_data,
|
||||
.get_flash_version = qla2x00_get_flash_version,
|
||||
.start_scsi = qla2x00_start_scsi,
|
||||
.abort_isp = qla2x00_abort_isp,
|
||||
};
|
||||
|
||||
static struct isp_operations qla2300_isp_ops = {
|
||||
|
@ -1422,6 +1480,7 @@ static struct isp_operations qla2300_isp_ops = {
|
|||
.write_optrom = qla2x00_write_optrom_data,
|
||||
.get_flash_version = qla2x00_get_flash_version,
|
||||
.start_scsi = qla2x00_start_scsi,
|
||||
.abort_isp = qla2x00_abort_isp,
|
||||
};
|
||||
|
||||
static struct isp_operations qla24xx_isp_ops = {
|
||||
|
@ -1457,6 +1516,7 @@ static struct isp_operations qla24xx_isp_ops = {
|
|||
.write_optrom = qla24xx_write_optrom_data,
|
||||
.get_flash_version = qla24xx_get_flash_version,
|
||||
.start_scsi = qla24xx_start_scsi,
|
||||
.abort_isp = qla2x00_abort_isp,
|
||||
};
|
||||
|
||||
static struct isp_operations qla25xx_isp_ops = {
|
||||
|
@ -1492,6 +1552,7 @@ static struct isp_operations qla25xx_isp_ops = {
|
|||
.write_optrom = qla24xx_write_optrom_data,
|
||||
.get_flash_version = qla24xx_get_flash_version,
|
||||
.start_scsi = qla24xx_start_scsi,
|
||||
.abort_isp = qla2x00_abort_isp,
|
||||
};
|
||||
|
||||
static struct isp_operations qla81xx_isp_ops = {
|
||||
|
@ -1527,6 +1588,43 @@ static struct isp_operations qla81xx_isp_ops = {
|
|||
.write_optrom = qla24xx_write_optrom_data,
|
||||
.get_flash_version = qla24xx_get_flash_version,
|
||||
.start_scsi = qla24xx_start_scsi,
|
||||
.abort_isp = qla2x00_abort_isp,
|
||||
};
|
||||
|
||||
static struct isp_operations qla82xx_isp_ops = {
|
||||
.pci_config = qla82xx_pci_config,
|
||||
.reset_chip = qla82xx_reset_chip,
|
||||
.chip_diag = qla24xx_chip_diag,
|
||||
.config_rings = qla82xx_config_rings,
|
||||
.reset_adapter = qla24xx_reset_adapter,
|
||||
.nvram_config = qla81xx_nvram_config,
|
||||
.update_fw_options = qla24xx_update_fw_options,
|
||||
.load_risc = qla82xx_load_risc,
|
||||
.pci_info_str = qla82xx_pci_info_str,
|
||||
.fw_version_str = qla24xx_fw_version_str,
|
||||
.intr_handler = qla82xx_intr_handler,
|
||||
.enable_intrs = qla82xx_enable_intrs,
|
||||
.disable_intrs = qla82xx_disable_intrs,
|
||||
.abort_command = qla24xx_abort_command,
|
||||
.target_reset = qla24xx_abort_target,
|
||||
.lun_reset = qla24xx_lun_reset,
|
||||
.fabric_login = qla24xx_login_fabric,
|
||||
.fabric_logout = qla24xx_fabric_logout,
|
||||
.calc_req_entries = NULL,
|
||||
.build_iocbs = NULL,
|
||||
.prep_ms_iocb = qla24xx_prep_ms_iocb,
|
||||
.prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb,
|
||||
.read_nvram = qla24xx_read_nvram_data,
|
||||
.write_nvram = qla24xx_write_nvram_data,
|
||||
.fw_dump = qla24xx_fw_dump,
|
||||
.beacon_on = qla24xx_beacon_on,
|
||||
.beacon_off = qla24xx_beacon_off,
|
||||
.beacon_blink = qla24xx_beacon_blink,
|
||||
.read_optrom = qla82xx_read_optrom_data,
|
||||
.write_optrom = qla82xx_write_optrom_data,
|
||||
.get_flash_version = qla24xx_get_flash_version,
|
||||
.start_scsi = qla82xx_start_scsi,
|
||||
.abort_isp = qla82xx_abort_isp,
|
||||
};
|
||||
|
||||
static inline void
|
||||
|
@ -1615,10 +1713,22 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha)
|
|||
ha->device_type |= DT_IIDMA;
|
||||
ha->fw_srisc_address = RISC_START_ADDRESS_2400;
|
||||
break;
|
||||
case PCI_DEVICE_ID_QLOGIC_ISP8021:
|
||||
ha->device_type |= DT_ISP8021;
|
||||
ha->device_type |= DT_ZIO_SUPPORTED;
|
||||
ha->device_type |= DT_FWI2;
|
||||
ha->fw_srisc_address = RISC_START_ADDRESS_2400;
|
||||
/* Initialize 82XX ISP flags */
|
||||
qla82xx_init_flags(ha);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Get adapter physical port no from interrupt pin register. */
|
||||
pci_read_config_byte(ha->pdev, PCI_INTERRUPT_PIN, &ha->port_no);
|
||||
if (IS_QLA82XX(ha))
|
||||
ha->port_no = !(ha->portnum & 1);
|
||||
else
|
||||
/* Get adapter physical port no from interrupt pin register. */
|
||||
pci_read_config_byte(ha->pdev, PCI_INTERRUPT_PIN, &ha->port_no);
|
||||
|
||||
if (ha->port_no & 1)
|
||||
ha->flags.port0 = 1;
|
||||
else
|
||||
|
@ -1632,6 +1742,9 @@ qla2x00_iospace_config(struct qla_hw_data *ha)
|
|||
uint16_t msix;
|
||||
int cpus;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return qla82xx_iospace_config(ha);
|
||||
|
||||
if (pci_request_selected_regions(ha->pdev, ha->bars,
|
||||
QLA2XXX_DRIVER_NAME)) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
|
@ -1775,7 +1888,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5422 ||
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 ||
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532 ||
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8001) {
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8001 ||
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8021) {
|
||||
bars = pci_select_bars(pdev, IORESOURCE_MEM);
|
||||
mem_only = 1;
|
||||
}
|
||||
|
@ -1905,6 +2019,19 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX;
|
||||
ha->nvram_conf_off = ~0;
|
||||
ha->nvram_data_off = ~0;
|
||||
} else if (IS_QLA82XX(ha)) {
|
||||
ha->mbx_count = MAILBOX_REGISTER_COUNT;
|
||||
req_length = REQUEST_ENTRY_CNT_82XX;
|
||||
rsp_length = RESPONSE_ENTRY_CNT_82XX;
|
||||
ha->max_loop_id = SNS_LAST_LOOP_ID_2300;
|
||||
ha->init_cb_size = sizeof(struct mid_init_cb_81xx);
|
||||
ha->gid_list_info_size = 8;
|
||||
ha->optrom_size = OPTROM_SIZE_82XX;
|
||||
ha->isp_ops = &qla82xx_isp_ops;
|
||||
ha->flash_conf_off = FARX_ACCESS_FLASH_CONF;
|
||||
ha->flash_data_off = FARX_ACCESS_FLASH_DATA;
|
||||
ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
|
||||
ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
|
||||
}
|
||||
|
||||
mutex_init(&ha->vport_lock);
|
||||
|
@ -1977,6 +2104,7 @@ que_init:
|
|||
" pointers\n");
|
||||
goto probe_init_failed;
|
||||
}
|
||||
|
||||
ha->rsp_q_map[0] = rsp;
|
||||
ha->req_q_map[0] = req;
|
||||
rsp->req = req;
|
||||
|
@ -1995,6 +2123,12 @@ que_init:
|
|||
rsp->rsp_q_out = &ha->mqiobase->isp25mq.rsp_q_out;
|
||||
}
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
req->req_q_out = &ha->iobase->isp82.req_q_out[0];
|
||||
rsp->rsp_q_in = &ha->iobase->isp82.rsp_q_in[0];
|
||||
rsp->rsp_q_out = &ha->iobase->isp82.rsp_q_out[0];
|
||||
}
|
||||
|
||||
if (qla2x00_initialize_adapter(base_vha)) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"Failed to initialize adapter\n");
|
||||
|
@ -2003,6 +2137,14 @@ que_init:
|
|||
"Adapter flags %x.\n",
|
||||
base_vha->host_no, base_vha->device_flags));
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
|
||||
QLA82XX_DEV_FAILED);
|
||||
qla82xx_idc_unlock(ha);
|
||||
qla_printk(KERN_INFO, ha, "HW State: FAILED\n");
|
||||
}
|
||||
|
||||
ret = -ENODEV;
|
||||
goto probe_failed;
|
||||
}
|
||||
|
@ -2041,6 +2183,8 @@ skip_dpc:
|
|||
DEBUG2(printk("DEBUG: detect hba %ld at address = %p\n",
|
||||
base_vha->host_no, ha));
|
||||
|
||||
ha->isp_ops->enable_intrs(ha);
|
||||
|
||||
ret = scsi_add_host(host, &pdev->dev);
|
||||
if (ret)
|
||||
goto probe_failed;
|
||||
|
@ -2048,8 +2192,6 @@ skip_dpc:
|
|||
base_vha->flags.init_done = 1;
|
||||
base_vha->flags.online = 1;
|
||||
|
||||
ha->isp_ops->enable_intrs(ha);
|
||||
|
||||
scsi_scan_host(host);
|
||||
|
||||
qla2x00_alloc_sysfs_attr(base_vha);
|
||||
|
@ -2091,9 +2233,17 @@ probe_failed:
|
|||
scsi_host_put(base_vha->host);
|
||||
|
||||
probe_hw_failed:
|
||||
if (ha->iobase)
|
||||
iounmap(ha->iobase);
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_clear_drv_active(ha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
iounmap((device_reg_t __iomem *)ha->nx_pcibase);
|
||||
if (!ql2xdbwr)
|
||||
iounmap((device_reg_t __iomem *)ha->nxdb_wr_ptr);
|
||||
} else {
|
||||
if (ha->iobase)
|
||||
iounmap(ha->iobase);
|
||||
}
|
||||
pci_release_selected_regions(ha->pdev, ha->bars);
|
||||
kfree(ha);
|
||||
ha = NULL;
|
||||
|
@ -2160,11 +2310,17 @@ qla2x00_remove_one(struct pci_dev *pdev)
|
|||
|
||||
scsi_host_put(base_vha->host);
|
||||
|
||||
if (ha->iobase)
|
||||
iounmap(ha->iobase);
|
||||
if (IS_QLA82XX(ha)) {
|
||||
iounmap((device_reg_t __iomem *)ha->nx_pcibase);
|
||||
if (!ql2xdbwr)
|
||||
iounmap((device_reg_t __iomem *)ha->nxdb_wr_ptr);
|
||||
} else {
|
||||
if (ha->iobase)
|
||||
iounmap(ha->iobase);
|
||||
|
||||
if (ha->mqiobase)
|
||||
iounmap(ha->mqiobase);
|
||||
if (ha->mqiobase)
|
||||
iounmap(ha->mqiobase);
|
||||
}
|
||||
|
||||
pci_release_selected_regions(ha->pdev, ha->bars);
|
||||
kfree(ha);
|
||||
|
@ -2213,8 +2369,10 @@ qla2x00_free_device(scsi_qla_host_t *vha)
|
|||
vha->flags.online = 0;
|
||||
|
||||
/* turn-off interrupts on the card */
|
||||
if (ha->interrupts_on)
|
||||
if (ha->interrupts_on) {
|
||||
vha->flags.init_done = 0;
|
||||
ha->isp_ops->disable_intrs(ha);
|
||||
}
|
||||
|
||||
qla2x00_free_irqs(vha);
|
||||
|
||||
|
@ -2359,10 +2517,25 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
|||
if (!ha->srb_mempool)
|
||||
goto fail_free_gid_list;
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
/* Allocate cache for CT6 Ctx. */
|
||||
if (!ctx_cachep) {
|
||||
ctx_cachep = kmem_cache_create("qla2xxx_ctx",
|
||||
sizeof(struct ct6_dsd), 0,
|
||||
SLAB_HWCACHE_ALIGN, NULL);
|
||||
if (!ctx_cachep)
|
||||
goto fail_free_gid_list;
|
||||
}
|
||||
ha->ctx_mempool = mempool_create_slab_pool(SRB_MIN_REQ,
|
||||
ctx_cachep);
|
||||
if (!ha->ctx_mempool)
|
||||
goto fail_free_srb_mempool;
|
||||
}
|
||||
|
||||
/* Get memory for cached NVRAM */
|
||||
ha->nvram = kzalloc(MAX_NVRAM_SIZE, GFP_KERNEL);
|
||||
if (!ha->nvram)
|
||||
goto fail_free_srb_mempool;
|
||||
goto fail_free_ctx_mempool;
|
||||
|
||||
snprintf(name, sizeof(name), "%s_%d", QLA2XXX_DRIVER_NAME,
|
||||
ha->pdev->device);
|
||||
|
@ -2371,6 +2544,24 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
|||
if (!ha->s_dma_pool)
|
||||
goto fail_free_nvram;
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
ha->dl_dma_pool = dma_pool_create(name, &ha->pdev->dev,
|
||||
DSD_LIST_DMA_POOL_SIZE, 8, 0);
|
||||
if (!ha->dl_dma_pool) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"Memory Allocation failed - dl_dma_pool\n");
|
||||
goto fail_s_dma_pool;
|
||||
}
|
||||
|
||||
ha->fcp_cmnd_dma_pool = dma_pool_create(name, &ha->pdev->dev,
|
||||
FCP_CMND_DMA_POOL_SIZE, 8, 0);
|
||||
if (!ha->fcp_cmnd_dma_pool) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"Memory Allocation failed - fcp_cmnd_dma_pool\n");
|
||||
goto fail_dl_dma_pool;
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate memory for SNS commands */
|
||||
if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
|
||||
/* Get consistent memory allocated for SNS commands */
|
||||
|
@ -2437,13 +2628,15 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
|||
ha->npiv_info = NULL;
|
||||
|
||||
/* Get consistent memory allocated for EX-INIT-CB. */
|
||||
if (IS_QLA81XX(ha)) {
|
||||
if (IS_QLA8XXX_TYPE(ha)) {
|
||||
ha->ex_init_cb = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
|
||||
&ha->ex_init_cb_dma);
|
||||
if (!ha->ex_init_cb)
|
||||
goto fail_ex_init_cb;
|
||||
}
|
||||
|
||||
INIT_LIST_HEAD(&ha->gbl_dsd_list);
|
||||
|
||||
INIT_LIST_HEAD(&ha->vp_list);
|
||||
return 1;
|
||||
|
||||
|
@ -2473,11 +2666,24 @@ fail_free_ms_iocb:
|
|||
ha->ms_iocb = NULL;
|
||||
ha->ms_iocb_dma = 0;
|
||||
fail_dma_pool:
|
||||
if (IS_QLA82XX(ha)) {
|
||||
dma_pool_destroy(ha->fcp_cmnd_dma_pool);
|
||||
ha->fcp_cmnd_dma_pool = NULL;
|
||||
}
|
||||
fail_dl_dma_pool:
|
||||
if (IS_QLA82XX(ha)) {
|
||||
dma_pool_destroy(ha->dl_dma_pool);
|
||||
ha->dl_dma_pool = NULL;
|
||||
}
|
||||
fail_s_dma_pool:
|
||||
dma_pool_destroy(ha->s_dma_pool);
|
||||
ha->s_dma_pool = NULL;
|
||||
fail_free_nvram:
|
||||
kfree(ha->nvram);
|
||||
ha->nvram = NULL;
|
||||
fail_free_ctx_mempool:
|
||||
mempool_destroy(ha->ctx_mempool);
|
||||
ha->ctx_mempool = NULL;
|
||||
fail_free_srb_mempool:
|
||||
mempool_destroy(ha->srb_mempool);
|
||||
ha->srb_mempool = NULL;
|
||||
|
@ -2546,7 +2752,8 @@ qla2x00_mem_free(struct qla_hw_data *ha)
|
|||
dma_pool_free(ha->s_dma_pool, ha->ms_iocb, ha->ms_iocb_dma);
|
||||
|
||||
if (ha->ex_init_cb)
|
||||
dma_pool_free(ha->s_dma_pool, ha->ex_init_cb, ha->ex_init_cb_dma);
|
||||
dma_pool_free(ha->s_dma_pool,
|
||||
ha->ex_init_cb, ha->ex_init_cb_dma);
|
||||
|
||||
if (ha->s_dma_pool)
|
||||
dma_pool_destroy(ha->s_dma_pool);
|
||||
|
@ -2555,14 +2762,39 @@ qla2x00_mem_free(struct qla_hw_data *ha)
|
|||
dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list,
|
||||
ha->gid_list_dma);
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (!list_empty(&ha->gbl_dsd_list)) {
|
||||
struct dsd_dma *dsd_ptr, *tdsd_ptr;
|
||||
|
||||
/* clean up allocated prev pool */
|
||||
list_for_each_entry_safe(dsd_ptr,
|
||||
tdsd_ptr, &ha->gbl_dsd_list, list) {
|
||||
dma_pool_free(ha->dl_dma_pool,
|
||||
dsd_ptr->dsd_addr, dsd_ptr->dsd_list_dma);
|
||||
list_del(&dsd_ptr->list);
|
||||
kfree(dsd_ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ha->dl_dma_pool)
|
||||
dma_pool_destroy(ha->dl_dma_pool);
|
||||
|
||||
if (ha->fcp_cmnd_dma_pool)
|
||||
dma_pool_destroy(ha->fcp_cmnd_dma_pool);
|
||||
|
||||
if (ha->ctx_mempool)
|
||||
mempool_destroy(ha->ctx_mempool);
|
||||
|
||||
if (ha->init_cb)
|
||||
dma_free_coherent(&ha->pdev->dev, ha->init_cb_size,
|
||||
ha->init_cb, ha->init_cb_dma);
|
||||
ha->init_cb, ha->init_cb_dma);
|
||||
vfree(ha->optrom_buffer);
|
||||
kfree(ha->nvram);
|
||||
kfree(ha->npiv_info);
|
||||
|
||||
ha->srb_mempool = NULL;
|
||||
ha->ctx_mempool = NULL;
|
||||
ha->eft = NULL;
|
||||
ha->eft_dma = 0;
|
||||
ha->sns_cmd = NULL;
|
||||
|
@ -2577,6 +2809,8 @@ qla2x00_mem_free(struct qla_hw_data *ha)
|
|||
ha->ex_init_cb_dma = 0;
|
||||
|
||||
ha->s_dma_pool = NULL;
|
||||
ha->dl_dma_pool = NULL;
|
||||
ha->fcp_cmnd_dma_pool = NULL;
|
||||
|
||||
ha->gid_list = NULL;
|
||||
ha->gid_list_dma = 0;
|
||||
|
@ -2904,6 +3138,45 @@ qla2x00_do_dpc(void *data)
|
|||
|
||||
qla2x00_do_work(base_vha);
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (test_and_clear_bit(ISP_UNRECOVERABLE,
|
||||
&base_vha->dpc_flags)) {
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
|
||||
QLA82XX_DEV_FAILED);
|
||||
qla82xx_idc_unlock(ha);
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"HW State: FAILED\n");
|
||||
qla82xx_device_state_handler(base_vha);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(FCOE_CTX_RESET_NEEDED,
|
||||
&base_vha->dpc_flags)) {
|
||||
|
||||
DEBUG(printk(KERN_INFO
|
||||
"scsi(%ld): dpc: sched "
|
||||
"qla82xx_fcoe_ctx_reset ha = %p\n",
|
||||
base_vha->host_no, ha));
|
||||
if (!(test_and_set_bit(ABORT_ISP_ACTIVE,
|
||||
&base_vha->dpc_flags))) {
|
||||
if (qla82xx_fcoe_ctx_reset(base_vha)) {
|
||||
/* FCoE-ctx reset failed.
|
||||
* Escalate to chip-reset
|
||||
*/
|
||||
set_bit(ISP_ABORT_NEEDED,
|
||||
&base_vha->dpc_flags);
|
||||
}
|
||||
clear_bit(ABORT_ISP_ACTIVE,
|
||||
&base_vha->dpc_flags);
|
||||
}
|
||||
|
||||
DEBUG(printk("scsi(%ld): dpc:"
|
||||
" qla82xx_fcoe_ctx_reset end\n",
|
||||
base_vha->host_no));
|
||||
}
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(ISP_ABORT_NEEDED,
|
||||
&base_vha->dpc_flags)) {
|
||||
|
||||
|
@ -2913,7 +3186,7 @@ qla2x00_do_dpc(void *data)
|
|||
if (!(test_and_set_bit(ABORT_ISP_ACTIVE,
|
||||
&base_vha->dpc_flags))) {
|
||||
|
||||
if (qla2x00_abort_isp(base_vha)) {
|
||||
if (ha->isp_ops->abort_isp(base_vha)) {
|
||||
/* failed. retry later */
|
||||
set_bit(ISP_ABORT_NEEDED,
|
||||
&base_vha->dpc_flags);
|
||||
|
@ -3061,8 +3334,18 @@ qla2x00_sp_compl(struct qla_hw_data *ha, srb_t *sp)
|
|||
|
||||
qla2x00_sp_free_dma(sp);
|
||||
|
||||
mempool_free(sp, ha->srb_mempool);
|
||||
if (sp->flags & SRB_FCP_CMND_DMA_VALID) {
|
||||
struct ct6_dsd *ctx = sp->ctx;
|
||||
dma_pool_free(ha->fcp_cmnd_dma_pool, ctx->fcp_cmnd,
|
||||
ctx->fcp_cmnd_dma);
|
||||
list_splice(&ctx->dsd_list, &ha->gbl_dsd_list);
|
||||
ha->gbl_dsd_inuse -= ctx->dsd_use_cnt;
|
||||
ha->gbl_dsd_avail += ctx->dsd_use_cnt;
|
||||
mempool_free(sp->ctx, ha->ctx_mempool);
|
||||
sp->ctx = NULL;
|
||||
}
|
||||
|
||||
mempool_free(sp, ha->srb_mempool);
|
||||
cmd->scsi_done(cmd);
|
||||
}
|
||||
|
||||
|
@ -3087,6 +3370,9 @@ qla2x00_timer(scsi_qla_host_t *vha)
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
struct req_que *req;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
qla82xx_watchdog(vha);
|
||||
|
||||
/* Hardware read to raise pending EEH errors during mailbox waits. */
|
||||
if (!pci_channel_offline(ha->pdev))
|
||||
pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w);
|
||||
|
@ -3201,6 +3487,8 @@ qla2x00_timer(scsi_qla_host_t *vha)
|
|||
start_dpc ||
|
||||
test_bit(RESET_MARKER_NEEDED, &vha->dpc_flags) ||
|
||||
test_bit(BEACON_BLINK_NEEDED, &vha->dpc_flags) ||
|
||||
test_bit(ISP_UNRECOVERABLE, &vha->dpc_flags) ||
|
||||
test_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags) ||
|
||||
test_bit(VP_DPC_NEEDED, &vha->dpc_flags) ||
|
||||
test_bit(RELOGIN_NEEDED, &vha->dpc_flags)))
|
||||
qla2xxx_wake_dpc(vha);
|
||||
|
@ -3210,7 +3498,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
|
|||
|
||||
/* Firmware interface routines. */
|
||||
|
||||
#define FW_BLOBS 7
|
||||
#define FW_BLOBS 8
|
||||
#define FW_ISP21XX 0
|
||||
#define FW_ISP22XX 1
|
||||
#define FW_ISP2300 2
|
||||
|
@ -3218,6 +3506,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
|
|||
#define FW_ISP24XX 4
|
||||
#define FW_ISP25XX 5
|
||||
#define FW_ISP81XX 6
|
||||
#define FW_ISP82XX 7
|
||||
|
||||
#define FW_FILE_ISP21XX "ql2100_fw.bin"
|
||||
#define FW_FILE_ISP22XX "ql2200_fw.bin"
|
||||
|
@ -3226,6 +3515,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
|
|||
#define FW_FILE_ISP24XX "ql2400_fw.bin"
|
||||
#define FW_FILE_ISP25XX "ql2500_fw.bin"
|
||||
#define FW_FILE_ISP81XX "ql8100_fw.bin"
|
||||
#define FW_FILE_ISP82XX "ql8200_fw.bin"
|
||||
|
||||
static DEFINE_MUTEX(qla_fw_lock);
|
||||
|
||||
|
@ -3237,6 +3527,7 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = {
|
|||
{ .name = FW_FILE_ISP24XX, },
|
||||
{ .name = FW_FILE_ISP25XX, },
|
||||
{ .name = FW_FILE_ISP81XX, },
|
||||
{ .name = FW_FILE_ISP82XX, },
|
||||
};
|
||||
|
||||
struct fw_blob *
|
||||
|
@ -3260,6 +3551,8 @@ qla2x00_request_firmware(scsi_qla_host_t *vha)
|
|||
blob = &qla_fw_blobs[FW_ISP25XX];
|
||||
} else if (IS_QLA81XX(ha)) {
|
||||
blob = &qla_fw_blobs[FW_ISP81XX];
|
||||
} else if (IS_QLA82XX(ha)) {
|
||||
blob = &qla_fw_blobs[FW_ISP82XX];
|
||||
}
|
||||
|
||||
mutex_lock(&qla_fw_lock);
|
||||
|
@ -3400,7 +3693,7 @@ qla2xxx_pci_slot_reset(struct pci_dev *pdev)
|
|||
msleep(1000);
|
||||
|
||||
set_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
|
||||
if (qla2x00_abort_isp(base_vha) == QLA_SUCCESS)
|
||||
if (ha->isp_ops->abort_isp(base_vha) == QLA_SUCCESS)
|
||||
ret = PCI_ERS_RESULT_RECOVERED;
|
||||
clear_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
|
||||
|
||||
|
@ -3453,6 +3746,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = {
|
|||
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8001) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8021) },
|
||||
{ 0 },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl);
|
||||
|
@ -3524,6 +3818,8 @@ qla2x00_module_exit(void)
|
|||
pci_unregister_driver(&qla2xxx_pci_driver);
|
||||
qla2x00_release_firmware();
|
||||
kmem_cache_destroy(srb_cachep);
|
||||
if (ctx_cachep)
|
||||
kmem_cache_destroy(ctx_cachep);
|
||||
fc_release_transport(qla2xxx_transport_template);
|
||||
fc_release_transport(qla2xxx_transport_vport_template);
|
||||
}
|
||||
|
|
|
@ -423,9 +423,6 @@ qla2x00_set_nvram_protection(struct qla_hw_data *ha, int stat)
|
|||
/* Flash Manipulation Routines */
|
||||
/*****************************************************************************/
|
||||
|
||||
#define OPTROM_BURST_SIZE 0x1000
|
||||
#define OPTROM_BURST_DWORDS (OPTROM_BURST_SIZE / 4)
|
||||
|
||||
static inline uint32_t
|
||||
flash_conf_addr(struct qla_hw_data *ha, uint32_t faddr)
|
||||
{
|
||||
|
@ -565,6 +562,10 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start)
|
|||
*start = FA_FLASH_LAYOUT_ADDR;
|
||||
else if (IS_QLA81XX(ha))
|
||||
*start = FA_FLASH_LAYOUT_ADDR_81;
|
||||
else if (IS_QLA82XX(ha)) {
|
||||
*start = FA_FLASH_LAYOUT_ADDR_82;
|
||||
goto end;
|
||||
}
|
||||
/* Begin with first PCI expansion ROM header. */
|
||||
buf = (uint8_t *)req->ring;
|
||||
dcode = (uint32_t *)req->ring;
|
||||
|
@ -709,10 +710,14 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
|
|||
break;
|
||||
case FLT_REG_VPD_0:
|
||||
ha->flt_region_vpd_nvram = start;
|
||||
if (IS_QLA82XX(ha))
|
||||
break;
|
||||
if (ha->flags.port0)
|
||||
ha->flt_region_vpd = start;
|
||||
break;
|
||||
case FLT_REG_VPD_1:
|
||||
if (IS_QLA82XX(ha))
|
||||
break;
|
||||
if (!ha->flags.port0)
|
||||
ha->flt_region_vpd = start;
|
||||
break;
|
||||
|
@ -746,6 +751,21 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
|
|||
if (!ha->flags.port0)
|
||||
ha->flt_region_fcp_prio = start;
|
||||
break;
|
||||
case FLT_REG_BOOT_CODE_82XX:
|
||||
ha->flt_region_boot = start;
|
||||
break;
|
||||
case FLT_REG_FW_82XX:
|
||||
ha->flt_region_fw = start;
|
||||
break;
|
||||
case FLT_REG_GOLD_FW_82XX:
|
||||
ha->flt_region_gold_fw = start;
|
||||
break;
|
||||
case FLT_REG_BOOTLOAD_82XX:
|
||||
ha->flt_region_bootload = start;
|
||||
break;
|
||||
case FLT_REG_VPD_82XX:
|
||||
ha->flt_region_vpd = start;
|
||||
break;
|
||||
}
|
||||
}
|
||||
goto done;
|
||||
|
@ -791,7 +811,7 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha)
|
|||
uint16_t *wptr;
|
||||
struct qla_fdt_layout *fdt;
|
||||
uint8_t man_id, flash_id;
|
||||
uint16_t mid, fid;
|
||||
uint16_t mid = 0, fid = 0;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
struct req_que *req = ha->req_q_map[0];
|
||||
|
||||
|
@ -832,6 +852,10 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha)
|
|||
goto done;
|
||||
no_flash_data:
|
||||
loc = locations[0];
|
||||
if (IS_QLA82XX(ha)) {
|
||||
ha->fdt_block_size = FLASH_BLK_SIZE_64K;
|
||||
goto done;
|
||||
}
|
||||
qla24xx_get_flash_manufacturer(ha, &man_id, &flash_id);
|
||||
mid = man_id;
|
||||
fid = flash_id;
|
||||
|
@ -869,6 +893,31 @@ done:
|
|||
ha->fdt_block_size));
|
||||
}
|
||||
|
||||
static void
|
||||
qla2xxx_get_idc_param(scsi_qla_host_t *vha)
|
||||
{
|
||||
#define QLA82XX_IDC_PARAM_ADDR 0x003e885c
|
||||
uint32_t *wptr;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
struct req_que *req = ha->req_q_map[0];
|
||||
|
||||
if (!IS_QLA82XX(ha))
|
||||
return;
|
||||
|
||||
wptr = (uint32_t *)req->ring;
|
||||
ha->isp_ops->read_optrom(vha, (uint8_t *)req->ring,
|
||||
QLA82XX_IDC_PARAM_ADDR , 8);
|
||||
|
||||
if (*wptr == __constant_cpu_to_le32(0xffffffff)) {
|
||||
ha->nx_dev_init_timeout = QLA82XX_ROM_DEV_INIT_TIMEOUT;
|
||||
ha->nx_reset_timeout = QLA82XX_ROM_DRV_RESET_ACK_TIMEOUT;
|
||||
} else {
|
||||
ha->nx_dev_init_timeout = le32_to_cpu(*wptr++);
|
||||
ha->nx_reset_timeout = le32_to_cpu(*wptr);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int
|
||||
qla2xxx_get_flash_info(scsi_qla_host_t *vha)
|
||||
{
|
||||
|
@ -876,7 +925,7 @@ qla2xxx_get_flash_info(scsi_qla_host_t *vha)
|
|||
uint32_t flt_addr;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA81XX(ha))
|
||||
if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA8XXX_TYPE(ha))
|
||||
return QLA_SUCCESS;
|
||||
|
||||
ret = qla2xxx_find_flt_start(vha, &flt_addr);
|
||||
|
@ -885,6 +934,7 @@ qla2xxx_get_flash_info(scsi_qla_host_t *vha)
|
|||
|
||||
qla2xxx_get_flt_info(vha, flt_addr);
|
||||
qla2xxx_get_fdt_info(vha);
|
||||
qla2xxx_get_idc_param(vha);
|
||||
|
||||
return QLA_SUCCESS;
|
||||
}
|
||||
|
@ -901,7 +951,7 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha)
|
|||
struct qla_npiv_entry *entry;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA81XX(ha))
|
||||
if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && !IS_QLA8XXX_TYPE(ha))
|
||||
return;
|
||||
|
||||
ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr,
|
||||
|
@ -1194,6 +1244,9 @@ qla24xx_read_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr,
|
|||
uint32_t *dwptr;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return buf;
|
||||
|
||||
/* Dword reads to flash. */
|
||||
dwptr = (uint32_t *)buf;
|
||||
for (i = 0; i < bytes >> 2; i++, naddr++)
|
||||
|
@ -1249,6 +1302,9 @@ qla24xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr,
|
|||
|
||||
ret = QLA_SUCCESS;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return ret;
|
||||
|
||||
/* Enable flash write. */
|
||||
WRT_REG_DWORD(®->ctrl_status,
|
||||
RD_REG_DWORD(®->ctrl_status) | CSRX_FLASH_ENABLE);
|
||||
|
@ -1360,6 +1416,9 @@ qla2x00_beacon_blink(struct scsi_qla_host *vha)
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
||||
/* Save the Original GPIOE. */
|
||||
|
@ -1541,6 +1600,9 @@ qla24xx_beacon_on(struct scsi_qla_host *vha)
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return QLA_SUCCESS;
|
||||
|
||||
if (ha->beacon_blink_led == 0) {
|
||||
/* Enable firmware for update */
|
||||
ha->fw_options[1] |= ADD_FO1_DISABLE_GPIO_LED_CTRL;
|
||||
|
@ -1583,6 +1645,9 @@ qla24xx_beacon_off(struct scsi_qla_host *vha)
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return QLA_SUCCESS;
|
||||
|
||||
ha->beacon_blink_led = 0;
|
||||
ha->beacon_color_state = QLA_LED_ALL_ON;
|
||||
|
||||
|
@ -2592,6 +2657,9 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf)
|
|||
int i;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
return ret;
|
||||
|
||||
if (!mbuf)
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче