@@ -1494,15 +1494,11 @@ void phy_state_machine(struct work_struct *work)
func = &_phy_start_aneg;
}
- mutex_unlock(&phydev->lock);
-
- if (do_suspend)
- phy_suspend(phydev);
-
- if (err == -ENODEV)
+ if (err == -ENODEV) {
+ mutex_unlock(&phydev->lock);
return;
+ }
- mutex_lock(&phydev->lock);
if (err < 0)
phy_error_precise(phydev, func, err);
@@ -1519,6 +1515,9 @@ void phy_state_machine(struct work_struct *work)
if (phy_polling_mode(phydev) && phy_is_started(phydev))
phy_queue_state_machine(phydev, PHY_STATE_TIME);
mutex_unlock(&phydev->lock);
+
+ if (do_suspend)
+ phy_suspend(phydev);
}
/**
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. Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> --- drivers/net/phy/phy.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)