On Fri, 20 Oct 2006, Alan Stern wrote:
> I'm just building 2.6.19-rc2, so we'll see what happens with the OHCI
> controllers on my machine.
Okay, I tried it. And I found a bug: When RD and RHSC are both set in the
interrupt status register, the driver tries to do _two_ root-hub resumes!
That accounts for the mysterious "resume root" lines in the log.
The patch below fixes that problem. I didn't see the other, more
important problem, though. All the port resumes all completed as expected
and on time. Still, you never know -- perhaps the patch will fix both
problems.
Alan Stern
Index: 2.6.19-rc2/drivers/usb/host/ohci-hcd.c
===================================================================
--- 2.6.19-rc2.orig/drivers/usb/host/ohci-hcd.c
+++ 2.6.19-rc2/drivers/usb/host/ohci-hcd.c
@@ -715,13 +715,6 @@ static irqreturn_t ohci_irq (struct usb_
return IRQ_NOTMINE;
}
- if (ints & OHCI_INTR_RHSC) {
- ohci_vdbg (ohci, "rhsc\n");
- ohci->next_statechange = jiffies + STATECHANGE_DELAY;
- ohci_writel (ohci, OHCI_INTR_RHSC, ®s->intrstatus);
- usb_hcd_poll_rh_status(hcd);
- }
-
if (ints & OHCI_INTR_UE) {
disable (ohci);
ohci_err (ohci, "OHCI Unrecoverable Error, disabled\n");
@@ -731,14 +724,26 @@ static irqreturn_t ohci_irq (struct usb_
ohci_usb_reset (ohci);
}
- if (ints & OHCI_INTR_RD) {
- ohci_vdbg (ohci, "resume detect\n");
- ohci_writel (ohci, OHCI_INTR_RD, ®s->intrstatus);
+ if (ints & OHCI_INTR_RHSC) {
+ ohci_vdbg(ohci, "rhsc\n");
+ ohci->next_statechange = jiffies + STATECHANGE_DELAY;
+ ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC,
+ ®s->intrstatus);
+ usb_hcd_poll_rh_status(hcd);
+ }
+
+ /* For connect and disconnect events, we expect the controller
+ * to turn on RHSC along with RD. But for remote wakeup events
+ * this might not happen.
+ */
+ else if (ints & OHCI_INTR_RD) {
+ ohci_vdbg(ohci, "resume detect\n");
+ ohci_writel(ohci, OHCI_INTR_RD, ®s->intrstatus);
hcd->poll_rh = 1;
if (ohci->autostop) {
- spin_lock (&ohci->lock);
- ohci_rh_resume (ohci);
- spin_unlock (&ohci->lock);
+ spin_lock(&ohci->lock);
+ ohci_rh_resume(ohci);
+ spin_unlock(&ohci->lock);
} else
usb_hcd_resume_root_hub(hcd);
}
Index: 2619/drivers/usb/host/ohci-hub.c
===================================================================
--- 2619.orig/drivers/usb/host/ohci-hub.c
+++ 2619/drivers/usb/host/ohci-hub.c
@@ -169,7 +169,8 @@ __acquires(ohci->lock)
break;
case OHCI_USB_RESUME:
/* HCFS changes sometime after INTR_RD */
- ohci_info (ohci, "wakeup\n");
+ ohci_info (ohci, "%s\n",
+ autostopped ? "auto-wakeup" : "wakeup");
break;
case OHCI_USB_OPER:
/* this can happen after resuming a swsusp snapshot */
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel