]> git.dujemihanovic.xyz Git - linux.git/commitdiff
igc: Fix ambiguity in the ethtool advertising
authorSasha Neftin <sasha.neftin@intel.com>
Thu, 19 Oct 2023 20:36:41 +0000 (13:36 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 21 Oct 2023 01:15:38 +0000 (18:15 -0700)
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: 8c5ad0dae93c ("igc: Add ethtool support")
Suggested-by: Dima Ruinskiy <dima.ruinskiy@intel.com>
Suggested-by: Vitaly Lifshits <vitaly.lifshits@intel.com>
Signed-off-by: Sasha Neftin <sasha.neftin@intel.com>
Tested-by: Naama Meir <naamax.meir@linux.intel.com>
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://lore.kernel.org/r/20231019203641.3661960-1-jacob.e.keller@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/intel/igc/igc_ethtool.c

index 7ab6dd58e40013614a9174686200841393530e30..dd8a9d27a1670c9ec536278c14332a7d1b4f9391 100644 (file)
@@ -1817,7 +1817,7 @@ igc_ethtool_set_link_ksettings(struct net_device *netdev,
        struct igc_adapter *adapter = netdev_priv(netdev);
        struct net_device *dev = adapter->netdev;
        struct igc_hw *hw = &adapter->hw;
-       u32 advertising;
+       u16 advertised = 0;
 
        /* When adapter in resetting mode, autoneg/speed/duplex
         * cannot be changed
@@ -1842,18 +1842,33 @@ igc_ethtool_set_link_ksettings(struct net_device *netdev,
        while (test_and_set_bit(__IGC_RESETTING, &adapter->state))
                usleep_range(1000, 2000);
 
-       ethtool_convert_link_mode_to_legacy_u32(&advertising,
-                                               cmd->link_modes.advertising);
-       /* Converting to legacy u32 drops ETHTOOL_LINK_MODE_2500baseT_Full_BIT.
-        * We have to check this and convert it to ADVERTISE_2500_FULL
-        * (aka ETHTOOL_LINK_MODE_2500baseX_Full_BIT) explicitly.
-        */
-       if (ethtool_link_ksettings_test_link_mode(cmd, advertising, 2500baseT_Full))
-               advertising |= ADVERTISE_2500_FULL;
+       if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
+                                                 2500baseT_Full))
+               advertised |= ADVERTISE_2500_FULL;
+
+       if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
+                                                 1000baseT_Full))
+               advertised |= ADVERTISE_1000_FULL;
+
+       if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
+                                                 100baseT_Full))
+               advertised |= ADVERTISE_100_FULL;
+
+       if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
+                                                 100baseT_Half))
+               advertised |= ADVERTISE_100_HALF;
+
+       if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
+                                                 10baseT_Full))
+               advertised |= ADVERTISE_10_FULL;
+
+       if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
+                                                 10baseT_Half))
+               advertised |= ADVERTISE_10_HALF;
 
        if (cmd->base.autoneg == AUTONEG_ENABLE) {
                hw->mac.autoneg = 1;
-               hw->phy.autoneg_advertised = advertising;
+               hw->phy.autoneg_advertised = advertised;
                if (adapter->fc_autoneg)
                        hw->fc.requested_mode = igc_fc_default;
        } else {