diff options
author | Guido Barzini <gbarzini@solarflare.com> | 2010-02-03 04:31:24 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-03 22:12:45 -0500 |
commit | c91f48d61c5b6fb36a6fc50de923db4db009b0dc (patch) | |
tree | 204514756abc60e91df45caf10203eba6d2d6f6b /drivers/net/sfc | |
parent | 2e803407400efe592e5294993a5b1e8251f6dd49 (diff) |
sfc: Survive ISR0=0 bug in the shared IRQ case
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/sfc')
-rw-r--r-- | drivers/net/sfc/nic.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/sfc/nic.c b/drivers/net/sfc/nic.c index db44224ed2ca..8d9696a38edf 100644 --- a/drivers/net/sfc/nic.c +++ b/drivers/net/sfc/nic.c | |||
@@ -1384,6 +1384,15 @@ static irqreturn_t efx_legacy_interrupt(int irq, void *dev_id) | |||
1384 | efx->last_irq_cpu = raw_smp_processor_id(); | 1384 | efx->last_irq_cpu = raw_smp_processor_id(); |
1385 | EFX_TRACE(efx, "IRQ %d on CPU %d status " EFX_DWORD_FMT "\n", | 1385 | EFX_TRACE(efx, "IRQ %d on CPU %d status " EFX_DWORD_FMT "\n", |
1386 | irq, raw_smp_processor_id(), EFX_DWORD_VAL(reg)); | 1386 | irq, raw_smp_processor_id(), EFX_DWORD_VAL(reg)); |
1387 | } else if (EFX_WORKAROUND_15783(efx)) { | ||
1388 | /* We can't return IRQ_HANDLED more than once on seeing ISR0=0 | ||
1389 | * because this might be a shared interrupt, but we do need to | ||
1390 | * check the channel every time and preemptively rearm it if | ||
1391 | * it's idle. */ | ||
1392 | efx_for_each_channel(channel, efx) { | ||
1393 | if (!channel->work_pending) | ||
1394 | efx_nic_eventq_read_ack(channel); | ||
1395 | } | ||
1387 | } | 1396 | } |
1388 | 1397 | ||
1389 | return result; | 1398 | return result; |