diff options
author | Sekhar Nori <nsekhar@ti.com> | 2015-12-10 16:29:04 (GMT) |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2015-12-12 22:57:44 (GMT) |
commit | 7f3ac71ac3b05aaa2c55c266448f973188275a8c (patch) | |
tree | 549f08faf5ff10d4e237009c37c3ae6027495aea | |
parent | 8005c49d9aea74d382f474ce11afbbc7d7130bec (diff) | |
download | linux-7f3ac71ac3b05aaa2c55c266448f973188275a8c.tar.xz |
spi: davinci: fix spurious i/o error
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>
-rw-r--r-- | drivers/spi/spi-davinci.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c index 7d3af3e..57d6960 100644 --- a/drivers/spi/spi-davinci.c +++ b/drivers/spi/spi-davinci.c @@ -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); |