@@ -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
*
@@ -1769,6 +1769,8 @@ static int ath9k_ampdu_action(struct iee
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 iee
"Unknown AMPDU action\n");
}
+ local_bh_enable();
+
return ret;
}
@@ -352,11 +352,10 @@ static inline int drv_ampdu_action(struc
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;
}