@@ -1710,7 +1710,6 @@ static struct ath_buf *ath_tx_setup_buffer(struct ieee80211_hw *hw,
bf->bf_buf_addr,
txq->axq_qnum);
-
return bf;
}
@@ -1813,6 +1812,15 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
if (unlikely(!bf))
return -ENOMEM;
+ if (ieee80211_is_nullfunc(hdr->frame_control) &&
+ ieee80211_has_pm(hdr->frame_control)) {
+ /* Drain all the pending frames before we send a nullfunc frame
+ * to avoid any power save state mismatch between the station
+ * and the AP.
+ */
+ ath_drain_all_txq(sc, false);
+ }
+
q = skb_get_queue_mapping(skb);
spin_lock_bh(&txq->axq_lock);
if (txq == sc->tx.txq_map[q] &&