diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-03-30 11:51:36 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-04-01 09:15:30 +0200 |
commit | 822aa5dee2f26eab398e28d6480e97ea42621408 (patch) | |
tree | fb5c70665daa9f9690f404ae72e0b175ef0d8dfa /freebsd/sys/dev/dwc | |
parent | if_dwc: Fix transmit starvation (diff) | |
download | rtems-libbsd-822aa5dee2f26eab398e28d6480e97ea42621408.tar.bz2 |
if_dwc: Simplify tx desc setup
Diffstat (limited to 'freebsd/sys/dev/dwc')
-rw-r--r-- | freebsd/sys/dev/dwc/if_dwc.c | 34 |
1 files changed, 9 insertions, 25 deletions
diff --git a/freebsd/sys/dev/dwc/if_dwc.c b/freebsd/sys/dev/dwc/if_dwc.c index 863816d2..59a980d3 100644 --- a/freebsd/sys/dev/dwc/if_dwc.c +++ b/freebsd/sys/dev/dwc/if_dwc.c @@ -242,32 +242,17 @@ inline static uint32_t dwc_setup_txdesc(struct dwc_softc *sc, int idx, bus_addr_t paddr, uint32_t len) { - uint32_t flags; - uint32_t nidx; - - nidx = next_txidx(sc, idx); - - /* Addr/len 0 means we're clearing the descriptor after xmit done. */ - if (paddr == 0 || len == 0) { - flags = 0; - --sc->txcount; - } else { - flags = DDESC_TDES0_TXCHAIN | DDESC_TDES0_TXFIRST - | DDESC_TDES0_TXLAST | DDESC_TDES0_TXINT; - ++sc->txcount; - } + ++sc->txcount; sc->txdesc_ring[idx].addr = (uint32_t)(paddr); - sc->txdesc_ring[idx].tdes0 = flags; sc->txdesc_ring[idx].tdes1 = len; + wmb(); - if (paddr && len) { - wmb(); - sc->txdesc_ring[idx].tdes0 |= DDESC_TDES0_OWN; - wmb(); - } + sc->txdesc_ring[idx].tdes0 = DDESC_TDES0_TXCHAIN | DDESC_TDES0_TXFIRST + | DDESC_TDES0_TXLAST | DDESC_TDES0_TXINT | DDESC_TDES0_OWN; + wmb(); - return (nidx); + return (next_txidx(sc, idx)); } static int @@ -817,7 +802,7 @@ dwc_txfinish_locked(struct dwc_softc *sc) #endif /* __rtems__ */ m_freem(bmap->mbuf); bmap->mbuf = NULL; - dwc_setup_txdesc(sc, sc->tx_idx_tail, 0, 0); + --sc->txcount; sc->tx_idx_tail = next_txidx(sc, sc->tx_idx_tail); } @@ -981,6 +966,7 @@ setup_dma(struct dwc_softc *sc) #endif /* __rtems__ */ for (idx = 0; idx < TX_DESC_COUNT; idx++) { + sc->txdesc_ring[idx].addr = 0; sc->txdesc_ring[idx].tdes0 = DDESC_TDES0_TXCHAIN; sc->txdesc_ring[idx].tdes1 = 0; nidx = next_txidx(sc, idx); @@ -1022,7 +1008,6 @@ setup_dma(struct dwc_softc *sc) goto out; } #endif /* __rtems__ */ - dwc_setup_txdesc(sc, idx, 0, 0); } /* @@ -1186,8 +1171,7 @@ dwc_attach(device_t dev) sc->dev = dev; sc->mii_clk = MII_CLK_VAL; sc->rx_idx = 0; - - sc->txcount = TX_DESC_COUNT; + sc->txcount = 0; if (bus_alloc_resources(dev, dwc_spec, sc->res)) { device_printf(dev, "could not allocate resources\n"); |