Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec885679 authored by Sasha Neftin's avatar Sasha Neftin Committed by Greg Kroah-Hartman
Browse files

igc: Fix ambiguity in the ethtool advertising



[ Upstream commit e7684d29efdf37304c62bb337ea55b3428ca118e ]

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: 8c5ad0da ("igc: Add ethtool support")
Suggested-by: default avatarDima Ruinskiy <dima.ruinskiy@intel.com>
Suggested-by: default avatarVitaly Lifshits <vitaly.lifshits@intel.com>
Signed-off-by: default avatarSasha Neftin <sasha.neftin@intel.com>
Tested-by: default avatarNaama Meir <naamax.meir@linux.intel.com>
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Link: https://lore.kernel.org/r/20231019203641.3661960-1-jacob.e.keller@intel.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 3b098eda
Loading
Loading
Loading
Loading
+25 −10
Original line number Diff line number Diff line
@@ -1768,7 +1768,7 @@ static int igc_set_link_ksettings(struct net_device *netdev,
{
	struct igc_adapter *adapter = netdev_priv(netdev);
	struct igc_hw *hw = &adapter->hw;
	u32 advertising;
	u16 advertised = 0;

	/* When adapter in resetting mode, autoneg/speed/duplex
	 * cannot be changed
@@ -1794,18 +1794,33 @@ static int igc_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 {