Module Name:    src
Committed By:   skrll
Date:           Mon Dec 28 09:26:33 UTC 2015

Modified Files:
        src/sys/dev/usb [nick-nhusb]: auvitek_dtv.c auvitek_video.c emdtv_dtv.c
            if_athn_usb.c if_atu.c if_aue.c if_axe.c if_axen.c if_cdce.c
            if_cue.c if_kue.c if_rum.c if_run.c if_smsc.c if_udav.c if_upgt.c
            if_upl.c if_ural.c if_url.c if_urndis.c if_urtwn.c if_zyd.c irmce.c
            pseye.c uaudio.c ubt.c ucom.c udl.c udsir.c ugen.c uhso.c uirda.c
            ulpt.c umass.c umidi.c usb_subr.c usbdi.c usbdivar.h uscanner.c
            usscanner.c ustir.c utoppy.c uvideo.c

Log Message:
Strictly follow the sequence abort pipe, destroy xfers, and close pipe as
API now requires.  Plug some memory leaks in some drivers while doing
this.

Also, remove up_refcnt as it was broken and helped leak more memory.


To generate a diff of this commit:
cvs rdiff -u -r1.6.14.4 -r1.6.14.5 src/sys/dev/usb/auvitek_dtv.c
cvs rdiff -u -r1.6.32.4 -r1.6.32.5 src/sys/dev/usb/auvitek_video.c
cvs rdiff -u -r1.10.14.4 -r1.10.14.5 src/sys/dev/usb/emdtv_dtv.c
cvs rdiff -u -r1.6.8.7 -r1.6.8.8 src/sys/dev/usb/if_athn_usb.c
cvs rdiff -u -r1.50.2.10 -r1.50.2.11 src/sys/dev/usb/if_atu.c
cvs rdiff -u -r1.132.4.9 -r1.132.4.10 src/sys/dev/usb/if_aue.c
cvs rdiff -u -r1.67.4.7 -r1.67.4.8 src/sys/dev/usb/if_axe.c
cvs rdiff -u -r1.3.6.8 -r1.3.6.9 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.38.14.6 -r1.38.14.7 src/sys/dev/usb/if_cdce.c
cvs rdiff -u -r1.68.4.8 -r1.68.4.9 src/sys/dev/usb/if_cue.c
cvs rdiff -u -r1.81.4.7 -r1.81.4.8 src/sys/dev/usb/if_kue.c
cvs rdiff -u -r1.48.6.11 -r1.48.6.12 src/sys/dev/usb/if_rum.c
cvs rdiff -u -r1.10.6.7 -r1.10.6.8 src/sys/dev/usb/if_run.c
cvs rdiff -u -r1.22.2.8 -r1.22.2.9 src/sys/dev/usb/if_smsc.c
cvs rdiff -u -r1.43.4.7 -r1.43.4.8 src/sys/dev/usb/if_udav.c
cvs rdiff -u -r1.12.4.8 -r1.12.4.9 src/sys/dev/usb/if_upgt.c
cvs rdiff -u -r1.47.4.8 -r1.47.4.9 src/sys/dev/usb/if_upl.c
cvs rdiff -u -r1.44.14.8 -r1.44.14.9 src/sys/dev/usb/if_ural.c
cvs rdiff -u -r1.48.4.7 -r1.48.4.8 src/sys/dev/usb/if_url.c
cvs rdiff -u -r1.9.4.6 -r1.9.4.7 src/sys/dev/usb/if_urndis.c
cvs rdiff -u -r1.34.4.10 -r1.34.4.11 src/sys/dev/usb/if_urtwn.c
cvs rdiff -u -r1.36.14.8 -r1.36.14.9 src/sys/dev/usb/if_zyd.c
cvs rdiff -u -r1.1.32.5 -r1.1.32.6 src/sys/dev/usb/irmce.c
cvs rdiff -u -r1.21.34.8 -r1.21.34.9 src/sys/dev/usb/pseye.c
cvs rdiff -u -r1.140.2.11 -r1.140.2.12 src/sys/dev/usb/uaudio.c
cvs rdiff -u -r1.51.4.6 -r1.51.4.7 src/sys/dev/usb/ubt.c
cvs rdiff -u -r1.108.2.10 -r1.108.2.11 src/sys/dev/usb/ucom.c
cvs rdiff -u -r1.11.6.6 -r1.11.6.7 src/sys/dev/usb/udl.c
cvs rdiff -u -r1.1.14.6 -r1.1.14.7 src/sys/dev/usb/udsir.c
cvs rdiff -u -r1.126.2.11 -r1.126.2.12 src/sys/dev/usb/ugen.c
cvs rdiff -u -r1.17.2.5 -r1.17.2.6 src/sys/dev/usb/uhso.c
cvs rdiff -u -r1.38.6.8 -r1.38.6.9 src/sys/dev/usb/uirda.c
cvs rdiff -u -r1.95.4.8 -r1.95.4.9 src/sys/dev/usb/ulpt.c
cvs rdiff -u -r1.149.2.9 -r1.149.2.10 src/sys/dev/usb/umass.c
cvs rdiff -u -r1.65.14.8 -r1.65.14.9 src/sys/dev/usb/umidi.c
cvs rdiff -u -r1.198.2.21 -r1.198.2.22 src/sys/dev/usb/usb_subr.c
cvs rdiff -u -r1.162.2.39 -r1.162.2.40 src/sys/dev/usb/usbdi.c
cvs rdiff -u -r1.109.2.20 -r1.109.2.21 src/sys/dev/usb/usbdivar.h
cvs rdiff -u -r1.75.4.8 -r1.75.4.9 src/sys/dev/usb/uscanner.c
cvs rdiff -u -r1.38.6.10 -r1.38.6.11 src/sys/dev/usb/usscanner.c
cvs rdiff -u -r1.33.10.9 -r1.33.10.10 src/sys/dev/usb/ustir.c
cvs rdiff -u -r1.24.4.9 -r1.24.4.10 src/sys/dev/usb/utoppy.c
cvs rdiff -u -r1.41.2.9 -r1.41.2.10 src/sys/dev/usb/uvideo.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/auvitek_dtv.c
diff -u src/sys/dev/usb/auvitek_dtv.c:1.6.14.4 src/sys/dev/usb/auvitek_dtv.c:1.6.14.5
--- src/sys/dev/usb/auvitek_dtv.c:1.6.14.4	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/auvitek_dtv.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: auvitek_dtv.c,v 1.6.14.4 2015/10/06 21:32:15 skrll Exp $ */
+/* $NetBSD: auvitek_dtv.c,v 1.6.14.5 2015/12/28 09:26:33 skrll Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <[email protected]>
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: auvitek_dtv.c,v 1.6.14.4 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: auvitek_dtv.c,v 1.6.14.5 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -66,6 +66,7 @@ static int		auvitek_dtv_start_transfer(v
 static int		auvitek_dtv_stop_transfer(void *);
 
 static int		auvitek_dtv_init_pipes(struct auvitek_softc *);
+static int		auvitek_dtv_abort_pipes(struct auvitek_softc *);
 static int		auvitek_dtv_close_pipes(struct auvitek_softc *);
 
 static int		auvitek_dtv_bulk_start(struct auvitek_softc *);
@@ -180,13 +181,15 @@ auvitek_dtv_close(void *priv)
 	struct auvitek_softc *sc = priv;
 
 	auvitek_dtv_stop_transfer(sc);
-	auvitek_dtv_close_pipes(sc);
+	auvitek_dtv_abort_pipes(sc);
 
 	for (size_t i = 0; i < AUVITEK_NBULK_XFERS; i++) {
 		if (sc->sc_ab.ab_bx[i].bx_xfer)
 			usbd_destroy_xfer(sc->sc_ab.ab_bx[i].bx_xfer);
 	}
 
+	auvitek_dtv_close_pipes(sc);
+
 	sc->sc_dtvsubmitcb = NULL;
 	sc->sc_dtvsubmitarg = NULL;
 }
@@ -295,11 +298,22 @@ auvitek_dtv_init_pipes(struct auvitek_so
 }
 
 static int
-auvitek_dtv_close_pipes(struct auvitek_softc *sc)
+auvitek_dtv_abort_pipes(struct auvitek_softc *sc)
 {
 	if (sc->sc_ab.ab_pipe != NULL) {
 		KERNEL_LOCK(1, curlwp);
 		usbd_abort_pipe(sc->sc_ab.ab_pipe);
+		KERNEL_UNLOCK_ONE(curlwp);
+	}
+
+	return 0;
+}
+
+static int
+auvitek_dtv_close_pipes(struct auvitek_softc *sc)
+{
+	if (sc->sc_ab.ab_pipe != NULL) {
+		KERNEL_LOCK(1, curlwp);
 		usbd_close_pipe(sc->sc_ab.ab_pipe);
 		KERNEL_UNLOCK_ONE(curlwp);
 		sc->sc_ab.ab_pipe = NULL;

Index: src/sys/dev/usb/auvitek_video.c
diff -u src/sys/dev/usb/auvitek_video.c:1.6.32.4 src/sys/dev/usb/auvitek_video.c:1.6.32.5
--- src/sys/dev/usb/auvitek_video.c:1.6.32.4	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/auvitek_video.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: auvitek_video.c,v 1.6.32.4 2015/10/06 21:32:15 skrll Exp $ */
+/* $NetBSD: auvitek_video.c,v 1.6.32.5 2015/12/28 09:26:33 skrll Exp $ */
 
 /*-
  * Copyright (c) 2010 Jared D. McNeill <[email protected]>
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: auvitek_video.c,v 1.6.32.4 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: auvitek_video.c,v 1.6.32.5 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -607,10 +607,7 @@ auvitek_stop_xfer(struct auvitek_softc *
 
 	if (ax->ax_pipe != NULL) {
 		usbd_abort_pipe(ax->ax_pipe);
-		usbd_close_pipe(ax->ax_pipe);
-		ax->ax_pipe = NULL;
 	}
-
 	for (i = 0; i < AUVITEK_NISOC_XFERS; i++) {
 		struct auvitek_isoc *isoc = &ax->ax_i[i];
 		if (isoc->i_xfer != NULL) {
@@ -623,6 +620,10 @@ auvitek_stop_xfer(struct auvitek_softc *
 			isoc->i_frlengths = NULL;
 		}
 	}
+	if (ax->ax_pipe != NULL) {
+		usbd_close_pipe(ax->ax_pipe);
+		ax->ax_pipe = NULL;
+	}
 
 	usbd_delay_ms(sc->sc_udev, 1000);
 	err = usbd_set_interface(sc->sc_isoc_iface, 0);

Index: src/sys/dev/usb/emdtv_dtv.c
diff -u src/sys/dev/usb/emdtv_dtv.c:1.10.14.4 src/sys/dev/usb/emdtv_dtv.c:1.10.14.5
--- src/sys/dev/usb/emdtv_dtv.c:1.10.14.4	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/emdtv_dtv.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: emdtv_dtv.c,v 1.10.14.4 2015/10/06 21:32:15 skrll Exp $ */
+/* $NetBSD: emdtv_dtv.c,v 1.10.14.5 2015/12/28 09:26:33 skrll Exp $ */
 
 /*-
  * Copyright (c) 2008, 2011 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: emdtv_dtv.c,v 1.10.14.4 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emdtv_dtv.c,v 1.10.14.5 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -125,6 +125,20 @@ emdtv_dtv_attach(struct emdtv_softc *sc)
 	emdtv_dtv_rescan(sc, NULL, NULL);
 }
 
+static void
+emdtv_dtv_free_xfers(struct emdtv_softc *sc)
+{
+
+	for (size_t i = 0; i < EMDTV_NXFERS; i++)
+		if (sc->sc_ix[i].ix_xfer) {
+			usbd_destroy_xfer(sc->sc_ix[i].ix_xfer);
+			sc->sc_ix[i].ix_xfer = NULL;
+			sc->sc_ix[i].ix_buf = NULL;
+		}
+
+	return;
+}
+
 void
 emdtv_dtv_detach(struct emdtv_softc *sc, int flags)
 {
@@ -142,6 +156,7 @@ emdtv_dtv_detach(struct emdtv_softc *sc,
 
 	if (sc->sc_isoc_pipe) {
 		usbd_abort_pipe(sc->sc_isoc_pipe);
+		emdtv_dtv_free_xfers(sc);
 		usbd_close_pipe(sc->sc_isoc_pipe);
 		sc->sc_isoc_pipe = NULL;
 	}
@@ -250,14 +265,7 @@ emdtv_dtv_close(void *priv)
 {
 	struct emdtv_softc *sc = priv;
 
-	for (size_t i = 0; i < EMDTV_NXFERS; i++)
-		if (sc->sc_ix[i].ix_xfer) {
-			usbd_destroy_xfer(sc->sc_ix[i].ix_xfer);
-			sc->sc_ix[i].ix_xfer = NULL;
-			sc->sc_ix[i].ix_buf = NULL;
-		}
-
-	return;
+	emdtv_dtv_free_xfers(sc);
 }
 
 static int

Index: src/sys/dev/usb/if_athn_usb.c
diff -u src/sys/dev/usb/if_athn_usb.c:1.6.8.7 src/sys/dev/usb/if_athn_usb.c:1.6.8.8
--- src/sys/dev/usb/if_athn_usb.c:1.6.8.7	Sat Oct 17 10:24:59 2015
+++ src/sys/dev/usb/if_athn_usb.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_athn_usb.c,v 1.6.8.7 2015/10/17 10:24:59 skrll Exp $	*/
+/*	$NetBSD: if_athn_usb.c,v 1.6.8.8 2015/12/28 09:26:33 skrll Exp $	*/
 /*	$OpenBSD: if_athn_usb.c,v 1.12 2013/01/14 09:50:31 jsing Exp $	*/
 
 /*-
@@ -22,7 +22,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_athn_usb.c,v 1.6.8.7 2015/10/17 10:24:59 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_athn_usb.c,v 1.6.8.8 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef	_KERNEL_OPT
 #include "opt_inet.h"
@@ -98,6 +98,7 @@ Static int	athn_usb_alloc_tx_list(struct
 Static void	athn_usb_attachhook(device_t);
 Static void	athn_usb_bcneof(struct usbd_xfer *, void *,
 		    usbd_status);
+Static void	athn_usb_abort_pipes(struct athn_usb_softc *);
 Static void	athn_usb_close_pipes(struct athn_usb_softc *);
 Static int	athn_usb_create_hw_node(struct athn_usb_softc *,
 		    struct ar_htc_target_sta *);
@@ -309,6 +310,7 @@ athn_usb_attach(device_t parent, device_
 
  fail:
 	/* Free Tx/Rx buffers. */
