Current DMA implementation had a bug where the DMA transfer would
exit the loop in dspi_transfer_one_message after the completion of
a single transfer. This results in a multi message transfer submitted
with SPI_IOC_MESSAGE to terminate incorrectly without an error.

Signed-off-by: Sanchayan Maity <maitysancha...@gmail.com>
---
 drivers/spi/spi-fsl-dspi.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
index bc64700..b1ee1f5 100644
--- a/drivers/spi/spi-fsl-dspi.c
+++ b/drivers/spi/spi-fsl-dspi.c
@@ -714,7 +714,7 @@ static int dspi_transfer_one_message(struct spi_master 
*master,
                                SPI_RSER_TFFFE | SPI_RSER_TFFFD |
                                SPI_RSER_RFDFE | SPI_RSER_RFDFD);
                        status = dspi_dma_xfer(dspi);
-                       goto out;
+                       break;
                default:
                        dev_err(&dspi->pdev->dev, "unsupported trans_mode %u\n",
                                trans_mode);
@@ -722,9 +722,13 @@ static int dspi_transfer_one_message(struct spi_master 
*master,
                        goto out;
                }
 
-               if (wait_event_interruptible(dspi->waitq, dspi->waitflags))
-                       dev_err(&dspi->pdev->dev, "wait transfer complete 
fail!\n");
-               dspi->waitflags = 0;
+               if (trans_mode != DSPI_DMA_MODE) {
+                       if (wait_event_interruptible(dspi->waitq,
+                                               dspi->waitflags))
+                               dev_err(&dspi->pdev->dev,
+                                       "wait transfer complete fail!\n");
+                       dspi->waitflags = 0;
+               }
 
                if (transfer->delay_usecs)
                        udelay(transfer->delay_usecs);
-- 
2.10.2

Reply via email to