diff mbox series

[net,2/3] net: bcmgenet: test RBUF_ACPI_EN when resuming

Message ID 1594942697-37954-3-git-send-email-opendmb@gmail.com
State Accepted
Delegated to: David Miller
Headers show
Series net: bcmgenet: fix WAKE_FILTER resume from deep sleep | expand

Commit Message

Doug Berger July 16, 2020, 11:38 p.m. UTC
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 RBUF_ACPI_EN flag when Wake
on Filter is enabled. A clear flag indicates that the GENET
hardware must have been reset so the remainder of the
hardware programming is bypassed.

Fixes: f50932cca632 ("net: bcmgenet: add WAKE_FILTER support")
Signed-off-by: Doug Berger <opendmb@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

Comments

Florian Fainelli July 17, 2020, 12:37 a.m. UTC | #1
On 7/16/2020 4:38 PM, Doug Berger wrote:
> 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 RBUF_ACPI_EN flag when Wake
> on Filter is enabled. A clear flag indicates that the GENET
> hardware must have been reset so the remainder of the
> hardware programming is bypassed.
> 
> Fixes: f50932cca632 ("net: bcmgenet: add WAKE_FILTER support")
> Signed-off-by: Doug Berger <opendmb@gmail.com>

Acked-by: Florian Fainelli <f.fainelli@gmail.com>
diff mbox series

Patch

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
index def990dbf34f..1c86eddb1b51 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
@@ -229,9 +229,13 @@  void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
 	}
 
 	/* Disable WAKE_FILTER Detection */
-	reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL);
-	reg &= ~(RBUF_HFB_EN | RBUF_ACPI_EN);
-	bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL);
+	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 */
+		reg &= ~(RBUF_HFB_EN | RBUF_ACPI_EN);
+		bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL);
+	}
 
 	/* Disable CRC Forward */
 	reg = bcmgenet_umac_readl(priv, UMAC_CMD);