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

Reply via email to