提交 aaaf939c 编写于 作者: M Mike Frysinger 提交者: Linus Torvalds

Blackfin SPI Driver: add timeout while waiting for SPIF in dma irq handler

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: NMike Frysinger <vapier.adi@gmail.com>
Signed-off-by: NBryan Wu <cooloney@kernel.org>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 11d6f599
...@@ -557,6 +557,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) ...@@ -557,6 +557,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
struct driver_data *drv_data = dev_id; struct driver_data *drv_data = dev_id;
struct chip_data *chip = drv_data->cur_chip; struct chip_data *chip = drv_data->cur_chip;
struct spi_message *msg = drv_data->cur_msg; struct spi_message *msg = drv_data->cur_msg;
unsigned long timeout;
unsigned short dmastat = get_dma_curr_irqstat(drv_data->dma_channel); unsigned short dmastat = get_dma_curr_irqstat(drv_data->dma_channel);
u16 spistat = read_STAT(drv_data); u16 spistat = read_STAT(drv_data);
...@@ -582,8 +583,17 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) ...@@ -582,8 +583,17 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id)
cpu_relax(); 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)) 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)) { if ((dmastat & DMA_ERR) && (spistat & RBSY)) {
msg->state = ERROR_STATE; msg->state = ERROR_STATE;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册