Different speed of USB control transfers for HS USB devices depending on used USB port

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello USB maintainers,

I've seen the following unexpected behavior with respect to EP0
control transfers:

The speed of control transfers for HS devices varies quite much
depending on which USB port of a system is used. The problem can be
replicated on different systems with different chipsets and for any HS
device I have tested.

Here is a concrete example:
- mainboard: MSI B550 GAMING GEN3 (MS-7B86)
- Linux kernel: Fedora's 6.11.10-200 kernel

The mainboard has two AMD USB HCs:
02:00.0 USB controller: Advanced Micro Devices, Inc. [AMD] 500 Series
Chipset USB 3.1 XHCI Controller
2f:00.3 USB controller: Advanced Micro Devices, Inc. [AMD] Matisse USB
3.0 Host Controller

I have monitored the USB low-level transfers with a HW USB analyzer.

a) control transfers slow: HS device connected to back panel USB2.0 port (black)
/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/10p, 480M
    |__ Port 010: Dev 042, If 0, Class=Mass Storage, Driver=usb-storage, 480M
- the USB transactions (SETUP, IN, OUT, ...) happen every millisecond
and there are 8 SOFs between each of them
- the USB analyzer shows the following transactions (e.g. for a
GetDescriptor transfer):
    - 8x SOF
    - SETUP transaction
    - 8x SOF
    - IN transaction
    - 8x SOF
(depending on the descriptor size more IN transactions interleaved with 8 SOFs:
    - IN transaction
    - 8x SOF
    ... )
    - OUT transaction

b) control transfers slow: HS device connected to back panel USB3.x (red)
/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/10p, 480M
    |__ Port 001: Dev 043, If 0, Class=Mass Storage, Driver=usb-storage, 480M
- same behavior as a)

c) control transfers fast: HS device connected to back panel USB3 port (blue)
/:  Bus 003.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 001: Dev 046, If 0, Class=Mass Storage, Driver=usb-storage, 480M
- there is only a single SOF between between the SETUP, IN and OUT transactions
- multiple IN transactions are combined in one frame (e.g. for larger
descriptors)
- the USB analyzer shows the following transactions (e.g. for a
GetDescriptor transfer):
    - 1x SOF
    - SETUP transaction
    - 1x SOF
    - IN transaction
(depending on the descriptor size more IN transactions without SOFs)
    - IN transaction
    - ... )
    - 1x SOF
    - OUT transaction

Note: The timing can best be seen with a HW USB analyzer. Monitoring
/dev/usbmonx with wireshark still gives a good indication in the "Time
from request" in the "USB URB" section: for cases a) and b) the time
would be 2-5ms and for case c) it would be < 1ms for a GetDescriptor
request of a simple HS USB stick.

The behavior of case a) or b) makes control transfers with larger data
stages approx. 50 times slower.

Is that behavior an expected HW limitation or does it point to some
kind of SW issue?

I'm happy to help debug the issue. If you want me to do any debugging
steps or provide any additional information, please let me know!


Best regards,
Christian




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux