]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: phy: fix duplex out of sync problem while changing settings
authorHeiner Kallweit <hkallweit1@gmail.com>
Wed, 3 Nov 2021 21:08:28 +0000 (22:08 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Nov 2021 10:04:39 +0000 (11:04 +0100)
[ Upstream commit a4db9055fdb9cf607775c66d39796caf6439ec92 ]

As reported by Zhang there's a small issue if in forced mode the duplex
mode changes with the link staying up [0]. In this case the MAC isn't
notified about the change.

The proposed patch relies on the phylib state machine and ignores the
fact that there are drivers that uses phylib but not the phylib state
machine. So let's don't change the behavior for such drivers and fix
it w/o re-adding state PHY_FORCING for the case that phylib state
machine is used.

[0] https://lore.kernel.org/netdev/a5c26ffd-4ee4-a5e6-4103-873208ce0dc5@huawei.com/T/

Fixes: 2bd229df5e2e ("net: phy: remove state PHY_FORCING")
Reported-by: Zhang Changzhong <zhangchangzhong@huawei.com>
Tested-by: Zhang Changzhong <zhangchangzhong@huawei.com>
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Link: https://lore.kernel.org/r/7b8b9456-a93f-abbc-1dc5-a2c2542f932c@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/phy/phy.c

index cbf344c5db610e87fbdbd5979f98d166b4d75c1b..451adee132139d394c36c7e730a094ea68a0b9eb 100644 (file)
@@ -815,7 +815,12 @@ int phy_ethtool_ksettings_set(struct phy_device *phydev,
        phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl;
 
        /* Restart the PHY */
-       _phy_start_aneg(phydev);
+       if (phy_is_started(phydev)) {
+               phydev->state = PHY_UP;
+               phy_trigger_machine(phydev);
+       } else {
+               _phy_start_aneg(phydev);
+       }
 
        mutex_unlock(&phydev->lock);
        return 0;