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;
 		}

Reply via email to