Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/usb move otg timer to workq



details:   https://anonhg.NetBSD.org/src/rev/12d0914e92a9
branches:  trunk
changeset: 783893:12d0914e92a9
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Fri Jan 11 20:35:51 2013 +0000

description:
move otg timer to workq

diffstat:

 sys/dev/usb/dwc_otg.c    |  43 +++++++++++++++++++++----------------------
 sys/dev/usb/dwc_otgvar.h |   7 ++++---
 2 files changed, 25 insertions(+), 25 deletions(-)

diffs (167 lines):

diff -r 959d7aff72f3 -r 12d0914e92a9 sys/dev/usb/dwc_otg.c
--- a/sys/dev/usb/dwc_otg.c     Fri Jan 11 19:01:36 2013 +0000
+++ b/sys/dev/usb/dwc_otg.c     Fri Jan 11 20:35:51 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: dwc_otg.c,v 1.10 2013/01/11 18:52:38 jmcneill Exp $    */
+/*     $NetBSD: dwc_otg.c,v 1.11 2013/01/11 20:35:51 jmcneill Exp $    */
 
 /*-
  * Copyright (c) 2012 Hans Petter Selasky. All rights reserved.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc_otg.c,v 1.10 2013/01/11 18:52:38 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc_otg.c,v 1.11 2013/01/11 20:35:51 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -237,13 +237,13 @@
 Static void            dwc_otg_suspend_irq(struct dwc_otg_softc *);
 Static void            dwc_otg_wakeup_peer(struct dwc_otg_softc *);
 Static int             dwc_otg_interrupt(struct dwc_otg_softc *);
-Static void            dwc_otg_timer(void*);
+Static void            dwc_otg_timer(struct dwc_otg_softc *);
 Static void            dwc_otg_timer_tick(void *);
 Static void            dwc_otg_timer_start(struct dwc_otg_softc *);
 Static void            dwc_otg_timer_stop(struct dwc_otg_softc *);
 Static void            dwc_otg_interrupt_poll(struct dwc_otg_softc *);
 Static void            dwc_otg_do_poll(struct usbd_bus *);
-Static void            dwc_otg_intr_worker(struct work *, void *);
+Static void            dwc_otg_worker(struct work *, void *);
 Static void            dwc_otg_rhc(void *);
 Static void            dwc_otg_vbus_interrupt(struct dwc_otg_softc *);
 Static void            dwc_otg_standard_done(usbd_xfer_handle);
@@ -1682,16 +1682,21 @@
 }
 
 Static void
-dwc_otg_intr_worker(struct work *wk, void *priv)
+dwc_otg_worker(struct work *wk, void *priv)
 {
        struct dwc_otg_work *dwork = (struct dwc_otg_work *)wk;
        usbd_xfer_handle xfer = dwork->xfer;
-       struct dwc_otg_softc *sc = DWC_OTG_XFER2SC(xfer);
+       struct dwc_otg_softc *sc = dwork->sc;
 
        DOTG_EVCNT_INCR(sc->sc_ev_work);
 
        mutex_enter(&sc->sc_lock);
-       dwc_otg_start_standard_chain(xfer);
+       if (dwork == &sc->sc_timer_work) {
+               dwc_otg_timer(sc);
+       } else {
+               KASSERT(dwork->xfer != NULL);
+               dwc_otg_start_standard_chain(xfer);
+       }
        mutex_exit(&sc->sc_lock);
 }
 
@@ -3214,17 +3219,15 @@
 {
        struct dwc_otg_softc *sc = _sc;
 
-       softint_schedule(sc->sc_timer_si);
+       workqueue_enqueue(sc->sc_wq, (struct work *)&sc->sc_timer_work, NULL);
 }
 
 Static void
-dwc_otg_timer(void *_sc)
+dwc_otg_timer(struct dwc_otg_softc *sc)
 {
-       struct dwc_otg_softc *sc = _sc;
        struct dwc_otg_xfer *xfer;
        struct dwc_otg_td *td;
 
-       mutex_enter(&sc->sc_lock);
        KASSERT(mutex_owned(&sc->sc_lock));
 
        /* increment timer value */
