mirror of https://gitee.com/openkylin/linux.git
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: Serge Semin <Sergey.Semin@baikalelectronics.ru> Link: https://lore.kernel.org/r/20200920112322.24585-5-Sergey.Semin@baikalelectronics.ru Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
a874d811f0
commit
be3034d9f9
|
@ -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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue