From fc777439cac8ca9c027166c7c97a432b4cfc9ef7 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 6 Sep 2022 15:41:33 +0200 Subject: [PATCH] 5.4-stable patches added patches: usb-serial-ch341-fix-disabled-rx-timer-on-older-devices.patch usb-serial-ch341-fix-lost-character-on-lcr-updates.patch --- queue-5.4/series | 2 + ...x-disabled-rx-timer-on-older-devices.patch | 48 ++++++++++++++ ...41-fix-lost-character-on-lcr-updates.patch | 66 +++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 queue-5.4/usb-serial-ch341-fix-disabled-rx-timer-on-older-devices.patch create mode 100644 queue-5.4/usb-serial-ch341-fix-lost-character-on-lcr-updates.patch diff --git a/queue-5.4/series b/queue-5.4/series index 10eb8eb4516..44781fab63f 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -56,3 +56,5 @@ drm-i915-glk-ecs-liva-q2-needs-glk-hdmi-port-timing-quirk.patch btrfs-harden-identification-of-a-stale-device.patch usb-dwc3-fix-phy-disable-sequence.patch usb-dwc3-disable-usb-core-phy-management.patch +usb-serial-ch341-fix-lost-character-on-lcr-updates.patch +usb-serial-ch341-fix-disabled-rx-timer-on-older-devices.patch diff --git a/queue-5.4/usb-serial-ch341-fix-disabled-rx-timer-on-older-devices.patch b/queue-5.4/usb-serial-ch341-fix-disabled-rx-timer-on-older-devices.patch new file mode 100644 index 00000000000..1aa5b69928b --- /dev/null +++ b/queue-5.4/usb-serial-ch341-fix-disabled-rx-timer-on-older-devices.patch @@ -0,0 +1,48 @@ +From foo@baz Tue Sep 6 03:40:54 PM CEST 2022 +From: Johan Hovold +Date: Tue, 6 Sep 2022 15:34:35 +0200 +Subject: USB: serial: ch341: fix disabled rx timer on older devices +To: Greg Kroah-Hartman +Cc: stable@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , Jonathan Woithe +Message-ID: <20220906133435.26452-4-johan@kernel.org> + +From: Johan Hovold + +commit 41ca302a697b64a3dab4676e01d0d11bb184737d upstream. + +At least one older CH341 appears to have the RX timer enable bit +inverted so that setting it disables the RX timer and prevents the FIFO +from emptying until it is full. + +Only set the RX timer enable bit for devices with version newer than +0x27 (even though this probably affects all pre-0x30 devices). + +Reported-by: Jonathan Woithe +Tested-by: Jonathan Woithe +Link: https://lore.kernel.org/r/Ys1iPTfiZRWj2gXs@marvin.atrad.com.au +Fixes: 4e46c410e050 ("USB: serial: ch341: reinitialize chip on reconfiguration") +Cc: stable@vger.kernel.org # 4.10 +Signed-off-by: Johan Hovold +[ johan: backport to 5.4 ] +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/serial/ch341.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +--- a/drivers/usb/serial/ch341.c ++++ b/drivers/usb/serial/ch341.c +@@ -177,8 +177,12 @@ static int ch341_set_baudrate_lcr(struct + /* + * CH341A buffers data until a full endpoint-size packet (32 bytes) + * has been received unless bit 7 is set. ++ * ++ * At least one device with version 0x27 appears to have this bit ++ * inverted. + */ +- a |= BIT(7); ++ if (priv->version > 0x27) ++ a |= BIT(7); + + r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x1312, a); + if (r) diff --git a/queue-5.4/usb-serial-ch341-fix-lost-character-on-lcr-updates.patch b/queue-5.4/usb-serial-ch341-fix-lost-character-on-lcr-updates.patch new file mode 100644 index 00000000000..515c35a87e8 --- /dev/null +++ b/queue-5.4/usb-serial-ch341-fix-lost-character-on-lcr-updates.patch @@ -0,0 +1,66 @@ +From foo@baz Tue Sep 6 03:40:54 PM CEST 2022 +From: Johan Hovold +Date: Tue, 6 Sep 2022 15:34:34 +0200 +Subject: USB: serial: ch341: fix lost character on LCR updates +To: Greg Kroah-Hartman +Cc: stable@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold , Jonathan Woithe +Message-ID: <20220906133435.26452-3-johan@kernel.org> + +From: Johan Hovold + +commit 8e83622ae7ca481c76c8fd9579877f6abae64ca2 upstream. + +Disable LCR updates for pre-0x30 devices which use a different (unknown) +protocol for line control and where the current register write causes +the next received character to be lost. + +Note that updating LCR using the INIT command has no effect on these +devices either. + +Reported-by: Jonathan Woithe +Tested-by: Jonathan Woithe +Link: https://lore.kernel.org/r/Ys1iPTfiZRWj2gXs@marvin.atrad.com.au +Fixes: 4e46c410e050 ("USB: serial: ch341: reinitialize chip on reconfiguration") +Fixes: 55fa15b5987d ("USB: serial: ch341: fix baud rate and line-control handling") +Cc: stable@vger.kernel.org # 4.10 +Signed-off-by: Johan Hovold +[ johan: adjust context to 5.4 ] +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/serial/ch341.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/drivers/usb/serial/ch341.c ++++ b/drivers/usb/serial/ch341.c +@@ -96,7 +96,9 @@ struct ch341_private { + u8 mcr; + u8 msr; + u8 lcr; ++ + unsigned long quirks; ++ u8 version; + }; + + static void ch341_set_termios(struct tty_struct *tty, +@@ -182,6 +184,9 @@ static int ch341_set_baudrate_lcr(struct + if (r) + return r; + ++ if (priv->version < 0x30) ++ return 0; ++ + r = ch341_control_out(dev, CH341_REQ_WRITE_REG, 0x2518, lcr); + if (r) + return r; +@@ -233,7 +238,9 @@ static int ch341_configure(struct usb_de + r = ch341_control_in(dev, CH341_REQ_READ_VERSION, 0, 0, buffer, size); + if (r < 0) + goto out; +- dev_dbg(&dev->dev, "Chip version: 0x%02x\n", buffer[0]); ++ ++ priv->version = buffer[0]; ++ dev_dbg(&dev->dev, "Chip version: 0x%02x\n", priv->version); + + r = ch341_control_out(dev, CH341_REQ_SERIAL_INIT, 0, 0); + if (r < 0) -- 2.47.3