sfc: Survive ISR0=0 bug in the shared IRQ case
authorGuido Barzini <gbarzini@solarflare.com>
Wed, 3 Feb 2010 09:31:24 +0000 (09:31 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 4 Feb 2010 03:12:45 +0000 (19:12 -0800)
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sfc/nic.c

index db44224ed2cad53789f7d5410db1a7988f34bca1..8d9696a38edf4162cc8b8bce1a2b91f4b9c0e28a 100644 (file)
@@ -1384,6 +1384,15 @@ static irqreturn_t efx_legacy_interrupt(int irq, void *dev_id)
                efx->last_irq_cpu = raw_smp_processor_id();
                EFX_TRACE(efx, "IRQ %d on CPU %d status " EFX_DWORD_FMT "\n",
                          irq, raw_smp_processor_id(), EFX_DWORD_VAL(reg));
+       } else if (EFX_WORKAROUND_15783(efx)) {
+               /* We can't return IRQ_HANDLED more than once on seeing ISR0=0
+                * because this might be a shared interrupt, but we do need to
+                * check the channel every time and preemptively rearm it if
+                * it's idle. */
+               efx_for_each_channel(channel, efx) {
+                       if (!channel->work_pending)
+                               efx_nic_eventq_read_ack(channel);
+               }
        }
 
        return result;