lkml.org 
[lkml]   [2022]   [Aug]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 029/287] serial: mvebu-uart: uart2 error bits clearing
    Date
    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
    @@ -237,6 +237,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)) {
    @@ -249,6 +250,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);

    \
     
     \ /
      Last update: 2022-08-23 12:34    [W:3.994 / U:0.392 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site