@@ -3237,19 +3240,15 @@
        }
 
        /* poll jobs */
-       if (mutex_tryenter(&sc->sc_intr_lock)) {
-               dwc_otg_interrupt_poll(sc);
-               mutex_spin_exit(&sc->sc_intr_lock);
-       } else {
-               printf("%s: busy!\n", __func__);
-       }
+       mutex_spin_enter(&sc->sc_intr_lock);
+       dwc_otg_interrupt_poll(sc);
+       mutex_spin_exit(&sc->sc_intr_lock);
 
        if (sc->sc_timer_active) {
                /* restart timer */
                callout_reset(&sc->sc_timer, mstohz(DWC_OTG_HOST_TIMER_RATE),
                    dwc_otg_timer_tick, sc);
        }
-       mutex_exit(&sc->sc_lock);
 }
 
 Static void
@@ -4197,11 +4196,10 @@
 
        sc->sc_rhc_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
            dwc_otg_rhc, sc);
-       sc->sc_timer_si = softint_establish(SOFTINT_NET | SOFTINT_MPSAFE,
-           dwc_otg_timer, sc);
-
-       workqueue_create(&sc->sc_wq, xname, dwc_otg_intr_worker, sc, PRI_NONE,
+
+       workqueue_create(&sc->sc_wq, xname, dwc_otg_worker, sc, PRI_NONE,
            IPL_USB, WQ_MPSAFE);
+       sc->sc_timer_work.sc = sc;
 
        usb_setup_reserve(sc->sc_dev, &sc->sc_dma_reserve, sc->sc_bus.dmatag,
            USB_MEM_RESERVE);
@@ -4432,6 +4430,7 @@
        void *last_obj;
        int ntd, n;
 
+       dxfer->work.sc = sc;
        dxfer->work.xfer = xfer;
 
        /*
diff -r 959d7aff72f3 -r 12d0914e92a9 sys/dev/usb/dwc_otgvar.h
--- a/sys/dev/usb/dwc_otgvar.h  Fri Jan 11 19:01:36 2013 +0000
+++ b/sys/dev/usb/dwc_otgvar.h  Fri Jan 11 20:35:51 2013 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: dwc_otgvar.h,v 1.2 2013/01/11 13:48:46 skrll Exp $ */
+/*     $NetBSD: dwc_otgvar.h,v 1.3 2013/01/11 20:35:51 jmcneill Exp $ */
 
 /* $FreeBSD: src/sys/dev/usb/controller/dwc_otg.h,v 1.12 2012/09/27 15:23:38 hselasky Exp $ */
 /*-
@@ -41,6 +41,7 @@
 #define        DWC_OTG_HOST_TIMER_RATE 10 /* ms */
 
 struct dwc_otg_td;
+struct dwc_otg_softc;
 
 typedef uint8_t (dwc_otg_cmd_t)(struct dwc_otg_td *td);
 
@@ -141,6 +142,7 @@
 
 struct dwc_otg_work {
        struct work wk;
+       struct dwc_otg_softc *sc;
        usbd_xfer_handle xfer;
 };
 
@@ -181,7 +183,7 @@
        //void *sc_intr_si;
 
        struct workqueue *sc_wq;
-       struct dwc_otg_work sc_wk;
+       struct dwc_otg_work sc_timer_work;
 
        int sc_noport;
 
@@ -214,7 +216,6 @@
 
        /* From FreeBSD softc */
        struct callout sc_timer;
-       void *sc_timer_si;
 
        uint32_t sc_rx_bounce_buffer[1024 / 4];
        uint32_t sc_tx_bounce_buffer[(512 * DWC_OTG_MAX_TXP) / 4];



Home | Main Index | Thread Index | Old Index