[PATCH] mmc: mvsdio: Work around broken TX DMA

Ulf Hansson ulf.hansson at linaro.org
Wed Nov 19 02:31:13 PST 2014


On 12 November 2014 23:10, Andrew Lunn <andrew at lunn.ch> wrote:
> In order to use the mvsdio driver for sdio, it has been necessary to
> use a module parameter to disable DMA so to force PIO is used. It is
> then possible to use wireless LAN devices like mwifiex found on
> topkick and mirabox. However, accessing an MMC SD card does work with
> DMA.
>
> Investigation has shown that MMC block device accesses are always
> aligned to 64 byte boundaries, where as transfers from mwifiex are
> rarely more than word aligned. It has also been determined that card
> to host transfers work with DMA for SDIO devices, but host to card
> transfers with DMA have problems.
>
> This patch extends the current checks for buffers which are not word
> aligned or multiple of words. All host to card transfers which are not
> 64 byte aligned are now also performed via PIO. This should not affect
> the performance of SD cards, but allow sdio devices to work out of the
> box, and they are likely to be more efficient since DMA will be used
> for card to host transfers.
>
> Tested on mirabox for wifi via mwifiex
> Tested on 370 RD for file systems on an SD card.
>
> Signed-off-by: Andrew Lunn <andrew at lunn.ch>

Thanks! Applied for next.

Kind regards
Uffe

> ---
>  drivers/mmc/host/mvsdio.c | 7 ++++++-
>  1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/mvsdio.c b/drivers/mmc/host/mvsdio.c
> index 6b4c5ad3b393..4f8618f4522d 100644
> --- a/drivers/mmc/host/mvsdio.c
> +++ b/drivers/mmc/host/mvsdio.c
> @@ -111,10 +111,15 @@ static int mvsd_setup_data(struct mvsd_host *host, struct mmc_data *data)
>         mvsd_write(MVSD_BLK_COUNT, data->blocks);
>         mvsd_write(MVSD_BLK_SIZE, data->blksz);
>
> -       if (nodma || (data->blksz | data->sg->offset) & 3) {
> +       if (nodma || (data->blksz | data->sg->offset) & 3 ||
> +           ((!(data->flags & MMC_DATA_READ) && data->sg->offset & 0x3f))) {
>                 /*
>                  * We cannot do DMA on a buffer which offset or size
>                  * is not aligned on a 4-byte boundary.
> +                *
> +                * It also appears the host to card DMA can corrupt
> +                * data when the buffer is not aligned on a 64 byte
> +                * boundary.
>                  */
>                 host->pio_size = data->blocks * data->blksz;
>                 host->pio_ptr = sg_virt(data->sg);
> --
> 2.1.3
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the linux-arm-kernel mailing list