* [PATCH] net: ethernet : stmicro: fixed power suspend and resume failure in stmmac driver
@ 2014-09-30 5:55 hliang1025
2014-09-30 13:00 ` Giuseppe CAVALLARO
2014-09-30 19:10 ` David Miller
0 siblings, 2 replies; 6+ messages in thread
From: hliang1025 @ 2014-09-30 5:55 UTC (permalink / raw)
To: peppe.cavallaro; +Cc: netdev, linux-kernel, adi-linux-docs, Hao Liang
From: Hao Liang <hliang1025@gmail.com>
This is the fix for a power management issue caused by suspend and resume function in stmmac_main.c.
After enable CONFIG_DEBUG_ATOMIC_SLEEP which enable sleep-inside atomic section checking, power
managemet can not work normally. Board couldn't wakeup successfully after suspend. Command
"echo mem > /sys/power/state" suspend the board.
In suspend and resume function of stmmac driver, there are some sleep-inside function in atomic section
created by spin lock. These functions will causes system warnings and wakeup issue when enable
CONFIG_DEBUG_ATOMIC_SLEEP.
This bug was fixed by:
* replace some sleep function with non-sleep function
clk_disable_unprepare -> clk_disable ...
* decrease the atomic area created by spin lock function. The original atomic area in resume function is
too large.
Signed-off-by: Hao Liang <hliang1025@gmail.com>
---
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 6e6ee22..2effbfe 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2924,9 +2924,8 @@ int stmmac_suspend(struct net_device *ndev)
if (priv->phydev)
phy_stop(priv->phydev);
- spin_lock_irqsave(&priv->lock, flags);
-
netif_device_detach(ndev);
+
netif_stop_queue(ndev);
napi_disable(&priv->napi);
@@ -2935,6 +2934,8 @@ int stmmac_suspend(struct net_device *ndev)
priv->hw->dma->stop_tx(priv->ioaddr);
priv->hw->dma->stop_rx(priv->ioaddr);
+ spin_lock_irqsave(&priv->lock, flags);
+
stmmac_clear_descriptors(priv);
/* Enable Power down mode by programming the PMT regs */
@@ -2945,7 +2946,7 @@ int stmmac_suspend(struct net_device *ndev)
stmmac_set_mac(priv->ioaddr, false);
pinctrl_pm_select_sleep_state(priv->device);
/* Disable clock in case of PWM is off */
- clk_disable_unprepare(priv->stmmac_clk);
+ clk_disable(priv->stmmac_clk);
}
spin_unlock_irqrestore(&priv->lock, flags);
@@ -2977,12 +2978,14 @@ int stmmac_resume(struct net_device *ndev)
} else {
pinctrl_pm_select_default_state(priv->device);
/* enable the clk prevously disabled */
- clk_prepare_enable(priv->stmmac_clk);
+ clk_enable(priv->stmmac_clk);
/* reset the phy so that it's ready */
if (priv->mii)
stmmac_mdio_reset(priv->mii);
}
+ spin_unlock_irqrestore(&priv->lock, flags);
+
netif_device_attach(ndev);
stmmac_hw_setup(ndev);
@@ -2991,8 +2994,6 @@ int stmmac_resume(struct net_device *ndev)
netif_start_queue(ndev);
- spin_unlock_irqrestore(&priv->lock, flags);
-
if (priv->phydev)
phy_start(priv->phydev);
--
1.7.9.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] net: ethernet : stmicro: fixed power suspend and resume failure in stmmac driver
2014-09-30 5:55 [PATCH] net: ethernet : stmicro: fixed power suspend and resume failure in stmmac driver hliang1025
@ 2014-09-30 13:00 ` Giuseppe CAVALLARO
2014-09-30 19:10 ` David Miller
1 sibling, 0 replies; 6+ messages in thread
From: Giuseppe CAVALLARO @ 2014-09-30 13:00 UTC (permalink / raw)
To: hliang1025; +Cc: netdev, linux-kernel, adi-linux-docs
Hello Hao Liang
On 9/30/2014 7:55 AM, hliang1025@gmail.com wrote:
> From: Hao Liang <hliang1025@gmail.com>
>
> This is the fix for a power management issue caused by suspend and resume function in stmmac_main.c.
> After enable CONFIG_DEBUG_ATOMIC_SLEEP which enable sleep-inside atomic section checking, power
> managemet can not work normally. Board couldn't wakeup successfully after suspend. Command
> "echo mem > /sys/power/state" suspend the board.
>
> In suspend and resume function of stmmac driver, there are some sleep-inside function in atomic section
> created by spin lock. These functions will causes system warnings and wakeup issue when enable
> CONFIG_DEBUG_ATOMIC_SLEEP.
>
> This bug was fixed by:
> * replace some sleep function with non-sleep function
> clk_disable_unprepare -> clk_disable ...
> * decrease the atomic area created by spin lock function. The original atomic area in resume function is
> too large.
I had done something in this patch:
[PATCH (net.git)] stmmac: fix and review whole driver locking
Indeed I was not able to review it after some advice but I will do it!
So we can review your patch and then I will re-base my work on top of
yours.
I just wonder if the spinlock can be safely removed instead of
surrounding just the code to clear the descriptors that should
not be claimed by others. Maybe the only part shared is the
stmmac_hw_setup that can be invoked by open method.
peppe
> Signed-off-by: Hao Liang <hliang1025@gmail.com>
> ---
> drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 13 +++++++------
> 1 file changed, 7 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> index 6e6ee22..2effbfe 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> @@ -2924,9 +2924,8 @@ int stmmac_suspend(struct net_device *ndev)
> if (priv->phydev)
> phy_stop(priv->phydev);
>
> - spin_lock_irqsave(&priv->lock, flags);
> -
> netif_device_detach(ndev);
> +
> netif_stop_queue(ndev);
>
> napi_disable(&priv->napi);
> @@ -2935,6 +2934,8 @@ int stmmac_suspend(struct net_device *ndev)
> priv->hw->dma->stop_tx(priv->ioaddr);
> priv->hw->dma->stop_rx(priv->ioaddr);
>
> + spin_lock_irqsave(&priv->lock, flags);
> +
> stmmac_clear_descriptors(priv);
>
> /* Enable Power down mode by programming the PMT regs */
> @@ -2945,7 +2946,7 @@ int stmmac_suspend(struct net_device *ndev)
> stmmac_set_mac(priv->ioaddr, false);
> pinctrl_pm_select_sleep_state(priv->device);
> /* Disable clock in case of PWM is off */
> - clk_disable_unprepare(priv->stmmac_clk);
> + clk_disable(priv->stmmac_clk);
> }
> spin_unlock_irqrestore(&priv->lock, flags);
>
> @@ -2977,12 +2978,14 @@ int stmmac_resume(struct net_device *ndev)
> } else {
> pinctrl_pm_select_default_state(priv->device);
> /* enable the clk prevously disabled */
> - clk_prepare_enable(priv->stmmac_clk);
> + clk_enable(priv->stmmac_clk);
> /* reset the phy so that it's ready */
> if (priv->mii)
> stmmac_mdio_reset(priv->mii);
> }
>
> + spin_unlock_irqrestore(&priv->lock, flags);
> +
> netif_device_attach(ndev);
>
> stmmac_hw_setup(ndev);
> @@ -2991,8 +2994,6 @@ int stmmac_resume(struct net_device *ndev)
>
> netif_start_queue(ndev);
>
> - spin_unlock_irqrestore(&priv->lock, flags);
> -
> if (priv->phydev)
> phy_start(priv->phydev);
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] net: ethernet : stmicro: fixed power suspend and resume failure in stmmac driver
2014-09-30 5:55 [PATCH] net: ethernet : stmicro: fixed power suspend and resume failure in stmmac driver hliang1025
2014-09-30 13:00 ` Giuseppe CAVALLARO
@ 2014-09-30 19:10 ` David Miller
[not found] ` <CAPig_t=oA6BuAt77DDsLqrtRBDbV_vsoAxM31XxLjkAFpYG1-Q@mail.gmail.com>
1 sibling, 1 reply; 6+ messages in thread
From: David Miller @ 2014-09-30 19:10 UTC (permalink / raw)
To: hliang1025; +Cc: peppe.cavallaro, netdev, linux-kernel, adi-linux-docs
From: <hliang1025@gmail.com>
Date: Tue, 30 Sep 2014 13:55:34 +0800
> From: Hao Liang <hliang1025@gmail.com>
>
> This is the fix for a power management issue caused by suspend and resume function in stmmac_main.c.
> After enable CONFIG_DEBUG_ATOMIC_SLEEP which enable sleep-inside atomic section checking, power
> managemet can not work normally. Board couldn't wakeup successfully after suspend. Command
> "echo mem > /sys/power/state" suspend the board.
>
> In suspend and resume function of stmmac driver, there are some sleep-inside function in atomic section
> created by spin lock. These functions will causes system warnings and wakeup issue when enable
> CONFIG_DEBUG_ATOMIC_SLEEP.
>
> This bug was fixed by:
> * replace some sleep function with non-sleep function
> clk_disable_unprepare -> clk_disable ...
> * decrease the atomic area created by spin lock function. The original atomic area in resume function is
> too large.
>
> Signed-off-by: Hao Liang <hliang1025@gmail.com>
I really think the ->mac->xxx calls need to be under the lock, and therefore this
spinlock region shortening is not valid.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-10-20 15:36 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-30 5:55 [PATCH] net: ethernet : stmicro: fixed power suspend and resume failure in stmmac driver hliang1025
2014-09-30 13:00 ` Giuseppe CAVALLARO
2014-09-30 19:10 ` David Miller
[not found] ` <CAPig_t=oA6BuAt77DDsLqrtRBDbV_vsoAxM31XxLjkAFpYG1-Q@mail.gmail.com>
2014-10-01 17:45 ` David Miller
2014-10-16 8:58 ` Giuseppe CAVALLARO
[not found] ` <CAPig_t=Dguhw8jmAX_KvMrB9ZjL1POB+7jrdBmwpvTzjasKD1w@mail.gmail.com>
2014-10-20 15:36 ` 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).