net: stmmac: fix power management suspend-resume case
authorSrinivas Kandagatla <srinivas.kandagatla@st.com>
Thu, 16 Jan 2014 10:52:35 +0000 (10:52 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 Jan 2014 23:23:43 +0000 (15:23 -0800)
The driver PM resume assumes that the IP is still powered up and the
all the register contents are not disturbed when it comes out of low
power suspend case. This assumption is wrong, basically the driver
should not consider any state of registers after it comes out of low
power. However driver can keep the part of the IP powered up if its a
wake up source. But it can not assume the register state of the IP. Also
its possible that SOC glue layer can take the power off the IP if its
not wake-up source to reduce the power consumption.

This patch re initializes hardware by calling stmmac_hw_setup function in
resume case.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@st.com>
Acked-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

index 341c8dc321648fdaa3f3b16e2ff0a5027ce80380..742a83f29affcb52f064aab0e8ec9bfa716a48b7 100644 (file)
@@ -2887,18 +2887,19 @@ int stmmac_resume(struct net_device *ndev)
         * this bit because it can generate problems while resuming
         * from another devices (e.g. serial console).
         */
-       if (device_may_wakeup(priv->device))
+       if (device_may_wakeup(priv->device)) {
                priv->hw->mac->pmt(priv->ioaddr, 0);
-       else
+       } else {
                /* enable the clk prevously disabled */
                clk_prepare_enable(priv->stmmac_clk);
+               /* reset the phy so that it's ready */
+               if (priv->mii)
+                       stmmac_mdio_reset(priv->mii);
+       }
 
        netif_device_attach(ndev);
 
-       /* Enable the MAC and DMA */
-       stmmac_set_mac(priv->ioaddr, true);
-       priv->hw->dma->start_tx(priv->ioaddr);
-       priv->hw->dma->start_rx(priv->ioaddr);
+       stmmac_hw_setup(ndev);
 
        napi_enable(&priv->napi);