scsi: mpi3mr: Add target device related sysfs attributes
authorSreekanth Reddy <sreekanth.reddy@broadcom.com>
Tue, 17 May 2022 11:53:10 +0000 (17:23 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 20 May 2022 00:16:26 +0000 (20:16 -0400)
Add 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.

Link: https://lore.kernel.org/r/20220517115310.13062-3-sreekanth.reddy@broadcom.com
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpi3mr/mpi3mr.h
drivers/scsi/mpi3mr/mpi3mr_app.c
drivers/scsi/mpi3mr/mpi3mr_os.c

index 584659e..01cd017 100644 (file)
@@ -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*/
index 33bad2f..9ab1762 100644 (file)
@@ -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: sysfs_emit() 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 sysfs_emit(buf, "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: sysfs_emit() 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 sysfs_emit(buf, "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: sysfs_emit() 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 sysfs_emit(buf, "%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,
+};
index f5c345d..d8c195b 100644 (file)
@@ -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,
 };
 
 /**