diff mbox series

[4.4.y-cip,2/4] serial: sh-sci: Terminate TX DMA during buffer flushing

Message ID 20200903142719.13010-3-prabhakar.mahadev-lad.rj@bp.renesas.com (mailing list archive)
State Rejected
Headers show
Series serial mctrl_gpio/sh-sci Fixes | expand

Commit Message

Lad Prabhakar Sept. 3, 2020, 2:27 p.m. UTC
From: Geert Uytterhoeven <geert+renesas@glider.be>

commit 775b7ffd7d6d5db320d99b0a485c51e04dfcf9f1 upstream.

While the .flush_buffer() callback clears sci_port.tx_dma_len since
commit 1cf4a7efdc71cab8 ("serial: sh-sci: Fix race condition causing
garbage during shutdown"), it does not terminate a transmit DMA
operation that may be in progress.

Fix this by terminating any pending DMA operations, and resetting the
corresponding cookie.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Eugeniu Rosca <erosca@de.adit-jv.com>
Tested-by: Eugeniu Rosca <erosca@de.adit-jv.com>

Link: https://lore.kernel.org/r/20190624123540.20629-3-geert+renesas@glider.be
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
---
 drivers/tty/serial/sh-sci.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Comments

Pavel Machek Sept. 3, 2020, 8:46 p.m. UTC | #1
Hi!

> From: Geert Uytterhoeven <geert+renesas@glider.be>
> 
> commit 775b7ffd7d6d5db320d99b0a485c51e04dfcf9f1 upstream.
> 
> While the .flush_buffer() callback clears sci_port.tx_dma_len since
> commit 1cf4a7efdc71cab8 ("serial: sh-sci: Fix race condition causing
> garbage during shutdown"), it does not terminate a transmit DMA
> operation that may be in progress.
> 
> Fix this by terminating any pending DMA operations, and resetting the
> corresponding cookie.

What is the impact of the bug? DMA running during reboot, but not
doing any harm?

Anyway, this looks okay to me.

Best regards,
								Pavel
diff mbox series

Patch

diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 2b5b342b7462..166ca04aad4e 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -1475,11 +1475,18 @@  static void sci_free_dma(struct uart_port *port)
 
 static void sci_flush_buffer(struct uart_port *port)
 {
+	struct sci_port *s = to_sci_port(port);
+
 	/*
 	 * In uart_flush_buffer(), the xmit circular buffer has just been
-	 * cleared, so we have to reset tx_dma_len accordingly.
+	 * cleared, so we have to reset tx_dma_len accordingly, and stop any
+	 * pending transfers
 	 */
-	to_sci_port(port)->tx_dma_len = 0;
+	s->tx_dma_len = 0;
+	if (s->chan_tx) {
+		dmaengine_terminate_async(s->chan_tx);
+		s->cookie_tx = -EINVAL;
+	}
 }
 #else /* !CONFIG_SERIAL_SH_SCI_DMA */
 static inline void sci_request_dma(struct uart_port *port)