Date: Sat, 4 Feb 2006 02:42:44 GMT From: Olivier Houchard <cognet@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 91025 for review Message-ID: <200602040242.k142giNw063338@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=91025 Change 91025 by cognet@cognet on 2006/02/04 02:42:20 Use m_defrag to make sure we only have one mbuf. Enable RX and TX interrupts. TX seems to work, RX not yet, it doesn't even generate an interrupt when it receives a packet. Affected files ... .. //depot/projects/arm/src/sys/arm/at91/if_ate.c#24 edit Differences ... ==== //depot/projects/arm/src/sys/arm/at91/if_ate.c#24 (text+ko) ==== @@ -434,7 +434,7 @@ /* * The KB920x boot loader tests ETH_SR & ETH_SR_LINK and will ask * the MII if there's a link if this bit is clear. Not sure if we - * should do the same thing ehre or not. + * should do the same thing here or not. */ ATE_ASSERT_LOCKED(sc); if (sc->miibus != NULL) { @@ -528,6 +528,7 @@ status = RD4(sc, ETH_ISR); if (status == 0) return; + printf("IT IS %x\n", RD4(sc, ETH_RSR)); if (status & ETH_ISR_RCOM) { bus_dmamap_sync(sc->rx_desc_tag, sc->rx_desc_map, BUS_DMASYNC_POSTREAD); @@ -538,6 +539,7 @@ int rx_stat = sc->rx_descs[i].status; int nsegs; + printf("GOT ONE\n"); bus_dmamap_sync(sc->rxtag, sc->rx_map[i], BUS_DMASYNC_POSTREAD); bus_dmamap_unload(sc->rxtag, @@ -601,6 +603,11 @@ sc->txcur = 0; } } + if (status & ETH_ISR_RBNA) { + /* Workaround Errata #11 */ + WR4(sc, ETH_CTL, RD4(sc, ETH_CTL) &~ ETH_CTL_RE); + WR4(sc, ETH_CTL, RD4(sc, ETH_CTL) | ETH_CTL_RE); + } } /* @@ -635,6 +642,8 @@ #endif WR4(sc, ETH_CTL, RD4(sc, ETH_CTL) | ETH_CTL_TE | ETH_CTL_RE); + WR4(sc, ETH_IER, /*ETH_ISR_RCOM | ETH_ISR_TCOM | ETH_ISR_RBNA*/ + 0xffffffff); /* * Boot loader fills in MAC address. If that's not the case, then @@ -644,8 +653,6 @@ */ /* XXX need to setup multicast filters */ - /* XXX need to setup rx buffers and assoc structures */ - /* XXX need to enable appropriate interrupt masks */ /* * Set 'running' flag, and clear output active flag @@ -665,7 +672,7 @@ atestart_locked(struct ifnet *ifp) { struct ate_softc *sc = ifp->if_softc; - struct mbuf *m; + struct mbuf *m, *mdefrag; bus_dma_segment_t segs[1]; int nseg; @@ -694,8 +701,13 @@ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; return; } + mdefrag = m_defrag(m, M_DONTWAIT); + if (mdefrag == NULL) { + m_freem(m); + return; + } + m = mdefrag; - m = m_pullup(m, m_length(m, NULL)); if (bus_dmamap_load_mbuf_sg(sc->mtag, sc->tx_map[sc->txcur], m, segs, &nseg, 0) != 0) { m_free(m);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200602040242.k142giNw063338>