mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2024-11-25 06:26:15 +00:00
0171157d45
The patches were generated from the RPi repo with the following command: git format-patch v6.6.44..rpi-6.6.y Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
42 lines
1.3 KiB
Diff
42 lines
1.3 KiB
Diff
From 3af7822df36e36b5a74d877df7654695c0e0d34a Mon Sep 17 00:00:00 2001
|
|
From: Jonathan Bell <jonathan@raspberrypi.com>
|
|
Date: Mon, 22 Jul 2024 15:27:51 +0100
|
|
Subject: [PATCH 1191/1215] 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
|
|
@@ -200,7 +200,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;
|
|
}
|