Skip to content

Commit 484b036

Browse files
pmhahnjfvogel
authored andcommitted
cdc_ether|r8152: ThinkPad Hybrid USB-C/A Dock quirk
[ 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 <[email protected]> Cc: Jakub Kicinski <[email protected]> Cc: Oliver Neukum <[email protected]> (maintainer:USB CDC ETHERNET DRIVER) Cc: [email protected] (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 <[email protected]> Reviewed-by: Kory Maincent <[email protected]> Link: https://patch.msgid.link/484336aad52d14ccf061b535bc19ef6396ef5120.1741601523.git.p.hahn@avm.de Signed-off-by: Paolo Abeni <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit a8a8076210c24fe7121e3c6b7c8caf89d5ae65d5) Signed-off-by: Jack Vogel <[email protected]>
1 parent 1dba3b5 commit 484b036

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

drivers/net/usb/cdc_ether.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,13 @@ static const struct usb_device_id products[] = {
783783
.driver_info = 0,
784784
},
785785

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+
786793
/* Aquantia AQtion USB to 5GbE Controller (based on AQC111U) */
787794
{
788795
USB_DEVICE_AND_INTERFACE_INFO(AQUANTIA_VENDOR_ID, 0xc101,

drivers/net/usb/r8152.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,7 @@ enum rtl8152_flags {
785785
#define DEVICE_ID_THINKPAD_USB_C_DONGLE 0x720c
786786
#define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2 0xa387
787787
#define DEVICE_ID_THINKPAD_USB_C_DOCK_GEN3 0x3062
788+
#define DEVICE_ID_THINKPAD_HYBRID_USB_C_DOCK 0xa359
788789

789790
struct tally_counter {
790791
__le64 tx_packets;
@@ -9787,6 +9788,7 @@ static bool rtl8152_supports_lenovo_macpassthru(struct usb_device *udev)
97879788
case DEVICE_ID_THINKPAD_USB_C_DOCK_GEN2:
97889789
case DEVICE_ID_THINKPAD_USB_C_DOCK_GEN3:
97899790
case DEVICE_ID_THINKPAD_USB_C_DONGLE:
9791+
case DEVICE_ID_THINKPAD_HYBRID_USB_C_DOCK:
97909792
return 1;
97919793
}
97929794
} else if (vendor_id == VENDOR_ID_REALTEK && parent_vendor_id == VENDOR_ID_LENOVO) {
@@ -10064,6 +10066,8 @@ static const struct usb_device_id rtl8152_table[] = {
1006410066
{ USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927) },
1006510067
{ USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0c5e) },
1006610068
{ USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101) },
10069+
10070+
/* Lenovo */
1006710071
{ USB_DEVICE(VENDOR_ID_LENOVO, 0x304f) },
1006810072
{ USB_DEVICE(VENDOR_ID_LENOVO, 0x3054) },
1006910073
{ USB_DEVICE(VENDOR_ID_LENOVO, 0x3062) },
@@ -10074,7 +10078,9 @@ static const struct usb_device_id rtl8152_table[] = {
1007410078
{ USB_DEVICE(VENDOR_ID_LENOVO, 0x720c) },
1007510079
{ USB_DEVICE(VENDOR_ID_LENOVO, 0x7214) },
1007610080
{ USB_DEVICE(VENDOR_ID_LENOVO, 0x721e) },
10081+
{ USB_DEVICE(VENDOR_ID_LENOVO, 0xa359) },
1007710082
{ USB_DEVICE(VENDOR_ID_LENOVO, 0xa387) },
10083+
1007810084
{ USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) },
1007910085
{ USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) },
1008010086
{ USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) },

drivers/net/usb/r8153_ecm.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,12 @@ static const struct usb_device_id products[] = {
135135
USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
136136
.driver_info = (unsigned long)&r8153_info,
137137
},
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+
},
138144

139145
{ }, /* END */
140146
};

0 commit comments

Comments
 (0)