Due to one LPUART IP bug which treat the CTS as higher priority than the break signal, that cause the break signal sending through UARTCTRL_SBK may impacted by the CTS input if the HW flow control is enabled. So commit c4c81db5cf8b ("tty: serial: fsl_lpuart: disable the CTS when send break signal") try to workaround this IP issue, it disables CTS before asserting SBK to avoid any interference from CTS, and re-enable it when break off. Here we enable CTS before turning off the break, there is still a risk of the break signal been impacted by CTS input. The correct sequence is to disable CTS before asserting SBK, and re-enable CTS after break off, which ensures the break signal won't be impacted by CTS, so fix it. Fixes: c4c81db5cf8b ("tty: serial: fsl_lpuart: disable the CTS when send break signal") Signed-off-by: Sherry Sun <sherry.sun@xxxxxxx> --- drivers/tty/serial/fsl_lpuart.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c index 0e56fa64b4ce..d9e46f7b80e5 100644 --- a/drivers/tty/serial/fsl_lpuart.c +++ b/drivers/tty/serial/fsl_lpuart.c @@ -1550,20 +1550,19 @@ static void lpuart32_break_ctl(struct uart_port *port, int break_state) modem = lpuart32_read(port, UARTMODIR); if (break_state != 0) { - temp |= UARTCTRL_SBK; /* * LPUART CTS has higher priority than SBK, need to disable CTS before * asserting SBK to avoid any interference if flow control is enabled. */ if (cflag & CRTSCTS && modem & UARTMODIR_TXCTSE) lpuart32_write(port, modem & ~UARTMODIR_TXCTSE, UARTMODIR); + lpuart32_write(port, temp | UARTCTRL_SBK, UARTCTRL); } else { - /* Re-enable the CTS when break off. */ + lpuart32_write(port, temp, UARTCTRL); + /* Re-enable the CTS after break off. */ if (cflag & CRTSCTS && !(modem & UARTMODIR_TXCTSE)) lpuart32_write(port, modem | UARTMODIR_TXCTSE, UARTMODIR); } - - lpuart32_write(port, temp, UARTCTRL); } static void lpuart_setup_watermark(struct lpuart_port *sport) -- 2.17.1