diff mbox series

serial: sh-sci: fix break handling for sysrq

Message ID 20210816162201.28801-1-uli+renesas@fpond.eu (mailing list archive)
State Accepted
Delegated to: Geert Uytterhoeven
Headers show
Series serial: sh-sci: fix break handling for sysrq | expand

Commit Message

Ulrich Hecht Aug. 16, 2021, 4:22 p.m. UTC
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(-)

Comments

Geert Uytterhoeven Aug. 23, 2021, 9:16 a.m. UTC | #1
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
Wolfram Sang Sept. 9, 2021, 2:35 p.m. UTC | #2
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 mbox series

Patch

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 */