]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ath9k: fix regression on beacon loss after bgscan
authorLuis R. Rodriguez <lrodriguez@atheros.com>
Thu, 16 Sep 2010 19:12:27 +0000 (15:12 -0400)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 16 Sep 2010 19:46:11 +0000 (15:46 -0400)
When we return to the home channel we were never reseting our beacon
timers, this was casued by the fact that the scanning flag was still
on even after we returned to our home channel. There are also other
reasons why we would get a reset and if we are not off channel
we always need to resynch our beacon timers, because a reset will
clear them.

This bug is a regression introduced on 2.6.36. The order of the
changes are as follows:

0d6bb758 - Sat Jul 31 - ath9k: prevent calibration during off-channel activity
4f46d1c3 - Tue Jul 27 - Revert "mac80211: fix sw scan bracketing"
b2778b9a - Fri Jun 18 - mac80211: fix sw scan bracketing

mcgrof@tux ~/linux-2.6-allstable (git::master)$ git describe \
        --contains 0d6bb758b012f32fafd973e5eb59b642e4187669
v2.6.36-rc1~43^2~34^2~22

mcgrof@tux ~/linux-2.6-allstable (git::master)$ git describe \
        --contains 4f46d1c3b259a341b37af28b2d31c45a9d3efb1f
v2.6.36-rc1~571^2~64^2~13

mcgrof@tux ~/linux-2.6-allstable (git::master)$ git describe \
        --contains b2778b9a86d0a57201aa14ef154bc738e0675127
v2.6.36-rc1~571^2~107^2~187

So 0d6bb758 would have worked if 4f46d1c3 was not committed but
it was so this means 0d6bb758 was broken since it assumed that
when we were in the channel change routine the scan flag would
be lifted. As it turns out the scan flag will be set when we
are already on the home channel.

For more details refer to:

http://code.google.com/p/chromium-os/issues/detail?id=5715

These issues will need to be considered for our solution on
reshifting the scan complete callback location on mac80211 on
current development kernel work.

This patch has stable fixes which apply down to [2.6.36+]

Cc: stable@kernel.org
Cc: Paul Stewart <pstew@google.com>
Cc: Amod Bodas <amod.bodas@atheros.com>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/main.c

index 1dd8768c63dc987cff683ee14ed2c1add98aa16a..3295c638f7e3e3f00071d7552e4bc607757598b7 100644 (file)
@@ -258,9 +258,11 @@ int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
        if (!(sc->sc_flags & (SC_OP_OFFCHANNEL | SC_OP_SCANNING))) {
                ath_start_ani(common);
                ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
-               ath_beacon_config(sc, NULL);
        }
 
+       if (!(sc->sc_flags & (SC_OP_OFFCHANNEL)))
+               ath_beacon_config(sc, NULL);
+
  ps_restore:
        ath9k_ps_restore(sc);
        return r;
@@ -957,7 +959,7 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
 
        ath_update_txpow(sc);
 
-       if (sc->sc_flags & SC_OP_BEACONS)
+       if ((sc->sc_flags & SC_OP_BEACONS) || !(sc->sc_flags & (SC_OP_OFFCHANNEL)))
                ath_beacon_config(sc, NULL);    /* restart beacons */
 
        ath9k_hw_set_interrupts(ah, ah->imask);