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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html