From patchwork Fri Jan 18 10:06:09 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 213533 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 45DC72C007B for ; Fri, 18 Jan 2013 21:07:01 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751496Ab3ARKGm (ORCPT ); Fri, 18 Jan 2013 05:06:42 -0500 Received: from Chamillionaire.breakpoint.cc ([80.244.247.6]:43931 "EHLO Chamillionaire.breakpoint.cc" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751177Ab3ARKGk (ORCPT ); Fri, 18 Jan 2013 05:06:40 -0500 Received: from bigeasy by Chamillionaire.breakpoint.cc with local (Exim 4.72) (envelope-from ) id 1Tw8qG-0001K7-Uo; Fri, 18 Jan 2013 11:06:33 +0100 From: Sebastian Andrzej Siewior To: netdev@vger.kernel.org Cc: "David S. Miller" , Thomas Gleixner , Rakesh Ranjan , Bruno Bittner , Holger Dengler , Jan Altenberg , Sebastian Andrzej Siewior Subject: [PATCH 1/4] net: ethernet: davinci cpdma: Enable interrupt while waiting for teardown complete Date: Fri, 18 Jan 2013 11:06:09 +0100 Message-Id: <1358503572-5057-1-git-send-email-sebastian@breakpoint.cc> X-Mailer: git-send-email 1.7.2.5 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Thomas Gleixner A teardown might take some time. If the other CPU is going to queue something it will spin and wait. Dropping the lock will allow to continue processing. It will notice that the channel is in state teardown and will not do anything. Cc: Rakesh Ranjan Cc: Bruno Bittner Signed-off-by: Thomas Gleixner [dengler: patch description] Signed-off-by: Holger Dengler [jan: forward ported] Signed-off-by: Jan Altenberg Signed-off-by: Sebastian Andrzej Siewior --- drivers/net/ethernet/ti/davinci_cpdma.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c index 4995673..dd5f2db 100644 --- a/drivers/net/ethernet/ti/davinci_cpdma.c +++ b/drivers/net/ethernet/ti/davinci_cpdma.c @@ -836,6 +836,8 @@ int cpdma_chan_stop(struct cpdma_chan *chan) /* trigger teardown */ dma_reg_write(ctlr, chan->td, chan_linear(chan)); + spin_unlock_irqrestore(&chan->lock, flags); + /* wait for teardown complete */ timeout = jiffies + HZ/10; /* 100 msec */ while (time_before(jiffies, timeout)) { @@ -845,6 +847,8 @@ int cpdma_chan_stop(struct cpdma_chan *chan) cpu_relax(); } WARN_ON(!time_before(jiffies, timeout)); + + spin_lock_irqsave(&chan->lock, flags); chan_write(chan, cp, CPDMA_TEARDOWN_VALUE); /* handle completed packets */