[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