Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 13 Oct 2009 00:24:16 GMT
From:      Yohanes Nugroho <yohanes@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 169443 for review
Message-ID:  <200910130024.n9D0OGZs008582@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=169443

Change 169443 by yohanes@econa on 2009/10/13 00:23:59

	dmamap sync

Affected files ...

.. //depot/projects/str91xx/src/sys/arm/econa/if_ece.c#6 edit

Differences ...

==== //depot/projects/str91xx/src/sys/arm/econa/if_ece.c#6 (text+ko) ====

@@ -67,8 +67,8 @@
 #include "miibus_if.h"
 
 
-#define ECE_MAX_TX_BUFFERS 256
-#define ECE_MAX_RX_BUFFERS 256
+#define ECE_MAX_TX_BUFFERS 128
+#define ECE_MAX_RX_BUFFERS 128
 
 
 #define MAX_FRAGMENT 32
@@ -99,11 +99,10 @@
 
 	struct callout tick_ch;		/* Tick callout */
 
-	bus_dmamap_t		dmamap_tx;
-	bus_dmamap_t		dmamap_rx;
+	bus_dmamap_t		dmamap_ring_tx;
+	bus_dmamap_t		dmamap_ring_rx;
 
 
-	bus_dmamap_t		sparemap_rx;
 
 
 	eth_tx_desc_t*	        desc_tx;
@@ -112,6 +111,10 @@
 	bus_dma_tag_t	dmatag_ring_tx;
 	bus_dma_tag_t	dmatag_ring_rx;
 
+	bus_dma_tag_t	dmatag_data_tx;
+	bus_dma_tag_t	dmatag_data_rx;
+
+
 	bus_addr_t		ring_paddr_tx;
 	bus_addr_t		ring_paddr_rx;
 	bus_dmamap_t		dmap_tx[ECE_MAX_TX_BUFFERS];
@@ -120,8 +123,6 @@
 	struct mbuf*		buffer_tx[ECE_MAX_TX_BUFFERS];
 	struct mbuf*		buffer_rx[ECE_MAX_RX_BUFFERS];
 
-	bus_dma_tag_t	dmatag_tx;
-	bus_dma_tag_t	dmatag_rx;
 
 
 	uint32_t	desc_curr_tx;
@@ -627,27 +628,27 @@
 	    sizeof(eth_tx_desc_t)*ECE_MAX_TX_BUFFERS, 1,		/* maxsize, nsegments */
 	    sizeof(eth_tx_desc_t)*ECE_MAX_TX_BUFFERS, 0,		/* maxsegsz, flags */
 	    NULL, NULL,				/* lockfunc, lockfuncarg */
-	    &sc->dmatag_tx);		/* dmat */
+	    &sc->dmatag_data_tx);		/* dmat */
 
 
-	error = bus_dmamem_alloc(sc->dmatag_tx,
+	error = bus_dmamem_alloc(sc->dmatag_data_tx,
 				 (void**)&(sc->desc_tx),
 				 BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT,
-				 &(sc->dmamap_tx));
+				 &(sc->dmamap_ring_tx));
 	
 	if (error) {
 		if_printf(sc->ifp, "failed to allocate DMA memory\n");
 		return (ENXIO);
 	}
 
-	error = bus_dmamap_load(sc->dmatag_tx, sc->dmamap_tx,
+	error = bus_dmamap_load(sc->dmatag_data_tx, sc->dmamap_ring_tx,
 				sc->desc_tx, sizeof(eth_tx_desc_t)*ECE_MAX_TX_BUFFERS, ece_getaddr,
 				&(sc->ring_paddr_tx), BUS_DMA_NOWAIT);
 
 	if (error) {
 		if_printf(sc->ifp, "can't load descriptor\n");
-		bus_dmamem_free(sc->dmatag_tx, sc->desc_tx,
-				sc->dmamap_tx);
+		bus_dmamem_free(sc->dmatag_data_tx, sc->desc_tx,
+				sc->dmamap_ring_tx);
 		sc->desc_tx = NULL;
 		return (ENXIO);
 	}
@@ -699,17 +700,17 @@
 		}
 	}
 	
