Message ID | 1436294935-21777-1-git-send-email-dvlasenk@redhat.com |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Denys Vlasenko <dvlasenk@redhat.com> Date: Tue, 7 Jul 2015 20:48:55 +0200 > As its first order of business, boomerang_interrupt() checks whether > the device really has any pending interrupts. If it does not, > it does nothing and returns, but it still returns IRQ_HANDLED. > > This is wrong: interrupt was not handled, IRQ handlers of other > devices sharing this IRQ line need to be called. > > vortex_interrupt() has it right: it returns IRQ_NONE in this case > via IRQ_RETVAL(0). > > Do the same in boomerang_interrupt(). > > Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com> Looks good, applied, thanks Denys. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/ethernet/3com/3c59x.c b/drivers/net/ethernet/3com/3c59x.c index 41095eb..c11d6fc 100644 --- a/drivers/net/ethernet/3com/3c59x.c +++ b/drivers/net/ethernet/3com/3c59x.c @@ -2382,6 +2384,7 @@ boomerang_interrupt(int irq, void *dev_id) void __iomem *ioaddr; int status; int work_done = max_interrupt_work; + int handled = 0; ioaddr = vp->ioaddr; @@ -2400,6 +2403,7 @@ boomerang_interrupt(int irq, void *dev_id) if ((status & IntLatch) == 0) goto handler_exit; /* No interrupt: shared IRQs can cause this */ + handled = 1; if (status == 0xffff) { /* h/w no longer present (hotplug)? */ if (vortex_debug > 1) @@ -2501,7 +2505,7 @@ boomerang_interrupt(int irq, void *dev_id) handler_exit: vp->handling_irq = 0; spin_unlock(&vp->lock); - return IRQ_HANDLED; + return IRQ_RETVAL(handled); } static int vortex_rx(struct net_device *dev)
As its first order of business, boomerang_interrupt() checks whether the device really has any pending interrupts. If it does not, it does nothing and returns, but it still returns IRQ_HANDLED. This is wrong: interrupt was not handled, IRQ handlers of other devices sharing this IRQ line need to be called. vortex_interrupt() has it right: it returns IRQ_NONE in this case via IRQ_RETVAL(0). Do the same in boomerang_interrupt(). Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com> CC: David S. Miller <davem@davemloft.net> CC: linux-kernel@vger.kernel.org CC: netdev@vger.kernel.org --- drivers/net/ethernet/3com/3c59x.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)