Thread (4 messages) 4 messages, 3 authors, 2021-06-04

RE: [PATCH v2] serial: sh-sci: Stop dmaengine transfer in sci_stop_tx()

From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Date: 2021-06-04 10:28:24
Also in: linux-renesas-soc

Hi Jiri,

Thank you for your review!
From: Jiri Slaby, Sent: Friday, June 4, 2021 7:22 PM

On 04. 06. 21, 11:57, Yoshihiro Shimoda wrote:
quoted
Stop dmaengine transfer in sci_stop_tx(). Otherwise, the following
message is possible output when system enters suspend and while
transferring data, because clearing TIE bit in SCSCR is not able to
stop any dmaengine transfer.

     sh-sci e6550000.serial: ttySC1: Unable to drain transmitter

Notes:
  - sci_dma_stop_tx() is a macro in the .h file because struct sci_port
    is declared in the .c file and #ifdef should be in the .h file.
  - This patch uses dmaengine_terminate_async() so that we can apply
    this into longterm kernel v4.9.x or later.

Fixes: 73a19e4c0301 ("serial: sh-sci: Add DMA support.")
Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
---
<snip>
quoted
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index 4baf1316ea72..3793cf9f352c 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -610,6 +610,8 @@ static void sci_stop_tx(struct uart_port *port)
  	ctrl &= ~SCSCR_TIE;

  	serial_port_out(port, SCSCR, ctrl);
+
+	sci_dma_stop_tx(port);
  }

  static void sci_start_rx(struct uart_port *port)
diff --git a/drivers/tty/serial/sh-sci.h b/drivers/tty/serial/sh-sci.h
index c0dfe4382898..435c674af1ce 100644
--- a/drivers/tty/serial/sh-sci.h
+++ b/drivers/tty/serial/sh-sci.h
@@ -174,3 +174,19 @@ enum {
  	(((port)->type == PORT_SCI) ? SCI_TDxE_CLEAR : SCIF_TDxE_CLEAR)
  #define SCxSR_BREAK_CLEAR(port) \
  	(((port)->type == PORT_SCI) ? SCI_BREAK_CLEAR : SCIF_BREAK_CLEAR)
+
+#ifdef CONFIG_SERIAL_SH_SCI_DMA
+#define sci_dma_stop_tx(port)					\
Ouch. First, why this needs to be in a header?
The v1 patch [1] putted #ifdef in .c file, so that I got feedback from Greg like below:
"Please do not put #ifdef in .c files, this should be possible without that."

[1]
https://lore.kernel.org/linux-renesas-soc/TY2PR01MB3692C545672195370487FA60D83C9@TY2PR01MB3692.jpnprd01.prod.outlook.com/T/#md5b58540e26a28ef1acddfc326c62bfde73e8e8a (local)
Second, please don't do this by a macro.
I got it. I'll try to fix this issue somehow...

Best regards,
Yoshihiro Shimoda
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help