net: bcmgenet: test MPD_EN when resuming
authorDoug Berger <opendmb@gmail.com>
Thu, 16 Jul 2020 23:38:15 +0000 (16:38 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 17 Jul 2020 20:00:27 +0000 (13:00 -0700)
When the GENET driver resumes from deep sleep the UMAC_CMD
register may not be accessible and therefore should not be
accessed from bcmgenet_wol_power_up_cfg() if the GENET has
been reset.

This commit adds a check of the MPD_EN flag when Wake on
Magic Packet is enabled. A clear flag indicates that the
GENET hardware must have been reset so the remainder of the
hardware programming is bypassed.

Fixes: 1a1d5106c1e3 ("net: bcmgenet: move clk_wol management to bcmgenet_wol")
Signed-off-by: Doug Berger <opendmb@gmail.com>
Acked-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c

index 4ea6a26..def990d 100644 (file)
@@ -217,11 +217,16 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
 
        priv->wol_active = 0;
        clk_disable_unprepare(priv->clk_wol);
+       priv->crc_fwd_en = 0;
 
        /* Disable Magic Packet Detection */
-       reg = bcmgenet_umac_readl(priv, UMAC_MPD_CTRL);
-       reg &= ~(MPD_EN | MPD_PW_EN);
-       bcmgenet_umac_writel(priv, reg, UMAC_MPD_CTRL);
+       if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE)) {
+               reg = bcmgenet_umac_readl(priv, UMAC_MPD_CTRL);
+               if (!(reg & MPD_EN))
+                       return; /* already reset so skip the rest */
+               reg &= ~(MPD_EN | MPD_PW_EN);
+               bcmgenet_umac_writel(priv, reg, UMAC_MPD_CTRL);
+       }
 
        /* Disable WAKE_FILTER Detection */
        reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL);
@@ -232,5 +237,4 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
        reg = bcmgenet_umac_readl(priv, UMAC_CMD);
        reg &= ~CMD_CRC_FWD;
        bcmgenet_umac_writel(priv, reg, UMAC_CMD);
-       priv->crc_fwd_en = 0;
 }