Ubuntu – Why does lsusb show devices connected to a USB 3 port as connected to USB2 root hub

lsusbsd cardusb

I'm running Ubuntu on a Dell Chromebook 11, which has two USB 3 ports, and an SD card reader. I was trying to establish whether the SD card reader would be capable of USB 3 speeds (and thus whether it's worth buying a 130MB/s SD card), but I can't tell whether it's physically connected to USB 3 internally.

One way I thought I might do this is to run lsusb after plugging in an SD card – however, if I plug in a USB2 device to one of the USB 3 ports, it comes up as being connected to the USB 2 hub anyway. If I put a USB 3 device into the very same port, it shows as a being connected to the USB 3 hub.

  1. Why does lsusb show USB2 devices connected to a USB3 port as being attached to the USB 2 root?
  2. Is there a way to get the physical rather than logical mapping of USB ports to hubs?
  3. Coming back to my original reason for looking into this, is there a way to tell what speed the internal SD card reader is capable of before buying one?

Best Answer

Why does lsusb show USB2 devices connected to a USB3 port as being attached to the USB 2 root?

Answer :

In USB 3.0, dual-bus architecture is used to allow both USB 2.0 (Full Speed, Low Speed, or High Speed) and USB 3.0 (SuperSpeed) operations to take place simultaneously, thus providing backward compatibility.

Source: https://en.wikipedia.org/wiki/USB_3.0

For instance, on a machine that contains two 2.0 USB ports and one USB 3.0 port, the output of the lsusb command shows:

Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 2.0 root hub 
Bus 003 Device 002: ID 8087:8004 Intel Corp. 
Bus 003 Device 001: ID 1d6b:0008 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 058f:6386 Alcor Micro Corp. Multi Flash Reader
Bus 002 Device 001: ID 1d6b:0007 Linux Foundation 3.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

The extra USB 2.0 root hub is part of the USB 3.0 root hub and is available there to provide backward compatibility with USB 2.0 standards. As a result of this, when you connect USB2 devices into USB3 port, they are shown connected to 2.0 root hub.


Is there a way to get the physical rather than logical mapping of USB ports to hubs?

Answer: Use lsusb -t

-t     Tells lsusb to dump the physical USB device hierarchy as a tree.

Source: lsusb man page


Coming back to my original reason for looking into this, is there a way to tell what speed the internal SD card reader is capable of before buying one?

This can be done by using the following steps. Here we are considering a laptop with a built-in card reader from Alcor Micro Corp.

  1. Use lsusb command

    $ lsusb 
    Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 2.0 root hub 
    Bus 003 Device 002: ID 8087:8004 Intel Corp. 
    Bus 003 Device 001: ID 1d6b:0008 Linux Foundation 2.0 root hub
    Bus 001 Device 002: ID 058f:6386 Alcor Micro Corp. Multi Flash Reader
    Bus 002 Device 001: ID 1d6b:0007 Linux Foundation 3.0 root hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    

    Find out the Bus number of the card reader. In this example it is 001

  2. Use lsusb -t

    $ lsusb -t 
    /:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M 
    |__ Port 5: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 480M
    

    At the end of each line, the negotiated communication speed for each device is shown in Mbits/s.
    The 480Mbit/s is called "Hi-Speed" and is used with USB2.0.

For USB 3.0, the negotiated communication speed is 5000Mbit/s called "SuperSpeed" (5Gbit/s)

Source: https://en.wikipedia.org/wiki/USB

Result: the card reader from Alcor Micro Corp supports USB 2.0 standards and not USB 3.0 standards as 480M was mentioned in the output.