On Tue, 30 Mar 2010, Justin Piszcz wrote:
Also, I'd like to see the contents of your /proc/interrupts. It looks
like the OHCI controller shares an IRQ line with some other device.
Ok, I can try this as well.
Well, I'm making progress. Below is a new debugging patch to try in
place of the first one. This time the dmesg log alone will be
sufficient, no need for a usbmon trace. And the output should be a lot
smaller, since the new patch doesn't print something every time an
interrupt occurs, but rather only when you unplug the mouse.
In fact, you might try unplugging the mouse while it still works and
then plugging it back in. The difference between the debugging
messages while everything is working and the same thing after the mouse
fails should be informative.
This appears to occur only AFTER the mouse locks up, I do ctrl-alt-f1
(By the way, these tests are meant to find out why your Xorg and khubd
processes hang when the mouse fails, not for finding the original cause
behind the mouse failure. That can be addressed later.)
Some of those reports indicate that a BIOS update could fix theThe BIOS is outdated, I will create a Windows Boot CD and flash the BIOS
problem. Have you checked your BIOS version?
--
Alan Stern
Index: usb-2.6/drivers/usb/host/ohci-hcd.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/ohci-hcd.c
+++ usb-2.6/drivers/usb/host/ohci-hcd.c
@@ -292,6 +292,8 @@ static int ohci_urb_dequeue(struct usb_h
if (urb_priv) {
if (urb_priv->ed->state == ED_OPER)
start_ed_unlink (ohci, urb_priv->ed);
+ ohci_info(ohci, "start unlink urb %p, ed %p tick %u\n",
+ urb, urb_priv->ed, urb_priv->ed->tick);
}
} else {
/*
@@ -324,6 +326,9 @@ ohci_endpoint_disable (struct usb_hcd *h
if (!ed)
return;
+ ohci_info(ohci, "disable ed %p (#%02x) state %d%s\n",
+ ed, ep->desc.bEndpointAddress, ed->state,
+ list_empty(&ed->td_list) ? "" : " (has tds)");
rescan:
spin_lock_irqsave (&ohci->lock, flags);
Index: usb-2.6/drivers/usb/host/ohci-q.c
===================================================================
--- usb-2.6.orig/drivers/usb/host/ohci-q.c
+++ usb-2.6/drivers/usb/host/ohci-q.c
@@ -912,6 +912,9 @@ rescan_all:
* frame counter wraps and EDs with partially retired TDs
*/
if (likely (HC_IS_RUNNING(ohci_to_hcd(ohci)->state))) {
+ ohci_info(ohci, "finish_unlinks: tick %u, ed %p %u, %d\n",
+ tick, ed, ed->tick,
+ tick_before(tick, ed->tick));
if (tick_before (tick, ed->tick)) {
skip_ed:
last = &ed->ed_next;
@@ -928,6 +931,8 @@ skip_ed:
TD_MASK;
/* INTR_WDH may need to clean up first */
+ ohci_info(ohci, "dma %llx head %x\n",
+ (unsigned long long) td->td_dma, head);
if (td->td_dma != head) {
if (ed == ohci->ed_to_check)
ohci->ed_to_check = NULL;
@@ -990,6 +995,8 @@ rescan_this:
/* HC may have partly processed this TD */
td_done (ohci, urb, td);
urb_priv->td_cnt++;
+ ohci_info(ohci, "td_cnt %d length %d\n",
+ urb_priv->td_cnt, urb_priv->length);
/* if URB is done, clean up */
if (urb_priv->td_cnt == urb_priv->length) {