serial: sh-sci: fix break handling for sysrq
[ 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>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
a99eec36ed
commit
49e2bcb7cf
@@ -1760,6 +1760,10 @@ static irqreturn_t sci_br_interrupt(int irq, void *ptr)
|
|||||||
|
|
||||||
/* Handle BREAKs */
|
/* Handle BREAKs */
|
||||||
sci_handle_breaks(port);
|
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));
|
sci_clear_SCxSR(port, SCxSR_BREAK_CLEAR(port));
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
@@ -1839,7 +1843,8 @@ static irqreturn_t sci_mpxed_interrupt(int irq, void *ptr)
|
|||||||
ret = sci_er_interrupt(irq, ptr);
|
ret = sci_er_interrupt(irq, ptr);
|
||||||
|
|
||||||
/* Break Interrupt */
|
/* 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);
|
ret = sci_br_interrupt(irq, ptr);
|
||||||
|
|
||||||
/* Overrun Interrupt */
|
/* Overrun Interrupt */
|
||||||
|
Reference in New Issue
Block a user