diff options
author | Sara Sharon <sara.sharon@intel.com> | 2015-12-08 12:09:05 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2016-02-24 03:04:16 -0500 |
commit | 412a6d800c7380c1b87c11080c7da905c27cfea8 (patch) | |
tree | 6ebbfc270d12f9da48558c0d445fae32495c8c73 /net/mac80211/agg-rx.c | |
parent | 50ea05efaf3bed7dd34bcc2635a8b3f53bd0ccc1 (diff) |
mac80211: support hw managing reorder logic
Enable driver to manage the reordering logic itself.
This is needed for example for the iwlwifi driver that
will support hardware assisted reordering.
Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.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.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index ec80db7c955c..2ab54791281d 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c | |||
@@ -76,10 +76,11 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | |||
76 | tid_rx = rcu_dereference_protected(sta->ampdu_mlme.tid_rx[tid], | 76 | tid_rx = rcu_dereference_protected(sta->ampdu_mlme.tid_rx[tid], |
77 | lockdep_is_held(&sta->ampdu_mlme.mtx)); | 77 | lockdep_is_held(&sta->ampdu_mlme.mtx)); |
78 | 78 | ||
79 | if (!tid_rx) | 79 | if (!test_bit(tid, sta->ampdu_mlme.agg_session_valid)) |
80 | return; | 80 | return; |
81 | 81 | ||
82 | RCU_INIT_POINTER(sta->ampdu_mlme.tid_rx[tid], NULL); | 82 | RCU_INIT_POINTER(sta->ampdu_mlme.tid_rx[tid], NULL); |
83 | __clear_bit(tid, sta->ampdu_mlme.agg_session_valid); | ||
83 | 84 | ||
84 | ht_dbg(sta->sdata, | 85 | ht_dbg(sta->sdata, |
85 | "Rx BA session stop requested for %pM tid %u %s reason: %d\n", | 86 | "Rx BA session stop requested for %pM tid %u %s reason: %d\n", |
@@ -97,6 +98,13 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | |||
97 | ieee80211_send_delba(sta->sdata, sta->sta.addr, | 98 | ieee80211_send_delba(sta->sdata, sta->sta.addr, |
98 | tid, WLAN_BACK_RECIPIENT, reason); | 99 | tid, WLAN_BACK_RECIPIENT, reason); |
99 | 100 | ||
101 | /* | ||
102 | * return here in case tid_rx is not assigned - which will happen if | ||
103 | * IEEE80211_HW_SUPPORTS_REORDERING_BUFFER is set. | ||
104 | */ | ||
105 | if (!tid_rx) | ||
106 | return; | ||
107 | |||
100 | del_timer_sync(&tid_rx->session_timer); | 108 | del_timer_sync(&tid_rx->session_timer); |
101 | 109 | ||
102 | /* make sure ieee80211_sta_reorder_release() doesn't re-arm the timer */ | 110 | /* make sure ieee80211_sta_reorder_release() doesn't re-arm the timer */ |
@@ -297,7 +305,7 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta, | |||
297 | /* examine state machine */ | 305 | /* examine state machine */ |
298 | mutex_lock(&sta->ampdu_mlme.mtx); | 306 | mutex_lock(&sta->ampdu_mlme.mtx); |
299 | 307 | ||
300 | if (sta->ampdu_mlme.tid_rx[tid]) { | 308 | if (test_bit(tid, sta->ampdu_mlme.agg_session_valid)) { |
301 | ht_dbg_ratelimited(sta->sdata, | 309 | ht_dbg_ratelimited(sta->sdata, |
302 | "unexpected AddBA Req from %pM on tid %u\n", | 310 | "unexpected AddBA Req from %pM on tid %u\n", |
303 | sta->sta.addr, tid); | 311 | sta->sta.addr, tid); |
@@ -308,6 +316,16 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta, | |||
308 | false); | 316 | false); |
309 | } | 317 | } |
310 | 318 | ||
319 | if (ieee80211_hw_check(&local->hw, SUPPORTS_REORDERING_BUFFER)) { | ||
320 | ret = drv_ampdu_action(local, sta->sdata, ¶ms); | ||
321 | ht_dbg(sta->sdata, | ||
322 | "Rx A-MPDU request on %pM tid %d result %d\n", | ||
323 | sta->sta.addr, tid, ret); | ||
324 | if (!ret) | ||
325 | status = WLAN_STATUS_SUCCESS; | ||
326 | goto end; | ||
327 | } | ||
328 | |||
311 | /* prepare A-MPDU MLME for Rx aggregation */ | 329 | /* prepare A-MPDU MLME for Rx aggregation */ |
312 | tid_agg_rx = kmalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL); | 330 | tid_agg_rx = kmalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL); |
313 | if (!tid_agg_rx) | 331 | if (!tid_agg_rx) |
@@ -369,6 +387,8 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta, | |||
369 | } | 387 | } |
370 | 388 | ||
371 | end: | 389 | end: |
390 | if (status == WLAN_STATUS_SUCCESS) | ||
391 | __set_bit(tid, sta->ampdu_mlme.agg_session_valid); | ||
372 | mutex_unlock(&sta->ampdu_mlme.mtx); | 392 | mutex_unlock(&sta->ampdu_mlme.mtx); |
373 | 393 | ||
374 | end_no_lock: | 394 | end_no_lock: |