From c5a25ac948811fb6d444783e05c7add881a148c1 Mon Sep 17 00:00:00 2001 From: Alexander Egorenkov Date: Thu, 11 Feb 2010 12:10:55 +0100 Subject: [PATCH] DMA sync fixes for amd64; Improved Tx processing loop --- rt2860.c | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/rt2860.c b/rt2860.c index 5eebab4..6455d67 100644 --- a/rt2860.c +++ b/rt2860.c @@ -4732,6 +4732,20 @@ static void rt2860_tx_done_task(void *context, int pending) if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) return; + for (i = RT2860_SOFTC_TX_RING_COUNT - 1; i >= 0; i--) + { + if (sc->intr_pending_mask & (RT2860_REG_INT_TX_AC0_DONE << i)) + { + sc->intr_pending_mask &= ~(RT2860_REG_INT_TX_AC0_DONE << i); + + rt2860_tx_eof(sc, &sc->tx_ring[i]); + } + } + + sc->tx_timer = 0; + + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + intr_mask = (RT2860_REG_INT_TX_MGMT_DONE | RT2860_REG_INT_TX_HCCA_DONE | RT2860_REG_INT_TX_AC3_DONE | @@ -4739,15 +4753,6 @@ static void rt2860_tx_done_task(void *context, int pending) RT2860_REG_INT_TX_AC1_DONE | RT2860_REG_INT_TX_AC0_DONE); - sc->intr_pending_mask &= ~intr_mask; - - for (i = RT2860_SOFTC_TX_RING_COUNT - 1; i >= 0; i--) - rt2860_tx_eof(sc, &sc->tx_ring[i]); - - sc->tx_timer = 0; - - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - RT2860_SOFTC_LOCK(sc); rt2860_intr_enable(sc, ~sc->intr_pending_mask & @@ -4883,11 +4888,11 @@ static int rt2860_rx_eof(struct rt2860_softc *sc, int limit) nframes = 0; + bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + while (limit != 0) { - bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, - BUS_DMASYNC_POSTREAD); - index = rt2860_io_mac_read(sc, RT2860_REG_SCHDMA_RX_DRX_IDX); if (ring->cur == index) break; @@ -4938,6 +4943,9 @@ static int rt2860_rx_eof(struct rt2860_softc *sc, int limit) data->dma_map = ring->spare_dma_map; ring->spare_dma_map = dma_map; + bus_dmamap_sync(ring->data_dma_tag, data->dma_map, + BUS_DMASYNC_PREREAD); + m = data->m; data->m = mnew; @@ -5123,14 +5131,14 @@ skip: desc->sdl0 &= ~htole16(RT2860_RXDESC_SDL0_DDONE); - bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - ring->cur = (ring->cur + 1) % RT2860_SOFTC_RX_RING_DATA_COUNT; limit--; } + bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, + BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); + if (ring->cur == 0) rt2860_io_mac_write(sc, RT2860_REG_SCHDMA_RX_CALC_IDX, RT2860_SOFTC_RX_RING_DATA_COUNT - 1); @@ -5164,11 +5172,11 @@ static void rt2860_tx_eof(struct rt2860_softc *sc, ndescs = 0; nframes = 0; + bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + for (;;) { - bus_dmamap_sync(ring->desc_dma_tag, ring->desc_dma_map, - BUS_DMASYNC_POSTREAD); - index = rt2860_io_mac_read(sc, RT2860_REG_SCHDMA_TX_DTX_IDX(ring->qid)); if (ring->desc_next == index) break; -- 2.11.4.GIT