From: Vishakha Channapattan <vishakhavc@xxxxxxxxxx> A new sysfs variable 'health' is being introduced that tells if the controller is alive by indicating controller ticks. If on subsequent run we see the ticks changing that indicates that controller is not dead. Tested: Using 'health' sysfs variable we can see ticks incrementing mvae14:~# cat /sys/class/scsi_host/host*/health MPI-S= MPI is successfully initialized HMI_ERR=0 MSGUTCNT = 0x00000169 IOPTCNT=0x0000016a IOP1TCNT=0x0000016a MPI-S= MPI is successfully initialized HMI_ERR=0 MSGUTCNT = 0x0000014d IOPTCNT=0x0000014d IOP1TCNT=0x0000014d MPI-S= MPI is successfully initialized HMI_ERR=0 MSGUTCNT = 0x00000149 IOPTCNT=0x00000149 IOP1TCNT=0x00000149 mvae14:~# mvae14:~# mvae14:~# mvae14:~# cat /sys/class/scsi_host/host*/health MPI-S= MPI is successfully initialized HMI_ERR=0 MSGUTCNT = 0x0000016c IOPTCNT=0x0000016c IOP1TCNT=0x0000016c MPI-S= MPI is successfully initialized HMI_ERR=0 MSGUTCNT = 0x0000014f IOPTCNT=0x0000014f IOP1TCNT=0x0000014f MPI-S= MPI is successfully initialized HMI_ERR=0 MSGUTCNT = 0x0000014b IOPTCNT=0x0000014b IOP1TCNT=0x0000014b Signed-off-by: Vishakha Channapattan <vishakhavc@xxxxxxxxxx> Signed-off-by: Viswas G <Viswas.G@xxxxxxxxxxxxx> Signed-off-by: Ruksar Devadi <Ruksar.devadi@xxxxxxxxxxxxx> Signed-off-by: Ashokkumar N <Ashokkumar.N@xxxxxxxxxxxxx> Signed-off-by: Radha Ramachandran <radha@xxxxxxxxxx> Acked-by: Jack Wang <jinpu.wang@xxxxxxxxxxxxxxx> --- drivers/scsi/pm8001/pm8001_ctl.c | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c index 12035baf0997..f46f341132fb 100644 --- a/drivers/scsi/pm8001/pm8001_ctl.c +++ b/drivers/scsi/pm8001/pm8001_ctl.c @@ -41,6 +41,7 @@ #include <linux/slab.h> #include "pm8001_sas.h" #include "pm8001_ctl.h" +#include "pm8001_chips.h" /* scsi host attributes */ @@ -886,6 +887,46 @@ static ssize_t pm8001_show_update_fw(struct device *cdev, static DEVICE_ATTR(update_fw, S_IRUGO|S_IWUSR|S_IWGRP, pm8001_show_update_fw, pm8001_store_update_fw); + +/** + * pm8001_ctl_health_show - controller health check + * @cdev: pointer to embedded class device + * @buf: the buffer returned + * + * A sysfs 'read-only' shost attribute. + */ + +char mpiStateText[][80] = { + "MPI is not initialized", + "MPI is successfully initialized", + "MPI termination is in progress", + "MPI initialization failed with error in [31:16]" +}; + +static ssize_t ctl_health_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; + unsigned int mpiDW0 = 0; + unsigned int raaeCnt = 0; + unsigned int iop0Cnt = 0; + unsigned int iop1Cnt = 0; + int c; + + pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__); + mpiDW0 = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 0); + raaeCnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 12); + iop0Cnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 16); + iop1Cnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 20); + c = sprintf(buf, "MPI-S=%s\t HMI_ERR=%x\nMSGUTCNT=0x%08x IOPTCNT=0x%08x IOP1TCNT=0x%08x\n", + mpiStateText[mpiDW0 & 0x0003], ((mpiDW0 & 0xff00) >> 16), + raaeCnt, iop0Cnt, iop1Cnt); + return c; +} +static DEVICE_ATTR_RO(ctl_health); + struct device_attribute *pm8001_host_attrs[] = { &dev_attr_interface_rev, &dev_attr_controller_fatal_error, @@ -909,6 +950,7 @@ struct device_attribute *pm8001_host_attrs[] = { &dev_attr_ob_log, &dev_attr_ila_version, &dev_attr_inc_fw_ver, + &dev_attr_ctl_health, NULL, }; -- 2.16.3