diff options
author | tmm <tmm@FreeBSD.org> | 2003-01-21 17:17:01 +0000 |
---|---|---|
committer | tmm <tmm@FreeBSD.org> | 2003-01-21 17:17:01 +0000 |
commit | 2fe5a13b8fa5331d001f3121a47f56057423648f (patch) | |
tree | 42fdfd1bc727d9599c5b3768782edb5fae2f1458 /sys/dev/gem | |
parent | c33c23494393704bee7cde042d1876c8b847dbba (diff) | |
download | FreeBSD-src-2fe5a13b8fa5331d001f3121a47f56057423648f.zip FreeBSD-src-2fe5a13b8fa5331d001f3121a47f56057423648f.tar.gz |
bus_dmamap_sync() overhaul:
- Remove NetBSD-style or-ed together BUS_DMASYNC operations, in some
cases relaxing the (intended) syncing operation a bit.
- Stop pretending that that we can sync part of a dmamap: replace the
GEM_CDTXSYNC and GEM_CDRXSYNC macros with GEM_CDSYNC to sync the
complete control map, and combine syncs wherever possible to avoid
the overhead.
- Sync all maps before unloading them.
- Remove a few syncs which should be unnecessary.
Diffstat (limited to 'sys/dev/gem')
-rw-r--r-- | sys/dev/gem/if_gem.c | 34 | ||||
-rw-r--r-- | sys/dev/gem/if_gemvar.h | 6 |
2 files changed, 18 insertions, 22 deletions
diff --git a/sys/dev/gem/if_gem.c b/sys/dev/gem/if_gem.c index b6fc4a7..09bef5f 100644 --- a/sys/dev/gem/if_gem.c +++ b/sys/dev/gem/if_gem.c @@ -371,6 +371,8 @@ gem_detach(sc) bus_dmamap_destroy(sc->sc_tdmatag, sc->sc_txsoft[i].txs_dmamap); } + GEM_CDSYNC(sc, BUS_DMASYNC_POSTREAD); + GEM_CDSYNC(sc, BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(sc->sc_cdmatag, sc->sc_cddmamap); bus_dmamem_free(sc->sc_cdmatag, sc->sc_control_data, sc->sc_cddmamap); @@ -570,6 +572,8 @@ gem_rxdrain(sc) for (i = 0; i < GEM_NRXDESC; i++) { rxs = &sc->sc_rxsoft[i]; if (rxs->rxs_mbuf != NULL) { + bus_dmamap_sync(sc->sc_rdmatag, rxs->rxs_dmamap, + BUS_DMASYNC_POSTREAD); bus_dmamap_unload(sc->sc_rdmatag, rxs->rxs_dmamap); m_freem(rxs->rxs_mbuf); rxs->rxs_mbuf = NULL; @@ -602,6 +606,8 @@ gem_stop(ifp, disable) while ((txs = STAILQ_FIRST(&sc->sc_txdirtyq)) != NULL) { STAILQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q); if (txs->txs_ndescs != 0) { + bus_dmamap_sync(sc->sc_tdmatag, txs->txs_dmamap, + BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(sc->sc_tdmatag, txs->txs_dmamap); if (txs->txs_mbuf != NULL) { m_freem(txs->txs_mbuf); @@ -750,8 +756,6 @@ gem_meminit(sc) sc->sc_txdescs[i].gd_flags = 0; sc->sc_txdescs[i].gd_addr = 0; } - GEM_CDTXSYNC(sc, 0, GEM_NTXDESC, - BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); sc->sc_txfree = GEM_MAXTXFREE; sc->sc_txnext = 0; sc->sc_txwin = 0; @@ -778,6 +782,8 @@ gem_meminit(sc) GEM_INIT_RXDESC(sc, i); } sc->sc_rxptr = 0; + GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE); + GEM_CDSYNC(sc, BUS_DMASYNC_PREREAD); return (0); } @@ -978,10 +984,6 @@ gem_load_txmbuf(sc, m0) STAILQ_REMOVE_HEAD(&sc->sc_txfreeq, txs_q); STAILQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q); - /* Sync the descriptors we're using. */ - GEM_CDTXSYNC(sc, sc->sc_txnext, txs->txs_ndescs, - BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); - sc->sc_txnext = GEM_NEXTTX(txs->txs_lastdesc); sc->sc_txfree -= txs->txs_ndescs; return (0); @@ -1149,6 +1151,8 @@ gem_start(ifp) } if (ntx > 0) { + GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE); + CTR2(KTR_GEM, "%s: packets enqueued, OWN on %d", device_get_name(sc->sc_dev), firsttx); @@ -1197,10 +1201,8 @@ gem_tint(sc) * Go through our Tx list and free mbufs for those * frames that have been transmitted. */ + GEM_CDSYNC(sc, BUS_DMASYNC_POSTREAD); while ((txs = STAILQ_FIRST(&sc->sc_txdirtyq)) != NULL) { - GEM_CDTXSYNC(sc, txs->txs_lastdesc, - txs->txs_ndescs, - BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); #ifdef GEM_DEBUG if (ifp->if_flags & IFF_DEBUG) { @@ -1322,13 +1324,11 @@ gem_rint(sc) CTR2(KTR_GEM, "gem_rint: sc->rxptr %d, complete %d", sc->sc_rxptr, rxcomp); + GEM_CDSYNC(sc, BUS_DMASYNC_POSTREAD); for (i = sc->sc_rxptr; i != rxcomp; i = GEM_NEXTRX(i)) { rxs = &sc->sc_rxsoft[i]; - GEM_CDRXSYNC(sc, i, - BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); - rxstat = GEM_DMA_READ(sc, sc->sc_rxdescs[i].gd_flags); if (rxstat & GEM_RD_OWN) { @@ -1357,8 +1357,6 @@ gem_rint(sc) continue; } - bus_dmamap_sync(sc->sc_rdmatag, rxs->rxs_dmamap, - BUS_DMASYNC_POSTREAD); #ifdef GEM_DEBUG if (ifp->if_flags & IFF_DEBUG) { printf(" rxsoft %p descriptor %d: ", rxs, i); @@ -1384,8 +1382,6 @@ gem_rint(sc) if (gem_add_rxbuf(sc, i) != 0) { ifp->if_ierrors++; GEM_INIT_RXDESC(sc, i); - bus_dmamap_sync(sc->sc_rdmatag, rxs->rxs_dmamap, - BUS_DMASYNC_PREREAD); continue; } m->m_data += 2; /* We're already off by two */ @@ -1398,6 +1394,7 @@ gem_rint(sc) } if (progress) { + GEM_CDSYNC(sc, BUS_DMASYNC_PREWRITE); /* Update the receive pointer. */ if (i == sc->sc_rxptr) { device_printf(sc->sc_dev, "rint: ring wrap\n"); @@ -1435,8 +1432,11 @@ gem_add_rxbuf(sc, idx) memset(m->m_ext.ext_buf, 0, m->m_ext.ext_size); #endif - if (rxs->rxs_mbuf != NULL) + if (rxs->rxs_mbuf != NULL) { + bus_dmamap_sync(sc->sc_rdmatag, rxs->rxs_dmamap, + BUS_DMASYNC_POSTREAD); bus_dmamap_unload(sc->sc_rdmatag, rxs->rxs_dmamap); + } rxs->rxs_mbuf = m; diff --git a/sys/dev/gem/if_gemvar.h b/sys/dev/gem/if_gemvar.h index 62e0b18..4bf9bb0 100644 --- a/sys/dev/gem/if_gemvar.h +++ b/sys/dev/gem/if_gemvar.h @@ -193,12 +193,9 @@ struct gem_softc { #define GEM_CDTXADDR(sc, x) ((sc)->sc_cddma + GEM_CDTXOFF((x))) #define GEM_CDRXADDR(sc, x) ((sc)->sc_cddma + GEM_CDRXOFF((x))) -#define GEM_CDTXSYNC(sc, x, n, ops) \ +#define GEM_CDSYNC(sc, ops) \ bus_dmamap_sync((sc)->sc_cdmatag, (sc)->sc_cddmamap, (ops)); \ -#define GEM_CDRXSYNC(sc, x, ops) \ - bus_dmamap_sync((sc)->sc_cdmatag, (sc)->sc_cddmamap, (ops)) - #define GEM_INIT_RXDESC(sc, x) \ do { \ struct gem_rxsoft *__rxs = &sc->sc_rxsoft[(x)]; \ @@ -212,7 +209,6 @@ do { \ GEM_DMA_WRITE((sc), \ (((__m->m_ext.ext_size)<<GEM_RD_BUFSHIFT) \ & GEM_RD_BUFSIZE) | GEM_RD_OWN); \ - GEM_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \ } while (0) #ifdef _KERNEL |