Skip to content

Commit e7684d2

Browse files
aneftinkuba-moo
authored andcommitted
igc: Fix ambiguity in the ethtool advertising
The 'ethtool_convert_link_mode_to_legacy_u32' method does not allow us to advertise 2500M speed support and TP (twisted pair) properly. Convert to 'ethtool_link_ksettings_test_link_mode' to advertise supported speed and eliminate ambiguity. Fixes: 8c5ad0d ("igc: Add ethtool support") Suggested-by: Dima Ruinskiy <[email protected]> Suggested-by: Vitaly Lifshits <[email protected]> Signed-off-by: Sasha Neftin <[email protected]> Tested-by: Naama Meir <[email protected]> Signed-off-by: Jacob Keller <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent a9beb7e commit e7684d2

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

drivers/net/ethernet/intel/igc/igc_ethtool.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1817,7 +1817,7 @@ igc_ethtool_set_link_ksettings(struct net_device *netdev,
18171817
struct igc_adapter *adapter = netdev_priv(netdev);
18181818
struct net_device *dev = adapter->netdev;
18191819
struct igc_hw *hw = &adapter->hw;
1820-
u32 advertising;
1820+
u16 advertised = 0;
18211821

18221822
/* When adapter in resetting mode, autoneg/speed/duplex
18231823
* cannot be changed
@@ -1842,18 +1842,33 @@ igc_ethtool_set_link_ksettings(struct net_device *netdev,
18421842
while (test_and_set_bit(__IGC_RESETTING, &adapter->state))
18431843
usleep_range(1000, 2000);
18441844

1845-
ethtool_convert_link_mode_to_legacy_u32(&advertising,
1846-
cmd->link_modes.advertising);
1847-
/* Converting to legacy u32 drops ETHTOOL_LINK_MODE_2500baseT_Full_BIT.
1848-
* We have to check this and convert it to ADVERTISE_2500_FULL
1849-
* (aka ETHTOOL_LINK_MODE_2500baseX_Full_BIT) explicitly.
1850-
*/
1851-
if (ethtool_link_ksettings_test_link_mode(cmd, advertising, 2500baseT_Full))
1852-
advertising |= ADVERTISE_2500_FULL;
1845+
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
1846+
2500baseT_Full))
1847+
advertised |= ADVERTISE_2500_FULL;
1848+
1849+
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
1850+
1000baseT_Full))
1851+
advertised |= ADVERTISE_1000_FULL;
1852+
1853+
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
1854+
100baseT_Full))
1855+
advertised |= ADVERTISE_100_FULL;
1856+
1857+
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
1858+
100baseT_Half))
1859+
advertised |= ADVERTISE_100_HALF;
1860+
1861+
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
1862+
10baseT_Full))
1863+
advertised |= ADVERTISE_10_FULL;
1864+
1865+
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
1866+
10baseT_Half))
1867+
advertised |= ADVERTISE_10_HALF;
18531868

18541869
if (cmd->base.autoneg == AUTONEG_ENABLE) {
18551870
hw->mac.autoneg = 1;
1856-
hw->phy.autoneg_advertised = advertising;
1871+
hw->phy.autoneg_advertised = advertised;
18571872
if (adapter->fc_autoneg)
18581873
hw->fc.requested_mode = igc_fc_default;
18591874
} else {

0 commit comments

Comments
 (0)