mac80211: allow drivers to sleep in ampdu_action
authorJohannes Berg <johannes.berg@intel.com>
Thu, 10 Jun 2010 08:21:49 +0000 (10:21 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 14 Jun 2010 19:39:28 +0000 (15:39 -0400)
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>
drivers/net/wireless/ath/ath9k/main.c
include/net/mac80211.h
net/mac80211/driver-ops.h

index b8b76dd2c11e8accdce943d78a5be19dd0f6aba1..e1b8456f3d2cc598b4832bac268b95cd8a9bdb69 100644 (file)
@@ -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;
 }
 
index 7f9401b3d3c8d76abfc6c1be2810638450013e06..bbae3d9b11765116ce334cbb8c7a9e19c275fe09 100644 (file)
@@ -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
  *
index 7e86c6f89be9cf73b7eb63d16a88fbd95025559d..a4fcbcc4f458ecbed3e7d2361d9b4744e99ffa9c 100644 (file)
@@ -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;
 }