@@ -1730,7 +1730,7 @@ bnxt_get_link_mode(struct bnxt_link_info *link_info)
1730
1730
return link_mode ;
1731
1731
}
1732
1732
1733
- #define BNXT_FW_TO_ETHTOOL_SPDS (fw_speeds , fw_pause , lk_ksettings , name )\
1733
+ #define BNXT_FW_TO_ETHTOOL_SPDS (fw_speeds , lk_ksettings , name ) \
1734
1734
{ \
1735
1735
if ((fw_speeds) & BNXT_LINK_SPEED_MSK_100MB) \
1736
1736
ethtool_link_ksettings_add_link_mode(lk_ksettings, name,\
@@ -1753,16 +1753,6 @@ bnxt_get_link_mode(struct bnxt_link_info *link_info)
1753
1753
if ((fw_speeds) & BNXT_LINK_SPEED_MSK_100GB) \
1754
1754
ethtool_link_ksettings_add_link_mode(lk_ksettings, name,\
1755
1755
100000baseCR4_Full);\
1756
- if ((fw_pause) & BNXT_LINK_PAUSE_RX) { \
1757
- ethtool_link_ksettings_add_link_mode(lk_ksettings, name,\
1758
- Pause); \
1759
- if (!((fw_pause) & BNXT_LINK_PAUSE_TX)) \
1760
- ethtool_link_ksettings_add_link_mode( \
1761
- lk_ksettings, name, Asym_Pause);\
1762
- } else if ((fw_pause) & BNXT_LINK_PAUSE_TX) { \
1763
- ethtool_link_ksettings_add_link_mode(lk_ksettings, name,\
1764
- Asym_Pause); \
1765
- } \
1766
1756
}
1767
1757
1768
1758
#define BNXT_ETHTOOL_TO_FW_SPDS (fw_speeds , lk_ksettings , name ) \
@@ -1820,6 +1810,39 @@ bnxt_get_link_mode(struct bnxt_link_info *link_info)
1820
1810
(fw_speeds) |= BNXT_LINK_PAM4_SPEED_MSK_200GB; \
1821
1811
}
1822
1812
1813
+ static void bnxt_get_ethtool_modes (struct bnxt_link_info * link_info ,
1814
+ struct ethtool_link_ksettings * lk_ksettings )
1815
+ {
1816
+ struct bnxt * bp = container_of (link_info , struct bnxt , link_info );
1817
+
1818
+ if (!(bp -> phy_flags & BNXT_PHY_FL_NO_PAUSE )) {
1819
+ ethtool_link_ksettings_add_link_mode (lk_ksettings , supported ,
1820
+ Pause );
1821
+ ethtool_link_ksettings_add_link_mode (lk_ksettings , supported ,
1822
+ Asym_Pause );
1823
+ }
1824
+
1825
+ if (link_info -> support_auto_speeds || link_info -> support_pam4_auto_speeds )
1826
+ ethtool_link_ksettings_add_link_mode (lk_ksettings , supported ,
1827
+ Autoneg );
1828
+
1829
+ if (~link_info -> autoneg & BNXT_AUTONEG_FLOW_CTRL )
1830
+ return ;
1831
+
1832
+ if (link_info -> auto_pause_setting & BNXT_LINK_PAUSE_RX )
1833
+ ethtool_link_ksettings_add_link_mode (lk_ksettings , advertising ,
1834
+ Pause );
1835
+ if (hweight8 (link_info -> auto_pause_setting & BNXT_LINK_PAUSE_BOTH ) == 1 )
1836
+ ethtool_link_ksettings_add_link_mode (lk_ksettings , advertising ,
1837
+ Asym_Pause );
1838
+ if (link_info -> lp_pause & BNXT_LINK_PAUSE_RX )
1839
+ ethtool_link_ksettings_add_link_mode (lk_ksettings ,
1840
+ lp_advertising , Pause );
1841
+ if (hweight8 (link_info -> lp_pause & BNXT_LINK_PAUSE_BOTH ) == 1 )
1842
+ ethtool_link_ksettings_add_link_mode (lk_ksettings ,
1843
+ lp_advertising , Asym_Pause );
1844
+ }
1845
+
1823
1846
static void bnxt_fw_to_ethtool_advertised_fec (struct bnxt_link_info * link_info ,
1824
1847
struct ethtool_link_ksettings * lk_ksettings )
1825
1848
{
@@ -1845,28 +1868,18 @@ static void bnxt_fw_to_ethtool_advertised_spds(struct bnxt_link_info *link_info,
1845
1868
struct ethtool_link_ksettings * lk_ksettings )
1846
1869
{
1847
1870
u16 fw_speeds = link_info -> advertising ;
1848
- u8 fw_pause = 0 ;
1849
1871
1850
- if (link_info -> autoneg & BNXT_AUTONEG_FLOW_CTRL )
1851
- fw_pause = link_info -> auto_pause_setting ;
1852
-
1853
- BNXT_FW_TO_ETHTOOL_SPDS (fw_speeds , fw_pause , lk_ksettings , advertising );
1872
+ BNXT_FW_TO_ETHTOOL_SPDS (fw_speeds , lk_ksettings , advertising );
1854
1873
fw_speeds = link_info -> advertising_pam4 ;
1855
1874
BNXT_FW_TO_ETHTOOL_PAM4_SPDS (fw_speeds , lk_ksettings , advertising );
1856
- bnxt_fw_to_ethtool_advertised_fec (link_info , lk_ksettings );
1857
1875
}
1858
1876
1859
1877
static void bnxt_fw_to_ethtool_lp_adv (struct bnxt_link_info * link_info ,
1860
1878
struct ethtool_link_ksettings * lk_ksettings )
1861
1879
{
1862
1880
u16 fw_speeds = link_info -> lp_auto_link_speeds ;
1863
- u8 fw_pause = 0 ;
1864
-
1865
- if (link_info -> autoneg & BNXT_AUTONEG_FLOW_CTRL )
1866
- fw_pause = link_info -> lp_pause ;
1867
1881
1868
- BNXT_FW_TO_ETHTOOL_SPDS (fw_speeds , fw_pause , lk_ksettings ,
1869
- lp_advertising );
1882
+ BNXT_FW_TO_ETHTOOL_SPDS (fw_speeds , lk_ksettings , lp_advertising );
1870
1883
fw_speeds = link_info -> lp_auto_pam4_link_speeds ;
1871
1884
BNXT_FW_TO_ETHTOOL_PAM4_SPDS (fw_speeds , lk_ksettings , lp_advertising );
1872
1885
}
@@ -1895,25 +1908,11 @@ static void bnxt_fw_to_ethtool_support_fec(struct bnxt_link_info *link_info,
1895
1908
static void bnxt_fw_to_ethtool_support_spds (struct bnxt_link_info * link_info ,
1896
1909
struct ethtool_link_ksettings * lk_ksettings )
1897
1910
{
1898
- struct bnxt * bp = container_of (link_info , struct bnxt , link_info );
1899
1911
u16 fw_speeds = link_info -> support_speeds ;
1900
1912
1901
- BNXT_FW_TO_ETHTOOL_SPDS (fw_speeds , 0 , lk_ksettings , supported );
1913
+ BNXT_FW_TO_ETHTOOL_SPDS (fw_speeds , lk_ksettings , supported );
1902
1914
fw_speeds = link_info -> support_pam4_speeds ;
1903
1915
BNXT_FW_TO_ETHTOOL_PAM4_SPDS (fw_speeds , lk_ksettings , supported );
1904
-
1905
- if (!(bp -> phy_flags & BNXT_PHY_FL_NO_PAUSE )) {
1906
- ethtool_link_ksettings_add_link_mode (lk_ksettings , supported ,
1907
- Pause );
1908
- ethtool_link_ksettings_add_link_mode (lk_ksettings , supported ,
1909
- Asym_Pause );
1910
- }
1911
-
1912
- if (link_info -> support_auto_speeds ||
1913
- link_info -> support_pam4_auto_speeds )
1914
- ethtool_link_ksettings_add_link_mode (lk_ksettings , supported ,
1915
- Autoneg );
1916
- bnxt_fw_to_ethtool_support_fec (link_info , lk_ksettings );
1917
1916
}
1918
1917
1919
1918
u32 bnxt_fw_to_ethtool_speed (u16 fw_link_speed )
@@ -1977,7 +1976,9 @@ static int bnxt_get_link_ksettings(struct net_device *dev,
1977
1976
link_info = & bp -> link_info ;
1978
1977
1979
1978
mutex_lock (& bp -> link_lock );
1979
+ bnxt_get_ethtool_modes (link_info , lk_ksettings );
1980
1980
bnxt_fw_to_ethtool_support_spds (link_info , lk_ksettings );
1981
+ bnxt_fw_to_ethtool_support_fec (link_info , lk_ksettings );
1981
1982
link_mode = bnxt_get_link_mode (link_info );
1982
1983
if (link_mode != BNXT_LINK_MODE_UNKNOWN )
1983
1984
ethtool_params_from_link_mode (lk_ksettings , link_mode );
@@ -1986,6 +1987,7 @@ static int bnxt_get_link_ksettings(struct net_device *dev,
1986
1987
1987
1988
if (link_info -> autoneg ) {
1988
1989
bnxt_fw_to_ethtool_advertised_spds (link_info , lk_ksettings );
1990
+ bnxt_fw_to_ethtool_advertised_fec (link_info , lk_ksettings );
1989
1991
ethtool_link_ksettings_add_link_mode (lk_ksettings ,
1990
1992
advertising , Autoneg );
1991
1993
base -> autoneg = AUTONEG_ENABLE ;
0 commit comments