On Tue, 13 May 2014, Dr. Werner Fink wrote:

> OK ... the patch was changed as I had been told that I should do it this
> way.  In my original code I simply use
> 
>       masked_status = status & (INTR_MASK | STS_FLR | STS_RECL);
> 
>       /* Shared IRQ? */
>       if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) {
>               spin_unlock_irqrestore(&ehci->lock, flags);
>               printk("ehci_irq status: %#8.8x", status);
>               return IRQ_NONE;
>       }
> 
> and with this I can use my ethernet card more than 15 minutes.  The printk()
> line I used first after I had also used some printk() lines in the ethernet
> driver to see what was wrong with the shared IRQ.  Then I had identified the
> STS_RECL from the printk() above in my logs and or'd the STS_RECL to the
> masked status bits.  After this all problems had been gone.

What about something like this instead?

        masked_status = status & (INTR_MASK | STS_FLR);
 
        /* Shared IRQ? */
        if (!masked_status || unlikely(ehci->rh_state == EHCI_RH_HALTED)) {
+               if (status & STS_RECL) {
+                       ehci_writel(ehci, STS_RECL, &ehci->regs->status);
+                       ehci_readl(ehci, &ehci->regs->status);
+               }
                spin_unlock_irqrestore(&ehci->lock, flags);
                return IRQ_NONE;
        }

That should do about the same thing as your change, except for
returning IRQ_NONE rather than IRQ_HANDLED.

However, I don't see why writing the STS_RECL bit should fix anything.  
It is a ReadOnly bit, after all.  And returning IRQ_HANDLED wouldn't 
fix anything either; it would merely cause your system to keep on 
running while an interrupt storm occurred.

Alan Stern

--
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