Re: uvcvideo causes ehci_hcd to halt

From: Alan Stern
Date: Tue Oct 20 2009 - 11:07:21 EST


On Tue, 20 Oct 2009, [UTF-8] Ozan Ã?aÄ?layan wrote:

> > Hi. First the backtrace:
> >
> > [ 149.510272] uvcvideo: Found UVC 1.00 device BisonCam, NB Pro (5986:0203)
> > [ 149.515017] input: BisonCam, NB Pro as
> > /devices/pci0000:00/0000:00:1d.7/usb1/1-5/1-5:1.0/input/input10
> > [ 149.515588] usbcore: registered new interface driver uvcvideo
> > [ 149.516247] USB Video Class driver (v0.1.0)
> > [ 149.658012] Pid: 1137, comm: hald-probe-vide Tainted: G C
> > 2.6.31.4-128 #2
> > [ 149.658012] Call Trace:
> > [ 149.658012] [<c0373f62>] handshake_on_error_set_halt+0x36/0x65
> > [ 149.658012] [<c0374073>] enable_periodic+0x32/0x72
> > [ 149.658012] [<c03741c9>] qh_link_periodic+0x116/0x11e
> > [ 149.658012] [<c0374665>] qh_schedule+0x120/0x12c
> > [ 149.658012] [<c03775d0>] intr_submit+0x8c/0x124
> > [ 149.658012] [<c0377d2a>] ehci_urb_enqueue+0x7a/0xa5
...
> > [ 149.658012] ehci_hcd 0000:00:1d.7: force halt; handhake f7c66024
> > 00004000 00000000 -> -110
> >
> > And the usbmon trace during "modprobe uvcvideo" can be found at:
> >
> > http://cekirdek.pardus.org.tr/~ozan/ivir/logs/usbmon.trace.bad
> >
> > I also manage to not reproduce the problem so it's kinda racy. You can
> > find good/bad dmesg/usbmon traces at:
> >
> > http://cekirdek.pardus.org.tr/~ozan/ivir/logs
> >
> ping! in case it's got lost between high traffic :)

Yes, sorry, my email client tends to hide messages with non-ASCII
characters in the From: address. It's unforunate. :-(

I can't tell exactly what's wrong, but I've got a hunch that the patch
below might help. If it doesn't, send another dmesg log but this time
with CONFIG_USB_DEBUG enabled in the kernel.

Alan Stern


Index: usb-2.6/drivers/usb/host/ehci-q.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/ehci-q.c
+++ usb-2.6/drivers/usb/host/ehci-q.c
@@ -818,6 +818,9 @@ qh_make (
dbg ("intr period %d uframes, NYET!",
urb->interval);
goto done;
+ } else if (qh->period > ehci->periodic_size) {
+ qh->period = ehci->periodic_size;
+ urb->interval = qh->period << 3;
}
} else {
int think_time;
@@ -840,6 +843,10 @@ qh_make (
usb_calc_bus_time (urb->dev->speed,
is_input, 0, max_packet (maxp)));
qh->period = urb->interval;
+ if (qh->period > ehci->periodic_size) {
+ qh->period = ehci->periodic_size;
+ urb->interval = qh->period;
+ }
}
}


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/