tty: serial: fsl_lpuart: correct the count of break characters
authorSherry Sun <sherry.sun@nxp.com>
Mon, 25 Jul 2022 05:01:15 +0000 (13:01 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Jul 2022 08:35:32 +0000 (10:35 +0200)
The LPUART can't distinguish between a break signal and a framing error,
so need to count the break characters if there is a framing error and
received data is zero instead of the parity error.

Fixes: 5541a9bacfe5 ("serial: fsl_lpuart: handle break and make sysrq work")
Reviewed-by: Michael Walle <michael@walle.cc>
Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
Link: https://lore.kernel.org/r/20220725050115.12396-1-sherry.sun@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/fsl_lpuart.c

index afa0f94..f6c33cd 100644 (file)
@@ -992,12 +992,12 @@ static void lpuart32_rxint(struct lpuart_port *sport)
 
                if (sr & (UARTSTAT_PE | UARTSTAT_OR | UARTSTAT_FE)) {
                        if (sr & UARTSTAT_PE) {
+                               sport->port.icount.parity++;
+                       } else if (sr & UARTSTAT_FE) {
                                if (is_break)
                                        sport->port.icount.brk++;
                                else
-                                       sport->port.icount.parity++;
-                       } else if (sr & UARTSTAT_FE) {
-                               sport->port.icount.frame++;
+                                       sport->port.icount.frame++;
                        }
 
                        if (sr & UARTSTAT_OR)
@@ -1012,12 +1012,12 @@ static void lpuart32_rxint(struct lpuart_port *sport)
                        sr &= sport->port.read_status_mask;
 
                        if (sr & UARTSTAT_PE) {
+                               flg = TTY_PARITY;
+                       } else if (sr & UARTSTAT_FE) {
                                if (is_break)
                                        flg = TTY_BREAK;
                                else
-                                       flg = TTY_PARITY;
-                       } else if (sr & UARTSTAT_FE) {
-                               flg = TTY_FRAME;
+                                       flg = TTY_FRAME;
                        }
 
                        if (sr & UARTSTAT_OR)