[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210816162201.28801-1-uli+renesas@fpond.eu>
Date: Mon, 16 Aug 2021 18:22:01 +0200
From: Ulrich Hecht <uli+renesas@...nd.eu>
To: linux-renesas-soc@...r.kernel.org, linux-serial@...r.kernel.org
Cc: wsa@...nel.org, geert@...ux-m68k.org,
yoshihiro.shimoda.uh@...esas.com, gregkh@...uxfoundation.org,
jirislaby@...nel.org, linux-kernel@...r.kernel.org,
Ulrich Hecht <uli+renesas@...nd.eu>
Subject: [PATCH] serial: sh-sci: fix break handling for sysrq
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@...nd.eu>
---
drivers/tty/serial/sh-sci.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
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 */
--
2.20.1
Powered by blists - more mailing lists