Commit be3034d9 authored by Serge Semin's avatar Serge Semin Committed by Mark Brown

spi: dw-dma: Check rx_buf availability in the xfer method

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: default avatarSerge Semin <Sergey.Semin@baikalelectronics.ru>
Link: https://lore.kernel.org/r/20200920112322.24585-5-Sergey.Semin@baikalelectronics.ruSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent a874d811
...@@ -369,9 +369,6 @@ static struct dma_async_tx_descriptor *dw_spi_dma_prepare_rx(struct dw_spi *dws, ...@@ -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; struct dma_async_tx_descriptor *rxdesc;
if (!xfer->rx_buf)
return NULL;
rxdesc = dmaengine_prep_slave_sg(dws->rxchan, rxdesc = dmaengine_prep_slave_sg(dws->rxchan,
xfer->rx_sg.sgl, xfer->rx_sg.sgl,
xfer->rx_sg.nents, xfer->rx_sg.nents,
...@@ -435,10 +432,12 @@ static int dw_spi_dma_transfer(struct dw_spi *dws, struct spi_transfer *xfer) ...@@ -435,10 +432,12 @@ static int dw_spi_dma_transfer(struct dw_spi *dws, struct spi_transfer *xfer)
return -EINVAL; return -EINVAL;
/* Prepare the RX dma transfer */ /* 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 */ /* rx must be started before tx due to spi instinct */
if (rxdesc) {
set_bit(RX_BUSY, &dws->dma_chan_busy); set_bit(RX_BUSY, &dws->dma_chan_busy);
dmaengine_submit(rxdesc); dmaengine_submit(rxdesc);
dma_async_issue_pending(dws->rxchan); dma_async_issue_pending(dws->rxchan);
...@@ -458,7 +457,7 @@ static int dw_spi_dma_transfer(struct dw_spi *dws, struct spi_transfer *xfer) ...@@ -458,7 +457,7 @@ static int dw_spi_dma_transfer(struct dw_spi *dws, struct spi_transfer *xfer)
return ret; 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); ret = dw_spi_dma_wait_rx_done(dws);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment