]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mtd: onenand: samsung: report DMA completion timeouts
authorPengpeng Hou <pengpeng@iscas.ac.cn>
Fri, 3 Jul 2026 07:43:50 +0000 (15:43 +0800)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 3 Jul 2026 13:46:10 +0000 (15:46 +0200)
The S5PC110 OneNAND DMA helpers have bounded waits for transfer
completion. The polling helper falls out of its timeout loop and returns
success, and the IRQ helper ignores wait_for_completion_timeout().

Return -ETIMEDOUT when the DMA transfer-done bit or completion does not
arrive before the timeout so callers can treat the buffer transfer as
failed.

Fixes: e23abf4b7743 ("mtd: OneNAND: S5PC110: Implement DMA interrupt method")
Cc: stable@vger.kernel.org
Signed-off-by: Pengpeng Hou <pengpeng@iscas.ac.cn>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
drivers/mtd/nand/onenand/onenand_samsung.c

index 6d6aa709a21f8e5b73d1d2cde07ae08135d267dc..b7b7758ce4d860cd72af3f3e4aab445d1fd023ce 100644 (file)
@@ -554,6 +554,9 @@ static int s5pc110_dma_poll(dma_addr_t dst, dma_addr_t src, size_t count, int di
        } while (!(status & S5PC110_DMA_TRANS_STATUS_TD) &&
                time_before(jiffies, timeout));
 
+       if (!(status & S5PC110_DMA_TRANS_STATUS_TD))
+               return -ETIMEDOUT;
+
        writel(S5PC110_DMA_TRANS_CMD_TDC, base + S5PC110_DMA_TRANS_CMD);
 
        return 0;
@@ -608,7 +611,9 @@ static int s5pc110_dma_irq(dma_addr_t dst, dma_addr_t src, size_t count, int dir
 
        writel(S5PC110_DMA_TRANS_CMD_TR, base + S5PC110_DMA_TRANS_CMD);
 
-       wait_for_completion_timeout(&onenand->complete, msecs_to_jiffies(20));
+       if (!wait_for_completion_timeout(&onenand->complete,
+                                        msecs_to_jiffies(20)))
+               return -ETIMEDOUT;
 
        return 0;
 }