USB device speed downgraded if shared with PD

System:

  • AMD 7040 Mainboard in printed case
  • Framework supplied 32G DDR5-5600 Memory
  • WD Green SN350 2TB NVME
  • Sonnet eGPU Breakaway 750 w/ Nvidia RTX 3080 12GB

Dongle:

I have the above 8-in-1 USB C dongle that I plan to use with the above hardware. One of the advantages of this dongle is that it provides PD passthrough, thereby freeing up one of the USB C ports on the mainboard. However, I’ve noticed an issue if power is routed through the dongle. If power is routed through the dongle, the ethernet component syncs at a USB 2.0 rate (480M). If power is not routed through the dongle it syncs at a USB 3.0 rate (5000M). The only change being made here is moving the power connection everything else remains untouched.

This has a significant impact on overall maximum throughput of the ethernet connection. Sync’d at USB 2.0 rates, it maxes out at ~40MB/sec. Sync’d at USB 3.0 rates it achieves full line rate of 113MB/sec.

In the output below you’re looking for the Driver=r8152 line.

Setup:

  • eGPU - top left port
  • USB C Dongle (ethernet, PD, etc) - top right port
  • power - bottom left port
$ lsusb -t
/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/5p, 480M
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/:  Bus 003.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 480M
/:  Bus 004.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 10000M
/:  Bus 005.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/5p, 480M
        |__ Port 003: Dev 004, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 003: Dev 004, If 1, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 003: Dev 004, If 2, Class=Chip/SmartCard, Driver=usbfs, 12M
        |__ Port 004: Dev 005, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 002: Dev 007, If 0, Class=Billboard, Driver=[none], 480M
            |__ Port 003: Dev 008, If 0, Class=Human Interface Device, Driver=usbhid, 12M
            |__ Port 003: Dev 008, If 1, Class=Human Interface Device, Driver=usbhid, 12M
            |__ Port 003: Dev 008, If 2, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 005: Dev 006, If 0, Class=Billboard, Driver=[none], 480M
/:  Bus 006.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 10000M
    |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 5000M
        |__ Port 001: Dev 003, If 0, Class=Vendor Specific Class, Driver=r8152, 5000M
/:  Bus 007.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 480M
/:  Bus 008.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 10000M

Setup:

  • eGPU - top left port
  • USB C Dongle (ethernet, PD, etc) - top right port
  • power - connected to above dongle
$ lsusb -t
/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/5p, 480M
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/:  Bus 003.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 480M
/:  Bus 004.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 10000M
/:  Bus 005.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/5p, 480M
        |__ Port 001: Dev 003, If 0, Class=Vendor Specific Class, Driver=r8152, 480M
        |__ Port 003: Dev 004, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 003: Dev 004, If 1, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 003: Dev 004, If 2, Class=Chip/SmartCard, Driver=usbfs, 12M
        |__ Port 004: Dev 005, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 001: Dev 007, If 0, Class=Mass Storage, Driver=usb-storage, 480M
            |__ Port 002: Dev 008, If 0, Class=Billboard, Driver=[none], 480M
            |__ Port 003: Dev 009, If 0, Class=Human Interface Device, Driver=usbhid, 12M
            |__ Port 003: Dev 009, If 1, Class=Human Interface Device, Driver=usbhid, 12M
            |__ Port 003: Dev 009, If 2, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 005: Dev 006, If 0, Class=Billboard, Driver=[none], 480M
/:  Bus 006.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 10000M
/:  Bus 007.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 480M
/:  Bus 008.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/1p, 10000M

The same dongle with power connected to it on a Lenovo X13 syncs at the full 5000M:

Port 001: Dev 003, If 0, Class=Vendor Specific Class, Driver=r8152, 5000M
$ lsusb -t
/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=ehci-pci/1p, 480M
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/2p, 480M
    |__ Port 002: Dev 002, If 0, Class=Video, Driver=uvcvideo, 480M
    |__ Port 002: Dev 002, If 1, Class=Video, Driver=uvcvideo, 480M
    |__ Port 002: Dev 002, If 2, Class=Video, Driver=uvcvideo, 480M
    |__ Port 002: Dev 002, If 3, Class=Video, Driver=uvcvideo, 480M
    |__ Port 002: Dev 002, If 4, Class=Application Specific Interface, Driver=[none], 480M
/:  Bus 003.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 004.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 001: Dev 003, If 0, Class=Hub, Driver=hub/5p, 480M
        |__ Port 003: Dev 004, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 003: Dev 004, If 1, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 003: Dev 004, If 2, Class=Chip/SmartCard, Driver=[none], 12M
        |__ Port 004: Dev 005, If 0, Class=Hub, Driver=hub/4p, 480M
            |__ Port 002: Dev 007, If 0, Class=Billboard, Driver=[none], 480M
            |__ Port 003: Dev 008, If 0, Class=Human Interface Device, Driver=usbhid, 12M
            |__ Port 003: Dev 008, If 1, Class=Human Interface Device, Driver=usbhid, 12M
            |__ Port 003: Dev 008, If 2, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 005: Dev 006, If 0, Class=Billboard, Driver=[none], 480M
    |__ Port 002: Dev 002, If 0, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 002: Dev 002, If 1, Class=Chip/SmartCard, Driver=[none], 12M
/:  Bus 005.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/2p, 10000M
    |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 5000M
        |__ Port 001: Dev 003, If 0, Class=Vendor Specific Class, Driver=r8152, 5000M
        |__ Port 004: Dev 004, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/:  Bus 006.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 004: Dev 002, If 0, Class=Wireless, Driver=btusb, 12M
    |__ Port 004: Dev 002, If 1, Class=Wireless, Driver=btusb, 12M
/:  Bus 007.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/2p, 10000M

moved your case to linux for better visibility

This isn’t a Linux specific issue, but a BIOS issue.

thanks, moved under Framework Laptop 13 category.

I’ve verified the same behavior under Windows 11. Note the Connected to a USB 2.00 Port and USB 2.0 High-speed, but it also indicating that it recognizes it as a 3.0 device: