Module Name:    src
Committed By:   jmcneill
Date:           Fri Jan 11 20:35:51 UTC 2013

Modified Files:
        src/sys/dev/usb: dwc_otg.c dwc_otgvar.h

Log Message:
move otg timer to workq


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/dev/usb/dwc_otg.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/usb/dwc_otgvar.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/dwc_otg.c
diff -u src/sys/dev/usb/dwc_otg.c:1.10 src/sys/dev/usb/dwc_otg.c:1.11
--- src/sys/dev/usb/dwc_otg.c:1.10	Fri Jan 11 18:52:38 2013
+++ src/sys/dev/usb/dwc_otg.c	Fri Jan 11 20:35:51 2013
@@ -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_resume_irq(struct d
 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 @@ dwc_otg_do_poll(struct usbd_bus *bus)
 }
 
 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 @@ dwc_otg_timer_tick(void *_sc)
 {
 	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 @@ dwc_otg_timer(void *_sc)
 	}
 
 	/* 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 @@ dwc_otg_init(struct dwc_otg_softc *sc)
 
 	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 @@ dwc_otg_xfer_setup(usbd_xfer_handle xfer
 	void *last_obj;
 	int ntd, n;
 
+	dxfer->work.sc = sc;
 	dxfer->work.xfer = xfer;
 
 	/*

Index: src/sys/dev/usb/dwc_otgvar.h
diff -u src/sys/dev/usb/dwc_otgvar.h:1.2 src/sys/dev/usb/dwc_otgvar.h:1.3
--- src/sys/dev/usb/dwc_otgvar.h:1.2	Fri Jan 11 13:48:46 2013
+++ src/sys/dev/usb/dwc_otgvar.h	Fri Jan 11 20:35:51 2013
@@ -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 @@ typedef struct dwc_otg_soft_td {
 
 struct dwc_otg_work {
 	struct work wk;
+	struct dwc_otg_softc *sc;
 	usbd_xfer_handle xfer;
 };
 
@@ -181,7 +183,7 @@ typedef struct dwc_otg_softc {
 	//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 @@ typedef struct dwc_otg_softc {
 
 	/* 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];

Reply via email to