linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/2] net: bcmgenet: fix aborted suspend
@ 2018-11-17  2:00 Doug Berger
  2018-11-17  2:00 ` [PATCH net-next 1/2] net: bcmgenet: code movement Doug Berger
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Doug Berger @ 2018-11-17  2:00 UTC (permalink / raw)
  To: David S. Miller
  Cc: Florian Fainelli, netdev, linux-kernel, YueHaibing, Doug Berger

It is not enough to return an error code from the driver suspend
routine. The driver must also restore the device functionality.

This commit corrects the issue introduced by commit 0db55093b566 
("net: bcmgenet: return correct value 'ret' from bcmgenet_power_down")
by calling the driver resume function if the suspend function returns
an error.

Doug Berger (2):
  net: bcmgenet: code movement
  net: bcmgenet: abort suspend on error

 drivers/net/ethernet/broadcom/genet/bcmgenet.c     | 63 +++++++++++-----------
 drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c |  6 +++
 2 files changed, 39 insertions(+), 30 deletions(-)

-- 
2.7.4


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH net-next 1/2] net: bcmgenet: code movement
  2018-11-17  2:00 [PATCH net-next 0/2] net: bcmgenet: fix aborted suspend Doug Berger
@ 2018-11-17  2:00 ` Doug Berger
  2018-11-17 19:51   ` Florian Fainelli
  2018-11-17  2:00 ` [PATCH net-next 2/2] net: bcmgenet: abort suspend on error Doug Berger
  2018-11-18  6:04 ` [PATCH net-next 0/2] net: bcmgenet: fix aborted suspend David Miller
  2 siblings, 1 reply; 6+ messages in thread
From: Doug Berger @ 2018-11-17  2:00 UTC (permalink / raw)
  To: David S. Miller
  Cc: Florian Fainelli, netdev, linux-kernel, YueHaibing, Doug Berger

This commit switches the order of bcmgenet_suspend and bcmgenet_resume
in the file to prevent the need for a forward declaration in the next
commit and to make the review of that commit easier.

Signed-off-by: Doug Berger <opendmb@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 60 +++++++++++++-------------
 1 file changed, 30 insertions(+), 30 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index bf88749505a9..01c8499fd87f 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -3612,36 +3612,6 @@ static int bcmgenet_remove(struct platform_device *pdev)
 }
 
 #ifdef CONFIG_PM_SLEEP
-static int bcmgenet_suspend(struct device *d)
-{
-	struct net_device *dev = dev_get_drvdata(d);
-	struct bcmgenet_priv *priv = netdev_priv(dev);
-	int ret = 0;
-
-	if (!netif_running(dev))
-		return 0;
-
-	netif_device_detach(dev);
-
-	bcmgenet_netif_stop(dev);
-
-	if (!device_may_wakeup(d))
-		phy_suspend(dev->phydev);
-
-	/* Prepare the device for Wake-on-LAN and switch to the slow clock */
-	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) {
-		ret = bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
-	}
-
-	/* Turn off the clocks */
-	clk_disable_unprepare(priv->clk);
-
-	return ret;
-}
-
 static int bcmgenet_resume(struct device *d)
 {
 	struct net_device *dev = dev_get_drvdata(d);
@@ -3719,6 +3689,36 @@ static int bcmgenet_resume(struct device *d)
 	clk_disable_unprepare(priv->clk);
 	return ret;
 }
+
+static int bcmgenet_suspend(struct device *d)
+{
+	struct net_device *dev = dev_get_drvdata(d);
+	struct bcmgenet_priv *priv = netdev_priv(dev);
+	int ret = 0;
+
+	if (!netif_running(dev))
+		return 0;
+
+	netif_device_detach(dev);
+
+	bcmgenet_netif_stop(dev);
+
+	if (!device_may_wakeup(d))
+		phy_suspend(dev->phydev);
+
+	/* Prepare the device for Wake-on-LAN and switch to the slow clock */
+	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) {
+		ret = bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
+	}
+
+	/* Turn off the clocks */
+	clk_disable_unprepare(priv->clk);
+
+	return ret;
+}
 #endif /* CONFIG_PM_SLEEP */
 
 static SIMPLE_DEV_PM_OPS(bcmgenet_pm_ops, bcmgenet_suspend, bcmgenet_resume);
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 2/2] net: bcmgenet: abort suspend on error
  2018-11-17  2:00 [PATCH net-next 0/2] net: bcmgenet: fix aborted suspend Doug Berger
  2018-11-17  2:00 ` [PATCH net-next 1/2] net: bcmgenet: code movement Doug Berger
