|
@@ -76,10 +76,11 @@ void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid,
|
|
|
tid_rx = rcu_dereference_protected(sta->ampdu_mlme.tid_rx[tid],
|
|
|
lockdep_is_held(&sta->ampdu_mlme.mtx));
|
|
|
|
|
|
- if (!tid_rx)
|
|
|
+ if (!test_bit(tid, sta->ampdu_mlme.agg_session_valid))
|
|
|
return;
|
|
|
|
|
|
RCU_INIT_POINTER(sta->ampdu_mlme.tid_rx[tid], NULL);
|
|
|
+ __clear_bit(tid, sta->ampdu_mlme.agg_session_valid);
|
|
|
|
|
|
ht_dbg(sta->sdata,
|
|
|
"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,
|
|
|
ieee80211_send_delba(sta->sdata, sta->sta.addr,
|
|
|
tid, WLAN_BACK_RECIPIENT, reason);
|
|
|
|
|
|
+ /*
|
|
|
+ * return here in case tid_rx is not assigned - which will happen if
|
|
|
+ * IEEE80211_HW_SUPPORTS_REORDERING_BUFFER is set.
|
|
|
+ */
|
|
|
+ if (!tid_rx)
|
|
|
+ return;
|
|
|
+
|
|
|
del_timer_sync(&tid_rx->session_timer);
|
|
|
|
|
|
/* 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,
|
|
|
/* examine state machine */
|
|
|
mutex_lock(&sta->ampdu_mlme.mtx);
|
|
|
|
|
|
- if (sta->ampdu_mlme.tid_rx[tid]) {
|
|
|
+ if (test_bit(tid, sta->ampdu_mlme.agg_session_valid)) {
|
|
|
ht_dbg_ratelimited(sta->sdata,
|
|
|
"unexpected AddBA Req from %pM on tid %u\n",
|
|
|
sta->sta.addr, tid);
|
|
@@ -308,6 +316,16 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta,
|
|
|
false);
|
|
|
}
|
|
|
|
|
|
+ if (ieee80211_hw_check(&local->hw, SUPPORTS_REORDERING_BUFFER)) {
|
|
|
+ ret = drv_ampdu_action(local, sta->sdata, ¶ms);
|
|
|
+ ht_dbg(sta->sdata,
|
|
|
+ "Rx A-MPDU request on %pM tid %d result %d\n",
|
|
|
+ sta->sta.addr, tid, ret);
|
|
|
+ if (!ret)
|
|
|
+ status = WLAN_STATUS_SUCCESS;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
/* prepare A-MPDU MLME for Rx aggregation */
|
|
|
tid_agg_rx = kmalloc(sizeof(struct tid_ampdu_rx), GFP_KERNEL);
|
|
|
if (!tid_agg_rx)
|
|
@@ -369,6 +387,8 @@ void __ieee80211_start_rx_ba_session(struct sta_info *sta,
|
|
|
}
|
|
|
|
|
|
end:
|
|
|
+ if (status == WLAN_STATUS_SUCCESS)
|
|
|
+ __set_bit(tid, sta->ampdu_mlme.agg_session_valid);
|
|
|
mutex_unlock(&sta->ampdu_mlme.mtx);
|
|
|
|
|
|
end_no_lock:
|