2012-05-31 10:35:06

by Pontus Fuchs

[permalink] [raw]
Subject: [PATCH] mac80211: Clear wowlan flag when drv_suspend returns failure

drv_resume can get called without a prior call to drv_suspend.
Consider the following steps:

1. Suspend is started but driver's drv_suspend returns error.
2. Suspend is aborted. local->wowlan flag is left set.
3. Interface is removed.
4. Suspend again. This time open_count is 0 so drv_suspend is
not called and local->wowlan not cleared.
5. On resume ieee80211_reconfig will call drv_resume since
local->wowlan is set.

Signed-off-by: Pontus Fuchs <[email protected]>
---
net/mac80211/pm.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c
index af1c4e2..98c128b 100644
--- a/net/mac80211/pm.c
+++ b/net/mac80211/pm.c
@@ -77,6 +77,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
int err = drv_suspend(local, wowlan);
if (err < 0) {
local->quiescing = false;
+ local->wowlan = false;
return err;
} else if (err > 0) {
WARN_ON(err != 1);
--
1.7.9.5



2012-05-31 10:52:44

by Mohammed Shafi

[permalink] [raw]
Subject: Re: [PATCH] mac80211: Clear wowlan flag when drv_suspend returns failure

Hi Pontus,

On Thu, May 31, 2012 at 4:04 PM, Pontus Fuchs <[email protected]> wrote:
> drv_resume can get called without a prior call to drv_suspend.
> Consider the following steps:
>
> 1. Suspend is started but driver's drv_suspend returns error.
> 2. Suspend is aborted. local->wowlan flag is left set.
> 3. Interface is removed.

got a doubt, in which path interface remove happens ?

> 4. Suspend again. This time open_count is 0 so drv_suspend is
> ? not called and local->wowlan not cleared.
> 5. On resume ieee80211_reconfig will call drv_resume since
> ? local->wowlan is set.
>
> Signed-off-by: Pontus Fuchs <[email protected]>
> ---
> ?net/mac80211/pm.c | ? ?1 +
> ?1 file changed, 1 insertion(+)
>
> diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c
> index af1c4e2..98c128b 100644
> --- a/net/mac80211/pm.c
> +++ b/net/mac80211/pm.c
> @@ -77,6 +77,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
> ? ? ? ? ? ? ? ?int err = drv_suspend(local, wowlan);
> ? ? ? ? ? ? ? ?if (err < 0) {
> ? ? ? ? ? ? ? ? ? ? ? ?local->quiescing = false;
> + ? ? ? ? ? ? ? ? ? ? ? local->wowlan = false;
> ? ? ? ? ? ? ? ? ? ? ? ?return err;
> ? ? ? ? ? ? ? ?} else if (err > 0) {
> ? ? ? ? ? ? ? ? ? ? ? ?WARN_ON(err != 1);
> --
> 1.7.9.5
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to [email protected]
> More majordomo info at ?http://vger.kernel.org/majordomo-info.html



--
thanks,
shafi

2012-05-31 10:55:40

by Pontus Fuchs

[permalink] [raw]
Subject: Re: [PATCH] mac80211: Clear wowlan flag when drv_suspend returns failure

Hi,

>> 1. Suspend is started but driver's drv_suspend returns error.
>> 2. Suspend is aborted. local->wowlan flag is left set.
>> 3. Interface is removed.
>
> got a doubt, in which path interface remove happens ?

Note that in between step 2 and 4 userspace is up and running again so I
just use ifconfig to reproduce this.

>> 4. Suspend again. This time open_count is 0 so drv_suspend is
>> not called and local->wowlan not cleared.
>> 5. On resume ieee80211_reconfig will call drv_resume since
>> local->wowlan is set.

//Pontus

2012-05-31 11:16:00

by Mohammed Shafi

[permalink] [raw]
Subject: Re: [PATCH] mac80211: Clear wowlan flag when drv_suspend returns failure

On Thu, May 31, 2012 at 4:25 PM, Pontus Fuchs <[email protected]> wrote:
> Hi,
>
>
>>> 1. Suspend is started but driver's drv_suspend returns error.
>>> 2. Suspend is aborted. local->wowlan flag is left set.
>>> 3. Interface is removed.
>>
>>
>> got a doubt, in which path interface remove happens ?
>
>
> Note that in between step 2 and 4 userspace is up and running again so I
> just use ifconfig to reproduce this.

thanks!

>
>
>>> 4. Suspend again. This time open_count is 0 so drv_suspend is
>>> ? not called and local->wowlan not cleared.
>>> 5. On resume ieee80211_reconfig will call drv_resume since
>>> ? local->wowlan is set.
>
>
> //Pontus



--
thanks,
shafi