Author: yongari
Date: Fri Apr  8 19:06:01 2011
New Revision: 220457
URL: http://svn.freebsd.org/changeset/base/220457

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/8/sys/dev/age/if_age.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/dev/age/if_age.c
==============================================================================
--- stable/8/sys/dev/age/if_age.c       Fri Apr  8 18:48:57 2011        
(r220456)
+++ stable/8/sys/dev/age/if_age.c       Fri Apr  8 19:06:01 2011        
(r220457)
@@ -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);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to