Commit d9f903f6 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by David S. Miller

net: phy: fix too strict check in phy_start_aneg

When adding checks to detect wrong usage of the phylib API we added
a check to phy_start_aneg() which is too strict. If the phylib
state machine is in state PHY_HALTED we should allow reconfiguring
and restarting aneg, and just don't touch the state.

Fixes: 2b3e88ea ("net: phy: improve phy state checking")
Reported-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Tested-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5642e27b
...@@ -543,13 +543,6 @@ int phy_start_aneg(struct phy_device *phydev) ...@@ -543,13 +543,6 @@ int phy_start_aneg(struct phy_device *phydev)
mutex_lock(&phydev->lock); mutex_lock(&phydev->lock);
if (!__phy_is_started(phydev)) {
WARN(1, "called from state %s\n",
phy_state_to_str(phydev->state));
err = -EBUSY;
goto out_unlock;
}
if (AUTONEG_DISABLE == phydev->autoneg) if (AUTONEG_DISABLE == phydev->autoneg)
phy_sanitize_settings(phydev); phy_sanitize_settings(phydev);
...@@ -560,11 +553,13 @@ int phy_start_aneg(struct phy_device *phydev) ...@@ -560,11 +553,13 @@ int phy_start_aneg(struct phy_device *phydev)
if (err < 0) if (err < 0)
goto out_unlock; goto out_unlock;
if (phydev->autoneg == AUTONEG_ENABLE) { if (__phy_is_started(phydev)) {
err = phy_check_link_status(phydev); if (phydev->autoneg == AUTONEG_ENABLE) {
} else { err = phy_check_link_status(phydev);
phydev->state = PHY_FORCING; } else {
phydev->link_timeout = PHY_FORCE_TIMEOUT; phydev->state = PHY_FORCING;
phydev->link_timeout = PHY_FORCE_TIMEOUT;
}
} }
out_unlock: out_unlock:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment