/*
  * Broadcom GENET (Gigabit Ethernet) controller driver
  *
- * Copyright (c) 2014-2019 Broadcom
+ * Copyright (c) 2014-2020 Broadcom
  */
 
 #define pr_fmt(fmt)                            "bcmgenet: " fmt
        if (ret)
                return ret;
 
+       /* From WOL-enabled suspend, switch to regular clock */
+       if (device_may_wakeup(d) && priv->wolopts)
+               bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC);
+
        /* If this is an internal GPHY, power it back on now, before UniMAC is
         * brought out of reset as absolutely no UniMAC activity is allowed
         */
 
        init_umac(priv);
 
-       /* From WOL-enabled suspend, switch to regular clock */
-       if (priv->wolopts)
-               clk_disable_unprepare(priv->clk_wol);
-
        phy_init_hw(dev->phydev);
 
        /* Speed settings must be restored */
                bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
        }
 
-       if (priv->wolopts)
-               bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC);
-
        /* Disable RX/TX DMA and flush TX queues */
        dma_ctrl = bcmgenet_dma_disable(priv);
 
                phy_suspend(dev->phydev);
 
        /* Prepare the device for Wake-on-LAN and switch to the slow clock */
-       if (device_may_wakeup(d) && priv->wolopts) {
+       if (device_may_wakeup(d) && priv->wolopts)
                ret = bcmgenet_power_down(priv, GENET_POWER_WOL_MAGIC);
-               clk_prepare_enable(priv->clk_wol);
-       } else if (priv->internal_phy) {
+       else if (priv->internal_phy)
                ret = bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
-       }
 
        /* Turn off the clocks */
        clk_disable_unprepare(priv->clk);
 
 /*
  * Broadcom GENET (Gigabit Ethernet) Wake-on-LAN support
  *
- * Copyright (c) 2014-2017 Broadcom
+ * Copyright (c) 2014-2020 Broadcom
  */
 
 #define pr_fmt(fmt)                            "bcmgenet_wol: " fmt
        netif_dbg(priv, wol, dev, "MPD WOL-ready status set after %d msec\n",
                  retries);
 
+       clk_prepare_enable(priv->clk_wol);
+       priv->wol_active = 1;
+
        /* Enable CRC forward */
        reg = bcmgenet_umac_readl(priv, UMAC_CMD);
        priv->crc_fwd_en = 1;
                return;
        }
 
+       if (!priv->wol_active)
+               return; /* failed to suspend so skip the rest */
+
+       priv->wol_active = 0;
+       clk_disable_unprepare(priv->clk_wol);
+
+       /* Disable Magic Packet Detection */
        reg = bcmgenet_umac_readl(priv, UMAC_MPD_CTRL);
-       if (!(reg & MPD_EN))
-               return; /* already powered up so skip the rest */
        reg &= ~(MPD_EN | MPD_PW_EN);
        bcmgenet_umac_writel(priv, reg, UMAC_MPD_CTRL);