diff mbox series

[v2,04/11] spi: dw-dma: Check rx_buf availability in the xfer method

Message ID 20200920112322.24585-5-Sergey.Semin@baikalelectronics.ru (mailing list archive)
State Accepted
Commit be3034d9f9f3ea28588932d10bba6d06b71489a7
Headers show
Series spi: dw-dma: Add max SG entries burst capability support | expand

Commit Message

Serge Semin Sept. 20, 2020, 11:23 a.m. UTC
Checking rx_buf for being NULL and returning NULL from the Rx-channel
preparation method doesn't let us to distinguish that situation from
errors happening during the Rx SG-list preparation. So it's better to make
sure that the rx_buf not-NULL and full-duplex communication is requested
prior calling the Rx preparation method.

Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
---
 drivers/spi/spi-dw-dma.c | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)
diff mbox series

Patch

diff --git a/drivers/spi/spi-dw-dma.c b/drivers/spi/spi-dw-dma.c
index da17897b8acb..d2a67dee1a66 100644
--- a/drivers/spi/spi-dw-dma.c
+++ b/drivers/spi/spi-dw-dma.c
@@ -369,9 +369,6 @@  static struct dma_async_tx_descriptor *dw_spi_dma_prepare_rx(struct dw_spi *dws,
 {
 	struct dma_async_tx_descriptor *rxdesc;
 
-	if (!xfer->rx_buf)
-		return NULL;
-
 	rxdesc = dmaengine_prep_slave_sg(dws->rxchan,
 				xfer->rx_sg.sgl,
 				xfer->rx_sg.nents,
@@ -435,10 +432,12 @@  static int dw_spi_dma_transfer(struct dw_spi *dws, struct spi_transfer *xfer)
 		return -EINVAL;
 
 	/* Prepare the RX dma transfer */
-	rxdesc = dw_spi_dma_prepare_rx(dws, xfer);
+	if (xfer->rx_buf) {
+		rxdesc = dw_spi_dma_prepare_rx(dws, xfer);
+		if (!rxdesc)
+			return -EINVAL;
 
-	/* rx must be started before tx due to spi instinct */
-	if (rxdesc) {
+		/* rx must be started before tx due to spi instinct */
 		set_bit(RX_BUSY, &dws->dma_chan_busy);
 		dmaengine_submit(rxdesc);
 		dma_async_issue_pending(dws->rxchan);
@@ -458,7 +457,7 @@  static int dw_spi_dma_transfer(struct dw_spi *dws, struct spi_transfer *xfer)
 			return ret;
 	}
 
-	if (rxdesc && dws->master->cur_msg->status == -EINPROGRESS)
+	if (xfer->rx_buf && dws->master->cur_msg->status == -EINPROGRESS)
 		ret = dw_spi_dma_wait_rx_done(dws);
 
 	return ret;