David Brownell wrote:
Thanks for the ping; your problem took a while to get to the top of the stack!
That's OK, thanks for looking at it now.

Looks to me like what's happening is that the handling of these every-microframe
high speed transfers (about 4KB per frame in this case), which is new since 
about
January, introduced a minor confusion with respect to some earlier code, hence
the oops from trying to treat a periodic qh like an async one.

See if this patch helps; I think it should.

A partial success... It doesn't oops or panic, but it got into an infinite loop as soon as I turn off the UA-1000, repeatedly outputting these four lines:

ehci_hcd 0000:00:03.3: devpath 5 ep3in 3strikes
ALSA sound/usb/usbmidi.c:176: urb status -71
usb 3-5: unlink qh0-00ff/c91dc100 start 0 [17/0 us]
usb 3-5: link qh0-00ff/c91dc100 start 0 [17/0 us]

with occasional bursts of:
ehci_hcd 0000:00:03.3: devpath 5 ep3in 3strikes
ehci_hcd 0000:00:03.3: devpath 5 ep3in 3strikes
ehci_hcd 0000:00:03.3: devpath 5 ep3in 3strikes
usb 3-5: link qh0-00ff/c91dc100 start 0 [17/0 us]
usb 3-5: link qh0-00ff/c91dc100 start 0 [17/0 us]
usb 3-5: link qh0-00ff/c91dc100 start 0 [17/0 us]
usb 3-5: link qh0-00ff/c91dc100 start 0 [17/0 us]
usb 3-5: link qh0-00ff/c91dc100 start 0 [17/0 us]
usb 3-5: link qh0-00ff/c91dc100 start 0 [17/0 us]
usb 3-5: link qh0-00ff/c91dc100 start 0 [17/0 us]

The mouse & keyboard were unresponsive at this point: I had to power the machine off.

Out of curiosity, I tried the following change, to treat -71 (-EPROTO) as a terminal error in sound/usb/usbmidi.c, and I can now turn the UA-1000 off and on to my heart's content.

--- sound/usb/usbmidi.c 2005-08-01 11:25:06.000000000 +0100
+++ sound/usb/usbmidi.orig.c    2005-07-29 09:52:23.000000000 +0100
@@ -171,8 +171,7 @@ static int snd_usbmidi_urb_error(int sta
                return status; /* killed */
        if (status == -EILSEQ ||
            status == -ECONNRESET ||
-           status == -ETIMEDOUT ||
-           status == -EPROTO)
+           status == -ETIMEDOUT)
                return -ENODEV; /* device removed/shutdown */
        snd_printk(KERN_ERR "urb status %d\n", status);
        return 0; /* continue */


I have no idea whether this is the right thing to do: I expect it's almost certainly not...



Colin Fletcher.

--



-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to