4
4
/* ethtool support for ice */
5
5
6
6
#include "ice.h"
7
+ #include "ice_ethtool.h"
7
8
#include "ice_flow.h"
8
9
#include "ice_fltr.h"
9
10
#include "ice_lib.h"
@@ -1658,15 +1659,26 @@ ice_mask_min_supported_speeds(struct ice_hw *hw,
1658
1659
* phy_types_low &= ~ICE_PHY_TYPE_LOW_MASK_MIN_1G ;
1659
1660
}
1660
1661
1661
- #define ice_ethtool_advertise_link_mode (aq_link_speed , ethtool_link_mode ) \
1662
- do { \
1663
- if (req_speeds & (aq_link_speed) || \
1664
- (!req_speeds && \
1665
- (advert_phy_type_lo & phy_type_mask_lo || \
1666
- advert_phy_type_hi & phy_type_mask_hi))) \
1667
- ethtool_link_ksettings_add_link_mode(ks, advertising,\
1668
- ethtool_link_mode); \
1669
- } while (0)
1662
+ /**
1663
+ * ice_linkmode_set_bit - set link mode bit
1664
+ * @phy_to_ethtool: PHY type to ethtool link mode struct to set
1665
+ * @ks: ethtool link ksettings struct to fill out
1666
+ * @req_speeds: speed requested by user
1667
+ * @advert_phy_type: advertised PHY type
1668
+ * @phy_type: PHY type
1669
+ */
1670
+ static void
1671
+ ice_linkmode_set_bit (const struct ice_phy_type_to_ethtool * phy_to_ethtool ,
1672
+ struct ethtool_link_ksettings * ks , u32 req_speeds ,
1673
+ u64 advert_phy_type , u32 phy_type )
1674
+ {
1675
+ linkmode_set_bit (phy_to_ethtool -> link_mode , ks -> link_modes .supported );
1676
+
1677
+ if (req_speeds & phy_to_ethtool -> aq_link_speed ||
1678
+ (!req_speeds && advert_phy_type & BIT (phy_type )))
1679
+ linkmode_set_bit (phy_to_ethtool -> link_mode ,
1680
+ ks -> link_modes .advertising );
1681
+ }
1670
1682
1671
1683
/**
1672
1684
* ice_phy_type_to_ethtool - convert the phy_types to ethtool link modes
@@ -1682,11 +1694,10 @@ ice_phy_type_to_ethtool(struct net_device *netdev,
1682
1694
struct ice_pf * pf = vsi -> back ;
1683
1695
u64 advert_phy_type_lo = 0 ;
1684
1696
u64 advert_phy_type_hi = 0 ;
1685
- u64 phy_type_mask_lo = 0 ;
1686
- u64 phy_type_mask_hi = 0 ;
1687
1697
u64 phy_types_high = 0 ;
1688
1698
u64 phy_types_low = 0 ;
1689
- u16 req_speeds ;
1699
+ u32 req_speeds ;
1700
+ u32 i ;
1690
1701
1691
1702
req_speeds = vsi -> port_info -> phy .link_info .req_speeds ;
1692
1703
@@ -1743,272 +1754,22 @@ ice_phy_type_to_ethtool(struct net_device *netdev,
1743
1754
advert_phy_type_hi = vsi -> port_info -> phy .phy_type_high ;
1744
1755
}
1745
1756
1746
- ethtool_link_ksettings_zero_link_mode (ks , supported );
1747
- ethtool_link_ksettings_zero_link_mode (ks , advertising );
1748
-
1749
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_100BASE_TX |
1750
- ICE_PHY_TYPE_LOW_100M_SGMII ;
1751
- if (phy_types_low & phy_type_mask_lo ) {
1752
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1753
- 100b aseT_Full );
1754
-
1755
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_100MB ,
1756
- 100b aseT_Full );
1757
- }
1758
-
1759
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_1000BASE_T |
1760
- ICE_PHY_TYPE_LOW_1G_SGMII ;
1761
- if (phy_types_low & phy_type_mask_lo ) {
1762
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1763
- 1000b aseT_Full );
1764
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_1000MB ,
1765
- 1000b aseT_Full );
1766
- }
1767
-
1768
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_1000BASE_KX ;
1769
- if (phy_types_low & phy_type_mask_lo ) {
1770
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1771
- 1000b aseKX_Full );
1772
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_1000MB ,
1773
- 1000b aseKX_Full );
1774
- }
1775
-
1776
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_1000BASE_SX |
1777
- ICE_PHY_TYPE_LOW_1000BASE_LX ;
1778
- if (phy_types_low & phy_type_mask_lo ) {
1779
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1780
- 1000b aseX_Full );
1781
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_1000MB ,
1782
- 1000b aseX_Full );
1783
- }
1784
-
1785
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_2500BASE_T ;
1786
- if (phy_types_low & phy_type_mask_lo ) {
1787
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1788
- 2500b aseT_Full );
1789
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_2500MB ,
1790
- 2500b aseT_Full );
1791
- }
1792
-
1793
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_2500BASE_X |
1794
- ICE_PHY_TYPE_LOW_2500BASE_KX ;
1795
- if (phy_types_low & phy_type_mask_lo ) {
1796
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1797
- 2500b aseX_Full );
1798
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_2500MB ,
1799
- 2500b aseX_Full );
1800
- }
1801
-
1802
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_5GBASE_T |
1803
- ICE_PHY_TYPE_LOW_5GBASE_KR ;
1804
- if (phy_types_low & phy_type_mask_lo ) {
1805
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1806
- 5000b aseT_Full );
1807
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_5GB ,
1808
- 5000b aseT_Full );
1809
- }
1810
-
1811
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_10GBASE_T |
1812
- ICE_PHY_TYPE_LOW_10G_SFI_DA |
1813
- ICE_PHY_TYPE_LOW_10G_SFI_AOC_ACC |
1814
- ICE_PHY_TYPE_LOW_10G_SFI_C2C ;
1815
- if (phy_types_low & phy_type_mask_lo ) {
1816
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1817
- 10000b aseT_Full );
1818
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_10GB ,
1819
- 10000b aseT_Full );
1820
- }
1821
-
1822
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_10GBASE_KR_CR1 ;
1823
- if (phy_types_low & phy_type_mask_lo ) {
1824
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1825
- 10000b aseKR_Full );
1826
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_10GB ,
1827
- 10000b aseKR_Full );
1828
- }
1829
-
1830
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_10GBASE_SR ;
1831
- if (phy_types_low & phy_type_mask_lo ) {
1832
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1833
- 10000b aseSR_Full );
1834
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_10GB ,
1835
- 10000b aseSR_Full );
1836
- }
1837
-
1838
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_10GBASE_LR ;
1839
- if (phy_types_low & phy_type_mask_lo ) {
1840
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1841
- 10000b aseLR_Full );
1842
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_10GB ,
1843
- 10000b aseLR_Full );
1844
- }
1845
-
1846
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_25GBASE_T |
1847
- ICE_PHY_TYPE_LOW_25GBASE_CR |
1848
- ICE_PHY_TYPE_LOW_25GBASE_CR_S |
1849
- ICE_PHY_TYPE_LOW_25GBASE_CR1 |
1850
- ICE_PHY_TYPE_LOW_25G_AUI_AOC_ACC |
1851
- ICE_PHY_TYPE_LOW_25G_AUI_C2C ;
1852
- if (phy_types_low & phy_type_mask_lo ) {
1853
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1854
- 25000b aseCR_Full );
1855
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_25GB ,
1856
- 25000b aseCR_Full );
1857
- }
1858
-
1859
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_25GBASE_SR |
1860
- ICE_PHY_TYPE_LOW_25GBASE_LR ;
1861
- if (phy_types_low & phy_type_mask_lo ) {
1862
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1863
- 25000b aseSR_Full );
1864
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_25GB ,
1865
- 25000b aseSR_Full );
1866
- }
1867
-
1868
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_25GBASE_KR |
1869
- ICE_PHY_TYPE_LOW_25GBASE_KR_S |
1870
- ICE_PHY_TYPE_LOW_25GBASE_KR1 ;
1871
- if (phy_types_low & phy_type_mask_lo ) {
1872
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1873
- 25000b aseKR_Full );
1874
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_25GB ,
1875
- 25000b aseKR_Full );
1876
- }
1877
-
1878
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_40GBASE_KR4 ;
1879
- if (phy_types_low & phy_type_mask_lo ) {
1880
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1881
- 40000b aseKR4_Full );
1882
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_40GB ,
1883
- 40000b aseKR4_Full );
1884
- }
1885
-
1886
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_40GBASE_CR4 |
1887
- ICE_PHY_TYPE_LOW_40G_XLAUI_AOC_ACC |
1888
- ICE_PHY_TYPE_LOW_40G_XLAUI ;
1889
- if (phy_types_low & phy_type_mask_lo ) {
1890
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1891
- 40000b aseCR4_Full );
1892
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_40GB ,
1893
- 40000b aseCR4_Full );
1894
- }
1895
-
1896
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_40GBASE_SR4 ;
1897
- if (phy_types_low & phy_type_mask_lo ) {
1898
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1899
- 40000b aseSR4_Full );
1900
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_40GB ,
1901
- 40000b aseSR4_Full );
1902
- }
1903
-
1904
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_40GBASE_LR4 ;
1905
- if (phy_types_low & phy_type_mask_lo ) {
1906
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1907
- 40000b aseLR4_Full );
1908
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_40GB ,
1909
- 40000b aseLR4_Full );
1910
- }
1911
-
1912
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_50GBASE_CR2 |
1913
- ICE_PHY_TYPE_LOW_50G_LAUI2_AOC_ACC |
1914
- ICE_PHY_TYPE_LOW_50G_LAUI2 |
1915
- ICE_PHY_TYPE_LOW_50G_AUI2_AOC_ACC |
1916
- ICE_PHY_TYPE_LOW_50G_AUI2 |
1917
- ICE_PHY_TYPE_LOW_50GBASE_CP |
1918
- ICE_PHY_TYPE_LOW_50GBASE_SR |
1919
- ICE_PHY_TYPE_LOW_50G_AUI1_AOC_ACC |
1920
- ICE_PHY_TYPE_LOW_50G_AUI1 ;
1921
- if (phy_types_low & phy_type_mask_lo ) {
1922
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1923
- 50000b aseCR2_Full );
1924
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_50GB ,
1925
- 50000b aseCR2_Full );
1926
- }
1927
-
1928
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_50GBASE_KR2 |
1929
- ICE_PHY_TYPE_LOW_50GBASE_KR_PAM4 ;
1930
- if (phy_types_low & phy_type_mask_lo ) {
1931
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1932
- 50000b aseKR2_Full );
1933
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_50GB ,
1934
- 50000b aseKR2_Full );
1935
- }
1936
-
1937
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_50GBASE_SR2 |
1938
- ICE_PHY_TYPE_LOW_50GBASE_LR2 |
1939
- ICE_PHY_TYPE_LOW_50GBASE_FR |
1940
- ICE_PHY_TYPE_LOW_50GBASE_LR ;
1941
- if (phy_types_low & phy_type_mask_lo ) {
1942
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1943
- 50000b aseSR2_Full );
1944
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_50GB ,
1945
- 50000b aseSR2_Full );
1946
- }
1947
-
1948
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_100GBASE_CR4 |
1949
- ICE_PHY_TYPE_LOW_100G_CAUI4_AOC_ACC |
1950
- ICE_PHY_TYPE_LOW_100G_CAUI4 |
1951
- ICE_PHY_TYPE_LOW_100G_AUI4_AOC_ACC |
1952
- ICE_PHY_TYPE_LOW_100G_AUI4 |
1953
- ICE_PHY_TYPE_LOW_100GBASE_CR_PAM4 ;
1954
- phy_type_mask_hi = ICE_PHY_TYPE_HIGH_100G_CAUI2_AOC_ACC |
1955
- ICE_PHY_TYPE_HIGH_100G_CAUI2 |
1956
- ICE_PHY_TYPE_HIGH_100G_AUI2_AOC_ACC |
1957
- ICE_PHY_TYPE_HIGH_100G_AUI2 ;
1958
- if (phy_types_low & phy_type_mask_lo ||
1959
- phy_types_high & phy_type_mask_hi ) {
1960
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1961
- 100000b aseCR4_Full );
1962
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_100GB ,
1963
- 100000b aseCR4_Full );
1964
- }
1965
-
1966
- if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_CP2 ) {
1967
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1968
- 100000b aseCR2_Full );
1969
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_100GB ,
1970
- 100000b aseCR2_Full );
1971
- }
1972
-
1973
- if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_SR4 ) {
1974
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1975
- 100000b aseSR4_Full );
1976
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_100GB ,
1977
- 100000b aseSR4_Full );
1978
- }
1979
-
1980
- if (phy_types_low & ICE_PHY_TYPE_LOW_100GBASE_SR2 ) {
1981
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1982
- 100000b aseSR2_Full );
1983
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_100GB ,
1984
- 100000b aseSR2_Full );
1985
- }
1986
-
1987
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_100GBASE_LR4 |
1988
- ICE_PHY_TYPE_LOW_100GBASE_DR ;
1989
- if (phy_types_low & phy_type_mask_lo ) {
1990
- ethtool_link_ksettings_add_link_mode (ks , supported ,
1991
- 100000b aseLR4_ER4_Full );
1992
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_100GB ,
1993
- 100000b aseLR4_ER4_Full );
1994
- }
1757
+ linkmode_zero (ks -> link_modes .supported );
1758
+ linkmode_zero (ks -> link_modes .advertising );
1995
1759
1996
- phy_type_mask_lo = ICE_PHY_TYPE_LOW_100GBASE_KR4 |
1997
- ICE_PHY_TYPE_LOW_100GBASE_KR_PAM4 ;
1998
- if (phy_types_low & phy_type_mask_lo ) {
1999
- ethtool_link_ksettings_add_link_mode (ks , supported ,
2000
- 100000b aseKR4_Full );
2001
- ice_ethtool_advertise_link_mode (ICE_AQ_LINK_SPEED_100GB ,
2002
- 100000b aseKR4_Full );
1760
+ for (i = 0 ; i < BITS_PER_TYPE (u64 ); i ++ ) {
1761
+ if (phy_types_low & BIT_ULL (i ))
1762
+ ice_linkmode_set_bit (& phy_type_low_lkup [i ], ks ,
1763
+ req_speeds , advert_phy_type_lo ,
1764
+ i );
2003
1765
}
2004
1766
2005
- if ( phy_types_high & ICE_PHY_TYPE_HIGH_100GBASE_KR2_PAM4 ) {
2006
- ethtool_link_ksettings_add_link_mode ( ks , supported ,
2007
- 100000b aseKR2_Full );
2008
- ice_ethtool_advertise_link_mode ( ICE_AQ_LINK_SPEED_100GB ,
2009
- 100000b aseKR2_Full );
1767
+ for ( i = 0 ; i < BITS_PER_TYPE ( u64 ); i ++ ) {
1768
+ if ( phy_types_high & BIT_ULL ( i ))
1769
+ ice_linkmode_set_bit ( & phy_type_high_lkup [ i ], ks ,
1770
+ req_speeds , advert_phy_type_hi ,
1771
+ i );
2010
1772
}
2011
-
2012
1773
}
2013
1774
2014
1775
#define TEST_SET_BITS_TIMEOUT 50
0 commit comments