Module Name: src Committed By: pooka Date: Tue Feb 9 18:27:17 UTC 2010
Modified Files: src/sys/rump/dev/wip/librumpusbhc: rumpusbhc.c Log Message: * UR_CBI_ADSC ctrl req fails with EIO sometime for unknown reasons. Let it instead of panicking. Doesn't seem to affect functionality. * process pipe queue only until it is empty To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.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/rump/dev/wip/librumpusbhc/rumpusbhc.c diff -u src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c:1.14 src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c:1.15 --- src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c:1.14 Wed Feb 3 21:18:38 2010 +++ src/sys/rump/dev/wip/librumpusbhc/rumpusbhc.c Tue Feb 9 18:27:17 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: rumpusbhc.c,v 1.14 2010/02/03 21:18:38 pooka Exp $ */ +/* $NetBSD: rumpusbhc.c,v 1.15 2010/02/09 18:27:17 pooka Exp $ */ /* * Copyright (c) 2009 Antti Kantee. All Rights Reserved. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rumpusbhc.c,v 1.14 2010/02/03 21:18:38 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rumpusbhc.c,v 1.15 2010/02/09 18:27:17 pooka Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -365,7 +365,7 @@ int len, totlen; int value; int err = 0; - int ru_error; + int ru_error, mightfail = 0; len = totlen = UGETW(req->wLength); if (len) @@ -462,9 +462,20 @@ } /* + * This request might fail unknown reasons. "EIO" doesn't + * give much help, and debugging the host ugen would be + * necessary. However, since it doesn't seem to really + * affect anything, just let it fail for now. + */ + case C(0x00, UT_WRITE_CLASS_INTERFACE): + mightfail = 1; + /*FALLTHROUGH*/ + + /* * XXX: don't wildcard these yet. I want to better figure * out what to trap here. This is kinda silly, though ... */ + case C(0x01, UT_WRITE_VENDOR_DEVICE): case C(0x06, UT_WRITE_VENDOR_DEVICE): case C(0x07, UT_READ_VENDOR_DEVICE): @@ -475,7 +486,6 @@ case C(UR_GET_STATUS, UT_READ_CLASS_DEVICE): case C(UR_GET_DESCRIPTOR, UT_READ_CLASS_DEVICE): case C(UR_GET_DESCRIPTOR, UT_READ_INTERFACE): - case C(0x00, UT_WRITE_CLASS_INTERFACE): case C(0xff, UT_WRITE_CLASS_INTERFACE): case C(0x20, UT_WRITE_CLASS_INTERFACE): case C(0x22, UT_WRITE_CLASS_INTERFACE): @@ -491,7 +501,10 @@ ucr.ucr_data = buf; if (rumpuser_ioctl(sc->sc_ugenfd[UGEN_EPT_CTRL], USB_DO_REQUEST, &ucr, &ru_error) == -1) { - panic("request failed"); + if (!mightfail) + panic("request failed: %d", ru_error); + else + err = ru_error; } } break; @@ -715,17 +728,10 @@ doxfer_kth(void *arg) { usbd_xfer_handle xfer = arg; - usb_endpoint_descriptor_t *ed = xfer->pipe->endpoint->edesc; - bool repeat; - - if ((ed->bmAttributes & UE_XFERTYPE) == UE_INTERRUPT) - repeat = true; - else - repeat = false; do { rumpusb_device_bulk_start(SIMPLEQ_FIRST(&xfer->pipe->queue)); - } while (repeat); + } while (!SIMPLEQ_EMPTY(&xfer->pipe->queue)); kthread_exit(0); }