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>
This commit is contained in:
parent
cfcdbde35e
commit
85ad181ea7
3 changed files with 6 additions and 3 deletions
|
@ -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,
|
||||||
"Unknown AMPDU action\n");
|
"Unknown AMPDU action\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local_bh_enable();
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue