From a74b7e27d4475ab8ffdd6587d990531dbdf313b0 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Fri, 12 Mar 2021 18:04:43 -0500 Subject: [PATCH] Fixes for 4.19 Signed-off-by: Sasha Levin --- ...-wrong-speed-and-duplex-problem-if-a.patch | 58 +++++++++++++++++++ queue-4.19/series | 1 + 2 files changed, 59 insertions(+) create mode 100644 queue-4.19/net-phy-fix-save-wrong-speed-and-duplex-problem-if-a.patch diff --git a/queue-4.19/net-phy-fix-save-wrong-speed-and-duplex-problem-if-a.patch b/queue-4.19/net-phy-fix-save-wrong-speed-and-duplex-problem-if-a.patch new file mode 100644 index 00000000000..824865e86aa --- /dev/null +++ b/queue-4.19/net-phy-fix-save-wrong-speed-and-duplex-problem-if-a.patch @@ -0,0 +1,58 @@ +From 54d53f24411977e8a9f51cc5bb0c1ed50032b6cb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 27 Feb 2021 11:05:58 +0800 +Subject: net: phy: fix save wrong speed and duplex problem if autoneg is on + +From: Guangbin Huang + +[ Upstream commit d9032dba5a2b2bbf0fdce67c8795300ec9923b43 ] + +If phy uses generic driver and autoneg is on, enter command +"ethtool -s eth0 speed 50" will not change phy speed actually, but +command "ethtool eth0" shows speed is 50Mb/s because phydev->speed +has been set to 50 and no update later. + +And duplex setting has same problem too. + +However, if autoneg is on, phy only changes speed and duplex according to +phydev->advertising, but not phydev->speed and phydev->duplex. So in this +case, phydev->speed and phydev->duplex don't need to be set in function +phy_ethtool_ksettings_set() if autoneg is on. + +Fixes: 51e2a3846eab ("PHY: Avoid unnecessary aneg restarts") +Signed-off-by: Guangbin Huang +Signed-off-by: Huazhong Tan +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/phy/phy.c | 7 ++++--- + 1 file changed, 4 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c +index cc454b8c032c..dd4bf4265a5e 100644 +--- a/drivers/net/phy/phy.c ++++ b/drivers/net/phy/phy.c +@@ -335,7 +335,10 @@ int phy_ethtool_ksettings_set(struct phy_device *phydev, + + phydev->autoneg = autoneg; + +- phydev->speed = speed; ++ if (autoneg == AUTONEG_DISABLE) { ++ phydev->speed = speed; ++ phydev->duplex = duplex; ++ } + + phydev->advertising = advertising; + +@@ -344,8 +347,6 @@ int phy_ethtool_ksettings_set(struct phy_device *phydev, + else + phydev->advertising &= ~ADVERTISED_Autoneg; + +- phydev->duplex = duplex; +- + phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl; + + /* Restart the PHY */ +-- +2.30.1 + diff --git a/queue-4.19/series b/queue-4.19/series index a565c483193..1a7c09b7539 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -38,3 +38,4 @@ sh_eth-fix-trscer-mask-for-r7s9210.patch media-usbtv-fix-deadlock-on-suspend.patch media-v4l-vsp1-fix-uif-null-pointer-access.patch media-v4l-vsp1-fix-bru-null-pointer-access.patch +net-phy-fix-save-wrong-speed-and-duplex-problem-if-a.patch -- 2.47.3