Re: [PATCH] mmc: moxart: report DMA completion timeout
Ulf Hansson <[email protected]> Mon, 6 Jul 2026 17:46:44 +0200
| Newsgroups | org.kernel.vger.linux-mmc,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <CAPx+jO85jWW4nUOSP41FbPcd43hzd_k6x0_fNE8=mK0ZXuiX9Q@mail.gmail.com> |
On Tue, Jun 23, 2026 at 8:12 AM Pengpeng Hou <[email protected]> wrote: > > moxart_transfer_dma() waits for the DMA completion but ignores > wait_for_completion_interruptible_timeout(). It then unconditionally > reports the full transfer length in data->bytes_xfered. > > Terminate the DMA channel and set data->error when the wait is > interrupted or times out. Only report host->data_len as transferred > after the completion is observed. > > Signed-off-by: Pengpeng Hou <[email protected]> Applied for next, thanks! Kind regards Uffe > --- > drivers/mmc/host/moxart-mmc.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/drivers/mmc/host/moxart-mmc.c b/drivers/mmc/host/moxart-mmc.c > index 3dd8f232052f..4a4d8b19b18c 100644 > --- a/drivers/mmc/host/moxart-mmc.c > +++ b/drivers/mmc/host/moxart-mmc.c > @@ -264,6 +264,7 @@ static void moxart_transfer_dma(struct mmc_data *data, struct moxart_host *host) > u32 len, dir_slave; > struct dma_async_tx_descriptor *desc = NULL; > struct dma_chan *dma_chan; > + long timeout; > > if (host->data_len == data->bytes_xfered) > return; > @@ -296,11 +297,17 @@ static void moxart_transfer_dma(struct mmc_data *data, struct moxart_host *host) > dma_async_issue_pending(dma_chan); > } > > - wait_for_completion_interruptible_timeout(&host->dma_complete, > - host->timeout); > + timeout = wait_for_completion_interruptible_timeout(&host->dma_complete, > + host->timeout); > + if (timeout <= 0) { > + dmaengine_terminate_sync(dma_chan); > + data->error = timeout ?: -ETIMEDOUT; > + goto unmap; > + } > > data->bytes_xfered = host->data_len; > > +unmap: > dma_unmap_sg(dma_chan->device->dev, > data->sg, data->sg_len, > mmc_get_dma_dir(data)); > -- > 2.50.1 (Apple Git-155) >