On Tue, Jul 27, 2021 at 11:15:11AM +1000, Eyal Lebedinsky wrote:
I know that device numbers change, but bus/port numbers are stable and reflect the physical layout
of the hubs and devices. I relied for years on these port numbers to identify specific (otherwise
identical) devices.
Port numbers are stable. Bus numbers aren't. (They do tend to be stable
but there are no guarantees.)
Searching the list (I am now subscribed) and the web did not yield an answer.
For example, I have two TEMPer temperature sensor devices attached. They are both plugged into
a 4-port USB3 hub. They are on ports 3 and 4. Port 2 is unused and port 1 has a bluetooth radio
attached. I also have 5 dvb usb tuners which stayed in their old positions.
Until now (fedora 34, last on 5.12.17-300.fc34.x86_64), I would see this:
$ lsusb
Bus 001 Device 013: ID 0c45:7401 Microdia TEMPer Temperature Sensor
Bus 001 Device 025: ID 0c45:7401 Microdia TEMPer Temperature Sensor
$ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 10000M
|__ Port 4: Dev 2, If 0, Class=Hub, Driver=hub/4p, 5000M
|__ Port 4: Dev 4, If 0, Class=Hub, Driver=hub/4p, 5000M
|__ Port 5: Dev 3, If 0, Class=Hub, Driver=hub/4p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M
|__ Port 2: Dev 26, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 27, If 1, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 2: Dev 27, If 0, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 4: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 3: Dev 10, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 3: Dev 10, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 1: Dev 6, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 1: Dev 6, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 4: Dev 12, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 3: Dev 15, If 0, Class=Printer, Driver=usblp, 12M
|__ Port 1: Dev 14, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 1: Dev 14, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 4: Dev 16, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 4: Dev 16, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 2: Dev 8, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 2: Dev 8, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 5: Dev 5, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 1: Dev 20, If 0, Class=Wireless, Driver=btusb, 12M
|__ Port 1: Dev 20, If 1, Class=Wireless, Driver=btusb, 12M
|__ Port 3: Dev 25, If 0, Class=Human Interface Device, Driver=, 1.5M <<<<<
|__ Port 3: Dev 25, If 1, Class=Human Interface Device, Driver=, 1.5M <<<<<
|__ Port 4: Dev 13, If 0, Class=Human Interface Device, Driver=, 1.5M <<<<<
|__ Port 4: Dev 13, If 1, Class=Human Interface Device, Driver=, 1.5M <<<<<
|__ Port 6: Dev 19, If 0, Class=Human Interface Device, Driver=usbfs, 1.5M
The TEMPer devices show on Bus 01 as was always:
Port 5.Port 3 (Dev 11)
In fact it is device 25; see above. There is o device 11 in the lsusb
output.
Port 5.Port 4 (Dev 13)
After rebooting the newly installed kernel 5.13.4-200.fc34.x86_64 I get:
$ lsusb
Bus 001 Device 012: ID 0c45:7401 Microdia TEMPer Temperature Sensor
Bus 001 Device 003: ID 0c45:7401 Microdia TEMPer Temperature Sensor
$ lsusb -t
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 10000M
|__ Port 4: Dev 2, If 0, Class=Hub, Driver=hub/4p, 5000M
|__ Port 4: Dev 4, If 0, Class=Hub, Driver=hub/4p, 5000M
|__ Port 5: Dev 3, If 0, Class=Hub, Driver=hub/4p, 5000M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M
|__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 4, If 1, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 2: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 3: Dev 3, If 0, Class=Human Interface Device, Driver=, 1.5M <<<<<
|__ Port 3: Dev 3, If 1, Class=Human Interface Device, Driver=, 1.5M <<<<<
|__ Port 4: Dev 5, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 3: Dev 11, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 3: Dev 11, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 1: Dev 7, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 1: Dev 7, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 4: Dev 13, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 3: Dev 15, If 0, Class=Printer, Driver=usblp, 12M
|__ Port 1: Dev 14, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 1: Dev 14, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 4: Dev 16, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 4: Dev 16, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 2: Dev 9, If 0, Class=Vendor Specific Class, Driver=dvb_usb_rtl28xxu, 480M
|__ Port 2: Dev 9, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 5: Dev 6, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 1: Dev 10, If 0, Class=Wireless, Driver=btusb, 12M
|__ Port 1: Dev 10, If 1, Class=Wireless, Driver=btusb, 12M
|__ Port 3: Dev 12, If 0, Class=Human Interface Device, Driver=, 1.5M <<<<<
|__ Port 3: Dev 12, If 1, Class=Human Interface Device, Driver=, 1.5M <<<<<
|__ Port 6: Dev 18, If 0, Class=Human Interface Device, Driver=usbfs, 1.5M
One can see that the TEMPer devices are now showing on Bus 01 but in separate positions:
Port 3 (Dev 3) new position
Port 5.Port 3 (Dev 12) old position
Are you certain that device 3 really is one of the TEMPer devices and not
something else?
This, naturally, confuses my script that collects the data from these sensors (I use temper-poll).
Are you certain you didn't change the wiring? I can't think of any other
explanation.
Is this an intentional change?
Nope.
If so then what is the way to stably disambiguate usb devices (there is no s/n available)?
Using port paths is a fairly good way to go. Unless the devices get
unplugged and then plugged back into different ports.
If no change was expected then does this reflect a possible hwr problem here?
No, it represents a physical impossibility. Consider the following thought
experiment: You unplug the four-port hub that is device 6 on bus 1 (port
5). That will of course also disconnect anything that is plugged into that
hub, presumably including your two temperature sensors. But if one of them
is plugged into port 3 of the root hub instead, it won't be affected by
this operation. So what really happens?