Message ID | 20210816162201.28801-1-uli+renesas@fpond.eu |
---|---|
State | New |
Headers | show |
Series | serial: sh-sci: fix break handling for sysrq | expand |
On Mon, Aug 16, 2021 at 6:22 PM Ulrich Hecht <uli+renesas@fpond.eu> wrote: > 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> FTR: Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
On Mon, Aug 16, 2021 at 06:22:01PM +0200, Ulrich Hecht wrote: > 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> For the record: Tested-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c index 07eb56294371..89ee43061d3a 100644 --- a/drivers/tty/serial/sh-sci.c +++ b/drivers/tty/serial/sh-sci.c @@ -1758,6 +1758,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; @@ -1837,7 +1841,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 */
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> --- drivers/tty/serial/sh-sci.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)