]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
cdc_ether|r8152: ThinkPad Hybrid USB-C/A Dock quirk
authorPhilipp Hahn <phahn-oss@avm.de>
Mon, 10 Mar 2025 10:17:35 +0000 (11:17 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Apr 2025 08:45:16 +0000 (10:45 +0200)
[ Upstream commit a07f23ad9baf716cbf7746e452c92960536ceae6 ]

Lenovo ThinkPad Hybrid USB-C with USB-A Dock (17ef:a359) is affected by
the same problem as the Lenovo Powered USB-C Travel Hub (17ef:721e):
Both are based on the Realtek RTL8153B chip used to use the cdc_ether
driver. However, using this driver, with the system suspended the device
constantly sends pause-frames as soon as the receive buffer fills up.
This causes issues with other devices, where some Ethernet switches stop
forwarding packets altogether.

Using the Realtek driver (r8152) fixes this issue. Pause frames are no
longer sent while the host system is suspended.

Cc: Leon Schuermann <leon@is.currently.online>
Cc: Jakub Kicinski <kuba@kernel.org>
Cc: Oliver Neukum <oliver@neukum.org> (maintainer:USB CDC ETHERNET DRIVER)
Cc: netdev@vger.kernel.org (open list:NETWORKING DRIVERS)
Link: https://git.kernel.org/netdev/net/c/cb82a54904a9
Link: https://git.kernel.org/netdev/net/c/2284bbd0cf39
Link: https://www.lenovo.com/de/de/p/accessories-and-software/docking/docking-usb-docks/40af0135eu
Signed-off-by: Philipp Hahn <phahn-oss@avm.de>
Reviewed-by: Kory Maincent <kory.maincent@bootlin.com>
Link: https://patch.msgid.link/484336aad52d14ccf061b535bc19ef6396ef5120.1741601523.git.p.hahn@avm.de
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/usb/cdc_ether.c
drivers/net/usb/r8152.c
drivers/net/usb/r8153_ecm.c

index 6d61052353f078e41cdb53b2fcb07bf900a4768c..a04f758b3ba0710eea700abb5eecc076dc81b309 100644 (file)
@@ -782,6 +782,13 @@ static const struct usb_device_id  products[] = {
        .driver_info = 0,
 },
 
+/* Lenovo ThinkPad Hybrid USB-C with USB-A Dock (40af0135eu, based on Realtek RTL8153) */
+{
+       USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0xa359, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+       .driver_info = 0,
+},
+
 /* Aquantia AQtion USB to 5GbE Controller (based on AQC111U) */
 {
        USB_DEVICE_AND_INTERFACE_INFO(AQUANTIA_VENDOR_ID, 0xc101,
index 3e5998555f9814779c6b27d948fa3f0699f07dd5..bbcefcc7ef8f06bd4b3675bdf13f3c8f6756f454 100644 (file)
@@ -784,6 +784,7 @@ enum rtl8152_flags {
 #define DEVICE_ID_THINKPAD_USB_C_DONGLE                        0x720c
 #define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2             0xa387
 #define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN3             0x3062
+#define DEVICE_ID_THINKPAD_HYBRID_USB_C_DOCK           0xa359
 
 struct tally_counter {
        __le64  tx_packets;
@@ -9734,6 +9735,7 @@ static bool rtl8152_supports_lenovo_macpassthru(struct usb_device *udev)
                case DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2:
                case DEVICE_ID_THINKPAD_USB_C_DOCK_GEN3:
                case DEVICE_ID_THINKPAD_USB_C_DONGLE:
+               case DEVICE_ID_THINKPAD_HYBRID_USB_C_DOCK:
                        return 1;
                }
        } else if (vendor_id == VENDOR_ID_REALTEK && parent_vendor_id == VENDOR_ID_LENOVO) {
@@ -10011,6 +10013,8 @@ static const struct usb_device_id rtl8152_table[] = {
        { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927) },
        { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0c5e) },
        { USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101) },
+
+       /* Lenovo */
        { USB_DEVICE(VENDOR_ID_LENOVO,  0x304f) },
        { USB_DEVICE(VENDOR_ID_LENOVO,  0x3054) },
        { USB_DEVICE(VENDOR_ID_LENOVO,  0x3062) },
@@ -10021,7 +10025,9 @@ static const struct usb_device_id rtl8152_table[] = {
        { USB_DEVICE(VENDOR_ID_LENOVO,  0x720c) },
        { USB_DEVICE(VENDOR_ID_LENOVO,  0x7214) },
        { USB_DEVICE(VENDOR_ID_LENOVO,  0x721e) },
+       { USB_DEVICE(VENDOR_ID_LENOVO,  0xa359) },
        { USB_DEVICE(VENDOR_ID_LENOVO,  0xa387) },
+
        { USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) },
        { USB_DEVICE(VENDOR_ID_NVIDIA,  0x09ff) },
        { USB_DEVICE(VENDOR_ID_TPLINK,  0x0601) },
index 20b2df8d74ae1b33d2eeb9ce49015b6fba62acf9..8d860dacdf49b27a254c8565d3cae8d4e8c669f7 100644 (file)
@@ -135,6 +135,12 @@ static const struct usb_device_id products[] = {
                                      USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
        .driver_info = (unsigned long)&r8153_info,
 },
+/* Lenovo ThinkPad Hybrid USB-C with USB-A Dock (40af0135eu, based on Realtek RTL8153) */
+{
+       USB_DEVICE_AND_INTERFACE_INFO(VENDOR_ID_LENOVO, 0xa359, USB_CLASS_COMM,
+                                     USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+       .driver_info = (unsigned long)&r8153_info,
+},
 
        { },            /* END */
 };