From patchwork Wed Feb 3 19:31:24 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Hutchings X-Patchwork-Id: 44416 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 9EA4DB7D2A for ; Thu, 4 Feb 2010 06:31:33 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932269Ab0BCTb2 (ORCPT ); Wed, 3 Feb 2010 14:31:28 -0500 Received: from exchange.solarflare.com ([216.237.3.220]:28057 "EHLO exchange.solarflare.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753806Ab0BCTb1 (ORCPT ); Wed, 3 Feb 2010 14:31:27 -0500 Received: from [10.17.20.50] ([10.17.20.50]) by exchange.solarflare.com over TLS secured channel with Microsoft SMTPSVC(6.0.3790.3959); Wed, 3 Feb 2010 11:32:13 -0800 Subject: [PATCH 06/10] sfc: Survive ISR0=0 bug in the shared IRQ case From: Ben Hutchings To: David Miller Cc: netdev@vger.kernel.org, linux-net-drivers@solarflare.com In-Reply-To: <1265225294.2116.1.camel@achroite.uk.solarflarecom.com> References: <1265225294.2116.1.camel@achroite.uk.solarflarecom.com> Organization: Solarflare Communications Date: Wed, 03 Feb 2010 19:31:24 +0000 Message-Id: <1265225484.2116.6.camel@achroite.uk.solarflarecom.com> Mime-Version: 1.0 X-Mailer: Evolution 2.26.1 (2.26.1-2.fc11) X-OriginalArrivalTime: 03 Feb 2010 19:32:13.0436 (UTC) FILETIME=[960E63C0:01CAA507] X-TM-AS-Product-Ver: SMEX-8.0.0.1181-6.000.1038-17170.005 X-TM-AS-Result: No--12.642900-0.000000-31 X-TM-AS-User-Approved-Sender: Yes X-TM-AS-User-Blocked-Sender: No Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Guido Barzini Signed-off-by: Ben Hutchings --- 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 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;