scsi: mpi3mr: Add target device related sysfs attributes
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>
This commit is contained in:
parent
e51e76eddd
commit
9feb5c4c3f
|
@ -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*/
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue