Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

cdc_ether|r8152: ThinkPad Hybrid USB-C/A Dock quirk

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>

authored by

Philipp Hahn and committed by
Paolo Abeni
a07f23ad 38f13bf8

+19
+7
drivers/net/usb/cdc_ether.c
··· 783 783 .driver_info = 0, 784 784 }, 785 785 786 + /* Lenovo ThinkPad Hybrid USB-C with USB-A Dock (40af0135eu, based on Realtek RTL8153) */ 787 + { 788 + USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0xa359, USB_CLASS_COMM, 789 + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), 790 + .driver_info = 0, 791 + }, 792 + 786 793 /* Aquantia AQtion USB to 5GbE Controller (based on AQC111U) */ 787 794 { 788 795 USB_DEVICE_AND_INTERFACE_INFO(AQUANTIA_VENDOR_ID, 0xc101,
+6
drivers/net/usb/r8152.c
··· 785 785 #define DEVICE_ID_THINKPAD_USB_C_DONGLE 0x720c 786 786 #define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2 0xa387 787 787 #define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN3 0x3062 788 + #define DEVICE_ID_THINKPAD_HYBRID_USB_C_DOCK 0xa359 788 789 789 790 struct tally_counter { 790 791 __le64 tx_packets; ··· 9788 9787 case DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2: 9789 9788 case DEVICE_ID_THINKPAD_USB_C_DOCK_GEN3: 9790 9789 case DEVICE_ID_THINKPAD_USB_C_DONGLE: 9790 + case DEVICE_ID_THINKPAD_HYBRID_USB_C_DOCK: 9791 9791 return 1; 9792 9792 } 9793 9793 } else if (vendor_id == VENDOR_ID_REALTEK && parent_vendor_id == VENDOR_ID_LENOVO) { ··· 10066 10064 { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927) }, 10067 10065 { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0c5e) }, 10068 10066 { USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101) }, 10067 + 10068 + /* Lenovo */ 10069 10069 { USB_DEVICE(VENDOR_ID_LENOVO, 0x304f) }, 10070 10070 { USB_DEVICE(VENDOR_ID_LENOVO, 0x3054) }, 10071 10071 { USB_DEVICE(VENDOR_ID_LENOVO, 0x3062) }, ··· 10078 10074 { USB_DEVICE(VENDOR_ID_LENOVO, 0x720c) }, 10079 10075 { USB_DEVICE(VENDOR_ID_LENOVO, 0x7214) }, 10080 10076 { USB_DEVICE(VENDOR_ID_LENOVO, 0x721e) }, 10077 + { USB_DEVICE(VENDOR_ID_LENOVO, 0xa359) }, 10081 10078 { USB_DEVICE(VENDOR_ID_LENOVO, 0xa387) }, 10079 + 10082 10080 { USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) }, 10083 10081 { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) }, 10084 10082 { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) },
+6
drivers/net/usb/r8153_ecm.c
··· 135 135 USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), 136 136 .driver_info = (unsigned long)&r8153_info, 137 137 }, 138 + /* Lenovo ThinkPad Hybrid USB-C with USB-A Dock (40af0135eu, based on Realtek RTL8153) */ 139 + { 140 + USB_DEVICE_AND_INTERFACE_INFO(VENDOR_ID_LENOVO, 0xa359, USB_CLASS_COMM, 141 + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), 142 + .driver_info = (unsigned long)&r8153_info, 143 + }, 138 144 139 145 { }, /* END */ 140 146 };