| From a7209541239e5dd44d981289e5f9059222d40fd1 Mon Sep 17 00:00:00 2001 |
| From: Narendra Hadke <nhadke@marvell.com> |
| Date: Tue, 26 Jul 2022 11:12:21 +0200 |
| Subject: serial: mvebu-uart: uart2 error bits clearing |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Narendra Hadke <nhadke@marvell.com> |
| |
| commit a7209541239e5dd44d981289e5f9059222d40fd1 upstream. |
| |
| For mvebu uart2, error bits are not cleared on buffer read. |
| This causes interrupt loop and system hang. |
| |
| Cc: stable@vger.kernel.org |
| Reviewed-by: Yi Guo <yi.guo@cavium.com> |
| Reviewed-by: Nadav Haklai <nadavh@marvell.com> |
| Signed-off-by: Narendra Hadke <nhadke@marvell.com> |
| Signed-off-by: Pali Rohรกr <pali@kernel.org> |
| Link: https://lore.kernel.org/r/20220726091221.12358-1-pali@kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/tty/serial/mvebu-uart.c | 11 +++++++++++ |
| 1 file changed, 11 insertions(+) |
| |
| --- a/drivers/tty/serial/mvebu-uart.c |
| +++ b/drivers/tty/serial/mvebu-uart.c |
| @@ -238,6 +238,7 @@ static void mvebu_uart_rx_chars(struct u |
| struct tty_port *tport = &port->state->port; |
| unsigned char ch = 0; |
| char flag = 0; |
| + int ret; |
| |
| do { |
| if (status & STAT_RX_RDY(port)) { |
| @@ -250,6 +251,16 @@ static void mvebu_uart_rx_chars(struct u |
| port->icount.parity++; |
| } |
| |
| + /* |
| + * For UART2, error bits are not cleared on buffer read. |
| + * This causes interrupt loop and system hang. |
| + */ |
| + if (IS_EXTENDED(port) && (status & STAT_BRK_ERR)) { |
| + ret = readl(port->membase + UART_STAT); |
| + ret |= STAT_BRK_ERR; |
| + writel(ret, port->membase + UART_STAT); |
| + } |
| + |
| if (status & STAT_BRK_DET) { |
| port->icount.brk++; |
| status &= ~(STAT_FRM_ERR | STAT_PAR_ERR); |