Commit 85ad181e authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

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: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent cfcdbde3
...@@ -1769,6 +1769,8 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw, ...@@ -1769,6 +1769,8 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
struct ath_softc *sc = aphy->sc; struct ath_softc *sc = aphy->sc;
int ret = 0; int ret = 0;
local_bh_disable();
switch (action) { switch (action) {
case IEEE80211_AMPDU_RX_START: case IEEE80211_AMPDU_RX_START:
if (!(sc->sc_flags & SC_OP_RXAGGR)) if (!(sc->sc_flags & SC_OP_RXAGGR))
...@@ -1798,6 +1800,8 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw, ...@@ -1798,6 +1800,8 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
"Unknown AMPDU action\n"); "Unknown AMPDU action\n");
} }
local_bh_enable();
return ret; return ret;
} }
......
...@@ -1640,7 +1640,7 @@ enum ieee80211_ampdu_mlme_action { ...@@ -1640,7 +1640,7 @@ enum ieee80211_ampdu_mlme_action {
* is the first frame we expect to perform the action on. Notice * is the first frame we expect to perform the action on. Notice
* that TX/RX_STOP can pass NULL for this parameter. * that TX/RX_STOP can pass NULL for this parameter.
* Returns a negative error code on failure. * Returns a negative error code on failure.
* The callback must be atomic. * The callback can sleep.
* *
* @get_survey: Return per-channel survey information * @get_survey: Return per-channel survey information
* *
......
...@@ -352,11 +352,10 @@ static inline int drv_ampdu_action(struct ieee80211_local *local, ...@@ -352,11 +352,10 @@ static inline int drv_ampdu_action(struct ieee80211_local *local,
might_sleep(); might_sleep();
local_bh_disable();
if (local->ops->ampdu_action) if (local->ops->ampdu_action)
ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action, ret = local->ops->ampdu_action(&local->hw, &sdata->vif, action,
sta, tid, ssn); sta, tid, ssn);
local_bh_enable();
trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, ret); trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, ret);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment