• Trent Piepho's avatar
    spi: imx: stop buffer overflow in RX FIFO flush · c842749e
    Trent Piepho authored
    Commit 71abd290 ("spi: imx: Add support for SPI Slave mode") added
    an RX FIFO flush before start of a transfer.  In slave mode, the master
    may have sent more data than expected and this data will still be in the
    RX FIFO at the start of the next transfer, and so needs to be flushed.
    
    However, the code to do the flush was accidentally saving this data into
    the previous transfer's RX buffer, clobbering the contents of whatever
    followed that buffer.
    
    Change it to empty the FIFO and throw away the data.  Every one of the
    RX functions for the different eCSPI versions and modes reads the RX
    FIFO data using the same readl() call, so just use that, rather than
    using the spi_imx->rx function pointer and making sure all the different
    rx functions have a working "throw away" mode.
    
    There is another issue, which affects master mode when switching from
    DMA to PIO.  There can be extra data in the RX FIFO which triggers this
    flush code, causing memory corruption in the same manner.  I don't know
    why this data is unexpectedly in the FIFO.  It's likely there is a
    different bug or erratum responsible for that.  But regardless of that,
    I think this is proper fix the for bug at hand here.
    
    Fixes: 71abd290 ("spi: imx: Add support for SPI Slave mode")
    Cc: Jiada Wang <jiada_wang@mentor.com>
    Cc: Fabio Estevam <festevam@gmail.com>
    Cc: Stefan Agner <stefan@agner.ch>
    Cc: Shawn Guo <shawnguo@kernel.org>
    Signed-off-by: default avatarTrent Piepho <tpiepho@impinj.com>
    Signed-off-by: default avatarMark Brown <broonie@kernel.org>
    c842749e
spi-imx.c 45.4 KB