On Mon, 20 Mar 2006, Willi Mann wrote:
> Currently, I can only reproduce the bug if my mouse and my keyboard are
> plugged differently as to the last "boot". I'm not sure if that's always
> the case. However, the log shows the -71 error also when the keyboard
> worked (maybe it's from the mouse). Should I try to track down more
> exaclty in which cases it works and it which cases it doesn't work? Or
> does the logfile tell you enough?
I can't tell exactly how this happened. It's connected with the fact that
you switched the USB cable to a different port while the computer was
asleep. For some reason the UHCI controller thought the newly-connected
port was suspended while the driver thought it wasn't.
This patch should fix the problem. If it doesn't, send another kernel log
like this one.
Alan Stern
Index: usb-2.6/drivers/usb/host/uhci-hub.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/uhci-hub.c
+++ usb-2.6/drivers/usb/host/uhci-hub.c
@@ -85,18 +85,18 @@ static void uhci_finish_suspend(struct u
{
int status;
+ CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD);
if (test_bit(port, &uhci->suspended_ports)) {
- CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD);
clear_bit(port, &uhci->suspended_ports);
- clear_bit(port, &uhci->resuming_ports);
set_bit(port, &uhci->port_c_suspend);
-
- /* The controller won't actually turn off the RD bit until
- * it has had a chance to send a low-speed EOP sequence,
- * which takes 3 bit times (= 2 microseconds). We'll delay
- * slightly longer for good luck. */
- udelay(4);
}
+ clear_bit(port, &uhci->resuming_ports);
+
+ /* The controller won't actually turn off the RD bit until
+ * it has had a chance to send a low-speed EOP sequence,
+ * which takes 3 bit times (= 2 microseconds). We'll delay
+ * slightly longer for good luck. */
+ udelay(4);
}
static void uhci_check_ports(struct uhci_hcd *uhci)
@@ -322,8 +322,11 @@ static int uhci_hub_control(struct usb_h
CLR_RH_PORTSTAT(USBPORTSC_PEC);
OK(0);
case USB_PORT_FEAT_SUSPEND:
- if (test_bit(port, &uhci->suspended_ports) &&
- !test_and_set_bit(port,
+ if (!test_bit(port, &uhci->suspended_ports)) {
+
+ /* Make certain the port isn't suspended */
+ uhci_finish_suspend(uhci, port, port_addr);
+ } else if (!test_and_set_bit(port,
&uhci->resuming_ports)) {
SET_RH_PORTSTAT(USBPORTSC_RD);
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel