On Fri, 14 Feb 2014, Dennis New wrote:
> > Hmmm. Looking again at the data you collected, it appears that those
> > quirks are not going to help. _Something_ has gone wrong, but it's
> > hard to tell what. At first I thought maybe the OHCI controller had
> > simply stopped generating interrupt requests, but that doesn't seem to
> > agree with the debugging output.
> >
> > I'll have to write a diagnostic patch to get more information.
> > Unfortunately the next few days are going to be pretty busy, so I
> > won't be able to get to it for a while.
>
> Btw, the bug "feels" like it happens more often (although not always)
> when my CPU is doing something intensive, or when I alt-tab to another
> window, or use my wifi heavily, or some such interrupt-y type event.
It's hard to know whether that is significant.
Anyway, I finally got around to writing a diagnostic patch for you to
try. This should be applied with no other patches present. It
requires CONFIG_USB_DEBUG to be enabled, and it should add a fair
amount of debugging information to the dmesg log when your problem
occurs.
Let's see what shows up.
Alan Stern
Index: usb-3.14/drivers/usb/host/ohci-hcd.c
===================================================================
--- usb-3.14.orig/drivers/usb/host/ohci-hcd.c
+++ usb-3.14/drivers/usb/host/ohci-hcd.c
@@ -76,6 +76,8 @@ static const char hcd_name [] = "ohci_hc
#include "ohci.h"
#include "pci-quirks.h"
+static int alancnt;
+
static void ohci_dump (struct ohci_hcd *ohci, int verbose);
static void ohci_stop (struct usb_hcd *hcd);
@@ -291,6 +293,8 @@ static int ohci_urb_dequeue(struct usb_h
*/
urb_priv = urb->hcpriv;
if (urb_priv) {
+ ohci_dump_ed(ohci, "dequeue", urb_priv->ed, 1);
+ alancnt = 5;
if (urb_priv->ed->state == ED_OPER)
start_ed_unlink (ohci, urb_priv->ed);
}
@@ -801,6 +805,13 @@ static irqreturn_t ohci_irq (struct usb_
return IRQ_HANDLED;
}
+ if (alancnt > 0) {
+ --alancnt;
+ ohci_dbg(ohci, "intr %08x enable %08x frame %x\n",
+ ints, ohci_readl(ohci, ®s->intrenable),
+ ohci_frame_no(ohci));
+ }
+
/* We only care about interrupts that are enabled */
ints &= ohci_readl(ohci, ®s->intrenable);
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html