-	if (sc->dmamap_tx) {		
-		bus_dmamap_unload(sc->dmatag_tx, sc->dmamap_tx);
+	if (sc->dmamap_ring_tx) {		
+		bus_dmamap_unload(sc->dmatag_data_tx, sc->dmamap_ring_tx);
 		if (sc->desc_tx) {
-			bus_dmamem_free(sc->dmatag_tx, sc->desc_tx, sc->dmamap_tx);
+			bus_dmamem_free(sc->dmatag_data_tx, sc->desc_tx, sc->dmamap_ring_tx);
 		}
-		sc->dmamap_tx = 0;
+		sc->dmamap_ring_tx = 0;
 	}
 
-	if (sc->dmatag_tx) {
-		bus_dma_tag_destroy(sc->dmatag_tx);
-		sc->dmatag_tx = 0;
+	if (sc->dmatag_data_tx) {
+		bus_dma_tag_destroy(sc->dmatag_data_tx);
+		sc->dmatag_data_tx = 0;
 	}
 
 	if (sc->dmatag_ring_tx) {
@@ -744,27 +745,27 @@
 	    sizeof(eth_rx_desc_t)*ECE_MAX_RX_BUFFERS, 1,		/* maxsize, nsegments */
 	    sizeof(eth_rx_desc_t)*ECE_MAX_RX_BUFFERS, 0,		/* maxsegsz, flags */
 	    NULL, NULL,				/* lockfunc, lockfuncarg */
-	    &sc->dmatag_rx);		/* dmat */
+	    &sc->dmatag_data_rx);		/* dmat */
 
 
-	error = bus_dmamem_alloc(sc->dmatag_rx,
+	error = bus_dmamem_alloc(sc->dmatag_data_rx,
 				 (void**)&(sc->desc_rx),
 				 BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT,
-				 &(sc->dmamap_rx));
+				 &(sc->dmamap_ring_rx));
 	
 	if (error) {
 		if_printf(sc->ifp, "failed to allocate DMA memory\n");
 		return (ENXIO);
 	}
 
-	error = bus_dmamap_load(sc->dmatag_rx, sc->dmamap_rx,
+	error = bus_dmamap_load(sc->dmatag_data_rx, sc->dmamap_ring_rx,
 				sc->desc_rx, sizeof(eth_rx_desc_t)*ECE_MAX_RX_BUFFERS, ece_getaddr,
 				&(sc->ring_paddr_rx), BUS_DMA_NOWAIT);
 
 	if (error) {
 		if_printf(sc->ifp, "can't load descriptor\n");
-		bus_dmamem_free(sc->dmatag_rx, sc->desc_rx,
-				sc->dmamap_rx);
+		bus_dmamem_free(sc->dmatag_data_rx, sc->desc_rx,
+				sc->dmamap_ring_rx);
 		sc->desc_rx = NULL;
 		return (ENXIO);
 	}
@@ -791,8 +792,6 @@
 	}
 	
 
-	error = bus_dmamap_create(sc->dmatag_ring_rx, 0, &sc->sparemap_rx);
-
 	for (int i =0; i<ECE_MAX_RX_BUFFERS; i++) {
 		error = bus_dmamap_create(sc->dmatag_ring_rx, 0, &sc->dmap_rx[i]);
 		if (error) {
@@ -820,13 +819,13 @@
 		}
 	}
 
-	if (sc->dmatag_rx) {
-		bus_dmamap_unload(sc->dmatag_rx, sc->dmamap_rx);
-		bus_dmamem_free(sc->dmatag_rx, sc->desc_rx,
-			sc->dmamap_rx);
-		bus_dma_tag_destroy(sc->dmatag_rx);
-		sc->dmatag_rx = 0;
-		sc->dmamap_rx = 0;
+	if (sc->dmatag_data_rx) {
+		bus_dmamap_unload(sc->dmatag_data_rx, sc->dmamap_ring_rx);
+		bus_dmamem_free(sc->dmatag_data_rx, sc->desc_rx,
+			sc->dmamap_ring_rx);
+		bus_dma_tag_destroy(sc->dmatag_data_rx);
+		sc->dmatag_data_rx = 0;
+		sc->dmamap_ring_rx = 0;
 		sc->desc_rx = 0;
 	}
 
@@ -928,7 +927,7 @@
 	for (i = 0; i < ECE_MAX_RX_BUFFERS; i++) {
 		descrx = (eth_rx_desc_t *)&(sc->desc_rx[i]);
 		memset(descrx, 0, sizeof(eth_rx_desc_t));
-		ece_new_rxbuf(sc->dmatag_ring_rx, &sc->sparemap_rx, 
+		ece_new_rxbuf(sc->dmatag_ring_rx, &sc->dmap_rx[i], 
 			      &(sc->buffer_rx[i]),
 			      (bus_addr_t *)&(descrx->data_ptr));
 		descrx->length = sc->buffer_rx[i]->m_len;
@@ -1580,6 +1579,11 @@
 		}
 	}
 
+	bus_dmamap_sync(sc->dmatag_ring_rx,
+	    sc->dmamap_ring_rx,
+	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+
+
 	for (i= 0; i<rxcount; i++) {
 		/* Get status */
 		status = desc->cown;
@@ -1588,13 +1592,12 @@
 
 			int idx = sc->desc_curr_rx;
 
-			bus_dmamap_sync(sc->dmatag_rx, sc->dmap_rx[idx],
-					BUS_DMASYNC_PREREAD);
+			bus_dmamap_sync(sc->dmatag_data_rx, sc->dmap_rx[idx],
+					BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
 
 			mb = m_devget((void *)sc->buffer_rx[idx]->m_data,
 				      desc->length+16,
-				      0, ifp, NULL);
-			
+				      0, ifp, NULL);			
 
 			if (mb) {
 				mb->m_data += 2;
@@ -1628,6 +1631,10 @@
 			desc++;
 		}
 	}
+	bus_dmamap_sync(sc->dmatag_ring_rx,
+	    sc->dmamap_ring_rx,
+	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+
 	return;
 }
 
@@ -1701,6 +1708,10 @@
 	int start = sc->curr_tx_mbuf - 1;
 	if (start<0) start = ECE_MAX_TX_BUFFERS-1;
 	
+	bus_dmamap_sync(sc->dmatag_ring_tx,
+	    sc->dmamap_ring_tx,
+	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+
 	desc_idx = sc->sent_position[start];
 	while (desc_idx!=-1) {
 		//bus_dmamap_sync(sc->dmatag_ring_tx, sc->dmap_tx[desc_idx],  BUS_DMASYNC_PREREAD);
@@ -1708,6 +1719,9 @@
 		if (desc->cown != 0) {
 			if (sc->buffer_tx[start]) {
 				//printf("freeing\n");
+				bus_dmamap_sync(sc->dmatag_data_tx, sc->dmap_tx[desc_idx],
+						BUS_DMASYNC_POSTWRITE);
+				bus_dmamap_unload(sc->dmatag_data_tx, sc->dmap_tx[desc_idx]);
 				m_freem(sc->buffer_tx[start]);
 				sc->buffer_tx[start] = 0;
 
@@ -1816,7 +1830,7 @@
        
 	/* Fetch unused map */
 	desc_no = sc->desc_curr_tx;
-	mapp = sc->dmamap_tx;
+	mapp = sc->dmap_tx[desc_no];
 	//cpu_dcache_wbinv_all();
 	/* Create mapping in DMA memory */
 	error = bus_dmamap_load_mbuf_sg(sc->dmatag_ring_tx, mapp, m0, segs, &nsegs,
@@ -1905,7 +1919,8 @@
 
 	}
 
-	bus_dmamap_sync(sc->dmatag_ring_tx, mapp,    BUS_DMASYNC_PREWRITE);
+	bus_dmamap_sync(sc->dmatag_data_tx, mapp,    BUS_DMASYNC_PREWRITE);
+
 
 	return (0);
 }
@@ -1928,6 +1943,10 @@
 	    IFF_DRV_RUNNING)
 		return;
 
+	bus_dmamap_sync(sc->dmatag_ring_tx,
+	    sc->dmamap_ring_tx,
+	    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+
 	//WR4(sc, TS_DMA_CONTROL, 0);
 	for (;;) {
 		/* Get packet from the queue */
@@ -1944,6 +1963,7 @@
 		BPF_MTAP(ifp, m0);
 	}
 	if (queued) {
+		bus_dmamap_sync(sc->dmatag_ring_tx, sc->dmamap_ring_tx,    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
 		WR4(sc, TS_DMA_CONTROL, 1);
 	}
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910130024.n9D0OGZs008582>