]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 6 Sep 2022 13:41:33 +0000 (15:41 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 6 Sep 2022 13:41:33 +0000 (15:41 +0200)
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
queue-5.4/usb-serial-ch341-fix-disabled-rx-timer-on-older-devices.patch [new file with mode: 0644]
queue-5.4/usb-serial-ch341-fix-lost-character-on-lcr-updates.patch [new file with mode: 0644]

index 10eb8eb4516a4f4d5822976b4c42b9f3ea715561..44781fab63f6650ff187c5f8b37d410769ea611f 100644 (file)
@@ -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 (file)
index 0000000..1aa5b69
--- /dev/null
@@ -0,0 +1,48 @@
+From foo@baz Tue Sep  6 03:40:54 PM CEST 2022
+From: Johan Hovold <johan@kernel.org>
+Date: Tue,  6 Sep 2022 15:34:35 +0200
+Subject: USB: serial: ch341: fix disabled rx timer on older devices
+To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: stable@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold <johan@kernel.org>, Jonathan Woithe <jwoithe@just42.net>
+Message-ID: <20220906133435.26452-4-johan@kernel.org>
+
+From: Johan Hovold <johan@kernel.org>
+
+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 <jwoithe@just42.net>
+Tested-by: Jonathan Woithe <jwoithe@just42.net>
+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@kernel.org>
+[ johan: backport to 5.4 ]
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..515c35a
--- /dev/null
@@ -0,0 +1,66 @@
+From foo@baz Tue Sep  6 03:40:54 PM CEST 2022
+From: Johan Hovold <johan@kernel.org>
+Date: Tue,  6 Sep 2022 15:34:34 +0200
+Subject: USB: serial: ch341: fix lost character on LCR updates
+To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: stable@vger.kernel.org, linux-kernel@vger.kernel.org, Johan Hovold <johan@kernel.org>, Jonathan Woithe <jwoithe@just42.net>
+Message-ID: <20220906133435.26452-3-johan@kernel.org>
+
+From: Johan Hovold <johan@kernel.org>
+
+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 <jwoithe@just42.net>
+Tested-by: Jonathan Woithe <jwoithe@just42.net>
+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@kernel.org>
+[ johan: adjust context to 5.4 ]
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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)