Patchwork [06/10] sfc: Survive ISR0=0 bug in the shared IRQ case

login
register
mail settings
Submitter Ben Hutchings
Date Feb. 3, 2010, 7:31 p.m.
Message ID <1265225484.2116.6.camel@achroite.uk.solarflarecom.com>
Download mbox | patch
Permalink /patch/44416/
State Accepted
Delegated to: David Miller
Headers show

Comments

Ben Hutchings - Feb. 3, 2010, 7:31 p.m.
From: Guido Barzini <gbarzini@solarflare.com>

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
---
 drivers/net/sfc/nic.c |    9 +++++++++
 1 files changed, 9 insertions(+), 0 deletions(-)

Patch

diff --git a/drivers/net/sfc/nic.c b/drivers/net/sfc/nic.c
index db44224..8d9696a 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)
 		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;