[SCSI] qla2xxx: Add support for ISP8044.
[jejb: checkpatch fixes] Signed-off-by: Atul Deshmukh <atul.deshmukh@qlogic.com> Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
7b83355890
commit
7ec0effd30
18 changed files with 4849 additions and 158 deletions
|
@ -1,6 +1,6 @@
|
|||
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_nx.o qla_mr.o qla_target.o
|
||||
qla_nx.o qla_mr.o qla_nx2.o qla_target.o
|
||||
|
||||
obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o
|
||||
obj-$(CONFIG_TCM_QLA2XXX) += tcm_qla2xxx.o
|
||||
|
|
|
@ -29,7 +29,7 @@ qla2x00_sysfs_read_fw_dump(struct file *filp, struct kobject *kobj,
|
|||
if (!(ha->fw_dump_reading || ha->mctp_dump_reading))
|
||||
return 0;
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
if (off < ha->md_template_size) {
|
||||
rval = memory_read_from_buffer(buf, count,
|
||||
&off, ha->md_tmplt_hdr, ha->md_template_size);
|
||||
|
@ -71,7 +71,7 @@ qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj,
|
|||
ql_log(ql_log_info, vha, 0x705d,
|
||||
"Firmware dump cleared on (%ld).\n", vha->host_no);
|
||||
|
||||
if (IS_QLA82XX(vha->hw)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
qla82xx_md_free(vha);
|
||||
qla82xx_md_prep(vha);
|
||||
}
|
||||
|
@ -95,11 +95,15 @@ qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj,
|
|||
qla82xx_idc_lock(ha);
|
||||
qla82xx_set_reset_owner(vha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
} else if (IS_QLA8044(ha)) {
|
||||
qla8044_idc_lock(ha);
|
||||
qla82xx_set_reset_owner(vha);
|
||||
qla8044_idc_unlock(ha);
|
||||
} else
|
||||
qla2x00_system_error(vha);
|
||||
break;
|
||||
case 4:
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
if (ha->md_tmplt_hdr)
|
||||
ql_dbg(ql_dbg_user, vha, 0x705b,
|
||||
"MiniDump supported with this firmware.\n");
|
||||
|
@ -109,7 +113,7 @@ qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj,
|
|||
}
|
||||
break;
|
||||
case 5:
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
break;
|
||||
case 6:
|
||||
|
@ -597,14 +601,23 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
|
|||
"Issuing ISP reset.\n");
|
||||
|
||||
scsi_block_requests(vha->host);
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
if (IS_QLA82XX(ha)) {
|
||||
ha->flags.isp82xx_no_md_cap = 1;
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_set_reset_owner(vha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
} else if (IS_QLA8044(ha)) {
|
||||
qla8044_idc_lock(ha);
|
||||
idc_control = qla8044_rd_reg(ha,
|
||||
QLA8044_IDC_DRV_CTRL);
|
||||
qla8044_wr_reg(ha, QLA8044_IDC_DRV_CTRL,
|
||||
(idc_control | GRACEFUL_RESET_BIT1));
|
||||
qla82xx_set_reset_owner(vha);
|
||||
qla8044_idc_unlock(ha);
|
||||
} else {
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
qla2xxx_wake_dpc(vha);
|
||||
}
|
||||
qla2xxx_wake_dpc(vha);
|
||||
qla2x00_wait_for_chip_reset(vha);
|
||||
scsi_unblock_requests(vha->host);
|
||||
break;
|
||||
|
@ -640,7 +653,7 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
|
|||
break;
|
||||
}
|
||||
case 0x2025e:
|
||||
if (!IS_QLA82XX(ha) || vha != base_vha) {
|
||||
if (!IS_P3P_TYPE(ha) || vha != base_vha) {
|
||||
ql_log(ql_log_info, vha, 0x7071,
|
||||
"FCoE ctx reset no supported.\n");
|
||||
return -EPERM;
|
||||
|
@ -1212,7 +1225,7 @@ qla2x00_mpi_version_show(struct device *dev, struct device_attribute *attr,
|
|||
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
|
||||
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha))
|
||||
return snprintf(buf, PAGE_SIZE, "\n");
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%x)\n",
|
||||
|
|
|
@ -125,7 +125,7 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)
|
|||
uint32_t len;
|
||||
uint32_t oper;
|
||||
|
||||
if (!(IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_QLA82XX(ha))) {
|
||||
if (!(IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha) || IS_P3P_TYPE(ha))) {
|
||||
ret = -EINVAL;
|
||||
goto exit_fcp_prio_cfg;
|
||||
}
|
||||
|
@ -559,7 +559,7 @@ qla81xx_reset_loopback_mode(scsi_qla_host_t *vha, uint16_t *config,
|
|||
uint16_t new_config[4];
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
|
||||
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha))
|
||||
goto done_reset_internal;
|
||||
|
||||
memset(new_config, 0 , sizeof(new_config));
|
||||
|
@ -629,7 +629,7 @@ qla81xx_set_loopback_mode(scsi_qla_host_t *vha, uint16_t *config,
|
|||
int rval = 0;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha))
|
||||
if (!IS_QLA81XX(ha) && !IS_QLA8031(ha) && !IS_QLA8044(ha))
|
||||
goto done_set_internal;
|
||||
|
||||
if (mode == INTERNAL_LOOPBACK)
|
||||
|
@ -773,7 +773,7 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
|
|||
|
||||
if (atomic_read(&vha->loop_state) == LOOP_READY &&
|
||||
(ha->current_topology == ISP_CFG_F ||
|
||||
((IS_QLA81XX(ha) || IS_QLA8031(ha)) &&
|
||||
((IS_QLA81XX(ha) || IS_QLA8031(ha) || IS_QLA8044(ha)) &&
|
||||
le32_to_cpu(*(uint32_t *)req_data) == ELS_OPCODE_BYTE
|
||||
&& req_data_len == MAX_ELS_FRAME_PAYLOAD)) &&
|
||||
elreq.options == EXTERNAL_LOOPBACK) {
|
||||
|
@ -783,7 +783,7 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
|
|||
command_sent = INT_DEF_LB_ECHO_CMD;
|
||||
rval = qla2x00_echo_test(vha, &elreq, response);
|
||||
} else {
|
||||
if (IS_QLA81XX(ha) || IS_QLA8031(ha)) {
|
||||
if (IS_QLA81XX(ha) || IS_QLA8031(ha) || IS_QLA8044(ha)) {
|
||||
memset(config, 0, sizeof(config));
|
||||
memset(new_config, 0, sizeof(new_config));
|
||||
|
||||
|
@ -806,7 +806,7 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job)
|
|||
"elreq.options=%04x\n", elreq.options);
|
||||
|
||||
if (elreq.options == EXTERNAL_LOOPBACK)
|
||||
if (IS_QLA8031(ha))
|
||||
if (IS_QLA8031(ha) || IS_QLA8044(ha))
|
||||
rval = qla81xx_set_loopback_mode(vha,
|
||||
config, new_config, elreq.options);
|
||||
else
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
* ----------------------------------------------------------------------
|
||||
* | Level | Last Value Used | Holes |
|
||||
* ----------------------------------------------------------------------
|
||||
* | Module Init and Probe | 0x014f | 0x4b,0xba,0xfa |
|
||||
* | Module Init and Probe | 0x0151 | 0x4b,0xba,0xfa |
|
||||
* | Mailbox commands | 0x117a | 0x111a-0x111b |
|
||||
* | | | 0x1155-0x1158 |
|
||||
* | Device Discovery | 0x2095 | 0x2020-0x2022, |
|
||||
|
@ -42,7 +42,15 @@
|
|||
* | | | 0x800b,0x8039 |
|
||||
* | AER/EEH | 0x9011 | |
|
||||
* | Virtual Port | 0xa007 | |
|
||||
* | ISP82XX Specific | 0xb086 | 0xb002,0xb024 |
|
||||
* | ISP82XX Specific | 0xb14c | 0xb002,0xb024 |
|
||||
* | | | 0xb09e,0xb0ae |
|
||||
* | | | 0xb0e0-0xb0ef |
|
||||
* | | | 0xb085,0xb0dc |
|
||||
* | | | 0xb107,0xb108 |
|
||||
* | | | 0xb111,0xb11e |
|
||||
* | | | 0xb12c,0xb12d |
|
||||
* | | | 0xb13a,0xb142 |
|
||||
* | | | 0xb13c-0xb140 |
|
||||
* | MultiQ | 0xc00c | |
|
||||
* | Misc | 0xd010 | |
|
||||
* | Target Mode | 0xe070 | |
|
||||
|
@ -941,7 +949,7 @@ qla24xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
|
|||
uint32_t *last_chain = NULL;
|
||||
struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return;
|
||||
|
||||
risc_address = ext_mem_cnt = 0;
|
||||
|
@ -2530,7 +2538,7 @@ ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, int32_t id)
|
|||
if (!ql_mask_match(level))
|
||||
return;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
mbx_reg = ®82->mailbox_in[0];
|
||||
else if (IS_FWI2_CAPABLE(ha))
|
||||
mbx_reg = ®24->mailbox0;
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
|
||||
#include "qla_bsg.h"
|
||||
#include "qla_nx.h"
|
||||
#include "qla_nx2.h"
|
||||
#define QLA2XXX_DRIVER_NAME "qla2xxx"
|
||||
#define QLA2XXX_APIDEV "ql2xapidev"
|
||||
#define QLA2XXX_MANUFACTURER "QLogic Corporation"
|
||||
|
@ -2935,7 +2936,8 @@ struct qla_hw_data {
|
|||
#define DT_ISP2031 BIT_15
|
||||
#define DT_ISP8031 BIT_16
|
||||
#define DT_ISPFX00 BIT_17
|
||||
#define DT_ISP_LAST (DT_ISPFX00 << 1)
|
||||
#define DT_ISP8044 BIT_18
|
||||
#define DT_ISP_LAST (DT_ISP8044 << 1)
|
||||
|
||||
#define DT_T10_PI BIT_25
|
||||
#define DT_IIDMA BIT_26
|
||||
|
@ -2961,6 +2963,7 @@ struct qla_hw_data {
|
|||
#define IS_QLA8001(ha) (DT_MASK(ha) & DT_ISP8001)
|
||||
#define IS_QLA81XX(ha) (IS_QLA8001(ha))
|
||||
#define IS_QLA82XX(ha) (DT_MASK(ha) & DT_ISP8021)
|
||||
#define IS_QLA8044(ha) (DT_MASK(ha) & DT_ISP8044)
|
||||
#define IS_QLA2031(ha) (DT_MASK(ha) & DT_ISP2031)
|
||||
#define IS_QLA8031(ha) (DT_MASK(ha) & DT_ISP8031)
|
||||
#define IS_QLAFX00(ha) (DT_MASK(ha) & DT_ISPFX00)
|
||||
|
@ -2975,10 +2978,12 @@ struct qla_hw_data {
|
|||
#define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \
|
||||
IS_QLA84XX(ha))
|
||||
#define IS_CNA_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA82XX(ha) || \
|
||||
IS_QLA8031(ha))
|
||||
IS_QLA8031(ha) || IS_QLA8044(ha))
|
||||
#define IS_P3P_TYPE(ha) (IS_QLA82XX(ha) || IS_QLA8044(ha))
|
||||
#define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \
|
||||
IS_QLA25XX(ha) || IS_QLA81XX(ha) || \
|
||||
IS_QLA82XX(ha) || IS_QLA83XX(ha))
|
||||
IS_QLA82XX(ha) || IS_QLA83XX(ha) || \
|
||||
IS_QLA8044(ha))
|
||||
#define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha))
|
||||
#define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || \
|
||||
IS_QLA83XX(ha)) && (ha)->flags.msix_enabled)
|
||||
|
@ -3187,10 +3192,12 @@ struct qla_hw_data {
|
|||
uint32_t nvram_data_off;
|
||||
|
||||
uint32_t fdt_wrt_disable;
|
||||
uint32_t fdt_wrt_enable;
|
||||
uint32_t fdt_erase_cmd;
|
||||
uint32_t fdt_block_size;
|
||||
uint32_t fdt_unprotect_sec_cmd;
|
||||
uint32_t fdt_protect_sec_cmd;
|
||||
uint32_t fdt_wrt_sts_reg_cmd;
|
||||
|
||||
uint32_t flt_region_flt;
|
||||
uint32_t flt_region_fdt;
|
||||
|
@ -3402,7 +3409,7 @@ typedef struct scsi_qla_host {
|
|||
uint16_t fcoe_fcf_idx;
|
||||
uint8_t fcoe_vn_port_mac[6];
|
||||
|
||||
uint32_t vp_abort_cnt;
|
||||
uint32_t vp_abort_cnt;
|
||||
|
||||
struct fc_vport *fc_vport; /* holds fc_vport * for each vport */
|
||||
uint16_t vp_idx; /* vport ID */
|
||||
|
@ -3435,6 +3442,7 @@ typedef struct scsi_qla_host {
|
|||
struct bidi_statistics bidi_stats;
|
||||
|
||||
atomic_t vref_count;
|
||||
struct qla8044_reset_template reset_tmplt;
|
||||
} scsi_qla_host_t;
|
||||
|
||||
#define SET_VP_IDX 1
|
||||
|
|
|
@ -1387,6 +1387,8 @@ struct qla_flt_header {
|
|||
#define FLT_REG_GOLD_FW 0x2f
|
||||
#define FLT_REG_FCP_PRIO_0 0x87
|
||||
#define FLT_REG_FCP_PRIO_1 0x88
|
||||
#define FLT_REG_CNA_FW 0x97
|
||||
#define FLT_REG_BOOT_CODE_8044 0xA2
|
||||
#define FLT_REG_FCOE_FW 0xA4
|
||||
#define FLT_REG_FCOE_NVRAM_0 0xAA
|
||||
#define FLT_REG_FCOE_NVRAM_1 0xAC
|
||||
|
|
|
@ -435,19 +435,19 @@ qla2x00_process_completed_request(struct scsi_qla_host *, struct req_que *,
|
|||
*/
|
||||
extern void qla2x00_release_nvram_protection(scsi_qla_host_t *);
|
||||
extern uint32_t *qla24xx_read_flash_data(scsi_qla_host_t *, uint32_t *,
|
||||
uint32_t, uint32_t);
|
||||
uint32_t, uint32_t);
|
||||
extern uint8_t *qla2x00_read_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t,
|
||||
uint32_t);
|
||||
uint32_t);
|
||||
extern uint8_t *qla24xx_read_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t,
|
||||
uint32_t);
|
||||
uint32_t);
|
||||
extern int qla2x00_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t,
|
||||
uint32_t);
|
||||
uint32_t);
|
||||
extern int qla24xx_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t,
|
||||
uint32_t);
|
||||
uint32_t);
|
||||
extern uint8_t *qla25xx_read_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t,
|
||||
uint32_t);
|
||||
uint32_t);
|
||||
extern int qla25xx_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t,
|
||||
uint32_t);
|
||||
uint32_t);
|
||||
extern int qla2x00_is_a_vp_did(scsi_qla_host_t *, uint32_t);
|
||||
|
||||
extern int qla2x00_beacon_on(struct scsi_qla_host *);
|
||||
|
@ -463,21 +463,25 @@ extern int qla83xx_wr_reg(scsi_qla_host_t *, uint32_t, uint32_t);
|
|||
extern int qla83xx_rd_reg(scsi_qla_host_t *, uint32_t, uint32_t *);
|
||||
extern int qla83xx_restart_nic_firmware(scsi_qla_host_t *);
|
||||
extern int qla83xx_access_control(scsi_qla_host_t *, uint16_t, uint32_t,
|
||||
uint32_t, uint16_t *);
|
||||
uint32_t, uint16_t *);
|
||||
|
||||
extern uint8_t *qla2x00_read_optrom_data(struct scsi_qla_host *, uint8_t *,
|
||||
uint32_t, uint32_t);
|
||||
uint32_t, uint32_t);
|
||||
extern int qla2x00_write_optrom_data(struct scsi_qla_host *, uint8_t *,
|
||||
uint32_t, uint32_t);
|
||||
uint32_t, uint32_t);
|
||||
extern uint8_t *qla24xx_read_optrom_data(struct scsi_qla_host *, uint8_t *,
|
||||
uint32_t, uint32_t);
|
||||
uint32_t, uint32_t);
|
||||
extern int qla24xx_write_optrom_data(struct scsi_qla_host *, uint8_t *,
|
||||
uint32_t, uint32_t);
|
||||
uint32_t, uint32_t);
|
||||
extern uint8_t *qla25xx_read_optrom_data(struct scsi_qla_host *, uint8_t *,
|
||||
uint32_t, uint32_t);
|
||||
uint32_t, uint32_t);
|
||||
extern uint8_t *qla8044_read_optrom_data(struct scsi_qla_host *,
|
||||
uint8_t *, uint32_t, uint32_t);
|
||||
extern void qla8044_watchdog(struct scsi_qla_host *vha);
|
||||
|
||||
extern int qla2x00_get_flash_version(scsi_qla_host_t *, void *);
|
||||
extern int qla24xx_get_flash_version(scsi_qla_host_t *, void *);
|
||||
extern int qla82xx_get_flash_version(scsi_qla_host_t *, void *);
|
||||
|
||||
extern int qla2xxx_get_flash_info(scsi_qla_host_t *);
|
||||
extern int qla2xxx_get_vpd_field(scsi_qla_host_t *, char *, char *, size_t);
|
||||
|
@ -498,7 +502,7 @@ extern void qla2x00_dump_buffer(uint8_t *, uint32_t);
|
|||
extern void qla2x00_dump_buffer_zipped(uint8_t *, uint32_t);
|
||||
extern void ql_dump_regs(uint32_t, scsi_qla_host_t *, int32_t);
|
||||
extern void ql_dump_buffer(uint32_t, scsi_qla_host_t *, int32_t,
|
||||
uint8_t *, uint32_t);
|
||||
uint8_t *, uint32_t);
|
||||
extern void qla2xxx_dump_post_process(scsi_qla_host_t *, int);
|
||||
|
||||
/*
|
||||
|
@ -619,9 +623,9 @@ extern int qla82xx_start_firmware(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);
|
||||
uint32_t, uint32_t);
|
||||
extern int qla82xx_write_optrom_data(struct scsi_qla_host *, uint8_t *,
|
||||
uint32_t, uint32_t);
|
||||
uint32_t, uint32_t);
|
||||
|
||||
/* Mailbox related functions */
|
||||
extern int qla82xx_abort_isp(scsi_qla_host_t *);
|
||||
|
@ -662,7 +666,7 @@ extern void qla8xxx_dev_failed_handler(scsi_qla_host_t *);
|
|||
extern void qla82xx_clear_qsnt_ready(scsi_qla_host_t *);
|
||||
|
||||
extern void qla2x00_set_model_info(scsi_qla_host_t *, uint8_t *,
|
||||
size_t, char *);
|
||||
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(scsi_qla_host_t *);
|
||||
|
@ -695,5 +699,31 @@ extern void qla82xx_md_free(scsi_qla_host_t *);
|
|||
extern int qla82xx_md_collect(scsi_qla_host_t *);
|
||||
extern void qla82xx_md_prep(scsi_qla_host_t *);
|
||||
extern void qla82xx_set_reset_owner(scsi_qla_host_t *);
|
||||
extern int qla82xx_validate_template_chksum(scsi_qla_host_t *vha);
|
||||
|
||||
/* Function declarations for ISP8044 */
|
||||
extern int qla8044_idc_lock(struct qla_hw_data *ha);
|
||||
extern void qla8044_idc_unlock(struct qla_hw_data *ha);
|
||||
extern uint32_t qla8044_rd_reg(struct qla_hw_data *ha, ulong addr);
|
||||
extern void qla8044_wr_reg(struct qla_hw_data *ha, ulong addr, uint32_t val);
|
||||
extern void qla8044_read_reset_template(struct scsi_qla_host *ha);
|
||||
extern void qla8044_set_idc_dontreset(struct scsi_qla_host *ha);
|
||||
extern int qla8044_rd_direct(struct scsi_qla_host *vha, const uint32_t crb_reg);
|
||||
extern void qla8044_wr_direct(struct scsi_qla_host *vha,
|
||||
const uint32_t crb_reg, const uint32_t value);
|
||||
extern inline void qla8044_set_qsnt_ready(struct scsi_qla_host *vha);
|
||||
extern inline void qla8044_need_reset_handler(struct scsi_qla_host *vha);
|
||||
extern int qla8044_device_state_handler(struct scsi_qla_host *vha);
|
||||
extern void qla8044_clear_qsnt_ready(struct scsi_qla_host *vha);
|
||||
extern void qla8044_clear_drv_active(struct scsi_qla_host *vha);
|
||||
void qla8044_get_minidump(struct scsi_qla_host *vha);
|
||||
int qla8044_collect_md_data(struct scsi_qla_host *vha);
|
||||
extern int qla8044_md_get_template(scsi_qla_host_t *);
|
||||
extern int qla8044_write_optrom_data(struct scsi_qla_host *, uint8_t *,
|
||||
uint32_t, uint32_t);
|
||||
extern irqreturn_t qla8044_intr_handler(int, void *);
|
||||
extern void qla82xx_mbx_completion(scsi_qla_host_t *, uint16_t);
|
||||
extern int qla8044_abort_isp(scsi_qla_host_t *);
|
||||
extern int qla8044_check_fw_alive(struct scsi_qla_host *);
|
||||
|
||||
#endif /* _QLA_GBL_H */
|
||||
|
|
|
@ -552,7 +552,18 @@ qla2x00_initialize_adapter(scsi_qla_host_t *vha)
|
|||
if (rval) {
|
||||
ql_log(ql_log_fatal, vha, 0x004f,
|
||||
"Unable to validate FLASH data.\n");
|
||||
return (rval);
|
||||
return rval;
|
||||
}
|
||||
|
||||
if (IS_QLA8044(ha)) {
|
||||
qla8044_read_reset_template(vha);
|
||||
|
||||
/* NOTE: If ql2xdontresethba==1, set IDC_CTRL DONTRESET_BIT0.
|
||||
* If DONRESET_BIT0 is set, drivers should not set dev_state
|
||||
* to NEED_RESET. But if NEED_RESET is set, drivers should
|
||||
* should honor the reset. */
|
||||
if (ql2xdontresethba == 1)
|
||||
qla8044_set_idc_dontreset(vha);
|
||||
}
|
||||
|
||||
ha->isp_ops->get_flash_version(vha, req->ring);
|
||||
|
@ -1327,7 +1338,7 @@ 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))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return QLA_SUCCESS;
|
||||
|
||||
ha->fw_transfer_size = REQUEST_ENTRY_SIZE * req->length;
|
||||
|
@ -1610,7 +1621,7 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
|
|||
unsigned long flags;
|
||||
uint16_t fw_major_version;
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
rval = ha->isp_ops->load_risc(vha, &srisc_address);
|
||||
if (rval == QLA_SUCCESS) {
|
||||
qla2x00_stop_firmware(vha);
|
||||
|
@ -1646,7 +1657,7 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
|
|||
if (rval == QLA_SUCCESS) {
|
||||
enable_82xx_npiv:
|
||||
fw_major_version = ha->fw_major_version;
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
qla82xx_check_md_needed(vha);
|
||||
else
|
||||
rval = qla2x00_get_fw_version(vha);
|
||||
|
@ -1676,7 +1687,7 @@ qla2x00_setup_chip(scsi_qla_host_t *vha)
|
|||
goto failed;
|
||||
|
||||
if (!fw_major_version && ql2xallocfwdump
|
||||
&& !IS_QLA82XX(ha))
|
||||
&& !(IS_P3P_TYPE(ha)))
|
||||
qla2x00_alloc_fw_dump(vha);
|
||||
}
|
||||
} else {
|
||||
|
@ -1844,7 +1855,7 @@ qla24xx_update_fw_options(scsi_qla_host_t *vha)
|
|||
int rval;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return;
|
||||
|
||||
/* Update Serial Link options. */
|
||||
|
@ -3993,10 +4004,18 @@ qla83xx_reset_ownership(scsi_qla_host_t *vha)
|
|||
uint32_t class_type_mask = 0x3;
|
||||
uint16_t fcoe_other_function = 0xffff, i;
|
||||
|
||||
qla83xx_rd_reg(vha, QLA83XX_IDC_DRV_PRESENCE, &drv_presence);
|
||||
|
||||
qla83xx_rd_reg(vha, QLA83XX_DEV_PARTINFO1, &dev_part_info1);
|
||||
qla83xx_rd_reg(vha, QLA83XX_DEV_PARTINFO2, &dev_part_info2);
|
||||
if (IS_QLA8044(ha)) {
|
||||
drv_presence = qla8044_rd_direct(vha,
|
||||
QLA8044_CRB_DRV_ACTIVE_INDEX);
|
||||
dev_part_info1 = qla8044_rd_direct(vha,
|
||||
QLA8044_CRB_DEV_PART_INFO_INDEX);
|
||||
dev_part_info2 = qla8044_rd_direct(vha,
|
||||
QLA8044_CRB_DEV_PART_INFO2);
|
||||
} else {
|
||||
qla83xx_rd_reg(vha, QLA83XX_IDC_DRV_PRESENCE, &drv_presence);
|
||||
qla83xx_rd_reg(vha, QLA83XX_DEV_PARTINFO1, &dev_part_info1);
|
||||
qla83xx_rd_reg(vha, QLA83XX_DEV_PARTINFO2, &dev_part_info2);
|
||||
}
|
||||
for (i = 0; i < 8; i++) {
|
||||
class_type = ((dev_part_info1 >> (i * 4)) & class_type_mask);
|
||||
if ((class_type == QLA83XX_CLASS_TYPE_FCOE) &&
|
||||
|
@ -4333,7 +4352,7 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
|
|||
/* For ISP82XX, driver waits for completion of the commands.
|
||||
* online flag should be set.
|
||||
*/
|
||||
if (!IS_QLA82XX(ha))
|
||||
if (!(IS_P3P_TYPE(ha)))
|
||||
vha->flags.online = 0;
|
||||
ha->flags.chip_reset_done = 0;
|
||||
clear_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
|
@ -4346,7 +4365,7 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
|
|||
* Driver waits for the completion of the commands.
|
||||
* the interrupts need to be enabled.
|
||||
*/
|
||||
if (!IS_QLA82XX(ha))
|
||||
if (!(IS_P3P_TYPE(ha)))
|
||||
ha->isp_ops->reset_chip(vha);
|
||||
|
||||
atomic_set(&vha->loop_down_timer, LOOP_DOWN_TIME);
|
||||
|
@ -4389,7 +4408,7 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_t *vha)
|
|||
|
||||
if (!ha->flags.eeh_busy) {
|
||||
/* Make sure for ISP 82XX IO DMA is complete */
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
qla82xx_chip_reset_cleanup(vha);
|
||||
ql_log(ql_log_info, vha, 0x00b4,
|
||||
"Done chip reset cleanup.\n");
|
||||
|
@ -4709,7 +4728,7 @@ 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))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return;
|
||||
|
||||
vha->flags.online = 0;
|
||||
|
@ -4775,8 +4794,6 @@ 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;
|
||||
|
@ -5538,6 +5555,8 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
|
|||
/* Determine NVRAM starting address. */
|
||||
ha->nvram_size = sizeof(struct nvram_81xx);
|
||||
ha->vpd_size = FA_NVRAM_VPD_SIZE;
|
||||
if (IS_P3P_TYPE(ha) || IS_QLA8031(ha))
|
||||
ha->vpd_size = FA_VPD_SIZE_82XX;
|
||||
|
||||
/* Get VPD data into cache */
|
||||
ha->vpd = ha->nvram + VPD_OFFSET;
|
||||
|
@ -5720,7 +5739,7 @@ qla81xx_nvram_config(scsi_qla_host_t *vha)
|
|||
|
||||
/* Link Down Timeout = 0:
|
||||
*
|
||||
* When Port Down timer expires we will start returning
|
||||
* When Port Down timer expires we will start returning
|
||||
* I/O's to OS with "DID_NO_CONNECT".
|
||||
*
|
||||
* Link Down Timeout != 0:
|
||||
|
@ -6047,7 +6066,7 @@ qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *vha, fc_port_t *fcport)
|
|||
if (priority < 0)
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
if (IS_QLA82XX(vha->hw)) {
|
||||
if (IS_P3P_TYPE(vha->hw)) {
|
||||
fcport->fcp_prio = priority & 0xf;
|
||||
return QLA_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@ qla2x00_poll(struct rsp_que *rsp)
|
|||
unsigned long flags;
|
||||
struct qla_hw_data *ha = rsp->hw;
|
||||
local_irq_save(flags);
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
qla82xx_poll(0, rsp);
|
||||
else
|
||||
ha->isp_ops->intr_handler(0, rsp);
|
||||
|
|
|
@ -474,7 +474,7 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req)
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id);
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
qla82xx_start_iocbs(vha);
|
||||
} else {
|
||||
/* Adjust ring index. */
|
||||
|
@ -1844,7 +1844,7 @@ qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp)
|
|||
if (req->cnt < req_cnt) {
|
||||
if (ha->mqenable || IS_QLA83XX(ha))
|
||||
cnt = RD_REG_DWORD(®->isp25mq.req_q_out);
|
||||
else if (IS_QLA82XX(ha))
|
||||
else if (IS_P3P_TYPE(ha))
|
||||
cnt = RD_REG_DWORD(®->isp82.req_q_out);
|
||||
else if (IS_FWI2_CAPABLE(ha))
|
||||
cnt = RD_REG_DWORD(®->isp24.req_q_out);
|
||||
|
|
|
@ -691,7 +691,8 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
|
|||
case MBA_LOOP_DOWN: /* Loop Down Event */
|
||||
mbx = (IS_QLA81XX(ha) || IS_QLA8031(ha))
|
||||
? RD_REG_WORD(®24->mailbox4) : 0;
|
||||
mbx = IS_QLA82XX(ha) ? RD_REG_WORD(®82->mailbox_out[4]) : mbx;
|
||||
mbx = (IS_P3P_TYPE(ha)) ? RD_REG_WORD(®82->mailbox_out[4])
|
||||
: mbx;
|
||||
ql_dbg(ql_dbg_async, vha, 0x500b,
|
||||
"LOOP DOWN detected (%x %x %x %x).\n",
|
||||
mb[1], mb[2], mb[3], mbx);
|
||||
|
@ -740,7 +741,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
|
|||
if (IS_QLA2100(ha))
|
||||
break;
|
||||
|
||||
if (IS_QLA81XX(ha) || IS_QLA82XX(ha) || IS_QLA8031(ha)) {
|
||||
if (IS_CNA_CAPABLE(ha)) {
|
||||
ql_dbg(ql_dbg_async, vha, 0x500d,
|
||||
"DCBX Completed -- %04x %04x %04x.\n",
|
||||
mb[1], mb[2], mb[3]);
|
||||
|
@ -1002,7 +1003,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
|
|||
mb[1], mb[2], mb[3]);
|
||||
break;
|
||||
case MBA_IDC_NOTIFY:
|
||||
if (IS_QLA8031(vha->hw)) {
|
||||
if (IS_QLA8031(vha->hw) || IS_QLA8044(ha)) {
|
||||
mb[4] = RD_REG_WORD(®24->mailbox4);
|
||||
if (((mb[2] & 0x7fff) == MBC_PORT_RESET ||
|
||||
(mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) &&
|
||||
|
@ -1022,7 +1023,8 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
|
|||
complete(&ha->lb_portup_comp);
|
||||
/* Fallthru */
|
||||
case MBA_IDC_TIME_EXT:
|
||||
if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw))
|
||||
if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw) ||
|
||||
IS_QLA8044(ha))
|
||||
qla81xx_idc_event(vha, mb[0], mb[1]);
|
||||
break;
|
||||
|
||||
|
@ -1063,7 +1065,7 @@ qla2x00_process_completed_request(struct scsi_qla_host *vha,
|
|||
ql_log(ql_log_warn, vha, 0x3014,
|
||||
"Invalid SCSI command index (%x).\n", index);
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
|
||||
else
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
|
@ -1080,7 +1082,7 @@ qla2x00_process_completed_request(struct scsi_qla_host *vha,
|
|||
} else {
|
||||
ql_log(ql_log_warn, vha, 0x3016, "Invalid SCSI SRB.\n");
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
|
||||
else
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
|
@ -1100,7 +1102,7 @@ qla2x00_get_sp_from_handle(scsi_qla_host_t *vha, const char *func,
|
|||
if (index >= req->num_outstanding_cmds) {
|
||||
ql_log(ql_log_warn, vha, 0x5031,
|
||||
"Invalid command index (%x).\n", index);
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
|
||||
else
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
|
@ -1949,7 +1951,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
|
|||
ql_dbg(ql_dbg_io, vha, 0x3017,
|
||||
"Invalid status handle (0x%x).\n", sts->handle);
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
|
||||
else
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
|
@ -2321,7 +2323,7 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt)
|
|||
ql_log(ql_log_warn, vha, 0x5030,
|
||||
"Error entry - invalid handle/queue.\n");
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
|
||||
else
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
|
@ -2449,7 +2451,7 @@ void qla24xx_process_response_queue(struct scsi_qla_host *vha,
|
|||
}
|
||||
|
||||
/* Adjust ring index */
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
struct device_reg_82xx __iomem *reg = &ha->iobase->isp82;
|
||||
WRT_REG_DWORD(®->rsp_q_out[0], rsp->ring_index);
|
||||
} else
|
||||
|
@ -2862,7 +2864,7 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
|
|||
ret = request_irq(qentry->vector,
|
||||
qla83xx_msix_entries[i].handler,
|
||||
0, qla83xx_msix_entries[i].name, rsp);
|
||||
} else if (IS_QLA82XX(ha)) {
|
||||
} else if (IS_P3P_TYPE(ha)) {
|
||||
ret = request_irq(qentry->vector,
|
||||
qla82xx_msix_entries[i].handler,
|
||||
0, qla82xx_msix_entries[i].name, rsp);
|
||||
|
@ -2947,7 +2949,7 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
|
|||
skip_msix:
|
||||
|
||||
if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) &&
|
||||
!IS_QLA8001(ha) && !IS_QLA82XX(ha) && !IS_QLAFX00(ha))
|
||||
!IS_QLA8001(ha) && !IS_P3P_TYPE(ha) && !IS_QLAFX00(ha))
|
||||
goto skip_msi;
|
||||
|
||||
ret = pci_enable_msi(ha->pdev);
|
||||
|
|
|
@ -75,7 +75,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
return QLA_FUNCTION_TIMEOUT;
|
||||
}
|
||||
|
||||
if (IS_QLA82XX(ha) && ha->flags.isp82xx_fw_hung) {
|
||||
if (IS_P3P_TYPE(ha) && ha->flags.isp82xx_fw_hung) {
|
||||
/* Setting Link-Down error */
|
||||
mcp->mb[0] = MBS_LINK_DOWN_ERROR;
|
||||
ql_log(ql_log_warn, vha, 0x1004,
|
||||
|
@ -106,9 +106,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_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
optr = (uint16_t __iomem *)®->isp82.mailbox_in[0];
|
||||
else if (IS_FWI2_CAPABLE(ha) && !IS_QLA82XX(ha))
|
||||
else if (IS_FWI2_CAPABLE(ha) && !(IS_P3P_TYPE(ha)))
|
||||
optr = (uint16_t __iomem *)®->isp24.mailbox0;
|
||||
else
|
||||
optr = (uint16_t __iomem *)MAILBOX_REG(ha, ®->isp, 0);
|
||||
|
@ -159,7 +159,7 @@ 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_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
if (RD_REG_DWORD(®->isp82.hint) &
|
||||
HINT_MBX_INT_PENDING) {
|
||||
spin_unlock_irqrestore(&ha->hardware_lock,
|
||||
|
@ -189,7 +189,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
ql_dbg(ql_dbg_mbx, vha, 0x1011,
|
||||
"Cmd=%x Polling Mode.\n", command);
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
if (RD_REG_DWORD(®->isp82.hint) &
|
||||
HINT_MBX_INT_PENDING) {
|
||||
spin_unlock_irqrestore(&ha->hardware_lock,
|
||||
|
@ -236,7 +236,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
|
|||
ha->flags.mbox_int = 0;
|
||||
clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
|
||||
|
||||
if ((IS_QLA82XX(ha) && ha->flags.isp82xx_fw_hung)) {
|
||||
if (IS_P3P_TYPE(ha) && ha->flags.isp82xx_fw_hung) {
|
||||
ha->flags.mbox_busy = 0;
|
||||
/* Setting Link-Down error */
|
||||
mcp->mb[0] = MBS_LINK_DOWN_ERROR;
|
||||
|
@ -537,7 +537,7 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha)
|
|||
mcp->mb[0] = MBC_GET_FIRMWARE_VERSION;
|
||||
mcp->out_mb = MBX_0;
|
||||
mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
|
||||
if (IS_QLA81XX(vha->hw) || IS_QLA8031(ha))
|
||||
if (IS_QLA81XX(vha->hw) || IS_QLA8031(ha) || IS_QLA8044(ha))
|
||||
mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8;
|
||||
if (IS_FWI2_CAPABLE(ha))
|
||||
mcp->in_mb |= MBX_17|MBX_16|MBX_15;
|
||||
|
@ -556,7 +556,7 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha)
|
|||
ha->fw_memory_size = 0x1FFFF; /* Defaults to 128KB. */
|
||||
else
|
||||
ha->fw_memory_size = (mcp->mb[5] << 16) | mcp->mb[4];
|
||||
if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw)) {
|
||||
if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw) || IS_QLA8044(ha)) {
|
||||
ha->mpi_version[0] = mcp->mb[10] & 0xff;
|
||||
ha->mpi_version[1] = mcp->mb[11] >> 8;
|
||||
ha->mpi_version[2] = mcp->mb[11] & 0xff;
|
||||
|
@ -1201,7 +1201,7 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size)
|
|||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x104c,
|
||||
"Entered %s.\n", __func__);
|
||||
|
||||
if (IS_QLA82XX(ha) && ql2xdbwr)
|
||||
if (IS_P3P_TYPE(ha) && ql2xdbwr)
|
||||
qla82xx_wr_32(ha, ha->nxdb_wr_ptr,
|
||||
(0x04 | (ha->portnum << 5) | (0 << 8) | (0 << 16)));
|
||||
|
||||
|
@ -4407,7 +4407,7 @@ qla81xx_get_port_config(scsi_qla_host_t *vha, uint16_t *mb)
|
|||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1109,
|
||||
"Entered %s.\n", __func__);
|
||||
|
||||
if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha))
|
||||
if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA8044(ha))
|
||||
return QLA_FUNCTION_FAILED;
|
||||
mcp->mb[0] = MBC_GET_PORT_CONFIG;
|
||||
mcp->out_mb = MBX_0;
|
||||
|
@ -4595,7 +4595,7 @@ qla82xx_mbx_intr_disable(scsi_qla_host_t *vha)
|
|||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x100d,
|
||||
"Entered %s.\n", __func__);
|
||||
|
||||
if (!IS_QLA82XX(ha))
|
||||
if (!IS_P3P_TYPE(ha))
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
memset(mcp, 0, sizeof(mbx_cmd_t));
|
||||
|
@ -4712,6 +4712,60 @@ qla82xx_md_get_template(scsi_qla_host_t *vha)
|
|||
return rval;
|
||||
}
|
||||
|
||||
int
|
||||
qla8044_md_get_template(scsi_qla_host_t *vha)
|
||||
{
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
mbx_cmd_t mc;
|
||||
mbx_cmd_t *mcp = &mc;
|
||||
int rval = QLA_FUNCTION_FAILED;
|
||||
int offset = 0, size = MINIDUMP_SIZE_36K;
|
||||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0xb11f,
|
||||
"Entered %s.\n", __func__);
|
||||
|
||||
ha->md_tmplt_hdr = dma_alloc_coherent(&ha->pdev->dev,
|
||||
ha->md_template_size, &ha->md_tmplt_hdr_dma, GFP_KERNEL);
|
||||
if (!ha->md_tmplt_hdr) {
|
||||
ql_log(ql_log_warn, vha, 0xb11b,
|
||||
"Unable to allocate memory for Minidump template.\n");
|
||||
return rval;
|
||||
}
|
||||
|
||||
memset(mcp->mb, 0 , sizeof(mcp->mb));
|
||||
while (offset < ha->md_template_size) {
|
||||
mcp->mb[0] = LSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
|
||||
mcp->mb[1] = MSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
|
||||
mcp->mb[2] = LSW(RQST_TMPLT);
|
||||
mcp->mb[3] = MSW(RQST_TMPLT);
|
||||
mcp->mb[4] = LSW(LSD(ha->md_tmplt_hdr_dma + offset));
|
||||
mcp->mb[5] = MSW(LSD(ha->md_tmplt_hdr_dma + offset));
|
||||
mcp->mb[6] = LSW(MSD(ha->md_tmplt_hdr_dma + offset));
|
||||
mcp->mb[7] = MSW(MSD(ha->md_tmplt_hdr_dma + offset));
|
||||
mcp->mb[8] = LSW(size);
|
||||
mcp->mb[9] = MSW(size);
|
||||
mcp->mb[10] = offset & 0x0000FFFF;
|
||||
mcp->mb[11] = offset & 0xFFFF0000;
|
||||
mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
mcp->out_mb = MBX_11|MBX_10|MBX_9|MBX_8|
|
||||
MBX_7|MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0;
|
||||
mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0;
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
|
||||
if (rval != QLA_SUCCESS) {
|
||||
ql_dbg(ql_dbg_mbx, vha, 0xb11c,
|
||||
"mailbox command FAILED=0x%x, subcode=%x.\n",
|
||||
((mcp->mb[1] << 16) | mcp->mb[0]),
|
||||
((mcp->mb[3] << 16) | mcp->mb[2]));
|
||||
return rval;
|
||||
} else
|
||||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0xb11d,
|
||||
"Done %s.\n", __func__);
|
||||
offset = offset + size;
|
||||
}
|
||||
return rval;
|
||||
}
|
||||
|
||||
int
|
||||
qla81xx_set_led_config(scsi_qla_host_t *vha, uint16_t *led_cfg)
|
||||
{
|
||||
|
@ -4808,7 +4862,7 @@ qla82xx_mbx_beacon_ctl(scsi_qla_host_t *vha, int enable)
|
|||
mbx_cmd_t mc;
|
||||
mbx_cmd_t *mcp = &mc;
|
||||
|
||||
if (!IS_QLA82XX(ha))
|
||||
if (!IS_P3P_TYPE(ha))
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1127,
|
||||
|
|
|
@ -848,7 +848,6 @@ qla82xx_rom_lock(struct qla_hw_data *ha)
|
|||
{
|
||||
int done = 0, timeout = 0;
|
||||
uint32_t lock_owner = 0;
|
||||
scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
|
||||
|
||||
while (!done) {
|
||||
/* acquire semaphore2 from PCI HW block */
|
||||
|
@ -857,9 +856,6 @@ qla82xx_rom_lock(struct qla_hw_data *ha)
|
|||
break;
|
||||
if (timeout >= qla82xx_rom_lock_timeout) {
|
||||
lock_owner = qla82xx_rd_32(ha, QLA82XX_ROM_LOCK_ID);
|
||||
ql_dbg(ql_dbg_p3p, vha, 0xb085,
|
||||
"Failed to acquire rom lock, acquired by %d.\n",
|
||||
lock_owner);
|
||||
return -1;
|
||||
}
|
||||
timeout++;
|
||||
|
@ -1666,8 +1662,14 @@ qla82xx_iospace_config(struct qla_hw_data *ha)
|
|||
}
|
||||
|
||||
/* Mapping of IO base pointer */
|
||||
ha->iobase = (device_reg_t __iomem *)((uint8_t *)ha->nx_pcibase +
|
||||
0xbc000 + (ha->pdev->devfn << 11));
|
||||
if (IS_QLA8044(ha)) {
|
||||
ha->iobase =
|
||||
(device_reg_t __iomem *)((uint8_t *)ha->nx_pcibase);
|
||||
} else if (IS_QLA82XX(ha)) {
|
||||
ha->iobase =
|
||||
(device_reg_t __iomem *)((uint8_t *)ha->nx_pcibase +
|
||||
0xbc000 + (ha->pdev->devfn << 11));
|
||||
}
|
||||
|
||||
if (!ql2xdbwr) {
|
||||
ha->nxdb_wr_ptr =
|
||||
|
@ -1967,7 +1969,7 @@ static struct qla82xx_legacy_intr_set legacy_intr[] = \
|
|||
* @ha: SCSI driver HA context
|
||||
* @mb0: Mailbox0 register
|
||||
*/
|
||||
static void
|
||||
void
|
||||
qla82xx_mbx_completion(scsi_qla_host_t *vha, uint16_t mb0)
|
||||
{
|
||||
uint16_t cnt;
|
||||
|
@ -2247,7 +2249,10 @@ qla82xx_enable_intrs(struct qla_hw_data *ha)
|
|||
scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
|
||||
qla82xx_mbx_intr_enable(vha);
|
||||
spin_lock_irq(&ha->hardware_lock);
|
||||
qla82xx_wr_32(ha, ha->nx_legacy_intr.tgt_mask_reg, 0xfbff);
|
||||
if (IS_QLA8044(ha))
|
||||
qla8044_wr_reg(ha, LEG_INTR_MASK_OFFSET, 0);
|
||||
else
|
||||
qla82xx_wr_32(ha, ha->nx_legacy_intr.tgt_mask_reg, 0xfbff);
|
||||
spin_unlock_irq(&ha->hardware_lock);
|
||||
ha->interrupts_on = 1;
|
||||
}
|
||||
|
@ -2258,7 +2263,10 @@ qla82xx_disable_intrs(struct qla_hw_data *ha)
|
|||
scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
|
||||
qla82xx_mbx_intr_disable(vha);
|
||||
spin_lock_irq(&ha->hardware_lock);
|
||||
qla82xx_wr_32(ha, ha->nx_legacy_intr.tgt_mask_reg, 0x0400);
|
||||
if (IS_QLA8044(ha))
|
||||
qla8044_wr_reg(ha, LEG_INTR_MASK_OFFSET, 1);
|
||||
else
|
||||
qla82xx_wr_32(ha, ha->nx_legacy_intr.tgt_mask_reg, 0x0400);
|
||||
spin_unlock_irq(&ha->hardware_lock);
|
||||
ha->interrupts_on = 0;
|
||||
}
|
||||
|
@ -3008,6 +3016,9 @@ qla8xxx_dev_failed_handler(scsi_qla_host_t *vha)
|
|||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_clear_drv_active(ha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
} else if (IS_QLA8044(ha)) {
|
||||
qla8044_clear_drv_active(vha);
|
||||
qla8044_idc_unlock(ha);
|
||||
}
|
||||
|
||||
/* Set DEV_FAILED flag to disable timer */
|
||||
|
@ -3134,7 +3145,7 @@ qla82xx_check_md_needed(scsi_qla_host_t *vha)
|
|||
if (fw_major_version != ha->fw_major_version ||
|
||||
fw_minor_version != ha->fw_minor_version ||
|
||||
fw_subminor_version != ha->fw_subminor_version) {
|
||||
ql_log(ql_log_info, vha, 0xb02d,
|
||||
ql_dbg(ql_dbg_p3p, vha, 0xb02d,
|
||||
"Firmware version differs "
|
||||
"Previous version: %d:%d:%d - "
|
||||
"New version: %d:%d:%d\n",
|
||||
|
@ -3423,8 +3434,18 @@ void qla82xx_watchdog(scsi_qla_host_t *vha)
|
|||
|
||||
int qla82xx_load_risc(scsi_qla_host_t *vha, uint32_t *srisc_addr)
|
||||
{
|
||||
int rval;
|
||||
rval = qla82xx_device_state_handler(vha);
|
||||
int rval = -1;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
rval = qla82xx_device_state_handler(vha);
|
||||
else if (IS_QLA8044(ha)) {
|
||||
qla8044_idc_lock(ha);
|
||||
/* Decide the reset ownership */
|
||||
qla83xx_reset_ownership(vha);
|
||||
qla8044_idc_unlock(ha);
|
||||
rval = qla8044_device_state_handler(vha);
|
||||
}
|
||||
return rval;
|
||||
}
|
||||
|
||||
|
@ -3432,17 +3453,25 @@ void
|
|||
qla82xx_set_reset_owner(scsi_qla_host_t *vha)
|
||||
{
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
uint32_t dev_state;
|
||||
uint32_t dev_state = 0;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
dev_state = qla82xx_rd_32(ha, QLA82XX_CRB_DEV_STATE);
|
||||
else if (IS_QLA8044(ha))
|
||||
dev_state = qla8044_rd_direct(vha, QLA8044_CRB_DEV_STATE_INDEX);
|
||||
|
||||
dev_state = qla82xx_rd_32(ha, QLA82XX_CRB_DEV_STATE);
|
||||
if (dev_state == QLA8XXX_DEV_READY) {
|
||||
ql_log(ql_log_info, vha, 0xb02f,
|
||||
"HW State: NEED RESET\n");
|
||||
qla82xx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
|
||||
QLA8XXX_DEV_NEED_RESET);
|
||||
ha->flags.nic_core_reset_owner = 1;
|
||||
ql_dbg(ql_dbg_p3p, vha, 0xb030,
|
||||
"reset_owner is 0x%x\n", ha->portnum);
|
||||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
|
||||
QLA8XXX_DEV_NEED_RESET);
|
||||
ha->flags.nic_core_reset_owner = 1;
|
||||
ql_dbg(ql_dbg_p3p, vha, 0xb030,
|
||||
"reset_owner is 0x%x\n", ha->portnum);
|
||||
} else if (IS_QLA8044(ha))
|
||||
qla8044_wr_direct(vha, QLA8044_CRB_DEV_STATE_INDEX,
|
||||
QLA8XXX_DEV_NEED_RESET);
|
||||
} else
|
||||
ql_log(ql_log_info, vha, 0xb031,
|
||||
"Device state is 0x%x = %s.\n",
|
||||
|
@ -3463,7 +3492,7 @@ qla82xx_set_reset_owner(scsi_qla_host_t *vha)
|
|||
int
|
||||
qla82xx_abort_isp(scsi_qla_host_t *vha)
|
||||
{
|
||||
int rval;
|
||||
int rval = -1;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (vha->device_flags & DFLG_DEV_FAILED) {
|
||||
|
@ -3477,7 +3506,15 @@ qla82xx_abort_isp(scsi_qla_host_t *vha)
|
|||
qla82xx_set_reset_owner(vha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
|
||||
rval = qla82xx_device_state_handler(vha);
|
||||
if (IS_QLA82XX(ha))
|
||||
rval = qla82xx_device_state_handler(vha);
|
||||
else if (IS_QLA8044(ha)) {
|
||||
qla8044_idc_lock(ha);
|
||||
/* Decide the reset ownership */
|
||||
qla83xx_reset_ownership(vha);
|
||||
qla8044_idc_unlock(ha);
|
||||
rval = qla8044_device_state_handler(vha);
|
||||
}
|
||||
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_clear_rst_ready(ha);
|
||||
|
@ -3597,7 +3634,7 @@ int qla2x00_wait_for_fcoe_ctx_reset(scsi_qla_host_t *vha)
|
|||
void
|
||||
qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha)
|
||||
{
|
||||
int i;
|
||||
int i, fw_state = 0;
|
||||
unsigned long flags;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
|
@ -3608,7 +3645,11 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha)
|
|||
if (!ha->flags.isp82xx_fw_hung) {
|
||||
for (i = 0; i < 2; i++) {
|
||||
msleep(1000);
|
||||
if (qla82xx_check_fw_alive(vha)) {
|
||||
if (IS_QLA82XX(ha))
|
||||
fw_state = qla82xx_check_fw_alive(vha);
|
||||
else if (IS_QLA8044(ha))
|
||||
fw_state = qla8044_check_fw_alive(vha);
|
||||
if (fw_state) {
|
||||
ha->flags.isp82xx_fw_hung = 1;
|
||||
qla82xx_clear_pending_mbx(vha);
|
||||
break;
|
||||
|
@ -4072,7 +4113,7 @@ qla82xx_minidump_process_rdmem(scsi_qla_host_t *vha,
|
|||
return QLA_SUCCESS;
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
qla82xx_validate_template_chksum(scsi_qla_host_t *vha)
|
||||
{
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
@ -4384,7 +4425,11 @@ qla82xx_md_prep(scsi_qla_host_t *vha)
|
|||
ha->md_template_size / 1024);
|
||||
|
||||
/* Get Minidump template */
|
||||
rval = qla82xx_md_get_template(vha);
|
||||
if (IS_QLA8044(ha))
|
||||
rval = qla8044_md_get_template(vha);
|
||||
else
|
||||
rval = qla82xx_md_get_template(vha);
|
||||
|
||||
if (rval == QLA_SUCCESS) {
|
||||
ql_dbg(ql_dbg_p3p, vha, 0xb04b,
|
||||
"MiniDump Template obtained\n");
|
||||
|
|
|
@ -589,6 +589,7 @@
|
|||
* The PCI VendorID and DeviceID for our board.
|
||||
*/
|
||||
#define PCI_DEVICE_ID_QLOGIC_ISP8021 0x8021
|
||||
#define PCI_DEVICE_ID_QLOGIC_ISP8044 0x8044
|
||||
|
||||
#define QLA82XX_MSIX_TBL_SPACE 8192
|
||||
#define QLA82XX_PCI_REG_MSIX_TBL 0x44
|
||||
|
@ -954,6 +955,11 @@ struct ct6_dsd {
|
|||
#define QLA82XX_CNTRL 98
|
||||
#define QLA82XX_TLHDR 99
|
||||
#define QLA82XX_RDEND 255
|
||||
#define QLA8044_POLLRD 35
|
||||
#define QLA8044_RDMUX2 36
|
||||
#define QLA8044_L1DTG 8
|
||||
#define QLA8044_L1ITG 9
|
||||
#define QLA8044_POLLRDMWR 37
|
||||
|
||||
/*
|
||||
* Opcodes for Control Entries.
|
||||
|
@ -1191,4 +1197,8 @@ enum {
|
|||
QLA82XX_TEMP_WARN, /* Sound alert, temperature getting high */
|
||||
QLA82XX_TEMP_PANIC /* Fatal error, hardware has shut down. */
|
||||
};
|
||||
|
||||
#define LEG_INTR_PTR_OFFSET 0x38C0
|
||||
#define LEG_INTR_TRIG_OFFSET 0x38C4
|
||||
#define LEG_INTR_MASK_OFFSET 0x38C8
|
||||
#endif
|
||||
|
|
3708
drivers/scsi/qla2xxx/qla_nx2.c
Normal file
3708
drivers/scsi/qla2xxx/qla_nx2.c
Normal file
File diff suppressed because it is too large
Load diff
551
drivers/scsi/qla2xxx/qla_nx2.h
Normal file
551
drivers/scsi/qla2xxx/qla_nx2.h
Normal file
|
@ -0,0 +1,551 @@
|
|||
/*
|
||||
* QLogic Fibre Channel HBA Driver
|
||||
* Copyright (c) 2003-2013 QLogic Corporation
|
||||
*
|
||||
* See LICENSE.qla2xxx for copyright and licensing details.
|
||||
*/
|
||||
|
||||
#ifndef __QLA_NX2_H
|
||||
#define __QLA_NX2_H
|
||||
|
||||
#define QSNT_ACK_TOV 30
|
||||
#define INTENT_TO_RECOVER 0x01
|
||||
#define PROCEED_TO_RECOVER 0x02
|
||||
#define IDC_LOCK_RECOVERY_OWNER_MASK 0x3C
|
||||
#define IDC_LOCK_RECOVERY_STATE_MASK 0x3
|
||||
#define IDC_LOCK_RECOVERY_STATE_SHIFT_BITS 2
|
||||
|
||||
#define QLA8044_DRV_LOCK_MSLEEP 200
|
||||
#define QLA8044_ADDR_DDR_NET (0x0000000000000000ULL)
|
||||
#define QLA8044_ADDR_DDR_NET_MAX (0x000000000fffffffULL)
|
||||
|
||||
#define MD_MIU_TEST_AGT_WRDATA_LO 0x410000A0
|
||||
#define MD_MIU_TEST_AGT_WRDATA_HI 0x410000A4
|
||||
#define MD_MIU_TEST_AGT_WRDATA_ULO 0x410000B0
|
||||
#define MD_MIU_TEST_AGT_WRDATA_UHI 0x410000B4
|
||||
#define MD_MIU_TEST_AGT_RDDATA_LO 0x410000A8
|
||||
#define MD_MIU_TEST_AGT_RDDATA_HI 0x410000AC
|
||||
#define MD_MIU_TEST_AGT_RDDATA_ULO 0x410000B8
|
||||
#define MD_MIU_TEST_AGT_RDDATA_UHI 0x410000BC
|
||||
|
||||
/* MIU_TEST_AGT_CTRL flags. work for SIU as well */
|
||||
#define MIU_TA_CTL_WRITE_ENABLE (MIU_TA_CTL_WRITE | MIU_TA_CTL_ENABLE)
|
||||
#define MIU_TA_CTL_WRITE_START (MIU_TA_CTL_WRITE | MIU_TA_CTL_ENABLE | \
|
||||
MIU_TA_CTL_START)
|
||||
#define MIU_TA_CTL_START_ENABLE (MIU_TA_CTL_START | MIU_TA_CTL_ENABLE)
|
||||
|
||||
/* 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 QLA8044_P2_ADDR_PCIE (0x0000000800000000ULL)
|
||||
#define QLA8044_P3_ADDR_PCIE (0x0000008000000000ULL)
|
||||
#define QLA8044_ADDR_PCIE_MAX (0x0000000FFFFFFFFFULL)
|
||||
#define QLA8044_ADDR_OCM0 (0x0000000200000000ULL)
|
||||
#define QLA8044_ADDR_OCM0_MAX (0x00000002000fffffULL)
|
||||
#define QLA8044_ADDR_OCM1 (0x0000000200400000ULL)
|
||||
#define QLA8044_ADDR_OCM1_MAX (0x00000002004fffffULL)
|
||||
#define QLA8044_ADDR_QDR_NET (0x0000000300000000ULL)
|
||||
#define QLA8044_P2_ADDR_QDR_NET_MAX (0x00000003001fffffULL)
|
||||
#define QLA8044_P3_ADDR_QDR_NET_MAX (0x0000000303ffffffULL)
|
||||
#define QLA8044_ADDR_QDR_NET_MAX (0x0000000307ffffffULL)
|
||||
#define QLA8044_PCI_CRBSPACE ((unsigned long)0x06000000)
|
||||
#define QLA8044_PCI_DIRECT_CRB ((unsigned long)0x04400000)
|
||||
#define QLA8044_PCI_CAMQM ((unsigned long)0x04800000)
|
||||
#define QLA8044_PCI_CAMQM_MAX ((unsigned long)0x04ffffff)
|
||||
#define QLA8044_PCI_DDR_NET ((unsigned long)0x00000000)
|
||||
#define QLA8044_PCI_QDR_NET ((unsigned long)0x04000000)
|
||||
#define QLA8044_PCI_QDR_NET_MAX ((unsigned long)0x043fffff)
|
||||
|
||||
/* PCI Windowing for DDR regions. */
|
||||
#define QLA8044_ADDR_IN_RANGE(addr, low, high) \
|
||||
(((addr) <= (high)) && ((addr) >= (low)))
|
||||
|
||||
/* Indirectly Mapped Registers */
|
||||
#define QLA8044_FLASH_SPI_STATUS 0x2808E010
|
||||
#define QLA8044_FLASH_SPI_CONTROL 0x2808E014
|
||||
#define QLA8044_FLASH_STATUS 0x42100004
|
||||
#define QLA8044_FLASH_CONTROL 0x42110004
|
||||
#define QLA8044_FLASH_ADDR 0x42110008
|
||||
#define QLA8044_FLASH_WRDATA 0x4211000C
|
||||
#define QLA8044_FLASH_RDDATA 0x42110018
|
||||
#define QLA8044_FLASH_DIRECT_WINDOW 0x42110030
|
||||
#define QLA8044_FLASH_DIRECT_DATA(DATA) (0x42150000 | (0x0000FFFF&DATA))
|
||||
|
||||
/* Flash access regs */
|
||||
#define QLA8044_FLASH_LOCK 0x3850
|
||||
#define QLA8044_FLASH_UNLOCK 0x3854
|
||||
#define QLA8044_FLASH_LOCK_ID 0x3500
|
||||
|
||||
/* Driver Lock regs */
|
||||
#define QLA8044_DRV_LOCK 0x3868
|
||||
#define QLA8044_DRV_UNLOCK 0x386C
|
||||
#define QLA8044_DRV_LOCK_ID 0x3504
|
||||
#define QLA8044_DRV_LOCKRECOVERY 0x379C
|
||||
|
||||
/* IDC version */
|
||||
#define QLA8044_IDC_VER_MAJ_VALUE 0x1
|
||||
#define QLA8044_IDC_VER_MIN_VALUE 0x0
|
||||
|
||||
/* IDC Registers : Driver Coexistence Defines */
|
||||
#define QLA8044_CRB_IDC_VER_MAJOR 0x3780
|
||||
#define QLA8044_CRB_IDC_VER_MINOR 0x3798
|
||||
#define QLA8044_IDC_DRV_AUDIT 0x3794
|
||||
#define QLA8044_SRE_SHIM_CONTROL 0x0D200284
|
||||
#define QLA8044_PORT0_RXB_PAUSE_THRS 0x0B2003A4
|
||||
#define QLA8044_PORT1_RXB_PAUSE_THRS 0x0B2013A4
|
||||
#define QLA8044_PORT0_RXB_TC_MAX_CELL 0x0B200388
|
||||
#define QLA8044_PORT1_RXB_TC_MAX_CELL 0x0B201388
|
||||
#define QLA8044_PORT0_RXB_TC_STATS 0x0B20039C
|
||||
#define QLA8044_PORT1_RXB_TC_STATS 0x0B20139C
|
||||
#define QLA8044_PORT2_IFB_PAUSE_THRS 0x0B200704
|
||||
#define QLA8044_PORT3_IFB_PAUSE_THRS 0x0B201704
|
||||
|
||||
/* set value to pause threshold value */
|
||||
#define QLA8044_SET_PAUSE_VAL 0x0
|
||||
#define QLA8044_SET_TC_MAX_CELL_VAL 0x03FF03FF
|
||||
#define QLA8044_PEG_HALT_STATUS1 0x34A8
|
||||
#define QLA8044_PEG_HALT_STATUS2 0x34AC
|
||||
#define QLA8044_PEG_ALIVE_COUNTER 0x34B0 /* FW_HEARTBEAT */
|
||||
#define QLA8044_FW_CAPABILITIES 0x3528
|
||||
#define QLA8044_CRB_DRV_ACTIVE 0x3788 /* IDC_DRV_PRESENCE */
|
||||
#define QLA8044_CRB_DEV_STATE 0x3784 /* IDC_DEV_STATE */
|
||||
#define QLA8044_CRB_DRV_STATE 0x378C /* IDC_DRV_ACK */
|
||||
#define QLA8044_CRB_DRV_SCRATCH 0x3548
|
||||
#define QLA8044_CRB_DEV_PART_INFO1 0x37E0
|
||||
#define QLA8044_CRB_DEV_PART_INFO2 0x37E4
|
||||
#define QLA8044_FW_VER_MAJOR 0x3550
|
||||
#define QLA8044_FW_VER_MINOR 0x3554
|
||||
#define QLA8044_FW_VER_SUB 0x3558
|
||||
#define QLA8044_NPAR_STATE 0x359C
|
||||
#define QLA8044_FW_IMAGE_VALID 0x35FC
|
||||
#define QLA8044_CMDPEG_STATE 0x3650
|
||||
#define QLA8044_ASIC_TEMP 0x37B4
|
||||
#define QLA8044_FW_API 0x356C
|
||||
#define QLA8044_DRV_OP_MODE 0x3570
|
||||
#define QLA8044_CRB_WIN_BASE 0x3800
|
||||
#define QLA8044_CRB_WIN_FUNC(f) (QLA8044_CRB_WIN_BASE+((f)*4))
|
||||
#define QLA8044_SEM_LOCK_BASE 0x3840
|
||||
#define QLA8044_SEM_UNLOCK_BASE 0x3844
|
||||
#define QLA8044_SEM_LOCK_FUNC(f) (QLA8044_SEM_LOCK_BASE+((f)*8))
|
||||
#define QLA8044_SEM_UNLOCK_FUNC(f) (QLA8044_SEM_UNLOCK_BASE+((f)*8))
|
||||
#define QLA8044_LINK_STATE(f) (0x3698+((f) > 7 ? 4 : 0))
|
||||
#define QLA8044_LINK_SPEED(f) (0x36E0+(((f) >> 2) * 4))
|
||||
#define QLA8044_MAX_LINK_SPEED(f) (0x36F0+(((f) / 4) * 4))
|
||||
#define QLA8044_LINK_SPEED_FACTOR 10
|
||||
|
||||
/* FLASH API Defines */
|
||||
#define QLA8044_FLASH_MAX_WAIT_USEC 100
|
||||
#define QLA8044_FLASH_LOCK_TIMEOUT 10000
|
||||
#define QLA8044_FLASH_SECTOR_SIZE 65536
|
||||
#define QLA8044_DRV_LOCK_TIMEOUT 2000
|
||||
#define QLA8044_FLASH_SECTOR_ERASE_CMD 0xdeadbeef
|
||||
#define QLA8044_FLASH_WRITE_CMD 0xdacdacda
|
||||
#define QLA8044_FLASH_BUFFER_WRITE_CMD 0xcadcadca
|
||||
#define QLA8044_FLASH_READ_RETRY_COUNT 2000
|
||||
#define QLA8044_FLASH_STATUS_READY 0x6
|
||||
#define QLA8044_FLASH_BUFFER_WRITE_MIN 2
|
||||
#define QLA8044_FLASH_BUFFER_WRITE_MAX 64
|
||||
#define QLA8044_FLASH_STATUS_REG_POLL_DELAY 1
|
||||
#define QLA8044_ERASE_MODE 1
|
||||
#define QLA8044_WRITE_MODE 2
|
||||
#define QLA8044_DWORD_WRITE_MODE 3
|
||||
#define QLA8044_GLOBAL_RESET 0x38CC
|
||||
#define QLA8044_WILDCARD 0x38F0
|
||||
#define QLA8044_INFORMANT 0x38FC
|
||||
#define QLA8044_HOST_MBX_CTRL 0x3038
|
||||
#define QLA8044_FW_MBX_CTRL 0x303C
|
||||
#define QLA8044_BOOTLOADER_ADDR 0x355C
|
||||
#define QLA8044_BOOTLOADER_SIZE 0x3560
|
||||
#define QLA8044_FW_IMAGE_ADDR 0x3564
|
||||
#define QLA8044_MBX_INTR_ENABLE 0x1000
|
||||
#define QLA8044_MBX_INTR_MASK 0x1200
|
||||
|
||||
/* IDC Control Register bit defines */
|
||||
#define DONTRESET_BIT0 0x1
|
||||
#define GRACEFUL_RESET_BIT1 0x2
|
||||
|
||||
/* ISP8044 PEG_HALT_STATUS1 bits */
|
||||
#define QLA8044_HALT_STATUS_INFORMATIONAL (0x1 << 29)
|
||||
#define QLA8044_HALT_STATUS_FW_RESET (0x2 << 29)
|
||||
#define QLA8044_HALT_STATUS_UNRECOVERABLE (0x4 << 29)
|
||||
|
||||
/* Firmware image definitions */
|
||||
#define QLA8044_BOOTLOADER_FLASH_ADDR 0x10000
|
||||
#define QLA8044_BOOT_FROM_FLASH 0
|
||||
#define QLA8044_IDC_PARAM_ADDR 0x3e8020
|
||||
|
||||
/* FLASH related definitions */
|
||||
#define QLA8044_OPTROM_BURST_SIZE 0x100
|
||||
#define QLA8044_MAX_OPTROM_BURST_DWORDS (QLA8044_OPTROM_BURST_SIZE / 4)
|
||||
#define QLA8044_MIN_OPTROM_BURST_DWORDS 2
|
||||
#define QLA8044_SECTOR_SIZE (64 * 1024)
|
||||
|
||||
#define QLA8044_FLASH_SPI_CTL 0x4
|
||||
#define QLA8044_FLASH_FIRST_TEMP_VAL 0x00800000
|
||||
#define QLA8044_FLASH_SECOND_TEMP_VAL 0x00800001
|
||||
#define QLA8044_FLASH_FIRST_MS_PATTERN 0x43
|
||||
#define QLA8044_FLASH_SECOND_MS_PATTERN 0x7F
|
||||
#define QLA8044_FLASH_LAST_MS_PATTERN 0x7D
|
||||
#define QLA8044_FLASH_STATUS_WRITE_DEF_SIG 0xFD0100
|
||||
#define QLA8044_FLASH_SECOND_ERASE_MS_VAL 0x5
|
||||
#define QLA8044_FLASH_ERASE_SIG 0xFD0300
|
||||
#define QLA8044_FLASH_LAST_ERASE_MS_VAL 0x3D
|
||||
|
||||
/* Reset template definitions */
|
||||
#define QLA8044_MAX_RESET_SEQ_ENTRIES 16
|
||||
#define QLA8044_RESTART_TEMPLATE_SIZE 0x2000
|
||||
#define QLA8044_RESET_TEMPLATE_ADDR 0x4F0000
|
||||
#define QLA8044_RESET_SEQ_VERSION 0x0101
|
||||
|
||||
/* Reset template entry opcodes */
|
||||
#define OPCODE_NOP 0x0000
|
||||
#define OPCODE_WRITE_LIST 0x0001
|
||||
#define OPCODE_READ_WRITE_LIST 0x0002
|
||||
#define OPCODE_POLL_LIST 0x0004
|
||||
#define OPCODE_POLL_WRITE_LIST 0x0008
|
||||
#define OPCODE_READ_MODIFY_WRITE 0x0010
|
||||
#define OPCODE_SEQ_PAUSE 0x0020
|
||||
#define OPCODE_SEQ_END 0x0040
|
||||
#define OPCODE_TMPL_END 0x0080
|
||||
#define OPCODE_POLL_READ_LIST 0x0100
|
||||
|
||||
/* Template Header */
|
||||
#define RESET_TMPLT_HDR_SIGNATURE 0xCAFE
|
||||
#define QLA8044_IDC_DRV_CTRL 0x3790
|
||||
#define AF_8044_NO_FW_DUMP 27 /* 0x08000000 */
|
||||
|
||||
#define MINIDUMP_SIZE_36K 36864
|
||||
|
||||
struct qla8044_reset_template_hdr {
|
||||
uint16_t version;
|
||||
uint16_t signature;
|
||||
uint16_t size;
|
||||
uint16_t entries;
|
||||
uint16_t hdr_size;
|
||||
uint16_t checksum;
|
||||
uint16_t init_seq_offset;
|
||||
uint16_t start_seq_offset;
|
||||
} __packed;
|
||||
|
||||
/* Common Entry Header. */
|
||||
struct qla8044_reset_entry_hdr {
|
||||
uint16_t cmd;
|
||||
uint16_t size;
|
||||
uint16_t count;
|
||||
uint16_t delay;
|
||||
} __packed;
|
||||
|
||||
/* Generic poll entry type. */
|
||||
struct qla8044_poll {
|
||||
uint32_t test_mask;
|
||||
uint32_t test_value;
|
||||
} __packed;
|
||||
|
||||
/* Read modify write entry type. */
|
||||
struct qla8044_rmw {
|
||||
uint32_t test_mask;
|
||||
uint32_t xor_value;
|
||||
uint32_t or_value;
|
||||
uint8_t shl;
|
||||
uint8_t shr;
|
||||
uint8_t index_a;
|
||||
uint8_t rsvd;
|
||||
} __packed;
|
||||
|
||||
/* Generic Entry Item with 2 DWords. */
|
||||
struct qla8044_entry {
|
||||
uint32_t arg1;
|
||||
uint32_t arg2;
|
||||
} __packed;
|
||||
|
||||
/* Generic Entry Item with 4 DWords.*/
|
||||
struct qla8044_quad_entry {
|
||||
uint32_t dr_addr;
|
||||
uint32_t dr_value;
|
||||
uint32_t ar_addr;
|
||||
uint32_t ar_value;
|
||||
} __packed;
|
||||
|
||||
struct qla8044_reset_template {
|
||||
int seq_index;
|
||||
int seq_error;
|
||||
int array_index;
|
||||
uint32_t array[QLA8044_MAX_RESET_SEQ_ENTRIES];
|
||||
uint8_t *buff;
|
||||
uint8_t *stop_offset;
|
||||
uint8_t *start_offset;
|
||||
uint8_t *init_offset;
|
||||
struct qla8044_reset_template_hdr *hdr;
|
||||
uint8_t seq_end;
|
||||
uint8_t template_end;
|
||||
};
|
||||
|
||||
/* Driver_code is for driver to write some info about the entry
|
||||
* currently not used.
|
||||
*/
|
||||
struct qla8044_minidump_entry_hdr {
|
||||
uint32_t entry_type;
|
||||
uint32_t entry_size;
|
||||
uint32_t entry_capture_size;
|
||||
struct {
|
||||
uint8_t entry_capture_mask;
|
||||
uint8_t entry_code;
|
||||
uint8_t driver_code;
|
||||
uint8_t driver_flags;
|
||||
} d_ctrl;
|
||||
} __packed;
|
||||
|
||||
/* Read CRB entry header */
|
||||
struct qla8044_minidump_entry_crb {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t addr;
|
||||
struct {
|
||||
uint8_t addr_stride;
|
||||
uint8_t state_index_a;
|
||||
uint16_t poll_timeout;
|
||||
} crb_strd;
|
||||
uint32_t data_size;
|
||||
uint32_t op_count;
|
||||
|
||||
struct {
|
||||
uint8_t opcode;
|
||||
uint8_t state_index_v;
|
||||
uint8_t shl;
|
||||
uint8_t shr;
|
||||
} crb_ctrl;
|
||||
|
||||
uint32_t value_1;
|
||||
uint32_t value_2;
|
||||
uint32_t value_3;
|
||||
} __packed;
|
||||
|
||||
struct qla8044_minidump_entry_cache {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t tag_reg_addr;
|
||||
struct {
|
||||
uint16_t tag_value_stride;
|
||||
uint16_t init_tag_value;
|
||||
} addr_ctrl;
|
||||
uint32_t data_size;
|
||||
uint32_t op_count;
|
||||
uint32_t control_addr;
|
||||
struct {
|
||||
uint16_t write_value;
|
||||
uint8_t poll_mask;
|
||||
uint8_t poll_wait;
|
||||
} cache_ctrl;
|
||||
uint32_t read_addr;
|
||||
struct {
|
||||
uint8_t read_addr_stride;
|
||||
uint8_t read_addr_cnt;
|
||||
uint16_t rsvd_1;
|
||||
} read_ctrl;
|
||||
} __packed;
|
||||
|
||||
/* Read OCM */
|
||||
struct qla8044_minidump_entry_rdocm {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t rsvd_0;
|
||||
uint32_t rsvd_1;
|
||||
uint32_t data_size;
|
||||
uint32_t op_count;
|
||||
uint32_t rsvd_2;
|
||||
uint32_t rsvd_3;
|
||||
uint32_t read_addr;
|
||||
uint32_t read_addr_stride;
|
||||
} __packed;
|
||||
|
||||
/* Read Memory */
|
||||
struct qla8044_minidump_entry_rdmem {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t rsvd[6];
|
||||
uint32_t read_addr;
|
||||
uint32_t read_data_size;
|
||||
};
|
||||
|
||||
/* Read Memory: For Pex-DMA */
|
||||
struct qla8044_minidump_entry_rdmem_pex_dma {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t desc_card_addr;
|
||||
uint16_t dma_desc_cmd;
|
||||
uint8_t rsvd[2];
|
||||
uint32_t start_dma_cmd;
|
||||
uint8_t rsvd2[12];
|
||||
uint32_t read_addr;
|
||||
uint32_t read_data_size;
|
||||
} __packed;
|
||||
|
||||
/* Read ROM */
|
||||
struct qla8044_minidump_entry_rdrom {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t rsvd[6];
|
||||
uint32_t read_addr;
|
||||
uint32_t read_data_size;
|
||||
} __packed;
|
||||
|
||||
/* Mux entry */
|
||||
struct qla8044_minidump_entry_mux {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t select_addr;
|
||||
uint32_t rsvd_0;
|
||||
uint32_t data_size;
|
||||
uint32_t op_count;
|
||||
uint32_t select_value;
|
||||
uint32_t select_value_stride;
|
||||
uint32_t read_addr;
|
||||
uint32_t rsvd_1;
|
||||
} __packed;
|
||||
|
||||
/* Queue entry */
|
||||
struct qla8044_minidump_entry_queue {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t select_addr;
|
||||
struct {
|
||||
uint16_t queue_id_stride;
|
||||
uint16_t rsvd_0;
|
||||
} q_strd;
|
||||
uint32_t data_size;
|
||||
uint32_t op_count;
|
||||
uint32_t rsvd_1;
|
||||
uint32_t rsvd_2;
|
||||
uint32_t read_addr;
|
||||
struct {
|
||||
uint8_t read_addr_stride;
|
||||
uint8_t read_addr_cnt;
|
||||
uint16_t rsvd_3;
|
||||
} rd_strd;
|
||||
} __packed;
|
||||
|
||||
/* POLLRD Entry */
|
||||
struct qla8044_minidump_entry_pollrd {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t select_addr;
|
||||
uint32_t read_addr;
|
||||
uint32_t select_value;
|
||||
uint16_t select_value_stride;
|
||||
uint16_t op_count;
|
||||
uint32_t poll_wait;
|
||||
uint32_t poll_mask;
|
||||
uint32_t data_size;
|
||||
uint32_t rsvd_1;
|
||||
} __packed;
|
||||
|
||||
/* RDMUX2 Entry */
|
||||
struct qla8044_minidump_entry_rdmux2 {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t select_addr_1;
|
||||
uint32_t select_addr_2;
|
||||
uint32_t select_value_1;
|
||||
uint32_t select_value_2;
|
||||
uint32_t op_count;
|
||||
uint32_t select_value_mask;
|
||||
uint32_t read_addr;
|
||||
uint8_t select_value_stride;
|
||||
uint8_t data_size;
|
||||
uint8_t rsvd[2];
|
||||
} __packed;
|
||||
|
||||
/* POLLRDMWR Entry */
|
||||
struct qla8044_minidump_entry_pollrdmwr {
|
||||
struct qla8044_minidump_entry_hdr h;
|
||||
uint32_t addr_1;
|
||||
uint32_t addr_2;
|
||||
uint32_t value_1;
|
||||
uint32_t value_2;
|
||||
uint32_t poll_wait;
|
||||
uint32_t poll_mask;
|
||||
uint32_t modify_mask;
|
||||
uint32_t data_size;
|
||||
} __packed;
|
||||
|
||||
/* IDC additional information */
|
||||
struct qla8044_idc_information {
|
||||
uint32_t request_desc; /* IDC request descriptor */
|
||||
uint32_t info1; /* IDC additional info */
|
||||
uint32_t info2; /* IDC additional info */
|
||||
uint32_t info3; /* IDC additional info */
|
||||
} __packed;
|
||||
|
||||
enum qla_regs {
|
||||
QLA8044_PEG_HALT_STATUS1_INDEX = 0,
|
||||
QLA8044_PEG_HALT_STATUS2_INDEX,
|
||||
QLA8044_PEG_ALIVE_COUNTER_INDEX,
|
||||
QLA8044_CRB_DRV_ACTIVE_INDEX,
|
||||
QLA8044_CRB_DEV_STATE_INDEX,
|
||||
QLA8044_CRB_DRV_STATE_INDEX,
|
||||
QLA8044_CRB_DRV_SCRATCH_INDEX,
|
||||
QLA8044_CRB_DEV_PART_INFO_INDEX,
|
||||
QLA8044_CRB_DRV_IDC_VERSION_INDEX,
|
||||
QLA8044_FW_VERSION_MAJOR_INDEX,
|
||||
QLA8044_FW_VERSION_MINOR_INDEX,
|
||||
QLA8044_FW_VERSION_SUB_INDEX,
|
||||
QLA8044_CRB_CMDPEG_STATE_INDEX,
|
||||
QLA8044_CRB_TEMP_STATE_INDEX,
|
||||
} __packed;
|
||||
|
||||
#define CRB_REG_INDEX_MAX 14
|
||||
#define CRB_CMDPEG_CHECK_RETRY_COUNT 60
|
||||
#define CRB_CMDPEG_CHECK_DELAY 500
|
||||
|
||||
static const uint32_t qla8044_reg_tbl[] = {
|
||||
QLA8044_PEG_HALT_STATUS1,
|
||||
QLA8044_PEG_HALT_STATUS2,
|
||||
QLA8044_PEG_ALIVE_COUNTER,
|
||||
QLA8044_CRB_DRV_ACTIVE,
|
||||
QLA8044_CRB_DEV_STATE,
|
||||
QLA8044_CRB_DRV_STATE,
|
||||
QLA8044_CRB_DRV_SCRATCH,
|
||||
QLA8044_CRB_DEV_PART_INFO1,
|
||||
QLA8044_CRB_IDC_VER_MAJOR,
|
||||
QLA8044_FW_VER_MAJOR,
|
||||
QLA8044_FW_VER_MINOR,
|
||||
QLA8044_FW_VER_SUB,
|
||||
QLA8044_CMDPEG_STATE,
|
||||
QLA8044_ASIC_TEMP,
|
||||
};
|
||||
|
||||
/* MiniDump Structures */
|
||||
|
||||
/* Driver_code is for driver to write some info about the entry
|
||||
* currently not used.
|
||||
*/
|
||||
#define QLA8044_SS_OCM_WNDREG_INDEX 3
|
||||
#define QLA8044_DBG_STATE_ARRAY_LEN 16
|
||||
#define QLA8044_DBG_CAP_SIZE_ARRAY_LEN 8
|
||||
#define QLA8044_DBG_RSVD_ARRAY_LEN 8
|
||||
#define QLA8044_DBG_OCM_WNDREG_ARRAY_LEN 16
|
||||
#define QLA8044_SS_PCI_INDEX 0
|
||||
|
||||
struct qla8044_minidump_template_hdr {
|
||||
uint32_t entry_type;
|
||||
uint32_t first_entry_offset;
|
||||
uint32_t size_of_template;
|
||||
uint32_t capture_debug_level;
|
||||
uint32_t num_of_entries;
|
||||
uint32_t version;
|
||||
uint32_t driver_timestamp;
|
||||
uint32_t checksum;
|
||||
|
||||
uint32_t driver_capture_mask;
|
||||
uint32_t driver_info_word2;
|
||||
uint32_t driver_info_word3;
|
||||
uint32_t driver_info_word4;
|
||||
|
||||
uint32_t saved_state_array[QLA8044_DBG_STATE_ARRAY_LEN];
|
||||
uint32_t capture_size_array[QLA8044_DBG_CAP_SIZE_ARRAY_LEN];
|
||||
uint32_t ocm_window_reg[QLA8044_DBG_OCM_WNDREG_ARRAY_LEN];
|
||||
};
|
||||
|
||||
struct qla8044_pex_dma_descriptor {
|
||||
struct {
|
||||
uint32_t read_data_size; /* 0-23: size, 24-31: rsvd */
|
||||
uint8_t rsvd[2];
|
||||
uint16_t dma_desc_cmd;
|
||||
} cmd;
|
||||
uint64_t src_addr;
|
||||
uint64_t dma_bus_addr; /*0-3: desc-cmd, 4-7: pci-func, 8-15: desc-cmd*/
|
||||
uint8_t rsvd[24];
|
||||
} __packed;
|
||||
|
||||
#endif
|
|
@ -1247,7 +1247,7 @@ 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 (IS_P3P_TYPE(vha->hw)) {
|
||||
if (!qla82xx_fcoe_ctx_reset(vha)) {
|
||||
/* Ctx reset success */
|
||||
ret = SUCCESS;
|
||||
|
@ -1911,7 +1911,7 @@ static struct isp_operations qla2300_isp_ops = {
|
|||
.get_flash_version = qla2x00_get_flash_version,
|
||||
.start_scsi = qla2x00_start_scsi,
|
||||
.abort_isp = qla2x00_abort_isp,
|
||||
.iospace_config = qla2x00_iospace_config,
|
||||
.iospace_config = qla2x00_iospace_config,
|
||||
.initialize_adapter = qla2x00_initialize_adapter,
|
||||
};
|
||||
|
||||
|
@ -1949,7 +1949,7 @@ static struct isp_operations qla24xx_isp_ops = {
|
|||
.get_flash_version = qla24xx_get_flash_version,
|
||||
.start_scsi = qla24xx_start_scsi,
|
||||
.abort_isp = qla2x00_abort_isp,
|
||||
.iospace_config = qla2x00_iospace_config,
|
||||
.iospace_config = qla2x00_iospace_config,
|
||||
.initialize_adapter = qla2x00_initialize_adapter,
|
||||
};
|
||||
|
||||
|
@ -1987,7 +1987,7 @@ static struct isp_operations qla25xx_isp_ops = {
|
|||
.get_flash_version = qla24xx_get_flash_version,
|
||||
.start_scsi = qla24xx_dif_start_scsi,
|
||||
.abort_isp = qla2x00_abort_isp,
|
||||
.iospace_config = qla2x00_iospace_config,
|
||||
.iospace_config = qla2x00_iospace_config,
|
||||
.initialize_adapter = qla2x00_initialize_adapter,
|
||||
};
|
||||
|
||||
|
@ -2025,7 +2025,7 @@ static struct isp_operations qla81xx_isp_ops = {
|
|||
.get_flash_version = qla24xx_get_flash_version,
|
||||
.start_scsi = qla24xx_dif_start_scsi,
|
||||
.abort_isp = qla2x00_abort_isp,
|
||||
.iospace_config = qla2x00_iospace_config,
|
||||
.iospace_config = qla2x00_iospace_config,
|
||||
.initialize_adapter = qla2x00_initialize_adapter,
|
||||
};
|
||||
|
||||
|
@ -2060,13 +2060,51 @@ static struct isp_operations qla82xx_isp_ops = {
|
|||
.beacon_blink = NULL,
|
||||
.read_optrom = qla82xx_read_optrom_data,
|
||||
.write_optrom = qla82xx_write_optrom_data,
|
||||
.get_flash_version = qla24xx_get_flash_version,
|
||||
.get_flash_version = qla82xx_get_flash_version,
|
||||
.start_scsi = qla82xx_start_scsi,
|
||||
.abort_isp = qla82xx_abort_isp,
|
||||
.iospace_config = qla82xx_iospace_config,
|
||||
.initialize_adapter = qla2x00_initialize_adapter,
|
||||
};
|
||||
|
||||
static struct isp_operations qla8044_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 = qla24xx_pci_info_str,
|
||||
.fw_version_str = qla24xx_fw_version_str,
|
||||
.intr_handler = qla8044_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 = NULL,
|
||||
.write_nvram = NULL,
|
||||
.fw_dump = qla24xx_fw_dump,
|
||||
.beacon_on = qla82xx_beacon_on,
|
||||
.beacon_off = qla82xx_beacon_off,
|
||||
.beacon_blink = NULL,
|
||||
.read_optrom = qla82xx_read_optrom_data,
|
||||
.write_optrom = qla8044_write_optrom_data,
|
||||
.get_flash_version = qla82xx_get_flash_version,
|
||||
.start_scsi = qla82xx_start_scsi,
|
||||
.abort_isp = qla8044_abort_isp,
|
||||
.iospace_config = qla82xx_iospace_config,
|
||||
.initialize_adapter = qla2x00_initialize_adapter,
|
||||
};
|
||||
|
||||
static struct isp_operations qla83xx_isp_ops = {
|
||||
.pci_config = qla25xx_pci_config,
|
||||
.reset_chip = qla24xx_reset_chip,
|
||||
|
@ -2237,6 +2275,14 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha)
|
|||
/* Initialize 82XX ISP flags */
|
||||
qla82xx_init_flags(ha);
|
||||
break;
|
||||
case PCI_DEVICE_ID_QLOGIC_ISP8044:
|
||||
ha->device_type |= DT_ISP8044;
|
||||
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;
|
||||
case PCI_DEVICE_ID_QLOGIC_ISP2031:
|
||||
ha->device_type |= DT_ISP2031;
|
||||
ha->device_type |= DT_ZIO_SUPPORTED;
|
||||
|
@ -2317,7 +2363,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
uint16_t req_length = 0, rsp_length = 0;
|
||||
struct req_que *req = NULL;
|
||||
struct rsp_que *rsp = NULL;
|
||||
|
||||
bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO);
|
||||
sht = &qla2xxx_driver_template;
|
||||
if (pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422 ||
|
||||
|
@ -2330,7 +2375,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8021 ||
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2031 ||
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8031 ||
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISPF001) {
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISPF001 ||
|
||||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8044) {
|
||||
bars = pci_select_bars(pdev, IORESOURCE_MEM);
|
||||
mem_only = 1;
|
||||
ql_dbg_pci(ql_dbg_init, pdev, 0x0007,
|
||||
|
@ -2484,6 +2530,21 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
ha->flash_data_off = FARX_ACCESS_FLASH_DATA;
|
||||
ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
|
||||
ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
|
||||
} else if (IS_QLA8044(ha)) {
|
||||
ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
|
||||
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_83XX;
|
||||
ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX;
|
||||
ha->isp_ops = &qla8044_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;
|
||||
} else if (IS_QLA83XX(ha)) {
|
||||
ha->portnum = PCI_FUNC(ha->pdev->devfn);
|
||||
ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
|
||||
|
@ -2676,7 +2737,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
rsp->rsp_q_out = &ha->iobase->ispfx00.rsp_q_out;
|
||||
}
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(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];
|
||||
|
@ -2709,6 +2770,14 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
qla82xx_idc_unlock(ha);
|
||||
ql_log(ql_log_fatal, base_vha, 0x00d7,
|
||||
"HW State: FAILED.\n");
|
||||
} else if (IS_QLA8044(ha)) {
|
||||
qla8044_idc_lock(ha);
|
||||
qla8044_wr_direct(base_vha,
|
||||
QLA8044_CRB_DEV_STATE_INDEX,
|
||||
QLA8XXX_DEV_FAILED);
|
||||
qla8044_idc_unlock(ha);
|
||||
ql_log(ql_log_fatal, base_vha, 0x0150,
|
||||
"HW State: FAILED.\n");
|
||||
}
|
||||
|
||||
ret = -ENODEV;
|
||||
|
@ -2881,8 +2950,13 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
qla82xx_clear_drv_active(ha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
}
|
||||
if (IS_QLA8044(ha)) {
|
||||
qla8044_idc_lock(ha);
|
||||
qla8044_clear_drv_active(base_vha);
|
||||
qla8044_idc_unlock(ha);
|
||||
}
|
||||
iospace_config_failed:
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
if (!ha->nx_pcibase)
|
||||
iounmap((device_reg_t __iomem *)ha->nx_pcibase);
|
||||
if (!ql2xdbwr)
|
||||
|
@ -3061,6 +3135,11 @@ qla2x00_remove_one(struct pci_dev *pdev)
|
|||
|
||||
scsi_host_put(base_vha->host);
|
||||
|
||||
if (IS_QLA8044(ha)) {
|
||||
qla8044_idc_lock(ha);
|
||||
qla8044_clear_drv_active(base_vha);
|
||||
qla8044_idc_unlock(ha);
|
||||
}
|
||||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_clear_drv_active(ha);
|
||||
|
@ -3284,7 +3363,7 @@ 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)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
/* Allocate cache for CT6 Ctx. */
|
||||
if (!ctx_cachep) {
|
||||
ctx_cachep = kmem_cache_create("qla2xxx_ctx",
|
||||
|
@ -3318,7 +3397,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
|||
"init_cb=%p gid_list=%p, srb_mempool=%p s_dma_pool=%p.\n",
|
||||
ha->init_cb, ha->gid_list, ha->srb_mempool, ha->s_dma_pool);
|
||||
|
||||
if (IS_QLA82XX(ha) || ql2xenabledif) {
|
||||
if (IS_P3P_TYPE(ha) || ql2xenabledif) {
|
||||
ha->dl_dma_pool = dma_pool_create(name, &ha->pdev->dev,
|
||||
DSD_LIST_DMA_POOL_SIZE, 8, 0);
|
||||
if (!ha->dl_dma_pool) {
|
||||
|
@ -3526,7 +3605,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
|
|||
* Frees fw dump stuff.
|
||||
*
|
||||
* Input:
|
||||
* ha = adapter block pointer.
|
||||
* ha = adapter block pointer
|
||||
*/
|
||||
static void
|
||||
qla2x00_free_fw_dump(struct qla_hw_data *ha)
|
||||
|
@ -4693,17 +4772,33 @@ 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,
|
||||
QLA8XXX_DEV_FAILED);
|
||||
qla82xx_idc_unlock(ha);
|
||||
ql_log(ql_log_info, base_vha, 0x4004,
|
||||
"HW State: FAILED.\n");
|
||||
qla82xx_device_state_handler(base_vha);
|
||||
continue;
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
if (IS_QLA8044(ha)) {
|
||||
if (test_and_clear_bit(ISP_UNRECOVERABLE,
|
||||
&base_vha->dpc_flags)) {
|
||||
qla8044_idc_lock(ha);
|
||||
qla8044_wr_direct(base_vha,
|
||||
QLA8044_CRB_DEV_STATE_INDEX,
|
||||
QLA8XXX_DEV_FAILED);
|
||||
qla8044_idc_unlock(ha);
|
||||
ql_log(ql_log_info, base_vha, 0x4004,
|
||||
"HW State: FAILED.\n");
|
||||
qla8044_device_state_handler(base_vha);
|
||||
continue;
|
||||
}
|
||||
|
||||
} else {
|
||||
if (test_and_clear_bit(ISP_UNRECOVERABLE,
|
||||
&base_vha->dpc_flags)) {
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
|
||||
QLA8XXX_DEV_FAILED);
|
||||
qla82xx_idc_unlock(ha);
|
||||
ql_log(ql_log_info, base_vha, 0x0151,
|
||||
"HW State: FAILED.\n");
|
||||
qla82xx_device_state_handler(base_vha);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(FCOE_CTX_RESET_NEEDED,
|
||||
|
@ -4803,16 +4898,26 @@ qla2x00_do_dpc(void *data)
|
|||
if (test_bit(ISP_QUIESCE_NEEDED, &base_vha->dpc_flags)) {
|
||||
ql_dbg(ql_dbg_dpc, base_vha, 0x4009,
|
||||
"Quiescence mode scheduled.\n");
|
||||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_device_state_handler(base_vha);
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
if (IS_QLA82XX(ha))
|
||||
qla82xx_device_state_handler(base_vha);
|
||||
if (IS_QLA8044(ha))
|
||||
qla8044_device_state_handler(base_vha);
|
||||
clear_bit(ISP_QUIESCE_NEEDED,
|
||||
&base_vha->dpc_flags);
|
||||
if (!ha->flags.quiesce_owner) {
|
||||
qla2x00_perform_loop_resync(base_vha);
|
||||
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_clear_qsnt_ready(base_vha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_clear_qsnt_ready(
|
||||
base_vha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
} else if (IS_QLA8044(ha)) {
|
||||
qla8044_idc_lock(ha);
|
||||
qla8044_clear_qsnt_ready(
|
||||
base_vha);
|
||||
qla8044_idc_unlock(ha);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
clear_bit(ISP_QUIESCE_NEEDED,
|
||||
|
@ -4986,10 +5091,13 @@ qla2x00_timer(scsi_qla_host_t *vha)
|
|||
pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w);
|
||||
|
||||
/* Make sure qla82xx_watchdog is run only for physical port */
|
||||
if (!vha->vp_idx && IS_QLA82XX(ha)) {
|
||||
if (!vha->vp_idx && IS_P3P_TYPE(ha)) {
|
||||
if (test_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags))
|
||||
start_dpc++;
|
||||
qla82xx_watchdog(vha);
|
||||
if (IS_QLA82XX(ha))
|
||||
qla82xx_watchdog(vha);
|
||||
else if (IS_QLA8044(ha))
|
||||
qla8044_watchdog(vha);
|
||||
}
|
||||
|
||||
if (!vha->vp_idx && IS_QLAFX00(ha))
|
||||
|
@ -5069,7 +5177,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
|
|||
/* Check if beacon LED needs to be blinked for physical host only */
|
||||
if (!vha->vp_idx && (ha->beacon_blink_led == 1)) {
|
||||
/* There is no beacon_blink function for ISP82xx */
|
||||
if (!IS_QLA82XX(ha)) {
|
||||
if (!IS_P3P_TYPE(ha)) {
|
||||
set_bit(BEACON_BLINK_NEEDED, &vha->dpc_flags);
|
||||
start_dpc++;
|
||||
}
|
||||
|
@ -5513,6 +5621,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = {
|
|||
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8021) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8031) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISPF001) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8044) },
|
||||
{ 0 },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl);
|
||||
|
|
|
@ -565,7 +565,7 @@ 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)) {
|
||||
else if (IS_P3P_TYPE(ha)) {
|
||||
*start = FA_FLASH_LAYOUT_ADDR_82;
|
||||
goto end;
|
||||
} else if (IS_QLA83XX(ha)) {
|
||||
|
@ -719,7 +719,7 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
|
|||
start = le32_to_cpu(region->start) >> 2;
|
||||
ql_dbg(ql_dbg_init, vha, 0x0049,
|
||||
"FLT[%02x]: start=0x%x "
|
||||
"end=0x%x size=0x%x.\n", le32_to_cpu(region->code),
|
||||
"end=0x%x size=0x%x.\n", le32_to_cpu(region->code) & 0xff,
|
||||
start, le32_to_cpu(region->end) >> 2,
|
||||
le32_to_cpu(region->size));
|
||||
|
||||
|
@ -741,13 +741,13 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
|
|||
if (IS_QLA8031(ha))
|
||||
break;
|
||||
ha->flt_region_vpd_nvram = start;
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
break;
|
||||
if (ha->flags.port0)
|
||||
ha->flt_region_vpd = start;
|
||||
break;
|
||||
case FLT_REG_VPD_1:
|
||||
if (IS_QLA82XX(ha) || IS_QLA8031(ha))
|
||||
if (IS_P3P_TYPE(ha) || IS_QLA8031(ha))
|
||||
break;
|
||||
if (!ha->flags.port0)
|
||||
ha->flt_region_vpd = start;
|
||||
|
@ -789,9 +789,17 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
|
|||
case FLT_REG_BOOT_CODE_82XX:
|
||||
ha->flt_region_boot = start;
|
||||
break;
|
||||
case FLT_REG_BOOT_CODE_8044:
|
||||
if (IS_QLA8044(ha))
|
||||
ha->flt_region_boot = start;
|
||||
break;
|
||||
case FLT_REG_FW_82XX:
|
||||
ha->flt_region_fw = start;
|
||||
break;
|
||||
case FLT_REG_CNA_FW:
|
||||
if (IS_CNA_CAPABLE(ha))
|
||||
ha->flt_region_fw = start;
|
||||
break;
|
||||
case FLT_REG_GOLD_FW_82XX:
|
||||
ha->flt_region_gold_fw = start;
|
||||
break;
|
||||
|
@ -803,13 +811,13 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
|
|||
ha->flt_region_vpd = start;
|
||||
break;
|
||||
case FLT_REG_FCOE_NVRAM_0:
|
||||
if (!IS_QLA8031(ha))
|
||||
if (!(IS_QLA8031(ha) || IS_QLA8044(ha)))
|
||||
break;
|
||||
if (ha->flags.port0)
|
||||
ha->flt_region_nvram = start;
|
||||
break;
|
||||
case FLT_REG_FCOE_NVRAM_1:
|
||||
if (!IS_QLA8031(ha))
|
||||
if (!(IS_QLA8031(ha) || IS_QLA8044(ha)))
|
||||
break;
|
||||
if (!ha->flags.port0)
|
||||
ha->flt_region_nvram = start;
|
||||
|
@ -883,7 +891,13 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha)
|
|||
mid = le16_to_cpu(fdt->man_id);
|
||||
fid = le16_to_cpu(fdt->id);
|
||||
ha->fdt_wrt_disable = fdt->wrt_disable_bits;
|
||||
ha->fdt_erase_cmd = flash_conf_addr(ha, 0x0300 | fdt->erase_cmd);
|
||||
ha->fdt_wrt_enable = fdt->wrt_enable_bits;
|
||||
ha->fdt_wrt_sts_reg_cmd = fdt->wrt_sts_reg_cmd;
|
||||
if (IS_QLA8044(ha))
|
||||
ha->fdt_erase_cmd = fdt->erase_cmd;
|
||||
else
|
||||
ha->fdt_erase_cmd =
|
||||
flash_conf_addr(ha, 0x0300 | fdt->erase_cmd);
|
||||
ha->fdt_block_size = le32_to_cpu(fdt->block_size);
|
||||
if (fdt->unprotect_sec_cmd) {
|
||||
ha->fdt_unprotect_sec_cmd = flash_conf_addr(ha, 0x0300 |
|
||||
|
@ -895,7 +909,7 @@ qla2xxx_get_fdt_info(scsi_qla_host_t *vha)
|
|||
goto done;
|
||||
no_flash_data:
|
||||
loc = locations[0];
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (IS_P3P_TYPE(ha)) {
|
||||
ha->fdt_block_size = FLASH_BLK_SIZE_64K;
|
||||
goto done;
|
||||
}
|
||||
|
@ -946,7 +960,7 @@ qla2xxx_get_idc_param(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))
|
||||
if (!(IS_P3P_TYPE(ha)))
|
||||
return;
|
||||
|
||||
wptr = (uint32_t *)req->ring;
|
||||
|
@ -1008,6 +1022,9 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha)
|
|||
if (ha->flags.nic_core_reset_hdlr_active)
|
||||
return;
|
||||
|
||||
if (IS_QLA8044(ha))
|
||||
return;
|
||||
|
||||
ha->isp_ops->read_optrom(vha, (uint8_t *)&hdr,
|
||||
ha->flt_region_npiv_conf << 2, sizeof(struct qla_npiv_header));
|
||||
if (hdr.version == __constant_cpu_to_le16(0xffff))
|
||||
|
@ -1302,7 +1319,7 @@ 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))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return buf;
|
||||
|
||||
/* Dword reads to flash. */
|
||||
|
@ -1360,7 +1377,7 @@ qla24xx_write_nvram_data(scsi_qla_host_t *vha, uint8_t *buf, uint32_t naddr,
|
|||
|
||||
ret = QLA_SUCCESS;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return ret;
|
||||
|
||||
/* Enable flash write. */
|
||||
|
@ -1474,7 +1491,7 @@ 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))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
@ -1752,7 +1769,7 @@ 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))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return QLA_SUCCESS;
|
||||
|
||||
if (IS_QLA8031(ha) || IS_QLA81XX(ha))
|
||||
|
@ -1804,7 +1821,7 @@ 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))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return QLA_SUCCESS;
|
||||
|
||||
ha->beacon_blink_led = 0;
|
||||
|
@ -2821,6 +2838,121 @@ qla2x00_get_flash_version(scsi_qla_host_t *vha, void *mbuf)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
qla82xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf)
|
||||
{
|
||||
int ret = QLA_SUCCESS;
|
||||
uint32_t pcihdr, pcids;
|
||||
uint32_t *dcode;
|
||||
uint8_t *bcode;
|
||||
uint8_t code_type, last_image;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (!mbuf)
|
||||
return QLA_FUNCTION_FAILED;
|
||||
|
||||
memset(ha->bios_revision, 0, sizeof(ha->bios_revision));
|
||||
memset(ha->efi_revision, 0, sizeof(ha->efi_revision));
|
||||
memset(ha->fcode_revision, 0, sizeof(ha->fcode_revision));
|
||||
memset(ha->fw_revision, 0, sizeof(ha->fw_revision));
|
||||
|
||||
dcode = mbuf;
|
||||
|
||||
/* Begin with first PCI expansion ROM header. */
|
||||
pcihdr = ha->flt_region_boot << 2;
|
||||
last_image = 1;
|
||||
do {
|
||||
/* Verify PCI expansion ROM header. */
|
||||
ha->isp_ops->read_optrom(vha, (uint8_t *)dcode, pcihdr,
|
||||
0x20 * 4);
|
||||
bcode = mbuf + (pcihdr % 4);
|
||||
if (bcode[0x0] != 0x55 || bcode[0x1] != 0xaa) {
|
||||
/* No signature */
|
||||
ql_log(ql_log_fatal, vha, 0x0154,
|
||||
"No matching ROM signature.\n");
|
||||
ret = QLA_FUNCTION_FAILED;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Locate PCI data structure. */
|
||||
pcids = pcihdr + ((bcode[0x19] << 8) | bcode[0x18]);
|
||||
|
||||
ha->isp_ops->read_optrom(vha, (uint8_t *)dcode, pcids,
|
||||
0x20 * 4);
|
||||
bcode = mbuf + (pcihdr % 4);
|
||||
|
||||
/* Validate signature of PCI data structure. */
|
||||
if (bcode[0x0] != 'P' || bcode[0x1] != 'C' ||
|
||||
bcode[0x2] != 'I' || bcode[0x3] != 'R') {
|
||||
/* Incorrect header. */
|
||||
ql_log(ql_log_fatal, vha, 0x0155,
|
||||
"PCI data struct not found pcir_adr=%x.\n", pcids);
|
||||
ret = QLA_FUNCTION_FAILED;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Read version */
|
||||
code_type = bcode[0x14];
|
||||
switch (code_type) {
|
||||
case ROM_CODE_TYPE_BIOS:
|
||||
/* Intel x86, PC-AT compatible. */
|
||||
ha->bios_revision[0] = bcode[0x12];
|
||||
ha->bios_revision[1] = bcode[0x13];
|
||||
ql_dbg(ql_dbg_init, vha, 0x0156,
|
||||
"Read BIOS %d.%d.\n",
|
||||
ha->bios_revision[1], ha->bios_revision[0]);
|
||||
break;
|
||||
case ROM_CODE_TYPE_FCODE:
|
||||
/* Open Firmware standard for PCI (FCode). */
|
||||
ha->fcode_revision[0] = bcode[0x12];
|
||||
ha->fcode_revision[1] = bcode[0x13];
|
||||
ql_dbg(ql_dbg_init, vha, 0x0157,
|
||||
"Read FCODE %d.%d.\n",
|
||||
ha->fcode_revision[1], ha->fcode_revision[0]);
|
||||
break;
|
||||
case ROM_CODE_TYPE_EFI:
|
||||
/* Extensible Firmware Interface (EFI). */
|
||||
ha->efi_revision[0] = bcode[0x12];
|
||||
ha->efi_revision[1] = bcode[0x13];
|
||||
ql_dbg(ql_dbg_init, vha, 0x0158,
|
||||
"Read EFI %d.%d.\n",
|
||||
ha->efi_revision[1], ha->efi_revision[0]);
|
||||
break;
|
||||
default:
|
||||
ql_log(ql_log_warn, vha, 0x0159,
|
||||
"Unrecognized code type %x at pcids %x.\n",
|
||||
code_type, pcids);
|
||||
break;
|
||||
}
|
||||
|
||||
last_image = bcode[0x15] & BIT_7;
|
||||
|
||||
/* Locate next PCI expansion ROM. */
|
||||
pcihdr += ((bcode[0x11] << 8) | bcode[0x10]) * 512;
|
||||
} while (!last_image);
|
||||
|
||||
/* Read firmware image information. */
|
||||
memset(ha->fw_revision, 0, sizeof(ha->fw_revision));
|
||||
dcode = mbuf;
|
||||
ha->isp_ops->read_optrom(vha, (uint8_t *)dcode, ha->flt_region_fw << 2,
|
||||
0x20);
|
||||
bcode = mbuf + (pcihdr % 4);
|
||||
|
||||
/* Validate signature of PCI data structure. */
|
||||
if (bcode[0x0] == 0x3 && bcode[0x1] == 0x0 &&
|
||||
bcode[0x2] == 0x40 && bcode[0x3] == 0x40) {
|
||||
ha->fw_revision[0] = bcode[0x4];
|
||||
ha->fw_revision[1] = bcode[0x5];
|
||||
ha->fw_revision[2] = bcode[0x6];
|
||||
ql_dbg(ql_dbg_init, vha, 0x015a,
|
||||
"Firmware revision %d.%d.%d\n",
|
||||
ha->fw_revision[0], ha->fw_revision[1],
|
||||
ha->fw_revision[2]);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf)
|
||||
{
|
||||
|
@ -2832,7 +2964,7 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf)
|
|||
int i;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
||||
if (IS_QLA82XX(ha))
|
||||
if (IS_P3P_TYPE(ha))
|
||||
return ret;
|
||||
|
||||
if (!mbuf)
|
||||
|
|
Loading…
Reference in a new issue