Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24fff017 authored by Viswas G's avatar Viswas G Committed by Martin K. Petersen
Browse files

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: default avatarDeepak Ukey <deepak.ukey@microsemi.com>
Signed-off-by: default avatarViswas G <Viswas.G@microsemi.com>
Acked-by: default avatarJack Wang <jinpu.wang@profitbricks.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 5990fd57
Loading
Loading
Loading
Loading
+54 −0
Original line number Original line Diff line number Diff line
@@ -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,
};
};
+2 −0
Original line number Original line Diff line number Diff line
@@ -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;
};
};


+5 −0
Original line number Original line Diff line number Diff line
@@ -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);
}
}


/**
/**
+2 −0
Original line number Original line Diff line number Diff line
@@ -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