svn commit: r220458 - stable/7/sys/dev/age
Pyun YongHyeon
yongari at FreeBSD.org
Fri Apr 8 19:08:49 UTC 2011
Author: yongari
Date: Fri Apr 8 19:08:48 2011
New Revision: 220458
URL: http://svn.freebsd.org/changeset/base/220458
Log:
MFC r220249,220252:
r220249:
64bit DMA caused data corruption. Unfortunately there is no known
workaround to use 64bit DMA.
Disable 64bit DMA on Attansic L1 controller.
Tested by: Yamagi Burmeister (lists <> yamagi dot org)
r220252:
Partially revert r184106. RX buffer ring also needs bus_dmamap_sync().
Tested by: Yamagi Burmeister (lists <> yamagi dot org)
Modified:
stable/7/sys/dev/age/if_age.c
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/dev/age/if_age.c
==============================================================================
--- stable/7/sys/dev/age/if_age.c Fri Apr 8 19:06:01 2011 (r220457)
+++ stable/7/sys/dev/age/if_age.c Fri Apr 8 19:08:48 2011 (r220458)
@@ -1092,11 +1092,14 @@ again:
* Create Tx/Rx buffer parent tag.
* L1 supports full 64bit DMA addressing in Tx/Rx buffers
* so it needs separate parent DMA tag.
+ * XXX
+ * It seems enabling 64bit DMA causes data corruption. Limit
+ * DMA address space to 32bit.
*/
error = bus_dma_tag_create(
bus_get_dma_tag(sc->age_dev), /* parent */
1, 0, /* alignment, boundary */
- BUS_SPACE_MAXADDR, /* lowaddr */
+ BUS_SPACE_MAXADDR_32BIT, /* lowaddr */
BUS_SPACE_MAXADDR, /* highaddr */
NULL, NULL, /* filter, filterarg */
BUS_SPACE_MAXSIZE_32BIT, /* maxsize */
@@ -2421,6 +2424,8 @@ age_rxintr(struct age_softc *sc, int rr_
bus_dmamap_sync(sc->age_cdata.age_rr_ring_tag,
sc->age_cdata.age_rr_ring_map,
BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+ bus_dmamap_sync(sc->age_cdata.age_rx_ring_tag,
+ sc->age_cdata.age_rx_ring_map, BUS_DMASYNC_POSTWRITE);
for (prog = 0; rr_cons != rr_prod; prog++) {
if (count <= 0)
@@ -2452,6 +2457,8 @@ age_rxintr(struct age_softc *sc, int rr_
/* Update the consumer index. */
sc->age_cdata.age_rr_cons = rr_cons;
+ bus_dmamap_sync(sc->age_cdata.age_rx_ring_tag,
+ sc->age_cdata.age_rx_ring_map, BUS_DMASYNC_PREWRITE);
/* Sync descriptors. */
bus_dmamap_sync(sc->age_cdata.age_rr_ring_tag,
sc->age_cdata.age_rr_ring_map,
@@ -2978,8 +2985,7 @@ age_init_rx_ring(struct age_softc *sc)
}
bus_dmamap_sync(sc->age_cdata.age_rx_ring_tag,
- sc->age_cdata.age_rx_ring_map,
- BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+ sc->age_cdata.age_rx_ring_map, BUS_DMASYNC_PREWRITE);
return (0);
}
More information about the svn-src-all
mailing list