Commit 6e19b350 authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by David S. Miller

net: phy: move phy_suspend() to end of phy_state_machine()

Move the call to phy_suspend() to the end of phy_state_machine() after
we release the lock so that we can combine the locked areas.
phy_suspend() can not be called while holding phydev->lock as it has
caused deadlocks in the past.
Tested-by: default avatarJijie Shao <shaojijie@huawei.com>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ea5968cd
...@@ -1494,15 +1494,11 @@ void phy_state_machine(struct work_struct *work) ...@@ -1494,15 +1494,11 @@ void phy_state_machine(struct work_struct *work)
func = &_phy_start_aneg; func = &_phy_start_aneg;
} }
mutex_unlock(&phydev->lock); if (err == -ENODEV) {
mutex_unlock(&phydev->lock);
if (do_suspend)
phy_suspend(phydev);
if (err == -ENODEV)
return; return;
}
mutex_lock(&phydev->lock);
if (err < 0) if (err < 0)
phy_error_precise(phydev, func, err); phy_error_precise(phydev, func, err);
...@@ -1519,6 +1515,9 @@ void phy_state_machine(struct work_struct *work) ...@@ -1519,6 +1515,9 @@ void phy_state_machine(struct work_struct *work)
if (phy_polling_mode(phydev) && phy_is_started(phydev)) if (phy_polling_mode(phydev) && phy_is_started(phydev))
phy_queue_state_machine(phydev, PHY_STATE_TIME); phy_queue_state_machine(phydev, PHY_STATE_TIME);
mutex_unlock(&phydev->lock); mutex_unlock(&phydev->lock);
if (do_suspend)
phy_suspend(phydev);
} }
/** /**
......
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