summaryrefslogtreecommitdiffstats
path: root/drivers/spi
diff options
context:
space:
mode:
authorVladimir Oltean <vladimir.oltean@nxp.com>2020-03-18 02:15:55 +0200
committerMark Brown <broonie@kernel.org>2020-03-18 22:44:56 +0000
commitc6c1e30a789b08de2e075cbd9705e81af3d2c7cc (patch)
tree20056e13fe9ede82ab9734c6bf98fedc09dbad27 /drivers/spi
parenta957499bd437720d082d92657b7eb5cf5a62e893 (diff)
downloadlinux-c6c1e30a789b08de2e075cbd9705e81af3d2c7cc.tar.gz
linux-c6c1e30a789b08de2e075cbd9705e81af3d2c7cc.tar.bz2
linux-c6c1e30a789b08de2e075cbd9705e81af3d2c7cc.zip
spi: spi-fsl-dspi: Avoid reading more data than written in EOQ mode
If dspi->words_in_flight is populated with the hardware FIFO size, then in dspi_fifo_read it will attempt to read more data at the end of a buffer that is not a multiple of 16 bytes in length. It will probably time out attempting to do so. So limit the num_fifo_entries variable to the actual number of FIFO entries that is going to be used. Fixes: d59c90a2400f ("spi: spi-fsl-dspi: Convert TCFQ users to XSPI FIFO mode") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Tested-by: Michael Walle <michael@walle.cc> Link: https://lore.kernel.org/r/20200318001603.9650-5-olteanv@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/spi-fsl-dspi.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
index 8f2b73cc6ed7..51224b772680 100644
--- a/drivers/spi/spi-fsl-dspi.c
+++ b/drivers/spi/spi-fsl-dspi.c
@@ -739,13 +739,16 @@ static void dspi_eoq_fifo_write(struct fsl_dspi *dspi)
int num_fifo_entries = dspi->devtype_data->fifo_size;
u16 xfer_cmd = dspi->tx_cmd;
+ if (num_fifo_entries * dspi->oper_word_size > dspi->len)
+ num_fifo_entries = dspi->len / dspi->oper_word_size;
+
dspi->words_in_flight = num_fifo_entries;
/* Fill TX FIFO with as many transfers as possible */
- while (dspi->len && num_fifo_entries--) {
+ while (num_fifo_entries--) {
dspi->tx_cmd = xfer_cmd;
/* Request EOQF for last transfer in FIFO */
- if (dspi->len == dspi->oper_word_size || num_fifo_entries == 0)
+ if (num_fifo_entries == 0)
dspi->tx_cmd |= SPI_PUSHR_CMD_EOQ;
/* Write combined TX FIFO and CMD FIFO entry */
dspi_pushr_write(dspi);