diff options
author | Johannes Berg <johannes.berg@intel.com> | 2010-06-10 04:21:42 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-06-14 15:39:27 -0400 |
commit | 0ab337032a0dfcd5f2527d3306d3deeba5f95b59 (patch) | |
tree | 88795edc149fd88574fece0c8f23774ee8a9155c /net/mac80211/tx.c | |
parent | a6a67db2bc89d2b1ff07e0817f11235c20d2c329 (diff) |
mac80211: make TX aggregation start/stop request async
When the driver or rate control requests starting
or stopping an aggregation session, that currently
causes a direct callback into the driver, which
could potentially cause locking problems. Also,
the functions need to be callable from contexts
that cannot sleep, and thus will interfere with
making the ampdu_action callback sleeping.
To address these issues, add a new work item for
each station that will process any start or stop
requests out of line.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/tx.c')
-rw-r--r-- | net/mac80211/tx.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 7bf1f9c9ea34..698d4718b1a4 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1102,6 +1102,11 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx, | |||
1102 | 1102 | ||
1103 | if (test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) { | 1103 | if (test_bit(HT_AGG_STATE_OPERATIONAL, &tid_tx->state)) { |
1104 | info->flags |= IEEE80211_TX_CTL_AMPDU; | 1104 | info->flags |= IEEE80211_TX_CTL_AMPDU; |
1105 | } else if (test_bit(HT_AGG_STATE_WANT_START, &tid_tx->state)) { | ||
1106 | /* | ||
1107 | * nothing -- this aggregation session is being started | ||
1108 | * but that might still fail with the driver | ||
1109 | */ | ||
1105 | } else { | 1110 | } else { |
1106 | spin_lock(&tx->sta->lock); | 1111 | spin_lock(&tx->sta->lock); |
1107 | /* | 1112 | /* |