diff options
author | Chad Dupuis <chad.dupuis@qlogic.com> | 2014-02-26 04:15:12 -0500 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2014-03-15 13:18:51 -0400 |
commit | a1b23c5a1d17d27d4d685dba03dc3c437693b5d0 (patch) | |
tree | a61ea108b7f7361a0c7f91230e2be189e644bfdb /drivers | |
parent | fbe9c54b1da7c1f5795bc516676544b2ced58535 (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.c | 35 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 1 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_nx.c | 17 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_nx2.c | 16 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 4 |
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 | ||
1506 | static ssize_t | ||
1507 | qla2x00_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 | |||
1519 | static ssize_t | ||
1520 | qla2x00_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 | |||
1506 | static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); | 1537 | static DEVICE_ATTR(driver_version, S_IRUGO, qla2x00_drvr_version_show, NULL); |
1507 | static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); | 1538 | static DEVICE_ATTR(fw_version, S_IRUGO, qla2x00_fw_version_show, NULL); |
1508 | static DEVICE_ATTR(serial_num, S_IRUGO, qla2x00_serial_num_show, NULL); | 1539 | static 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); | |||
1544 | static DEVICE_ATTR(diag_requests, S_IRUGO, qla2x00_diag_requests_show, NULL); | 1575 | static DEVICE_ATTR(diag_requests, S_IRUGO, qla2x00_diag_requests_show, NULL); |
1545 | static DEVICE_ATTR(diag_megabytes, S_IRUGO, qla2x00_diag_megabytes_show, NULL); | 1576 | static DEVICE_ATTR(diag_megabytes, S_IRUGO, qla2x00_diag_megabytes_show, NULL); |
1546 | static DEVICE_ATTR(fw_dump_size, S_IRUGO, qla2x00_fw_dump_size_show, NULL); | 1577 | static DEVICE_ATTR(fw_dump_size, S_IRUGO, qla2x00_fw_dump_size_show, NULL); |
1578 | static 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 | ||
1548 | struct device_attribute *qla2x00_host_attrs[] = { | 1582 | struct 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); | |||
511 | extern void qla24xx_fw_dump(scsi_qla_host_t *, int); | 511 | extern void qla24xx_fw_dump(scsi_qla_host_t *, int); |
512 | extern void qla25xx_fw_dump(scsi_qla_host_t *, int); | 512 | extern void qla25xx_fw_dump(scsi_qla_host_t *, int); |
513 | extern void qla81xx_fw_dump(scsi_qla_host_t *, int); | 513 | extern void qla81xx_fw_dump(scsi_qla_host_t *, int); |
514 | extern void qla82xx_fw_dump(scsi_qla_host_t *, int); | ||
515 | extern void qla8044_fw_dump(scsi_qla_host_t *, int); | ||
514 | 516 | ||
515 | extern void qla27xx_fwdump(scsi_qla_host_t *, int); | 517 | extern void qla27xx_fwdump(scsi_qla_host_t *, int); |
516 | extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *); | 518 | extern 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 | |||
4506 | void | ||
4507 | qla82xx_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 | ||
3716 | void | ||
3717 | qla8044_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, |