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

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
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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;
}

+1 −1
Original line number Diff line number Diff line
@@ -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
 *
+1 −2
Original line number Diff line number Diff line
@@ -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;
}