Skip to content

Commit 9feb5c4

Browse files
sreekanthbrcmmartinkpetersen
authored andcommitted
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>
1 parent e51e76e commit 9feb5c4

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed

drivers/scsi/mpi3mr/mpi3mr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1085,4 +1085,5 @@ int mpi3mr_pel_get_seqnum_post(struct mpi3mr_ioc *mrioc,
10851085
void mpi3mr_app_save_logdata(struct mpi3mr_ioc *mrioc, char *event_data,
10861086
u16 event_data_size);
10871087
extern const struct attribute_group *mpi3mr_host_groups[];
1088+
extern const struct attribute_group *mpi3mr_dev_groups[];
10881089
#endif /*MPI3MR_H_INCLUDED*/

drivers/scsi/mpi3mr/mpi3mr_app.c

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1742,3 +1742,123 @@ const struct attribute_group *mpi3mr_host_groups[] = {
17421742
&mpi3mr_host_attr_group,
17431743
NULL,
17441744
};
1745+
1746+
1747+
/*
1748+
* SCSI Device attributes under sysfs
1749+
*/
1750+
1751+
/**
1752+
* sas_address_show - SysFS callback for dev SASaddress display
1753+
* @dev: class device
1754+
* @attr: Device attributes
1755+
* @buf: Buffer to copy
1756+
*
1757+
* Return: sysfs_emit() return after copying SAS address of the
1758+
* specific SAS/SATA end device.
1759+
*/
1760+
static ssize_t
1761+
sas_address_show(struct device *dev, struct device_attribute *attr,
1762+
char *buf)
1763+
{
1764+
struct scsi_device *sdev = to_scsi_device(dev);
1765+
struct mpi3mr_sdev_priv_data *sdev_priv_data;
1766+
struct mpi3mr_stgt_priv_data *tgt_priv_data;
1767+
struct mpi3mr_tgt_dev *tgtdev;
1768+
1769+
sdev_priv_data = sdev->hostdata;
1770+
if (!sdev_priv_data)
1771+
return 0;
1772+
1773+
tgt_priv_data = sdev_priv_data->tgt_priv_data;
1774+
if (!tgt_priv_data)
1775+
return 0;
1776+
tgtdev = tgt_priv_data->tgt_dev;
1777+
if (!tgtdev || tgtdev->dev_type != MPI3_DEVICE_DEVFORM_SAS_SATA)
1778+
return 0;
1779+
return sysfs_emit(buf, "0x%016llx\n",
1780+
(unsigned long long)tgtdev->dev_spec.sas_sata_inf.sas_address);
1781+
}
1782+
1783+
static DEVICE_ATTR_RO(sas_address);
1784+
1785+
/**
1786+
* device_handle_show - SysFS callback for device handle display
1787+
* @dev: class device
1788+
* @attr: Device attributes
1789+
* @buf: Buffer to copy
1790+
*
1791+
* Return: sysfs_emit() return after copying firmware internal
1792+
* device handle of the specific device.
1793+
*/
1794+
static ssize_t
1795+
device_handle_show(struct device *dev, struct device_attribute *attr,
1796+
char *buf)
1797+
{
1798+
struct scsi_device *sdev = to_scsi_device(dev);
1799+
struct mpi3mr_sdev_priv_data *sdev_priv_data;
1800+
struct mpi3mr_stgt_priv_data *tgt_priv_data;
1801+
struct mpi3mr_tgt_dev *tgtdev;
1802+
1803+
sdev_priv_data = sdev->hostdata;
1804+
if (!sdev_priv_data)
1805+
return 0;
1806+
1807+
tgt_priv_data = sdev_priv_data->tgt_priv_data;
1808+
if (!tgt_priv_data)
1809+
return 0;
1810+
tgtdev = tgt_priv_data->tgt_dev;
1811+
if (!tgtdev)
1812+
return 0;
1813+
return sysfs_emit(buf, "0x%04x\n", tgtdev->dev_handle);
1814+
}
1815+
1816+
static DEVICE_ATTR_RO(device_handle);
1817+
1818+
/**
1819+
* persistent_id_show - SysFS callback for persisten ID display
1820+
* @dev: class device
1821+
* @attr: Device attributes
1822+
* @buf: Buffer to copy
1823+
*
1824+
* Return: sysfs_emit() return after copying persistent ID of the
1825+
* of the specific device.
1826+
*/
1827+
static ssize_t
1828+
persistent_id_show(struct device *dev, struct device_attribute *attr,
1829+
char *buf)
1830+
{
1831+
struct scsi_device *sdev = to_scsi_device(dev);
1832+
struct mpi3mr_sdev_priv_data *sdev_priv_data;
1833+
struct mpi3mr_stgt_priv_data *tgt_priv_data;
1834+
struct mpi3mr_tgt_dev *tgtdev;
1835+
1836+
sdev_priv_data = sdev->hostdata;
1837+
if (!sdev_priv_data)
1838+
return 0;
1839+
1840+
tgt_priv_data = sdev_priv_data->tgt_priv_data;
1841+
if (!tgt_priv_data)
1842+
return 0;
1843+
tgtdev = tgt_priv_data->tgt_dev;
1844+
if (!tgtdev)
1845+
return 0;
1846+
return sysfs_emit(buf, "%d\n", tgtdev->perst_id);
1847+
}
1848+
static DEVICE_ATTR_RO(persistent_id);
1849+
1850+
static struct attribute *mpi3mr_dev_attrs[] = {
1851+
&dev_attr_sas_address.attr,
1852+
&dev_attr_device_handle.attr,
1853+
&dev_attr_persistent_id.attr,
1854+
NULL,
1855+
};
1856+
1857+
static const struct attribute_group mpi3mr_dev_attr_group = {
1858+
.attrs = mpi3mr_dev_attrs
1859+
};
1860+
1861+
const struct attribute_group *mpi3mr_dev_groups[] = {
1862+
&mpi3mr_dev_attr_group,
1863+
NULL,
1864+
};

drivers/scsi/mpi3mr/mpi3mr_os.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4147,6 +4147,7 @@ static struct scsi_host_template mpi3mr_driver_template = {
41474147
.track_queue_depth = 1,
41484148
.cmd_size = sizeof(struct scmd_priv),
41494149
.shost_groups = mpi3mr_host_groups,
4150+
.sdev_groups = mpi3mr_dev_groups,
41504151
};
41514152

41524153
/**

0 commit comments

Comments
 (0)