• Paul Walmsley's avatar
    mmc: omap: fix broken PIO mode · 75b53aee
    Paul Walmsley authored
    After commit 26b88520 ("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
    730c9b7e ("[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: default avatarPaul Walmsley <paul@pwsan.com>
    Reviewed-by: default avatarFelipe Balbi <balbi@ti.com>
    Tested-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarChris Ball <cjb@laptop.org>
    75b53aee
omap.c 37.9 KB