Module Name: src
Committed By: mrg
Date: Thu Dec 8 22:38:47 UTC 2011
Modified Files:
src/sys/dev/usb [jmcneill-usbmp]: ohci.c usbdi.c usbdivar.h
Log Message:
make ohci mostly work again.
To generate a diff of this commit:
cvs rdiff -u -r1.218.6.6 -r1.218.6.7 src/sys/dev/usb/ohci.c
cvs rdiff -u -r1.134.2.3 -r1.134.2.4 src/sys/dev/usb/usbdi.c
cvs rdiff -u -r1.93.8.2 -r1.93.8.3 src/sys/dev/usb/usbdivar.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/ohci.c
diff -u src/sys/dev/usb/ohci.c:1.218.6.6 src/sys/dev/usb/ohci.c:1.218.6.7
--- src/sys/dev/usb/ohci.c:1.218.6.6 Thu Dec 8 02:51:07 2011
+++ src/sys/dev/usb/ohci.c Thu Dec 8 22:38:47 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: ohci.c,v 1.218.6.6 2011/12/08 02:51:07 mrg Exp $ */
+/* $NetBSD: ohci.c,v 1.218.6.7 2011/12/08 22:38:47 mrg Exp $ */
/* $FreeBSD: src/sys/dev/usb/ohci.c,v 1.22 1999/11/17 22:33:40 n_hibma Exp $ */
/*
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.218.6.6 2011/12/08 02:51:07 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.218.6.7 2011/12/08 22:38:47 mrg Exp $");
#include "opt_usb.h"
@@ -2163,7 +2163,9 @@ ohci_open(usbd_pipe_handle pipe)
goto bad0;
opipe->sed = sed;
if (xfertype == UE_ISOCHRONOUS) {
+ mutex_enter(&sc->sc_lock);
sitd = ohci_alloc_sitd(sc);
+ mutex_exit(&sc->sc_lock);
if (sitd == NULL)
goto bad1;
opipe->tail.itd = sitd;
@@ -2174,7 +2176,9 @@ ohci_open(usbd_pipe_handle pipe)
else
fmt |= OHCI_ED_DIR_OUT;
} else {
+ mutex_enter(&sc->sc_lock);
std = ohci_alloc_std(sc);
+ mutex_exit(&sc->sc_lock);
if (std == NULL)
goto bad1;
opipe->tail.td = std;
@@ -2961,8 +2965,8 @@ ohci_device_ctrl_close(usbd_pipe_handle
DPRINTF(("ohci_device_ctrl_close: pipe=%p\n", pipe));
mutex_enter(&sc->sc_lock);
ohci_close_pipe(pipe, sc->sc_ctrl_head);
- mutex_exit(&sc->sc_lock);
ohci_free_std(sc, opipe->tail.td);
+ mutex_exit(&sc->sc_lock);
}
/************************/
@@ -3125,8 +3129,8 @@ ohci_device_bulk_close(usbd_pipe_handle
DPRINTF(("ohci_device_bulk_close: pipe=%p\n", pipe));
mutex_enter(&sc->sc_lock);
ohci_close_pipe(pipe, sc->sc_bulk_head);
- mutex_exit(&sc->sc_lock);
ohci_free_std(sc, opipe->tail.td);
+ mutex_exit(&sc->sc_lock);
}
/************************/
@@ -3175,7 +3179,9 @@ ohci_device_intr_start(usbd_xfer_handle
isread = UE_GET_DIR(endpt) == UE_DIR_IN;
data = opipe->tail.td;
+ mutex_enter(&sc->sc_lock);
tail = ohci_alloc_std(sc);
+ mutex_exit(&sc->sc_lock);
if (tail == NULL)
return (USBD_NOMEM);
tail->xfer = NULL;
@@ -3429,7 +3435,9 @@ ohci_device_isoc_enter(usbd_xfer_handle
OHCI_PAGE(buf + noffs) > bp0 + OHCI_PAGE_SIZE) { /* too many page crossings */
/* Allocate next ITD */
+ mutex_enter(&sc->sc_lock);
nsitd = ohci_alloc_sitd(sc);
+ mutex_exit(&sc->sc_lock);
if (nsitd == NULL) {
/* XXX what now? */
printf("%s: isoc TD alloc failed\n",
@@ -3460,7 +3468,9 @@ ohci_device_isoc_enter(usbd_xfer_handle
sitd->itd.itd_offset[ncur] = HTOO16(OHCI_ITD_MK_OFFS(offs));
offs = noffs;
}
+ mutex_enter(&sc->sc_lock);
nsitd = ohci_alloc_sitd(sc);
+ mutex_exit(&sc->sc_lock);
if (nsitd == NULL) {
/* XXX what now? */
printf("%s: isoc TD alloc failed\n",
@@ -3644,6 +3654,6 @@ ohci_device_isoc_close(usbd_pipe_handle
#ifdef DIAGNOSTIC
opipe->tail.itd->isdone = 1;
#endif
- mutex_exit(&sc->sc_lock);
ohci_free_sitd(sc, opipe->tail.itd);
+ mutex_exit(&sc->sc_lock);
}
Index: src/sys/dev/usb/usbdi.c
diff -u src/sys/dev/usb/usbdi.c:1.134.2.3 src/sys/dev/usb/usbdi.c:1.134.2.4
--- src/sys/dev/usb/usbdi.c:1.134.2.3 Thu Dec 8 03:10:09 2011
+++ src/sys/dev/usb/usbdi.c Thu Dec 8 22:38:47 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: usbdi.c,v 1.134.2.3 2011/12/08 03:10:09 mrg Exp $ */
+/* $NetBSD: usbdi.c,v 1.134.2.4 2011/12/08 22:38:47 mrg Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdi.c,v 1.28 1999/11/17 22:33:49 n_hibma Exp $ */
/*
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.134.2.3 2011/12/08 03:10:09 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usbdi.c,v 1.134.2.4 2011/12/08 22:38:47 mrg Exp $");
#include "opt_compat_netbsd.h"
#include "opt_usb.h"
@@ -229,6 +229,7 @@ usbd_open_pipe_intr(usbd_interface_handl
usbd_status
usbd_close_pipe(usbd_pipe_handle pipe)
{
+
#ifdef DIAGNOSTIC
if (pipe == NULL) {
printf("usbd_close_pipe: pipe==NULL\n");
@@ -762,7 +763,6 @@ usb_transfer_complete(usbd_xfer_handle x
xfer->status == USBD_TIMEOUT;
int repeat, polling;
-
DPRINTFN(5, ("usb_transfer_complete: pipe=%p xfer=%p status=%d "
"actlen=%d\n", pipe, xfer, xfer->status, xfer->actlen));
@@ -854,11 +854,10 @@ usb_transfer_complete(usbd_xfer_handle x
}
if (sync && !polling) {
- if (pipe->device->bus->lock) {
+ if (pipe->device->bus->lock)
cv_broadcast(&xfer->cv);
- } else {
+ else
wakeup(xfer);
- }
}
if (!repeat) {
Index: src/sys/dev/usb/usbdivar.h
diff -u src/sys/dev/usb/usbdivar.h:1.93.8.2 src/sys/dev/usb/usbdivar.h:1.93.8.3
--- src/sys/dev/usb/usbdivar.h:1.93.8.2 Thu Dec 8 02:51:08 2011
+++ src/sys/dev/usb/usbdivar.h Thu Dec 8 22:38:47 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: usbdivar.h,v 1.93.8.2 2011/12/08 02:51:08 mrg Exp $ */
+/* $NetBSD: usbdivar.h,v 1.93.8.3 2011/12/08 22:38:47 mrg Exp $ */
/* $FreeBSD: src/sys/dev/usb/usbdivar.h,v 1.11 1999/11/17 22:33:51 n_hibma Exp $ */
/*
@@ -144,7 +144,7 @@ struct usbd_bus {
/* Filled by usb driver */
kmutex_t *intr_lock;
kmutex_t *lock;
- struct usbd_device *root_hub;
+ struct usbd_device *root_hub;
usbd_device_handle devices[USB_MAX_DEVICES];
char needs_explore;/* a hub a signalled a change */
char use_polling;