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

index 204747b18936f2d1a5813e34a96445ed33d8d59a..06b6a5d7e3caacd45f41756b98a2873ebbe482ca 100644 (file)
@@ -76,3 +76,5 @@ mmc-core-fix-uhs-i-sd-1.8v-workaround-branch.patch
 usb-dwc3-fix-phy-disable-sequence.patch
 usb-dwc3-qcom-fix-use-after-free-on-runtime-pm-wakeup.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.10/usb-serial-ch341-fix-disabled-rx-timer-on-older-devices.patch b/queue-5.10/usb-serial-ch341-fix-disabled-rx-timer-on-older-devices.patch
new file mode 100644 (file)
index 0000000..b901bc1
--- /dev/null
@@ -0,0 +1,46 @@
+From foo@baz Tue Sep  6 03:18:19 PM CEST 2022
+From: Johan Hovold <johan@kernel.org>
+Date: Tue,  6 Sep 2022 14:21:27 +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: <20220906122127.31321-3-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>
+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
+@@ -259,8 +259,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.
+        */
+-      val |= BIT(7);
++      if (priv->version > 0x27)
++              val |= BIT(7);
+       r = ch341_control_out(dev, CH341_REQ_WRITE_REG,
+                             CH341_REG_DIVISOR << 8 | CH341_REG_PRESCALER,
diff --git a/queue-5.10/usb-serial-ch341-fix-lost-character-on-lcr-updates.patch b/queue-5.10/usb-serial-ch341-fix-lost-character-on-lcr-updates.patch
new file mode 100644 (file)
index 0000000..a1420d7
--- /dev/null
@@ -0,0 +1,67 @@
+From foo@baz Tue Sep  6 03:18:19 PM CEST 2022
+From: Johan Hovold <johan@kernel.org>
+Date: Tue,  6 Sep 2022 14:21:26 +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: <20220906122127.31321-2-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.15 ]
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/usb/serial/ch341.c |   10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/serial/ch341.c
++++ b/drivers/usb/serial/ch341.c
+@@ -97,7 +97,10 @@ struct ch341_private {
+       u8 mcr;
+       u8 msr;
+       u8 lcr;
++
+       unsigned long quirks;
++      u8 version;
++
+       unsigned long break_end;
+ };
+@@ -271,6 +274,9 @@ static int ch341_set_baudrate_lcr(struct
+        * (stop bits, parity and word length). Version 0x30 and above use
+        * CH341_REG_LCR only and CH341_REG_LCR2 is always set to zero.
+        */
++      if (priv->version < 0x30)
++              return 0;
++
+       r = ch341_control_out(dev, CH341_REQ_WRITE_REG,
+                             CH341_REG_LCR2 << 8 | CH341_REG_LCR, lcr);
+       if (r)
+@@ -323,7 +329,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)