Patch "spi: dw: Fix wrong FIFO level setting for long xfers" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    spi: dw: Fix wrong FIFO level setting for long xfers

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     spi-dw-fix-wrong-fifo-level-setting-for-long-xfers.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 0912aec78122854cc1bd19cb8c09fc5c81ac9faf
Author: Serge Semin <Sergey.Semin@xxxxxxxxxxxxxxxxxxxx>
Date:   Fri Jan 13 21:59:42 2023 +0300

    spi: dw: Fix wrong FIFO level setting for long xfers
    
    [ Upstream commit c63b8fd14a7db719f8252038a790638728c4eb66 ]
    
    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@xxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Serge Semin <Sergey.Semin@xxxxxxxxxxxxxxxxxxxx>
    Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230113185942.2516-1-Sergey.Semin@xxxxxxxxxxxxxxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/spi/spi-dw-core.c b/drivers/spi/spi-dw-core.c
index 99edddf9958b9..c3bfb6c84cab2 100644
--- a/drivers/spi/spi-dw-core.c
+++ b/drivers/spi/spi-dw-core.c
@@ -366,7 +366,7 @@ static void dw_spi_irq_setup(struct dw_spi *dws)
 	 * will be adjusted at the final stage of the IRQ-based SPI transfer
 	 * execution so not to lose the leftover of the incoming data.
 	 */
-	level = min_t(u16, dws->fifo_len / 2, dws->tx_len);
+	level = min_t(unsigned int, dws->fifo_len / 2, dws->tx_len);
 	dw_writel(dws, DW_SPI_TXFTLR, level);
 	dw_writel(dws, DW_SPI_RXFTLR, level - 1);
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux