aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/rx.c
diff options
context:
space:
mode:
authorRajkumar Manoharan <rmanoharan@atheros.com>2011-02-02 12:27:53 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-02-04 16:29:51 -0500
commit8c99f69182fb9550ceedf599b32af335e743367b (patch)
treea659b301ed7c8328f4bc179422d11e4962f26dbd /net/mac80211/rx.c
parent24d24c627cadcbff682fbf8448a775851bef833c (diff)
mac80211: do not restart ps timer during scan or offchannel
While leaving oper channel, STA informs sleep state to AP to stop sending data. Till sending ack for the nullfunc, AP continues to send the data to STA which restarts ps_timer that is causing unnecessary nullfunc exchange on timer expiry when the STA was already moved to offchannel. So don't restart ps_timer on data reception during scan. This issue was identified by the following warning. WARNING: at net/mac80211/tx.c:661 invoke_tx_handlers+0xf07/0x1330 [mac80211] wlan0: Dropped data frame as no usable bitrate found while scanning and associated. Target station: 00:03:7f:0b:a6:1b on 5 GHz band Call Trace: [<ffffffffa0413ba7>] invoke_tx_handlers+0xf07/0x1330 [mac80211] [<ffffffffa0414056>] ieee80211_tx+0x86/0x2c0 [mac80211] [<ffffffffa0414345>] ieee80211_xmit+0xb5/0x1d0 [mac80211] [<ffffffffa04037e0>] ieee80211_dynamic_ps_enable_work+0x0/0xb0 [mac80211] [<ffffffffa04158cf>] ieee80211_tx_skb+0x4f/0x60 [mac80211] [<ffffffffa04026e6>] ieee80211_send_nullfunc+0x46/0x60 [mac80211] [<ffffffffa0403885>] ieee80211_dynamic_ps_enable_work+0xa5/0xb0 [mac80211] Reviewed-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Rajkumar Manoharan <rmanoharan@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r--net/mac80211/rx.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index c08b8e90bbcb..b37c3415f0ea 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1952,7 +1952,10 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
1952 dev->stats.rx_bytes += rx->skb->len; 1952 dev->stats.rx_bytes += rx->skb->len;
1953 1953
1954 if (local->ps_sdata && local->hw.conf.dynamic_ps_timeout > 0 && 1954 if (local->ps_sdata && local->hw.conf.dynamic_ps_timeout > 0 &&
1955 !is_multicast_ether_addr(((struct ethhdr *)rx->skb->data)->h_dest)) { 1955 !is_multicast_ether_addr(
1956 ((struct ethhdr *)rx->skb->data)->h_dest) &&
1957 (!local->scanning &&
1958 !test_bit(SDATA_STATE_OFFCHANNEL, &sdata->state))) {
1956 mod_timer(&local->dynamic_ps_timer, jiffies + 1959 mod_timer(&local->dynamic_ps_timer, jiffies +
1957 msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout)); 1960 msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout));
1958 } 1961 }