| From 67a0fb45f2db1c5536fa551f49c61490eac72f55 Mon Sep 17 00:00:00 2001 |
| From: Kazuhiro Fujita <kazuhiro.fujita.jg@renesas.com> |
| Date: Fri, 27 Mar 2020 18:17:28 +0000 |
| Subject: [PATCH] serial: sh-sci: Make sure status register SCxSR is read in |
| correct sequence |
| |
| commit 3dc4db3662366306e54ddcbda4804acb1258e4ba upstream. |
| |
| For SCIF and HSCIF interfaces the SCxSR register holds the status of |
| data that is to be read next from SCxRDR register, But where as for |
| SCIFA and SCIFB interfaces SCxSR register holds status of data that is |
| previously read from SCxRDR register. |
| |
| This patch makes sure the status register is read depending on the port |
| types so that errors are caught accordingly. |
| |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Kazuhiro Fujita <kazuhiro.fujita.jg@renesas.com> |
| Signed-off-by: Hao Bui <hao.bui.yg@renesas.com> |
| Signed-off-by: KAZUMI HARADA <kazumi.harada.rh@renesas.com> |
| Signed-off-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com> |
| Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> |
| Link: https://lore.kernel.org/r/1585333048-31828-1-git-send-email-kazuhiro.fujita.jg@renesas.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c |
| index d29128b34c18..ab92562d4ea8 100644 |
| --- a/drivers/tty/serial/sh-sci.c |
| +++ b/drivers/tty/serial/sh-sci.c |
| @@ -873,9 +873,16 @@ static void sci_receive_chars(struct uart_port *port) |
| tty_insert_flip_char(tport, c, TTY_NORMAL); |
| } else { |
| for (i = 0; i < count; i++) { |
| - char c = serial_port_in(port, SCxRDR); |
| - |
| - status = serial_port_in(port, SCxSR); |
| + char c; |
| + |
| + if (port->type == PORT_SCIF || |
| + port->type == PORT_HSCIF) { |
| + status = serial_port_in(port, SCxSR); |
| + c = serial_port_in(port, SCxRDR); |
| + } else { |
| + c = serial_port_in(port, SCxRDR); |
| + status = serial_port_in(port, SCxSR); |
| + } |
| if (uart_handle_sysrq_char(port, c)) { |
| count--; i--; |
| continue; |
| -- |
| 2.7.4 |
| |