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>
This commit is contained in:
@@ -703,7 +703,8 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t)
|
|||||||
|
|
||||||
/* Wait for the transfer to complete */
|
/* Wait for the transfer to complete */
|
||||||
if (spicfg->io_type != SPI_IO_TYPE_POLL) {
|
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 {
|
} else {
|
||||||
while (dspi->rcount > 0 || dspi->wcount > 0) {
|
while (dspi->rcount > 0 || dspi->wcount > 0) {
|
||||||
errors = davinci_spi_process_events(dspi);
|
errors = davinci_spi_process_events(dspi);
|
||||||
|
Reference in New Issue
Block a user