| From 66b512eda74d59b17eac04c4da1b38d82059e6c9 Mon Sep 17 00:00:00 2001 |
| From: Ludovic Desroches <ludovic.desroches@atmel.com> |
| Date: Wed, 20 Nov 2013 16:01:11 +0100 |
| Subject: mmc: atmel-mci: fix timeout errors in SDIO mode when using DMA |
| |
| From: Ludovic Desroches <ludovic.desroches@atmel.com> |
| |
| commit 66b512eda74d59b17eac04c4da1b38d82059e6c9 upstream. |
| |
| With some SDIO devices, timeout errors can happen when reading data. |
| To solve this issue, the DMA transfer has to be activated before sending |
| the command to the device. This order is incorrect in PDC mode. So we |
| have to take care if we are using DMA or PDC to know when to send the |
| MMC command. |
| |
| Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com> |
| Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> |
| Signed-off-by: Chris Ball <cjb@laptop.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mmc/host/atmel-mci.c | 13 ++++++++++++- |
| 1 file changed, 12 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/mmc/host/atmel-mci.c |
| +++ b/drivers/mmc/host/atmel-mci.c |
| @@ -1192,11 +1192,22 @@ static void atmci_start_request(struct a |
| iflags |= ATMCI_CMDRDY; |
| cmd = mrq->cmd; |
| cmdflags = atmci_prepare_command(slot->mmc, cmd); |
| - atmci_send_command(host, cmd, cmdflags); |
| + |
| + /* |
| + * DMA transfer should be started before sending the command to avoid |
| + * unexpected errors especially for read operations in SDIO mode. |
| + * Unfortunately, in PDC mode, command has to be sent before starting |
| + * the transfer. |
| + */ |
| + if (host->submit_data != &atmci_submit_data_dma) |
| + atmci_send_command(host, cmd, cmdflags); |
| |
| if (data) |
| host->submit_data(host, data); |
| |
| + if (host->submit_data == &atmci_submit_data_dma) |
| + atmci_send_command(host, cmd, cmdflags); |
| + |
| if (mrq->stop) { |
| host->stop_cmdr = atmci_prepare_command(slot->mmc, mrq->stop); |
| host->stop_cmdr |= ATMCI_CMDR_STOP_XFER; |