Message ID | f736f5bd20e465656ebe2cc2e7be69c0ada852e3.1741627632.git.p.hahn@avm.de (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [v2] net-next: cdc_ether|r8152: ThinkPad Hybrid USB-C/A Dock quirk | expand |
On Tue, 11 Mar 2025 11:21:34 +0100 Philipp Hahn <phahn-oss@avm.de> wrote: > 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. It seems patchwork detects it for net-next tree but nonetheless the subject of your patch should look like this: [PATCH net-next v2] cdc_ether|r8152: ThinkPad Hybrid USB-C/A Dock quirk Regards, > Cc: Oliver Neukum <oliver@neukum.org> > Cc: Andrew Lunn <andrew+netdev@lunn.ch> > Cc: "David S. Miller" <davem@davemloft.net> > Cc: Eric Dumazet <edumazet@google.com> > Cc: Jakub Kicinski <kuba@kernel.org> > Cc: Paolo Abeni <pabeni@redhat.com> > Cc: linux-usb@vger.kernel.org > Cc: netdev@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > Cc: Leon Schuermann <leon@is.currently.online> > 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> --- > V1 -> V2: Prefix subject with `net-next:` > V1 -> V2: Add additional Cc:s > drivers/net/usb/cdc_ether.c | 7 +++++++ > drivers/net/usb/r8152.c | 6 ++++++ > drivers/net/usb/r8153_ecm.c | 6 ++++++ > 3 files changed, 19 insertions(+) > > diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c > index a6469235d904..a032c1ded406 100644 > --- a/drivers/net/usb/cdc_ether.c > +++ b/drivers/net/usb/cdc_ether.c > @@ -783,6 +783,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, > diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c > index 468c73974046..96fa3857d8e2 100644 > --- a/drivers/net/usb/r8152.c > +++ b/drivers/net/usb/r8152.c > @@ -785,6 +785,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; > @@ -9787,6 +9788,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) { @@ -10064,6 +10066,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) }, > @@ -10074,7 +10078,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) }, > diff --git a/drivers/net/usb/r8153_ecm.c b/drivers/net/usb/r8153_ecm.c > index 20b2df8d74ae..8d860dacdf49 100644 > --- a/drivers/net/usb/r8153_ecm.c > +++ b/drivers/net/usb/r8153_ecm.c > @@ -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 */ > };
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index a6469235d904..a032c1ded406 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -783,6 +783,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, diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 468c73974046..96fa3857d8e2 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -785,6 +785,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; @@ -9787,6 +9788,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) { @@ -10064,6 +10066,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) }, @@ -10074,7 +10078,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) }, diff --git a/drivers/net/usb/r8153_ecm.c b/drivers/net/usb/r8153_ecm.c index 20b2df8d74ae..8d860dacdf49 100644 --- a/drivers/net/usb/r8153_ecm.c +++ b/drivers/net/usb/r8153_ecm.c @@ -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 */ };