]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
serial: sh-sci: Fix deadlock during RSCI FIFO overrun error
authorBiju Das <biju.das.jz@bp.renesas.com>
Fri, 14 Nov 2025 10:13:47 +0000 (10:13 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 26 Nov 2025 12:15:28 +0000 (13:15 +0100)
On RSCI IP, a deadlock occurs during a FIFO overrun error, as it uses a
different register to clear the FIFO overrun error status.

Cc: stable@kernel.org
Fixes: 0666e3fe95ab ("serial: sh-sci: Add support for RZ/T2H SCI")
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://patch.msgid.link/20251114101350.106699-3-biju.das.jz@bp.renesas.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/sh-sci.c

index b28711eeab7162ddc2db62c110c1456fa0b8e06a..53edbf1d89633c9a7cdea5f28f2679109755c66f 100644 (file)
@@ -1198,8 +1198,16 @@ static int sci_handle_fifo_overrun(struct uart_port *port)
 
        status = s->ops->read_reg(port, s->params->overrun_reg);
        if (status & s->params->overrun_mask) {
-               status &= ~s->params->overrun_mask;
-               s->ops->write_reg(port, s->params->overrun_reg, status);
+               if (s->type == SCI_PORT_RSCI) {
+                       /*
+                        * All of the CFCLR_*C clearing bits match the corresponding
+                        * CSR_*status bits. So, reuse the overrun mask for clearing.
+                        */
+                       s->ops->clear_SCxSR(port, s->params->overrun_mask);
+               } else {
+                       status &= ~s->params->overrun_mask;
+                       s->ops->write_reg(port, s->params->overrun_reg, status);
+               }
 
                port->icount.overrun++;