]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
spi: spi-fsl-lpspi: fix watermark truncation caused by type cast
authorCarlos Song <carlos.song@nxp.com>
Mon, 17 Nov 2025 03:03:55 +0000 (11:03 +0800)
committerMark Brown <broonie@kernel.org>
Fri, 21 Nov 2025 14:23:45 +0000 (14:23 +0000)
't->len' is an unsigned integer, while 'watermark' and 'txfifosize' are
u8. Using min_t with typeof(watermark) forces both values to be cast to
u8, which truncates len when it exceeds 255. For example, len = 4096
becomes 0 after casting, resulting in an incorrect watermark value.

Use a wider type in min_t to avoid truncation and ensure the correct
minimum value is applied.

Fixes: a750050349ea ("spi: spi-fsl-lpspi: use min_t() to improve code")
Signed-off-by: Carlos Song <carlos.song@nxp.com>
Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
Link: https://patch.msgid.link/20251117030355.1359081-1-carlos.song@nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-fsl-lpspi.c

index 8da66e101386797a72c3c2dd15a77b324c832f53..065456aba2aea93f24f0df8d3e0327765eced372 100644 (file)
@@ -486,7 +486,13 @@ static int fsl_lpspi_setup_transfer(struct spi_controller *controller,
                fsl_lpspi->tx = fsl_lpspi_buf_tx_u32;
        }
 
-       fsl_lpspi->watermark = min_t(typeof(fsl_lpspi->watermark),
+       /*
+        * t->len is 'unsigned' and txfifosize and watermrk is 'u8', force
+        * type cast is inevitable. When len > 255, len will be truncated in min_t(),
+        * it caused wrong watermark set. 'unsigned int' is as the designated type
+        * for min_t() to avoid truncation.
+        */
+       fsl_lpspi->watermark = min_t(unsigned int,
                                     fsl_lpspi->txfifosize,
                                     t->len);