diff mbox series

[2/2] mpi3mr: Add target device related sysfs attributes

Message ID 20220512140046.19046-3-sreekanth.reddy@broadcom.com (mailing list archive)
State Superseded
Headers show
Series mpi3mr: Add shost & device sysfs attributes | expand

Commit Message

Sreekanth Reddy May 12, 2022, 2 p.m. UTC
Added sysfs attributes for exposing target device details
such as SAS address, firmware device handle and persistent ID
for the controller attached devices and RAID volumes.

Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
---
 drivers/scsi/mpi3mr/mpi3mr.h     |   1 +
 drivers/scsi/mpi3mr/mpi3mr_app.c | 120 +++++++++++++++++++++++++++++++
 drivers/scsi/mpi3mr/mpi3mr_os.c  |   1 +
 3 files changed, 122 insertions(+)

Comments

Himanshu Madhani May 12, 2022, 11:36 p.m. UTC | #1
> On May 12, 2022, at 7:00 AM, Sreekanth Reddy <sreekanth.reddy@broadcom.com> wrote:
> 
> Added sysfs attributes for exposing target device details
> such as SAS address, firmware device handle and persistent ID
> for the controller attached devices and RAID volumes.
> 
> Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
> ---
> drivers/scsi/mpi3mr/mpi3mr.h     |   1 +
> drivers/scsi/mpi3mr/mpi3mr_app.c | 120 +++++++++++++++++++++++++++++++
> drivers/scsi/mpi3mr/mpi3mr_os.c  |   1 +
> 3 files changed, 122 insertions(+)
> 
> diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h
> index 584659e..01cd017 100644
> --- a/drivers/scsi/mpi3mr/mpi3mr.h
> +++ b/drivers/scsi/mpi3mr/mpi3mr.h
> @@ -1085,4 +1085,5 @@ int mpi3mr_pel_get_seqnum_post(struct mpi3mr_ioc *mrioc,
> void mpi3mr_app_save_logdata(struct mpi3mr_ioc *mrioc, char *event_data,
> 	u16 event_data_size);
> extern const struct attribute_group *mpi3mr_host_groups[];
> +extern const struct attribute_group *mpi3mr_dev_groups[];
> #endif /*MPI3MR_H_INCLUDED*/
> diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c
> index c9b153c..69054a8 100644
> --- a/drivers/scsi/mpi3mr/mpi3mr_app.c
> +++ b/drivers/scsi/mpi3mr/mpi3mr_app.c
> @@ -1742,3 +1742,123 @@ const struct attribute_group *mpi3mr_host_groups[] = {
> 	&mpi3mr_host_attr_group,
> 	NULL,
> };
> +
> +
> +/*
> + * SCSI Device attributes under sysfs
> + */
> +
> +/**
> + * sas_address_show - SysFS callback for dev SASaddress display
> + * @dev: class device
> + * @attr: Device attributes
> + * @buf: Buffer to copy
> + *
> + * Return: snprintf() return after copying SAS address of the
> + * specific SAS/SATA end device.
> + */
> +static ssize_t
> +sas_address_show(struct device *dev, struct device_attribute *attr,
> +			char *buf)
> +{
> +	struct scsi_device *sdev = to_scsi_device(dev);
> +	struct mpi3mr_sdev_priv_data *sdev_priv_data;
> +	struct mpi3mr_stgt_priv_data *tgt_priv_data;
> +	struct mpi3mr_tgt_dev *tgtdev;
> +
> +	sdev_priv_data = sdev->hostdata;
> +	if (!sdev_priv_data)
> +		return 0;
> +
> +	tgt_priv_data = sdev_priv_data->tgt_priv_data;
> +	if (!tgt_priv_data)
> +		return 0;
> +	tgtdev = tgt_priv_data->tgt_dev;
> +	if (!tgtdev || tgtdev->dev_type != MPI3_DEVICE_DEVFORM_SAS_SATA)
> +		return 0;
> +	return snprintf(buf, PAGE_SIZE, "0x%016llx\n",
> +	    (unsigned long long)tgtdev->dev_spec.sas_sata_inf.sas_address);
> +}
> +
> +static DEVICE_ATTR_RO(sas_address);
> +
> +/**
> + * device_handle_show - SysFS callback for device handle display
> + * @dev: class device
> + * @attr: Device attributes
> + * @buf: Buffer to copy
> + *
> + * Return: snprintf() return after copying firmware internal
> + * device handle of the specific device.
> + */
> +static ssize_t
> +device_handle_show(struct device *dev, struct device_attribute *attr,
> +			char *buf)
> +{
> +	struct scsi_device *sdev = to_scsi_device(dev);
> +	struct mpi3mr_sdev_priv_data *sdev_priv_data;
> +	struct mpi3mr_stgt_priv_data *tgt_priv_data;
> +	struct mpi3mr_tgt_dev *tgtdev;
> +
> +	sdev_priv_data = sdev->hostdata;
> +	if (!sdev_priv_data)
> +		return 0;
> +
> +	tgt_priv_data = sdev_priv_data->tgt_priv_data;
> +	if (!tgt_priv_data)
> +		return 0;
> +	tgtdev = tgt_priv_data->tgt_dev;
> +	if (!tgtdev)
> +		return 0;
> +	return snprintf(buf, PAGE_SIZE, "0x%04x\n", tgtdev->dev_handle);
> +}
> +
> +static DEVICE_ATTR_RO(device_handle);
> +
> +/**
> + * persistent_id_show - SysFS callback for persisten ID display
> + * @dev: class device
> + * @attr: Device attributes
> + * @buf: Buffer to copy
> + *
> + * Return: snprintf() return after copying persistent ID of the
> + * of the specific device.
> + */
> +static ssize_t
> +persistent_id_show(struct device *dev, struct device_attribute *attr,
> +			char *buf)
> +{
> +	struct scsi_device *sdev = to_scsi_device(dev);
> +	struct mpi3mr_sdev_priv_data *sdev_priv_data;
> +	struct mpi3mr_stgt_priv_data *tgt_priv_data;
> +	struct mpi3mr_tgt_dev *tgtdev;
> +
> +	sdev_priv_data = sdev->hostdata;
> +	if (!sdev_priv_data)
> +		return 0;
> +
> +	tgt_priv_data = sdev_priv_data->tgt_priv_data;
> +	if (!tgt_priv_data)
> +		return 0;
> +	tgtdev = tgt_priv_data->tgt_dev;
> +	if (!tgtdev)
> +		return 0;
> +	return snprintf(buf, PAGE_SIZE, "%d\n", tgtdev->perst_id);
> +}
> +static DEVICE_ATTR_RO(persistent_id);
> +
> +static struct attribute *mpi3mr_dev_attrs[] = {
> +	&dev_attr_sas_address.attr,
> +	&dev_attr_device_handle.attr,
> +	&dev_attr_persistent_id.attr,
> +	NULL,
> +};
> +
> +static const struct attribute_group mpi3mr_dev_attr_group = {
> +	.attrs = mpi3mr_dev_attrs
> +};
> +
> +const struct attribute_group *mpi3mr_dev_groups[] = {
> +	&mpi3mr_dev_attr_group,
> +	NULL,
> +};
> diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c
> index f5c345d..d8c195b 100644
> --- a/drivers/scsi/mpi3mr/mpi3mr_os.c
> +++ b/drivers/scsi/mpi3mr/mpi3mr_os.c
> @@ -4147,6 +4147,7 @@ static struct scsi_host_template mpi3mr_driver_template = {
> 	.track_queue_depth		= 1,
> 	.cmd_size			= sizeof(struct scmd_priv),
> 	.shost_groups			= mpi3mr_host_groups,
> +	.sdev_groups			= mpi3mr_dev_groups,
> };
> 
> /**
> -- 
> 2.27.0
> 

Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>

--
Himanshu Madhani	Oracle Linux Engineering
diff mbox series

Patch

diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h
index 584659e..01cd017 100644
--- a/drivers/scsi/mpi3mr/mpi3mr.h
+++ b/drivers/scsi/mpi3mr/mpi3mr.h
@@ -1085,4 +1085,5 @@  int mpi3mr_pel_get_seqnum_post(struct mpi3mr_ioc *mrioc,
 void mpi3mr_app_save_logdata(struct mpi3mr_ioc *mrioc, char *event_data,
 	u16 event_data_size);
 extern const struct attribute_group *mpi3mr_host_groups[];
+extern const struct attribute_group *mpi3mr_dev_groups[];
 #endif /*MPI3MR_H_INCLUDED*/
diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c
index c9b153c..69054a8 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_app.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_app.c
@@ -1742,3 +1742,123 @@  const struct attribute_group *mpi3mr_host_groups[] = {
 	&mpi3mr_host_attr_group,
 	NULL,
 };
+
+
+/*
+ * SCSI Device attributes under sysfs
+ */
+
+/**
+ * sas_address_show - SysFS callback for dev SASaddress display
+ * @dev: class device
+ * @attr: Device attributes
+ * @buf: Buffer to copy
+ *
+ * Return: snprintf() return after copying SAS address of the
+ * specific SAS/SATA end device.
+ */
+static ssize_t
+sas_address_show(struct device *dev, struct device_attribute *attr,
+			char *buf)
+{
+	struct scsi_device *sdev = to_scsi_device(dev);
+	struct mpi3mr_sdev_priv_data *sdev_priv_data;
+	struct mpi3mr_stgt_priv_data *tgt_priv_data;
+	struct mpi3mr_tgt_dev *tgtdev;
+
+	sdev_priv_data = sdev->hostdata;
+	if (!sdev_priv_data)
+		return 0;
+
+	tgt_priv_data = sdev_priv_data->tgt_priv_data;
+	if (!tgt_priv_data)
+		return 0;
+	tgtdev = tgt_priv_data->tgt_dev;
+	if (!tgtdev || tgtdev->dev_type != MPI3_DEVICE_DEVFORM_SAS_SATA)
+		return 0;
+	return snprintf(buf, PAGE_SIZE, "0x%016llx\n",
+	    (unsigned long long)tgtdev->dev_spec.sas_sata_inf.sas_address);
+}
+
+static DEVICE_ATTR_RO(sas_address);
+
+/**
+ * device_handle_show - SysFS callback for device handle display
+ * @dev: class device
+ * @attr: Device attributes
+ * @buf: Buffer to copy
+ *
+ * Return: snprintf() return after copying firmware internal
+ * device handle of the specific device.
+ */
+static ssize_t
+device_handle_show(struct device *dev, struct device_attribute *attr,
+			char *buf)
+{
+	struct scsi_device *sdev = to_scsi_device(dev);
+	struct mpi3mr_sdev_priv_data *sdev_priv_data;
+	struct mpi3mr_stgt_priv_data *tgt_priv_data;
+	struct mpi3mr_tgt_dev *tgtdev;
+
+	sdev_priv_data = sdev->hostdata;
+	if (!sdev_priv_data)
+		return 0;
+
+	tgt_priv_data = sdev_priv_data->tgt_priv_data;
+	if (!tgt_priv_data)
+		return 0;
+	tgtdev = tgt_priv_data->tgt_dev;
+	if (!tgtdev)
+		return 0;
+	return snprintf(buf, PAGE_SIZE, "0x%04x\n", tgtdev->dev_handle);
+}
+
+static DEVICE_ATTR_RO(device_handle);
+
+/**
+ * persistent_id_show - SysFS callback for persisten ID display
+ * @dev: class device
+ * @attr: Device attributes
+ * @buf: Buffer to copy
+ *
+ * Return: snprintf() return after copying persistent ID of the
+ * of the specific device.
+ */
+static ssize_t
+persistent_id_show(struct device *dev, struct device_attribute *attr,
+			char *buf)
+{
+	struct scsi_device *sdev = to_scsi_device(dev);
+	struct mpi3mr_sdev_priv_data *sdev_priv_data;
+	struct mpi3mr_stgt_priv_data *tgt_priv_data;
+	struct mpi3mr_tgt_dev *tgtdev;
+
+	sdev_priv_data = sdev->hostdata;
+	if (!sdev_priv_data)
+		return 0;
+
+	tgt_priv_data = sdev_priv_data->tgt_priv_data;
+	if (!tgt_priv_data)
+		return 0;
+	tgtdev = tgt_priv_data->tgt_dev;
+	if (!tgtdev)
+		return 0;
+	return snprintf(buf, PAGE_SIZE, "%d\n", tgtdev->perst_id);
+}
+static DEVICE_ATTR_RO(persistent_id);
+
+static struct attribute *mpi3mr_dev_attrs[] = {
+	&dev_attr_sas_address.attr,
+	&dev_attr_device_handle.attr,
+	&dev_attr_persistent_id.attr,
+	NULL,
+};
+
+static const struct attribute_group mpi3mr_dev_attr_group = {
+	.attrs = mpi3mr_dev_attrs
+};
+
+const struct attribute_group *mpi3mr_dev_groups[] = {
+	&mpi3mr_dev_attr_group,
+	NULL,
+};
diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c
index f5c345d..d8c195b 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_os.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_os.c
@@ -4147,6 +4147,7 @@  static struct scsi_host_template mpi3mr_driver_template = {
 	.track_queue_depth		= 1,
 	.cmd_size			= sizeof(struct scmd_priv),
 	.shost_groups			= mpi3mr_host_groups,
+	.sdev_groups			= mpi3mr_dev_groups,
 };
 
 /**