From patchwork Wed Feb 12 15:55:39 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Simek X-Patchwork-Id: 319668 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 74A842C00A5 for ; Thu, 13 Feb 2014 03:07:07 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753009AbaBLP4t (ORCPT ); Wed, 12 Feb 2014 10:56:49 -0500 Received: from mail-ea0-f180.google.com ([209.85.215.180]:63267 "EHLO mail-ea0-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752995AbaBLP4q (ORCPT ); Wed, 12 Feb 2014 10:56:46 -0500 Received: by mail-ea0-f180.google.com with SMTP id o10so4544736eaj.39 for ; Wed, 12 Feb 2014 07:56:45 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:in-reply-to:references:content-type; bh=IpOSymJNt13K/1/fmDCTjRaHn7Mfn3v4vRaly5tLtcY=; b=XeA/UI7+EDBKIxUVPTW0fp19RRwW+pV2aOOVIclbvOgUHxKA84fRQBDLzWME1kwdAh yXPGepJt9rWMvCbQvVJFHtw4lmOIP3FvYLpG6H0LiahLy3YcwD2l/xbUM8wedlmVtbS6 cO1zjBWZ1uNk8nqa7ROYGHnrlMbX+TdUM7QY8yvugGbt2niSaViSbo2vcIz7ICWCw9y/ i00yS4sqQVKTpUA48HmCFffWRrHmM1yWvh8/8eFz3HJt5FO3eJD0jmurPZoTGHPk2JxX lob65l2JVSRT77q4bSXQlZlV7O+Zfqa+Ez3UOHnzIPvhyB4aE/jixBUa7Z4Fxo2kw3A5 hBtw== X-Gm-Message-State: ALoCoQmz89dcNuquycI5zbQInpnn4GTnqyKRrr43QC6xRCXS4T2Tg4JSHkOBZRhh3YDRN/HGVhKj X-Received: by 10.15.67.197 with SMTP id u45mr4890377eex.24.1392220604156; Wed, 12 Feb 2014 07:56:44 -0800 (PST) Received: from localhost (nat-63.starnet.cz. [178.255.168.63]) by mx.google.com with ESMTPSA id k6sm83177608eep.17.2014.02.12.07.56.37 for (version=TLSv1.1 cipher=RC4-SHA bits=128/128); Wed, 12 Feb 2014 07:56:42 -0800 (PST) From: Michal Simek To: netdev@vger.kernel.org Cc: Srikanth Thokala , Peter Crosthwaite , Michal Simek , Anirudha Sarangi , John Linn , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [PATCH 05/14] net: axienet: Service completion interrupts ASAP Date: Wed, 12 Feb 2014 16:55:39 +0100 Message-Id: X-Mailer: git-send-email 1.8.2.3 In-Reply-To: References: In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Peter Crosthwaite The packet completion interrupts for TX and RX should be serviced before the packets are consumed. This ensures against the degenerate case when a new completion interrupt is raised after the handler has exited but before the interrupts are cleared. In this case its possible for the ISR to clear an unhandled interrupt (leading to potential deadlock). Signed-off-by: Peter Crosthwaite Signed-off-by: Michal Simek Acked-by: Michal Simek Tested-by: Jason Wu --- drivers/net/ethernet/xilinx/xilinx_axienet_main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) -- 1.8.2.3 diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c index 2e21ab2..3c24f97 100644 --- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c @@ -809,6 +809,7 @@ static irqreturn_t axienet_tx_irq(int irq, void *_ndev) status = axienet_dma_in32(lp, XAXIDMA_TX_SR_OFFSET); if (status & (XAXIDMA_IRQ_IOC_MASK | XAXIDMA_IRQ_DELAY_MASK)) { + axienet_dma_out32(lp, XAXIDMA_TX_SR_OFFSET, status); axienet_start_xmit_done(lp->ndev); goto out; } @@ -832,9 +833,9 @@ static irqreturn_t axienet_tx_irq(int irq, void *_ndev) axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr); tasklet_schedule(&lp->dma_err_tasklet); + axienet_dma_out32(lp, XAXIDMA_TX_SR_OFFSET, status); } out: - axienet_dma_out32(lp, XAXIDMA_TX_SR_OFFSET, status); return IRQ_HANDLED; } @@ -857,6 +858,7 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev) status = axienet_dma_in32(lp, XAXIDMA_RX_SR_OFFSET); if (status & (XAXIDMA_IRQ_IOC_MASK | XAXIDMA_IRQ_DELAY_MASK)) { + axienet_dma_out32(lp, XAXIDMA_RX_SR_OFFSET, status); axienet_recv(lp->ndev); goto out; } @@ -880,9 +882,9 @@ static irqreturn_t axienet_rx_irq(int irq, void *_ndev) axienet_dma_out32(lp, XAXIDMA_RX_CR_OFFSET, cr); tasklet_schedule(&lp->dma_err_tasklet); + axienet_dma_out32(lp, XAXIDMA_RX_SR_OFFSET, status); } out: - axienet_dma_out32(lp, XAXIDMA_RX_SR_OFFSET, status); return IRQ_HANDLED; }