@@ -1742,3 +1742,123 @@ const struct attribute_group *mpi3mr_host_groups[] = {
1742
1742
& mpi3mr_host_attr_group ,
1743
1743
NULL ,
1744
1744
};
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
+ };
0 commit comments