+	athn_usb_abort_pipes(usc);
 	athn_usb_free_tx_list(usc);
 	athn_usb_free_rx_list(usc);
 	athn_usb_free_tx_cmd(usc);
@@ -456,8 +458,8 @@ athn_usb_detach(device_t self, int flags
 		usc->usc_athn_attached = 0;
 		athn_detach(sc);
 	}
-	/* Abort and close Tx/Rx pipes. */
-	athn_usb_close_pipes(usc);
+	/* Abort Tx/Rx pipes. */
+	athn_usb_abort_pipes(usc);
 	splx(s);
 
 	/* Free Tx/Rx buffers. */
@@ -465,6 +467,9 @@ athn_usb_detach(device_t self, int flags
 	athn_usb_free_tx_list(usc);
 	athn_usb_free_tx_cmd(usc);
 
+	/* Close Tx/Rx pipes. */
+	athn_usb_close_pipes(usc);
+
 	mutex_destroy(&usc->usc_tx_mtx);
 	mutex_destroy(&usc->usc_task_mtx);
 	cv_destroy(&usc->usc_task_cv);
@@ -551,6 +556,7 @@ athn_usb_open_pipes(struct athn_usb_soft
 	}
 	return 0;
  fail:
+	athn_usb_abort_pipes(usc);
 	athn_usb_close_pipes(usc);
 	return error;
 }
@@ -563,12 +569,26 @@ athn_usb_kill_pipe(struct usbd_pipe * *p
 	CTASSERT(sizeof(pipe) == sizeof(void *));
 	pipe = atomic_swap_ptr(pipeptr, NULL);
 	if (pipe != NULL) {
-		usbd_abort_pipe(pipe);
 		usbd_close_pipe(pipe);
 	}
 }
 
 Static void
+athn_usb_abort_pipes(struct athn_usb_softc *usc)
+{
+	DPRINTFN(DBG_FN, usc, "\n");
+
+	if (usc->usc_tx_data_pipe != NULL)
+		usbd_abort_pipe(usc->usc_tx_data_pipe);
+	if (usc->usc_rx_data_pipe != NULL)
+		usbd_abort_pipe(usc->usc_rx_data_pipe);
+	if (usc->usc_tx_intr_pipe != NULL)
+		usbd_abort_pipe(usc->usc_tx_intr_pipe);
+	if (usc->usc_rx_intr_pipe != NULL)
+		usbd_abort_pipe(usc->usc_rx_intr_pipe);
+}
+
+Static void
 athn_usb_close_pipes(struct athn_usb_softc *usc)
 {
 	uint8_t *ibuf;

Index: src/sys/dev/usb/if_atu.c
diff -u src/sys/dev/usb/if_atu.c:1.50.2.10 src/sys/dev/usb/if_atu.c:1.50.2.11
--- src/sys/dev/usb/if_atu.c:1.50.2.10	Sat Dec 19 10:11:13 2015
+++ src/sys/dev/usb/if_atu.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_atu.c,v 1.50.2.10 2015/12/19 10:11:13 skrll Exp $ */
+/*	$NetBSD: if_atu.c,v 1.50.2.11 2015/12/28 09:26:33 skrll Exp $ */
 /*	$OpenBSD: if_atu.c,v 1.48 2004/12/30 01:53:21 dlg Exp $ */
 /*
  * Copyright (c) 2003, 2004
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_atu.c,v 1.50.2.10 2015/12/19 10:11:13 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_atu.c,v 1.50.2.11 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -2247,6 +2247,23 @@ atu_stop(struct ifnet *ifp, int disable)
 			DPRINTF(("%s: abort rx pipe failed: %s\n",
 			    device_xname(sc->atu_dev), usbd_errstr(err)));
 		}
+	}
+
+	if (sc->atu_ep[ATU_ENDPT_TX] != NULL) {
+		err = usbd_abort_pipe(sc->atu_ep[ATU_ENDPT_TX]);
+		if (err) {
+			DPRINTF(("%s: abort tx pipe failed: %s\n",
+			    device_xname(sc->atu_dev), usbd_errstr(err)));
+		}
+	}
+
+	/* Free RX/TX/MGMT list resources. */
+	cd = &sc->atu_cdata;
+	atu_xfer_list_free(sc, cd->atu_rx_chain, ATU_RX_LIST_CNT);
+	atu_xfer_list_free(sc, cd->atu_tx_chain, ATU_TX_LIST_CNT);
+
+	/* Close pipes */
+	if (sc->atu_ep[ATU_ENDPT_RX] != NULL) {
 		err = usbd_close_pipe(sc->atu_ep[ATU_ENDPT_RX]);
 		if (err) {
 			DPRINTF(("%s: close rx pipe failed: %s\n",
@@ -2256,11 +2273,6 @@ atu_stop(struct ifnet *ifp, int disable)
 	}
 
 	if (sc->atu_ep[ATU_ENDPT_TX] != NULL) {
-		err = usbd_abort_pipe(sc->atu_ep[ATU_ENDPT_TX]);
-		if (err) {
-			DPRINTF(("%s: abort tx pipe failed: %s\n",
-			    device_xname(sc->atu_dev), usbd_errstr(err)));
-		}
 		err = usbd_close_pipe(sc->atu_ep[ATU_ENDPT_TX]);
 		if (err) {
 			DPRINTF(("%s: close tx pipe failed: %s\n",
@@ -2269,11 +2281,6 @@ atu_stop(struct ifnet *ifp, int disable)
 		sc->atu_ep[ATU_ENDPT_TX] = NULL;
 	}
 
-	/* Free RX/TX/MGMT list resources. */
-	cd = &sc->atu_cdata;
-	atu_xfer_list_free(sc, cd->atu_rx_chain, ATU_RX_LIST_CNT);
-	atu_xfer_list_free(sc, cd->atu_tx_chain, ATU_TX_LIST_CNT);
-
 	/* Let's be nice and turn off the radio before we leave */
 	atu_switch_radio(sc, 0);
 

Index: src/sys/dev/usb/if_aue.c
diff -u src/sys/dev/usb/if_aue.c:1.132.4.9 src/sys/dev/usb/if_aue.c:1.132.4.10
--- src/sys/dev/usb/if_aue.c:1.132.4.9	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_aue.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_aue.c,v 1.132.4.9 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_aue.c,v 1.132.4.10 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 1997, 1998, 1999, 2000
@@ -78,7 +78,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.132.4.9 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.132.4.10 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1664,12 +1664,6 @@ aue_stop(struct aue_softc *sc)
 			printf("%s: abort tx pipe failed: %s\n",
 			    device_xname(sc->aue_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->aue_ep[AUE_ENDPT_TX]);
-		if (err) {
-			printf("%s: close tx pipe failed: %s\n",
-			    device_xname(sc->aue_dev), usbd_errstr(err));
-		}
-		sc->aue_ep[AUE_ENDPT_TX] = NULL;
 	}
 
 	if (sc->aue_ep[AUE_ENDPT_INTR] != NULL) {
@@ -1678,12 +1672,6 @@ aue_stop(struct aue_softc *sc)
 			printf("%s: abort intr pipe failed: %s\n",
 			    device_xname(sc->aue_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->aue_ep[AUE_ENDPT_INTR]);
-		if (err) {
-			printf("%s: close intr pipe failed: %s\n",
-			    device_xname(sc->aue_dev), usbd_errstr(err));
-		}
-		sc->aue_ep[AUE_ENDPT_INTR] = NULL;
 	}
 
 	/* Free RX resources. */
@@ -1710,6 +1698,25 @@ aue_stop(struct aue_softc *sc)
 		}
 	}
 
+	/* Close pipes */
+	if (sc->aue_ep[AUE_ENDPT_TX] != NULL) {
+		err = usbd_close_pipe(sc->aue_ep[AUE_ENDPT_TX]);
+		if (err) {
+			printf("%s: close tx pipe failed: %s\n",
+			    device_xname(sc->aue_dev), usbd_errstr(err));
+		}
+		sc->aue_ep[AUE_ENDPT_TX] = NULL;
+	}
+
+	if (sc->aue_ep[AUE_ENDPT_INTR] != NULL) {
+		err = usbd_close_pipe(sc->aue_ep[AUE_ENDPT_INTR]);
+		if (err) {
+			printf("%s: close intr pipe failed: %s\n",
+			    device_xname(sc->aue_dev), usbd_errstr(err));
+		}
+		sc->aue_ep[AUE_ENDPT_INTR] = NULL;
+	}
+
 	sc->aue_link = 0;
 
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);

Index: src/sys/dev/usb/if_axe.c
diff -u src/sys/dev/usb/if_axe.c:1.67.4.7 src/sys/dev/usb/if_axe.c:1.67.4.8
--- src/sys/dev/usb/if_axe.c:1.67.4.7	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_axe.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axe.c,v 1.67.4.7 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_axe.c,v 1.67.4.8 2015/12/28 09:26:33 skrll 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.67.4.7 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.67.4.8 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1510,12 +1510,6 @@ axe_stop(struct ifnet *ifp, int disable)
 			aprint_error_dev(sc->axe_dev,
 			    "abort rx pipe failed: %s\n", usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->axe_ep[AXE_ENDPT_RX]);
-		if (err) {
-			aprint_error_dev(sc->axe_dev,
-			    "close rx pipe failed: %s\n", usbd_errstr(err));
-		}
-		sc->axe_ep[AXE_ENDPT_RX] = NULL;
 	}
 
 	if (sc->axe_ep[AXE_ENDPT_TX] != NULL) {
@@ -1524,12 +1518,6 @@ axe_stop(struct ifnet *ifp, int disable)
 			aprint_error_dev(sc->axe_dev,
 			    "abort tx pipe failed: %s\n", usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->axe_ep[AXE_ENDPT_TX]);
-		if (err) {
-			aprint_error_dev(sc->axe_dev,
-			    "close tx pipe failed: %s\n", usbd_errstr(err));
-		}
-		sc->axe_ep[AXE_ENDPT_TX] = NULL;
 	}
 
 	if (sc->axe_ep[AXE_ENDPT_INTR] != NULL) {
@@ -1538,12 +1526,6 @@ axe_stop(struct ifnet *ifp, int disable)
 			aprint_error_dev(sc->axe_dev,
 			    "abort intr pipe failed: %s\n", usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->axe_ep[AXE_ENDPT_INTR]);
-		if (err) {
-			aprint_error_dev(sc->axe_dev,
-			    "close intr pipe failed: %s\n", usbd_errstr(err));
-		}
-		sc->axe_ep[AXE_ENDPT_INTR] = NULL;
 	}
 
 	/* Free RX resources. */
@@ -1562,6 +1544,34 @@ axe_stop(struct ifnet *ifp, int disable)
 		}
 	}
 
+	/* Close pipes. */
+	if (sc->axe_ep[AXE_ENDPT_RX] != NULL) {
+		err = usbd_close_pipe(sc->axe_ep[AXE_ENDPT_RX]);
+		if (err) {
+			aprint_error_dev(sc->axe_dev,
+			    "close rx pipe failed: %s\n", usbd_errstr(err));
+		}
+		sc->axe_ep[AXE_ENDPT_RX] = NULL;
+	}
+
+	if (sc->axe_ep[AXE_ENDPT_TX] != NULL) {
+		err = usbd_close_pipe(sc->axe_ep[AXE_ENDPT_TX]);
+		if (err) {
+			aprint_error_dev(sc->axe_dev,
+			    "close tx pipe failed: %s\n", usbd_errstr(err));
+		}
+		sc->axe_ep[AXE_ENDPT_TX] = NULL;
+	}
+
+	if (sc->axe_ep[AXE_ENDPT_INTR] != NULL) {
+		err = usbd_close_pipe(sc->axe_ep[AXE_ENDPT_INTR]);
+		if (err) {
+			aprint_error_dev(sc->axe_dev,
+			    "close intr pipe failed: %s\n", usbd_errstr(err));
+		}
+		sc->axe_ep[AXE_ENDPT_INTR] = NULL;
+	}
+
 	sc->axe_link = 0;
 }
 

Index: src/sys/dev/usb/if_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.3.6.8 src/sys/dev/usb/if_axen.c:1.3.6.9
--- src/sys/dev/usb/if_axen.c:1.3.6.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_axen.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axen.c,v 1.3.6.8 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_axen.c,v 1.3.6.9 2015/12/28 09:26:33 skrll Exp $	*/
 /*	$OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $	*/
 
 /*
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.3.6.8 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.3.6.9 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1498,12 +1498,6 @@ axen_stop(struct ifnet *ifp, int disable
 			    "abort rx pipe failed: %s\n", usbd_errstr(err));
 
 		}
-		err = usbd_close_pipe(sc->axen_ep[AXEN_ENDPT_RX]);
-		if (err) {
-			aprint_error_dev(sc->axen_dev,
-			    "close rx pipe failed: %s\n", usbd_errstr(err));
-		}
-		sc->axen_ep[AXEN_ENDPT_RX] = NULL;
 	}
 
 	if (sc->axen_ep[AXEN_ENDPT_TX] != NULL) {
@@ -1512,12 +1506,6 @@ axen_stop(struct ifnet *ifp, int disable
 			aprint_error_dev(sc->axen_dev,
 			    "abort tx pipe failed: %s\n", usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->axen_ep[AXEN_ENDPT_TX]);
-		if (err) {
-			aprint_error_dev(sc->axen_dev,
-			    "close tx pipe failed: %s\n", usbd_errstr(err));
-		}
-		sc->axen_ep[AXEN_ENDPT_TX] = NULL;
 	}
 
 	if (sc->axen_ep[AXEN_ENDPT_INTR] != NULL) {
@@ -1526,12 +1514,6 @@ axen_stop(struct ifnet *ifp, int disable
 			aprint_error_dev(sc->axen_dev,
 			    "abort intr pipe failed: %s\n", usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->axen_ep[AXEN_ENDPT_INTR]);
-		if (err) {
-			aprint_error_dev(sc->axen_dev,
-			    "close intr pipe failed: %s\n", usbd_errstr(err));
-		}
-		sc->axen_ep[AXEN_ENDPT_INTR] = NULL;
 	}
 
 	/* Free RX resources. */
@@ -1550,6 +1532,34 @@ axen_stop(struct ifnet *ifp, int disable
 		}
 	}
 
