From: Felix Fietkau Date: Wed, 10 Aug 2011 21:23:35 +0000 (-0600) Subject: ath9k: avoid sending a-mpdu packets to sleeping stations X-Git-Tag: v3.12-rc1~4599^2~254^2~310 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9af73cf7f356801e6e5837eb338d197de5c8f37c;p=kernel%2Fkernel-generic.git ath9k: avoid sending a-mpdu packets to sleeping stations 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 Signed-off-by: John W. Linville --- diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index e815e82..e1d1e90 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -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; }