svn commit: r249565 - head/sys/dev/ath
Adrian Chadd
adrian at FreeBSD.org
Tue Apr 16 20:21:03 UTC 2013
Author: adrian
Date: Tue Apr 16 20:21:02 2013
New Revision: 249565
URL: http://svnweb.freebsd.org/changeset/base/249565
Log:
Use a per-RX-queue deferred list, rather than a single deferred list for
both queues.
Since ath_rx_pkt() does multi-mbuf frame recombining based on the RX queue,
this needs to occur.
Tested:
* AR9380 (XB112), hostap mode
Modified:
head/sys/dev/ath/if_ath.c
head/sys/dev/ath/if_ath_rx_edma.c
head/sys/dev/ath/if_athvar.h
Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c Tue Apr 16 19:58:24 2013 (r249564)
+++ head/sys/dev/ath/if_ath.c Tue Apr 16 20:21:02 2013 (r249565)
@@ -842,7 +842,8 @@ ath_attach(u_int16_t devid, struct ath_s
/*
* Initialise the deferred completed RX buffer list.
*/
- TAILQ_INIT(&sc->sc_rx_rxlist);
+ TAILQ_INIT(&sc->sc_rx_rxlist[HAL_RX_QUEUE_HP]);
+ TAILQ_INIT(&sc->sc_rx_rxlist[HAL_RX_QUEUE_LP]);
/*
* Indicate we need the 802.11 header padded to a
Modified: head/sys/dev/ath/if_ath_rx_edma.c
==============================================================================
--- head/sys/dev/ath/if_ath_rx_edma.c Tue Apr 16 19:58:24 2013 (r249564)
+++ head/sys/dev/ath/if_ath_rx_edma.c Tue Apr 16 20:21:02 2013 (r249565)
@@ -398,7 +398,7 @@ ath_edma_recv_proc_queue(struct ath_soft
* queue.
*/
re->m_fifo[re->m_fifo_head] = NULL;
- TAILQ_INSERT_TAIL(&sc->sc_rx_rxlist, bf, bf_list);
+ TAILQ_INSERT_TAIL(&sc->sc_rx_rxlist[qtype], bf, bf_list);
/* Bump the descriptor FIFO stats */
INCR(re->m_fifo_head, re->m_fifolen);
@@ -451,8 +451,15 @@ ath_edma_flush_deferred_queue(struct ath
struct ath_buf *bf, *next;
ATH_RX_LOCK_ASSERT(sc);
+
/* Free in one set, inside the lock */
- TAILQ_FOREACH_SAFE(bf, &sc->sc_rx_rxlist, bf_list, next) {
+ TAILQ_FOREACH_SAFE(bf,
+ &sc->sc_rx_rxlist[HAL_RX_QUEUE_LP], bf_list, next) {
+ /* Free the buffer/mbuf */
+ ath_edma_rxbuf_free(sc, bf);
+ }
+ TAILQ_FOREACH_SAFE(bf,
+ &sc->sc_rx_rxlist[HAL_RX_QUEUE_HP], bf_list, next) {
/* Free the buffer/mbuf */
ath_edma_rxbuf_free(sc, bf);
}
@@ -482,7 +489,7 @@ ath_edma_recv_proc_deferred_queue(struct
/* Copy the list over */
ATH_RX_LOCK(sc);
- TAILQ_CONCAT(&rxlist, &sc->sc_rx_rxlist, bf_list);
+ TAILQ_CONCAT(&rxlist, &sc->sc_rx_rxlist[qtype], bf_list);
ATH_RX_UNLOCK(sc);
/* Handle the completed descriptors */
Modified: head/sys/dev/ath/if_athvar.h
==============================================================================
--- head/sys/dev/ath/if_athvar.h Tue Apr 16 19:58:24 2013 (r249564)
+++ head/sys/dev/ath/if_athvar.h Tue Apr 16 20:21:02 2013 (r249565)
@@ -542,6 +542,7 @@ struct ath_softc {
struct ath_rx_methods sc_rx;
struct ath_rx_edma sc_rxedma[HAL_NUM_RX_QUEUES]; /* HP/LP queues */
+ ath_bufhead sc_rx_rxlist[HAL_NUM_RX_QUEUES]; /* deferred RX completion */
struct ath_tx_methods sc_tx;
struct ath_tx_edma_fifo sc_txedma[HAL_NUM_TX_QUEUES];
@@ -700,7 +701,6 @@ struct ath_softc {
struct ath_descdma sc_rxdma; /* RX descriptors */
ath_bufhead sc_rxbuf; /* receive buffer */
- ath_bufhead sc_rx_rxlist; /* deferred RX completion */
u_int32_t *sc_rxlink; /* link ptr in last RX desc */
struct task sc_rxtask; /* rx int processing */
u_int8_t sc_defant; /* current default antenna */
More information about the svn-src-head
mailing list