Module Name:    src
Committed By:   cegger
Date:           Thu Oct  8 08:57:19 UTC 2009

Modified Files:
        src/sys/dev/pci: if_age.c if_ale.c

Log Message:
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.33 -r1.34 src/sys/dev/pci/if_age.c
cvs rdiff -u -r1.8 -r1.9 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.33 src/sys/dev/pci/if_age.c:1.34
--- src/sys/dev/pci/if_age.c:1.33	Sat Sep  5 14:09:55 2009
+++ src/sys/dev/pci/if_age.c	Thu Oct  8 08:57:19 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_age.c,v 1.33 2009/09/05 14:09:55 tsutsui Exp $ */
+/*	$NetBSD: if_age.c,v 1.34 2009/10/08 08:57:19 cegger 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.33 2009/09/05 14:09:55 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_age.c,v 1.34 2009/10/08 08:57:19 cegger Exp $");
 
 #include "bpfilter.h"
 #include "vlan.h"
@@ -1052,6 +1052,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;
 		}
@@ -1204,41 +1205,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.8 src/sys/dev/pci/if_ale.c:1.9
--- src/sys/dev/pci/if_ale.c:1.8	Sat Sep  5 14:09:55 2009
+++ src/sys/dev/pci/if_ale.c	Thu Oct  8 08:57:19 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ale.c,v 1.8 2009/09/05 14:09:55 tsutsui Exp $	*/
+/*	$NetBSD: if_ale.c,v 1.9 2009/10/08 08:57:19 cegger 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.8 2009/09/05 14:09:55 tsutsui Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ale.c,v 1.9 2009/10/08 08:57:19 cegger 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