ath9k: avoid sending a-mpdu packets to sleeping stations
authorFelix Fietkau <nbd@openwrt.org>
Wed, 10 Aug 2011 21:23:35 +0000 (15:23 -0600)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 12 Aug 2011 17:45:04 +0000 (13:45 -0400)
If the driver gets a tx status report for an A-MPDU sent to a station that
just went to sleep, that leaves a race condition where this tx status can
trigger another A-MPDU transmission.
To fix this, check if the station is sleeping before queueing the tid.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/xmit.c

index e815e825e9cb8943c3e99b0c2de09720562345fa..e1d1e903229b69c994ecc881d0632542b56d6ad5 100644 (file)
@@ -551,7 +551,8 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
                if (clear_filter)
                        tid->ac->clear_ps_filter = true;
                list_splice(&bf_pending, &tid->buf_q);
-               ath_tx_queue_tid(txq, tid);
+               if (!an->sleeping)
+                       ath_tx_queue_tid(txq, tid);
                spin_unlock_bh(&txq->axq_lock);
        }
 
@@ -1413,7 +1414,8 @@ static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid,
                 */
                TX_STAT_INC(txctl->txq->axq_qnum, a_queued_sw);
                list_add_tail(&bf->list, &tid->buf_q);
-               ath_tx_queue_tid(txctl->txq, tid);
+               if (!txctl->an || !txctl->an->sleeping)
+                       ath_tx_queue_tid(txctl->txq, tid);
                return;
        }