MLK-12160 net: fec: disable all irqs during normal suspend
authorFugang Duan <b38611@freescale.com>
Fri, 8 Jan 2016 05:24:41 +0000 (13:24 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 19:49:41 +0000 (14:49 -0500)
During normal suspend process, disable all irqs to avoid the late
TXF interrupt comming after clocks disabled that accessing registers
cause system hang.

Signed-off-by: Fugang Duan <B38611@freescale.com>
drivers/net/ethernet/freescale/fec.h
drivers/net/ethernet/freescale/fec_main.c

index 9e6e6f1..2982850 100644 (file)
@@ -380,7 +380,6 @@ struct bufdesc_ex {
 #define FEC_DEFAULT_IMASK (FEC_ENET_TXF | FEC_ENET_RXF | FEC_ENET_MII | FEC_ENET_TS_TIMER)
 #define FEC_NAPI_IMASK (FEC_ENET_MII | FEC_ENET_TS_TIMER)
 #define FEC_RX_DISABLED_IMASK (FEC_DEFAULT_IMASK & (~FEC_ENET_RXF))
-#define FEC_TIMER_DISABLED_IMASK (FEC_DEFAULT_IMASK & (~FEC_ENET_TS_TIMER))
 
 #define FEC_ENET_ETHEREN       ((uint)0x00000002)
 
index 3f4ccd0..ba4c275 100644 (file)
@@ -1111,6 +1111,13 @@ static int fec_enet_stop_mode(struct fec_enet_private *fep, bool enabled)
        return 0;
 }
 
+static inline void fec_irqs_disable(struct net_device *ndev)
+{
+       struct fec_enet_private *fep = netdev_priv(ndev);
+
+       writel(0, fep->hwp + FEC_IMASK);
+}
+
 static void
 fec_stop(struct net_device *ndev)
 {
@@ -1137,9 +1144,9 @@ fec_stop(struct net_device *ndev)
                        writel(1, fep->hwp + FEC_ECNTRL);
                        udelay(10);
                }
-               writel(FEC_TIMER_DISABLED_IMASK, fep->hwp + FEC_IMASK);
+               writel(FEC_ENET_MII, fep->hwp + FEC_IMASK);
        } else {
-               writel(FEC_TIMER_DISABLED_IMASK | FEC_ENET_WAKEUP, fep->hwp + FEC_IMASK);
+               writel(FEC_ENET_MII | FEC_ENET_WAKEUP, fep->hwp + FEC_IMASK);
                val = readl(fep->hwp + FEC_ECNTRL);
                val |= (FEC_ECR_MAGICEN | FEC_ECR_SLEEP);
                writel(val, fep->hwp + FEC_ECNTRL);
@@ -3697,6 +3704,7 @@ static int __maybe_unused fec_suspend(struct device *dev)
                netif_tx_unlock_bh(ndev);
                fec_stop(ndev);
                if (!(fep->wol_flag & FEC_WOL_FLAG_ENABLE)) {
+                       fec_irqs_disable(ndev);
                        pinctrl_pm_select_sleep_state(&fep->pdev->dev);
                } else {
                        disable_irq(fep->wake_irq);