aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/agg-rx.c
diff options
context:
space:
mode:
authorMichal Kazior <michal.kazior@tieto.com>2014-09-02 08:05:10 -0400
committerJohannes Berg <johannes.berg@intel.com>2014-09-03 07:40:38 -0400
commit4549cf2b1803d29cfd019f7bfeaa784f8f9c558f (patch)
treebf39255e299b752cea30ce8437b9a685b189e5d4 /net/mac80211/agg-rx.c
parentd0616613d9cf17919fbd46fa0274db4b0084ad62 (diff)
mac80211: fix offloaded BA session traffic after hw restart
When starting an offloaded BA session it is unknown what starting sequence number should be used. Using last_seq worked in most cases except after hw restart. When hw restart is requested last_seq is (rightfully so) kept unmodified. This ended up with BA sessions being restarted with an aribtrary BA window values resulting in dropped frames until sequence numbers caught up. Instead of last_seq pick seqno of a first Rxed frame of a given BA session. This fixes stalled traffic after hw restart with offloaded BA sessions (currently only ath10k). Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/agg-rx.c')
-rw-r--r--net/mac80211/agg-rx.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
index f0e84bc48038..a48bad468880 100644
--- a/net/mac80211/agg-rx.c
+++ b/net/mac80211/agg-rx.c
@@ -227,7 +227,7 @@ static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *d
227void __ieee80211_start_rx_ba_session(struct sta_info *sta, 227void __ieee80211_start_rx_ba_session(struct sta_info *sta,
228 u8 dialog_token, u16 timeout, 228 u8 dialog_token, u16 timeout,
229 u16 start_seq_num, u16 ba_policy, u16 tid, 229 u16 start_seq_num, u16 ba_policy, u16 tid,
230 u16 buf_size, bool tx) 230 u16 buf_size, bool tx, bool auto_seq)
231{ 231{
232 struct ieee80211_local *local = sta->sdata->local; 232 struct ieee80211_local *local = sta->sdata->local;
233 struct tid_ampdu_rx *tid_agg_rx; 233 struct tid_ampdu_rx *tid_agg_rx;
@@ -326,6 +326,7 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta,
326 tid_agg_rx->buf_size = buf_size; 326 tid_agg_rx->buf_size = buf_size;
327 tid_agg_rx->timeout = timeout; 327 tid_agg_rx->timeout = timeout;
328 tid_agg_rx->stored_mpdu_num = 0; 328 tid_agg_rx->stored_mpdu_num = 0;
329 tid_agg_rx->auto_seq = auto_seq;
329 status = WLAN_STATUS_SUCCESS; 330 status = WLAN_STATUS_SUCCESS;
330 331
331 /* activate it for RX */ 332 /* activate it for RX */
@@ -367,7 +368,7 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
367 368
368 __ieee80211_start_rx_ba_session(sta, dialog_token, timeout, 369 __ieee80211_start_rx_ba_session(sta, dialog_token, timeout,
369 start_seq_num, ba_policy, tid, 370 start_seq_num, ba_policy, tid,
370 buf_size, true); 371 buf_size, true, false);
371} 372}
372 373
373void ieee80211_start_rx_ba_session_offl(struct ieee80211_vif *vif, 374void ieee80211_start_rx_ba_session_offl(struct ieee80211_vif *vif,