]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Mar 2023 09:15:14 +0000 (10:15 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Mar 2023 09:15:14 +0000 (10:15 +0100)
added patches:
tty-serial-fsl_lpuart-skip-waiting-for-transmission-complete-when-uartctrl_sbk-is-asserted.patch

queue-5.4/series
queue-5.4/tty-serial-fsl_lpuart-skip-waiting-for-transmission-complete-when-uartctrl_sbk-is-asserted.patch [new file with mode: 0644]

index f47dc89e91bb79cc3db029dc2b0d532bc3d7abf6..d1e71e451cfa768ed07a2e1d2139a09997a37771 100644 (file)
@@ -42,3 +42,4 @@ ext4-fix-task-hung-in-ext4_xattr_delete_inode.patch
 drm-amdkfd-fix-an-illegal-memory-access.patch
 sh-intc-avoid-spurious-sizeof-pointer-div-warning.patch
 ext4-fix-possible-double-unlock-when-moving-a-directory.patch
+tty-serial-fsl_lpuart-skip-waiting-for-transmission-complete-when-uartctrl_sbk-is-asserted.patch
diff --git a/queue-5.4/tty-serial-fsl_lpuart-skip-waiting-for-transmission-complete-when-uartctrl_sbk-is-asserted.patch b/queue-5.4/tty-serial-fsl_lpuart-skip-waiting-for-transmission-complete-when-uartctrl_sbk-is-asserted.patch
new file mode 100644 (file)
index 0000000..37ff572
--- /dev/null
@@ -0,0 +1,46 @@
+From 2411fd94ceaa6e11326e95d6ebf876cbfed28d23 Mon Sep 17 00:00:00 2001
+From: Sherry Sun <sherry.sun@nxp.com>
+Date: Thu, 23 Feb 2023 17:39:41 +0800
+Subject: tty: serial: fsl_lpuart: skip waiting for transmission complete when UARTCTRL_SBK is asserted
+
+From: Sherry Sun <sherry.sun@nxp.com>
+
+commit 2411fd94ceaa6e11326e95d6ebf876cbfed28d23 upstream.
+
+According to LPUART RM, Transmission Complete Flag becomes 0 if queuing
+a break character by writing 1 to CTRL[SBK], so here need to skip
+waiting for transmission complete when UARTCTRL_SBK is asserted,
+otherwise the kernel may stuck here.
+And actually set_termios() adds transmission completion waiting to avoid
+data loss or data breakage when changing the baud rate, but we don't
+need to worry about this when queuing break characters.
+
+Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
+Cc: stable <stable@kernel.org>
+Link: https://lore.kernel.org/r/20230223093941.31790-1-sherry.sun@nxp.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/tty/serial/fsl_lpuart.c |   12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+--- a/drivers/tty/serial/fsl_lpuart.c
++++ b/drivers/tty/serial/fsl_lpuart.c
+@@ -2002,9 +2002,15 @@ lpuart32_set_termios(struct uart_port *p
+       /* update the per-port timeout */
+       uart_update_timeout(port, termios->c_cflag, baud);
+-      /* wait transmit engin complete */
+-      lpuart32_write(&sport->port, 0, UARTMODIR);
+-      lpuart32_wait_bit_set(&sport->port, UARTSTAT, UARTSTAT_TC);
++      /*
++       * LPUART Transmission Complete Flag may never be set while queuing a break
++       * character, so skip waiting for transmission complete when UARTCTRL_SBK is
++       * asserted.
++       */
++      if (!(old_ctrl & UARTCTRL_SBK)) {
++              lpuart32_write(&sport->port, 0, UARTMODIR);
++              lpuart32_wait_bit_set(&sport->port, UARTSTAT, UARTSTAT_TC);
++      }
+       /* disable transmit and receive */
+       lpuart32_write(&sport->port, old_ctrl & ~(UARTCTRL_TE | UARTCTRL_RE),