USB address allocation

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
rdos
Member
Member
Posts: 3306
Joined: Wed Oct 01, 2008 1:55 pm

USB address allocation

Post by rdos »

Are the USB addresses allocated per controller or per system or per some other grouping? I wonder because I've seen USB implementations where everything that is sent seems to be sent out on each of the USB ports. In such a configuration, USB addresses would need to be per system. OTOH, logically speaking, they should be per controller.

Anybody know how this is typically implemented?
User avatar
thepowersgang
Member
Member
Posts: 734
Joined: Tue Dec 25, 2007 6:03 am
Libera.chat IRC: thePowersGang
Location: Perth, Western Australia
Contact:

Re: USB address allocation

Post by thepowersgang »

USB addresses are able to be per controller, but I guess some systems may do per system. On a typical system, there is only one USB2 controller, so that may be what you are seeing.
Kernel Development, It's the brain surgery of programming.
Acess2 OS (c) | Tifflin OS (rust) | mrustc - Rust compiler
Currently Working on: mrustc
rdos
Member
Member
Posts: 3306
Joined: Wed Oct 01, 2008 1:55 pm

Re: USB address allocation

Post by rdos »

thepowersgang wrote:USB addresses are able to be per controller, but I guess some systems may do per system. On a typical system, there is only one USB2 controller, so that may be what you are seeing.
On my test computer there are two controllers (at least two devices) which are attached to one USB hub each with 6 ports per hub. I have some really strange issues that seems to be related to multitasking. Each hub creates it's own thread, and then goes along to RESET and enumerate it's ports, but this malfunctions for some strange reason. It seems like it works if these processes are run in a sequence instead, because then no two devices could be in RESET state and with an 0 address at the same time. Apparently, it is the address assign command which gives a STALL back.
User avatar
thepowersgang
Member
Member
Posts: 734
Joined: Tue Dec 25, 2007 6:03 am
Libera.chat IRC: thePowersGang
Location: Perth, Western Australia
Contact:

Re: USB address allocation

Post by thepowersgang »

Well, addresses should be unique per controller. Because of that, only one device should be reset at once (per controller, because a reset device answers to 0 until it's told a real address).

I assume you're referring to your own USB stack here, are you sure there's two distinct controllers, and not just two ports?
Kernel Development, It's the brain surgery of programming.
Acess2 OS (c) | Tifflin OS (rust) | mrustc - Rust compiler
Currently Working on: mrustc
rdos
Member
Member
Posts: 3306
Joined: Wed Oct 01, 2008 1:55 pm

Re: USB address allocation

Post by rdos »

At least at the PCI level, there are two devices:

Code: Select all

ACPI: .\_SB_.PCI0.EHC1, Vendor: 8086, Device: 1E26, Bus: 0, Dev: 29, Func: 0, IRQ: 23
ACPI: .\_SB_.PCI0.EHC2, Vendor: 8086, Device: 1E2D, Bus: 0, Dev: 26, Func: 0, IRQ: 16
rdos
Member
Member
Posts: 3306
Joined: Wed Oct 01, 2008 1:55 pm

Re: USB address allocation

Post by rdos »

I think I know what the problem is. Apparently, I try to optimize the start of the hub-ports, and thus I RESET all three permanently attached devices at the same time, creating 3 devices with a 0 address.

There must be a lock per controller that stops multiple RESETs of ports on multiple hubs or root ports at the same time.
Post Reply