linux/drivers/mmc/host
Paul Walmsley 75b53aee2f mmc: omap: fix broken PIO mode
After commit 26b88520b8 ("mmc:
omap_hsmmc: remove private DMA API implementation"), the Nokia N800
here stopped booting:

[    2.086181] Waiting for root device /dev/mmcblk0p1...
[    2.324066] Unhandled fault: imprecise external abort (0x406) at 0x00000000
[    2.331451] Internal error: : 406 [#1] ARM
[    2.335784] Modules linked in:
[    2.339050] CPU: 0    Not tainted  (3.6.0-rc3 #60)
[    2.344146] PC is at default_idle+0x28/0x30
[    2.348602] LR is at trace_hardirqs_on_caller+0x15c/0x1b0

...

This turned out to be due to memory corruption caused by long-broken
PIO code in drivers/mmc/host/omap.c.  (Previously, this driver had
been using DMA; but the above commit caused the MMC driver to fall
back to PIO mode with an unmodified Kconfig.)

The PIO code, added with the rest of the driver in commit
730c9b7e66 ("[MMC] Add OMAP MMC host
driver"), confused bytes with 16-bit words.  This bug caused memory
located after the PIO transfer buffer to be corrupted with transfers
larger than 32 bytes.  The driver also did not increment the buffer
pointer after the transfer occurred.  This bug resulted in data
corruption during any transfer larger than 64 bytes.

Signed-off-by: Paul Walmsley <paul@pwsan.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Tested-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
2012-09-04 13:58:11 -04:00
..
at91_mci.c
at91_mci.h
atmel-mci-regs.h
atmel-mci.c mmc: atmel-mci: not busy flag has also to be used for read operations 2012-09-04 13:58:07 -04:00
au1xmmc.c
bfin_sdh.c mmc: bfin_sdh: fix dma_desc_array build error 2012-09-04 13:58:04 -04:00
cb710-mmc.c
cb710-mmc.h
davinci_mmc.c
dw_mmc-pci.c
dw_mmc-pltfm.c
dw_mmc.c mmc: dw_mmc: Disable low power mode if SDIO interrupts are used 2012-09-04 13:58:10 -04:00
dw_mmc.h
jz4740_mmc.c
Kconfig
Makefile
mmc_spi.c
mmci.c
mmci.h
msm_sdcc.c
msm_sdcc.h
mvsdio.c ARM: Orion: fix driver probe error handling with respect to clk 2012-07-25 17:06:21 +02:00
mvsdio.h
mxcmmc.c
mxs-mmc.c mmc: mxs-mmc: fix deadlock caused by recursion loop 2012-09-04 13:58:06 -04:00
of_mmc_spi.c
omap_hsmmc.c Merge branch 'dmaengine' of git://git.linaro.org/people/rmk/linux-arm 2012-08-01 16:41:07 -07:00
omap.c mmc: omap: fix broken PIO mode 2012-09-04 13:58:11 -04:00
pxamci.c
pxamci.h
s3cmci.c mmc: s3cmci: Convert s3cmci driver to gpiolib API 2012-07-22 15:25:44 -04:00
s3cmci.h
sdhci-cns3xxx.c
sdhci-dove.c mmc: sdhci-dove: Prepare for common clock framework 2012-07-22 16:42:48 -04:00
sdhci-esdhc-imx.c mmc: esdhc: Fix DMA_MASK to not break mx25 DMA access 2012-07-22 16:42:30 -04:00
sdhci-esdhc.h mmc: sdhci-esdhc: break out early if clock is 0 2012-09-04 13:58:06 -04:00
sdhci-of-esdhc.c
sdhci-of-hlwd.c
sdhci-pci-data.c
sdhci-pci.c mmc: sdhci-pci: CaFe has broken card detection 2012-07-22 15:25:46 -04:00
sdhci-pltfm.c
sdhci-pltfm.h
sdhci-pxav2.c
sdhci-pxav3.c
sdhci-s3c.c
sdhci-spear.c
sdhci-tegra.c
sdhci.c mmc: sd: Fix sd current limit setting 2012-07-22 15:25:52 -04:00
sdhci.h
sdricoh_cs.c
sh_mmcif.c Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma 2012-07-24 17:12:54 -07:00
sh_mobile_sdhi.c Merge branch 'next' of git://git.infradead.org/users/vkoul/slave-dma 2012-07-24 17:12:54 -07:00
tifm_sd.c
tmio_mmc_dma.c
tmio_mmc_pio.c
tmio_mmc.c
tmio_mmc.h
ushc.c
via-sdmmc.c
vub300.c
wbsd.c
wbsd.h