+	/* Close pipes. */
+	if (sc->axen_ep[AXEN_ENDPT_RX] != NULL) {
+		err = usbd_close_pipe(sc->axen_ep[AXEN_ENDPT_RX]);
+		if (err) {
+			aprint_error_dev(sc->axen_dev,
+			    "close rx pipe failed: %s\n", usbd_errstr(err));
+		}
+		sc->axen_ep[AXEN_ENDPT_RX] = NULL;
+	}
+
+	if (sc->axen_ep[AXEN_ENDPT_TX] != NULL) {
+		err = usbd_close_pipe(sc->axen_ep[AXEN_ENDPT_TX]);
+		if (err) {
+			aprint_error_dev(sc->axen_dev,
+			    "close tx pipe failed: %s\n", usbd_errstr(err));
+		}
+		sc->axen_ep[AXEN_ENDPT_TX] = NULL;
+	}
+
+	if (sc->axen_ep[AXEN_ENDPT_INTR] != NULL) {
+		err = usbd_close_pipe(sc->axen_ep[AXEN_ENDPT_INTR]);
+		if (err) {
+			aprint_error_dev(sc->axen_dev,
+			    "close intr pipe failed: %s\n", usbd_errstr(err));
+		}
+		sc->axen_ep[AXEN_ENDPT_INTR] = NULL;
+	}
+
 	sc->axen_link = 0;
 }
 

Index: src/sys/dev/usb/if_cdce.c
diff -u src/sys/dev/usb/if_cdce.c:1.38.14.6 src/sys/dev/usb/if_cdce.c:1.38.14.7
--- src/sys/dev/usb/if_cdce.c:1.38.14.6	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_cdce.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_cdce.c,v 1.38.14.6 2015/10/06 21:32:15 skrll Exp $ */
+/*	$NetBSD: if_cdce.c,v 1.38.14.7 2015/12/28 09:26:33 skrll Exp $ */
 
 /*
  * Copyright (c) 1997, 1998, 1999, 2000-2003 Bill Paul <[email protected]>
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.38.14.6 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_cdce.c,v 1.38.14.7 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -403,11 +403,6 @@ cdce_stop(struct cdce_softc *sc)
 		if (err)
 			printf("%s: abort rx pipe failed: %s\n",
 			    device_xname(sc->cdce_dev), usbd_errstr(err));
-		err = usbd_close_pipe(sc->cdce_bulkin_pipe);
-		if (err)
-			printf("%s: close rx pipe failed: %s\n",
-			    device_xname(sc->cdce_dev), usbd_errstr(err));
-		sc->cdce_bulkin_pipe = NULL;
 	}
 
 	if (sc->cdce_bulkout_pipe != NULL) {
@@ -415,11 +410,6 @@ cdce_stop(struct cdce_softc *sc)
 		if (err)
 			printf("%s: abort tx pipe failed: %s\n",
 			    device_xname(sc->cdce_dev), usbd_errstr(err));
-		err = usbd_close_pipe(sc->cdce_bulkout_pipe);
-		if (err)
-			printf("%s: close tx pipe failed: %s\n",
-			    device_xname(sc->cdce_dev), usbd_errstr(err));
-		sc->cdce_bulkout_pipe = NULL;
 	}
 
 	for (i = 0; i < CDCE_RX_LIST_CNT; i++) {
@@ -446,6 +436,22 @@ cdce_stop(struct cdce_softc *sc)
 		}
 	}
 
+	if (sc->cdce_bulkin_pipe != NULL) {
+		err = usbd_close_pipe(sc->cdce_bulkin_pipe);
+		if (err)
+			printf("%s: close rx pipe failed: %s\n",
+			    device_xname(sc->cdce_dev), usbd_errstr(err));
+		sc->cdce_bulkin_pipe = NULL;
+	}
+
+	if (sc->cdce_bulkout_pipe != NULL) {
+		err = usbd_close_pipe(sc->cdce_bulkout_pipe);
+		if (err)
+			printf("%s: close tx pipe failed: %s\n",
+			    device_xname(sc->cdce_dev), usbd_errstr(err));
+		sc->cdce_bulkout_pipe = NULL;
+	}
+
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 }
 

Index: src/sys/dev/usb/if_cue.c
diff -u src/sys/dev/usb/if_cue.c:1.68.4.8 src/sys/dev/usb/if_cue.c:1.68.4.9
--- src/sys/dev/usb/if_cue.c:1.68.4.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_cue.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_cue.c,v 1.68.4.8 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_cue.c,v 1.68.4.9 2015/12/28 09:26:33 skrll Exp $	*/
 /*
  * Copyright (c) 1997, 1998, 1999, 2000
  *	Bill Paul <[email protected]>.  All rights reserved.
@@ -56,7 +56,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.68.4.8 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.68.4.9 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1223,12 +1223,6 @@ cue_stop(struct cue_softc *sc)
 			printf("%s: abort rx pipe failed: %s\n",
 			    device_xname(sc->cue_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->cue_ep[CUE_ENDPT_RX]);
-		if (err) {
-			printf("%s: close rx pipe failed: %s\n",
-			    device_xname(sc->cue_dev), usbd_errstr(err));
-		}
-		sc->cue_ep[CUE_ENDPT_RX] = NULL;
 	}
 
 	if (sc->cue_ep[CUE_ENDPT_TX] != NULL) {
@@ -1237,12 +1231,6 @@ cue_stop(struct cue_softc *sc)
 			printf("%s: abort tx pipe failed: %s\n",
 			    device_xname(sc->cue_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->cue_ep[CUE_ENDPT_TX]);
-		if (err) {
-			printf("%s: close tx pipe failed: %s\n",
-			    device_xname(sc->cue_dev), usbd_errstr(err));
-		}
-		sc->cue_ep[CUE_ENDPT_TX] = NULL;
 	}
 
 	if (sc->cue_ep[CUE_ENDPT_INTR] != NULL) {
@@ -1251,20 +1239,10 @@ cue_stop(struct cue_softc *sc)
 			printf("%s: abort intr pipe failed: %s\n",
 			    device_xname(sc->cue_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->cue_ep[CUE_ENDPT_INTR]);
-		if (err) {
-			printf("%s: close intr pipe failed: %s\n",
-			    device_xname(sc->cue_dev), usbd_errstr(err));
-		}
-		sc->cue_ep[CUE_ENDPT_INTR] = NULL;
 	}
 
 	/* Free RX resources. */
 	for (i = 0; i < CUE_RX_LIST_CNT; i++) {
-		if (sc->cue_cdata.cue_rx_chain[i].cue_mbuf != NULL) {
-			m_freem(sc->cue_cdata.cue_rx_chain[i].cue_mbuf);
-			sc->cue_cdata.cue_rx_chain[i].cue_mbuf = NULL;
-		}
 		if (sc->cue_cdata.cue_rx_chain[i].cue_xfer != NULL) {
 			usbd_destroy_xfer(sc->cue_cdata.cue_rx_chain[i].cue_xfer);
 			sc->cue_cdata.cue_rx_chain[i].cue_xfer = NULL;
@@ -1283,5 +1261,33 @@ cue_stop(struct cue_softc *sc)
 		}
 	}
 
+	/* Stop transfers. */
+	if (sc->cue_ep[CUE_ENDPT_RX] != NULL) {
+		err = usbd_close_pipe(sc->cue_ep[CUE_ENDPT_RX]);
+		if (err) {
+			printf("%s: close rx pipe failed: %s\n",
+			    device_xname(sc->cue_dev), usbd_errstr(err));
+		}
+		sc->cue_ep[CUE_ENDPT_RX] = NULL;
+	}
+
+	if (sc->cue_ep[CUE_ENDPT_TX] != NULL) {
+		err = usbd_close_pipe(sc->cue_ep[CUE_ENDPT_TX]);
+		if (err) {
+			printf("%s: close tx pipe failed: %s\n",
+			    device_xname(sc->cue_dev), usbd_errstr(err));
+		}
+		sc->cue_ep[CUE_ENDPT_TX] = NULL;
+	}
+
+	if (sc->cue_ep[CUE_ENDPT_INTR] != NULL) {
+		err = usbd_close_pipe(sc->cue_ep[CUE_ENDPT_INTR]);
+		if (err) {
+			printf("%s: close intr pipe failed: %s\n",
+			    device_xname(sc->cue_dev), usbd_errstr(err));
+		}
+		sc->cue_ep[CUE_ENDPT_INTR] = NULL;
+	}
+
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 }

Index: src/sys/dev/usb/if_kue.c
diff -u src/sys/dev/usb/if_kue.c:1.81.4.7 src/sys/dev/usb/if_kue.c:1.81.4.8
--- src/sys/dev/usb/if_kue.c:1.81.4.7	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_kue.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_kue.c,v 1.81.4.7 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_kue.c,v 1.81.4.8 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 1997, 1998, 1999, 2000
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.81.4.7 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.81.4.8 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1096,12 +1096,6 @@ kue_stop(struct kue_softc *sc)
 			printf("%s: abort rx pipe failed: %s\n",
 			    device_xname(sc->kue_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_RX]);
-		if (err) {
-			printf("%s: close rx pipe failed: %s\n",
-			    device_xname(sc->kue_dev), usbd_errstr(err));
-		}
-		sc->kue_ep[KUE_ENDPT_RX] = NULL;
 	}
 
 	if (sc->kue_ep[KUE_ENDPT_TX] != NULL) {
@@ -1110,12 +1104,6 @@ kue_stop(struct kue_softc *sc)
 			printf("%s: abort tx pipe failed: %s\n",
 			    device_xname(sc->kue_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_TX]);
-		if (err) {
-			printf("%s: close tx pipe failed: %s\n",
-			    device_xname(sc->kue_dev), usbd_errstr(err));
-		}
-		sc->kue_ep[KUE_ENDPT_TX] = NULL;
 	}
 
 	if (sc->kue_ep[KUE_ENDPT_INTR] != NULL) {
@@ -1124,12 +1112,6 @@ kue_stop(struct kue_softc *sc)
 			printf("%s: abort intr pipe failed: %s\n",
 			    device_xname(sc->kue_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_INTR]);
-		if (err) {
-			printf("%s: close intr pipe failed: %s\n",
-			    device_xname(sc->kue_dev), usbd_errstr(err));
-		}
-		sc->kue_ep[KUE_ENDPT_INTR] = NULL;
 	}
 
 	/* Free RX resources. */
@@ -1148,5 +1130,33 @@ kue_stop(struct kue_softc *sc)
 		}
 	}
 
+	/* Close pipes. */
+	if (sc->kue_ep[KUE_ENDPT_RX] != NULL) {
+		err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_RX]);
+		if (err) {
+			printf("%s: close rx pipe failed: %s\n",
+			    device_xname(sc->kue_dev), usbd_errstr(err));
+		}
+		sc->kue_ep[KUE_ENDPT_RX] = NULL;
+	}
+
+	if (sc->kue_ep[KUE_ENDPT_TX] != NULL) {
+		err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_TX]);
+		if (err) {
+			printf("%s: close tx pipe failed: %s\n",
+			    device_xname(sc->kue_dev), usbd_errstr(err));
+		}
+		sc->kue_ep[KUE_ENDPT_TX] = NULL;
+	}
+
+	if (sc->kue_ep[KUE_ENDPT_INTR] != NULL) {
+		err = usbd_close_pipe(sc->kue_ep[KUE_ENDPT_INTR]);
+		if (err) {
+			printf("%s: close intr pipe failed: %s\n",
+			    device_xname(sc->kue_dev), usbd_errstr(err));
+		}
+		sc->kue_ep[KUE_ENDPT_INTR] = NULL;
+	}
+
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 }

Index: src/sys/dev/usb/if_rum.c
diff -u src/sys/dev/usb/if_rum.c:1.48.6.11 src/sys/dev/usb/if_rum.c:1.48.6.12
--- src/sys/dev/usb/if_rum.c:1.48.6.11	Wed Oct  7 10:39:25 2015
+++ src/sys/dev/usb/if_rum.c	Mon Dec 28 09:26:33 2015
@@ -1,5 +1,5 @@
 /*	$OpenBSD: if_rum.c,v 1.40 2006/09/18 16:20:20 damien Exp $	*/
-/*	$NetBSD: if_rum.c,v 1.48.6.11 2015/10/07 10:39:25 skrll Exp $	*/
+/*	$NetBSD: if_rum.c,v 1.48.6.12 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2005-2007 Damien Bergamini <[email protected]>
@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_rum.c,v 1.48.6.11 2015/10/07 10:39:25 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_rum.c,v 1.48.6.12 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -508,21 +508,6 @@ rum_detach(device_t self, int flags)
 	callout_stop(&sc->sc_scan_ch);
 	callout_stop(&sc->sc_amrr_ch);
 
-	if (sc->amrr_xfer != NULL) {
-		usbd_destroy_xfer(sc->amrr_xfer);
-		sc->amrr_xfer = NULL;
-	}
-
-	if (sc->sc_rx_pipeh != NULL) {
-		usbd_abort_pipe(sc->sc_rx_pipeh);
-		usbd_close_pipe(sc->sc_rx_pipeh);
-	}
-
-	if (sc->sc_tx_pipeh != NULL) {
-		usbd_abort_pipe(sc->sc_tx_pipeh);
-		usbd_close_pipe(sc->sc_tx_pipeh);
-	}
-
 	bpf_detach(ifp);
 	ieee80211_ifdetach(ic);	/* free all nodes */
 	if_detach(ifp);
