Search Linux Wireless

Re: 3.4-rc ath9k regression (Re: [ath9k-devel] 3.3.1 ath9k regression)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2012-04-09 5:29 PM, Michael Leun wrote:
> On Mon, 9 Apr 2012 19:52:45 +0530
> Mohammed Shafi <shafi.wireless@xxxxxxxxx> wrote:
> 
>> On Mon, Apr 9, 2012 at 7:33 PM, Michael Leun
>> <lkml20120218@xxxxxxxxxxxxxxx> wrote:
>> > On Mon, 9 Apr 2012 12:25:49 +0200
>> > Michael Leun <lkml20120218@xxxxxxxxxxxxxxx> wrote:
>> >
>> >> On Mon, 9 Apr 2012 11:58:06 +0530
>> >> Mohammed Shafi <shafi.wireless@xxxxxxxxx> wrote:
>> >>
>> >> > On Mon, Apr 9, 2012 at 4:38 AM, Michael Leun
>> >> > <lkml20120218@xxxxxxxxxxxxxxx> wrote:
>> >> > > After an suspend to disk / resume cycle (in kernel suspend to
>> >> > > disk, openSuSE) with 3.4-rc2 my ath9k wireless does not ping
>> >> > > anymore.
>> >> > >
>> >> > > Output of iwconfig wlan0 looks just as usual (associated to
>> >> > > AP).
>> >> > >
>> >> > > iwconfig wlan0 essid <myssid> fixes this (causes an
>> >> > > deauthenticate/authenticate with AP) - then connectivity is
>> >> > > there again.
>> >> > >
>> >> > > Guess what: "Of course" does not happen when reverting
>> >> > > c1afdaff90538ef085b756454f12b29575411214 ath9k: fix going to
>> >> > > full-sleep on PS idle.
>> >> > >
>> >> > > So, in my opinion it should be seriously considered to revert
>> >> > > that patch until it is fully understood what is going on and
>> >> > > why.
>> >> >
>> >> > please try with the attached patch to see if it helps.
>> >>
>> >> Yes, this patch helps with the issue I see in 3.4-rc2 described
>> >> above.
>> >
>> > Sorry, but I have to partially rectify that:
>> >
>> > It works, if the time the machine was suspended is short, as it was
>> > when I did that testing.
>> >
>> > But I noticed it failing, when the machine was hibernated for some
>> > hours.
>> >
>> > I easily can reproduce that, when I reboot the AP while the
>> > notebook is down (btw: AP is TP-LINK TL-WR1043ND running OpenWRT
>> > backfire 10.03.1, also using ath9k).
>> >
>> > When I do this (hibernate notebook, reboot AP, resume notebook check
>> > connectivity) with 3.4-rc2 and your test.patch it fails in 100% of
>> > cases.
>> 
>> the test.patch is nothing but it reverts back to the code something
>> back 3.1.1 and there is something else is also there
>> , where we need to fix. unfortunately i cannot reproduce the issue in
>> 3.4-rc2 which you guys can easily recreate it.  i should try with
>> 3.3.1 tomorrow. i will go home today and see if i can find some thing
>> with my analysis.
> 
> Please do not mix up things. What I described above I see in 3.4-rc2,
> the thing in 3.3.1 looks different (altough it may (or may not) have the
> same root cause).
> 
> Between your test.patch and reverting
> c1afdaff90538ef085b756454f12b29575411214 is this diff:
> 
> @@ -118,13 +118,13 @@
>         if (--sc->ps_usecount != 0)
>                 goto unlock;
>  
> -       if (sc->ps_idle && (sc->ps_flags & PS_WAIT_FOR_TX_ACK))
> +       if (sc->ps_idle)
>                 mode = ATH9K_PM_FULL_SLEEP;
>         else if (sc->ps_enabled &&
>                  !(sc->ps_flags & (PS_WAIT_FOR_BEACON |
>                               PS_WAIT_FOR_CAB |
> -                             PS_WAIT_FOR_PSPOLL_DATA |
> -                             PS_WAIT_FOR_TX_ACK)))
> +                             PS_WAIT_FOR_TX_ACK |
> +                             PS_WAIT_FOR_PSPOLL_DATA)))
>                 mode = ATH9K_PM_NETWORK_SLEEP;
>         else
>                 goto unlock;
> 
> 
> Seems obvious to me, that this line
> 
> if (sc->ps_idle && (sc->ps_flags & PS_WAIT_FOR_TX_ACK))
> 
> makes the real difference.
Please try this patch with plain 3.3.1 or 3.4-rc2 to see if it fixes 
this issue:

diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1584,6 +1584,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
 	struct ath_hw *ah = sc->sc_ah;
 	struct ath_common *common = ath9k_hw_common(ah);
 	struct ieee80211_conf *conf = &hw->conf;
+	bool reset_channel = false;
 
 	ath9k_ps_wakeup(sc);
 	mutex_lock(&sc->mutex);
@@ -1592,6 +1593,12 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
 		sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE);
 		if (sc->ps_idle)
 			ath_cancel_work(sc);
+		else
+			/*
+			 * The chip needs a reset to properly wake up from
+			 * full sleep
+			 */
+			reset_channel = ah->chip_fullsleep;
 	}
 
 	/*
@@ -1620,7 +1627,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
 		}
 	}
 
-	if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
+	if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
 		struct ieee80211_channel *curchan = hw->conf.channel;
 		int pos = curchan->hw_value;
 		int old_pos = -1;

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux