Skip to content

Commit

Permalink
serial: sh-sci: fix break handling for sysrq
Browse files Browse the repository at this point in the history
[ Upstream commit 87b8061 ]

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>
  • Loading branch information
Ulrich Hecht authored and gregkh committed Sep 18, 2021
1 parent 86230f4 commit 621aaa0
Showing 1 changed file with 6 additions and 1 deletion.
7 changes: 6 additions & 1 deletion drivers/tty/serial/sh-sci.c
Expand Up @@ -1760,6 +1760,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;
Expand Down Expand Up @@ -1839,7 +1843,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 */
Expand Down

0 comments on commit 621aaa0

Please sign in to comment.