Skip to content

Commit

Permalink
net: phy: move phy_suspend() to end of phy_state_machine()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Russell King (Oracle) authored and David S. Miller committed Sep 17, 2023
1 parent ea5968c commit 6e19b35
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions drivers/net/phy/phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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);
}

/**
Expand Down

0 comments on commit 6e19b35

Please sign in to comment.