]> git.itanic.dy.fi Git - linux-stable/commit
spi: dw: Fix wrong FIFO level setting for long xfers
authorSerge Semin <Sergey.Semin@baikalelectronics.ru>
Fri, 13 Jan 2023 18:59:42 +0000 (21:59 +0300)
committerMark Brown <broonie@kernel.org>
Fri, 27 Jan 2023 16:38:04 +0000 (16:38 +0000)
commitc63b8fd14a7db719f8252038a790638728c4eb66
treec0f8640f0f810c32559bc0034d02b19ddfd3c799
parentb442990d244ba2ffe926c6603c42deb6fcc3b0db
spi: dw: Fix wrong FIFO level setting for long xfers

Due to using the u16 type in the min_t() macros the SPI transfer length
will be cast to word before participating in the conditional statement
implied by the macro. Thus if the transfer length is greater than 64KB the
Tx/Rx FIFO threshold level value will be determined by the leftover of the
truncated after the type-case length. In the worst case it will cause the
dramatical performance drop due to the "Tx FIFO Empty" or "Rx FIFO Full"
interrupts triggered on each xfer word sent/received to/from the bus.

The problem can be easily fixed by specifying the unsigned int type in the
min_t() macros thus preventing the possible data loss.

Fixes: ea11370fffdf ("spi: dw: get TX level without an additional variable")
Reported-by: Sergey Nazarov <Sergey.Nazarov@baikalelectronics.ru>
Signed-off-by: Serge Semin <Sergey.Semin@baikalelectronics.ru>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20230113185942.2516-1-Sergey.Semin@baikalelectronics.ru
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-dw-core.c