@@ -2137,18 +2122,24 @@ rum_stop(struct ifnet *ifp, int disable)
 
 	if (sc->sc_rx_pipeh != NULL) {
 		usbd_abort_pipe(sc->sc_rx_pipeh);
-		usbd_close_pipe(sc->sc_rx_pipeh);
-		sc->sc_rx_pipeh = NULL;
 	}
 
 	if (sc->sc_tx_pipeh != NULL) {
 		usbd_abort_pipe(sc->sc_tx_pipeh);
-		usbd_close_pipe(sc->sc_tx_pipeh);
-		sc->sc_tx_pipeh = NULL;
 	}
 
 	rum_free_rx_list(sc);
 	rum_free_tx_list(sc);
+
+	if (sc->sc_rx_pipeh != NULL) {
+		usbd_close_pipe(sc->sc_rx_pipeh);
+		sc->sc_rx_pipeh = NULL;
+	}
+
+	if (sc->sc_tx_pipeh != NULL) {
+		usbd_close_pipe(sc->sc_tx_pipeh);
+		sc->sc_tx_pipeh = NULL;
+	}
 }
 
 static int

Index: src/sys/dev/usb/if_run.c
diff -u src/sys/dev/usb/if_run.c:1.10.6.7 src/sys/dev/usb/if_run.c:1.10.6.8
--- src/sys/dev/usb/if_run.c:1.10.6.7	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_run.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_run.c,v 1.10.6.7 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_run.c,v 1.10.6.8 2015/12/28 09:26:33 skrll Exp $	*/
 /*	$OpenBSD: if_run.c,v 1.90 2012/03/24 15:11:04 jsg Exp $	*/
 
 /*-
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.10.6.7 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.10.6.8 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -753,14 +753,16 @@ run_free_rx_ring(struct run_softc *sc)
 
 	if (rxq->pipeh != NULL) {
 		usbd_abort_pipe(rxq->pipeh);
-		usbd_close_pipe(rxq->pipeh);
-		rxq->pipeh = NULL;
 	}
 	for (i = 0; i < RUN_RX_RING_COUNT; i++) {
 		if (rxq->data[i].xfer != NULL)
 			usbd_destroy_xfer(rxq->data[i].xfer);
 		rxq->data[i].xfer = NULL;
 	}
+	if (rxq->pipeh != NULL) {
+		usbd_close_pipe(rxq->pipeh);
+		rxq->pipeh = NULL;
+	}
 }
 
 static int

Index: src/sys/dev/usb/if_smsc.c
diff -u src/sys/dev/usb/if_smsc.c:1.22.2.8 src/sys/dev/usb/if_smsc.c:1.22.2.9
--- src/sys/dev/usb/if_smsc.c:1.22.2.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_smsc.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_smsc.c,v 1.22.2.8 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_smsc.c,v 1.22.2.9 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*	$OpenBSD: if_smsc.c,v 1.4 2012/09/27 12:38:11 jsg Exp $	*/
 /* $FreeBSD: src/sys/dev/usb/net/if_smsc.c,v 1.1 2012/08/15 04:03:55 gonzo Exp $ */
@@ -688,12 +688,6 @@ smsc_stop(struct ifnet *ifp, int disable
 			printf("%s: abort rx pipe failed: %s\n",
 			    device_xname(sc->sc_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->sc_ep[SMSC_ENDPT_RX]);
-		if (err) {
-			printf("%s: close rx pipe failed: %s\n",
-			    device_xname(sc->sc_dev), usbd_errstr(err));
-		}
-		sc->sc_ep[SMSC_ENDPT_RX] = NULL;
 	}
 
 	if (sc->sc_ep[SMSC_ENDPT_TX] != NULL) {
@@ -702,12 +696,6 @@ smsc_stop(struct ifnet *ifp, int disable
 			printf("%s: abort tx pipe failed: %s\n",
 			    device_xname(sc->sc_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->sc_ep[SMSC_ENDPT_TX]);
-		if (err) {
-			printf("%s: close tx pipe failed: %s\n",
-			    device_xname(sc->sc_dev), usbd_errstr(err));
-		}
-		sc->sc_ep[SMSC_ENDPT_TX] = NULL;
 	}
 
 	if (sc->sc_ep[SMSC_ENDPT_INTR] != NULL) {
@@ -716,12 +704,6 @@ smsc_stop(struct ifnet *ifp, int disable
 			printf("%s: abort intr pipe failed: %s\n",
 			    device_xname(sc->sc_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->sc_ep[SMSC_ENDPT_INTR]);
-		if (err) {
-			printf("%s: close intr pipe failed: %s\n",
-			    device_xname(sc->sc_dev), usbd_errstr(err));
-		}
-		sc->sc_ep[SMSC_ENDPT_INTR] = NULL;
 	}
 
 	/* Free RX resources. */
@@ -747,6 +729,33 @@ smsc_stop(struct ifnet *ifp, int disable
 			sc->sc_cdata.tx_chain[i].sc_xfer = NULL;
 		}
 	}
+	/* Close pipes */
+	if (sc->sc_ep[SMSC_ENDPT_RX] != NULL) {
+		err = usbd_close_pipe(sc->sc_ep[SMSC_ENDPT_RX]);
+		if (err) {
+			printf("%s: close rx pipe failed: %s\n",
+			    device_xname(sc->sc_dev), usbd_errstr(err));
+		}
+		sc->sc_ep[SMSC_ENDPT_RX] = NULL;
+	}
+
+	if (sc->sc_ep[SMSC_ENDPT_TX] != NULL) {
+		err = usbd_close_pipe(sc->sc_ep[SMSC_ENDPT_TX]);
+		if (err) {
+			printf("%s: close tx pipe failed: %s\n",
+			    device_xname(sc->sc_dev), usbd_errstr(err));
+		}
+		sc->sc_ep[SMSC_ENDPT_TX] = NULL;
+	}
+
+	if (sc->sc_ep[SMSC_ENDPT_INTR] != NULL) {
+		err = usbd_close_pipe(sc->sc_ep[SMSC_ENDPT_INTR]);
+		if (err) {
+			printf("%s: close intr pipe failed: %s\n",
+			    device_xname(sc->sc_dev), usbd_errstr(err));
+		}
+		sc->sc_ep[SMSC_ENDPT_INTR] = NULL;
+	}
 }
 
 int

Index: src/sys/dev/usb/if_udav.c
diff -u src/sys/dev/usb/if_udav.c:1.43.4.7 src/sys/dev/usb/if_udav.c:1.43.4.8
--- src/sys/dev/usb/if_udav.c:1.43.4.7	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_udav.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_udav.c,v 1.43.4.7 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_udav.c,v 1.43.4.8 2015/12/28 09:26:33 skrll Exp $	*/
 /*	$nabe: if_udav.c,v 1.3 2003/08/21 16:57:19 nabe Exp $	*/
 
 /*
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.43.4.7 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.43.4.8 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1290,11 +1290,6 @@ udav_stop(struct ifnet *ifp, int disable
 		if (err)
 			printf("%s: abort rx pipe failed: %s\n",
 			       device_xname(sc->sc_dev), usbd_errstr(err));
-		err = usbd_close_pipe(sc->sc_pipe_rx);
-		if (err)
-			printf("%s: close rx pipe failed: %s\n",
-			       device_xname(sc->sc_dev), usbd_errstr(err));
-		sc->sc_pipe_rx = NULL;
 	}
 
 	/* TX endpoint */
@@ -1303,11 +1298,6 @@ udav_stop(struct ifnet *ifp, int disable
 		if (err)
 			printf("%s: abort tx pipe failed: %s\n",
 			       device_xname(sc->sc_dev), usbd_errstr(err));
-		err = usbd_close_pipe(sc->sc_pipe_tx);
-		if (err)
-			printf("%s: close tx pipe failed: %s\n",
-			       device_xname(sc->sc_dev), usbd_errstr(err));
-		sc->sc_pipe_tx = NULL;
 	}
 
 #if 0
@@ -1350,6 +1340,25 @@ udav_stop(struct ifnet *ifp, int disable
 		}
 	}
 
+	/* Close pipes */
+	/* RX endpoint */
+	if (sc->sc_pipe_rx != NULL) {
+		err = usbd_close_pipe(sc->sc_pipe_rx);
+		if (err)
+			printf("%s: close rx pipe failed: %s\n",
+			       device_xname(sc->sc_dev), usbd_errstr(err));
+		sc->sc_pipe_rx = NULL;
+	}
+
+	/* TX endpoint */
+	if (sc->sc_pipe_tx != NULL) {
+		err = usbd_close_pipe(sc->sc_pipe_tx);
+		if (err)
+			printf("%s: close tx pipe failed: %s\n",
+			       device_xname(sc->sc_dev), usbd_errstr(err));
+		sc->sc_pipe_tx = NULL;
+	}
+
 	if (!ISSET(sc->sc_flags, UDAV_NO_PHY))
 		sc->sc_link = 0;
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);

Index: src/sys/dev/usb/if_upgt.c
diff -u src/sys/dev/usb/if_upgt.c:1.12.4.8 src/sys/dev/usb/if_upgt.c:1.12.4.9
--- src/sys/dev/usb/if_upgt.c:1.12.4.8	Wed Dec 23 16:02:42 2015
+++ src/sys/dev/usb/if_upgt.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_upgt.c,v 1.12.4.8 2015/12/23 16:02:42 skrll Exp $	*/
+/*	$NetBSD: if_upgt.c,v 1.12.4.9 2015/12/28 09:26:33 skrll Exp $	*/
 /*	$OpenBSD: if_upgt.c,v 1.49 2010/04/20 22:05:43 tedu Exp $ */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_upgt.c,v 1.12.4.8 2015/12/23 16:02:42 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_upgt.c,v 1.12.4.9 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/callout.h>
@@ -508,11 +508,9 @@ upgt_detach(device_t self, int flags)
 	/* abort and close TX / RX pipes */
 	if (sc->sc_tx_pipeh != NULL) {
 		usbd_abort_pipe(sc->sc_tx_pipeh);
-		usbd_close_pipe(sc->sc_tx_pipeh);
 	}
 	if (sc->sc_rx_pipeh != NULL) {
 		usbd_abort_pipe(sc->sc_rx_pipeh);
-		usbd_close_pipe(sc->sc_rx_pipeh);
 	}
 
 	/* free xfers */
@@ -520,6 +518,14 @@ upgt_detach(device_t self, int flags)
 	upgt_free_rx(sc);
 	upgt_free_cmd(sc);
 
+	/* Close TX / RX pipes */
+	if (sc->sc_tx_pipeh != NULL) {
+		usbd_close_pipe(sc->sc_tx_pipeh);
+	}
+	if (sc->sc_rx_pipeh != NULL) {
+		usbd_close_pipe(sc->sc_rx_pipeh);
+	}
+
 	/* free firmware */
 	upgt_fw_free(sc);
 

Index: src/sys/dev/usb/if_upl.c
diff -u src/sys/dev/usb/if_upl.c:1.47.4.8 src/sys/dev/usb/if_upl.c:1.47.4.9
--- src/sys/dev/usb/if_upl.c:1.47.4.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_upl.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_upl.c,v 1.47.4.8 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_upl.c,v 1.47.4.9 2015/12/28 09:26:33 skrll Exp $	*/
 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.47.4.8 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.47.4.9 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -913,12 +913,6 @@ upl_stop(struct upl_softc *sc)
 			printf("%s: abort rx pipe failed: %s\n",
 			device_xname(sc->sc_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->sc_ep[UPL_ENDPT_RX]);
-		if (err) {
-			printf("%s: close rx pipe failed: %s\n",
-			device_xname(sc->sc_dev), usbd_errstr(err));
-		}
-		sc->sc_ep[UPL_ENDPT_RX] = NULL;
 	}
 
 	if (sc->sc_ep[UPL_ENDPT_TX] != NULL) {
@@ -927,12 +921,6 @@ upl_stop(struct upl_softc *sc)
 			printf("%s: abort tx pipe failed: %s\n",
 			device_xname(sc->sc_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->sc_ep[UPL_ENDPT_TX]);
-		if (err) {
-			printf("%s: close tx pipe failed: %s\n",
-			    device_xname(sc->sc_dev), usbd_errstr(err));
-		}
-		sc->sc_ep[UPL_ENDPT_TX] = NULL;
 	}
 
 	if (sc->sc_ep[UPL_ENDPT_INTR] != NULL) {
@@ -941,12 +929,6 @@ upl_stop(struct upl_softc *sc)
 			printf("%s: abort intr pipe failed: %s\n",
 			device_xname(sc->sc_dev), usbd_errstr(err));
 		}
-		err = usbd_close_pipe(sc->sc_ep[UPL_ENDPT_INTR]);
-		if (err) {
-			printf("%s: close intr pipe failed: %s\n",
-			    device_xname(sc->sc_dev), usbd_errstr(err));
-		}
-		sc->sc_ep[UPL_ENDPT_INTR] = NULL;
 	}
 
 	/* Free RX resources. */
@@ -955,10 +937,6 @@ upl_stop(struct upl_softc *sc)
 			m_freem(sc->sc_cdata.upl_rx_chain[i].upl_mbuf);
 			sc->sc_cdata.upl_rx_chain[i].upl_mbuf = NULL;
 		}
-		if (sc->sc_cdata.upl_rx_chain[i].upl_xfer != NULL) {
-			usbd_destroy_xfer(sc->sc_cdata.upl_rx_chain[i].upl_xfer);
-			sc->sc_cdata.upl_rx_chain[i].upl_xfer = NULL;
-		}
 	}
 
 	/* Free TX resources. */
@@ -973,6 +951,34 @@ upl_stop(struct upl_softc *sc)
 		}
 	}
 
