d40756563c
Let's pick a bunch of useful phylink changes which allow us to keep drivers in sync with mainline Linux. Signed-off-by: Daniel Golle <daniel@makrotopia.org>
56 lines
2.1 KiB
Diff
56 lines
2.1 KiB
Diff
From 11933aa76865621d8e82553c8f3bc07796a5aaa2 Mon Sep 17 00:00:00 2001
|
|
From: "Russell King (Oracle)" <rmk+kernel@armlinux.org.uk>
|
|
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) <rmk+kernel@armlinux.org.uk>
|
|
Link: https://lore.kernel.org/r/E1q4eLm-00Ayxk-GZ@rmk-PC.armlinux.org.uk
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
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) {
|