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, &regs->intrenable),
+                               ohci_frame_no(ohci));
+       }
+
        /* We only care about interrupts that are enabled */
        ints &= ohci_readl(ohci, &regs->intrenable);
 

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to