| From 5300c730b0d6a6dfdbf92bc9db438f603e5d2a67 Mon Sep 17 00:00:00 2001 |
| From: Geert Uytterhoeven <geert+renesas@glider.be> |
| Date: Tue, 28 Mar 2017 11:13:44 +0200 |
| Subject: [PATCH 126/286] serial: sh-sci: Fix hang in sci_reset() |
| |
| When the .set_termios() callback resets the UART, it first waits (busy |
| loops) until all characters in the transmit FIFO have been transmitted, |
| to prevent a port configuration change from impacting these characters. |
| |
| However, if the UART has dedicated RTS/CTS hardware flow control |
| enabled, these characters may have been stuck in the FIFO due to CTS not |
| being asserted by the remote side. |
| |
| - When a new user opens the port, .set_termios() is called while |
| transmission is still disabled, leading to an infinite loop: |
| |
| NMI watchdog: BUG: soft lockup - CPU#0 stuck for 22s! |
| |
| - When an active user changes port configuration without waiting for |
| the draining of the transmit FIFO, this may also block indefinitely, |
| until CTS is asserted by the remote side. |
| |
| This has been observed with SCIFA (on r8a7740/armadillo), and SCIFB and |
| HSCIF (on r8a7791/koelsch). |
| |
| To fix this, remove the code that waits for the draining of the transmit |
| FIFO. |
| |
| Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| (cherry picked from commit e37f712f760478a3bce8a68b8d85b5b0bf6642eb) |
| Signed-off-by: Simon Horman <horms+renesas@verge.net.au> |
| --- |
| drivers/tty/serial/sh-sci.c | 4 ---- |
| 1 file changed, 4 deletions(-) |
| |
| --- a/drivers/tty/serial/sh-sci.c |
| +++ b/drivers/tty/serial/sh-sci.c |
| @@ -2159,10 +2159,6 @@ static void sci_reset(struct uart_port * |
| unsigned int status; |
| struct sci_port *s = to_sci_port(port); |
| |
| - do { |
| - status = serial_port_in(port, SCxSR); |
| - } while (!(status & SCxSR_TEND(port))); |
| - |
| serial_port_out(port, SCSCR, 0x00); /* TE=0, RE=0, CKE1=0 */ |
| |
| reg = sci_getreg(port, SCFCR); |