Module Name: src Committed By: tsutsui Date: Sat Aug 14 12:11:46 UTC 2010
Modified Files: src/sys/dev/usb: if_axe.c Log Message: Don't free TX mbuf until it's passed to bpf(9). To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/dev/usb/if_axe.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/usb/if_axe.c diff -u src/sys/dev/usb/if_axe.c:1.45 src/sys/dev/usb/if_axe.c:1.46 --- src/sys/dev/usb/if_axe.c:1.45 Sat Aug 14 10:47:57 2010 +++ src/sys/dev/usb/if_axe.c Sat Aug 14 12:11:46 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: if_axe.c,v 1.45 2010/08/14 10:47:57 tsutsui Exp $ */ +/* $NetBSD: if_axe.c,v 1.46 2010/08/14 12:11:46 tsutsui Exp $ */ /* $OpenBSD: if_axe.c,v 1.96 2010/01/09 05:33:08 jsg Exp $ */ /* @@ -89,7 +89,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.45 2010/08/14 10:47:57 tsutsui Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.46 2010/08/14 12:11:46 tsutsui Exp $"); #if defined(__NetBSD__) #include "opt_inet.h" @@ -1132,7 +1132,6 @@ m_copydata(m, 0, m->m_pkthdr.len, c->axe_buf); length = m->m_pkthdr.len; } - m_freem(m); usbd_setup_xfer(c->axe_xfer, sc->axe_ep[AXE_ENDPT_TX], c, c->axe_buf, length, USBD_FORCE_SHORT_XFER | USBD_NO_COPY, 10000, @@ -1154,7 +1153,7 @@ axe_start(struct ifnet *ifp) { struct axe_softc *sc; - struct mbuf *m_head = NULL; + struct mbuf *m; sc = ifp->if_softc; @@ -1164,22 +1163,23 @@ if ((ifp->if_flags & (IFF_OACTIVE|IFF_RUNNING)) != IFF_RUNNING) return; - IFQ_POLL(&ifp->if_snd, m_head); - if (m_head == NULL) { + IFQ_POLL(&ifp->if_snd, m); + if (m == NULL) { return; } - if (axe_encap(sc, m_head, 0)) { + if (axe_encap(sc, m, 0)) { ifp->if_flags |= IFF_OACTIVE; return; } - IFQ_DEQUEUE(&ifp->if_snd, m_head); + IFQ_DEQUEUE(&ifp->if_snd, m); /* * If there's a BPF listener, bounce a copy of this frame * to him. */ - bpf_mtap(ifp, m_head); + bpf_mtap(ifp, m); + m_freem(m); ifp->if_flags |= IFF_OACTIVE;