stmmac: do not sleep in atomic context for mdio_reset
stmmac_mdio_reset() has been updated to use msleep rather udelay (as some PHY requires a one second delay there). It called from stmmac_resume() within the spin_lock_irqsave block atomic context triggering 'scheduling while atomic'. The stmmac_priv lock usage is not fully documented, but it seems to protect the access to the MAC registers / DMA structures rather than the MDIO bus or the PHY (which have separate locking), so we can push the spin_lock after the stmmac_mdio_reset call. Signed-off-by: Vincent Palatin <vpalatin@chromium.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
14b84e8654
commit
f55d84b07c
|
@ -3450,8 +3450,6 @@ int stmmac_resume(struct device *dev)
|
|||
if (!netif_running(ndev))
|
||||
return 0;
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
/* Power Down bit, into the PM register, is cleared
|
||||
* automatically as soon as a magic packet or a Wake-up frame
|
||||
* is received. Anyway, it's better to manually clear
|
||||
|
@ -3459,7 +3457,9 @@ int stmmac_resume(struct device *dev)
|
|||
* from another devices (e.g. serial console).
|
||||
*/
|
||||
if (device_may_wakeup(priv->device)) {
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
priv->hw->mac->pmt(priv->hw, 0);
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
priv->irq_wake = 0;
|
||||
} else {
|
||||
pinctrl_pm_select_default_state(priv->device);
|
||||
|
@ -3473,6 +3473,8 @@ int stmmac_resume(struct device *dev)
|
|||
|
||||
netif_device_attach(ndev);
|
||||
|
||||
spin_lock_irqsave(&priv->lock, flags);
|
||||
|
||||
priv->cur_rx = 0;
|
||||
priv->dirty_rx = 0;
|
||||
priv->dirty_tx = 0;
|
||||
|
|
Loading…
Reference in New Issue