]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
spi: xilinx: let transfers timeout in case of no IRQ
authorVadim Fedorenko <vadim.fedorenko@linux.dev>
Wed, 10 Jun 2026 22:28:43 +0000 (22:28 +0000)
committerMark Brown <broonie@kernel.org>
Thu, 11 Jun 2026 13:48:17 +0000 (14:48 +0100)
In case of failed HW the driver may not see an interrupt and will stuck
in waiting forever. We can avoid such situation by timing out of
transfers if the interrupt is not seen in a reasonable time.

This problem can be found on unload of ptp_ocp driver for TimeCard which
uses Xilinx SPI AXI and SPI-NOR flash memory. During tear-down process
spi-nor drivers send soft reset command which is not triggering an
interrupt stalling the unload process completely.

Signed-off-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Acked-by: Michal Simek <michal.simek@amd.com>
Link: https://patch.msgid.link/20260610222843.782337-1-vadim.fedorenko@linux.dev
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-xilinx.c

index 3aeef70caa96bee741a22c881193bd90df5660e1..a9fe3784932fc82e4f2382ebb2ffeb4a30f146a9 100644 (file)
@@ -285,7 +285,11 @@ static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
 
                if (use_irq) {
                        xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET);
-                       wait_for_completion(&xspi->done);
+                       if (!wait_for_completion_timeout(&xspi->done, secs_to_jiffies(1))) {
+                               dev_err(&spi->dev, "SPI transfer timed out\n");
+                               xspi_init_hw(xspi);
+                               return -ETIMEDOUT;
+                       }
                        /* A transmit has just completed. Process received data
                         * and check for more data to transmit. Always inhibit
                         * the transmitter while the Isr refills the transmit