2015-01-24 22:11:05 +00:00
|
|
|
From 2bfc92e7ef0bc8b5acb8f5caf83984ba4ec62d6a Mon Sep 17 00:00:00 2001
|
2014-12-01 04:11:11 +00:00
|
|
|
From: Andrew Lunn <andrew@lunn.ch>
|
|
|
|
Date: Wed, 12 Nov 2014 23:10:08 +0100
|
2015-01-24 22:11:05 +00:00
|
|
|
Subject: [PATCH 5/6] mmc: mvsdio: Work around broken TX DMA
|
2014-12-01 04:11:11 +00:00
|
|
|
|
|
|
|
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@lunn.ch>
|
|
|
|
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
|
|
|
|
---
|
|
|
|
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
|
2014-12-11 01:29:15 +00:00
|
|
|
index 9f50234..ab95bb7 100644
|
2014-12-01 04:11:11 +00:00
|
|
|
--- 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);
|
|
|
|
--
|
2015-01-24 22:11:05 +00:00
|
|
|
2.2.2
|
2014-12-01 04:11:11 +00:00
|
|
|
|