From: Johannes Berg <johannes@sipsolutions.net>
To: linux-wireless@vger.kernel.org
Cc: m.sujith@gmail.com, tomasw@gmail.com
Subject: [RFC/RFT 10/11] mac80211: RX aggregation: clean up stop session
Date: Thu, 29 Jan 2009 01:55:00 +0100 [thread overview]
Message-ID: <20090129005809.892477504@sipsolutions.net> (raw)
In-Reply-To: 20090129005450.068797016@sipsolutions.net
Clean up the locking by splitting it into two functions,
this will also enable further cleanups of stopping all
sessions.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
---
net/mac80211/agg-rx.c | 57 ++++++++++++++++++++++++++++----------------------
1 file changed, 32 insertions(+), 25 deletions(-)
--- wireless-testing.orig/net/mac80211/agg-rx.c 2009-01-27 12:03:13.000000000 +0100
+++ wireless-testing/net/mac80211/agg-rx.c 2009-01-27 12:04:19.000000000 +0100
@@ -17,47 +17,32 @@
#include <net/mac80211.h>
#include "ieee80211_i.h"
-void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid,
- u16 initiator, u16 reason)
+static void __ieee80211_sta_stop_rx_ba_session(struct sta_info *sta, u16 tid,
+ u16 initiator, u16 reason)
{
- struct ieee80211_local *local = sdata->local;
+ struct ieee80211_local *local = sta->local;
struct ieee80211_hw *hw = &local->hw;
- struct sta_info *sta;
- int ret, i;
-
- rcu_read_lock();
-
- sta = sta_info_get(local, ra);
- if (!sta) {
- rcu_read_unlock();
- return;
- }
+ int i;
/* check if TID is in operational state */
spin_lock_bh(&sta->lock);
- if (sta->ampdu_mlme.tid_state_rx[tid]
- != HT_AGG_STATE_OPERATIONAL) {
+ if (sta->ampdu_mlme.tid_state_rx[tid] != HT_AGG_STATE_OPERATIONAL) {
spin_unlock_bh(&sta->lock);
- rcu_read_unlock();
return;
}
+
sta->ampdu_mlme.tid_state_rx[tid] =
HT_AGG_STATE_REQ_STOP_BA_MSK |
(initiator << HT_AGG_STATE_INITIATOR_SHIFT);
spin_unlock_bh(&sta->lock);
- /* stop HW Rx aggregation. ampdu_action existence
- * already verified in session init so we add the BUG_ON */
- BUG_ON(!local->ops->ampdu_action);
-
#ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "Rx BA session stop requested for %pM tid %u\n",
- ra, tid);
+ sta->sta.addr, tid);
#endif /* CONFIG_MAC80211_HT_DEBUG */
- ret = local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_STOP,
- &sta->sta, tid, NULL);
- if (ret)
+ if (local->ops->ampdu_action(hw, IEEE80211_AMPDU_RX_STOP,
+ &sta->sta, tid, NULL))
printk(KERN_DEBUG "HW problem - can not stop rx "
"aggregation for tid %d\n", tid);
@@ -67,7 +52,8 @@ void ieee80211_sta_stop_rx_ba_session(st
/* check if this is a self generated aggregation halt */
if (initiator == WLAN_BACK_RECIPIENT || initiator == WLAN_BACK_TIMER)
- ieee80211_send_delba(sdata, ra, tid, 0, reason);
+ ieee80211_send_delba(sta->sdata, sta->sta.addr,
+ tid, 0, reason);
/* free the reordering buffer */
for (i = 0; i < sta->ampdu_mlme.tid_rx[tid]->buf_size; i++) {
@@ -90,6 +76,27 @@ void ieee80211_sta_stop_rx_ba_session(st
sta->ampdu_mlme.tid_state_rx[tid] = HT_AGG_STATE_IDLE;
spin_unlock_bh(&sta->lock);
+}
+
+void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid,
+ u16 initiator, u16 reason)
+{
+ struct ieee80211_local *local = sdata->local;
+ struct sta_info *sta;
+
+ /* stop HW Rx aggregation. ampdu_action existence
+ * already verified in session init so we add the BUG_ON */
+ BUG_ON(!local->ops->ampdu_action);
+
+ rcu_read_lock();
+
+ sta = sta_info_get(local, ra);
+ if (!sta) {
+ rcu_read_unlock();
+ return;
+ }
+
+ __ieee80211_sta_stop_rx_ba_session(sta, tid, initiator, reason);
rcu_read_unlock();
}
--
next prev parent reply other threads:[~2009-01-29 8:41 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-29 0:54 [RFC/RFT 00/11] mac80211 HT code improvements/bug fixes Johannes Berg
2009-01-29 0:54 ` [RFC/RFT 01/11] mac80211: remove stray aggregation debugfs definition Johannes Berg
2009-01-29 0:54 ` [RFC/RFT 02/11] mac80211: fix RX aggregation timeouts Johannes Berg
2009-01-29 0:54 ` [RFC/RFT 03/11] mac80211: restructure HT code Johannes Berg
2009-01-29 0:54 ` [RFC/RFT 04/11] mac80211: restrict aggregation to supported interface modes Johannes Berg
2009-01-29 0:54 ` [RFC/RFT 05/11] mac80211: hardware should not deny going back to legacy Johannes Berg
2009-01-29 0:54 ` [RFC/RFT 06/11] mac80211: document TX aggregation (and small cleanup) Johannes Berg
2009-01-29 21:51 ` Jouni Malinen
2009-01-30 8:08 ` Johannes Berg
2009-01-29 0:54 ` [RFC/RFT 07/11] mac80211: fix race in TX aggregation Johannes Berg
2009-01-29 0:54 ` [RFC/RFT 08/11] mac80211: fix aggregation timer lockups Johannes Berg
2009-01-29 0:54 ` [RFC/RFT 09/11] mac80211: clean up BA session teardown Johannes Berg
2009-01-29 0:55 ` Johannes Berg [this message]
2009-01-29 0:55 ` [RFC/RFT 11/11] mac80211: further cleanups to stopping BA sessions Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090129005809.892477504@sipsolutions.net \
--to=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
--cc=m.sujith@gmail.com \
--cc=tomasw@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).