Skip to content

Commit

Permalink
mac80211: defer TX agg session teardown to work
Browse files Browse the repository at this point in the history
Since we want the code to be able to sleep
in the future, it must not be called from
the timer directly. To achieve that, simply
call the function drivers would call, and
also use RCU in the timer to get the struct
so we don't need to rely on the spinlock in
the future.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Jun 14, 2010
1 parent a93e364 commit 83a5cbf
Showing 1 changed file with 5 additions and 5 deletions.
10 changes: 5 additions & 5 deletions net/mac80211/agg-tx.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,11 +200,11 @@ static void sta_addba_resp_timer_expired(unsigned long data)
struct tid_ampdu_tx *tid_tx;

/* check if the TID waits for addBA response */
spin_lock_bh(&sta->lock);
tid_tx = sta->ampdu_mlme.tid_tx[tid];
rcu_read_lock();
tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]);
if (!tid_tx ||
test_bit(HT_AGG_STATE_RESPONSE_RECEIVED, &tid_tx->state)) {
spin_unlock_bh(&sta->lock);
rcu_read_unlock();
#ifdef CONFIG_MAC80211_HT_DEBUG
printk(KERN_DEBUG "timer expired on tid %d but we are not "
"(or no longer) expecting addBA response there\n",
Expand All @@ -217,8 +217,8 @@ static void sta_addba_resp_timer_expired(unsigned long data)
printk(KERN_DEBUG "addBA response timer expired on tid %d\n", tid);
#endif

___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);
spin_unlock_bh(&sta->lock);
ieee80211_stop_tx_ba_session(&sta->sta, tid);
rcu_read_unlock();
}

static inline int ieee80211_ac_from_tid(int tid)
Expand Down

0 comments on commit 83a5cbf

Please sign in to comment.