+	/* Close pipes */
+	if (sc->sc_ep[UPL_ENDPT_RX] != NULL) {
+		err = usbd_close_pipe(sc->sc_ep[UPL_ENDPT_RX]);
+		if (err) {
+			printf("%s: close rx pipe failed: %s\n",
+			device_xname(sc->sc_dev), usbd_errstr(err));
+		}
+		sc->sc_ep[UPL_ENDPT_RX] = NULL;
+	}
+
+	if (sc->sc_ep[UPL_ENDPT_TX] != NULL) {
+		err = usbd_close_pipe(sc->sc_ep[UPL_ENDPT_TX]);
+		if (err) {
+			printf("%s: close tx pipe failed: %s\n",
+			    device_xname(sc->sc_dev), usbd_errstr(err));
+		}
+		sc->sc_ep[UPL_ENDPT_TX] = NULL;
+	}
+
+	if (sc->sc_ep[UPL_ENDPT_INTR] != NULL) {
+		err = usbd_close_pipe(sc->sc_ep[UPL_ENDPT_INTR]);
+		if (err) {
+			printf("%s: close intr pipe failed: %s\n",
+			    device_xname(sc->sc_dev), usbd_errstr(err));
+		}
+		sc->sc_ep[UPL_ENDPT_INTR] = NULL;
+	}
+
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 }
 

Index: src/sys/dev/usb/if_ural.c
diff -u src/sys/dev/usb/if_ural.c:1.44.14.8 src/sys/dev/usb/if_ural.c:1.44.14.9
--- src/sys/dev/usb/if_ural.c:1.44.14.8	Wed Oct  7 10:39:25 2015
+++ src/sys/dev/usb/if_ural.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ural.c,v 1.44.14.8 2015/10/07 10:39:25 skrll Exp $ */
+/*	$NetBSD: if_ural.c,v 1.44.14.9 2015/12/28 09:26:33 skrll Exp $ */
 /*	$FreeBSD: /repoman/r/ncvs/src/sys/dev/usb/if_ural.c,v 1.40 2006/06/02 23:14:40 sam Exp $	*/
 
 /*-
@@ -24,7 +24,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ural.c,v 1.44.14.8 2015/10/07 10:39:25 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ural.c,v 1.44.14.9 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -546,21 +546,6 @@ ural_detach(device_t self, int flags)
 	callout_stop(&sc->sc_scan_ch);
 	callout_stop(&sc->sc_amrr_ch);
 
-	if (sc->amrr_xfer != NULL) {
-		usbd_destroy_xfer(sc->amrr_xfer);
-		sc->amrr_xfer = NULL;
-	}
-
-	if (sc->sc_rx_pipeh != NULL) {
-		usbd_abort_pipe(sc->sc_rx_pipeh);
-		usbd_close_pipe(sc->sc_rx_pipeh);
-	}
-
-	if (sc->sc_tx_pipeh != NULL) {
-		usbd_abort_pipe(sc->sc_tx_pipeh);
-		usbd_close_pipe(sc->sc_tx_pipeh);
-	}
-
 	bpf_detach(ifp);
 	ieee80211_ifdetach(ic);
 	if_detach(ifp);
@@ -2260,18 +2245,24 @@ ural_stop(struct ifnet *ifp, int disable
 
 	if (sc->sc_rx_pipeh != NULL) {
 		usbd_abort_pipe(sc->sc_rx_pipeh);
-		usbd_close_pipe(sc->sc_rx_pipeh);
-		sc->sc_rx_pipeh = NULL;
 	}
 
 	if (sc->sc_tx_pipeh != NULL) {
 		usbd_abort_pipe(sc->sc_tx_pipeh);
-		usbd_close_pipe(sc->sc_tx_pipeh);
-		sc->sc_tx_pipeh = NULL;
 	}
 
 	ural_free_rx_list(sc);
 	ural_free_tx_list(sc);
+
+	if (sc->sc_rx_pipeh != NULL) {
+		usbd_close_pipe(sc->sc_rx_pipeh);
+		sc->sc_rx_pipeh = NULL;
+	}
+
+	if (sc->sc_tx_pipeh != NULL) {
+		usbd_close_pipe(sc->sc_tx_pipeh);
+		sc->sc_tx_pipeh = NULL;
+	}
 }
 
 int

Index: src/sys/dev/usb/if_url.c
diff -u src/sys/dev/usb/if_url.c:1.48.4.7 src/sys/dev/usb/if_url.c:1.48.4.8
--- src/sys/dev/usb/if_url.c:1.48.4.7	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_url.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_url.c,v 1.48.4.7 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_url.c,v 1.48.4.8 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.48.4.7 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.48.4.8 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -1152,11 +1152,6 @@ url_stop(struct ifnet *ifp, int disable)
 		if (err)
 			printf("%s: abort rx pipe failed: %s\n",
 			       device_xname(sc->sc_dev), usbd_errstr(err));
-		err = usbd_close_pipe(sc->sc_pipe_rx);
-		if (err)
-			printf("%s: close rx pipe failed: %s\n",
-			       device_xname(sc->sc_dev), usbd_errstr(err));
-		sc->sc_pipe_rx = NULL;
 	}
 
 	/* TX endpoint */
@@ -1165,11 +1160,6 @@ url_stop(struct ifnet *ifp, int disable)
 		if (err)
 			printf("%s: abort tx pipe failed: %s\n",
 			       device_xname(sc->sc_dev), usbd_errstr(err));
-		err = usbd_close_pipe(sc->sc_pipe_tx);
-		if (err)
-			printf("%s: close tx pipe failed: %s\n",
-			       device_xname(sc->sc_dev), usbd_errstr(err));
-		sc->sc_pipe_tx = NULL;
 	}
 
 #if 0
@@ -1212,6 +1202,25 @@ url_stop(struct ifnet *ifp, int disable)
 		}
 	}
 
+	/* Close pipes */
+	/* RX endpoint */
+	if (sc->sc_pipe_rx != NULL) {
+		err = usbd_close_pipe(sc->sc_pipe_rx);
+		if (err)
+			printf("%s: close rx pipe failed: %s\n",
+			       device_xname(sc->sc_dev), usbd_errstr(err));
+		sc->sc_pipe_rx = NULL;
+	}
+
+	/* TX endpoint */
+	if (sc->sc_pipe_tx != NULL) {
+		err = usbd_close_pipe(sc->sc_pipe_tx);
+		if (err)
+			printf("%s: close tx pipe failed: %s\n",
+			       device_xname(sc->sc_dev), usbd_errstr(err));
+		sc->sc_pipe_tx = NULL;
+	}
+
 	sc->sc_link = 0;
 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
 }

Index: src/sys/dev/usb/if_urndis.c
diff -u src/sys/dev/usb/if_urndis.c:1.9.4.6 src/sys/dev/usb/if_urndis.c:1.9.4.7
--- src/sys/dev/usb/if_urndis.c:1.9.4.6	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_urndis.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_urndis.c,v 1.9.4.6 2015/10/06 21:32:15 skrll Exp $ */
+/*	$NetBSD: if_urndis.c,v 1.9.4.7 2015/12/28 09:26:33 skrll Exp $ */
 /*	$OpenBSD: if_urndis.c,v 1.31 2011/07/03 15:47:17 matthew Exp $ */
 
 /*
@@ -21,7 +21,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urndis.c,v 1.9.4.6 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urndis.c,v 1.9.4.7 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1104,11 +1104,6 @@ urndis_stop(struct ifnet *ifp)
 		if (err)
 			printf("%s: abort rx pipe failed: %s\n",
 			    DEVNAME(sc), usbd_errstr(err));
-		err = usbd_close_pipe(sc->sc_bulkin_pipe);
-		if (err)
-			printf("%s: close rx pipe failed: %s\n",
-			    DEVNAME(sc), usbd_errstr(err));
-		sc->sc_bulkin_pipe = NULL;
 	}
 
 	if (sc->sc_bulkout_pipe != NULL) {
@@ -1116,11 +1111,6 @@ urndis_stop(struct ifnet *ifp)
 		if (err)
 			printf("%s: abort tx pipe failed: %s\n",
 			    DEVNAME(sc), usbd_errstr(err));
-		err = usbd_close_pipe(sc->sc_bulkout_pipe);
-		if (err)
-			printf("%s: close tx pipe failed: %s\n",
-			    DEVNAME(sc), usbd_errstr(err));
-		sc->sc_bulkout_pipe = NULL;
 	}
 
 	for (i = 0; i < RNDIS_RX_LIST_CNT; i++) {
@@ -1144,6 +1134,23 @@ urndis_stop(struct ifnet *ifp)
 			sc->sc_data.sc_tx_chain[i].sc_xfer = NULL;
 		}
 	}
+
+	/* Close pipes. */
+	if (sc->sc_bulkin_pipe != NULL) {
+		err = usbd_close_pipe(sc->sc_bulkin_pipe);
+		if (err)
+			printf("%s: close rx pipe failed: %s\n",
+			    DEVNAME(sc), usbd_errstr(err));
+		sc->sc_bulkin_pipe = NULL;
+	}
+
+	if (sc->sc_bulkout_pipe != NULL) {
+		err = usbd_close_pipe(sc->sc_bulkout_pipe);
+		if (err)
+			printf("%s: close tx pipe failed: %s\n",
+			    DEVNAME(sc), usbd_errstr(err));
+		sc->sc_bulkout_pipe = NULL;
+	}
 }
 
 static void

Index: src/sys/dev/usb/if_urtwn.c
diff -u src/sys/dev/usb/if_urtwn.c:1.34.4.10 src/sys/dev/usb/if_urtwn.c:1.34.4.11
--- src/sys/dev/usb/if_urtwn.c:1.34.4.10	Sun Dec 27 12:09:59 2015
+++ src/sys/dev/usb/if_urtwn.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_urtwn.c,v 1.34.4.10 2015/12/27 12:09:59 skrll Exp $	*/
+/*	$NetBSD: if_urtwn.c,v 1.34.4.11 2015/12/28 09:26:33 skrll Exp $	*/
 /*	$OpenBSD: if_urtwn.c,v 1.42 2015/02/10 23:25:46 mpi Exp $	*/
 
 /*-
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.34.4.10 2015/12/27 12:09:59 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.34.4.11 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -507,7 +507,7 @@ urtwn_detach(device_t self, int flags)
 		ieee80211_ifdetach(&sc->sc_ic);
 		if_detach(ifp);
 
-		/* Abort and close Tx/Rx pipes. */
+		/* Close Tx/Rx pipes.  Abort done by urtwn_stop. */
 		urtwn_close_pipes(sc);
 	}
 
