> On May 12, 2022, at 7:00 AM, Sreekanth Reddy <sreekanth.reddy@xxxxxxxxxxxx> 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@xxxxxxxxxxxx> > --- > 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@xxxxxxxxxx> -- Himanshu Madhani Oracle Linux Engineering