aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx
diff options
context:
space:
mode:
authorMadhuranath Iyengar <madhuranath.iyengar@qlogic.com>2010-07-23 06:28:26 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-07-28 10:06:09 -0400
commit0f2d962f4d120e93b4d74d13c2e8038e9e4358b9 (patch)
treeee2a02f7ba2412b50f9fc6eb4779a4e2eeacce0e /drivers/scsi/qla2xxx
parente8c72ba51a159f5d1cb195d3fb47262c782939d9 (diff)
[SCSI] qla2xxx: Check for golden firmware and show version if available
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r--drivers/scsi/qla2xxx/qla_attr.c18
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h2
-rw-r--r--drivers/scsi/qla2xxx/qla_sup.c22
3 files changed, 42 insertions, 0 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index fd6f7b100547..7ebf365043cf 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -1187,6 +1187,21 @@ qla2x00_optrom_fw_version_show(struct device *dev,
1187} 1187}
1188 1188
1189static ssize_t 1189static ssize_t
1190qla2x00_optrom_gold_fw_version_show(struct device *dev,
1191 struct device_attribute *attr, char *buf)
1192{
1193 scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
1194 struct qla_hw_data *ha = vha->hw;
1195
1196 if (!IS_QLA81XX(ha))
1197 return snprintf(buf, PAGE_SIZE, "\n");
1198
1199 return snprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
1200 ha->gold_fw_version[0], ha->gold_fw_version[1],
1201 ha->gold_fw_version[2], ha->gold_fw_version[3]);
1202}
1203
1204static ssize_t
1190qla2x00_total_isp_aborts_show(struct device *dev, 1205qla2x00_total_isp_aborts_show(struct device *dev,
1191 struct device_attribute *attr, char *buf) 1206 struct device_attribute *attr, char *buf)
1192{ 1207{
@@ -1336,6 +1351,8 @@ static DEVICE_ATTR(optrom_fcode_version, S_IRUGO,
1336 qla2x00_optrom_fcode_version_show, NULL); 1351 qla2x00_optrom_fcode_version_show, NULL);
1337static DEVICE_ATTR(optrom_fw_version, S_IRUGO, qla2x00_optrom_fw_version_show, 1352static DEVICE_ATTR(optrom_fw_version, S_IRUGO, qla2x00_optrom_fw_version_show,
1338 NULL); 1353 NULL);
1354static DEVICE_ATTR(optrom_gold_fw_version, S_IRUGO,
1355 qla2x00_optrom_gold_fw_version_show, NULL);
1339static DEVICE_ATTR(84xx_fw_version, S_IRUGO, qla24xx_84xx_fw_version_show, 1356static DEVICE_ATTR(84xx_fw_version, S_IRUGO, qla24xx_84xx_fw_version_show,
1340 NULL); 1357 NULL);
1341static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show, 1358static DEVICE_ATTR(total_isp_aborts, S_IRUGO, qla2x00_total_isp_aborts_show,
@@ -1376,6 +1393,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
1376 &dev_attr_vn_port_mac_address, 1393 &dev_attr_vn_port_mac_address,
1377 &dev_attr_fabric_param, 1394 &dev_attr_fabric_param,
1378 &dev_attr_fw_state, 1395 &dev_attr_fw_state,
1396 &dev_attr_optrom_gold_fw_version,
1379 NULL, 1397 NULL,
1380}; 1398};
1381 1399
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 02c7480c99c3..7e11ccf0fe81 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -2714,6 +2714,8 @@ struct qla_hw_data {
2714 uint8_t fcode_revision[16]; 2714 uint8_t fcode_revision[16];
2715 uint32_t fw_revision[4]; 2715 uint32_t fw_revision[4];
2716 2716
2717 uint32_t gold_fw_version[4];
2718
2717 /* Offsets for flash/nvram access (set to ~0 if not used). */ 2719 /* Offsets for flash/nvram access (set to ~0 if not used). */
2718 uint32_t flash_conf_off; 2720 uint32_t flash_conf_off;
2719 uint32_t flash_data_off; 2721 uint32_t flash_data_off;
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c
index 3c5115f60739..df288dc829e0 100644
--- a/drivers/scsi/qla2xxx/qla_sup.c
+++ b/drivers/scsi/qla2xxx/qla_sup.c
@@ -2759,6 +2759,28 @@ qla24xx_get_flash_version(scsi_qla_host_t *vha, void *mbuf)
2759 ha->fw_revision[3] = dcode[3]; 2759 ha->fw_revision[3] = dcode[3];
2760 } 2760 }
2761 2761
2762 /* Check for golden firmware and get version if available */
2763 if (!IS_QLA81XX(ha)) {
2764 /* Golden firmware is not present in non 81XX adapters */
2765 return ret;
2766 }
2767
2768 memset(ha->gold_fw_version, 0, sizeof(ha->gold_fw_version));
2769 dcode = mbuf;
2770 ha->isp_ops->read_optrom(vha, (uint8_t *)dcode,
2771 ha->flt_region_gold_fw << 2, 32);
2772
2773 if (dcode[4] == 0xFFFFFFFF && dcode[5] == 0xFFFFFFFF &&
2774 dcode[6] == 0xFFFFFFFF && dcode[7] == 0xFFFFFFFF) {
2775 DEBUG2(qla_printk(KERN_INFO, ha,
2776 "%s(%ld): Unrecognized golden fw at 0x%x.\n",
2777 __func__, vha->host_no, ha->flt_region_gold_fw * 4));
2778 return ret;
2779 }
2780
2781 for (i = 4; i < 8; i++)
2782 ha->gold_fw_version[i-4] = be32_to_cpu(dcode[i]);
2783
2762 return ret; 2784 return ret;
2763} 2785}
2764 2786