@@ -618,14 +618,12 @@ urtwn_close_pipes(struct urtwn_softc *sc
 	CTASSERT(sizeof(pipe) == sizeof(void *));
 	pipe = atomic_swap_ptr(&sc->rx_pipe, NULL);
 	if (pipe != NULL) {
-		usbd_abort_pipe(pipe);
 		usbd_close_pipe(pipe);
 	}
 	/* Close Tx pipes. */
 	for (i = 0; i < R92C_MAX_EPOUT; i++) {
 		pipe = atomic_swap_ptr(&sc->tx_pipe[i], NULL);
 		if (pipe != NULL) {
-			usbd_abort_pipe(pipe);
 			usbd_close_pipe(pipe);
 		}
 	}

Index: src/sys/dev/usb/if_zyd.c
diff -u src/sys/dev/usb/if_zyd.c:1.36.14.8 src/sys/dev/usb/if_zyd.c:1.36.14.9
--- src/sys/dev/usb/if_zyd.c:1.36.14.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/if_zyd.c	Mon Dec 28 09:26:33 2015
@@ -1,5 +1,5 @@
 /*	$OpenBSD: if_zyd.c,v 1.52 2007/02/11 00:08:04 jsg Exp $	*/
-/*	$NetBSD: if_zyd.c,v 1.36.14.8 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: if_zyd.c,v 1.36.14.9 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2006 by Damien Bergamini <[email protected]>
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.36.14.8 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.36.14.9 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -474,6 +474,7 @@ zyd_detach(device_t self, int flags)
 	callout_stop(&sc->sc_scan_ch);
 	callout_stop(&sc->sc_amrr_ch);
 
+	/* Abort, etc. done by zyd_stop */
 	zyd_close_pipes(sc);
 
 	sc->attached = 0;
@@ -558,7 +559,6 @@ zyd_close_pipes(struct zyd_softc *sc)
 
 	for (i = 0; i < ZYD_ENDPT_CNT; i++) {
 		if (sc->zyd_ep[i] != NULL) {
-			usbd_abort_pipe(sc->zyd_ep[i]);
 			usbd_close_pipe(sc->zyd_ep[i]);
 			sc->zyd_ep[i] = NULL;
 		}

Index: src/sys/dev/usb/irmce.c
diff -u src/sys/dev/usb/irmce.c:1.1.32.5 src/sys/dev/usb/irmce.c:1.1.32.6
--- src/sys/dev/usb/irmce.c:1.1.32.5	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/irmce.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: irmce.c,v 1.1.32.5 2015/10/06 21:32:15 skrll Exp $ */
+/* $NetBSD: irmce.c,v 1.1.32.6 2015/12/28 09:26:33 skrll Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <[email protected]>
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: irmce.c,v 1.1.32.5 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: irmce.c,v 1.1.32.6 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -260,6 +260,12 @@ irmce_detach(device_t self, int flags)
 			return error;
 	}
 
+	if (sc->sc_bulkin_pipe) {
+		usbd_abort_pipe(sc->sc_bulkin_pipe);
+	}
+	if (sc->sc_bulkout_pipe) {
+		usbd_abort_pipe(sc->sc_bulkout_pipe);
+	}
 	if (sc->sc_bulkin_xfer) {
 		usbd_destroy_xfer(sc->sc_bulkin_xfer);
 		sc->sc_bulkin_buffer = NULL;
@@ -270,6 +276,14 @@ irmce_detach(device_t self, int flags)
 		sc->sc_bulkout_buffer = NULL;
 		sc->sc_bulkout_xfer = NULL;
 	}
+	if (sc->sc_bulkin_pipe) {
+		usbd_close_pipe(sc->sc_bulkin_pipe);
+		sc->sc_bulkin_pipe = NULL;
+	}
+	if (sc->sc_bulkout_pipe) {
+		usbd_close_pipe(sc->sc_bulkout_pipe);
+		sc->sc_bulkout_pipe = NULL;
+	}
 
 	pmf_device_deregister(self);
 
@@ -353,10 +367,6 @@ irmce_open(void *priv, int flag, int mod
 	if (err) {
 		aprint_error_dev(sc->sc_dev,
 		    "couldn't reset device: %s\n", usbd_errstr(err));
-		usbd_close_pipe(sc->sc_bulkin_pipe);
-		sc->sc_bulkin_pipe = NULL;
-		usbd_close_pipe(sc->sc_bulkout_pipe);
-		sc->sc_bulkout_pipe = NULL;
 	}
 	sc->sc_ir_state = IRMCE_STATE_HEADER;
 	sc->sc_rc6_nhb = 0;
@@ -371,13 +381,9 @@ irmce_close(void *priv, int flag, int mo
 
 	if (sc->sc_bulkin_pipe) {
 		usbd_abort_pipe(sc->sc_bulkin_pipe);
-		usbd_close_pipe(sc->sc_bulkin_pipe);
-		sc->sc_bulkin_pipe = NULL;
 	}
 	if (sc->sc_bulkout_pipe) {
 		usbd_abort_pipe(sc->sc_bulkout_pipe);
-		usbd_close_pipe(sc->sc_bulkout_pipe);
-		sc->sc_bulkout_pipe = NULL;
 	}
 
 	return 0;

Index: src/sys/dev/usb/pseye.c
diff -u src/sys/dev/usb/pseye.c:1.21.34.8 src/sys/dev/usb/pseye.c:1.21.34.9
--- src/sys/dev/usb/pseye.c:1.21.34.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/pseye.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pseye.c,v 1.21.34.8 2015/10/06 21:32:15 skrll Exp $ */
+/* $NetBSD: pseye.c,v 1.21.34.9 2015/12/28 09:26:33 skrll Exp $ */
 
 /*-
  * Copyright (c) 2008 Jared D. McNeill <[email protected]>
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pseye.c,v 1.21.34.8 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pseye.c,v 1.21.34.9 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -285,13 +285,17 @@ pseye_detach(device_t self, int flags)
 		sc->sc_videodev = NULL;
 	}
 
+	if (sc->sc_bulkin_pipe != NULL) {
+		usbd_abort_pipe(sc->sc_bulkin_pipe);
+	}
+
 	if (sc->sc_bulkin_xfer != NULL) {
 		usbd_destroy_xfer(sc->sc_bulkin_xfer);
 		sc->sc_bulkin_xfer = NULL;
 	}
 
 	if (sc->sc_bulkin_pipe != NULL) {
-		usbd_abort_pipe(sc->sc_bulkin_pipe);
+		usbd_close_pipe(sc->sc_bulkin_pipe);
 		sc->sc_bulkin_pipe = NULL;
 	}
 

Index: src/sys/dev/usb/uaudio.c
diff -u src/sys/dev/usb/uaudio.c:1.140.2.11 src/sys/dev/usb/uaudio.c:1.140.2.12
--- src/sys/dev/usb/uaudio.c:1.140.2.11	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/uaudio.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: uaudio.c,v 1.140.2.11 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: uaudio.c,v 1.140.2.12 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 1999, 2012 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uaudio.c,v 1.140.2.11 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uaudio.c,v 1.140.2.12 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -321,6 +321,7 @@ Static void	uaudio_ctl_set
 Static usbd_status uaudio_set_speed(struct uaudio_softc *, int, u_int);
 
 Static usbd_status uaudio_chan_open(struct uaudio_softc *, struct chan *);
+Static void	uaudio_chan_abort(struct uaudio_softc *, struct chan *);
 Static void	uaudio_chan_close(struct uaudio_softc *, struct chan *);
 Static usbd_status uaudio_chan_alloc_buffers
 	(struct uaudio_softc *, struct chan *);
@@ -2238,8 +2239,9 @@ uaudio_halt_out_dma(void *addr)
 
 	mutex_spin_exit(&sc->sc_intr_lock);
 	if (sc->sc_playchan.pipe != NULL) {
-		uaudio_chan_close(sc, &sc->sc_playchan);
+		uaudio_chan_abort(sc, &sc->sc_playchan);
 		uaudio_chan_free_buffers(sc, &sc->sc_playchan);
+		uaudio_chan_close(sc, &sc->sc_playchan);
 		sc->sc_playchan.intr = NULL;
 	}
 	mutex_spin_enter(&sc->sc_intr_lock);
@@ -2256,8 +2258,9 @@ uaudio_halt_in_dma(void *addr)
 
 	mutex_spin_exit(&sc->sc_intr_lock);
 	if (sc->sc_recchan.pipe != NULL) {
-		uaudio_chan_close(sc, &sc->sc_recchan);
+		uaudio_chan_abort(sc, &sc->sc_recchan);
 		uaudio_chan_free_buffers(sc, &sc->sc_recchan);
+		uaudio_chan_close(sc, &sc->sc_recchan);
 		sc->sc_recchan.intr = NULL;
 	}
 	mutex_spin_enter(&sc->sc_intr_lock);
@@ -2721,7 +2724,7 @@ uaudio_chan_open(struct uaudio_softc *sc
 }
 
 Static void
-uaudio_chan_close(struct uaudio_softc *sc, struct chan *ch)
+uaudio_chan_abort(struct uaudio_softc *sc, struct chan *ch)
 {
 	struct usbd_pipe *pipe;
 	struct as_info *as;
@@ -2733,14 +2736,27 @@ uaudio_chan_close(struct uaudio_softc *s
 		DPRINTF("set null alt=%d\n", sc->sc_nullalt);
 		usbd_set_interface(as->ifaceh, sc->sc_nullalt);
 	}
-	pipe = atomic_swap_ptr(&ch->pipe, NULL);
+	pipe = ch->pipe;
 	if (pipe) {
 		usbd_abort_pipe(pipe);
+	}
+	pipe = ch->sync_pipe;
+	if (pipe) {
+		usbd_abort_pipe(pipe);
+	}
+}
+
+Static void
+uaudio_chan_close(struct uaudio_softc *sc, struct chan *ch)
+{
+	struct usbd_pipe *pipe;
+
+	pipe = atomic_swap_ptr(&ch->pipe, NULL);
+	if (pipe) {
 		usbd_close_pipe(pipe);
 	}
 	pipe = atomic_swap_ptr(&ch->sync_pipe, NULL);
 	if (pipe) {
-		usbd_abort_pipe(pipe);
 		usbd_close_pipe(pipe);
 	}
 }

Index: src/sys/dev/usb/ubt.c
diff -u src/sys/dev/usb/ubt.c:1.51.4.6 src/sys/dev/usb/ubt.c:1.51.4.7
--- src/sys/dev/usb/ubt.c:1.51.4.6	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/ubt.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ubt.c,v 1.51.4.6 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: ubt.c,v 1.51.4.7 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ubt.c,v 1.51.4.6 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ubt.c,v 1.51.4.7 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -739,32 +739,22 @@ ubt_abortdealloc(struct ubt_softc *sc)
 
 	if (sc->sc_evt_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_evt_pipe);
-		usbd_close_pipe(sc->sc_evt_pipe);
-		sc->sc_evt_pipe = NULL;
 	}
 
 	if (sc->sc_aclrd_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_aclrd_pipe);
-		usbd_close_pipe(sc->sc_aclrd_pipe);
-		sc->sc_aclrd_pipe = NULL;
 	}
 
 	if (sc->sc_aclwr_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_aclwr_pipe);
-		usbd_close_pipe(sc->sc_aclwr_pipe);
-		sc->sc_aclwr_pipe = NULL;
 	}
 
 	if (sc->sc_scord_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_scord_pipe);
-		usbd_close_pipe(sc->sc_scord_pipe);
-		sc->sc_scord_pipe = NULL;
 	}
 
 	if (sc->sc_scowr_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_scowr_pipe);
-		usbd_close_pipe(sc->sc_scowr_pipe);
-		sc->sc_scowr_pipe = NULL;
 	}
 
 	/* Free event buffer */
@@ -806,6 +796,31 @@ ubt_abortdealloc(struct ubt_softc *sc)
 		}
 	}
 
+	if (sc->sc_evt_pipe != NULL) {
+		usbd_close_pipe(sc->sc_evt_pipe);
+		sc->sc_evt_pipe = NULL;
+	}
+
+	if (sc->sc_aclrd_pipe != NULL) {
+		usbd_close_pipe(sc->sc_aclrd_pipe);
+		sc->sc_aclrd_pipe = NULL;
+	}
+
+	if (sc->sc_aclwr_pipe != NULL) {
+		usbd_close_pipe(sc->sc_aclwr_pipe);
+		sc->sc_aclwr_pipe = NULL;
+	}
+
+	if (sc->sc_scord_pipe != NULL) {
+		usbd_close_pipe(sc->sc_scord_pipe);
+		sc->sc_scord_pipe = NULL;
+	}
+
+	if (sc->sc_scowr_pipe != NULL) {
+		usbd_close_pipe(sc->sc_scowr_pipe);
+		sc->sc_scowr_pipe = NULL;
+	}
+
 	/* Free partial SCO packets */
 	if (sc->sc_scord_mbuf != NULL) {
 		m_freem(sc->sc_scord_mbuf);

Index: src/sys/dev/usb/ucom.c
diff -u src/sys/dev/usb/ucom.c:1.108.2.10 src/sys/dev/usb/ucom.c:1.108.2.11
--- src/sys/dev/usb/ucom.c:1.108.2.10	Sun Dec 27 12:09:59 2015
+++ src/sys/dev/usb/ucom.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ucom.c,v 1.108.2.10 2015/12/27 12:09:59 skrll Exp $	*/
+/*	$NetBSD: ucom.c,v 1.108.2.11 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ucom.c,v 1.108.2.10 2015/12/27 12:09:59 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ucom.c,v 1.108.2.11 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -447,6 +447,16 @@ ucom_detach(device_t self, int flags)
 			usbd_destroy_xfer(sc->sc_obuff[i].ub_xfer);
 	}
 
+	if (sc->sc_bulkin_pipe != NULL) {
+		usbd_close_pipe(sc->sc_bulkin_pipe);
+		sc->sc_bulkin_pipe = NULL;
+	}
+
+	if (sc->sc_bulkout_pipe != NULL) {
+		usbd_close_pipe(sc->sc_bulkout_pipe);
+		sc->sc_bulkout_pipe = NULL;
+	}
+
 	/* Detach the random source */
 	rnd_detach_source(&sc->sc_rndsource);
 

Index: src/sys/dev/usb/udl.c
diff -u src/sys/dev/usb/udl.c:1.11.6.6 src/sys/dev/usb/udl.c:1.11.6.7
--- src/sys/dev/usb/udl.c:1.11.6.6	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/udl.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: udl.c,v 1.11.6.6 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: udl.c,v 1.11.6.7 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2009 FUKAUMI Naoki.
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udl.c,v 1.11.6.6 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udl.c,v 1.11.6.7 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -475,7 +475,6 @@ udl_detach(device_t self, int flags)
 	 */
 	if (sc->sc_tx_pipeh != NULL) {
 		usbd_abort_pipe(sc->sc_tx_pipeh);
-		usbd_close_pipe(sc->sc_tx_pipeh);
 	}
 
 	/*
@@ -484,6 +483,10 @@ udl_detach(device_t self, int flags)
 	udl_cmdq_flush(sc);
 	udl_cmdq_free(sc);
 
+	if (sc->sc_tx_pipeh != NULL) {
+		usbd_close_pipe(sc->sc_tx_pipeh);
+	}
+
 	cv_destroy(&sc->sc_cv);
 	mutex_destroy(&sc->sc_mtx);
 

Index: src/sys/dev/usb/udsir.c
diff -u src/sys/dev/usb/udsir.c:1.1.14.6 src/sys/dev/usb/udsir.c:1.1.14.7
--- src/sys/dev/usb/udsir.c:1.1.14.6	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/udsir.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: udsir.c,v 1.1.14.6 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: udsir.c,v 1.1.14.7 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: udsir.c,v 1.1.14.6 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udsir.c,v 1.1.14.7 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -257,11 +257,26 @@ udsir_detach(device_t self, int flags)
 	/* Abort all pipes.  Causes processes waiting for transfer to wake. */
 	if (sc->sc_rd_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_rd_pipe);
+	}
+	if (sc->sc_wr_pipe != NULL) {
+		usbd_abort_pipe(sc->sc_wr_pipe);
+	}
+	if (sc->sc_rd_xfer != NULL) {
+		usbd_destroy_xfer(sc->sc_rd_xfer);
+		sc->sc_rd_xfer = NULL;
+		sc->sc_rd_buf = NULL;
+	}
+	if (sc->sc_wr_xfer != NULL) {
+		usbd_destroy_xfer(sc->sc_wr_xfer);
+		sc->sc_wr_xfer = NULL;
+		sc->sc_wr_buf = NULL;
+	}
+	/* Close pipes. */
+	if (sc->sc_rd_pipe != NULL) {
 		usbd_close_pipe(sc->sc_rd_pipe);
 		sc->sc_rd_pipe = NULL;
 	}
 	if (sc->sc_wr_pipe != NULL) {
-		usbd_abort_pipe(sc->sc_wr_pipe);
 		usbd_close_pipe(sc->sc_wr_pipe);
 		sc->sc_wr_pipe = NULL;
 	}
@@ -410,13 +425,9 @@ udsir_close(void *h, int flag, int mode,
 
 	if (sc->sc_rd_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_rd_pipe);
-		usbd_close_pipe(sc->sc_rd_pipe);
-		sc->sc_rd_pipe = NULL;
 	}
 	if (sc->sc_wr_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_wr_pipe);
