Module Name:    src
Committed By:   riastradh
Date:           Mon Jul 14 14:56:10 UTC 2014

Modified Files:
        src/sys/dev/usb: uatp.c

Log Message:
Convert uatp(4) to use usb_task instead of a workqueue.

Compile-tested only; hardware not available right now.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/usb/uatp.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/uatp.c
diff -u src/sys/dev/usb/uatp.c:1.7 src/sys/dev/usb/uatp.c:1.8
--- src/sys/dev/usb/uatp.c:1.7	Fri Apr 25 18:10:21 2014
+++ src/sys/dev/usb/uatp.c	Mon Jul 14 14:56:10 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uatp.c,v 1.7 2014/04/25 18:10:21 riastradh Exp $	*/
+/*	$NetBSD: uatp.c,v 1.8 2014/07/14 14:56:10 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.7 2014/04/25 18:10:21 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uatp.c,v 1.8 2014/07/14 14:56:10 riastradh Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -158,7 +158,6 @@ __KERNEL_RCSID(0, "$NetBSD: uatp.c,v 1.7
 #include <sys/sysctl.h>
 #include <sys/systm.h>
 #include <sys/time.h>
-#include <sys/workqueue.h>
 
 /* Order is important here...sigh...  */
 #include <dev/usb/usb.h>
@@ -289,7 +288,7 @@ static void geyser34_enable_raw_mode(str
 static void geyser34_initialize(struct uatp_softc *);
 static int geyser34_finalize(struct uatp_softc *);
 static void geyser34_deferred_reset(struct uatp_softc *);
-static void geyser34_reset_worker(struct work *, void *);
+static void geyser34_reset_task(void *);
 static void uatp_intr(struct uhidev *, void *, unsigned int);
 static bool base_sample_softc_flag(const struct uatp_softc *, const uint8_t *);
 static bool base_sample_input_flag(const struct uatp_softc *, const uint8_t *);
@@ -506,9 +505,7 @@ struct uatp_softc {
 #define UATP_ENABLED	(1 << 0)	/* . Is the wsmouse enabled?  */
 #define UATP_DYING	(1 << 1)	/* . Have we been deactivated?  */
 #define UATP_VALID	(1 << 2)	/* . Do we have valid sensor data?  */
-	struct workqueue *sc_reset_wq;	/* Workqueue for resetting.  */
-	struct work sc_reset_work;	/* Work for said workqueue.  */
-	unsigned int sc_reset_pending;	/* True if a reset is pending.  */
+	struct usb_task sc_reset_task;	/* Task for resetting device.  */
 
 	callout_t sc_untap_callout;	/* Releases button after tap.  */
 	kmutex_t sc_tap_mutex;		/* Protects the following fields.  */
@@ -1342,41 +1339,25 @@ geyser34_enable_raw_mode(struct uatp_sof
 
 /*
  * The Geyser 3 and 4 need to be reset periodically after we detect a
- * continual flow of spurious interrupts.  We use a workqueue for this.
- * The flag avoids deferring a reset more than once before it has run,
- * or detaching the device while there is a deferred reset pending.
+ * continual flow of spurious interrupts.  We use a USB task for this.
  */
 
 static void
 geyser34_initialize(struct uatp_softc *sc)
 {
-	DPRINTF(sc, UATP_DEBUG_MISC, ("initializing\n"));
 
+	DPRINTF(sc, UATP_DEBUG_MISC, ("initializing\n"));
 	geyser34_enable_raw_mode(sc);
-	sc->sc_reset_pending = 0;
-
-	if (workqueue_create(&sc->sc_reset_wq, "uatprstq",
-		geyser34_reset_worker, sc, PRI_NONE, IPL_USB, WQ_MPSAFE)
-            != 0) {
-		sc->sc_reset_wq = NULL;
-		aprint_error_dev(uatp_dev(sc),
-		    "couldn't create Geyser 3/4 reset workqueue\n");
-	}
+	usb_init_task(&sc->sc_reset_task, &geyser34_reset_task, sc,
+	    USB_TASKQ_MPSAFE);
 }
 
 static int
 geyser34_finalize(struct uatp_softc *sc)
 {
-	DPRINTF(sc, UATP_DEBUG_MISC, ("finalizing\n"));
-
-	/* Can't destroy the work queue if there is work pending.  */
-	if (sc->sc_reset_pending) {
-		DPRINTF(sc, UATP_DEBUG_MISC, ("EBUSY -- reset pending\n"));
-		return EBUSY;
-	}
 
-	if (sc->sc_reset_wq != NULL)
-		workqueue_destroy(sc->sc_reset_wq);
+	DPRINTF(sc, UATP_DEBUG_MISC, ("finalizing\n"));
+	usb_rem_task(sc->sc_hdev.sc_parent->sc_udev, &sc->sc_reset_task);
 
 	return 0;
 }
@@ -1384,21 +1365,14 @@ geyser34_finalize(struct uatp_softc *sc)
 static void
 geyser34_deferred_reset(struct uatp_softc *sc)
 {
-	DPRINTF(sc, UATP_DEBUG_RESET, ("deferring reset\n"));
 
-	/* Initialization can fail, so make sure we have a work queue.  */
-	if (sc->sc_reset_wq == NULL)
-		DPRINTF(sc, UATP_DEBUG_RESET, ("no work queue\n"));
-	/* Check for pending work.  */
-	else if (atomic_swap_uint(&sc->sc_reset_pending, 1))
-		DPRINTF(sc, UATP_DEBUG_RESET, ("already pending\n"));
-	/* No work was pending; flag is now set.  */
-	else
-		workqueue_enqueue(sc->sc_reset_wq, &sc->sc_reset_work, NULL);
+	DPRINTF(sc, UATP_DEBUG_RESET, ("deferring reset\n"));
+	usb_add_task(sc->sc_hdev.sc_parent->sc_udev, &sc->sc_reset_task,
+	    USB_TASKQ_DRIVER);
 }
 
 static void
-geyser34_reset_worker(struct work *work, void *arg)
+geyser34_reset_task(void *arg)
 {
 	struct uatp_softc *sc = arg;
 
@@ -1406,9 +1380,6 @@ geyser34_reset_worker(struct work *work,
 
 	/* Reset by putting it into raw mode.  Not sure why.  */
 	geyser34_enable_raw_mode(sc);
-
-	/* Mark the device ready for new work.  */
-	(void)atomic_swap_uint(&sc->sc_reset_pending, 0);
 }
 
 /* Interrupt handler */

Reply via email to