scsi: pm80xx: ILA and inactive firmware version through sysfs
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>
This commit is contained in:
Родитель
5990fd57eb
Коммит
24fff017e1
|
@ -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);
|
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
|
* pm8001_ctl_max_out_io_show - max outstanding io supported
|
||||||
* @cdev: pointer to embedded class device
|
* @cdev: pointer to embedded class device
|
||||||
|
@ -748,6 +800,8 @@ struct device_attribute *pm8001_host_attrs[] = {
|
||||||
&dev_attr_bios_version,
|
&dev_attr_bios_version,
|
||||||
&dev_attr_ib_log,
|
&dev_attr_ib_log,
|
||||||
&dev_attr_ob_log,
|
&dev_attr_ob_log,
|
||||||
|
&dev_attr_ila_version,
|
||||||
|
&dev_attr_inc_fw_ver,
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -404,6 +404,8 @@ union main_cfg_table {
|
||||||
u32 port_recovery_timer;
|
u32 port_recovery_timer;
|
||||||
u32 interrupt_reassertion_delay;
|
u32 interrupt_reassertion_delay;
|
||||||
u32 fatal_n_non_fatal_dump; /* 0x28 */
|
u32 fatal_n_non_fatal_dump; /* 0x28 */
|
||||||
|
u32 ila_version;
|
||||||
|
u32 inc_fw_version;
|
||||||
} pm80xx_tbl;
|
} pm80xx_tbl;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -312,6 +312,11 @@ static void read_main_config_table(struct pm8001_hba_info *pm8001_ha)
|
||||||
/* read port recover and reset timeout */
|
/* read port recover and reset timeout */
|
||||||
pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer =
|
pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer =
|
||||||
pm8001_mr32(address, MAIN_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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1445,6 +1445,8 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t;
|
||||||
#define MAIN_SAS_PHY_ATTR_TABLE_OFFSET 0x90 /* DWORD 0x24 */
|
#define MAIN_SAS_PHY_ATTR_TABLE_OFFSET 0x90 /* DWORD 0x24 */
|
||||||
#define MAIN_PORT_RECOVERY_TIMER 0x94 /* DWORD 0x25 */
|
#define MAIN_PORT_RECOVERY_TIMER 0x94 /* DWORD 0x25 */
|
||||||
#define MAIN_INT_REASSERTION_DELAY 0x98 /* DWORD 0x26 */
|
#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 */
|
/* Gereral Status Table offset - byte offset */
|
||||||
#define GST_GSTLEN_MPIS_OFFSET 0x00
|
#define GST_GSTLEN_MPIS_OFFSET 0x00
|
||||||
|
|
Загрузка…
Ссылка в новой задаче