From: Giuseppe CAVALLARO Date: Sun, 13 May 2012 22:18:43 +0000 (+0000) Subject: stmmac: fix suspend/resume locking X-Git-Tag: v3.5-rc1~109^2~73 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f8c5a875c9124cb6439f0c97ada3570faa0d6860;p=platform%2Fupstream%2Fkernel-adaptation-pc.git stmmac: fix suspend/resume locking Upon resume from standby, there is a possible interrupt unsafe locking scenario raised when configure the Kernel with CONFIG_PROVE_LOCKING. So this patch fixes that in PM driver stuff by calling lock/unlock_irqsave/restore. Signed-off-by: Giuseppe Cavallaro Signed-off-by: David S. Miller --- diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index d1d0840..d07bc6d 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -1989,6 +1989,7 @@ int stmmac_suspend(struct net_device *ndev) { struct stmmac_priv *priv = netdev_priv(ndev); int dis_ic = 0; + unsigned long flags; if (!ndev || !netif_running(ndev)) return 0; @@ -1996,7 +1997,7 @@ int stmmac_suspend(struct net_device *ndev) if (priv->phydev) phy_stop(priv->phydev); - spin_lock(&priv->lock); + spin_lock_irqsave(&priv->lock, flags); netif_device_detach(ndev); netif_stop_queue(ndev); @@ -2024,18 +2025,19 @@ int stmmac_suspend(struct net_device *ndev) /* Disable clock in case of PWM is off */ stmmac_clk_disable(priv); } - spin_unlock(&priv->lock); + spin_unlock_irqrestore(&priv->lock, flags); return 0; } int stmmac_resume(struct net_device *ndev) { struct stmmac_priv *priv = netdev_priv(ndev); + unsigned long flags; if (!netif_running(ndev)) return 0; - spin_lock(&priv->lock); + 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 @@ -2063,7 +2065,7 @@ int stmmac_resume(struct net_device *ndev) netif_start_queue(ndev); - spin_unlock(&priv->lock); + spin_unlock_irqrestore(&priv->lock, flags); if (priv->phydev) phy_start(priv->phydev);