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 <[email protected]>
@@ -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;
}