• Ned Forrester's avatar
    pxa2xx_spi: bugfix full duplex dma data corruption · 393df744
    Ned Forrester authored
    Fixes a data corruption bug in pxa2xx_spi.c when operating in full duplex
    mode with DMA and using buffers that overlap.
    
    SPI transmit and receive buffers are allowed to be the same or to overlap.
     However, this driver fails if such overlap is attempted in DMA mode
    because it maps the rx and tx buffers in the wrong order.  By mapping
    DMA_FROM_DEVICE (read) before DMA_TO_DEVICE (write), it invalidates the
    cache before flushing it, thus discarding data which should have been
    transmitted.
    
    The patch corrects the order of mapping.  This bug exists in all versions
    of pxa2xx_spi.c; similar bugs are in the drivers for two other SPI
    controllers (au1500, imx).
    
    A version of this patch has been tested on kernel 2.6.20 using
    verification of loopback data with: random transfer length, random
    bits-per-word, random positive offsets (both larger and smaller than
    transfer length) between the start of the rx and tx buffers, and varying
    clock rates.
    Signed-off-by: default avatarNed Forrester <nforrester@whoi.edu>
    Cc: Vernon Sauder <vernoninhand@gmail.com>
    Cc: J. Scott Merritt <merrij3@rpi.edu>
    Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
    Cc: <stable@kernel.org>		[2.6.27.x]
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    393df744
pxa2xx_spi.c 44.4 KB