* [PATCH 0/2] mpi3mr: Add shost & device sysfs attributes @ 2022-05-12 14:00 Sreekanth Reddy 2022-05-12 14:00 ` [PATCH 1/2] mpi3mr: Add shost related " Sreekanth Reddy 2022-05-12 14:00 ` [PATCH 2/2] mpi3mr: Add target device " Sreekanth Reddy 0 siblings, 2 replies; 6+ messages in thread From: Sreekanth Reddy @ 2022-05-12 14:00 UTC (permalink / raw) To: linux-scsi; +Cc: martin.petersen, Sreekanth Reddy [-- Attachment #1: Type: text/plain, Size: 372 bytes --] Added shost & device related sysfs attributes Sreekanth Reddy (2): mpi3mr: Add shost related sysfs attributes mpi3mr: Add target device related sysfs attributes drivers/scsi/mpi3mr/mpi3mr.h | 1 + drivers/scsi/mpi3mr/mpi3mr_app.c | 259 +++++++++++++++++++++++++++++++ drivers/scsi/mpi3mr/mpi3mr_os.c | 1 + 3 files changed, 261 insertions(+) -- 2.27.0 [-- Attachment #2: S/MIME Cryptographic Signature --] [-- Type: application/pkcs7-signature, Size: 4218 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/2] mpi3mr: Add shost related sysfs attributes 2022-05-12 14:00 [PATCH 0/2] mpi3mr: Add shost & device sysfs attributes Sreekanth Reddy @ 2022-05-12 14:00 ` Sreekanth Reddy 2022-05-12 23:36 ` Himanshu Madhani 2022-05-17 1:55 ` Martin K. Petersen 2022-05-12 14:00 ` [PATCH 2/2] mpi3mr: Add target device " Sreekanth Reddy 1 sibling, 2 replies; 6+ messages in thread From: Sreekanth Reddy @ 2022-05-12 14:00 UTC (permalink / raw) To: linux-scsi; +Cc: martin.petersen, Sreekanth Reddy [-- Attachment #1: Type: text/plain, Size: 4810 bytes --] Added shost related sysfs attributes to get the controller's firmware version, controlller's queue depth, number of request & reply queues. Also added an attribute to set & get the logging_level. Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com> --- drivers/scsi/mpi3mr/mpi3mr_app.c | 139 +++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c index 73bb799..c9b153c 100644 --- a/drivers/scsi/mpi3mr/mpi3mr_app.c +++ b/drivers/scsi/mpi3mr/mpi3mr_app.c @@ -1558,6 +1558,140 @@ err_device_add: kfree(mrioc->bsg_dev); } +/** + * version_fw_show - SysFS callback for firmware version read + * @dev: class device + * @attr: Device attributes + * @buf: Buffer to copy + * + * Return: snprintf() return after copying firmware version + */ +static ssize_t +version_fw_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct Scsi_Host *shost = class_to_shost(dev); + struct mpi3mr_ioc *mrioc = shost_priv(shost); + struct mpi3mr_compimg_ver *fwver = &mrioc->facts.fw_ver; + + return snprintf(buf, PAGE_SIZE, "%d.%d.%d.%d.%05d-%05d\n", + fwver->gen_major, fwver->gen_minor, fwver->ph_major, + fwver->ph_minor, fwver->cust_id, fwver->build_num); +} +static DEVICE_ATTR_RO(version_fw); + +/** + * fw_queue_depth_show - SysFS callback for firmware max cmds + * @dev: class device + * @attr: Device attributes + * @buf: Buffer to copy + * + * Return: snprintf() return after copying firmware max commands + */ +static ssize_t +fw_queue_depth_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct Scsi_Host *shost = class_to_shost(dev); + struct mpi3mr_ioc *mrioc = shost_priv(shost); + + return snprintf(buf, PAGE_SIZE, "%d\n", mrioc->facts.max_reqs); +} +static DEVICE_ATTR_RO(fw_queue_depth); + +/** + * op_req_q_count_show - SysFS callback for request queue count + * @dev: class device + * @attr: Device attributes + * @buf: Buffer to copy + * + * Return: snprintf() return after copying request queue count + */ +static ssize_t +op_req_q_count_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct Scsi_Host *shost = class_to_shost(dev); + struct mpi3mr_ioc *mrioc = shost_priv(shost); + + return snprintf(buf, PAGE_SIZE, "%d\n", mrioc->num_op_req_q); +} +static DEVICE_ATTR_RO(op_req_q_count); + +/** + * reply_queue_count_show - SysFS callback for reply queue count + * @dev: class device + * @attr: Device attributes + * @buf: Buffer to copy + * + * Return: snprintf() return after copying reply queue count + */ +static ssize_t +reply_queue_count_show(struct device *dev, struct device_attribute *attr, + char *buf) +{ + struct Scsi_Host *shost = class_to_shost(dev); + struct mpi3mr_ioc *mrioc = shost_priv(shost); + + return snprintf(buf, PAGE_SIZE, "%d\n", mrioc->num_op_reply_q); +} + +static DEVICE_ATTR_RO(reply_queue_count); + +/** + * logging_level_show - Show controller debug level + * @dev: class device + * @attr: Device attributes + * @buf: Buffer to copy + * + * A sysfs 'read/write' shost attribute, to show the current + * debug log level used by the driver for the specific + * controller. + * + * Return: snprintf() return + */ +static ssize_t +logging_level_show(struct device *dev, + struct device_attribute *attr, char *buf) + +{ + struct Scsi_Host *shost = class_to_shost(dev); + struct mpi3mr_ioc *mrioc = shost_priv(shost); + + return snprintf(buf, PAGE_SIZE, "%08xh\n", mrioc->logging_level); +} + +/** + * logging_level_store- Change controller debug level + * @dev: class device + * @attr: Device attributes + * @buf: Buffer to copy + * @count: size of the buffer + * + * A sysfs 'read/write' shost attribute, to change the current + * debug log level used by the driver for the specific + * controller. + * + * Return: strlen() return + */ +static ssize_t +logging_level_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct Scsi_Host *shost = class_to_shost(dev); + struct mpi3mr_ioc *mrioc = shost_priv(shost); + int val = 0; + + if (kstrtoint(buf, 0, &val) != 0) + return -EINVAL; + + mrioc->logging_level = val; + ioc_info(mrioc, "logging_level=%08xh\n", mrioc->logging_level); + return strlen(buf); +} +static DEVICE_ATTR_RW(logging_level); + /** * adapter_state_show - SysFS callback for adapter state show * @dev: class device @@ -1591,6 +1725,11 @@ adp_state_show(struct device *dev, struct device_attribute *attr, static DEVICE_ATTR_RO(adp_state); static struct attribute *mpi3mr_host_attrs[] = { + &dev_attr_version_fw.attr, + &dev_attr_fw_queue_depth.attr, + &dev_attr_op_req_q_count.attr, + &dev_attr_reply_queue_count.attr, + &dev_attr_logging_level.attr, &dev_attr_adp_state.attr, NULL, }; -- 2.27.0 [-- Attachment #2: S/MIME Cryptographic Signature --] [-- Type: application/pkcs7-signature, Size: 4218 bytes --] ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] mpi3mr: Add shost related sysfs attributes 2022-05-12 14:00 ` [PATCH 1/2] mpi3mr: Add shost related " Sreekanth Reddy @ 2022-05-12 23:36 ` Himanshu Madhani 2022-05-17 1:55 ` Martin K. Petersen 1 sibling, 0 replies; 6+ messages in thread From: Himanshu Madhani @ 2022-05-12 23:36 UTC (permalink / raw) To: Sreekanth Reddy; +Cc: linux-scsi, Martin Petersen > On May 12, 2022, at 7:00 AM, Sreekanth Reddy <sreekanth.reddy@broadcom.com> wrote: > > Added shost related sysfs attributes to get the controller's > firmware version, controlller's queue depth, > number of request & reply queues. > Also added an attribute to set & get the logging_level. > > Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com> > --- > drivers/scsi/mpi3mr/mpi3mr_app.c | 139 +++++++++++++++++++++++++++++++ > 1 file changed, 139 insertions(+) > > diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c > index 73bb799..c9b153c 100644 > --- a/drivers/scsi/mpi3mr/mpi3mr_app.c > +++ b/drivers/scsi/mpi3mr/mpi3mr_app.c > @@ -1558,6 +1558,140 @@ err_device_add: > kfree(mrioc->bsg_dev); > } > > +/** > + * version_fw_show - SysFS callback for firmware version read > + * @dev: class device > + * @attr: Device attributes > + * @buf: Buffer to copy > + * > + * Return: snprintf() return after copying firmware version > + */ > +static ssize_t > +version_fw_show(struct device *dev, struct device_attribute *attr, > + char *buf) > +{ > + struct Scsi_Host *shost = class_to_shost(dev); > + struct mpi3mr_ioc *mrioc = shost_priv(shost); > + struct mpi3mr_compimg_ver *fwver = &mrioc->facts.fw_ver; > + > + return snprintf(buf, PAGE_SIZE, "%d.%d.%d.%d.%05d-%05d\n", > + fwver->gen_major, fwver->gen_minor, fwver->ph_major, > + fwver->ph_minor, fwver->cust_id, fwver->build_num); > +} > +static DEVICE_ATTR_RO(version_fw); > + > +/** > + * fw_queue_depth_show - SysFS callback for firmware max cmds > + * @dev: class device > + * @attr: Device attributes > + * @buf: Buffer to copy > + * > + * Return: snprintf() return after copying firmware max commands > + */ > +static ssize_t > +fw_queue_depth_show(struct device *dev, struct device_attribute *attr, > + char *buf) > +{ > + struct Scsi_Host *shost = class_to_shost(dev); > + struct mpi3mr_ioc *mrioc = shost_priv(shost); > + > + return snprintf(buf, PAGE_SIZE, "%d\n", mrioc->facts.max_reqs); > +} > +static DEVICE_ATTR_RO(fw_queue_depth); > + > +/** > + * op_req_q_count_show - SysFS callback for request queue count > + * @dev: class device > + * @attr: Device attributes > + * @buf: Buffer to copy > + * > + * Return: snprintf() return after copying request queue count > + */ > +static ssize_t > +op_req_q_count_show(struct device *dev, struct device_attribute *attr, > + char *buf) > +{ > + struct Scsi_Host *shost = class_to_shost(dev); > + struct mpi3mr_ioc *mrioc = shost_priv(shost); > + > + return snprintf(buf, PAGE_SIZE, "%d\n", mrioc->num_op_req_q); > +} > +static DEVICE_ATTR_RO(op_req_q_count); > + > +/** > + * reply_queue_count_show - SysFS callback for reply queue count > + * @dev: class device > + * @attr: Device attributes > + * @buf: Buffer to copy > + * > + * Return: snprintf() return after copying reply queue count > + */ > +static ssize_t > +reply_queue_count_show(struct device *dev, struct device_attribute *attr, > + char *buf) > +{ > + struct Scsi_Host *shost = class_to_shost(dev); > + struct mpi3mr_ioc *mrioc = shost_priv(shost); > + > + return snprintf(buf, PAGE_SIZE, "%d\n", mrioc->num_op_reply_q); > +} > + > +static DEVICE_ATTR_RO(reply_queue_count); > + > +/** > + * logging_level_show - Show controller debug level > + * @dev: class device > + * @attr: Device attributes > + * @buf: Buffer to copy > + * > + * A sysfs 'read/write' shost attribute, to show the current > + * debug log level used by the driver for the specific > + * controller. > + * > + * Return: snprintf() return > + */ > +static ssize_t > +logging_level_show(struct device *dev, > + struct device_attribute *attr, char *buf) > + > +{ > + struct Scsi_Host *shost = class_to_shost(dev); > + struct mpi3mr_ioc *mrioc = shost_priv(shost); > + > + return snprintf(buf, PAGE_SIZE, "%08xh\n", mrioc->logging_level); > +} > + > +/** > + * logging_level_store- Change controller debug level > + * @dev: class device > + * @attr: Device attributes > + * @buf: Buffer to copy > + * @count: size of the buffer > + * > + * A sysfs 'read/write' shost attribute, to change the current > + * debug log level used by the driver for the specific > + * controller. > + * > + * Return: strlen() return > + */ > +static ssize_t > +logging_level_store(struct device *dev, > + struct device_attribute *attr, > + const char *buf, size_t count) > +{ > + struct Scsi_Host *shost = class_to_shost(dev); > + struct mpi3mr_ioc *mrioc = shost_priv(shost); > + int val = 0; > + > + if (kstrtoint(buf, 0, &val) != 0) > + return -EINVAL; > + > + mrioc->logging_level = val; > + ioc_info(mrioc, "logging_level=%08xh\n", mrioc->logging_level); > + return strlen(buf); > +} > +static DEVICE_ATTR_RW(logging_level); > + > /** > * adapter_state_show - SysFS callback for adapter state show > * @dev: class device > @@ -1591,6 +1725,11 @@ adp_state_show(struct device *dev, struct device_attribute *attr, > static DEVICE_ATTR_RO(adp_state); > > static struct attribute *mpi3mr_host_attrs[] = { > + &dev_attr_version_fw.attr, > + &dev_attr_fw_queue_depth.attr, > + &dev_attr_op_req_q_count.attr, > + &dev_attr_reply_queue_count.attr, > + &dev_attr_logging_level.attr, > &dev_attr_adp_state.attr, > NULL, > }; > -- > 2.27.0 > Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> -- Himanshu Madhani Oracle Linux Engineering ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/2] mpi3mr: Add shost related sysfs attributes 2022-05-12 14:00 ` [PATCH 1/2] mpi3mr: Add shost related " Sreekanth Reddy 2022-05-12 23:36 ` Himanshu Madhani @ 2022-05-17 1:55 ` Martin K. Petersen 1 sibling, 0 replies; 6+ messages in thread From: Martin K. Petersen @ 2022-05-17 1:55 UTC (permalink / raw) To: Sreekanth Reddy; +Cc: linux-scsi, martin.petersen Sreekanth, > +static ssize_t > +version_fw_show(struct device *dev, struct device_attribute *attr, > + char *buf) > +{ > + struct Scsi_Host *shost = class_to_shost(dev); > + struct mpi3mr_ioc *mrioc = shost_priv(shost); > + struct mpi3mr_compimg_ver *fwver = &mrioc->facts.fw_ver; > + > + return snprintf(buf, PAGE_SIZE, "%d.%d.%d.%d.%05d-%05d\n", > + fwver->gen_major, fwver->gen_minor, fwver->ph_major, > + fwver->ph_minor, fwver->cust_id, fwver->build_num); > +} Please use sysfs_emit() for new code. -- Martin K. Petersen Oracle Linux Engineering ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/2] mpi3mr: Add target device related sysfs attributes 2022-05-12 14:00 [PATCH 0/2] mpi3mr: Add shost & device sysfs attributes Sreekanth Reddy 2022-05-12 14:00 ` [PATCH 1/2] mpi3mr: Add shost related " Sreekanth Reddy @ 2022-05-12 14:00 ` Sreekanth Reddy 2022-05-12 23:36 ` Himanshu Madhani 1 sibling, 1 reply; 6+ messages in thread From: Sreekanth Reddy @ 2022-05-12 14:00 UTC (permalink / raw) To: linux-scsi; +Cc: martin.petersen, Sreekanth Reddy [-- Attachment #1: Type: text/plain, Size: 4787 bytes --] 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 [-- Attachment #2: S/MIME Cryptographic Signature --] [-- Type: application/pkcs7-signature, Size: 4218 bytes --] ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 2/2] mpi3mr: Add target device related sysfs attributes 2022-05-12 14:00 ` [PATCH 2/2] mpi3mr: Add target device " Sreekanth Reddy @ 2022-05-12 23:36 ` Himanshu Madhani 0 siblings, 0 replies; 6+ messages in thread From: Himanshu Madhani @ 2022-05-12 23:36 UTC (permalink / raw) To: Sreekanth Reddy; +Cc: linux-scsi, Martin Petersen > 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 ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2022-05-17 1:55 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-05-12 14:00 [PATCH 0/2] mpi3mr: Add shost & device sysfs attributes Sreekanth Reddy 2022-05-12 14:00 ` [PATCH 1/2] mpi3mr: Add shost related " Sreekanth Reddy 2022-05-12 23:36 ` Himanshu Madhani 2022-05-17 1:55 ` Martin K. Petersen 2022-05-12 14:00 ` [PATCH 2/2] mpi3mr: Add target device " Sreekanth Reddy 2022-05-12 23:36 ` Himanshu Madhani
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.