PERFORCE change 91075 for review
Warner Losh
imp at FreeBSD.org
Sat Feb 4 08:31:24 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=91075
Change 91075 by imp at imp_plunger on 2006/02/04 16:30:31
I think this is close to basically working now.
Affected files ...
.. //depot/projects/arm/src/sys/arm/at91/if_ate.c#27 edit
Differences ...
==== //depot/projects/arm/src/sys/arm/at91/if_ate.c#27 (text+ko) ====
@@ -25,13 +25,13 @@
/* TODO: (in no order)
*
* 5) Setup RX buffers in ateinit_locked
+ * 8) Need to sync busdma goo in atestop
+ * 9) atestop should maybe free the mbufs?
+ * 10) On Rx, how do we get a new mbuf?
*
* 1) detach
* 2) Free dma setup
* 3) Turn on the clock in pmc and turn on pins? Turn off?
- * 6) Interrupt bits as appropriate
- * 7) Keep track of the mbufs in flight on TX and free them in the ISR.
- * 8) Need to sync busdma goo in atestop
*/
#include <sys/cdefs.h>
@@ -227,7 +227,7 @@
static int
ate_detach(device_t dev)
{
- return EBUSY; /* XXX */
+ return EBUSY; /* XXX TODO(1) */
}
static void
@@ -346,6 +346,7 @@
sc->rx_descs, ATE_MAX_RX_BUFFERS * sizeof(eth_rx_desc_t),
ate_getaddr, sc, 0) != 0)
goto errout;
+ /* XXX TODO(5) Put this in ateinit_locked? */
for (i = 0; i < ATE_MAX_RX_BUFFERS; i++) {
bus_dma_segment_t seg;
int nsegs;
@@ -381,7 +382,7 @@
struct ate_softc *sc;
sc = device_get_softc(dev);
- /* XXX teardown busdma junk, below from fxp -- customize */
+ /* XXX TODO(2) teardown busdma junk, below from fxp -- customize */
#if 0
if (sc->fxp_mtag) {
for (i = 0; i < FXP_NRFABUFS; i++) {
@@ -584,10 +585,12 @@
sc->rx_map[i], BUS_DMASYNC_POSTREAD);
bus_dmamap_unload(sc->rxtag,
sc->rx_map[i]);
+ WR4(sc, ETH_RSR, RD4(sc, ETH_RSR));
/*
- * Clear the corresponding bits in RSR.
+ * Allocate a new buffer to replace this one.
+ * if we cannot, then we drop this packet
+ * and keep the old buffer we had.
*/
- WR4(sc, ETH_RSR, RD4(sc, ETH_RSR));
sc->rx_mbuf[i] = m_getcl(M_DONTWAIT, MT_DATA,
M_PKTHDR);
if (!sc->rx_mbuf[i]) {
@@ -596,7 +599,7 @@
bus_dmamap_sync(sc->rx_desc_tag,
sc->rx_desc_map,
BUS_DMASYNC_PREWRITE);
- break;
+ continue;
}
if (bus_dmamap_load_mbuf_sg(sc->rxtag,
sc->rx_map[i],
@@ -606,7 +609,7 @@
bus_dmamap_sync(sc->rx_desc_tag,
sc->rx_desc_map,
BUS_DMASYNC_PREWRITE);
- break;
+ continue;
}
/*
* For the last buffer, set the wrap bit so
@@ -620,8 +623,6 @@
mb->m_len = rx_stat & ETH_LEN_MASK;
(*sc->ifp->if_input)(sc->ifp, mb);
break;
-
-
}
}
}
@@ -662,7 +663,8 @@
ATE_ASSERT_LOCKED(sc);
/*
- * XXX we need to turn on the EMAC clock in the pmc. With the
+ * XXX TODO(3)
+ * we need to turn on the EMAC clock in the pmc. With the
* default boot loader, this is already turned on. However, we
* need to think about how best to turn it on/off as the interface
* is brought up/down, as well as dealing with the mii bus...
@@ -698,7 +700,7 @@
* swapping to do. Again, if we need it (which I don't think we do).
*/
- /* XXX need to setup multicast filters */
+ ate_setmcast(sc);
/*
* Set 'running' flag, and clear output active flag
@@ -766,19 +768,16 @@
WR4(sc, ETH_TAR, segs[0].ds_addr);
WR4(sc, ETH_TCR, segs[0].ds_len);
- /* XXX the following is wrong, we need to keep track of the mbuf and
- * only free it when the ISR fires indicating xmit complete.
- */
-
/*
* Tap off here if there is a bpf listener.
*/
BPF_MTAP(ifp, m);
- m_freem(m);
/*
- * Once we've queued one packet, we'll do the rest via the ISR
+ * Once we've queued one packet, we'll do the rest via the ISR,
+ * save off a pointer.
*/
+ sc->sent_mbuf[1] = m;
}
static void
@@ -843,7 +842,8 @@
WR4(sc, ETH_RSR, 0xffffffff);
/*
- * XXX need to worry about the busdma resources? Yes, I think we need
+ * XXX TODO(8)
+ * need to worry about the busdma resources? Yes, I think we need
* to sync and unload them. We may also need to release the mbufs
* that are assocaited with RX and TX operations.
*/
More information about the p4-projects
mailing list