On Thu, Mar 18, 2010 at 02:58:14PM -0400, Bob Copeland wrote:
> On Tue, Mar 16, 2010 at 11:45:52PM +0100, Benoit PAPILLAULT wrote:
> > One solution is to let the TX descriptor in the TX queue if the current  
> > value of TXDP is currently pointing to it.
> 
> Makes sense, just need to be careful we don't exit if the TX queue is
> also empty, otherwise we'd never be able to send just one packet.

Something like the following?  (only compile tested)

From: Bob Copeland <b...@hash.(none)>
Date: Fri, 19 Mar 2010 08:10:31 -0400
Subject: [PATCH] ath5k: fix race condition in tx desc processing

As pointed out by Benoit Papillault, there is a potential
race condition between the host and the hardware in reading
the next link in the transmit descriptor list:

cpu0              hw
                  tx for buf completed
                  raise tx_ok interrupt
process buf
buf->ds_link = 0
                  read buf->ds_link

This change checks txdp before processing a descriptor
(if there are any subsequent descriptors) to see if
hardware moved on.  We'll then process this descriptor on
the next tasklet.

Signed-off-by: Bob Copeland <m...@bobcopeland.com>
---
 drivers/net/wireless/ath/ath5k/base.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/drivers/net/wireless/ath/ath5k/base.c 
b/drivers/net/wireless/ath/ath5k/base.c
index b142a78..63dfb84 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -2059,6 +2059,11 @@ ath5k_tx_processq(struct ath5k_softc *sc, struct 
ath5k_txq *txq)
        list_for_each_entry_safe(bf, bf0, &txq->q, list) {
                ds = bf->desc;
 
+               /* make sure hardware can read the ds_link (if present) */
+               if (ath5k_hw_get_txdp(sc->ah, txq->qnum) == bf->daddr &&
+                   !list_is_last(&bf->list, &txq->q))
+                       break;
+
                ret = sc->ah->ah_proc_tx_desc(sc->ah, ds, &ts);
                if (unlikely(ret == -EINPROGRESS))
                        break;
-- 
1.5.4.1


-- 
Bob Copeland %% www.bobcopeland.com

_______________________________________________
ath5k-devel mailing list
ath5k-devel@lists.ath5k.org
https://lists.ath5k.org/mailman/listinfo/ath5k-devel

Reply via email to