scsi: pm80xx: ILA and inactive firmware version through sysfs
authorViswas G <Viswas.G@microsemi.com>
Wed, 18 Oct 2017 06:09:08 +0000 (11:39 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 19 Oct 2017 00:55:41 +0000 (20:55 -0400)
Added support to read ILA version and inactive firmware version from MPI
configuration table and export through sysfs.

Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
Signed-off-by: Viswas G <Viswas.G@microsemi.com>
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/pm8001/pm8001_ctl.c
drivers/scsi/pm8001/pm8001_sas.h
drivers/scsi/pm8001/pm80xx_hwi.c
drivers/scsi/pm8001/pm80xx_hwi.h

index be8269c..596f3ff 100644 (file)
@@ -98,6 +98,58 @@ static ssize_t pm8001_ctl_fw_version_show(struct device *cdev,
        }
 }
 static DEVICE_ATTR(fw_version, S_IRUGO, pm8001_ctl_fw_version_show, NULL);
+
+/**
+ * pm8001_ctl_ila_version_show - ila version
+ * @cdev: pointer to embedded class device
+ * @buf: the buffer returned
+ *
+ * A sysfs 'read-only' shost attribute.
+ */
+static ssize_t pm8001_ctl_ila_version_show(struct device *cdev,
+       struct device_attribute *attr, char *buf)
+{
+       struct Scsi_Host *shost = class_to_shost(cdev);
+       struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
+       struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
+
+       if (pm8001_ha->chip_id != chip_8001) {
+               return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x.%02x\n",
+               (u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version >> 24),
+               (u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version >> 16),
+               (u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version >> 8),
+               (u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version));
+       }
+       return 0;
+}
+static DEVICE_ATTR(ila_version, 0444, pm8001_ctl_ila_version_show, NULL);
+
+/**
+ * pm8001_ctl_inactive_fw_version_show - Inacative firmware version number
+ * @cdev: pointer to embedded class device
+ * @buf: the buffer returned
+ *
+ * A sysfs 'read-only' shost attribute.
+ */
+static ssize_t pm8001_ctl_inactive_fw_version_show(struct device *cdev,
+       struct device_attribute *attr, char *buf)
+{
+       struct Scsi_Host *shost = class_to_shost(cdev);
+       struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
+       struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
+
+       if (pm8001_ha->chip_id != chip_8001) {
+               return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x.%02x\n",
+               (u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version >> 24),
+               (u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version >> 16),
+               (u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version >> 8),
+               (u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version));
+       }
+       return 0;
+}
+static
+DEVICE_ATTR(inc_fw_ver, 0444, pm8001_ctl_inactive_fw_version_show, NULL);
+
 /**
  * pm8001_ctl_max_out_io_show - max outstanding io supported
  * @cdev: pointer to embedded class device
@@ -748,6 +800,8 @@ struct device_attribute *pm8001_host_attrs[] = {
        &dev_attr_bios_version,
        &dev_attr_ib_log,
        &dev_attr_ob_log,
+       &dev_attr_ila_version,
+       &dev_attr_inc_fw_ver,
        NULL,
 };
 
index e81a8fa..c75de41 100644 (file)
@@ -404,6 +404,8 @@ union main_cfg_table {
        u32                     port_recovery_timer;
        u32                     interrupt_reassertion_delay;
        u32                     fatal_n_non_fatal_dump;         /* 0x28 */
+       u32                     ila_version;
+       u32                     inc_fw_version;
        } pm80xx_tbl;
 };
 
index eb4fee6..8fb5ddf 100644 (file)
@@ -312,6 +312,11 @@ static void read_main_config_table(struct pm8001_hba_info *pm8001_ha)
        /* read port recover and reset timeout */
        pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer =
                pm8001_mr32(address, MAIN_PORT_RECOVERY_TIMER);
+       /* read ILA and inactive firmware version */
+       pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version =
+               pm8001_mr32(address, MAIN_MPI_ILA_RELEASE_TYPE);
+       pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version =
+               pm8001_mr32(address, MAIN_MPI_INACTIVE_FW_VERSION);
 }
 
 /**
index 82b8cf5..e36c517 100644 (file)
@@ -1445,6 +1445,8 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t;
 #define MAIN_SAS_PHY_ATTR_TABLE_OFFSET 0x90 /* DWORD 0x24 */
 #define MAIN_PORT_RECOVERY_TIMER       0x94 /* DWORD 0x25 */
 #define MAIN_INT_REASSERTION_DELAY     0x98 /* DWORD 0x26 */
+#define MAIN_MPI_ILA_RELEASE_TYPE      0xA4 /* DWORD 0x29 */
+#define MAIN_MPI_INACTIVE_FW_VERSION   0XB0 /* DWORD 0x2C */
 
 /* Gereral Status Table offset - byte offset */
 #define GST_GSTLEN_MPIS_OFFSET         0x00