Re: usb port enumeration changed? [resolved]

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

 



See end of message.

On 27/07/2021 12.23, Alan Stern wrote:
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?

Seeing the confidence of the reply I decided to do more testing.
- booting the old kernel did not fix it.
- unplugging and re-plugging the devices did not help.

I then crawled under the table and followed the large cables bundle to find that I should have
trusted my instruments (the USB system).

While the correct cable was plugged into the correct socket, the far end used an extension which
*was* plugged into the wrong thing. I then remembered that at one time the cable was pulled off
accidentally and quickly re-attached...

In short, I am stupid and apology for the noise.

Alan Stern

Regards,

--
Eyal Lebedinsky (eyal@xxxxxxxxxxxxxx)



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

  Powered by Linux