linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] spi: davinci: fix spurious i/o error
@ 2015-12-10 16:29 Sekhar Nori
  2015-12-10 16:29 ` [PATCH v2 1/2] " Sekhar Nori
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Sekhar Nori @ 2015-12-10 16:29 UTC (permalink / raw)
  To: linux-arm-kernel

This patch series fixes a spurious I/O error with
DaVinci SPI.

v2:
- Update to handle DMA case
- add a patch to use dev_err() for error reporting

Sekhar Nori (2):
  spi: davinci: fix spurious i/o error
  spi: davinci: use dev_err() for error reporting

 drivers/spi/spi-davinci.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

-- 
2.6.3

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH v2 1/2] spi: davinci: fix spurious i/o error
  2015-12-10 16:29 [PATCH v2 0/2] spi: davinci: fix spurious i/o error Sekhar Nori
@ 2015-12-10 16:29 ` Sekhar Nori
  2015-12-10 16:29 ` [PATCH v2 2/2] spi: davinci: use dev_err() for error reporting Sekhar Nori
  2015-12-17 13:26 ` [PATCH v2 0/2] spi: davinci: fix spurious i/o error Grygorii Strashko
  2 siblings, 0 replies; 4+ messages in thread
From: Sekhar Nori @ 2015-12-10 16:29 UTC (permalink / raw)
  To: linux-arm-kernel

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>
---
 drivers/spi/spi-davinci.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c
index 7d3af3eacf57..57d6960a6252 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);
-- 
2.6.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 2/2] spi: davinci: use dev_err() for error reporting
  2015-12-10 16:29 [PATCH v2 0/2] spi: davinci: fix spurious i/o error Sekhar Nori
  2015-12-10 16:29 ` [PATCH v2 1/2] " Sekhar Nori
@ 2015-12-10 16:29 ` Sekhar Nori
  2015-12-17 13:26 ` [PATCH v2 0/2] spi: davinci: fix spurious i/o error Grygorii Strashko
  2 siblings, 0 replies; 4+ messages in thread
From: Sekhar Nori @ 2015-12-10 16:29 UTC (permalink / raw)
  To: linux-arm-kernel

Use dev_err() for reporting errors rather than
dev_dbg().

Signed-off-by: Sekhar Nori <nsekhar@ti.com>
---
 drivers/spi/spi-davinci.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c
index 57d6960a6252..fddb7a3be322 100644
--- a/drivers/spi/spi-davinci.c
+++ b/drivers/spi/spi-davinci.c
@@ -477,33 +477,33 @@ static int davinci_spi_check_error(struct davinci_spi *dspi, int int_status)
 	struct device *sdev = dspi->bitbang.master->dev.parent;
 
 	if (int_status & SPIFLG_TIMEOUT_MASK) {
-		dev_dbg(sdev, "SPI Time-out Error\n");
+		dev_err(sdev, "SPI Time-out Error\n");
 		return -ETIMEDOUT;
 	}
 	if (int_status & SPIFLG_DESYNC_MASK) {
-		dev_dbg(sdev, "SPI Desynchronization Error\n");
+		dev_err(sdev, "SPI Desynchronization Error\n");
 		return -EIO;
 	}
 	if (int_status & SPIFLG_BITERR_MASK) {
-		dev_dbg(sdev, "SPI Bit error\n");
+		dev_err(sdev, "SPI Bit error\n");
 		return -EIO;
 	}
 
 	if (dspi->version == SPI_VERSION_2) {
 		if (int_status & SPIFLG_DLEN_ERR_MASK) {
-			dev_dbg(sdev, "SPI Data Length Error\n");
+			dev_err(sdev, "SPI Data Length Error\n");
 			return -EIO;
 		}
 		if (int_status & SPIFLG_PARERR_MASK) {
-			dev_dbg(sdev, "SPI Parity Error\n");
+			dev_err(sdev, "SPI Parity Error\n");
 			return -EIO;
 		}
 		if (int_status & SPIFLG_OVRRUN_MASK) {
-			dev_dbg(sdev, "SPI Data Overrun error\n");
+			dev_err(sdev, "SPI Data Overrun error\n");
 			return -EIO;
 		}
 		if (int_status & SPIFLG_BUF_INIT_ACTIVE_MASK) {
-			dev_dbg(sdev, "SPI Buffer Init Active\n");
+			dev_err(sdev, "SPI Buffer Init Active\n");
 			return -EBUSY;
 		}
 	}
-- 
2.6.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v2 0/2] spi: davinci: fix spurious i/o error
  2015-12-10 16:29 [PATCH v2 0/2] spi: davinci: fix spurious i/o error Sekhar Nori
  2015-12-10 16:29 ` [PATCH v2 1/2] " Sekhar Nori
  2015-12-10 16:29 ` [PATCH v2 2/2] spi: davinci: use dev_err() for error reporting Sekhar Nori
@ 2015-12-17 13:26 ` Grygorii Strashko
  2 siblings, 0 replies; 4+ messages in thread
From: Grygorii Strashko @ 2015-12-17 13:26 UTC (permalink / raw)
  To: linux-arm-kernel

On 12/10/2015 06:29 PM, Sekhar Nori wrote:
> This patch series fixes a spurious I/O error with
> DaVinci SPI.
>
> v2:
> - Update to handle DMA case
> - add a patch to use dev_err() for error reporting
>
> Sekhar Nori (2):
>    spi: davinci: fix spurious i/o error
>    spi: davinci: use dev_err() for error reporting
>
>   drivers/spi/spi-davinci.c | 17 +++++++++--------
>   1 file changed, 9 insertions(+), 8 deletions(-)
>

Looks good:
Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com>

-- 
regards,
-grygorii

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-12-17 13:26 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-12-10 16:29 [PATCH v2 0/2] spi: davinci: fix spurious i/o error Sekhar Nori
2015-12-10 16:29 ` [PATCH v2 1/2] " Sekhar Nori
2015-12-10 16:29 ` [PATCH v2 2/2] spi: davinci: use dev_err() for error reporting Sekhar Nori
2015-12-17 13:26 ` [PATCH v2 0/2] spi: davinci: fix spurious i/o error Grygorii Strashko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).