[German]When connecting USB devices, some Windows 10 users experience an unpleasant surprise. Windows reports 'Not enough USB controller resources'. Here are some hints about the background of this error.
A description of the error
I confess, I haven't had this behavior on the radar before. Then I stumbled upon an English-language Tweet reporting that issue.
What does this mean? I'm plugging in a pair of USB-C headphones. I have zero other USB peripherals plugged in. This is a Surface Book 2. pic.twitter.com/dcbDH02YQF
— Zac Bowden (@zacbowden) September 4, 2019
But a search for the english error message brings more hits. The hit from the Microsoft Answers forum is from 2019 and describes the problem as follows:
Not Enough USB Controller Resources Windows 10 version 1809
Hello, and sorry for the long post.
I decided to upgrade my motherboard and processor after 4 years, and after installing the Aorus x470 and R7 2700x, I couldn't get more than 3 USB 2.0 devices to work at the same time. After hours of frustration and phone calls to Gigabyte, AMD, and Microsoft support, the best advice was to reinstall Windows 10 Home and Pro, multiple times. Still, the problem persisted.
Concluding that the new hardware was malfunctioning, I decided to change back to my old hardware (Gigabyte GA-B150M and I5 6500), and reinstalled my copy of Windows 10 Pro. Note that this is the hardware and OS that I was running before, and never ran into this problem, even after using 4 USB 3.0 devices and 6 USB 2.0 devices. I also never updated my copy of Windows in the past, so I was probably running on a 17xx version, not 1803 or 1809. After reinstalling my old hardware, the problem persisted. I still cannot get more than 3 USB 2.0 devices working at the same time, which is frustrating and detrimental to my work.
I have tried all sorts of driver updates, BIOS updates and flashing, Windows power options, registry editing, etc, etc. I have not been able to find a solution. My problem seems to be fairly unique, as googling has not been super helpful. I am not sure how I still have this problem, even though the hardware is the same as I had 2 days ago. The only difference is the Windows version, and the associated drivers.
Is anyone else having the problem, and found a fix? Is it a problem with Windows, or something else?
The devices I am trying to connect are:
Flash Drives / External HDD
Any combination of 3 work, more than 3 causes static in the headphones, on/off cycling, etc.
You will find similar posts within the Internet in several forums – but in most time without a solution. They suggest updating chipset driver or use a hub, what doesn't help.
The technical background
During my research I came across this reddit.com post, which provides a quite good explanation. A user, who probably also owns Oculus-Rift VR glasses, had dealt with several USB extension cables and hubs. He also came across the above error and started digging through the USB specifications. The error that not enough resources are available for the USB connection has nothing to do with the power supply, as is often assumed. Here are the explanations I have derived from his text.
- A USB port can communicate (via hub) with several devices. USB is a bus system to which up to 127 devices can theoretically be connected.
- The amount of USB devices and which devices a USB connection can handle is determined once by the power supply. But there are further criteria for communication
- A certain bandwidth must be reserved for each so-called endpoint (i.e. a connected device such as a USB mouse).
The author of the reddit post has found out that there are two situations for connecting the USB device to the USB socket.
- When a USB device establishes a connection, it creates a number of endpoints, i.e. channels that communicate to the device or back from the device to the controller. A flash drive can create 3 endpoints, an IN and OUT, and a control channel. The sensors of Oculus Rift VR glasses seem to use 7 and a USB headset at least 10 endpoints.
- The first problem is that USB 3.0 controllers have a limit of 96 endpoints per controller (is a hardware limit from Intel XHCI controllers, AMD controllers can have 254 endpoints, see 2nd post here). If the user connects enough devices, the above message appears that there are not enough USB resources available. Then USB devices will be disconnected if they are struggling for the limited number of endpoints.
- The second restriction is that each USB 3.0 port is limited to 2×16 endpoints (16 IN and 16 OUT each, see also, but almost all devices use the IN setting for the communication channels).
If a hub physically supports the connection of 2 to 4 rift sensors and each rift sensor uses 7 IN endpoints, at best 2 sensors can be connected to a USB 3.0 hub. Then the limit of 16 endpoints is exceeded for the third sensor. If a headset is connected to a hub, adding another USB device becomes a gamble. Depending on the device, the number of 16 endpoints has been exceeded.
The author of the reddit post sees it in such a way that in practice a maximum of 2 Ocolus-Rift USB-VR devices can be connected to a post. With other devices more or less devices can be operated per hub.
The whole thing is not really a bandwidth problem, since USB 3.0 has a much larger bandwidth than is required for the sensor data. It's just that USB 3.0 allows half of the channels that are possible under USB 2, writes the author of the reddit article. So if you have too few USB ports, you may not get far with a USB hub, even if it has a power supply. This is stupid for devices that come with only one USB-C socket.
What can you do?
Unfortunately, there is no utility that can specify how many EndPoints a device uses. Utilities like Uwe Sieber's USB Device Tree Viewer can show you how many controllers are available and which ports go where. The tool can also display EndPoint configurations. But a clean calculation of how many USB devices can be operated on the port is probably not possible.
Sometimes you read (like here) that you should turn off xHCI in the BIOS. Disabling xHCI in the BIOS forces all USB 3.0 ports into 2.0 mode. This does not solve the problem that only 15 endpoints are supported per USB port. This reddit.com post mentions a USB switcher tool that can be used to switch USB 2.0 posts to other controllers. This might help to reserve enough bandwidth.
Troubleshooters, as offered on some websites for automatic repair, should be avoided. You can use the wizards integrated in Windows for troubleshooting. But I am sceptical that they will solve the problem. The same applies to uninstalling and reinstalling USB drivers – if no new driver is available.
Maybe you can use USBDeView to remove the previously used USB devices and get rid of the error. This approach is also mentioned in this German forum thread. Maybe it will help – if someone knows another solution, he can leave a comment.
Cookies helps to fund this blog: Cookie settings
Thank you for your most interesting and informative resource which is so useful to this Windows 10 technician working for his friends and relatives.
Embedded USB software developer here. Wanted to chime in with some knowledge. All of the stuff written in the article seemed correct, right up until this:
"If a hub physically supports the connection of 2 to 4 rift sensors and each rift sensor uses 7 IN endpoints, at best 2 sensors can be connected to a USB 3.0 hub. Then the limit of 16 endpoints is exceeded for the third sensor. If a headset is connected to a hub, adding another USB device becomes a gamble. Depending on the device, the number of 16 endpoints has been exceeded."
This is not true. I think what you are doing here is considering that a USB "hub" acts as a physical device, so its uplink port (port connected to the host) is limited to 16/16 endpoints. Therefore the connected devices to the hub's downlink ports are limited to shared 16/16 endpoints. If that were the case, first device uses 7 IN endpoints, second device uses 7 IN endpoints (14 total), third device can't fit.. but its not the case. Find yourself a 7 port hub and connect 7 USB drives. Can you view and interact with all of them at the same time? (Assuming no other endpoint / bandwidth limitations within the host system). A minimum mass storage device will have the control endpoint (EP0 IN / OUT) and 3 other endpoints allocated. 7 devices * 5 endpoints = 35 endpoints.
A USB hub is like a network switch. The uplink port acts as a pass through from the host. Each USB device has a physical address and also within each device, each endpoint has an address. The host will "virtually" see x number of devices connected to it as if you just connected the devices straight into ports on a motherboard. Therefore (simplifying), if a hub has 4 downlink ports, the number of endpoints for that hub is 16/16 * 4 = 128 total. Each hub endpoint will "use" one of the host's endpoints. If the host controller supports 96 endpoints and the hub has 3 devices each having 10 endpoints, (96 – 10 * 3) = 66 endpoints are left over that can be used.
While hubs can "physically" and "virtually" provide ports to a host, they are limited in bandwidth due to the single uplink port. All USB data going to the downstream devices can only flow through the uplink port and will be "shared" with downstream devices. For example, if my uplink port has a bandwidth of 5gb/s (USB 3.0) and I have multiple downstream devices that each require 5gb/s bandwidth, oops, that bandwidth is shared / cut between the devices. USB hubs are good for connecting lots of devices; however, you need to be aware of how much bandwidth is available if you have high bandwidth devices. I do not know too much about VR, but I can tell you that those external devices are most likely going to be extremely high bandwidth with all that sensor data – best to have direct connections straight into the host (motherboard) than using hubs (shared port bandwidth).
With regards to figuring out how many endpoints a device is using on an OS such as windows, it is possible; however, it might not be easy for the lay person without low level USB knowledge. Basically all USB devices require a minimum 1 bidirectional endpoint allocated to a device called the "control" endpoint. The control endpoint supports the same standard operations on all devices (that's one of the reasons why every fricken USB device from USB1.0 to 3.2 to 4.0 is backwards compatible). The host queries each device upon connection through this endpoint for "descriptors". Descriptors describe all of the endpoints present and used within a device. I can't point my finger at any modern windows utility to view USB device descriptors, but I assure you, there are at least a few programs out there, because I have viewed them in the past. At a minimum, if you can understand and read USB descriptors, you can find exactly what endpoints the device is using, their data direction (IN / OUT) and what type they are.
I had a similar issue recently. TLDR: if this happened with some kind of headphones, try lowering the sample rate and bit depth. I also think that it applies to any other device: if you can control the bandwidth of the data transferred between device and PC — lower it to minimal value and then slowly raise it to the highest working value.
I got myself a pair of USB-C earphones with a built-in microphone. They were working just fine when I plugged them into my phone, but on PC weird issues appeared. The playback was fine, but when I tried to engage the mic (e.g. entered the Zoom, Skype, or Discord call, etc), the "Not enough USB Controller resources" error appeared. I was a bit worried and tried a lot of stuff (e.g. rebooting a few times, shuffling and enabling/disabling playback/record devices, plugging into a different USB port, etc) but nothing helped. It always crashed when the microphone was required.
Once when I was looking through my device configuration I noticed that my configured sample rate and bit depth were 32 bit, 96000 Hz — a bit overkill for an ordinary laptop earphone. This configuration is usually set to some default value by the device itself, and I usually don't touch it. This time I lowered the values to 24 bit, 48000 Hz — and everything started working! I was able to use the playback and record with no issue.
I believe that the device was a bit overwhelmed with 32 bit, 96000 Hz bandwidth. Lowering the sample rate and bit depth allowed to lower the data transfer rate and free up a slot for a microphone to work.
So. If you can somehow lower the data transfer bandwidth between your PC and a "bad" device — give it a try.
Omg thank you so much for posting this reply, you saved me!! I was experiencing the exact same situation as you were, and this solution worked.
muchas gracias me funciono su solucion.
(thanks, this info worked on my usb problem.)
Thank you, this worked for me as well! For anyone else troubleshooting this on Windows 10, the setting to lower the sample rate and bit depth can be found under Sound settings -> Device properties (under output or input) -> Additional device properties -> Advanced.
Thank you for highlighting where to look for Sound setting, this really solve my problems.
Yes, thank you very much!
What Elon Musk said works! I downgraded the mic quality to 24bit 96000 and it makes my mic works again.
FINALLY! Nobody else had a solution. I have a pair of Samsung USB-C earbuds with a built-in DAC. My laptop dutifully set the sound quality to the very highest level, and then promptly told me it didn't have enough resources to use it. Setting the sound quality to DVD Quality solved the problem.
The program USB device Tree is very good. You can see how many endpoint for every root hub. (In my case Sum of Endpoints : 11)