nfe net driver for nfroce chipsets working on RELENG_6
Jose M Rodriguez
josemi at freebsd.jazztel.es
Mon Nov 13 04:53:47 UTC 2006
Hi,
I'm using the nfe driver from current in RELENG_6 with a little patch
merge from openbsd cvs repo. Workking great on a home network (MCP51).
Due the fact that nve seems a dead end, are any plans to MFC the nfe
driver soon?
patch attached.
--
josemi
-------------- next part --------------
--- if_nfe.c.orig Sun Nov 12 23:52:01 2006
+++ if_nfe.c Mon Nov 13 05:37:40 2006
@@ -1668,7 +1668,14 @@
bus_dmamap_t map;
bus_dma_segment_t segs[NFE_MAX_SCATTER];
int error, i, nsegs;
- u_int16_t flags = NFE_TX_VALID;
+ u_int16_t flags = 0, /* don't activate the first fragment */
+ *fflags; /* mark TX_VALID late */
+#if NVLAN > 0
+ u_int32_t vtag = 0;
+
+ if (m0->m_flags & M_VLANTAG)
+ vtag = htole32(NFE_TX_VTAG | m0->m_pkthdr.ether_vtag);
+#endif
map = sc->txq.data[sc->txq.cur].tx_data_map;
@@ -1686,15 +1693,11 @@
return ENOBUFS;
}
-
-#ifdef NFE_CSUM
- if (m0->m_pkthdr.csum_flags & CSUM_IP)
- flags |= NFE_TX_IP_CSUM;
- if (m0->m_pkthdr.csum_flags & CSUM_TCP)
- flags |= NFE_TX_TCP_CSUM;
- if (m0->m_pkthdr.csum_flags & CSUM_UDP)
- flags |= NFE_TX_TCP_CSUM;
-#endif
+ /* Take account of the first fragment */
+ if (sc->nfe_flags & NFE_40BIT_ADDR)
+ fflags = &sc->txq.desc64[sc->txq.cur].flags;
+ else
+ fflags = &sc->txq.desc32[sc->txq.cur].flags;
for (i = 0; i < nsegs; i++) {
data = &sc->txq.data[sc->txq.cur];
@@ -1709,9 +1712,9 @@
desc64->length = htole16(segs[i].ds_len - 1);
desc64->flags = htole16(flags);
#if NVLAN > 0
- if (m0->m_flags & M_VLANTAG)
- desc64->vtag = htole32(NFE_TX_VTAG |
- m0->m_pkthdr.ether_vtag);
+ desc64->vtag = vtag;
+ /* vtag belong to the first fragment only */
+ vtag = 0;
#endif
} else {
desc32 = &sc->txq.desc32[sc->txq.cur];
@@ -1721,26 +1724,34 @@
desc32->flags = htole16(flags);
}
- /* csum flags and vtag belong to the first fragment only */
- if (nsegs > 1) {
- flags &= ~(NFE_TX_IP_CSUM | NFE_TX_TCP_CSUM);
- }
+ /* Next fragments must be valid */
+ flags |= NFE_TX_VALID;
sc->txq.queued++;
sc->txq.cur = (sc->txq.cur + 1) % NFE_TX_RING_COUNT;
}
/* the whole mbuf chain has been DMA mapped, fix last descriptor */
- if (sc->nfe_flags & NFE_40BIT_ADDR) {
- flags |= NFE_TX_LASTFRAG_V2;
- desc64->flags = htole16(flags);
- } else {
- if (sc->nfe_flags & NFE_JUMBO_SUP)
- flags |= NFE_TX_LASTFRAG_V2;
- else
- flags |= NFE_TX_LASTFRAG_V1;
- desc32->flags = htole16(flags);
- }
+ if (sc->nfe_flags & NFE_40BIT_ADDR)
+ desc64->flags |= htole16(NFE_TX_LASTFRAG_V2);
+ else
+ desc32->flags |=
+ htole16((sc->nfe_flags & NFE_JUMBO_SUP)?
+ NFE_TX_LASTFRAG_V2:
+ NFE_TX_LASTFRAG_V1);
+
+ /* now do the first fragment with Checksum and TX valid */
+
+#ifdef NFE_CSUM
+ if (m0->m_pkthdr.csum_flags & CSUM_IP)
+ flags |= NFE_TX_IP_CSUM;
+ if (m0->m_pkthdr.csum_flags & CSUM_TCP)
+ flags |= NFE_TX_TCP_CSUM;
+ if (m0->m_pkthdr.csum_flags & CSUM_UDP)
+ flags |= NFE_TX_TCP_CSUM;
+#endif
+
+ *fflags |= htole16(flags);
data->m = m0;
data->active = map;
More information about the freebsd-net
mailing list