Module Name: src
Committed By: riastradh
Date: Thu Aug 2 06:09:05 UTC 2018
Modified Files:
src/sys/dev/usb: if_athn_usb.c if_atu.c if_aue.c if_axe.c if_axen.c
if_cue.c if_otus.c if_rum.c if_run.c if_smsc.c if_udav.c if_upgt.c
if_ural.c if_url.c if_urtw.c if_urtwn.c if_zyd.c uatp.c usb.c
usb_subr.c usbdi.h
Log Message:
Fix usb_rem_task_wait API.
- Return whether it removed task from queue or not.
. True if it was on the queue and we intercepted it before it ran.
. False if we could not intercept it: either it wasn't queued,
or it already ran. (Up to caller to distinguish these cases.)
- Pass an optional interlock like callout_halt.
While here, simplify.
ok mrg@
To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/usb/if_athn_usb.c \
src/sys/dev/usb/if_run.c
cvs rdiff -u -r1.62 -r1.63 src/sys/dev/usb/if_atu.c src/sys/dev/usb/if_rum.c \
src/sys/dev/usb/if_urtwn.c
cvs rdiff -u -r1.144 -r1.145 src/sys/dev/usb/if_aue.c
cvs rdiff -u -r1.91 -r1.92 src/sys/dev/usb/if_axe.c
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.79 -r1.80 src/sys/dev/usb/if_cue.c
cvs rdiff -u -r1.34 -r1.35 src/sys/dev/usb/if_otus.c
cvs rdiff -u -r1.35 -r1.36 src/sys/dev/usb/if_smsc.c
cvs rdiff -u -r1.54 -r1.55 src/sys/dev/usb/if_udav.c
cvs rdiff -u -r1.21 -r1.22 src/sys/dev/usb/if_upgt.c
cvs rdiff -u -r1.56 -r1.57 src/sys/dev/usb/if_ural.c
cvs rdiff -u -r1.59 -r1.60 src/sys/dev/usb/if_url.c
cvs rdiff -u -r1.16 -r1.17 src/sys/dev/usb/if_urtw.c src/sys/dev/usb/uatp.c
cvs rdiff -u -r1.49 -r1.50 src/sys/dev/usb/if_zyd.c
cvs rdiff -u -r1.170 -r1.171 src/sys/dev/usb/usb.c
cvs rdiff -u -r1.225 -r1.226 src/sys/dev/usb/usb_subr.c
cvs rdiff -u -r1.94 -r1.95 src/sys/dev/usb/usbdi.h
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_athn_usb.c
diff -u src/sys/dev/usb/if_athn_usb.c:1.28 src/sys/dev/usb/if_athn_usb.c:1.29
--- src/sys/dev/usb/if_athn_usb.c:1.28 Sun Jul 29 01:59:56 2018
+++ src/sys/dev/usb/if_athn_usb.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_athn_usb.c,v 1.28 2018/07/29 01:59:56 riastradh Exp $ */
+/* $NetBSD: if_athn_usb.c,v 1.29 2018/08/02 06:09:04 riastradh 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.28 2018/07/29 01:59:56 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_athn_usb.c,v 1.29 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -335,7 +335,8 @@ athn_usb_attach(device_t parent, device_
athn_usb_free_tx_cmd(usc);
athn_usb_free_tx_msg(usc);
athn_usb_close_pipes(usc);
- usb_rem_task_wait(usc->usc_udev, &usc->usc_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(usc->usc_udev, &usc->usc_task, USB_TASKQ_DRIVER,
+ NULL);
cv_destroy(&usc->usc_cmd_cv);
cv_destroy(&usc->usc_msg_cv);
@@ -501,7 +502,8 @@ athn_usb_detach(device_t self, int flags
athn_usb_wait_async(usc);
- usb_rem_task_wait(usc->usc_udev, &usc->usc_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(usc->usc_udev, &usc->usc_task, USB_TASKQ_DRIVER,
+ NULL);
/* Abort Tx/Rx pipes. */
athn_usb_abort_pipes(usc);
Index: src/sys/dev/usb/if_run.c
diff -u src/sys/dev/usb/if_run.c:1.28 src/sys/dev/usb/if_run.c:1.29
--- src/sys/dev/usb/if_run.c:1.28 Sun Jul 29 02:01:22 2018
+++ src/sys/dev/usb/if_run.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_run.c,v 1.28 2018/07/29 02:01:22 riastradh Exp $ */
+/* $NetBSD: if_run.c,v 1.29 2018/08/02 06:09:04 riastradh 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.28 2018/07/29 02:01:22 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.29 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -762,7 +762,8 @@ run_detach(device_t self, int flags)
run_stop(ifp, 0);
callout_halt(&sc->scan_to, NULL);
callout_halt(&sc->calib_to, NULL);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER,
+ NULL);
}
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
Index: src/sys/dev/usb/if_atu.c
diff -u src/sys/dev/usb/if_atu.c:1.62 src/sys/dev/usb/if_atu.c:1.63
--- src/sys/dev/usb/if_atu.c:1.62 Sun Jul 29 02:00:07 2018
+++ src/sys/dev/usb/if_atu.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_atu.c,v 1.62 2018/07/29 02:00:07 riastradh Exp $ */
+/* $NetBSD: if_atu.c,v 1.63 2018/08/02 06:09:04 riastradh 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.62 2018/07/29 02:00:07 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_atu.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -2235,7 +2235,7 @@ atu_stop(struct ifnet *ifp, int disable)
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
ifp->if_timer = 0;
- usb_rem_task_wait(sc->atu_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->atu_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
/* Stop transfers. */
Index: src/sys/dev/usb/if_rum.c
diff -u src/sys/dev/usb/if_rum.c:1.62 src/sys/dev/usb/if_rum.c:1.63
--- src/sys/dev/usb/if_rum.c:1.62 Sun Jul 29 02:01:11 2018
+++ src/sys/dev/usb/if_rum.c Thu Aug 2 06:09:04 2018
@@ -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.62 2018/07/29 02:01:11 riastradh Exp $ */
+/* $NetBSD: if_rum.c,v 1.63 2018/08/02 06:09:04 riastradh 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.62 2018/07/29 02:01:11 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_rum.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -498,7 +498,7 @@ rum_detach(device_t self, int flags)
rum_stop(ifp, 1);
callout_halt(&sc->sc_scan_ch, NULL);
callout_halt(&sc->sc_amrr_ch, NULL);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
bpf_detach(ifp);
ieee80211_ifdetach(ic); /* free all nodes */
Index: src/sys/dev/usb/if_urtwn.c
diff -u src/sys/dev/usb/if_urtwn.c:1.62 src/sys/dev/usb/if_urtwn.c:1.63
--- src/sys/dev/usb/if_urtwn.c:1.62 Mon Jul 30 00:17:28 2018
+++ src/sys/dev/usb/if_urtwn.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_urtwn.c,v 1.62 2018/07/30 00:17:28 jmcneill Exp $ */
+/* $NetBSD: if_urtwn.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $ */
/* $OpenBSD: if_urtwn.c,v 1.42 2015/02/10 23:25:46 mpi Exp $ */
/*-
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.62 2018/07/30 00:17:28 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.63 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -544,7 +544,8 @@ urtwn_detach(device_t self, int flags)
if (ISSET(sc->sc_flags, URTWN_FLAG_ATTACHED)) {
urtwn_stop(ifp, 0);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER,
+ NULL);
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
bpf_detach(ifp);
Index: src/sys/dev/usb/if_aue.c
diff -u src/sys/dev/usb/if_aue.c:1.144 src/sys/dev/usb/if_aue.c:1.145
--- src/sys/dev/usb/if_aue.c:1.144 Sun Jul 29 02:00:17 2018
+++ src/sys/dev/usb/if_aue.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_aue.c,v 1.144 2018/07/29 02:00:17 riastradh Exp $ */
+/* $NetBSD: if_aue.c,v 1.145 2018/08/02 06:09:04 riastradh Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000
@@ -78,7 +78,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.144 2018/07/29 02:00:17 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.145 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -894,8 +894,10 @@ aue_detach(device_t self, int flags)
* deactivation guaranteed to have already happened?
*/
callout_halt(&sc->aue_stat_ch, NULL);
- usb_rem_task_wait(sc->aue_udev, &sc->aue_tick_task, USB_TASKQ_DRIVER);
- usb_rem_task_wait(sc->aue_udev, &sc->aue_stop_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->aue_udev, &sc->aue_tick_task, USB_TASKQ_DRIVER,
+ NULL);
+ usb_rem_task_wait(sc->aue_udev, &sc->aue_stop_task, USB_TASKQ_DRIVER,
+ NULL);
sc->aue_closing = 1;
cv_signal(&sc->aue_domc);
Index: src/sys/dev/usb/if_axe.c
diff -u src/sys/dev/usb/if_axe.c:1.91 src/sys/dev/usb/if_axe.c:1.92
--- src/sys/dev/usb/if_axe.c:1.91 Sun Jul 29 02:00:27 2018
+++ src/sys/dev/usb/if_axe.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_axe.c,v 1.91 2018/07/29 02:00:27 riastradh Exp $ */
+/* $NetBSD: if_axe.c,v 1.92 2018/08/02 06:09:04 riastradh Exp $ */
/* $OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */
/*
@@ -87,7 +87,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.91 2018/07/29 02:00:27 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.92 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -1112,7 +1112,8 @@ axe_detach(device_t self, int flags)
usbd_abort_pipe(sc->axe_ep[AXE_ENDPT_INTR]);
callout_halt(&sc->axe_stat_ch, NULL);
- usb_rem_task_wait(sc->axe_udev, &sc->axe_tick_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->axe_udev, &sc->axe_tick_task, USB_TASKQ_DRIVER,
+ NULL);
s = splusb();
Index: src/sys/dev/usb/if_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.15 src/sys/dev/usb/if_axen.c:1.16
--- src/sys/dev/usb/if_axen.c:1.15 Sun Jul 29 02:00:38 2018
+++ src/sys/dev/usb/if_axen.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_axen.c,v 1.15 2018/07/29 02:00:38 riastradh Exp $ */
+/* $NetBSD: if_axen.c,v 1.16 2018/08/02 06:09:04 riastradh 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.15 2018/07/29 02:00:38 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.16 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -829,7 +829,7 @@ axen_detach(device_t self, int flags)
callout_halt(&sc->axen_stat_ch, NULL);
usb_rem_task_wait(sc->axen_udev, &sc->axen_tick_task,
- USB_TASKQ_DRIVER);
+ USB_TASKQ_DRIVER, NULL);
s = splusb();
Index: src/sys/dev/usb/if_cue.c
diff -u src/sys/dev/usb/if_cue.c:1.79 src/sys/dev/usb/if_cue.c:1.80
--- src/sys/dev/usb/if_cue.c:1.79 Sun Jul 29 02:00:48 2018
+++ src/sys/dev/usb/if_cue.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_cue.c,v 1.79 2018/07/29 02:00:48 riastradh Exp $ */
+/* $NetBSD: if_cue.c,v 1.80 2018/08/02 06:09:04 riastradh 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.79 2018/07/29 02:00:48 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_cue.c,v 1.80 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -579,8 +579,10 @@ cue_detach(device_t self, int flags)
* deactivation guaranteed to have already happened?
*/
callout_halt(&sc->cue_stat_ch, NULL);
- usb_rem_task_wait(sc->cue_udev, &sc->cue_tick_task, USB_TASKQ_DRIVER);
- usb_rem_task_wait(sc->cue_udev, &sc->cue_stop_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->cue_udev, &sc->cue_tick_task, USB_TASKQ_DRIVER,
+ NULL);
+ usb_rem_task_wait(sc->cue_udev, &sc->cue_stop_task, USB_TASKQ_DRIVER,
+ NULL);
if (!sc->cue_attached) {
/* Detached before attached finished, so just bail out. */
Index: src/sys/dev/usb/if_otus.c
diff -u src/sys/dev/usb/if_otus.c:1.34 src/sys/dev/usb/if_otus.c:1.35
--- src/sys/dev/usb/if_otus.c:1.34 Sun Jul 29 02:00:59 2018
+++ src/sys/dev/usb/if_otus.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_otus.c,v 1.34 2018/07/29 02:00:59 riastradh Exp $ */
+/* $NetBSD: if_otus.c,v 1.35 2018/08/02 06:09:04 riastradh Exp $ */
/* $OpenBSD: if_otus.c,v 1.18 2010/08/27 17:08:00 jsg Exp $ */
/*-
@@ -23,7 +23,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_otus.c,v 1.34 2018/07/29 02:00:59 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_otus.c,v 1.35 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -701,7 +701,7 @@ otus_detach(device_t self, int flags)
if (ifp != NULL) /* Failed to attach properly */
otus_stop(ifp);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
callout_destroy(&sc->sc_scan_to);
callout_destroy(&sc->sc_calib_to);
Index: src/sys/dev/usb/if_smsc.c
diff -u src/sys/dev/usb/if_smsc.c:1.35 src/sys/dev/usb/if_smsc.c:1.36
--- src/sys/dev/usb/if_smsc.c:1.35 Sun Jul 29 02:01:32 2018
+++ src/sys/dev/usb/if_smsc.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_smsc.c,v 1.35 2018/07/29 02:01:32 riastradh Exp $ */
+/* $NetBSD: if_smsc.c,v 1.36 2018/08/02 06:09:04 riastradh 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 $ */
@@ -1149,8 +1149,10 @@ smsc_detach(device_t self, int flags)
if (sc->sc_ep[SMSC_ENDPT_INTR] != NULL)
usbd_abort_pipe(sc->sc_ep[SMSC_ENDPT_INTR]);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER,
+ NULL);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER,
+ NULL);
s = splusb();
Index: src/sys/dev/usb/if_udav.c
diff -u src/sys/dev/usb/if_udav.c:1.54 src/sys/dev/usb/if_udav.c:1.55
--- src/sys/dev/usb/if_udav.c:1.54 Sun Jul 29 02:01:43 2018
+++ src/sys/dev/usb/if_udav.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_udav.c,v 1.54 2018/07/29 02:01:43 riastradh Exp $ */
+/* $NetBSD: if_udav.c,v 1.55 2018/08/02 06:09:04 riastradh 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.54 2018/07/29 02:01:43 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.55 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -355,8 +355,10 @@ udav_detach(device_t self, int flags)
callout_halt(&sc->sc_stat_ch, NULL);
/* Remove any pending tasks */
- usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER,
+ NULL);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER,
+ NULL);
s = splusb();
Index: src/sys/dev/usb/if_upgt.c
diff -u src/sys/dev/usb/if_upgt.c:1.21 src/sys/dev/usb/if_upgt.c:1.22
--- src/sys/dev/usb/if_upgt.c:1.21 Sun Jul 29 02:01:54 2018
+++ src/sys/dev/usb/if_upgt.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_upgt.c,v 1.21 2018/07/29 02:01:54 riastradh Exp $ */
+/* $NetBSD: if_upgt.c,v 1.22 2018/08/02 06:09:04 riastradh 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.21 2018/07/29 02:01:54 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_upgt.c,v 1.22 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -506,8 +506,10 @@ upgt_detach(device_t self, int flags)
/* remove tasks and timeouts */
callout_halt(&sc->scan_to, NULL);
callout_halt(&sc->led_to, NULL);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_task_newstate, USB_TASKQ_DRIVER);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_task_tx, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_task_newstate, USB_TASKQ_DRIVER,
+ NULL);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_task_tx, USB_TASKQ_DRIVER,
+ NULL);
callout_destroy(&sc->scan_to);
callout_destroy(&sc->led_to);
Index: src/sys/dev/usb/if_ural.c
diff -u src/sys/dev/usb/if_ural.c:1.56 src/sys/dev/usb/if_ural.c:1.57
--- src/sys/dev/usb/if_ural.c:1.56 Sun Jul 29 02:02:04 2018
+++ src/sys/dev/usb/if_ural.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ural.c,v 1.56 2018/07/29 02:02:04 riastradh Exp $ */
+/* $NetBSD: if_ural.c,v 1.57 2018/08/02 06:09:04 riastradh 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.56 2018/07/29 02:02:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ural.c,v 1.57 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -536,7 +536,7 @@ ural_detach(device_t self, int flags)
ural_stop(ifp, 1);
callout_halt(&sc->sc_scan_ch, NULL);
callout_halt(&sc->sc_amrr_ch, NULL);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
bpf_detach(ifp);
ieee80211_ifdetach(ic);
Index: src/sys/dev/usb/if_url.c
diff -u src/sys/dev/usb/if_url.c:1.59 src/sys/dev/usb/if_url.c:1.60
--- src/sys/dev/usb/if_url.c:1.59 Sun Jul 29 02:08:17 2018
+++ src/sys/dev/usb/if_url.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_url.c,v 1.59 2018/07/29 02:08:17 riastradh Exp $ */
+/* $NetBSD: if_url.c,v 1.60 2018/08/02 06:09:04 riastradh Exp $ */
/*
* Copyright (c) 2001, 2002
@@ -44,7 +44,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.59 2018/07/29 02:08:17 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.60 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -356,8 +356,10 @@ url_detach(device_t self, int flags)
callout_halt(&sc->sc_stat_ch, NULL);
/* Remove any pending tasks */
- usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_tick_task, USB_TASKQ_DRIVER,
+ NULL);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_stop_task, USB_TASKQ_DRIVER,
+ NULL);
s = splusb();
Index: src/sys/dev/usb/if_urtw.c
diff -u src/sys/dev/usb/if_urtw.c:1.16 src/sys/dev/usb/if_urtw.c:1.17
--- src/sys/dev/usb/if_urtw.c:1.16 Sun Jul 29 02:06:11 2018
+++ src/sys/dev/usb/if_urtw.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_urtw.c,v 1.16 2018/07/29 02:06:11 riastradh Exp $ */
+/* $NetBSD: if_urtw.c,v 1.17 2018/08/02 06:09:04 riastradh Exp $ */
/* $OpenBSD: if_urtw.c,v 1.39 2011/07/03 15:47:17 matthew Exp $ */
/*-
@@ -19,7 +19,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urtw.c,v 1.16 2018/07/29 02:06:11 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtw.c,v 1.17 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -779,8 +779,9 @@ urtw_detach(device_t self, int flags)
callout_destroy(&sc->scan_to);
callout_destroy(&sc->sc_led_ch);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_ledtask, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_ledtask, USB_TASKQ_DRIVER,
+ NULL);
if (ifp->if_softc != NULL) {
bpf_detach(ifp);
Index: src/sys/dev/usb/uatp.c
diff -u src/sys/dev/usb/uatp.c:1.16 src/sys/dev/usb/uatp.c:1.17
--- src/sys/dev/usb/uatp.c:1.16 Sun Jul 29 02:07:46 2018
+++ src/sys/dev/usb/uatp.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: uatp.c,v 1.16 2018/07/29 02:07:46 riastradh Exp $ */
+/* $NetBSD: uatp.c,v 1.17 2018/08/02 06:09:04 riastradh Exp $ */
/*-
* Copyright (c) 2011-2014 The NetBSD Foundation, Inc.
@@ -146,7 +146,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uatp.c,v 1.16 2018/07/29 02:07:46 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uatp.c,v 1.17 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -1363,7 +1363,7 @@ geyser34_finalize(struct uatp_softc *sc)
DPRINTF(sc, UATP_DEBUG_MISC, ("finalizing\n"));
usb_rem_task_wait(sc->sc_hdev.sc_parent->sc_udev, &sc->sc_reset_task,
- USB_TASKQ_DRIVER);
+ USB_TASKQ_DRIVER, NULL);
return 0;
}
Index: src/sys/dev/usb/if_zyd.c
diff -u src/sys/dev/usb/if_zyd.c:1.49 src/sys/dev/usb/if_zyd.c:1.50
--- src/sys/dev/usb/if_zyd.c:1.49 Sun Jul 29 02:07:33 2018
+++ src/sys/dev/usb/if_zyd.c Thu Aug 2 06:09:04 2018
@@ -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.49 2018/07/29 02:07:33 riastradh Exp $ */
+/* $NetBSD: if_zyd.c,v 1.50 2018/08/02 06:09:04 riastradh 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.49 2018/07/29 02:07:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_zyd.c,v 1.50 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -468,7 +468,7 @@ zyd_detach(device_t self, int flags)
zyd_stop(ifp, 1);
callout_halt(&sc->sc_scan_ch, NULL);
callout_halt(&sc->sc_amrr_ch, NULL);
- usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, NULL);
/* Abort, etc. done by zyd_stop */
zyd_close_pipes(sc);
Index: src/sys/dev/usb/usb.c
diff -u src/sys/dev/usb/usb.c:1.170 src/sys/dev/usb/usb.c:1.171
--- src/sys/dev/usb/usb.c:1.170 Sun Jul 29 01:59:46 2018
+++ src/sys/dev/usb/usb.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: usb.c,v 1.170 2018/07/29 01:59:46 riastradh Exp $ */
+/* $NetBSD: usb.c,v 1.171 2018/08/02 06:09:04 riastradh Exp $ */
/*
* Copyright (c) 1998, 2002, 2008, 2012 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.170 2018/07/29 01:59:46 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.171 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -458,28 +458,13 @@ usb_rem_task(struct usbd_device *dev, st
}
/*
- * usb_taskq_wait(taskq, task)
- *
- * Wait for taskq to finish executing task, if it is executing
- * task. Caller must hold the taskq lock.
- */
-static void
-usb_taskq_wait(struct usb_taskq *taskq, struct usb_task *task)
-{
-
- KASSERT(mutex_owned(&taskq->lock));
-
- while (taskq->current_task == task)
- cv_wait(&taskq->cv, &taskq->lock);
-
- KASSERT(taskq->current_task != task);
-}
-
-/*
- * usb_rem_task_wait(dev, task, queue)
+ * usb_rem_task_wait(dev, task, queue, interlock)
*
* If task is scheduled to run, remove it from the queue. If it
- * may have already begun to run, wait for it to complete.
+ * may have already begun to run, drop interlock if not null, wait
+ * for it to complete, and reacquire interlock if not null.
+ * Return true if it successfully removed the task from the queue,
+ * false if not.
*
* Caller MUST guarantee that task will not be scheduled on a
* _different_ queue, at least until after this returns.
@@ -490,11 +475,13 @@ usb_taskq_wait(struct usb_taskq *taskq,
*
* May sleep.
*/
-void
-usb_rem_task_wait(struct usbd_device *dev, struct usb_task *task, int queue)
+bool
+usb_rem_task_wait(struct usbd_device *dev, struct usb_task *task, int queue,
+ kmutex_t *interlock)
{
struct usb_taskq *taskq;
int queue1;
+ bool removed;
USBHIST_FUNC(); USBHIST_CALLED(usbdebug);
ASSERT_SLEEPABLE();
@@ -502,38 +489,40 @@ usb_rem_task_wait(struct usbd_device *de
KASSERT(queue < USB_NUM_TASKQS);
taskq = &usb_taskq[queue];
-
- if ((queue1 = task->queue) == USB_NUM_TASKQS) {
+ mutex_enter(&taskq->lock);
+ queue1 = task->queue;
+ if (queue1 == USB_NUM_TASKQS) {
/*
- * It is not on the queue, but it may have already run.
- * Wait for it.
+ * It is not on the queue. It may be about to run, or
+ * it may have already finished running -- there is no
+ * stopping it now. Wait for it if it is running.
*/
- mutex_enter(&taskq->lock);
- usb_taskq_wait(taskq, task);
- mutex_exit(&taskq->lock);
+ if (interlock)
+ mutex_exit(interlock);
+ while (taskq->current_task == task)
+ cv_wait(&taskq->cv, &taskq->lock);
+ removed = false;
} else {
/*
- * It may be on the queue (and not another one), but
- * the state may have changed by now because we don't
- * have the queue locked. Lock and reload.
+ * It is still on the queue. We can stop it before the
+ * task thread will run it.
*/
- KASSERTMSG(queue1 == queue,
- "task %p on q%d expected on q%d", task, queue1, queue);
- mutex_enter(&taskq->lock);
- queue1 = task->queue;
- if (queue1 == queue) {
- /* Still queued, not run. Just remove it. */
- TAILQ_REMOVE(&taskq->tasks, task, next);
- task->queue = USB_NUM_TASKQS;
- } else {
- /* Already ran. Wait for it. */
- KASSERTMSG(queue1 == USB_NUM_TASKQS,
- "task %p on q%d expected on q%d",
- task, queue1, queue);
- usb_taskq_wait(taskq, task);
- }
- mutex_exit(&taskq->lock);
+ KASSERTMSG(queue1 == queue, "task %p on q%d expected on q%d",
+ task, queue1, queue);
+ TAILQ_REMOVE(&taskq->tasks, task, next);
+ task->queue = USB_NUM_TASKQS;
+ removed = true;
}
+ mutex_exit(&taskq->lock);
+
+ /*
+ * If there's an interlock, and we dropped it to wait,
+ * reacquire it.
+ */
+ if (interlock && !removed)
+ mutex_enter(interlock);
+
+ return removed;
}
void
Index: src/sys/dev/usb/usb_subr.c
diff -u src/sys/dev/usb/usb_subr.c:1.225 src/sys/dev/usb/usb_subr.c:1.226
--- src/sys/dev/usb/usb_subr.c:1.225 Sun Jul 29 02:08:07 2018
+++ src/sys/dev/usb/usb_subr.c Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: usb_subr.c,v 1.225 2018/07/29 02:08:07 riastradh Exp $ */
+/* $NetBSD: usb_subr.c,v 1.226 2018/08/02 06:09:04 riastradh 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.225 2018/07/29 02:08:07 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb_subr.c,v 1.226 2018/08/02 06:09:04 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -823,7 +823,8 @@ usbd_kill_pipe(struct usbd_pipe *pipe)
usbd_lock_pipe(pipe);
pipe->up_methods->upm_close(pipe);
usbd_unlock_pipe(pipe);
- usb_rem_task_wait(pipe->up_dev, &pipe->up_async_task, USB_TASKQ_DRIVER);
+ usb_rem_task_wait(pipe->up_dev, &pipe->up_async_task, USB_TASKQ_DRIVER,
+ NULL);
pipe->up_endpoint->ue_refcnt--;
kmem_free(pipe, pipe->up_dev->ud_bus->ub_pipesize);
}
Index: src/sys/dev/usb/usbdi.h
diff -u src/sys/dev/usb/usbdi.h:1.94 src/sys/dev/usb/usbdi.h:1.95
--- src/sys/dev/usb/usbdi.h:1.94 Tue Jul 31 16:44:30 2018
+++ src/sys/dev/usb/usbdi.h Thu Aug 2 06:09:04 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: usbdi.h,v 1.94 2018/07/31 16:44:30 khorben Exp $ */
+/* $NetBSD: usbdi.h,v 1.95 2018/08/02 06:09:04 riastradh Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdi.h,v 1.18 1999/11/17 22:33:49 n_hibma Exp $ */
/*
@@ -221,7 +221,8 @@ struct usb_task {
void usb_add_task(struct usbd_device *, struct usb_task *, int);
void usb_rem_task(struct usbd_device *, struct usb_task *);
-void usb_rem_task_wait(struct usbd_device *, struct usb_task *, int);
+bool usb_rem_task_wait(struct usbd_device *, struct usb_task *, int,
+ kmutex_t *);
#define usb_init_task(t, f, a, fl) ((t)->fun = (f), (t)->arg = (a), (t)->queue = USB_NUM_TASKQS, (t)->flags = (fl))
struct usb_devno {