Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f55d84b0 authored by Vincent Palatin's avatar Vincent Palatin Committed by David S. Miller
Browse files

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: default avatarVincent Palatin <vpalatin@chromium.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 14b84e86
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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;