-		usbd_close_pipe(sc->sc_wr_pipe);
-		sc->sc_wr_pipe = NULL;
 	}
 	if (sc->sc_rd_xfer != NULL) {
 		usbd_destroy_xfer(sc->sc_rd_xfer);
@@ -428,6 +439,14 @@ udsir_close(void *h, int flag, int mode,
 		sc->sc_wr_xfer = NULL;
 		sc->sc_wr_buf = NULL;
 	}
+	if (sc->sc_rd_pipe != NULL) {
+		usbd_close_pipe(sc->sc_rd_pipe);
+		sc->sc_rd_pipe = NULL;
+	}
+	if (sc->sc_wr_pipe != NULL) {
+		usbd_close_pipe(sc->sc_wr_pipe);
+		sc->sc_wr_pipe = NULL;
+	}
 	if (sc->sc_ur_buf != NULL) {
 		kmem_free(sc->sc_ur_buf, IRDA_MAX_FRAME_SIZE);
 		sc->sc_ur_buf = NULL;

Index: src/sys/dev/usb/ugen.c
diff -u src/sys/dev/usb/ugen.c:1.126.2.11 src/sys/dev/usb/ugen.c:1.126.2.12
--- src/sys/dev/usb/ugen.c:1.126.2.11	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/ugen.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ugen.c,v 1.126.2.11 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: ugen.c,v 1.126.2.12 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ugen.c,v 1.126.2.11 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ugen.c,v 1.126.2.12 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -534,8 +534,6 @@ ugenclose(dev_t dev, int flag, int mode,
 			     endpt, dir, sce));
 
 		usbd_abort_pipe(sce->pipeh);
-		usbd_close_pipe(sce->pipeh);
-		sce->pipeh = NULL;
 
 		int isize = UGETW(sce->edesc->wMaxPacketSize);
 		int msize = 0;
@@ -560,6 +558,8 @@ ugenclose(dev_t dev, int flag, int mode,
 		default:
 			break;
 		}
+		usbd_close_pipe(sce->pipeh);
+		sce->pipeh = NULL;
 		if (sce->ibuf != NULL) {
 			kmem_free(sce->ibuf, msize);
 			sce->ibuf = NULL;

Index: src/sys/dev/usb/uhso.c
diff -u src/sys/dev/usb/uhso.c:1.17.2.5 src/sys/dev/usb/uhso.c:1.17.2.6
--- src/sys/dev/usb/uhso.c:1.17.2.5	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/uhso.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: uhso.c,v 1.17.2.5 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: uhso.c,v 1.17.2.6 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2009 Iain Hibbert
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uhso.c,v 1.17.2.5 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uhso.c,v 1.17.2.6 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -617,9 +617,8 @@ uhso_switch_mode(struct usbd_device *ude
 
 	status = usbd_transfer(xfer);
 
-	usbd_abort_pipe(pipe);
-	usbd_close_pipe(pipe);
 	usbd_destroy_xfer(xfer);
+	usbd_close_pipe(pipe);
 
 	return (status == USBD_NORMAL_COMPLETION ? 0 : EIO);
 }
@@ -1191,12 +1190,30 @@ uhso_bulk_clean(struct uhso_port *hp)
 
 	if (hp->hp_rpipe != NULL) {
 		usbd_abort_pipe(hp->hp_rpipe);
+	}
+
+	if (hp->hp_wpipe != NULL) {
+		usbd_abort_pipe(hp->hp_wpipe);
+	}
+
+	if (hp->hp_rxfer != NULL) {
+		usbd_destroy_xfer(hp->hp_rxfer);
+		hp->hp_rxfer = NULL;
+		hp->hp_rbuf = NULL;
+	}
+
+	if (hp->hp_wxfer != NULL) {
+		usbd_destroy_xfer(hp->hp_wxfer);
+		hp->hp_wxfer = NULL;
+		hp->hp_wbuf = NULL;
+	}
+
+	if (hp->hp_rpipe != NULL) {
 		usbd_close_pipe(hp->hp_rpipe);
 		hp->hp_rpipe = NULL;
 	}
 
 	if (hp->hp_wpipe != NULL) {
-		usbd_abort_pipe(hp->hp_wpipe);
 		usbd_close_pipe(hp->hp_wpipe);
 		hp->hp_wpipe = NULL;
 	}
@@ -2279,18 +2296,6 @@ uhso_ifnet_clean(struct uhso_port *hp)
 	DPRINTF(1, "hp=%p\n", hp);
 
 	(*hp->hp_clean)(hp);
-
-	if (hp->hp_rxfer != NULL) {
-		usbd_destroy_xfer(hp->hp_rxfer);
-		hp->hp_rxfer = NULL;
-		hp->hp_rbuf = NULL;
-	}
-
-	if (hp->hp_wxfer != NULL) {
-		usbd_destroy_xfer(hp->hp_wxfer);
-		hp->hp_wxfer = NULL;
-		hp->hp_wbuf = NULL;
-	}
 }
 
 /* called at splnet() with IFF_OACTIVE not set */

Index: src/sys/dev/usb/uirda.c
diff -u src/sys/dev/usb/uirda.c:1.38.6.8 src/sys/dev/usb/uirda.c:1.38.6.9
--- src/sys/dev/usb/uirda.c:1.38.6.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/uirda.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: uirda.c,v 1.38.6.8 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: uirda.c,v 1.38.6.9 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uirda.c,v 1.38.6.8 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uirda.c,v 1.38.6.9 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -304,11 +304,25 @@ uirda_detach(device_t self, int flags)
 	/* Abort all pipes.  Causes processes waiting for transfer to wake. */
 	if (sc->sc_rd_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_rd_pipe);
+	}
+	if (sc->sc_wr_pipe != NULL) {
+		usbd_abort_pipe(sc->sc_wr_pipe);
+	}
+	if (sc->sc_rd_xfer != NULL) {
+		usbd_destroy_xfer(sc->sc_rd_xfer);
+		sc->sc_rd_xfer = NULL;
+		sc->sc_rd_buf = NULL;
+	}
+	if (sc->sc_wr_xfer != NULL) {
+		usbd_destroy_xfer(sc->sc_wr_xfer);
+		sc->sc_wr_xfer = NULL;
+		sc->sc_wr_buf = NULL;
+	}
+	if (sc->sc_rd_pipe != NULL) {
 		usbd_close_pipe(sc->sc_rd_pipe);
 		sc->sc_rd_pipe = NULL;
 	}
 	if (sc->sc_wr_pipe != NULL) {
-		usbd_abort_pipe(sc->sc_wr_pipe);
 		usbd_close_pipe(sc->sc_wr_pipe);
 		sc->sc_wr_pipe = NULL;
 	}
@@ -428,13 +442,9 @@ uirda_close(void *h, int flag, int mode,
 
 	if (sc->sc_rd_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_rd_pipe);
-		usbd_close_pipe(sc->sc_rd_pipe);
-		sc->sc_rd_pipe = NULL;
 	}
 	if (sc->sc_wr_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_wr_pipe);
-		usbd_close_pipe(sc->sc_wr_pipe);
-		sc->sc_wr_pipe = NULL;
 	}
 	if (sc->sc_rd_xfer != NULL) {
 		usbd_destroy_xfer(sc->sc_rd_xfer);
@@ -446,6 +456,14 @@ uirda_close(void *h, int flag, int mode,
 		sc->sc_wr_xfer = NULL;
 		sc->sc_wr_buf = NULL;
 	}
+	if (sc->sc_rd_pipe != NULL) {
+		usbd_close_pipe(sc->sc_rd_pipe);
+		sc->sc_rd_pipe = NULL;
+	}
+	if (sc->sc_wr_pipe != NULL) {
+		usbd_close_pipe(sc->sc_wr_pipe);
+		sc->sc_wr_pipe = NULL;
+	}
 
 	return 0;
 }

Index: src/sys/dev/usb/ulpt.c
diff -u src/sys/dev/usb/ulpt.c:1.95.4.8 src/sys/dev/usb/ulpt.c:1.95.4.9
--- src/sys/dev/usb/ulpt.c:1.95.4.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/ulpt.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulpt.c,v 1.95.4.8 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: ulpt.c,v 1.95.4.9 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 1998, 2003 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulpt.c,v 1.95.4.8 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulpt.c,v 1.95.4.9 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -575,23 +575,26 @@ ulptclose(dev_t dev, int flag, int mode,
 
 	if (sc->sc_out_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_out_pipe);
-		usbd_close_pipe(sc->sc_out_pipe);
-		sc->sc_out_pipe = NULL;
 	}
 	if (sc->sc_out_xfer != NULL) {
 		usbd_destroy_xfer(sc->sc_out_xfer);
 		sc->sc_out_xfer = NULL;
 	}
-
+	if (sc->sc_out_pipe != NULL) {
+		usbd_close_pipe(sc->sc_out_pipe);
+		sc->sc_out_pipe = NULL;
+	}
 	if (sc->sc_in_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_in_pipe);
-		usbd_close_pipe(sc->sc_in_pipe);
-		sc->sc_in_pipe = NULL;
 	}
 	if (sc->sc_in_xfer != NULL) {
 		usbd_destroy_xfer(sc->sc_in_xfer);
 		sc->sc_in_xfer = NULL;
 	}
+	if (sc->sc_in_pipe != NULL) {
+		usbd_close_pipe(sc->sc_in_pipe);
+		sc->sc_in_pipe = NULL;
+	}
 
 	sc->sc_state = 0;
 

Index: src/sys/dev/usb/umass.c
diff -u src/sys/dev/usb/umass.c:1.149.2.9 src/sys/dev/usb/umass.c:1.149.2.10
--- src/sys/dev/usb/umass.c:1.149.2.9	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/umass.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: umass.c,v 1.149.2.9 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: umass.c,v 1.149.2.10 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -124,7 +124,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.149.2.9 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umass.c,v 1.149.2.10 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -868,8 +868,6 @@ umass_disco(struct umass_softc *sc)
 	for (i = 0 ; i < UMASS_NEP ; i++) {
 		if (sc->sc_pipe[i] != NULL) {
 			usbd_abort_pipe(sc->sc_pipe[i]);
-			usbd_close_pipe(sc->sc_pipe[i]);
-			sc->sc_pipe[i] = NULL;
 		}
 	}
 
@@ -877,11 +875,20 @@ umass_disco(struct umass_softc *sc)
 	usbd_abort_default_pipe(sc->sc_udev);
 
 	/* Free the xfers. */
