From patchwork Mon Feb 18 08:16:32 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yuval Mintz X-Patchwork-Id: 221169 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 4FD422C0092 for ; Mon, 18 Feb 2013 20:21:57 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757424Ab3BRJVY (ORCPT ); Mon, 18 Feb 2013 04:21:24 -0500 Received: from mms2.broadcom.com ([216.31.210.18]:4081 "EHLO mms2.broadcom.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757407Ab3BRJVU (ORCPT ); Mon, 18 Feb 2013 04:21:20 -0500 Received: from [10.9.208.57] by mms2.broadcom.com with ESMTP (Broadcom SMTP Relay (Email Firewall v6.5)); Mon, 18 Feb 2013 01:17:52 -0800 X-Server-Uuid: 4500596E-606A-40F9-852D-14843D8201B2 Received: from IRVEXCHSMTP1.corp.ad.broadcom.com (10.9.207.51) by IRVEXCHCAS08.corp.ad.broadcom.com (10.9.208.57) with Microsoft SMTP Server (TLS) id 14.1.438.0; Mon, 18 Feb 2013 01:21:15 -0800 Received: from mail-irva-13.broadcom.com (10.10.10.20) by IRVEXCHSMTP1.corp.ad.broadcom.com (10.9.207.51) with Microsoft SMTP Server id 14.1.438.0; Mon, 18 Feb 2013 01:21:15 -0800 Received: from lb-tlvb-yuvalmin.il.broadcom.com ( lb-tlvb-yuvalmin.il.broadcom.com [10.185.6.94]) by mail-irva-13.broadcom.com (Postfix) with ESMTP id 1752840FE5; Mon, 18 Feb 2013 01:21:13 -0800 (PST) From: "Yuval Mintz" To: davem@davemloft.net, netdev@vger.kernel.org cc: eilong@broadcom.com, ariele@broadcom.com, "Yuval Mintz" Subject: [PATCH net-next 3/9] bnx2x: handle spurious interrupts Date: Mon, 18 Feb 2013 10:16:32 +0200 Message-ID: <1361175398-12888-4-git-send-email-yuvalmin@broadcom.com> X-Mailer: git-send-email 1.8.1.227.g44fe835 In-Reply-To: <1361175398-12888-1-git-send-email-yuvalmin@broadcom.com> References: <1361175398-12888-1-git-send-email-yuvalmin@broadcom.com> MIME-Version: 1.0 X-WSS-ID: 7D3F2E4A3QG4214352-01-01 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org In scenarios in which a previous driver was removed without proper cleanup (e.g., kdump), it is possible for the chip to generate an interrupt without any apparent reason. This would cause improper behaviour at best, possibly resulting in NULL pointer dereferences as interrupts might be sent to an ISR accessing uninitialized structures and memories. This causes the driver to ignore any interrupt which arrives in an inappropriate time, i.e., when the driver has not yet properly configured its interrupt routines. Signed-off-by: Yuval Mintz Signed-off-by: Ariel Elior Signed-off-by: Eilon Greenstein --- drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 1 + drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 11 +++++++++++ drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 3 +++ drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c | 3 ++- 4 files changed, 17 insertions(+), 1 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index e4605a9..3e26eb5 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h @@ -1379,6 +1379,7 @@ struct bnx2x { #define USING_SINGLE_MSIX_FLAG (1 << 20) #define BC_SUPPORTS_DCBX_MSG_NON_PMF (1 << 21) #define IS_VF_FLAG (1 << 22) +#define INTERRUPTS_ENABLED_FLAG (1 << 23) #define BP_NOMCP(bp) ((bp)->flags & NO_MCP_FLAG) diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index ecac04a3..525c2b5 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c @@ -1037,6 +1037,17 @@ static irqreturn_t bnx2x_msix_fp_int(int irq, void *fp_cookie) DP(NETIF_MSG_INTR, "got an MSI-X interrupt on IDX:SB [fp %d fw_sd %d igusb %d]\n", fp->index, fp->fw_sb_id, fp->igu_sb_id); + + /* It's possible for a spurious interrupt to be received, if the + * driver was loaded above a previous configured function (e.g., kdump). + * We simply ignore such interrupts. + */ + if (unlikely(!(bp->flags & INTERRUPTS_ENABLED_FLAG))) { + WARN_ONCE(1, "%s: Got Spurious interrupts", + bp->dev ? bp->dev->name : "?"); + return IRQ_HANDLED; + } + bnx2x_ack_sb(bp, fp->igu_sb_id, USTORM_ID, 0, IGU_INT_DISABLE, 0); #ifdef BNX2X_STOP_ON_ERROR diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index c4daee1..1776b8b 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c @@ -868,6 +868,7 @@ static void bnx2x_int_disable(struct bnx2x *bp) bnx2x_hc_int_disable(bp); else bnx2x_igu_int_disable(bp); + bp->flags &= ~INTERRUPTS_ENABLED_FLAG; } void bnx2x_panic_dump(struct bnx2x *bp, bool disable_int) @@ -1607,6 +1608,8 @@ static void bnx2x_igu_int_enable(struct bnx2x *bp) void bnx2x_int_enable(struct bnx2x *bp) { + bp->flags |= INTERRUPTS_ENABLED_FLAG; + if (bp->common.int_block == INT_BLOCK_HC) bnx2x_hc_int_enable(bp); else diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c index 3624612..df9209e 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c @@ -268,7 +268,8 @@ int bnx2x_vfpf_acquire(struct bnx2x *bp, u8 tx_count, u8 rx_count) bp->mf_mode = 0; bp->common.flash_size = 0; bp->flags |= - NO_WOL_FLAG | NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG | NO_FCOE_FLAG; + NO_WOL_FLAG | NO_ISCSI_OOO_FLAG | NO_ISCSI_FLAG | NO_FCOE_FLAG | + INTERRUPTS_ENABLED_FLAG; bp->igu_sb_cnt = 1; bp->igu_base_sb = bp->acquire_resp.resc.hw_sbs[0].hw_sb_id; strlcpy(bp->fw_ver, bp->acquire_resp.pfdev_info.fw_ver,