12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- From 11933aa76865621d8e82553c8f3bc07796a5aaa2 Mon Sep 17 00:00:00 2001
- From: "Russell King (Oracle)" <[email protected]>
- Date: Thu, 1 Jun 2023 10:12:06 +0100
- Subject: [PATCH 20/21] net: phylink: actually fix ksettings_set() ethtool call
- Raju Lakkaraju reported that the below commit caused a regression
- with Lan743x drivers and a 2.5G SFP. Sadly, this is because the commit
- was utterly wrong. Let's fix this properly by not moving the
- linkmode_and(), but instead copying the link ksettings and then
- modifying the advertising mask before passing the modified link
- ksettings to phylib.
- Fixes: df0acdc59b09 ("net: phylink: fix ksettings_set() ethtool call")
- Signed-off-by: Russell King (Oracle) <[email protected]>
- Link: https://lore.kernel.org/r/[email protected]
- Signed-off-by: Jakub Kicinski <[email protected]>
- ---
- drivers/net/phy/phylink.c | 15 ++++++++++-----
- 1 file changed, 10 insertions(+), 5 deletions(-)
- --- a/drivers/net/phy/phylink.c
- +++ b/drivers/net/phy/phylink.c
- @@ -2259,11 +2259,13 @@ int phylink_ethtool_ksettings_set(struct
-
- ASSERT_RTNL();
-
- - /* Mask out unsupported advertisements */
- - linkmode_and(config.advertising, kset->link_modes.advertising,
- - pl->supported);
- -
- if (pl->phydev) {
- + struct ethtool_link_ksettings phy_kset = *kset;
- +
- + linkmode_and(phy_kset.link_modes.advertising,
- + phy_kset.link_modes.advertising,
- + pl->supported);
- +
- /* We can rely on phylib for this update; we also do not need
- * to update the pl->link_config settings:
- * - the configuration returned via ksettings_get() will come
- @@ -2282,10 +2284,13 @@ int phylink_ethtool_ksettings_set(struct
- * the presence of a PHY, this should not be changed as that
- * should be determined from the media side advertisement.
- */
- - return phy_ethtool_ksettings_set(pl->phydev, kset);
- + return phy_ethtool_ksettings_set(pl->phydev, &phy_kset);
- }
-
- config = pl->link_config;
- + /* Mask out unsupported advertisements */
- + linkmode_and(config.advertising, kset->link_modes.advertising,
- + pl->supported);
-
- /* FIXME: should we reject autoneg if phy/mac does not support it? */
- switch (kset->base.autoneg) {
|