spi_async failures used to be retried unconditionally which can lead to I/O hangs.
Signed-off-by: Russ Gorby <russ.go...@intel.com> --- drivers/serial/ifx6x60.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/serial/ifx6x60.c b/drivers/serial/ifx6x60.c index abffc86..79b108b 100644 --- a/drivers/serial/ifx6x60.c +++ b/drivers/serial/ifx6x60.c @@ -1143,11 +1143,15 @@ static void ifx_spi_io(unsigned long data) retval = spi_async(ifx_dev->spi_dev, &ifx_dev->spi_msg); if (retval) { - dev_dbg(&ifx_dev->spi_dev->dev, - "spi_async failed (%d)", retval); - clear_bit(IFX_SPI_STATE_IO_IN_PROGRESS, - &ifx_dev->flags); - tasklet_schedule(&ifx_dev->io_work_tasklet); + if (retval != -EBUSY) + ifx_spi_complete((void *)ifx_dev); + else { + dev_dbg(&ifx_dev->spi_dev->dev, + "spi_async failed (%d)", retval); + clear_bit(IFX_SPI_STATE_IO_IN_PROGRESS, + &ifx_dev->flags); + tasklet_schedule(&ifx_dev->io_work_tasklet); + } return; } } else { -- 1.6.0.6 _______________________________________________ MeeGo-kernel mailing list MeeGo-kernel@lists.meego.com http://lists.meego.com/listinfo/meego-kernel