svn commit: r195434 - projects/mips/sys/mips/atheros

Oleksandr Tymoshenko gonzo at FreeBSD.org
Wed Jul 8 02:21:08 UTC 2009


Author: gonzo
Date: Wed Jul  8 02:21:08 2009
New Revision: 195434
URL: http://svn.freebsd.org/changeset/base/195434

Log:
  - Fix off-by-one bug in arge_fixup_rx. If mbuf is located
      by the end of the page and even number of bytes long,
      that may cause TLBMiss exception for unallocated address.
  - Fix mess with DMA sync opeartions

Modified:
  projects/mips/sys/mips/atheros/if_arge.c

Modified: projects/mips/sys/mips/atheros/if_arge.c
==============================================================================
--- projects/mips/sys/mips/atheros/if_arge.c	Wed Jul  8 02:12:47 2009	(r195433)
+++ projects/mips/sys/mips/atheros/if_arge.c	Wed Jul  8 02:21:08 2009	(r195434)
@@ -162,7 +162,6 @@ DRIVER_MODULE(miibus, arge, miibus_drive
  */
 extern uint32_t ar711_base_mac[ETHER_ADDR_LEN];
 
-
 /*
  * Flushes all 
  */
@@ -1323,7 +1322,7 @@ arge_rx_ring_init(struct arge_softc *sc)
 
 	bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag,
 	    sc->arge_cdata.arge_rx_ring_map,
-	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+	    BUS_DMASYNC_PREWRITE);
 
 	return (0);
 }
@@ -1356,8 +1355,6 @@ arge_newbuf(struct arge_softc *sc, int i
 
 	rxd = &sc->arge_cdata.arge_rxdesc[idx];
 	if (rxd->rx_m != NULL) {
-		bus_dmamap_sync(sc->arge_cdata.arge_rx_tag, rxd->rx_dmamap,
-		    BUS_DMASYNC_POSTREAD);
 		bus_dmamap_unload(sc->arge_cdata.arge_rx_tag, rxd->rx_dmamap);
 	}
 	map = rxd->rx_dmamap;
@@ -1370,6 +1367,10 @@ arge_newbuf(struct arge_softc *sc, int i
 	desc->packet_addr = segs[0].ds_addr;
 	desc->packet_ctrl = ARGE_DESC_EMPTY | ARGE_DMASIZE(segs[0].ds_len);
 
+	bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag,
+	    sc->arge_cdata.arge_rx_ring_map,
+	    BUS_DMASYNC_PREWRITE);
+
 	return (0);
 }
 
@@ -1382,8 +1383,12 @@ arge_fixup_rx(struct mbuf *m)
 	src = mtod(m, uint16_t *);
 	dst = src - 1;
 
-	for (i = 0; i < (m->m_len / sizeof(uint16_t) + 1); i++)
+	for (i = 0; i < m->m_len / sizeof(uint16_t); i++) {
 		*dst++ = *src++;
+	}
+
+	if (m->m_len % sizeof(uint16_t))
+		*(uint8_t *)dst = *(uint8_t *)src;
 
 	m->m_data -= ETHER_ALIGN;
 }
@@ -1497,7 +1502,7 @@ arge_rx_locked(struct arge_softc *sc)
 
 		packet_len = ARGE_DMASIZE(cur_rx->packet_ctrl);
 		bus_dmamap_sync(sc->arge_cdata.arge_rx_tag, rxd->rx_dmamap,
-		    BUS_DMASYNC_PREREAD);
+		    BUS_DMASYNC_POSTREAD);
 		m = rxd->rx_m;
 
 		arge_fixup_rx(m);
@@ -1526,14 +1531,9 @@ arge_rx_locked(struct arge_softc *sc)
 
 		bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag,
 		    sc->arge_cdata.arge_rx_ring_map,
-		    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
-
+		    BUS_DMASYNC_PREWRITE);
 
 		sc->arge_cdata.arge_rx_cons = cons;
-
-		bus_dmamap_sync(sc->arge_cdata.arge_rx_ring_tag,
-		    sc->arge_cdata.arge_rx_ring_map,
-		    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 	}
 }
 


More information about the svn-src-projects mailing list