@ 2018-11-17  2:00 ` Doug Berger
  2018-11-17 19:52   ` Florian Fainelli
  2018-11-18  6:04 ` [PATCH net-next 0/2] net: bcmgenet: fix aborted suspend David Miller
  2 siblings, 1 reply; 6+ messages in thread
From: Doug Berger @ 2018-11-17  2:00 UTC (permalink / raw)
  To: David S. Miller
  Cc: Florian Fainelli, netdev, linux-kernel, YueHaibing, Doug Berger

If an error occurs during suspension of the driver the driver should
restore the hardware configuration and return an error to force the
system to resume.

Fixes: 0db55093b566 ("net: bcmgenet: return correct value 'ret' from bcmgenet_power_down")
Signed-off-by: Doug Berger <opendmb@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmgenet.c     | 3 +++
 drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c | 6 ++++++
 2 files changed, 9 insertions(+)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 01c8499fd87f..983245c0867c 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -3717,6 +3717,9 @@ static int bcmgenet_suspend(struct device *d)
 	/* Turn off the clocks */
 	clk_disable_unprepare(priv->clk);
 
+	if (ret)
+		bcmgenet_resume(d);
+
 	return ret;
 }
 #endif /* CONFIG_PM_SLEEP */
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
index 2fbd027f0148..b3596e0ee47b 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
@@ -186,9 +186,15 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv,
 	}
 
 	reg = bcmgenet_umac_readl(priv, UMAC_MPD_CTRL);
+	if (!(reg & MPD_EN))
+		return;	/* already powered up so skip the rest */
 	reg &= ~MPD_EN;
 	bcmgenet_umac_writel(priv, reg, UMAC_MPD_CTRL);
 
+	reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL);
+	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);
 	reg &= ~CMD_CRC_FWD;
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 1/2] net: bcmgenet: code movement
  2018-11-17  2:00 ` [PATCH net-next 1/2] net: bcmgenet: code movement Doug Berger
@ 2018-11-17 19:51   ` Florian Fainelli
  0 siblings, 0 replies; 6+ messages in thread
From: Florian Fainelli @ 2018-11-17 19:51 UTC (permalink / raw)
  To: Doug Berger, David S. Miller; +Cc: netdev, linux-kernel, YueHaibing



On 16/11/2018 18:00, Doug Berger wrote:
> This commit switches the order of bcmgenet_suspend and bcmgenet_resume
> in the file to prevent the need for a forward declaration in the next
> commit and to make the review of that commit easier.
> 
> Signed-off-by: Doug Berger <opendmb@gmail.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 2/2] net: bcmgenet: abort suspend on error
  2018-11-17  2:00 ` [PATCH net-next 2/2] net: bcmgenet: abort suspend on error Doug Berger
@ 2018-11-17 19:52   ` Florian Fainelli
  0 siblings, 0 replies; 6+ messages in thread
From: Florian Fainelli @ 2018-11-17 19:52 UTC (permalink / raw)
  To: Doug Berger, David S. Miller; +Cc: netdev, linux-kernel, YueHaibing



On 16/11/2018 18:00, Doug Berger wrote:
> If an error occurs during suspension of the driver the driver should
> restore the hardware configuration and return an error to force the
> system to resume.
> 
> Fixes: 0db55093b566 ("net: bcmgenet: return correct value 'ret' from bcmgenet_power_down")
> Signed-off-by: Doug Berger <opendmb@gmail.com>

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
-- 
Florian

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 0/2] net: bcmgenet: fix aborted suspend
  2018-11-17  2:00 [PATCH net-next 0/2] net: bcmgenet: fix aborted suspend Doug Berger
  2018-11-17  2:00 ` [PATCH net-next 1/2] net: bcmgenet: code movement Doug Berger
  2018-11-17  2:00 ` [PATCH net-next 2/2] net: bcmgenet: abort suspend on error Doug Berger
@ 2018-11-18  6:04 ` David Miller
  2 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2018-11-18  6:04 UTC (permalink / raw)
  To: opendmb; +Cc: f.fainelli, netdev, linux-kernel, yuehaibing

From: Doug Berger <opendmb@gmail.com>
Date: Fri, 16 Nov 2018 18:00:20 -0800

> It is not enough to return an error code from the driver suspend
> routine. The driver must also restore the device functionality.
> 
> This commit corrects the issue introduced by commit 0db55093b566 
> ("net: bcmgenet: return correct value 'ret' from bcmgenet_power_down")
> by calling the driver resume function if the suspend function returns
> an error.

Series applied.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2018-11-18  6:04 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-17  2:00 [PATCH net-next 0/2] net: bcmgenet: fix aborted suspend Doug Berger
2018-11-17  2:00 ` [PATCH net-next 1/2] net: bcmgenet: code movement Doug Berger
2018-11-17 19:51   ` Florian Fainelli
2018-11-17  2:00 ` [PATCH net-next 2/2] net: bcmgenet: abort suspend on error Doug Berger
2018-11-17 19:52   ` Florian Fainelli
2018-11-18  6:04 ` [PATCH net-next 0/2] net: bcmgenet: fix aborted suspend David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).