Module Name: src
Committed By: skrll
Date: Fri Sep 27 21:39:34 UTC 2013
Modified Files:
src/sys/external/bsd/dwc2: dwc2.c dwc2var.h
src/sys/external/bsd/dwc2/dist: dwc2_coreintr.c dwc2_hcdintr.c
Log Message:
Use the hsotg->lock spin lock solely
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/external/bsd/dwc2/dwc2.c
cvs rdiff -u -r1.1 -r1.2 src/sys/external/bsd/dwc2/dwc2var.h
cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/dwc2/dist/dwc2_coreintr.c \
src/sys/external/bsd/dwc2/dist/dwc2_hcdintr.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/external/bsd/dwc2/dwc2.c
diff -u src/sys/external/bsd/dwc2/dwc2.c:1.2 src/sys/external/bsd/dwc2/dwc2.c:1.3
--- src/sys/external/bsd/dwc2/dwc2.c:1.2 Sat Sep 21 13:17:00 2013
+++ src/sys/external/bsd/dwc2/dwc2.c Fri Sep 27 21:39:34 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc2.c,v 1.2 2013/09/21 13:17:00 skrll Exp $ */
+/* $NetBSD: dwc2.c,v 1.3 2013/09/27 21:39:34 skrll Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.2 2013/09/21 13:17:00 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc2.c,v 1.3 2013/09/27 21:39:34 skrll Exp $");
#include "opt_usb.h"
@@ -326,11 +326,12 @@ dwc2_softintr(void *v)
{
struct usbd_bus *bus = v;
struct dwc2_softc *sc = DWC2_BUS2SC(bus);
+ struct dwc2_hsotg *hsotg = sc->sc_hsotg;
struct dwc2_xfer *dxfer;
KASSERT(sc->sc_bus.use_polling || mutex_owned(&sc->sc_lock));
- mutex_spin_enter(&sc->sc_intr_lock);
+ mutex_spin_enter(&hsotg->lock);
while ((dxfer = TAILQ_FIRST(&sc->sc_complete)) != NULL) {
/*
* dwc2_abort_xfer will remove this transfer from the
@@ -346,11 +347,11 @@ dwc2_softintr(void *v)
/* XXXNH Already done - can I assert this? */
callout_stop(&dxfer->xfer.timeout_handle);
- mutex_spin_exit(&sc->sc_intr_lock);
+ mutex_spin_exit(&hsotg->lock);
usb_transfer_complete(&dxfer->xfer);
- mutex_spin_enter(&sc->sc_intr_lock);
+ mutex_spin_enter(&hsotg->lock);
}
- mutex_spin_exit(&sc->sc_intr_lock);
+ mutex_spin_exit(&hsotg->lock);
}
Static void
@@ -370,9 +371,9 @@ dwc2_waitintr(struct dwc2_softc *sc, usb
DPRINTFN(15, "0x%08x\n", intrs);
if (intrs) {
- mutex_spin_enter(&sc->sc_intr_lock);
+ mutex_spin_enter(&hsotg->lock);
dwc2_interrupt(sc);
- mutex_spin_exit(&sc->sc_intr_lock);
+ mutex_spin_exit(&hsotg->lock);
if (xfer->status != USBD_IN_PROGRESS)
return;
}
@@ -491,10 +492,11 @@ Static void
dwc2_poll(struct usbd_bus *bus)
{
struct dwc2_softc *sc = DWC2_BUS2SC(bus);
+ struct dwc2_hsotg *hsotg = sc->sc_hsotg;
- mutex_spin_enter(&sc->sc_intr_lock);
+ mutex_spin_enter(&hsotg->lock);
dwc2_interrupt(sc);
- mutex_spin_exit(&sc->sc_intr_lock);
+ mutex_spin_exit(&hsotg->lock);
}
/*
@@ -522,7 +524,6 @@ dwc2_abort_xfer(usbd_xfer_handle xfer, u
struct dwc2_softc *sc = DWC2_XFER2SC(xfer);
struct dwc2_hsotg *hsotg = sc->sc_hsotg;
struct dwc2_xfer *d, *tmp;
- unsigned long flags;
bool wake;
int err;
@@ -553,14 +554,12 @@ dwc2_abort_xfer(usbd_xfer_handle xfer, u
/*
* Step 1: Make the stack ignore it and stop the callout.
*/
- mutex_spin_enter(&sc->sc_intr_lock);
+ mutex_spin_enter(&hsotg->lock);
xfer->hcflags |= UXFER_ABORTING;
xfer->status = status; /* make software ignore it */
callout_stop(&xfer->timeout_handle);
- spin_lock_irqsave(&hsotg->lock, flags);
-
/* XXXNH suboptimal */
TAILQ_FOREACH_SAFE(d, &sc->sc_complete, xnext, tmp) {
if (d == dxfer) {
@@ -573,8 +572,7 @@ dwc2_abort_xfer(usbd_xfer_handle xfer, u
DPRINTF("dwc2_hcd_urb_dequeue failed\n");
}
- spin_unlock(&hsotg->lock);
- mutex_spin_exit(&sc->sc_intr_lock);
+ mutex_spin_exit(&hsotg->lock);
/*
* Step 2: Execute callback.
@@ -1226,10 +1224,10 @@ dwc2_device_start(usbd_xfer_handle xfer)
if (xfertype == UE_ISOCHRONOUS ||
xfertype == UE_INTERRUPT) {
- spin_lock_irqsave(&hsotg->lock, flags);
+ mutex_spin_enter(&hsotg->lock);
if (!dwc2_hcd_is_bandwidth_allocated(hsotg, xfer))
alloc_bandwidth = 1;
- spin_unlock_irqrestore(&hsotg->lock, flags);
+ mutex_spin_exit(&hsotg->lock);
}
/*
@@ -1400,18 +1398,19 @@ Debugger();
int dwc2_intr(void *p)
{
struct dwc2_softc *sc = p;
+ struct dwc2_hsotg *hsotg;
int ret = 0;
if (sc == NULL)
return 0;
- mutex_spin_enter(&sc->sc_intr_lock);
+ hsotg = sc->sc_hsotg;
+ mutex_spin_enter(&hsotg->lock);
if (sc->sc_dying || !device_has_power(sc->sc_dev))
goto done;
if (sc->sc_bus.use_polling) {
- struct dwc2_hsotg *hsotg = sc->sc_hsotg;
uint32_t intrs;
intrs = dwc2_read_core_intr(hsotg);
@@ -1421,7 +1420,7 @@ int dwc2_intr(void *p)
}
done:
- mutex_spin_exit(&sc->sc_intr_lock);
+ mutex_spin_exit(&hsotg->lock);
return ret;
}
@@ -1514,7 +1513,6 @@ dwc2_init(struct dwc2_softc *sc)
sc->sc_hcdenabled = false;
mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTUSB);
- mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_USB);
TAILQ_INIT(&sc->sc_complete);
@@ -1719,11 +1717,9 @@ void dwc2_host_complete(struct dwc2_hsot
int
_dwc2_hcd_start(struct dwc2_hsotg *hsotg)
{
- unsigned long flags;
-
dev_dbg(hsotg->dev, "DWC OTG HCD START\n");
- spin_lock_irqsave(&hsotg->lock, flags);
+ mutex_spin_enter(&hsotg->lock);
hsotg->op_state = OTG_STATE_A_HOST;
@@ -1732,6 +1728,6 @@ _dwc2_hcd_start(struct dwc2_hsotg *hsotg
/*XXXNH*/
delay(50);
- spin_unlock_irqrestore(&hsotg->lock, flags);
+ mutex_spin_exit(&hsotg->lock);
return 0;
}
Index: src/sys/external/bsd/dwc2/dwc2var.h
diff -u src/sys/external/bsd/dwc2/dwc2var.h:1.1 src/sys/external/bsd/dwc2/dwc2var.h:1.2
--- src/sys/external/bsd/dwc2/dwc2var.h:1.1 Thu Sep 5 20:25:27 2013
+++ src/sys/external/bsd/dwc2/dwc2var.h Fri Sep 27 21:39:34 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc2var.h,v 1.1 2013/09/05 20:25:27 skrll Exp $ */
+/* $NetBSD: dwc2var.h,v 1.2 2013/09/27 21:39:34 skrll Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -87,7 +87,6 @@ typedef struct dwc2_softc {
struct dwc2_hsotg *sc_hsotg;
kmutex_t sc_lock;
- kmutex_t sc_intr_lock;
bool sc_hcdenabled;
void *sc_rhc_si;
Index: src/sys/external/bsd/dwc2/dist/dwc2_coreintr.c
diff -u src/sys/external/bsd/dwc2/dist/dwc2_coreintr.c:1.3 src/sys/external/bsd/dwc2/dist/dwc2_coreintr.c:1.4
--- src/sys/external/bsd/dwc2/dist/dwc2_coreintr.c:1.3 Wed Sep 25 06:19:22 2013
+++ src/sys/external/bsd/dwc2/dist/dwc2_coreintr.c Fri Sep 27 21:39:34 2013
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc2_coreintr.c,v 1.3 2013/09/25 06:19:22 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc2_coreintr.c,v 1.4 2013/09/27 21:39:34 skrll Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -467,7 +467,7 @@ irqreturn_t dwc2_handle_common_intr(void
goto out;
}
- spin_lock(&hsotg->lock);
+ KASSERT(mutex_owned(&hsotg->lock));
gintsts = dwc2_read_common_intr(hsotg);
if (gintsts & ~GINTSTS_PRTINT)
@@ -502,7 +502,6 @@ irqreturn_t dwc2_handle_common_intr(void
}
}
- spin_unlock(&hsotg->lock);
out:
return retval;
}
Index: src/sys/external/bsd/dwc2/dist/dwc2_hcdintr.c
diff -u src/sys/external/bsd/dwc2/dist/dwc2_hcdintr.c:1.3 src/sys/external/bsd/dwc2/dist/dwc2_hcdintr.c:1.4
--- src/sys/external/bsd/dwc2/dist/dwc2_hcdintr.c:1.3 Wed Sep 25 06:19:22 2013
+++ src/sys/external/bsd/dwc2/dist/dwc2_hcdintr.c Fri Sep 27 21:39:34 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc2_hcdintr.c,v 1.3 2013/09/25 06:19:22 skrll Exp $ */
+/* $NetBSD: dwc2_hcdintr.c,v 1.4 2013/09/27 21:39:34 skrll Exp $ */
/*
* hcd_intr.c - DesignWare HS OTG Controller host-mode interrupt handling
@@ -40,7 +40,7 @@
* This file contains the interrupt handlers for Host mode
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc2_hcdintr.c,v 1.3 2013/09/25 06:19:22 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc2_hcdintr.c,v 1.4 2013/09/27 21:39:34 skrll Exp $");
#include <sys/types.h>
#include <sys/pool.h>
@@ -2071,13 +2071,12 @@ irqreturn_t dwc2_handle_hcd_intr(struct
return retval;
}
- spin_lock(&hsotg->lock);
+ KASSERT(mutex_owned(&hsotg->lock));
/* Check if HOST Mode */
if (dwc2_is_host_mode(hsotg)) {
gintsts = dwc2_read_core_intr(hsotg);
if (!gintsts) {
- spin_unlock(&hsotg->lock);
return retval;
}
@@ -2120,7 +2119,5 @@ irqreturn_t dwc2_handle_hcd_intr(struct
}
}
- spin_unlock(&hsotg->lock);
-
return retval;
}