aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSujith Manoharan <c_manoha@qca.qualcomm.com>2014-09-12 02:40:48 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-09-15 15:00:50 -0400
commit48bf43fad76eb656f55bff3e3febe91578f1afe3 (patch)
treee124a36255506ed29cdb41f8fef42de85319e20f
parent6b5447ce630cdc231caf4f958325f8fa925216bf (diff)
ath9k: Fix beacon processing in offchannel
When interfaces of different types are present in a context and an offchannel request is received on a STA interface, we end up trying to process beacons received when we are offchannel. This hits the below warning since offchannel will not have proper beacon parameters. Fix this by not processing beacons received when we are offchannel. ------------[ cut here ]------------ WARNING: CPU: 1 PID: 0 at ../drivers/net/wireless/ath/ath9k/recv.c:552 ath_rx_tasklet+0xf8f/0x1020 [ath9k]() CPU: 1 PID: 0 Comm: swapper/1 Tainted: G O 3.17.0-rc4-wl-debug #16 Hardware name: LENOVO 28427ZQ/INVALID, BIOS 6JET58WW (1.16 ) 09/17/2009 0000000000000000 15916787056abba3 ffff88013b603d08 ffffffff8156af94 ffff88013b603d50 ffff88013b603d40 ffffffff81070dbd ffff8800a84bb300 ffff8800b05db358 ffff8800a84cc578 ffff8800a84bb300 ffff8800b05daa40 Call Trace: <IRQ> [<ffffffff8156af94>] dump_stack+0x4d/0x6f [<ffffffff81070dbd>] warn_slowpath_common+0x7d/0xa0 [<ffffffff81070e3c>] warn_slowpath_fmt+0x5c/0x80 [<ffffffff81572143>] ? _raw_spin_lock_irqsave+0x83/0xa0 [<ffffffffa09d04a6>] ? ath_rx_tasklet+0x9f6/0x1020 [ath9k] [<ffffffffa09d0a3f>] ath_rx_tasklet+0xf8f/0x1020 [ath9k] [<ffffffffa09cd4f4>] ath9k_tasklet+0xf4/0x310 [ath9k] [<ffffffff81075a97>] tasklet_action+0xe7/0xf0 [<ffffffff8107508a>] __do_softirq+0x12a/0x340 [<ffffffff8107544e>] irq_exit+0x9e/0xc0 [<ffffffff81575e56>] do_IRQ+0x56/0xe0 [<ffffffff81573c72>] common_interrupt+0x72/0x72 <EOI> [<ffffffff81421037>] ? cpuidle_enter_state+0x67/0x1a0 [<ffffffff81421257>] cpuidle_enter+0x17/0x20 [<ffffffff810b3ebe>] cpu_startup_entry+0x3ce/0x420 [<ffffffff81048563>] start_secondary+0x233/0x2c0 ---[ end trace f15c3e33ba78d840 ]--- ------------[ cut here ]------------ Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/ath9k/recv.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index 957a877242b5..dea8e1b8999b 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -537,6 +537,7 @@ static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb)
537static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb) 537static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)
538{ 538{
539 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 539 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
540 bool skip_beacon = false;
540 541
541 if (skb->len < 24 + 8 + 2 + 2) 542 if (skb->len < 24 + 8 + 2 + 2)
542 return; 543 return;
@@ -547,7 +548,14 @@ static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)
547 sc->ps_flags &= ~PS_BEACON_SYNC; 548 sc->ps_flags &= ~PS_BEACON_SYNC;
548 ath_dbg(common, PS, 549 ath_dbg(common, PS,
549 "Reconfigure beacon timers based on synchronized timestamp\n"); 550 "Reconfigure beacon timers based on synchronized timestamp\n");
550 if (!(WARN_ON_ONCE(sc->cur_chan->beacon.beacon_interval == 0))) 551
552 if (ath9k_is_chanctx_enabled()) {
553 if (sc->cur_chan == &sc->offchannel.chan)
554 skip_beacon = true;
555 }
556
557 if (!skip_beacon &&
558 !(WARN_ON_ONCE(sc->cur_chan->beacon.beacon_interval == 0)))
551 ath9k_set_beacon(sc); 559 ath9k_set_beacon(sc);
552 560
553 ath9k_p2p_beacon_sync(sc); 561 ath9k_p2p_beacon_sync(sc);