]> git.baikalelectronics.ru Git - kernel.git/commitdiff
serial: sh-sci: fix break handling for sysrq
authorUlrich Hecht <uli+renesas@fpond.eu>
Mon, 16 Aug 2021 16:22:01 +0000 (18:22 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Sep 2021 10:26:33 +0000 (12:26 +0200)
[ Upstream commit 87b8061bad9bd4b549b2daf36ffbaa57be2789a2 ]

This fixes two issues that cause the sysrq sequence to be inadvertently
aborted on SCIF serial consoles:

- a NUL character remains in the RX queue after a break has been detected,
  which is then passed on to uart_handle_sysrq_char()
- the break interrupt is handled twice on controllers with multiplexed ERI
  and BRI interrupts

Signed-off-by: Ulrich Hecht <uli+renesas@fpond.eu>
Link: https://lore.kernel.org/r/20210816162201.28801-1-uli+renesas@fpond.eu
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/tty/serial/sh-sci.c

index 97ee1fc1cd247b4622edbb45fe33dff6b3df6f71..ecff9b2088087f4ed1184d9319c1a997878667b3 100644 (file)
@@ -1763,6 +1763,10 @@ static irqreturn_t sci_br_interrupt(int irq, void *ptr)
 
        /* Handle BREAKs */
        sci_handle_breaks(port);
+
+       /* drop invalid character received before break was detected */
+       serial_port_in(port, SCxRDR);
+
        sci_clear_SCxSR(port, SCxSR_BREAK_CLEAR(port));
 
        return IRQ_HANDLED;
@@ -1842,7 +1846,8 @@ static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr)
                ret = sci_er_interrupt(irq, ptr);
 
        /* Break Interrupt */
-       if ((ssr_status & SCxSR_BRK(port)) && err_enabled)
+       if (s->irqs[SCIx_ERI_IRQ] != s->irqs[SCIx_BRI_IRQ] &&
+           (ssr_status & SCxSR_BRK(port)) && err_enabled)
                ret = sci_br_interrupt(irq, ptr);
 
        /* Overrun Interrupt */