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>