net: bcmgenet: allow return of power up status
authorDoug Berger <opendmb@gmail.com>
Thu, 6 Mar 2025 19:26:41 +0000 (11:26 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 8 Mar 2025 03:33:48 +0000 (19:33 -0800)
It is possible for a WoL power up to fail due to the GENET being
reset while in the suspend state. Allow these failures to be
returned as error codes to allow different recovery behavior
when necessary.

Signed-off-by: Doug Berger <opendmb@gmail.com>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://patch.msgid.link/20250306192643.2383632-14-opendmb@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/genet/bcmgenet.c
drivers/net/ethernet/broadcom/genet/bcmgenet.h
drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c

index 8aecf56578cbda9e3165833e216301957551f099..8aa575b93e5646b3d7a1ad75b76478818177c190 100644 (file)
@@ -1685,13 +1685,14 @@ static int bcmgenet_power_down(struct bcmgenet_priv *priv,
        return ret;
 }
 
-static void bcmgenet_power_up(struct bcmgenet_priv *priv,
-                             enum bcmgenet_power_mode mode)
+static int bcmgenet_power_up(struct bcmgenet_priv *priv,
+                            enum bcmgenet_power_mode mode)
 {
+       int ret = 0;
        u32 reg;
 
        if (!bcmgenet_has_ext(priv))
-               return;
+               return ret;
 
        reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
 
@@ -1727,11 +1728,13 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv,
                }
                break;
        case GENET_POWER_WOL_MAGIC:
-               bcmgenet_wol_power_up_cfg(priv, mode);
-               return;
+               ret = bcmgenet_wol_power_up_cfg(priv, mode);
+               break;
        default:
                break;
        }
+
+       return ret;
 }
 
 static struct enet_cb *bcmgenet_get_txcb(struct bcmgenet_priv *priv,
index 633fa9aa072620e4ad458610eb86a449b2c5bf5d..c95601898bd443550f6db36f24b6db4dbab70e24 100644 (file)
@@ -724,8 +724,8 @@ void bcmgenet_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol);
 int bcmgenet_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol);
 int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv,
                                enum bcmgenet_power_mode mode);
-void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
-                              enum bcmgenet_power_mode mode);
+int bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
+                             enum bcmgenet_power_mode mode);
 
 void bcmgenet_eee_enable_set(struct net_device *dev, bool enable,
                             bool tx_lpi_enabled);
index 5246214aebc92a1604fd1a1c955c063dbc9bb328..d0f1fa7029176b12f2468c63edda4bb721a46acf 100644 (file)
@@ -227,14 +227,14 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv,
        return 0;
 }
 
-void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
-                              enum bcmgenet_power_mode mode)
+int bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
+                             enum bcmgenet_power_mode mode)
 {
        u32 reg;
 
        if (mode != GENET_POWER_WOL_MAGIC) {
                netif_err(priv, wol, priv->dev, "invalid mode: %d\n", mode);
-               return;
+               return -EINVAL;
        }
 
        clk_disable_unprepare(priv->clk_wol);
@@ -247,7 +247,7 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
        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 */
+                       return -EPERM;  /* already reset so skip the rest */
                reg &= ~(MPD_EN | MPD_PW_EN);
                bcmgenet_umac_writel(priv, reg, UMAC_MPD_CTRL);
        }
@@ -256,7 +256,7 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
        if (priv->wolopts & WAKE_FILTER) {
                reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL);
                if (!(reg & RBUF_ACPI_EN))
-                       return; /* already reset so skip the rest */
+                       return -EPERM;  /* already reset so skip the rest */
                reg &= ~(RBUF_HFB_EN | RBUF_ACPI_EN);
                bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL);
        }
@@ -267,4 +267,6 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
        reg &= ~CMD_CRC_FWD;
        bcmgenet_umac_writel(priv, reg, UMAC_CMD);
        spin_unlock_bh(&priv->reg_lock);
+
+       return 0;
 }