diff mbox series

[v2] net-next: cdc_ether|r8152: ThinkPad Hybrid USB-C/A Dock quirk

Message ID f736f5bd20e465656ebe2cc2e7be69c0ada852e3.1741627632.git.p.hahn@avm.de (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series [v2] net-next: cdc_ether|r8152: ThinkPad Hybrid USB-C/A Dock quirk | expand

Checks

Context Check Description
netdev/series_format warning Single patches do not need cover letters; Target tree name not specified in the subject
netdev/tree_selection success Guessed tree name to be net-next
netdev/ynl success Generated files up to date; no warnings/errors; no diff in generated;
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 0 this patch: 0
netdev/build_tools success No tools touched, skip
netdev/cc_maintainers warning 2 maintainers not CCed: dianders@chromium.org hayeswang@realtek.com
netdev/build_clang success Errors and warnings before: 0 this patch: 0
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 0 this patch: 0
netdev/checkpatch warning CHECK: Alignment should match open parenthesis WARNING: line length of 85 exceeds 80 columns WARNING: line length of 89 exceeds 80 columns
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
netdev/contest success net-next-2025-03-11--12-00 (tests: 894)

Commit Message

Philipp Hahn March 11, 2025, 10:21 a.m. UTC
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: 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(+)

Comments

Kory Maincent March 11, 2025, 2:32 p.m. UTC | #1
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 mbox series

Patch

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 */
 };