diff options
author | John W. Linville <linville@tuxdriver.com> | 2011-08-29 14:52:20 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-08-29 14:52:20 -0400 |
commit | ba6e5eb107b4b26444cb67ce6fb8eb0973a97964 (patch) | |
tree | 9377baf652e0cd8360372020b0386e238d07a30d /net/mac80211/status.c | |
parent | f3116f62cb56ef5efd172371fab688bb27529f69 (diff) | |
parent | a508a6ea234571e0e7d1e9f2455fc1eca54d1fef (diff) | |
download | kernel_replicant_linux-ba6e5eb107b4b26444cb67ce6fb8eb0973a97964.tar.gz kernel_replicant_linux-ba6e5eb107b4b26444cb67ce6fb8eb0973a97964.tar.bz2 kernel_replicant_linux-ba6e5eb107b4b26444cb67ce6fb8eb0973a97964.zip |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
Diffstat (limited to 'net/mac80211/status.c')
-rw-r--r-- | net/mac80211/status.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index a89cca3491b4..e51bd2a1a073 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c @@ -187,6 +187,8 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) int rates_idx = -1; bool send_to_cooked; bool acked; + struct ieee80211_bar *bar; + u16 tid; for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { if (info->status.rates[i].idx < 0) { @@ -243,6 +245,22 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) tid, ssn); } + if (!acked && ieee80211_is_back_req(fc)) { + /* + * BAR failed, let's tear down the BA session as a + * last resort as some STAs (Intel 5100 on Windows) + * can get stuck when the BA window isn't flushed + * correctly. + */ + bar = (struct ieee80211_bar *) skb->data; + if (!(bar->control & IEEE80211_BAR_CTRL_MULTI_TID)) { + tid = (bar->control & + IEEE80211_BAR_CTRL_TID_INFO_MASK) >> + IEEE80211_BAR_CTRL_TID_INFO_SHIFT; + ieee80211_stop_tx_ba_session(&sta->sta, tid); + } + } + if (info->flags & IEEE80211_TX_STAT_TX_FILTERED) { ieee80211_handle_filtered_frame(local, sta, skb); rcu_read_unlock(); |