From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bryan Wu Subject: [PATCH 13/20] Blackfin SPI Driver: add timeout while waiting for SPIF in dma irq handler Date: Fri, 6 Feb 2009 15:13:01 +0800 Message-ID: <1233904388-5765-14-git-send-email-cooloney@kernel.org> References: <1233904388-5765-1-git-send-email-cooloney@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: spi-devel-general-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Mike Frysinger To: dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org, akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org Return-path: In-Reply-To: <1233904388-5765-1-git-send-email-cooloney-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: spi-devel-general-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: linux-spi.vger.kernel.org From: Mike Frysinger The "while" endless loop will cause the system hang if hardware error, so we add timeout control to make the system alive. Signed-off-by: Mike Frysinger Signed-off-by: Bryan Wu --- drivers/spi/spi_bfin5xx.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/drivers/spi/spi_bfin5xx.c b/drivers/spi/spi_bfin5xx.c index 83398b3..748e98f 100644 --- a/drivers/spi/spi_bfin5xx.c +++ b/drivers/spi/spi_bfin5xx.c @@ -557,6 +557,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) struct driver_data *drv_data = dev_id; struct chip_data *chip = drv_data->cur_chip; struct spi_message *msg = drv_data->cur_msg; + unsigned long timeout; unsigned short dmastat = get_dma_curr_irqstat(drv_data->dma_channel); u16 spistat = read_STAT(drv_data); @@ -582,8 +583,17 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) cpu_relax(); } + dev_dbg(&drv_data->pdev->dev, + "in dma_irq_handler dmastat:0x%x spistat:0x%x\n", + dmastat, read_STAT(drv_data)); + + timeout = jiffies + HZ; while (!(read_STAT(drv_data) & SPIF)) - cpu_relax(); + if (!time_before(jiffies, timeout)) { + dev_warn(&drv_data->pdev->dev, "timeout waiting for SPIF"); + break; + } else + cpu_relax(); if ((dmastat & DMA_ERR) && (spistat & RBSY)) { msg->state = ERROR_STATE; -- 1.5.6.3 ------------------------------------------------------------------------------ Create and Deploy Rich Internet Apps outside the browser with Adobe(R)AIR(TM) software. With Adobe AIR, Ajax developers can use existing skills and code to build responsive, highly engaging applications that combine the power of local resources and data with the reach of the web. Download the Adobe AIR SDK and Ajax docs to start building applications today-http://p.sf.net/sfu/adobe-com From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758116AbZBFHPt (ORCPT ); Fri, 6 Feb 2009 02:15:49 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756557AbZBFHL1 (ORCPT ); Fri, 6 Feb 2009 02:11:27 -0500 Received: from nwd2mail10.analog.com ([137.71.25.55]:13578 "EHLO nwd2mail10.analog.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754221AbZBFHLU (ORCPT ); Fri, 6 Feb 2009 02:11:20 -0500 X-IronPort-AV: E=Sophos;i="4.37,390,1231131600"; d="scan'208";a="82422018" From: Bryan Wu To: dbrownell@users.sourceforge.net, akpm@linux-foundation.org Cc: spi-devel-general@lists.sourceforge.net, linux-kernel@vger.kernel.org, Mike Frysinger , Bryan Wu Subject: [PATCH 13/20] Blackfin SPI Driver: add timeout while waiting for SPIF in dma irq handler Date: Fri, 6 Feb 2009 15:13:01 +0800 Message-Id: <1233904388-5765-14-git-send-email-cooloney@kernel.org> X-Mailer: git-send-email 1.5.6.3 In-Reply-To: <1233904388-5765-1-git-send-email-cooloney@kernel.org> References: <1233904388-5765-1-git-send-email-cooloney@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Mike Frysinger The "while" endless loop will cause the system hang if hardware error, so we add timeout control to make the system alive. Signed-off-by: Mike Frysinger Signed-off-by: Bryan Wu --- drivers/spi/spi_bfin5xx.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/drivers/spi/spi_bfin5xx.c b/drivers/spi/spi_bfin5xx.c index 83398b3..748e98f 100644 --- a/drivers/spi/spi_bfin5xx.c +++ b/drivers/spi/spi_bfin5xx.c @@ -557,6 +557,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) struct driver_data *drv_data = dev_id; struct chip_data *chip = drv_data->cur_chip; struct spi_message *msg = drv_data->cur_msg; + unsigned long timeout; unsigned short dmastat = get_dma_curr_irqstat(drv_data->dma_channel); u16 spistat = read_STAT(drv_data); @@ -582,8 +583,17 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) cpu_relax(); } + dev_dbg(&drv_data->pdev->dev, + "in dma_irq_handler dmastat:0x%x spistat:0x%x\n", + dmastat, read_STAT(drv_data)); + + timeout = jiffies + HZ; while (!(read_STAT(drv_data) & SPIF)) - cpu_relax(); + if (!time_before(jiffies, timeout)) { + dev_warn(&drv_data->pdev->dev, "timeout waiting for SPIF"); + break; + } else + cpu_relax(); if ((dmastat & DMA_ERR) && (spistat & RBSY)) { msg->state = ERROR_STATE; -- 1.5.6.3