PERFORCE change 169443 for review
Yohanes Nugroho
yohanes at FreeBSD.org
Tue Oct 13 00:24:17 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=169443
Change 169443 by yohanes at 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);
}
}
More information about the p4-projects
mailing list