]> git.karo-electronics.de Git - linux-beck.git/commitdiff
spi: davinci: fix spurious i/o error
authorSekhar Nori <nsekhar@ti.com>
Thu, 10 Dec 2015 16:29:04 +0000 (21:59 +0530)
committerMark Brown <broonie@kernel.org>
Sat, 12 Dec 2015 22:57:44 +0000 (22:57 +0000)
davinci_spi_bufs() uses wait_for_completion_interruptible()
without bothering to handle -ERESTARTSYS. Due to this,
sometime, it returns prematurely when a signal is received.
Since the return value is never checked, userspace eventually
receives a spurious -EIO.

To fix this, use un-interruptible wait_for_completion_timeout().

Signed-off-by: Sekhar Nori <nsekhar@ti.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-davinci.c

index 7d3af3eacf57d7c7e82722fadf2f1fdece1a8ed2..57d6960a62523d11fa0ceb7731da107c477c8cea 100644 (file)
@@ -703,7 +703,8 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
 
        /* Wait for the transfer to complete */
        if (spicfg->io_type != SPI_IO_TYPE_POLL) {
-               wait_for_completion_interruptible(&(dspi->done));
+               if (wait_for_completion_timeout(&dspi->done, HZ) == 0)
+                       errors = SPIFLG_TIMEOUT_MASK;
        } else {
                while (dspi->rcount > 0 || dspi->wcount > 0) {
                        errors = davinci_spi_process_events(dspi);