From patchwork Mon Oct 5 21:46:48 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ron Mercer X-Patchwork-Id: 35054 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.176.167]) by ozlabs.org (Postfix) with ESMTP id 791B8B7BAD for ; Tue, 6 Oct 2009 08:58:25 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754830AbZJEVxv (ORCPT ); Mon, 5 Oct 2009 17:53:51 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1754827AbZJEVxv (ORCPT ); Mon, 5 Oct 2009 17:53:51 -0400 Received: from avexch1.qlogic.com ([198.70.193.115]:7750 "EHLO avexch1.qlogic.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754826AbZJEVxv (ORCPT ); Mon, 5 Oct 2009 17:53:51 -0400 Received: from linux-ox1b.qlogic.com ([172.17.161.157]) by avexch1.qlogic.com with Microsoft SMTPSVC(6.0.3790.1830); Mon, 5 Oct 2009 14:51:58 -0700 Received: by linux-ox1b.qlogic.com (Postfix, from userid 1000) id 443232C6AC; Mon, 5 Oct 2009 14:46:49 -0700 (PDT) From: Ron Mercer To: davem@davemloft.net Cc: netdev@vger.kernel.org, ron.mercer@qlogic.com Subject: [net-2.6 PATCH 2/3] qlge: Fix queueing of firmware handler in ISR. Date: Mon, 5 Oct 2009 14:46:48 -0700 Message-Id: <1254779209-15174-3-git-send-email-ron.mercer@qlogic.com> X-Mailer: git-send-email 1.6.0.2 In-Reply-To: <1254779209-15174-1-git-send-email-ron.mercer@qlogic.com> References: <1254779209-15174-1-git-send-email-ron.mercer@qlogic.com> X-OriginalArrivalTime: 05 Oct 2009 21:51:58.0406 (UTC) FILETIME=[0FE78660:01CA4606] Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Check that we are not already polling firmware events before we queue the firmware event worker, then disable firmware interrupts. Otherwise we can queue the same event multiple times. Signed-off-by: Ron Mercer --- drivers/net/qlge/qlge_main.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 3d0efea..c21eda0 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c @@ -2001,15 +2001,17 @@ static irqreturn_t qlge_isr(int irq, void *dev_id) /* * Check MPI processor activity. */ - if (var & STS_PI) { + if ((var & STS_PI) && + (ql_read32(qdev, INTR_MASK) & INTR_MASK_PI)) { /* * We've got an async event or mailbox completion. * Handle it and clear the source of the interrupt. */ QPRINTK(qdev, INTR, ERR, "Got MPI processor interrupt.\n"); ql_disable_completion_interrupt(qdev, intr_context->intr); - queue_delayed_work_on(smp_processor_id(), qdev->workqueue, - &qdev->mpi_work, 0); + ql_write32(qdev, INTR_MASK, (INTR_MASK_PI << 16)); + queue_delayed_work_on(smp_processor_id(), + qdev->workqueue, &qdev->mpi_work, 0); work_done++; }