aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorChad Dupuis <chad.dupuis@qlogic.com>2014-02-26 04:15:12 -0500
committerJames Bottomley <JBottomley@Parallels.com>2014-03-15 13:18:51 -0400
commita1b23c5a1d17d27d4d685dba03dc3c437693b5d0 (patch)
treea61ea108b7f7361a0c7f91230e2be189e644bfdb /drivers
parentfbe9c54b1da7c1f5795bc516676544b2ced58535 (diff)
[SCSI] qla2xxx: Read capture firmware dump on mailbox timeout for ISP8044 and ISP82XX.
Allow for the capture of a firmware dump but have a sysfs node (allow_cna_fw_dump) to allow the feature to be enabled/disabled dynamically. The default is off. Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com> Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/qla2xxx/qla_attr.c35
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h1
-rw-r--r--drivers/scsi/qla2xxx/qla_gbl.h2
-rw-r--r--drivers/scsi/qla2xxx/qla_nx.c17
-rw-r--r--drivers/scsi/qla2xxx/qla_nx2.c16
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c4
6 files changed, 73 insertions, 2 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index f2d42b961e92..aa81829aeb3a 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1503,6 +1503,37 @@ qla2x00_fw_dump_size_show(struct device *dev, struct device_attribute *attr,
1503 return scnprintf(buf, PAGE_SIZE, "%d\n", size); 1503 return scnprintf(buf, PAGE_SIZE, "%d\n", size);
1504} 1504}
1505 1505
1506static ssize_t
1507qla2x00_allow_cna_fw_dump_show(struct device *dev,
1508 struct device_attribute *attr, char *buf)
1509{
1510 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1511
1512 if (!IS_P3P_TYPE(vha->hw))
1513 return scnprintf(buf, PAGE_SIZE, "\n");
1514 else
1515 return scnprintf(buf, PAGE_SIZE, "%s\n",
1516 vha->hw->allow_cna_fw_dump ? "true" : "false");
1517}
1518
1519static ssize_t
1520qla2x00_allow_cna_fw_dump_store(struct device *dev,
1521 struct device_attribute *attr, const char *buf, size_t count)
1522{
1523 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1524 int val = 0;
1525
1526 if (!IS_P3P_TYPE(vha->hw))
1527 return -EINVAL;
1528
1529 if (sscanf(buf, "%d", &val) != 1)
1530 return -EINVAL;
1531
1532 vha->hw->allow_cna_fw_dump = val != 0;
1533
1534 return strlen(buf);
1535}
1536
1506static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); 1537static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL);
1507static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); 1538static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL);
1508static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); 1539static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL);
@@ -1544,6 +1575,9 @@ static DEVICE_ATTR(thermal_temp, S_IRUGO, qla2x00_thermal_temp_show, NULL);
1544static DEVICE_ATTR(diag_requests, S_IRUGO, qla2x00_diag_requests_show, NULL); 1575static DEVICE_ATTR(diag_requests, S_IRUGO, qla2x00_diag_requests_show, NULL);
1545static DEVICE_ATTR(diag_megabytes, S_IRUGO, qla2x00_diag_megabytes_show, NULL); 1576static DEVICE_ATTR(diag_megabytes, S_IRUGO, qla2x00_diag_megabytes_show, NULL);
1546static DEVICE_ATTR(fw_dump_size, S_IRUGO, qla2x00_fw_dump_size_show, NULL); 1577static DEVICE_ATTR(fw_dump_size, S_IRUGO, qla2x00_fw_dump_size_show, NULL);
1578static DEVICE_ATTR(allow_cna_fw_dump, S_IRUGO | S_IWUSR,
1579 qla2x00_allow_cna_fw_dump_show,
1580 qla2x00_allow_cna_fw_dump_store);
1547 1581
1548struct device_attribute *qla2x00_host_attrs[] = { 1582struct device_attribute *qla2x00_host_attrs[] = {
1549 &dev_attr_driver_version, 1583 &dev_attr_driver_version,
@@ -1576,6 +1610,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
1576 &dev_attr_diag_requests, 1610 &dev_attr_diag_requests,
1577 &dev_attr_diag_megabytes, 1611 &dev_attr_diag_megabytes,
1578 &dev_attr_fw_dump_size, 1612 &dev_attr_fw_dump_size,
1613 &dev_attr_allow_cna_fw_dump,
1579 NULL, 1614 NULL,
1580}; 1615};
1581 1616
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 400ef02e1610..6a106136716c 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -3301,6 +3301,7 @@ struct qla_hw_data {
3301 struct mr_data_fx00 mr; 3301 struct mr_data_fx00 mr;
3302 3302
3303 struct qlt_hw_data tgt; 3303 struct qlt_hw_data tgt;
3304 int allow_cna_fw_dump;
3304}; 3305};
3305 3306
3306/* 3307/*
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h
index 19a06620b0e5..dcd084a4e5c1 100644
--- a/drivers/scsi/qla2xxx/qla_gbl.h
+++ b/drivers/scsi/qla2xxx/qla_gbl.h
@@ -511,6 +511,8 @@ extern void qla2300_fw_dump(scsi_qla_host_t *, int);
511extern void qla24xx_fw_dump(scsi_qla_host_t *, int); 511extern void qla24xx_fw_dump(scsi_qla_host_t *, int);
512extern void qla25xx_fw_dump(scsi_qla_host_t *, int); 512extern void qla25xx_fw_dump(scsi_qla_host_t *, int);
513extern void qla81xx_fw_dump(scsi_qla_host_t *, int); 513extern void qla81xx_fw_dump(scsi_qla_host_t *, int);
514extern void qla82xx_fw_dump(scsi_qla_host_t *, int);
515extern void qla8044_fw_dump(scsi_qla_host_t *, int);
514 516
515extern void qla27xx_fwdump(scsi_qla_host_t *, int); 517extern void qla27xx_fwdump(scsi_qla_host_t *, int);
516extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *); 518extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c
index 26326f336c59..5511e24b1f11 100644
--- a/drivers/scsi/qla2xxx/qla_nx.c
+++ b/drivers/scsi/qla2xxx/qla_nx.c
@@ -4502,3 +4502,20 @@ exit:
4502 qla82xx_idc_unlock(ha); 4502 qla82xx_idc_unlock(ha);
4503 return rval; 4503 return rval;
4504} 4504}
4505
4506void
4507qla82xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
4508{
4509 struct qla_hw_data *ha = vha->hw;
4510
4511 if (!ha->allow_cna_fw_dump)
4512 return;
4513
4514 scsi_block_requests(vha->host);
4515 ha->flags.isp82xx_no_md_cap = 1;
4516 qla82xx_idc_lock(ha);
4517 qla82xx_set_reset_owner(vha);
4518 qla82xx_idc_unlock(ha);
4519 qla2x00_wait_for_chip_reset(vha);
4520 scsi_unblock_requests(vha->host);
4521}
diff --git a/drivers/scsi/qla2xxx/qla_nx2.c b/drivers/scsi/qla2xxx/qla_nx2.c
index b7ed4784d929..86cf10815db0 100644
--- a/drivers/scsi/qla2xxx/qla_nx2.c
+++ b/drivers/scsi/qla2xxx/qla_nx2.c
@@ -3713,3 +3713,19 @@ exit_isp_reset:
3713 return rval; 3713 return rval;
3714} 3714}
3715 3715
3716void
3717qla8044_fw_dump(scsi_qla_host_t *vha, int hardware_locked)
3718{
3719 struct qla_hw_data *ha = vha->hw;
3720
3721 if (!ha->allow_cna_fw_dump)
3722 return;
3723
3724 scsi_block_requests(vha->host);
3725 ha->flags.isp82xx_no_md_cap = 1;
3726 qla8044_idc_lock(ha);
3727 qla82xx_set_reset_owner(vha);
3728 qla8044_idc_unlock(ha);
3729 qla2x00_wait_for_chip_reset(vha);
3730 scsi_unblock_requests(vha->host);
3731}
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index c0c95c180188..7c36eb2dfae8 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -1975,7 +1975,7 @@ static struct isp_operations qla82xx_isp_ops = {
1975 .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb, 1975 .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb,
1976 .read_nvram = qla24xx_read_nvram_data, 1976 .read_nvram = qla24xx_read_nvram_data,
1977 .write_nvram = qla24xx_write_nvram_data, 1977 .write_nvram = qla24xx_write_nvram_data,
1978 .fw_dump = qla24xx_fw_dump, 1978 .fw_dump = qla82xx_fw_dump,
1979 .beacon_on = qla82xx_beacon_on, 1979 .beacon_on = qla82xx_beacon_on,
1980 .beacon_off = qla82xx_beacon_off, 1980 .beacon_off = qla82xx_beacon_off,
1981 .beacon_blink = NULL, 1981 .beacon_blink = NULL,
@@ -2013,7 +2013,7 @@ static struct isp_operations qla8044_isp_ops = {
2013 .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb, 2013 .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb,
2014 .read_nvram = NULL, 2014 .read_nvram = NULL,
2015 .write_nvram = NULL, 2015 .write_nvram = NULL,
2016 .fw_dump = qla24xx_fw_dump, 2016 .fw_dump = qla8044_fw_dump,
2017 .beacon_on = qla82xx_beacon_on, 2017 .beacon_on = qla82xx_beacon_on,
2018 .beacon_off = qla82xx_beacon_off, 2018 .beacon_off = qla82xx_beacon_off,
2019 .beacon_blink = NULL, 2019 .beacon_blink = NULL,