-	for (i = 0; i < XFER_NR; i++)
+	for (i = 0; i < XFER_NR; i++) {
 		if (sc->transfer_xfer[i] != NULL) {
 			usbd_destroy_xfer(sc->transfer_xfer[i]);
 			sc->transfer_xfer[i] = NULL;
 		}
+	}
+
+	for (i = 0 ; i < UMASS_NEP ; i++) {
+		if (sc->sc_pipe[i] != NULL) {
+			usbd_close_pipe(sc->sc_pipe[i]);
+			sc->sc_pipe[i] = NULL;
+		}
+	}
+
 }
 
 /*

Index: src/sys/dev/usb/umidi.c
diff -u src/sys/dev/usb/umidi.c:1.65.14.8 src/sys/dev/usb/umidi.c:1.65.14.9
--- src/sys/dev/usb/umidi.c:1.65.14.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/umidi.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: umidi.c,v 1.65.14.8 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: umidi.c,v 1.65.14.9 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001, 2012, 2014 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: umidi.c,v 1.65.14.8 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: umidi.c,v 1.65.14.9 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -706,8 +706,8 @@ free_pipe(struct umidi_endpoint *ep)
 {
 	DPRINTF(("%s: free_pipe %p\n", device_xname(ep->sc->sc_dev), ep));
 	usbd_abort_pipe(ep->pipe);
-	usbd_close_pipe(ep->pipe);
 	usbd_destroy_xfer(ep->xfer);
+	usbd_close_pipe(ep->pipe);
 	softint_disestablish(ep->solicit_cookie);
 }
 

Index: src/sys/dev/usb/usb_subr.c
diff -u src/sys/dev/usb/usb_subr.c:1.198.2.21 src/sys/dev/usb/usb_subr.c:1.198.2.22
--- src/sys/dev/usb/usb_subr.c:1.198.2.21	Sun Dec 27 12:09:59 2015
+++ src/sys/dev/usb/usb_subr.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: usb_subr.c,v 1.198.2.21 2015/12/27 12:09:59 skrll Exp $	*/
+/*	$NetBSD: usb_subr.c,v 1.198.2.22 2015/12/28 09:26:33 skrll Exp $	*/
 /*	$FreeBSD: src/sys/dev/usb/usb_subr.c,v 1.18 1999/11/17 22:33:47 n_hibma Exp $	*/
 
 /*
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.198.2.21 2015/12/27 12:09:59 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.198.2.22 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -756,7 +756,6 @@ usbd_setup_pipe_flags(struct usbd_device
 	p->up_iface = iface;
 	p->up_endpoint = ep;
 	ep->ue_refcnt++;
-	p->up_refcnt = 1;
 	p->up_intrxfer = NULL;
 	p->up_running = 0;
 	p->up_aborting = 0;

Index: src/sys/dev/usb/usbdi.c
diff -u src/sys/dev/usb/usbdi.c:1.162.2.39 src/sys/dev/usb/usbdi.c:1.162.2.40
--- src/sys/dev/usb/usbdi.c:1.162.2.39	Sun Dec 27 12:10:00 2015
+++ src/sys/dev/usb/usbdi.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbdi.c,v 1.162.2.39 2015/12/27 12:10:00 skrll Exp $	*/
+/*	$NetBSD: usbdi.c,v 1.162.2.40 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 1998, 2012, 2015 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.162.2.39 2015/12/27 12:10:00 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.162.2.40 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -143,8 +143,8 @@ usbd_dump_pipe(struct usbd_pipe *pipe)
 	usbd_dump_device(pipe->up_dev);
 	usbd_dump_endpoint(pipe->up_endpoint);
 	USBHIST_LOG(usbdebug, "(usbd_dump_pipe)", 0, 0, 0, 0);
-	USBHIST_LOG(usbdebug, "     refcnt = %d running = %d aborting = %d",
-	    pipe->up_refcnt, pipe->up_running, pipe->up_aborting, 0);
+	USBHIST_LOG(usbdebug, "     running = %d aborting = %d",
+	    pipe->up_running, pipe->up_aborting, 0, 0);
 	USBHIST_LOG(usbdebug, "     intrxfer = %p, repeat = %d, interval = %d",
 	    pipe->up_intrxfer, pipe->up_repeat, pipe->up_interval, 0);
 }
@@ -242,21 +242,23 @@ usbd_close_pipe(struct usbd_pipe *pipe)
 	KASSERT(pipe != NULL);
 
 	usbd_lock_pipe(pipe);
-	if (--pipe->up_refcnt != 0) {
-		usbd_unlock_pipe(pipe);
-		return USBD_NORMAL_COMPLETION;
-	}
-	if (! SIMPLEQ_EMPTY(&pipe->up_queue)) {
-		usbd_unlock_pipe(pipe);
-		return USBD_PENDING_REQUESTS;
+
+	if (!SIMPLEQ_EMPTY(&pipe->up_queue)) {
+		printf("WARNING: pipe closed with active xfers on addr %d\n",
+		    pipe->up_dev->ud_addr);
+		usbd_ar_pipe(pipe);
 	}
+
+	KASSERT(SIMPLEQ_EMPTY(&pipe->up_queue));
+
 	LIST_REMOVE(pipe, up_next);
 	pipe->up_endpoint->ue_refcnt--;
-	pipe->up_methods->upm_close(pipe);
-	usbd_unlock_pipe(pipe);
 	if (pipe->up_intrxfer != NULL)
 		usbd_destroy_xfer(pipe->up_intrxfer);
+	pipe->up_methods->upm_close(pipe);
+	usbd_unlock_pipe(pipe);
 	kmem_free(pipe, pipe->up_dev->ud_bus->ub_pipesize);
+
 	return USBD_NORMAL_COMPLETION;
 }
 

Index: src/sys/dev/usb/usbdivar.h
diff -u src/sys/dev/usb/usbdivar.h:1.109.2.20 src/sys/dev/usb/usbdivar.h:1.109.2.21
--- src/sys/dev/usb/usbdivar.h:1.109.2.20	Wed Oct 21 07:36:31 2015
+++ src/sys/dev/usb/usbdivar.h	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbdivar.h,v 1.109.2.20 2015/10/21 07:36:31 skrll Exp $	*/
+/*	$NetBSD: usbdivar.h,v 1.109.2.21 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 1998, 2012 The NetBSD Foundation, Inc.
@@ -220,7 +220,6 @@ struct usbd_pipe {
 	struct usbd_interface  *up_iface;
 	struct usbd_device     *up_dev;
 	struct usbd_endpoint   *up_endpoint;
-	int			up_refcnt;
 	char			up_running;
 	char			up_aborting;
 	SIMPLEQ_HEAD(, usbd_xfer) up_queue;

Index: src/sys/dev/usb/uscanner.c
diff -u src/sys/dev/usb/uscanner.c:1.75.4.8 src/sys/dev/usb/uscanner.c:1.75.4.9
--- src/sys/dev/usb/uscanner.c:1.75.4.8	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/uscanner.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: uscanner.c,v 1.75.4.8 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: uscanner.c,v 1.75.4.9 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uscanner.c,v 1.75.4.8 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uscanner.c,v 1.75.4.9 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -454,23 +454,26 @@ uscannerclose(dev_t dev, int flag, int m
 void
 uscanner_do_close(struct uscanner_softc *sc)
 {
-	if (sc->sc_bulkin_xfer) {
-		usbd_destroy_xfer(sc->sc_bulkin_xfer);
-		sc->sc_bulkin_xfer = NULL;
-	}
-	if (sc->sc_bulkout_xfer) {
-		usbd_destroy_xfer(sc->sc_bulkout_xfer);
-		sc->sc_bulkout_xfer = NULL;
-	}
-
 	if (!(sc->sc_dev_flags & USC_KEEP_OPEN)) {
 		if (sc->sc_bulkin_pipe != NULL) {
 			usbd_abort_pipe(sc->sc_bulkin_pipe);
+		}
+		if (sc->sc_bulkout_pipe != NULL) {
+			usbd_abort_pipe(sc->sc_bulkout_pipe);
+		}
+		if (sc->sc_bulkin_xfer) {
+			usbd_destroy_xfer(sc->sc_bulkin_xfer);
+			sc->sc_bulkin_xfer = NULL;
+		}
+		if (sc->sc_bulkout_xfer) {
+			usbd_destroy_xfer(sc->sc_bulkout_xfer);
+			sc->sc_bulkout_xfer = NULL;
+		}
+		if (sc->sc_bulkin_pipe != NULL) {
 			usbd_close_pipe(sc->sc_bulkin_pipe);
 			sc->sc_bulkin_pipe = NULL;
 		}
 		if (sc->sc_bulkout_pipe != NULL) {
-			usbd_abort_pipe(sc->sc_bulkout_pipe);
 			usbd_close_pipe(sc->sc_bulkout_pipe);
 			sc->sc_bulkout_pipe = NULL;
 		}

Index: src/sys/dev/usb/usscanner.c
diff -u src/sys/dev/usb/usscanner.c:1.38.6.10 src/sys/dev/usb/usscanner.c:1.38.6.11
--- src/sys/dev/usb/usscanner.c:1.38.6.10	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/usscanner.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: usscanner.c,v 1.38.6.10 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: usscanner.c,v 1.38.6.11 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -47,7 +47,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usscanner.c,v 1.38.6.10 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usscanner.c,v 1.38.6.11 2015/12/28 09:26:33 skrll Exp $");
 
 #include "scsibus.h"
 #include <sys/param.h>
@@ -394,18 +394,6 @@ usscanner_detach(device_t self, int flag
 Static void
 usscanner_cleanup(struct usscanner_softc *sc)
 {
-	if (sc->sc_in_pipe != NULL) {
-		usbd_close_pipe(sc->sc_in_pipe);
-		sc->sc_in_pipe = NULL;
-	}
-	if (sc->sc_intr_pipe != NULL) {
-		usbd_close_pipe(sc->sc_intr_pipe);
-		sc->sc_intr_pipe = NULL;
-	}
-	if (sc->sc_out_pipe != NULL) {
-		usbd_close_pipe(sc->sc_out_pipe);
-		sc->sc_out_pipe = NULL;
-	}
 	if (sc->sc_cmd_xfer != NULL) {
 		usbd_destroy_xfer(sc->sc_cmd_xfer);
 		sc->sc_cmd_xfer = NULL;
@@ -418,6 +406,18 @@ usscanner_cleanup(struct usscanner_softc
 		usbd_destroy_xfer(sc->sc_dataout_xfer);
 		sc->sc_dataout_xfer = NULL;
 	}
+	if (sc->sc_in_pipe != NULL) {
+		usbd_close_pipe(sc->sc_in_pipe);
+		sc->sc_in_pipe = NULL;
+	}
+	if (sc->sc_intr_pipe != NULL) {
+		usbd_close_pipe(sc->sc_intr_pipe);
+		sc->sc_intr_pipe = NULL;
+	}
+	if (sc->sc_out_pipe != NULL) {
+		usbd_close_pipe(sc->sc_out_pipe);
+		sc->sc_out_pipe = NULL;
+	}
 }
 
 int

Index: src/sys/dev/usb/ustir.c
diff -u src/sys/dev/usb/ustir.c:1.33.10.9 src/sys/dev/usb/ustir.c:1.33.10.10
--- src/sys/dev/usb/ustir.c:1.33.10.9	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/ustir.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ustir.c,v 1.33.10.9 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: ustir.c,v 1.33.10.10 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ustir.c,v 1.33.10.9 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ustir.c,v 1.33.10.10 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -331,11 +331,25 @@ ustir_detach(device_t self, int flags)
 	/* Abort all pipes.  Causes processes waiting for transfer to wake. */
 	if (sc->sc_rd_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_rd_pipe);
+	}
+	if (sc->sc_wr_pipe != NULL) {
+		usbd_abort_pipe(sc->sc_wr_pipe);
+	}
+	if (sc->sc_rd_xfer != NULL) {
+		usbd_destroy_xfer(sc->sc_rd_xfer);
+		sc->sc_rd_xfer = NULL;
+		sc->sc_rd_buf = NULL;
+	}
+	if (sc->sc_wr_xfer != NULL) {
+		usbd_destroy_xfer(sc->sc_wr_xfer);
+		sc->sc_wr_xfer = NULL;
+		sc->sc_wr_buf = NULL;
+	}
+	if (sc->sc_rd_pipe != NULL) {
 		usbd_close_pipe(sc->sc_rd_pipe);
 		sc->sc_rd_pipe = NULL;
 	}
 	if (sc->sc_wr_pipe != NULL) {
-		usbd_abort_pipe(sc->sc_wr_pipe);
 		usbd_close_pipe(sc->sc_wr_pipe);
 		sc->sc_wr_pipe = NULL;
 	}
@@ -777,12 +791,10 @@ ustir_close(void *h, int flag, int mode,
 
 	if (sc->sc_rd_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_rd_pipe);
-		usbd_close_pipe(sc->sc_rd_pipe);
 		sc->sc_rd_pipe = NULL;
 	}
 	if (sc->sc_wr_pipe != NULL) {
 		usbd_abort_pipe(sc->sc_wr_pipe);
-		usbd_close_pipe(sc->sc_wr_pipe);
 		sc->sc_wr_pipe = NULL;
 	}
 	if (sc->sc_rd_xfer != NULL) {
@@ -799,6 +811,14 @@ ustir_close(void *h, int flag, int mode,
 		kmem_free(sc->sc_ur_buf, IRDA_MAX_FRAME_SIZE);
 		sc->sc_ur_buf = NULL;
 	}
+	if (sc->sc_rd_pipe != NULL) {
+		usbd_close_pipe(sc->sc_rd_pipe);
+		sc->sc_rd_pipe = NULL;
+	}
+	if (sc->sc_wr_pipe != NULL) {
+		usbd_close_pipe(sc->sc_wr_pipe);
+		sc->sc_wr_pipe = NULL;
+	}
 
 	if (--sc->sc_refcnt < 0)
 		usb_detach_wakeupold(sc->sc_dev);

Index: src/sys/dev/usb/utoppy.c
diff -u src/sys/dev/usb/utoppy.c:1.24.4.9 src/sys/dev/usb/utoppy.c:1.24.4.10
--- src/sys/dev/usb/utoppy.c:1.24.4.9	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/utoppy.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: utoppy.c,v 1.24.4.9 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: utoppy.c,v 1.24.4.10 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: utoppy.c,v 1.24.4.9 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: utoppy.c,v 1.24.4.10 2015/12/28 09:26:33 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -365,6 +365,11 @@ utoppy_detach(device_t self, int flags)
 	if (sc->sc_out_xfer != NULL)
 		usbd_destroy_xfer(sc->sc_out_xfer);
 
+	if (sc->sc_out_pipe != NULL)
+		usbd_close_pipe(sc->sc_out_pipe);
+	if (sc->sc_in_pipe != NULL)
+		usbd_close_pipe(sc->sc_in_pipe);
+
 	s = splusb();
 	if (--sc->sc_refcnt >= 0)
 		usb_detach_waitold(sc->sc_dev);
@@ -1420,16 +1425,12 @@ utoppyclose(dev_t dev, int flag, int mod
 	if (sc->sc_out_pipe != NULL) {
 		if ((err = usbd_abort_pipe(sc->sc_out_pipe)) != 0)
 			printf("usbd_abort_pipe(OUT) returned %d\n", err);
-		if ((err = usbd_close_pipe(sc->sc_out_pipe)) != 0)
-			printf("usbd_close_pipe(OUT) returned %d\n", err);
 		sc->sc_out_pipe = NULL;
 	}
 
 	if (sc->sc_in_pipe != NULL) {
 		if ((err = usbd_abort_pipe(sc->sc_in_pipe)) != 0)
 			printf("usbd_abort_pipe(IN) returned %d\n", err);
-		if ((err = usbd_close_pipe(sc->sc_in_pipe)) != 0)
-			printf("usbd_close_pipe(IN) returned %d\n", err);
 		sc->sc_in_pipe = NULL;
 	}
 

Index: src/sys/dev/usb/uvideo.c
diff -u src/sys/dev/usb/uvideo.c:1.41.2.9 src/sys/dev/usb/uvideo.c:1.41.2.10
--- src/sys/dev/usb/uvideo.c:1.41.2.9	Tue Oct  6 21:32:15 2015
+++ src/sys/dev/usb/uvideo.c	Mon Dec 28 09:26:33 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvideo.c,v 1.41.2.9 2015/10/06 21:32:15 skrll Exp $	*/
+/*	$NetBSD: uvideo.c,v 1.41.2.10 2015/12/28 09:26:33 skrll Exp $	*/
 
 /*
  * Copyright (c) 2008 Patrick Mahoney
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvideo.c,v 1.41.2.9 2015/10/06 21:32:15 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvideo.c,v 1.41.2.10 2015/12/28 09:26:33 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -1645,8 +1645,6 @@ uvideo_stream_stop_xfer(struct uvideo_st
 
 		if (bx->bx_pipe) {
 			usbd_abort_pipe(bx->bx_pipe);
-			usbd_close_pipe(bx->bx_pipe);
-			bx->bx_pipe = NULL;
 		}
 
 		if (bx->bx_xfer) {
@@ -1654,6 +1652,11 @@ uvideo_stream_stop_xfer(struct uvideo_st
 			bx->bx_xfer = NULL;
 		}
 
+		if (bx->bx_pipe) {
+			usbd_close_pipe(bx->bx_pipe);
+			bx->bx_pipe = NULL;
+		}
+
 		DPRINTF(("uvideo_stream_stop_xfer: UE_BULK: done\n"));
 
 		return 0;
@@ -1661,8 +1664,6 @@ uvideo_stream_stop_xfer(struct uvideo_st
 		ix = &vs->vs_xfer.isoc;
 		if (ix->ix_pipe != NULL) {
 			usbd_abort_pipe(ix->ix_pipe);
-			usbd_close_pipe(ix->ix_pipe);
-			ix->ix_pipe = NULL;
 		}
 
 		for (i = 0; i < UVIDEO_NXFERS; i++) {
@@ -1680,6 +1681,10 @@ uvideo_stream_stop_xfer(struct uvideo_st
 			}
 		}
 
+		if (ix->ix_pipe != NULL) {
+			usbd_close_pipe(ix->ix_pipe);
+			ix->ix_pipe = NULL;
+		}
 		/* Give it some time to settle */
 		usbd_delay_ms(vs->vs_parent->sc_udev, 1000);
 

Reply via email to