svn commit: r250355 - head/sys/dev/ath
Adrian Chadd
adrian at FreeBSD.org
Wed May 8 07:30:34 UTC 2013
Author: adrian
Date: Wed May 8 07:30:33 2013
New Revision: 250355
URL: http://svnweb.freebsd.org/changeset/base/250355
Log:
Revert a previous commit - this is causing hardware errors.
I'm not sure why this is failing. The holding descriptor should be being
re-read when starting DMA of the next frame. Obviously something here
isn't totally correct.
I'll review the TX queue handling and see if I can figure out why this
is failing. I'll then re-revert this patch out and use the holding
descriptor again.
Modified:
head/sys/dev/ath/if_ath.c
head/sys/dev/ath/if_ath_misc.h
Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c Wed May 8 07:14:07 2013 (r250354)
+++ head/sys/dev/ath/if_ath.c Wed May 8 07:30:33 2013 (r250355)
@@ -4000,20 +4000,19 @@ ath_tx_processq(struct ath_softc *sc, st
break;
}
ATH_TXQ_REMOVE(txq, bf, bf_list);
-
- /*
- * Always mark the last buffer in this list as busy.
- *
- * The hardware may re-read the holding descriptor
- * even if we hit the end of the list and try writing
- * a new TxDP.
- *
- * If there's no holding descriptor then this is the
- * last buffer in the list of buffers after a fresh
- * reset; it'll soon become the holding buffer.
- */
- bf->bf_last->bf_flags |= ATH_BUF_BUSY;
-
+ if (txq->axq_depth > 0) {
+ /*
+ * More frames follow. Mark the buffer busy
+ * so it's not re-used while the hardware may
+ * still re-read the link field in the descriptor.
+ *
+ * Use the last buffer in an aggregate as that
+ * is where the hardware may be - intermediate
+ * descriptors won't be "busy".
+ */
+ bf->bf_last->bf_flags |= ATH_BUF_BUSY;
+ } else
+ txq->axq_link = NULL;
if (bf->bf_state.bfs_aggr)
txq->axq_aggr_depth--;
Modified: head/sys/dev/ath/if_ath_misc.h
==============================================================================
--- head/sys/dev/ath/if_ath_misc.h Wed May 8 07:14:07 2013 (r250354)
+++ head/sys/dev/ath/if_ath_misc.h Wed May 8 07:30:33 2013 (r250355)
@@ -131,10 +131,16 @@ extern void ath_start_task(void *arg, in
static inline void
ath_tx_kick(struct ath_softc *sc)
{
+ struct ieee80211com *ic = sc->sc_ifp->if_l2com;
+ IEEE80211_TX_UNLOCK_ASSERT(ic);
+ ATH_TX_UNLOCK_ASSERT(sc);
+
+ IEEE80211_TX_LOCK(ic);
ATH_TX_LOCK(sc);
ath_start(sc->sc_ifp);
ATH_TX_UNLOCK(sc);
+ IEEE80211_TX_UNLOCK(ic);
}
/*
More information about the svn-src-head
mailing list