Hi,

Sorry for not getting back to you earlier -- many things kept me distracted:

On Tue, Dec 12, 2006 at 04:08:39PM -0500, Alan Stern wrote:
> On Tue, 12 Dec 2006, Dominik Brodowski wrote:
> 
> > > On the other hand, your latest log suggests that the STS_FLR bit gets set 
> > > during the ehci_bus_suspend() routine, not the resume routine.  So it 
> > > will 
> > > be best to check at the beginning and end of both routines.
> > 
> > Unfortunately, it doesn't get set anywhere then, but outside:
> > 
> > case A:
> > http://userweb.kernel.org/~brodo/dmesg-autosuspend-3-sr.txt
> > 
> > [   26.380849] ehci_bus_resume: intro 37
> > [   26.380852] ehci_hcd 0000:00:1d.7: resume root hub
> > [   26.400866] ehci_bus_resume: exit 37 (mask was 37)
> > [   26.411590] hub 1-0:1.0: state 7 ports 6 chg 0000 evt 0000
> > [   26.411679] usb 1-1: usb auto-resume
> > [   26.437439] ehci_hcd 0000:00:1d.7: GetStatus port 1 status 001005 POWER 
> > sig=se0 PE CONNECT
> > [   26.448389] usb 1-1: finish resume
> > [   26.448681] ehci_hcd 0000:00:1d.7: IRQ status 8009, intr_enable 37
> > ...
> > [   26.453427] ehci_hcd 0000:00:1d.7: IRQ status 8028, intr_enable 37
> > ...
> > [   28.900407] ACPI: CPU0 (power states: C1[C1] C2[C2] C3[C3])
> > [   28.900419] ACPI: Processor [CPU0] (supports 8 throttling states)
> > [   17.451000] Time: acpi_pm clocksource has been installed.
> > [   17.545000] acpi_processor-0740 [00] processor_preregister_: Error while
> > parsing _PSD domain information. Assuming no coordination
> > [   17.546000] ehci_hcd 0000:00:1d.7: IRQ status 2008, intr_enable 3f
> > 
> > All of a sudden, it seems...
> > 
> > 
> > Case B:
> > http://userweb.kernel.org/~brodo/dmesg-autosuspend-2-sr.txt
> > 
> > [   15.582559] ehci_hcd 0000:00:1d.7: IRQ status 4, intr_enable 37
> > [   16.327713] libata version 2.00 loaded.
> > [   17.575888] hub 1-0:1.0: hub_suspend
> > [   17.575896] ehci_bus_suspend: intro 37
> > [   17.576013] ehci_bus_suspend: exit 37 (mask was 37)
> > [   17.576620] usb usb1: usb auto-suspend
> > ...
> > [   22.312792] ehci_hcd 0000:00:1d.7: IRQ status 8, intr_enable 3f
> > 
> > 
> > For Case B, it seems to happen while the hub is suspended; while for
> > Case A, it seems to happen while the hub is resumed. It just gets more and
> > more strange. Broken hardware?[*]
> 
> I can't find anything in the driver that would set the bit.  Certainly not 
> while the controller is suspended and nothing is happening.  It's possible 
> that some other driver is setting it by mistake, but that seems pretty 
> unlikely.  However I haven't tried running any new kernels recently; I've 
> been waiting for 2.6.20-rc1 to appear.  Perhaps the same thing will show 
> up on my machine...
> 
> But if some other driver is responsible, why wouldn't it happen without 
> the autosuspend patch?  More likely the suspend triggers the hardware into 
> doing something really funky.
> 
> You could try another test: Let the IRQ be disabled, and then rmmod 
> ehci-hcd and modprobe it back.  Perhaps then rmmod usb-storage to force 
> another suspend, perhaps not.  Anyway, see what happens to intr_enable.  
> You can always force interrupts to occur by turning the USB HD off or on.

Unfortunately, the IRQ line is and stays disabled, and I don't know how I
could re-enable it.

> It would be possible to patch the ehci_irq() routine to have it turn off
> the STS_FLR bit whenever necessary.  But first I would like to know what
> causes it to turn on at all.  Maybe it really is a hardware problem.

I did that (see below), but then the IRQ subsystem continued to be "dead"
-- it seemed to me that the USB hub is in a completely broken state when
this codepath is entered...

To further complicate matters, I now also see IRQ10 being disabled whenever
I switch from the console (i810) to a terminal -- but that bug was
introduced _later_ than the autosuspend bug. And, 2.6.19 works perfectly
fine with regard to both issues...

        Dominik



diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 025d333..d10cf42 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -569,6 +569,7 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
        struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
        u32                     status;
        int                     bh;
+       u32                     intr_enable;
 
        spin_lock (&ehci->lock);
 
@@ -580,6 +581,17 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
                goto dead;
        }
 
+       intr_enable = readl(&ehci->regs->intr_enable);
+
+       if (unlikely(intr_enable != INTR_MASK)) {
+               ehci_info (ehci, "STS_FLR - clearing. status: 0x%x intr 0x%x 
(0x%x\n", status, intr_enable, INTR_MASK);
+               writel(INTR_MASK, &ehci->regs->intr_enable);
+               if (!(status & INTR_MASK)) {
+                       spin_unlock(&ehci->lock);
+                       return IRQ_HANDLED;
+               }
+       }
+
        status &= INTR_MASK;
        if (!status) {                  /* irq sharing? */
                spin_unlock(&ehci->lock);

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to