Why can't I connect more USB 3.0 devices to my system?

2019 May 23

Some customers who have been using multiple Acroname USBHub3+ hubs have shared with us that they cannot add more than two USBHub3+ hubs to their system or that they are running out of USB resources. As it happens, this is not a limitation of USBHub3+ itself, but rather a limitation of the host USB controller and the host machine's implementation of the USB controller. Let's take a deep dive to understand where this limitation comes from:

The USB specification defines two different connectivity types in the USB tree topology: number of layers or tiers and number of endpoints or functions. Note that endpoints are not the same thing as devices. Layers are commonly thought of as hubs, where each hub is, in fact, its own USB device as well as the start of a new layer of USB devices. Here is a good illustration of a USB tree showing a host USB controller, which is always at the root level, with 4 tiers of USB hubs below and a total of 7 devices or functions:

The USB specification is limited to maximum 7 layers. Each device can define up to 32 end points (16 input and 16 outpus, but one must be a control endpoint), but most devices only define 2 or 3 endpoints (e.g. data in, data out, and a control endpoint). Every USB controller implementation may have its own layer or endpoint limitations. Most host systems have just one USB controller that is integrated in the host system chipset. Here, you can see a diagram of a typical PC architecture. We have expanded the diagram to expand on the USB section, showing the USB Type A connectors:

 

What is not commonly known is that many host machines use hub chips internally to expand the number of available USB connectors. So, it is possible that the USB connector on your host machine is already one or even two tiers deep in the overall USB tree:

 

 

Most modern USB 3.0 hosts use eXtensible Host Controller Interface (XHCI) USB controllers. The XHCI specification allows for a massive 7,906 enpoints! However, common implementations of the XHCI controllers impose their own limit on the total number of endpoints to 96. The most notorious of these Intel's series 8 architectures. This means that the maximum number of common devices which use 3 endpoints able to be attached to an Intel series 8 XHCI host controller is actually 96 endpoints / 3 endpoints per device = 32 devices. This is a known limitation of Intel-based XHCI controllers:
https://communities.intel.com/thread/52417 (unfortunately Intel removed this thread)
 

To make matters worse, USB 3.0 buses live in a strange dual existence with USB 2.0 devices. That is, they live in the similar yet separate tree architecture in parallel with USB 2.0 devices, but they share the same endpoints on XHCI controllers. USB 3.0 devices may implement endpoints on  both the USB 3.0 and 2.0 buses. This will even furhter reduce the number of devices which can be attached to a single XHCI host controller.

Architecturally, 8-port USB hubs implement their 8-port configuration by internally cascading USB hub chips. Each individual hub chip contains both a USB 2.0 device as well as a USB 3.0 device. USBHub3+ is no different and we can see this architecture clearly in the USBHub3+ datasheet:

You can now see that each USBHub3+ unit is actually comprised of three hub chips in two internal hub layers: Hub A on one layer and Hub1/Hub2 on a second layer. Remember that each hub chip itself contains a USB 2.0 and a USB 3.0 device which will be added to  the system USB tree. Given these 3 internal hub chips, each USBHub3+ adds 2 layers to the USB tree and represents 6 devices (3 hub chips * 2 devices per hub chip).

Going back to example of the commonly available Intel XHCI-based host system, the integrated controller supports a maximum of 32 available USB devices. If we use 8-port USB 3.0 hubs to connect devices to our host machine, this means that you could attach 18 total devices:

HUB #1 (1 hubs * 6 devices / hub) + 8 attached devices = 14 devices +
HUB #2 (1 hubs * 6 devices / hub) + 8 attached devices = 14 devices +
HUB #3 (1 hubs * 6 devices / hub) + 2 attached devices = 8 devices
= 32 total devices for XHCI

What also begins to become clear is that if the USBHub3+ adds 2 layers to the USB tree, you quickly get to the maximum USB layer count in your system by daisy-chaining 3 USBHub3+ units. This number can be further impacted by a host machine where the USB connectors are already expanded by internal hubs. In practice, the Acroname support team has seen most host machines are able to support daisy-chain configurations of up to 2 USBHub3+ hubs. Some hosts which do not use internal hubs can support up to 3 USBHub3+ hubs.

 

SOLUTIONS:

Those are the limitations… so what are the solutions?

Force your system to use EHCI instead of XHCI (Linux)
Thanks to Marc Merlins for pointing out the magic to force your system to use EHCI instead of XHCI. Unfortunately, this will limti all devices to USB 2.0 speeds.
More information on the limitations of Intel's XHCI
More information on Linux driver

Force your system to use EHCI instead of XHCI (Windows)
Similar to the method above for Linux, Alexx999 made a tool to set BIOS flags to use the EHCI controller on Windows systems: Intel USB Controller Switcher

Use a USB 2.0 cable from your host to USBHub3+:
If you need to add more than 18 total devices to your XHCI system and you do not need USB 3.0 performance, the simplest solution is to use a USB 2.0 host cable to connect your host to USBHub3+. Since the USBHub3+ is now connected only with USB 2.0, there will not be any enumeration of USB 3.0 devices, including the USB 3.0 hub chips internal to USBHub3+. This will effectively reduce the USBHub3+ footprint in your USB tree from 6 devices to 3 devices.

Add a discrete USB controller to your host:
If you need to add substantially more USB devices to your host, the main limitation is likely the integrated Intel XHCI USB host controller. Discrete USB host controllers do not typically have this limitation. Adding a discrete USB host controller in a PCIe expansion slot is a great way to expand the total tree and number of devices available.

Remove un-needed internal device:
You can disable all unused USB devices such as audio line inputs. Find where and what devices are attached to your host controller:
https://www.intel.com/content/www/us/en/support/articles/000005622/softw...
Then disable ones you aren't using such as Bluetooth, audio devices, finger print readers, cameras, etc.