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: Jijie Shao <shaojijie@huawei.com> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ea5968cd7d
commit
6e19b3502c
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user