These patches were generated from: https://github.com/raspberrypi/linux/commits/rpi-6.12.y With the following command: git format-patch -N v6.12.27..HEAD (HEAD -> 8d3206ee456a5ecdf9ddbfd8e5e231e4f0cd716e) Exceptions: - (def)configs patches - github workflows patches - applied & reverted patches - readme patches - wireless patches Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
41 lines
1.3 KiB
Diff
41 lines
1.3 KiB
Diff
From bd2d5021ba5cd668d8fe2f8f4fe33d89cdb9235e Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Bell <jonathan@raspberrypi.com>
|
|
Date: Mon, 22 Jul 2024 15:27:51 +0100
|
|
Subject: [PATCH] spi: dw: don't immediately kill DMA transfers if an error
|
|
occurs
|
|
|
|
Disabling the peripheral resets controller state which has a dangerous
|
|
side-effect of disabling the DMA handshake interface while it is active.
|
|
This can cause DMA channels to hang.
|
|
|
|
The error recovery pathway will wait for DMA to stop and reset the chip
|
|
anyway, so mask further FIFO interrupts and let the transfer finish
|
|
gracefully.
|
|
|
|
Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
|
|
---
|
|
drivers/spi/spi-dw-core.c | 13 ++++++++++++-
|
|
1 file changed, 12 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/spi/spi-dw-core.c
|
|
+++ b/drivers/spi/spi-dw-core.c
|
|
@@ -202,7 +202,18 @@ int dw_spi_check_status(struct dw_spi *d
|
|
|
|
/* Generically handle the erroneous situation */
|
|
if (ret) {
|
|
- dw_spi_reset_chip(dws);
|
|
+ /*
|
|
+ * Forcibly halting the controller can cause DMA to hang.
|
|
+ * Defer to dw_spi_handle_err outside of interrupt context
|
|
+ * and mask further interrupts for the current transfer.
|
|
+ */
|
|
+ if (dws->dma_mapped) {
|
|
+ dw_spi_mask_intr(dws, 0xff);
|
|
+ dw_readl(dws, DW_SPI_ICR);
|
|
+ } else {
|
|
+ dw_spi_reset_chip(dws);
|
|
+ }
|
|
+
|
|
if (dws->host->cur_msg)
|
|
dws->host->cur_msg->status = ret;
|
|
}
|