mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-11 03:48:00 +00:00
net: fec: improve safety of suspend/resume/transmit timeout paths
We should hold the rtnl lock while suspending, resuming or processing the transmit timeout to ensure that nothing will interfere while we bring up, take down or restart the hardware. The transmit timeout could run if we're preempted during suspend. Acked-by: Fugang Duan <B38611@freescale.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2167cefc9e
commit
da1774e5f1
@ -1068,8 +1068,10 @@ static void fec_enet_work(struct work_struct *work)
|
||||
|
||||
if (fep->delay_work.timeout) {
|
||||
fep->delay_work.timeout = false;
|
||||
rtnl_lock();
|
||||
fec_restart(fep->netdev, fep->full_duplex);
|
||||
netif_wake_queue(fep->netdev);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
if (fep->delay_work.trig_tx) {
|
||||
@ -2680,11 +2682,14 @@ fec_suspend(struct device *dev)
|
||||
struct net_device *ndev = dev_get_drvdata(dev);
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
|
||||
rtnl_lock();
|
||||
if (netif_running(ndev)) {
|
||||
phy_stop(fep->phy_dev);
|
||||
fec_stop(ndev);
|
||||
netif_device_detach(ndev);
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
fec_enet_clk_enable(ndev, false);
|
||||
pinctrl_pm_select_sleep_state(&fep->pdev->dev);
|
||||
|
||||
@ -2712,11 +2717,13 @@ fec_resume(struct device *dev)
|
||||
if (ret)
|
||||
goto failed_clk;
|
||||
|
||||
rtnl_lock();
|
||||
if (netif_running(ndev)) {
|
||||
fec_restart(ndev, fep->full_duplex);
|
||||
netif_device_attach(ndev);
|
||||
phy_start(fep->phy_dev);
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
return 0;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user