On Fri, 8 Dec 2006, Ethan Romander wrote:
> I have tried both the 2.6.17 and 2.6.18 linux kernels and both give the
> message:
>
> "reset low speed USB device using ohci_hcd and address X"
>
> every few minutes in the system logs. The "X" is, of course, a numeral
> and corresponds to my USB keyboard. The device resets are accompanied
> by a delayed keyboard response and then the key pressed is repeated
> several (25, maybe) times. Inbetween device resets, the keyboard
> operates completely normally. The keyboard is the only device on the
> USB bus.
>
> I found someone else who noticed this problem with the 2.6.19 linux
> kernel and posted to the linux-kernel mailing list. The thread can be
> found here:
> http://www.gossamer-threads.com/lists/linux/kernel/709839#709839 . The
> poster does not seem to have achieved resolution of the issue.
>
> Following the suggestions at the end of the linux-kernel thread, I
> turned on CONFIG_USB_DEBUG. No additional information is emitted by
> the kernel during a reset event. In addition, I used usbmon to capture
> bus activity during a reset event. usbmon gave the following trace:
...
See below.
> Note that in this trace the keyboard is device 7. Also, this trace was
> captured by allowing the machine to sit idle, waiting for a device
> reset (i.e. no keys were pressed, nothing was touched).
>
> Hardware details are as follows: Both the linux-kernel poster and I
> have nVidia chipsets:
>
> $lspci -nn
> 00:02.0 USB Controller [0c03]: nVidia Corporation CK804 USB Controller
> [10de:005a] (rev a2)
> 00:02.1 USB Controller [0c03]: nVidia Corporation CK804 USB Controller
> [10de:005b] (rev a3)
>
> The linux-kernel poster and I have different keyboards. Mine is a
> Logitech Media Elite:
>
> $lsusb
> Bus 001 Device 007: ID 046d:c30f Logitech, Inc.
>
> I have tried a different, non-Logitech USB keyboard (one with fewer
> extra buttons) and did not experience any device resets.
>
> Both the linux-kernel poster and I are using our keyboards on a USB 1.0
> bus controlled by the ohci_hcd driver.
>
> Can anyone provide any insight? What is happening in the usbmon trace?
Here's a detailed explanation of the usbmon trace. It's mostly a lot of
uninteresting technical details that don't have much to do with your
problem.
Note that the timestamps are in the second column, with a missing decimal
point after the 4th digit. For example, the first timestamp is really at
3741.485036 seconds.
> ffff81015cabd200 3741485036 C Ii:007:01 0 8 = 00000000 00000000
The keyboard sent some data on interface 1, probably indicating that no
keys were pressed.
> ffff81015cabd200 3741485053 S Ii:007:01 -115 8 <
The computer asked the keyboard for the next event on interface 0.
> ffff81015cabda40 3838186011 C Ii:007:02 -110 0
A USB communications error occurred when the kernel polled the keyboard
for events on interface 1. Note that this occurred 97 seconds after the
previous event.
> ffff81015cabd200 3838187009 C Ii:007:01 -2 0
The kernel cancelled its request for the next event on interface 0, in
preparation for the upcoming reset.
> ffff81015cabd500 3838187021 S Co:001:00 s 23 03 0004 0001 0000 0
> ffff81015cabd500 3838250569 C Co:001:00 0 0
The kernel told the USB controller to reset port 1 and it acknowledged.
This isn't supposed to happen after only one error. The fact that it did
suggests where the problem lies: The error counter doesn't get reset
properly when there's a long time interval between errors.
> ffff81007f499740 3838306573 C Ii:001:01 0 2 = 0200
> ffff81007f499740 3838306577 S Ii:001:01 -115 2 <
The kernel asked the keyboard for its device descriptor and the keyboard
replied.
The USB controller reported an event on port 1 and the kernel asked it for
the next event.
> ffff81015cabd8c0 3838454569 S Ci:001:00 s a3 00 0000 0001 0004 4 <
> ffff81015cabd8c0 3838454573 C Ci:001:00 0 4 = 03031000
The kernel asked the USB controller for the status of port 1 and the
controller replied that there had been a reset-change.
> ffff81015cabd980 3838510567 S Co:001:00 s 23 01 0014 0001 0000 0
> ffff81015cabd980 3838510571 C Co:001:00 0 0
The kernel told the USB controller to turn off the reset-change
notification.
> ffff810033f3a9c0 3838510584 S Ci:000:00 s 80 06 0100 0000 0040 64 <
> ffff810033f3a9c0 3838513004 C Ci:000:00 0 18 = 12011001 00000008
> 6d040fc3 00230102 0001
The kernel asked the keyboard for its device descriptor and the keyboard
replied.
> ffff810033f3a9c0 3838513011 S Co:001:00 s 23 03 0004 0001 0000 0
The kernel told the USB controller to reset port 1 again.
> ffff81007f499740 3838558570 C Ii:001:01 0 2 = 0200
> ffff81007f499740 3838558574 S Ii:001:01 -115 2 <
The USB controller reported an event on port 1 and the kernel asked it for
the next event.
> ffff810033f3a9c0 3838578565 C Co:001:00 0 0
The USB controller acknowledged the command to reset port 1.
> ffff810033f3a9c0 3838782566 S Ci:001:00 s a3 00 0000 0001 0004 4 <
> ffff810033f3a9c0 3838782571 C Ci:001:00 0 4 = 03031000
The kernel asked the USB controller for the status of port 1 and the
controller replied that there had been a reset-change.
> ffff81007f499740 3838810567 C Ii:001:01 0 2 = 0200
> ffff81007f499740 3838810571 S Ii:001:01 -115 2 <
The USB controller reported an event on port 1 and the kernel asked it for
the next event.
> ffff810033f3a9c0 3838838563 S Co:001:00 s 23 01 0014 0001 0000 0
> ffff810033f3a9c0 3838838567 C Co:001:00 0 0
The kernel told the USB controller to turn off the reset-change
notification.
> ffff810033f3a9c0 3838838571 S Co:000:00 s 00 05 0007 0000 0000 0
> ffff810033f3a9c0 3838839997 C Co:000:00 0 0
The kernel told the keyboard that it should set its USB address to 7
and the keyboard acknowledged.
> ffff81015cabd2c0 3838858565 S Ci:007:00 s 80 06 0100 0000 0012 18 <
> ffff81015cabd2c0 3838860996 C Ci:007:00 0 18 = 12011001 00000008
> 6d040fc3 00230102 0001
The kernel asked the keyboard for its device descriptor and the keyboard
replied.
> ffff810033f3a9c0 3838861004 S Ci:007:00 s 80 06 0200 0000 003b 59 <
> ffff810033f3a9c0 3838865996 C Ci:007:00 0 59 = 09023b00 020100a0
> 32090400 00010301 01000921 10010001 22400007 05810308
The kernel asked the keyboard for its first configuration descriptor and
the keyboard replied.
> ffff810033f3a9c0 3838866002 S Co:007:00 s 00 09 0001 0000 0000 0
> ffff810033f3a9c0 3838868995 C Co:007:00 0 0
The kernel told the keyboard to install configuration 1 and the keyboard
acknowledged.
> ffff810033f3a9c0 3838869001 S Co:007:00 s 01 0b 0000 0000 0000 0
> ffff810033f3a9c0 3838871994 C Co:007:00 0 0
The kernel told the keyboard to install altsetting 0 for interface 0 and
the keyboard acknowledged.
> ffff810033f3a9c0 3838872100 S Co:007:00 s 01 0b 0000 0001 0000 0
> ffff810033f3a9c0 3838874996 C Co:007:00 0 0
The kernel told the keyboard to install altsetting 0 for interface 1 and
the keyboard acknowledged.
> ffff810033f3a9c0 3838875084 S Co:007:00 s 21 0a 0000 0001 0000 0
> ffff810033f3a9c0 3838877995 C Co:007:00 0 0
The kernel told the keyboard to set its "idle delay" for interface 1 to 0
(i.e., the keyboard shouldn't send reports if no key presses or releases
have happened) and the keyboard acknowledged.
> ffff81015cabda40 3838878003 S Ii:007:02 -115 3 <
The kernel asked the keyboard for the next event on interface 1.
> ffff810033f3a9c0 3838878009 S Co:007:00 s 21 0a 0000 0000 0000 0
> ffff810033f3a9c0 3838880995 C Co:007:00 0 0
The kernel told the keyboard to set its "idle delay" for interface 0 to 0
and the keyboard acknoweledged.
> ffff81015cabd200 3838881001 S Ii:007:01 -115 8 <
The kernel asked the keyboard for the next event on interface 0.
> ffff81015cabd200 3843130907 C Ii:007:01 0 8 = 01000000 00000000
The keyboard reported an event (probably some sort of keypress) on
interface 0.
> ffff81015cabd200 3843130921 S Ii:007:01 -115 8 <
The kernel asked the keyboard for the next event on interface 0.
> I'm just about at the end of my technical ability troubleshooting
> this, but I'm happy to provide additional information to more capable
> individuals.
Try out the patch below (it should apply to 2.6.18 or 2.6.19) and see if
it helps.
Alan Stern
Index: usb-2.6/drivers/usb/input/hid-core.c
===================================================================
--- usb-2.6.orig/drivers/usb/input/hid-core.c
+++ usb-2.6/drivers/usb/input/hid-core.c
@@ -1021,6 +1021,11 @@ static void hid_io_error(struct hid_devi
if (usb_get_intfdata(hid->intf) == NULL)
goto done;
+ /* If it has been at least 2 seconds since the last error, we'll
+ * assume this a brand new error and reset the delay counter. */
+ if (time_after(jiffies, hid->stop_retry + 2*HZ))
+ hid->retry_delay = 0;
+
/* When an error occurs, retry at increasing intervals */
if (hid->retry_delay == 0) {
hid->retry_delay = 13; /* Then 26, 52, 104, 104, ... */
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-users