• Serge Semin's avatar
    spi: dw-dma: Fix Tx DMA channel working too fast · affe93dd
    Serge Semin authored
    It turns out having a Rx DMA channel serviced with higher priority than
    a Tx DMA channel is not enough to provide a well balanced DMA-based SPI
    transfer interface. There might still be moments when the Tx DMA channel
    is occasionally handled faster than the Rx DMA channel. That in its turn
    will eventually cause the SPI Rx FIFO overflow if SPI bus speed is high
    enough to fill the SPI Rx FIFO in before it's cleared by the Rx DMA
    channel. That's why having the DMA-based SPI Tx interface too optimized
    is the errors prone, so the commit 0b2b6651 ("spi: dw: Use DMA max
    burst to set the request thresholds") though being perfectly normal from
    the standard functionality point of view implicitly introduced the problem
    described above. In order to fix that the Tx DMA activity is intentionally
    slowed down by limiting the SPI Tx FIFO depth with a value twice bigger
    than the Tx burst length calculated earlier by the
    dw_spi_dma_maxburst_init() method.
    
    Fixes: 0b2b6651 ("spi: dw: Use DMA max burst to set the request thresholds")
    Signed-off-by: default avatarSerge Semin <Sergey.Semin@baikalelectronics.ru>
    Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
    Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
    Cc: Alexey Malahov <Alexey.Malahov@baikalelectronics.ru>
    Cc: Feng Tang <feng.tang@intel.com>
    Link: https://lore.kernel.org/r/20200721203951.2159-1-Sergey.Semin@baikalelectronics.ruSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    affe93dd
spi-dw-dma.c 11.7 KB