summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-06-10 12:21:49 +0400
committerJohn W. Linville <linville@tuxdriver.com>2010-06-14 23:39:28 +0400
commit85ad181ea78861f69b007599cec9e6ba33fcdf8a (patch)
treeea92b4f7aa6d09ee11ee865a11f6426e809468ba
parentcfcdbde35e2b621cf56bedc38a3a81e8c28addb9 (diff)
downloadlinux-85ad181ea78861f69b007599cec9e6ba33fcdf8a.tar.xz
mac80211: allow drivers to sleep in ampdu_action
Allow drivers to sleep, and indicate this in the documentation. ath9k has some locking I don't understand, so keep it safe and disable BHs in it, all other drivers look fine with the context change. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c4
-rw-r--r--include/net/mac80211.h2
-rw-r--r--net/mac80211/driver-ops.h3
3 files changed, 6 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index b8b76dd2c11e..e1b8456f3d2c 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1769,6 +1769,8 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
struct ath_softc *sc = aphy->sc;
int ret = 0;
+ local_bh_disable();
+
switch (action) {
case IEEE80211_AMPDU_RX_START:
if (!(sc->sc_flags & SC_OP_RXAGGR))
@@ -1798,6 +1800,8 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
"Unknown AMPDU action\n");
}
+ local_bh_enable();
+
return ret;
}
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 7f9401b3d3c8..bbae3d9b1176 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1640,7 +1640,7 @@ enum ieee80211_ampdu_mlme_action {
* is the first frame we expect to perform the action on. Notice
* that TX/RX_STOP can pass NULL for this parameter.
* Returns a negative error code on failure.
- * The callback must be atomic.
+ * The callback can sleep.
*
* @get_survey: Return per-channel survey information
*
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h
index 7e86c6f89be9..a4fcbcc4f458 100644
--- a/net/mac80211/driver-ops.h
+++ b/net/mac80211/driver-ops.h
@@ -352,11 +352,10 @@ static inline int drv_ampdu_action(struct ieee80211_local *local,
might_sleep();
- local_bh_disable();
if (local->ops->ampdu_action)
ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action,
sta, tid, ssn);
- local_bh_enable();
+
trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, ret);
return ret;
}