[SCSI] qla2xxx: Add support for ISP82xx to capture dump (minidump) on failure.
Minidump allows us to catpure a snapshot of the firmware/hardware states at the time of failure for further analysis. [jejb: added missing #include <linux/vmalloc.h> Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> ] Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
86a9668a8d
commit
08de2844c6
@ -23,11 +23,23 @@ qla2x00_sysfs_read_fw_dump(struct file *filp, 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;
|
||||
int rval = 0;
|
||||
|
||||
if (ha->fw_dump_reading == 0)
|
||||
return 0;
|
||||
|
||||
return memory_read_from_buffer(buf, count, &off, ha->fw_dump,
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (off < ha->md_template_size) {
|
||||
rval = memory_read_from_buffer(buf, count,
|
||||
&off, ha->md_tmplt_hdr, ha->md_template_size);
|
||||
return rval;
|
||||
}
|
||||
off -= ha->md_template_size;
|
||||
rval = memory_read_from_buffer(buf, count,
|
||||
&off, ha->md_dump, ha->md_dump_size);
|
||||
return rval;
|
||||
} else
|
||||
return memory_read_from_buffer(buf, count, &off, ha->fw_dump,
|
||||
ha->fw_dump_len);
|
||||
}
|
||||
|
||||
@ -41,12 +53,6 @@ qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj,
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
int reading;
|
||||
|
||||
if (IS_QLA82XX(ha)) {
|
||||
ql_dbg(ql_dbg_user, vha, 0x705b,
|
||||
"Firmware dump not supported for ISP82xx\n");
|
||||
return count;
|
||||
}
|
||||
|
||||
if (off != 0)
|
||||
return (0);
|
||||
|
||||
@ -59,6 +65,10 @@ 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)) {
|
||||
qla82xx_md_free(vha);
|
||||
qla82xx_md_prep(vha);
|
||||
}
|
||||
ha->fw_dump_reading = 0;
|
||||
ha->fw_dumped = 0;
|
||||
break;
|
||||
@ -75,7 +85,26 @@ qla2x00_sysfs_write_fw_dump(struct file *filp, struct kobject *kobj,
|
||||
qla2x00_alloc_fw_dump(vha);
|
||||
break;
|
||||
case 3:
|
||||
qla2x00_system_error(vha);
|
||||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_set_reset_owner(vha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
} else
|
||||
qla2x00_system_error(vha);
|
||||
break;
|
||||
case 4:
|
||||
if (IS_QLA82XX(ha)) {
|
||||
if (ha->md_tmplt_hdr)
|
||||
ql_dbg(ql_dbg_user, vha, 0x705b,
|
||||
"MiniDump supported with this firmware.\n");
|
||||
else
|
||||
ql_dbg(ql_dbg_user, vha, 0x709d,
|
||||
"MiniDump not supported with this firmware.\n");
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
if (IS_QLA82XX(ha))
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
break;
|
||||
}
|
||||
return (count);
|
||||
@ -546,6 +575,11 @@ qla2x00_sysfs_write_reset(struct file *filp, struct kobject *kobj,
|
||||
|
||||
scsi_block_requests(vha->host);
|
||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||
if (IS_QLA82XX(ha)) {
|
||||
qla82xx_idc_lock(ha);
|
||||
qla82xx_set_reset_owner(vha);
|
||||
qla82xx_idc_unlock(ha);
|
||||
}
|
||||
qla2xxx_wake_dpc(vha);
|
||||
qla2x00_wait_for_chip_reset(vha);
|
||||
scsi_unblock_requests(vha->host);
|
||||
|
@ -403,7 +403,7 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
|
||||
return ptr + sizeof(struct qla2xxx_mq_chain);
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
qla2xxx_dump_post_process(scsi_qla_host_t *vha, int rval)
|
||||
{
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
|
@ -2438,7 +2438,8 @@ struct qla_hw_data {
|
||||
uint32_t quiesce_owner:1;
|
||||
uint32_t thermal_supported:1;
|
||||
uint32_t isp82xx_reset_hdlr_active:1;
|
||||
/* 26 bits */
|
||||
uint32_t isp82xx_reset_owner:1;
|
||||
/* 28 bits */
|
||||
} flags;
|
||||
|
||||
/* This spinlock is used to protect "io transactions", you must
|
||||
@ -2822,6 +2823,12 @@ struct qla_hw_data {
|
||||
|
||||
uint8_t fw_type;
|
||||
__le32 file_prd_off; /* File firmware product offset */
|
||||
|
||||
uint32_t md_template_size;
|
||||
void *md_tmplt_hdr;
|
||||
dma_addr_t md_tmplt_hdr_dma;
|
||||
void *md_dump;
|
||||
uint32_t md_dump_size;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -104,6 +104,8 @@ extern int ql2xenablehba_err_chk;
|
||||
extern int ql2xtargetreset;
|
||||
extern int ql2xdontresethba;
|
||||
extern unsigned int ql2xmaxlun;
|
||||
extern int ql2xmdcapmask;
|
||||
extern int ql2xmdenable;
|
||||
|
||||
extern int qla2x00_loop_reset(scsi_qla_host_t *);
|
||||
extern void qla2x00_abort_all_cmds(scsi_qla_host_t *, int);
|
||||
@ -442,6 +444,7 @@ 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);
|
||||
extern void qla2xxx_dump_post_process(scsi_qla_host_t *, int);
|
||||
|
||||
/*
|
||||
* Global Function Prototypes in qla_gs.c source file.
|
||||
@ -570,6 +573,7 @@ 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_chip_reset_cleanup(scsi_qla_host_t *);
|
||||
extern char *qdev_state(uint32_t);
|
||||
|
||||
/* BSG related functions */
|
||||
extern int qla24xx_bsg_request(struct fc_bsg_job *);
|
||||
@ -579,4 +583,14 @@ extern int qla2x00_issue_iocb_timeout(scsi_qla_host_t *, void *,
|
||||
dma_addr_t, size_t, uint32_t);
|
||||
extern int qla2x00_get_idma_speed(scsi_qla_host_t *, uint16_t,
|
||||
uint16_t *, uint16_t *);
|
||||
|
||||
/* Minidump related functions */
|
||||
extern int qla82xx_md_get_template_size(scsi_qla_host_t *);
|
||||
extern int qla82xx_md_get_template(scsi_qla_host_t *);
|
||||
extern int qla82xx_md_alloc(scsi_qla_host_t *);
|
||||
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 *);
|
||||
|
||||
#endif /* _QLA_GBL_H */
|
||||
|
@ -1503,10 +1503,8 @@ enable_82xx_npiv:
|
||||
&ha->fw_xcb_count, NULL, NULL,
|
||||
&ha->max_npiv_vports, NULL);
|
||||
|
||||
if (!fw_major_version && ql2xallocfwdump) {
|
||||
if (!IS_QLA82XX(ha))
|
||||
qla2x00_alloc_fw_dump(vha);
|
||||
}
|
||||
if (!fw_major_version && ql2xallocfwdump)
|
||||
qla2x00_alloc_fw_dump(vha);
|
||||
}
|
||||
} else {
|
||||
ql_log(ql_log_fatal, vha, 0x00cd,
|
||||
@ -1924,7 +1922,7 @@ qla2x00_fw_ready(scsi_qla_host_t *vha)
|
||||
rval = qla84xx_init_chip(vha);
|
||||
if (rval != QLA_SUCCESS) {
|
||||
ql_log(ql_log_warn,
|
||||
vha, 0x8043,
|
||||
vha, 0x8026,
|
||||
"Init chip failed.\n");
|
||||
break;
|
||||
}
|
||||
@ -1933,7 +1931,7 @@ qla2x00_fw_ready(scsi_qla_host_t *vha)
|
||||
cs84xx_time = jiffies - cs84xx_time;
|
||||
wtime += cs84xx_time;
|
||||
mtime += cs84xx_time;
|
||||
ql_dbg(ql_dbg_taskm, vha, 0x8042,
|
||||
ql_dbg(ql_dbg_taskm, vha, 0x8025,
|
||||
"Increasing wait time by %ld. "
|
||||
"New time %ld.\n", cs84xx_time,
|
||||
wtime);
|
||||
|
@ -4186,3 +4186,92 @@ qla82xx_mbx_intr_disable(scsi_qla_host_t *vha)
|
||||
|
||||
return rval;
|
||||
}
|
||||
|
||||
int
|
||||
qla82xx_md_get_template_size(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;
|
||||
|
||||
ql_dbg(ql_dbg_mbx, vha, 0x111f, "Entered %s.\n", __func__);
|
||||
|
||||
memset(mcp->mb, 0 , sizeof(mcp->mb));
|
||||
mcp->mb[0] = LSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
|
||||
mcp->mb[1] = MSW(MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE);
|
||||
mcp->mb[2] = LSW(RQST_TMPLT_SIZE);
|
||||
mcp->mb[3] = MSW(RQST_TMPLT_SIZE);
|
||||
|
||||
mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
|
||||
mcp->in_mb = MBX_14|MBX_13|MBX_12|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->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD;
|
||||
mcp->tov = MBX_TOV_SECONDS;
|
||||
rval = qla2x00_mailbox_command(vha, mcp);
|
||||
|
||||
/* Always copy back return mailbox values. */
|
||||
if (rval != QLA_SUCCESS) {
|
||||
ql_dbg(ql_dbg_mbx, vha, 0x1120,
|
||||
"mailbox command FAILED=0x%x, subcode=%x.\n",
|
||||
(mcp->mb[1] << 16) | mcp->mb[0],
|
||||
(mcp->mb[3] << 16) | mcp->mb[2]);
|
||||
} else {
|
||||
ql_dbg(ql_dbg_mbx, vha, 0x1121, "Done %s.\n", __func__);
|
||||
ha->md_template_size = ((mcp->mb[3] << 16) | mcp->mb[2]);
|
||||
if (!ha->md_template_size) {
|
||||
ql_dbg(ql_dbg_mbx, vha, 0x1122,
|
||||
"Null template size obtained.\n");
|
||||
rval = QLA_FUNCTION_FAILED;
|
||||
}
|
||||
}
|
||||
return rval;
|
||||
}
|
||||
|
||||
int
|
||||
qla82xx_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;
|
||||
|
||||
ql_dbg(ql_dbg_mbx, vha, 0x1123, "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, 0x1124,
|
||||
"Unable to allocate memory for Minidump template.\n");
|
||||
return rval;
|
||||
}
|
||||
|
||||
memset(mcp->mb, 0 , sizeof(mcp->mb));
|
||||
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));
|
||||
mcp->mb[5] = MSW(LSD(ha->md_tmplt_hdr_dma));
|
||||
mcp->mb[6] = LSW(MSD(ha->md_tmplt_hdr_dma));
|
||||
mcp->mb[7] = MSW(MSD(ha->md_tmplt_hdr_dma));
|
||||
mcp->mb[8] = LSW(ha->md_template_size);
|
||||
mcp->mb[9] = MSW(ha->md_template_size);
|
||||
|
||||
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, 0x1125,
|
||||
"mailbox command FAILED=0x%x, subcode=%x.\n",
|
||||
((mcp->mb[1] << 16) | mcp->mb[0]),
|
||||
((mcp->mb[3] << 16) | mcp->mb[2]));
|
||||
} else
|
||||
ql_dbg(ql_dbg_mbx, vha, 0x1126, "Done %s.\n", __func__);
|
||||
return rval;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -484,8 +484,6 @@
|
||||
#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
|
||||
@ -922,4 +920,256 @@ struct ct6_dsd {
|
||||
#define M25P_INSTR_DP 0xb9
|
||||
#define M25P_INSTR_RES 0xab
|
||||
|
||||
/* Minidump related */
|
||||
|
||||
/*
|
||||
* Version of the template
|
||||
* 4 Bytes
|
||||
* X.Major.Minor.RELEASE
|
||||
*/
|
||||
#define QLA82XX_MINIDUMP_VERSION 0x10101
|
||||
|
||||
/*
|
||||
* Entry Type Defines
|
||||
*/
|
||||
#define QLA82XX_RDNOP 0
|
||||
#define QLA82XX_RDCRB 1
|
||||
#define QLA82XX_RDMUX 2
|
||||
#define QLA82XX_QUEUE 3
|
||||
#define QLA82XX_BOARD 4
|
||||
#define QLA82XX_RDSRE 5
|
||||
#define QLA82XX_RDOCM 6
|
||||
#define QLA82XX_CACHE 10
|
||||
#define QLA82XX_L1DAT 11
|
||||
#define QLA82XX_L1INS 12
|
||||
#define QLA82XX_L2DTG 21
|
||||
#define QLA82XX_L2ITG 22
|
||||
#define QLA82XX_L2DAT 23
|
||||
#define QLA82XX_L2INS 24
|
||||
#define QLA82XX_RDROM 71
|
||||
#define QLA82XX_RDMEM 72
|
||||
#define QLA82XX_CNTRL 98
|
||||
#define QLA82XX_TLHDR 99
|
||||
#define QLA82XX_RDEND 255
|
||||
|
||||
/*
|
||||
* Opcodes for Control Entries.
|
||||
* These Flags are bit fields.
|
||||
*/
|
||||
#define QLA82XX_DBG_OPCODE_WR 0x01
|
||||
#define QLA82XX_DBG_OPCODE_RW 0x02
|
||||
#define QLA82XX_DBG_OPCODE_AND 0x04
|
||||
#define QLA82XX_DBG_OPCODE_OR 0x08
|
||||
#define QLA82XX_DBG_OPCODE_POLL 0x10
|
||||
#define QLA82XX_DBG_OPCODE_RDSTATE 0x20
|
||||
#define QLA82XX_DBG_OPCODE_WRSTATE 0x40
|
||||
#define QLA82XX_DBG_OPCODE_MDSTATE 0x80
|
||||
|
||||
/*
|
||||
* Template Header and Entry Header definitions start here.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Template Header
|
||||
* Parts of the template header can be modified by the driver.
|
||||
* These include the saved_state_array, capture_debug_level, driver_timestamp
|
||||
*/
|
||||
|
||||
#define QLA82XX_DBG_STATE_ARRAY_LEN 16
|
||||
#define QLA82XX_DBG_CAP_SIZE_ARRAY_LEN 8
|
||||
#define QLA82XX_DBG_RSVD_ARRAY_LEN 8
|
||||
|
||||
/*
|
||||
* Driver Flags
|
||||
*/
|
||||
#define QLA82XX_DBG_SKIPPED_FLAG 0x80 /* driver skipped this entry */
|
||||
#define QLA82XX_DEFAULT_CAP_MASK 0xFF /* default capture mask */
|
||||
|
||||
struct qla82xx_md_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 template_checksum;
|
||||
|
||||
uint32_t driver_capture_mask;
|
||||
uint32_t driver_info[3];
|
||||
|
||||
uint32_t saved_state_array[QLA82XX_DBG_STATE_ARRAY_LEN];
|
||||
uint32_t capture_size_array[QLA82XX_DBG_CAP_SIZE_ARRAY_LEN];
|
||||
|
||||
/* markers_array used to capture some special locations on board */
|
||||
uint32_t markers_array[QLA82XX_DBG_RSVD_ARRAY_LEN];
|
||||
uint32_t num_of_free_entries; /* For internal use */
|
||||
uint32_t free_entry_offset; /* For internal use */
|
||||
uint32_t total_table_size; /* For internal use */
|
||||
uint32_t bkup_table_offset; /* For internal use */
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* Entry Header: Common to All Entry Types
|
||||
*/
|
||||
|
||||
/*
|
||||
* Driver Code is for driver to write some info about the entry.
|
||||
* Currently not used.
|
||||
*/
|
||||
typedef struct qla82xx_md_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 qla82xx_md_entry_hdr_t;
|
||||
|
||||
/*
|
||||
* Read CRB entry header
|
||||
*/
|
||||
struct qla82xx_md_entry_crb {
|
||||
qla82xx_md_entry_hdr_t 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;
|
||||
|
||||
/*
|
||||
* Cache entry header
|
||||
*/
|
||||
struct qla82xx_md_entry_cache {
|
||||
qla82xx_md_entry_hdr_t 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 qla82xx_md_entry_rdocm {
|
||||
qla82xx_md_entry_hdr_t 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;
|
||||
uint32_t read_addr_cntrl;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* Read Memory
|
||||
*/
|
||||
struct qla82xx_md_entry_rdmem {
|
||||
qla82xx_md_entry_hdr_t h;
|
||||
uint32_t rsvd[6];
|
||||
uint32_t read_addr;
|
||||
uint32_t read_data_size;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* Read ROM
|
||||
*/
|
||||
struct qla82xx_md_entry_rdrom {
|
||||
qla82xx_md_entry_hdr_t h;
|
||||
uint32_t rsvd[6];
|
||||
uint32_t read_addr;
|
||||
uint32_t read_data_size;
|
||||
} __packed;
|
||||
|
||||
struct qla82xx_md_entry_mux {
|
||||
qla82xx_md_entry_hdr_t 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;
|
||||
|
||||
struct qla82xx_md_entry_queue {
|
||||
qla82xx_md_entry_hdr_t 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;
|
||||
|
||||
#define MBC_DIAGNOSTIC_MINIDUMP_TEMPLATE 0x129
|
||||
#define RQST_TMPLT_SIZE 0x0
|
||||
#define RQST_TMPLT 0x1
|
||||
#define MD_DIRECT_ROM_WINDOW 0x42110030
|
||||
#define MD_DIRECT_ROM_READ_BASE 0x42150000
|
||||
#define MD_MIU_TEST_AGT_CTRL 0x41000090
|
||||
#define MD_MIU_TEST_AGT_ADDR_LO 0x41000094
|
||||
#define MD_MIU_TEST_AGT_ADDR_HI 0x41000098
|
||||
|
||||
static const int MD_MIU_TEST_AGT_RDDATA[] = { 0x410000A8, 0x410000AC,
|
||||
0x410000B8, 0x410000BC };
|
||||
#endif
|
||||
|
@ -160,9 +160,9 @@ MODULE_PARM_DESC(ql2xetsenable,
|
||||
int ql2xdbwr = 1;
|
||||
module_param(ql2xdbwr, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(ql2xdbwr,
|
||||
"Option to specify scheme for request queue posting.\n"
|
||||
" 0 -- Regular doorbell.\n"
|
||||
" 1 -- CAMRAM doorbell (faster).\n");
|
||||
"Option to specify scheme for request queue posting.\n"
|
||||
" 0 -- Regular doorbell.\n"
|
||||
" 1 -- CAMRAM doorbell (faster).\n");
|
||||
|
||||
int ql2xtargetreset = 1;
|
||||
module_param(ql2xtargetreset, int, S_IRUGO);
|
||||
@ -185,9 +185,9 @@ MODULE_PARM_DESC(ql2xasynctmfenable,
|
||||
int ql2xdontresethba;
|
||||
module_param(ql2xdontresethba, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(ql2xdontresethba,
|
||||
"Option to specify reset behaviour.\n"
|
||||
" 0 (Default) -- Reset on failure.\n"
|
||||
" 1 -- Do not reset on failure.\n");
|
||||
"Option to specify reset behaviour.\n"
|
||||
" 0 (Default) -- Reset on failure.\n"
|
||||
" 1 -- Do not reset on failure.\n");
|
||||
|
||||
uint ql2xmaxlun = MAX_LUNS;
|
||||
module_param(ql2xmaxlun, uint, S_IRUGO);
|
||||
@ -195,6 +195,19 @@ MODULE_PARM_DESC(ql2xmaxlun,
|
||||
"Defines the maximum LU number to register with the SCSI "
|
||||
"midlayer. Default is 65535.");
|
||||
|
||||
int ql2xmdcapmask = 0x1F;
|
||||
module_param(ql2xmdcapmask, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(ql2xmdcapmask,
|
||||
"Set the Minidump driver capture mask level. "
|
||||
"Default is 0x7F - Can be set to 0x3, 0x7, 0xF, 0x1F, 0x7F.");
|
||||
|
||||
int ql2xmdenable;
|
||||
module_param(ql2xmdenable, int, S_IRUGO);
|
||||
MODULE_PARM_DESC(ql2xmdenable,
|
||||
"Enable/disable MiniDump. "
|
||||
"0 (Default) - MiniDump disabled. "
|
||||
"1 - MiniDump enabled.");
|
||||
|
||||
/*
|
||||
* SCSI host template entry points
|
||||
*/
|
||||
@ -2669,6 +2682,8 @@ qla2x00_free_device(scsi_qla_host_t *vha)
|
||||
|
||||
qla2x00_mem_free(ha);
|
||||
|
||||
qla82xx_md_free(vha);
|
||||
|
||||
qla2x00_free_queues(ha);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user