Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/usb Convert uatp(4) to use usb_task instead of a wor...



details:   https://anonhg.NetBSD.org/src/rev/e2550a7fd388
branches:  trunk
changeset: 330583:e2550a7fd388
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Mon Jul 14 14:56:10 2014 +0000

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

Compile-tested only; hardware not available right now.

diffstat:

 sys/dev/usb/uatp.c |  57 +++++++++++++----------------------------------------
 1 files changed, 14 insertions(+), 43 deletions(-)

diffs (130 lines):

diff -r f536a8ac5515 -r e2550a7fd388 sys/dev/usb/uatp.c
--- a/sys/dev/usb/uatp.c        Mon Jul 14 14:08:41 2014 +0000
+++ b/sys/dev/usb/uatp.c        Mon Jul 14 14:56:10 2014 +0000
@@ -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 @@
 #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_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 @@
 #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 @@
 
 /*
  * 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"));
-
        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);
+       usb_rem_task(sc->sc_hdev.sc_parent->sc_udev, &sc->sc_reset_task);
 
        return 0;
 }
@@ -1384,21 +1365,14 @@
 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);
+       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 @@
 
        /* 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 */



Home | Main Index | Thread Index | Old Index