Module Name: src Committed By: snj Date: Sun Nov 8 22:03:32 UTC 2009
Modified Files: src/sys/dev/pci [netbsd-5]: if_age.c if_ale.c Log Message: Pull up following revision(s) (requested by cegger in ticket #1124): sys/dev/pci/if_age.c: revision 1.34 sys/dev/pci/if_ale.c: revision 1.9 Use m_pullup to handle defragmentation. Reinject mbuf into TX queue when it couldn't be loaded. diff for age(4) reviewed/discussed with plunky@ several weeks ago. To generate a diff of this commit: cvs rdiff -u -r1.28.2.4 -r1.28.2.5 src/sys/dev/pci/if_age.c cvs rdiff -u -r1.3.2.3 -r1.3.2.4 src/sys/dev/pci/if_ale.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_age.c diff -u src/sys/dev/pci/if_age.c:1.28.2.4 src/sys/dev/pci/if_age.c:1.28.2.5 --- src/sys/dev/pci/if_age.c:1.28.2.4 Sun Nov 8 21:58:02 2009 +++ src/sys/dev/pci/if_age.c Sun Nov 8 22:03:32 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: if_age.c,v 1.28.2.4 2009/11/08 21:58:02 snj Exp $ */ +/* $NetBSD: if_age.c,v 1.28.2.5 2009/11/08 22:03:32 snj Exp $ */ /* $OpenBSD: if_age.c,v 1.1 2009/01/16 05:00:34 kevlo Exp $ */ /*- @@ -31,7 +31,7 @@ /* Driver for Attansic Technology Corp. L1 Gigabit Ethernet. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.28.2.4 2009/11/08 21:58:02 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.28.2.5 2009/11/08 22:03:32 snj Exp $"); #include "bpfilter.h" #include "vlan.h" @@ -1049,6 +1049,7 @@ if (age_encap(sc, &m_head)) { if (m_head == NULL) break; + IF_PREPEND(&ifp->if_snd, m_head); ifp->if_flags |= IFF_OACTIVE; break; } @@ -1201,41 +1202,19 @@ if (error == EFBIG) { error = 0; - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == NULL) { + *m_head = m_pullup(*m_head, MHLEN); + if (*m_head == NULL) { printf("%s: can't defrag TX mbuf\n", device_xname(sc->sc_dev)); - m_freem(*m_head); - *m_head = NULL; return ENOBUFS; } - M_COPY_PKTHDR(m, *m_head); - if ((*m_head)->m_pkthdr.len > MHLEN) { - MCLGET(m, M_DONTWAIT); - if (!(m->m_flags & M_EXT)) { - m_freem(*m_head); - m_freem(m); - *m_head = NULL; - return ENOBUFS; - } - } - m_copydata(*m_head, 0, (*m_head)->m_pkthdr.len, - mtod(m, void *)); - m_freem(*m_head); - m->m_len = m->m_pkthdr.len; - *m_head = m; - error = bus_dmamap_load_mbuf(sc->sc_dmat, map, *m_head, BUS_DMA_NOWAIT); if (error != 0) { printf("%s: could not load defragged TX mbuf\n", device_xname(sc->sc_dev)); - if (!error) { - bus_dmamap_unload(sc->sc_dmat, map); - error = EFBIG; - } m_freem(*m_head); *m_head = NULL; return error; Index: src/sys/dev/pci/if_ale.c diff -u src/sys/dev/pci/if_ale.c:1.3.2.3 src/sys/dev/pci/if_ale.c:1.3.2.4 --- src/sys/dev/pci/if_ale.c:1.3.2.3 Thu Sep 10 07:26:38 2009 +++ src/sys/dev/pci/if_ale.c Sun Nov 8 22:03:32 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ale.c,v 1.3.2.3 2009/09/10 07:26:38 snj Exp $ */ +/* $NetBSD: if_ale.c,v 1.3.2.4 2009/11/08 22:03:32 snj Exp $ */ /*- * Copyright (c) 2008, Pyun YongHyeon <yong...@freebsd.org> @@ -32,7 +32,7 @@ /* Driver for Atheros AR8121/AR8113/AR8114 PCIe Ethernet. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ale.c,v 1.3.2.3 2009/09/10 07:26:38 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ale.c,v 1.3.2.4 2009/11/08 22:03:32 snj Exp $"); #include "bpfilter.h" #include "vlan.h" @@ -933,41 +933,19 @@ if (error == EFBIG) { error = 0; - MGETHDR(m, M_DONTWAIT, MT_DATA); - if (m == NULL) { + *m_head = m_pullup(*m_head, MHLEN); + if (*m_head == NULL) { printf("%s: can't defrag TX mbuf\n", device_xname(sc->sc_dev)); - m_freem(*m_head); - *m_head = NULL; return ENOBUFS; } - M_COPY_PKTHDR(m, *m_head); - if ((*m_head)->m_pkthdr.len > MHLEN) { - MCLGET(m, M_DONTWAIT); - if (!(m->m_flags & M_EXT)) { - m_freem(*m_head); - m_freem(m); - *m_head = NULL; - return ENOBUFS; - } - } - m_copydata(*m_head, 0, (*m_head)->m_pkthdr.len, - mtod(m, void *)); - m_freem(*m_head); - m->m_len = m->m_pkthdr.len; - *m_head = m; - error = bus_dmamap_load_mbuf(sc->sc_dmat, map, *m_head, BUS_DMA_NOWAIT); if (error != 0) { printf("%s: could not load defragged TX mbuf\n", device_xname(sc->sc_dev)); - if (!error) { - bus_dmamap_unload(sc->sc_dmat, map); - error = EFBIG; - } m_freem(*m_head); *m_head = NULL; return error; @@ -1092,6 +1070,7 @@ if (ale_encap(sc, &m_head)) { if (m_head == NULL) break; + IF_PREPEND(&ifp->if_snd, m_head); ifp->if_flags |= IFF_OACTIVE; break; }