[PATCH] mmc: atmel-mci: abort transfer on timeout error
Nicolas Ferre
nicolas.ferre at atmel.com
Tue Sep 10 03:54:39 EDT 2013
On 09/09/2013 17:29, ludovic.desroches at atmel.com :
> From: Ludovic Desroches <ludovic.desroches at atmel.com>
>
> When a software timeout occurs, the transfer is not stopped. In DMA case, it
> causes DMA channel to be stuck because the transfer is still active causing
> following transfers to be queued but not computed.
>
> Cc: <stable at vger.kernel.org> #3.9+
> Signed-off-by: Ludovic Desroches <ludovic.desroches at atmel.com>
Acked-by: Nicolas Ferre <nicolas.ferre at atmel.com>
Thanks.
> Reported-by: Alexander Morozov <etesial at gmail.com>
> ---
> drivers/mmc/host/atmel-mci.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c
> index bdb84da..e9ea2fc 100644
> --- a/drivers/mmc/host/atmel-mci.c
> +++ b/drivers/mmc/host/atmel-mci.c
> @@ -582,6 +582,13 @@ static void atmci_timeout_timer(unsigned long data)
> if (host->mrq->cmd->data) {
> host->mrq->cmd->data->error = -ETIMEDOUT;
> host->data = NULL;
> + /*
> + * With some SDIO modules, sometimes DMA transfer hangs. If
> + * stop_transfer() is not called then the DMA request is not
> + * removed, following ones are queued and never computed.
> + */
> + if (host->state == STATE_DATA_XFER)
> + host->stop_transfer(host);
> } else {
> host->mrq->cmd->error = -ETIMEDOUT;
> host->cmd = NULL;
>
--
Nicolas Ferre
More information about the linux-arm-kernel
mailing list