<div dir="ltr"><div>Seems like that could be it. I had been looking at ACPI/BIOS too, as when I went looking online for mentions of missing peer links a comment alluded to that possibly being an issue.</div><div><br></div><div>My linux is a buildroot build so I will be able to patch it and get back to you, thanks.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On 24 January 2018 at 12:48, Bjørn Mork <span dir="ltr"><<a href="mailto:bjorn@mork.no" target="_blank">bjorn@mork.no</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I guess we need USB/xhci experts if we want an explaination. It all<br>
looks completely wrong to me.<br>
<br>
Made another attempt on understanding drivers/usb/core/port.c, and I<br>
now have a working theory. The real magic happens here, and the comment<br>
hints where this cold go wrong - The "platform firmware" is trusted oever<br>
anything else:<br>
<br>
/*<br>
* Find the peer port either via explicit platform firmware "location"<br>
* data, the peer hcd for root hubs, or the upstream peer relationship<br>
* for all other hubs.<br>
*/<br>
static void find_and_link_peer(struct usb_hub *hub, int port1)<br>
{<br>
struct usb_port *port_dev = hub->ports[port1 - 1], *peer;<br>
struct usb_device *hdev = hub->hdev;<br>
struct usb_device *peer_hdev;<br>
struct usb_hub *peer_hub;<br>
<br>
/*<br>
* If location data is available then we can only peer this port<br>
* by a location match, not the default peer (lest we create a<br>
* situation where we need to go back and undo a default peering<br>
* when the port is later peered by location data)<br>
*/<br>
if (port_dev->location) {<br>
/* we link the peer in match_location() if found */<br>
usb_for_each_dev(port_dev, match_location);<br>
return;<br>
} else if (!hdev->parent) {<br>
struct usb_hcd *hcd = bus_to_hcd(hdev->bus);<br>
struct usb_hcd *peer_hcd = hcd->shared_hcd;<br>
<br>
if (!peer_hcd)<br>
return;<br>
<br>
peer_hdev = peer_hcd->self.root_hub;<br>
} else {<br>
..<br>
<br>
<br>
<br>
The enabling magic is in drivers/usb/core/usb-acpi.c:<br>
<br>
status = acpi_get_physical_device_<wbr>location(handle, &pld);<br>
if (ACPI_FAILURE(status) || !pld)<br>
return adev;<br>
<br>
port_dev->location = USB_ACPI_LOCATION_VALID<br>
| pld->group_token << 8 | pld->group_position;<br>
<br>
<br>
So this depens on the BIOS vendor managing to get the<br>
"physical_device_location" correct (or at least equal) for both ports.<br>
If ACPI tells us that the port locations are different, or that only one<br>
of the ports have a location, then there will be no peer relationship.<br>
<br>
I tried to figure out if there exists a simple way to make the kernel<br>
tell us what happens when it calls acpi_get_physical_device_<wbr>location(),<br>
but I did not find much. This call will most likely return something<br>
into &pld. The real question is what that is. And I see no way to<br>
figure it out without patching the kernel.<br>
<br>
We should fix that. A simple straight forward fix would be something<br>
like the attached patch. Are you in a position to test that? It would<br>
be good if we could confirm the theory that your BIOS gets this wrong.<br>
How you do that depend a bit on your system. With a default Debian<br>
stable kernel, this is how I tested it:<br>
<br>
bjorn@miraculix:/usr/local/<wbr>src/git/linux$ uname -a<br>
Linux miraculix 4.9.0-5-amd64 #1 SMP Debian 4.9.65-3+deb9u2 (2018-01-04) x86_64 GNU/Linux<br>
bjorn@miraculix:/usr/local/<wbr>src/git/linux$ git checkout -b test-v4.9.65 v4.9.65<br>
Switched to a new branch 'test-v4.9.65'<br>
bjorn@miraculix:/usr/local/<wbr>src/git/linux$ git am /tmp/0001-usb-export-firmware-<wbr>port-location-in-sysfs.patch<br>
Applying: usb: export firmware port location in sysfs<br>
bjorn@miraculix:/usr/local/<wbr>src/git/linux$ make -C /lib/modules/`uname -r`/build SUBDIRS=`pwd`/drivers/usb/core usbcore.ko<br>
make: Entering directory '/usr/src/linux-headers-4.9.0-<wbr>5-amd64'<br>
CC [M] /usr/local/src/git/linux/<wbr>drivers/usb/core/port.o<br>
LD [M] /usr/local/src/git/linux/<wbr>drivers/usb/core/usbcore.o<br>
MODPOST 1 modules<br>
LD [M] /usr/local/src/git/linux/<wbr>drivers/usb/core/usbcore.ko<br>
make: Leaving directory '/usr/src/linux-headers-4.9.0-<wbr>5-amd64'<br>
<br>
<br>
It's fully possible to test without rebooting. The hard part is to<br>
unload all USB modules. Use lsmod to figure out what you need to<br>
unload. I did (yes, I have tested many different USB devices since my<br>
last reboot, so I had lots of USB drivers to unload):<br>
<br>
# modprobe -r usbmon usbhid uas usb_storage btusb ax88179_178a cdc_mbim qmi_wwan cdc_ncm<br>
# modprobe -r qcserial option cp210x pl2303<br>
modprobe: FATAL: Module qcserial is in use.<br>
# systemctl stop ModemManager<br>
# modprobe -r qcserial option cp210x pl2303<br>
# modprobe -r uvcvideo pegasus xpad xhci_pci xhci_hcd<br>
<br>
<br>
Then loading a minimum of the drivers, only this time with the newly<br>
build usbcore.ko:<br>
<br>
# modprobe usb_common<br>
# insmod /usr/local/src/git/linux/<wbr>drivers/usb/core/usbcore.ko<br>
# modprobe xhci_pci<br>
<br>
The rest will autoload at this point. The patch will simply show<br>
whatever 'location' we got from ACPI in sysfs:<br>
<br>
bjorn@miraculix:/usr/local/<wbr>src/git/linux$ grep . /sys/bus/usb/devices/usb*/*-0\<wbr>:1.0/usb*-port*/location<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port10/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port11/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port12/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port1/location:<wbr>0x80000001<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port2/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port3/location:<wbr>0x80000002<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port4/location:<wbr>0x80000004<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port5/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port6/location:<wbr>0x80000003<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port7/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port8/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port9/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port1/location:<wbr>0x80000001<br>
/sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port2/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port3/location:<wbr>0x80000002<br>
/sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port4/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port5/location:<wbr>0x80000000<br>
/sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port6/location:<wbr>0x80000003<br>
<br>
<br>
The high bit is the USB_ACPI_LOCATION_VALID quoted above, telling us<br>
that my firmware did return a valid acpi_get_physical_device_<wbr>location()<br>
result for every port, as expected. And you can easily see how the peer<br>
ports align up. But you can also easily see the kernel bug here... The<br>
resulting peer relationships are:<br>
<br>
bjorn@miraculix:/usr/local/<wbr>src/git/linux$ ls -ld /sys/bus/usb/devices/usb*/*-0:<wbr>1.0/usb*-port*/peer<br>
lrwxrwxrwx 1 root root 0 Jan 24 13:36 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port1/peer -> ../../../usb2/2-0:1.0/usb2-<wbr>port1<br>
lrwxrwxrwx 1 root root 0 Jan 24 13:36 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port2/peer -> ../../../usb2/2-0:1.0/usb2-<wbr>port2<br>
lrwxrwxrwx 1 root root 0 Jan 24 13:36 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port3/peer -> ../../../usb2/2-0:1.0/usb2-<wbr>port3<br>
lrwxrwxrwx 1 root root 0 Jan 24 13:36 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port6/peer -> ../../../usb2/2-0:1.0/usb2-<wbr>port6<br>
lrwxrwxrwx 1 root root 0 Jan 24 13:36 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port1/peer -> ../../../usb1/1-0:1.0/usb1-<wbr>port1<br>
lrwxrwxrwx 1 root root 0 Jan 24 13:36 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port2/peer -> ../../../usb1/1-0:1.0/usb1-<wbr>port2<br>
lrwxrwxrwx 1 root root 0 Jan 24 13:36 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port3/peer -> ../../../usb1/1-0:1.0/usb1-<wbr>port3<br>
lrwxrwxrwx 1 root root 0 Jan 24 13:36 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port6/peer -> ../../../usb1/1-0:1.0/usb1-<wbr>port6<br>
<br>
<br>
But the 'usb1-port2 <-> usb2-port2' connection is in fact bogus, and<br>
completely arbitrary. There are a number of matching locations. These<br>
two were only chosen because they happened to be first on the list.<br>
<br>
Now, that does not matter much for me, because these ports are not in<br>
use:<br>
<br>
bjorn@miraculix:/usr/local/<wbr>src/git/linux$ grep . /sys/bus/usb/devices/usb*/*-0\<wbr>:1.0/usb*-port2/connect_type<br>
/sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port2/connect_type:<wbr>not used<br>
/sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port2/connect_type:<wbr>not used<br>
<br>
<br>
But I believe it should be fixed. I guess I'll end up sending more than<br>
one patch here. But let's first figure out if my suspicion is<br>
justified, or if the BIOS vendor is innocent after all.<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
<br>
<br>
Bjørn<br>
<br>
<br>
</font></span><br><br>
<br>
<br>
Paul Gildea <<a href="mailto:gildeap@tcd.ie">gildeap@tcd.ie</a>> writes:<br>
<br>
> dmesg indicated SuperSpeed for 2-2. Here is the output of that command:<br>
><br>
> ls -ld /sys/bus/usb/devices/usb*/*-0:<wbr>1.0/usb*-port*/peer<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port11/peer -><br>
> ../../../usb2/2-0:1.0/usb2-<wbr>port5/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port6/peer -><br>
> ../../../usb2/2-0:1.0/usb2-<wbr>port6/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port7/peer -><br>
> ../../../usb2/2-0:1.0/usb2-<wbr>port7/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port8/peer -><br>
> ../../../usb2/2-0:1.0/usb2-<wbr>port8/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port5/peer -><br>
> ../../../usb1/1-0:1.0/usb1-<wbr>port11/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port6/peer -><br>
> ../../../usb1/1-0:1.0/usb1-<wbr>port6/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port7/peer -><br>
> ../../../usb1/1-0:1.0/usb1-<wbr>port7/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port8/peer -><br>
> ../../../usb1/1-0:1.0/usb1-<wbr>port8/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb3/3-0:<wbr>1.0/usb3-port1/peer -><br>
> ../../../usb4/4-0:1.0/usb4-<wbr>port1/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb3/3-0:<wbr>1.0/usb3-port2/peer -><br>
> ../../../usb4/4-0:1.0/usb4-<wbr>port2/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:45<br>
> /sys/bus/usb/devices/usb3/3-0:<wbr>1.0/usb3-port3/peer -><br>
> ../../../usb4/4-0:1.0/usb4-<wbr>port3/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:46<br>
> /sys/bus/usb/devices/usb3/3-0:<wbr>1.0/usb3-port4/peer -><br>
> ../../../usb4/4-0:1.0/usb4-<wbr>port4/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb4/4-0:<wbr>1.0/usb4-port1/peer -><br>
> ../../../usb3/3-0:1.0/usb3-<wbr>port1/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb4/4-0:<wbr>1.0/usb4-port2/peer -><br>
> ../../../usb3/3-0:1.0/usb3-<wbr>port2/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:47<br>
> /sys/bus/usb/devices/usb4/4-0:<wbr>1.0/usb4-port3/peer -><br>
> ../../../usb3/3-0:1.0/usb3-<wbr>port3/<br>
> lrwxrwxrwx 1 root root 0 Jan 24 11:46<br>
> /sys/bus/usb/devices/usb4/4-0:<wbr>1.0/usb4-port4/peer -><br>
> ../../../usb3/3-0:1.0/usb3-<wbr>port4/<br>
><br>
><br>
> and this is the mapping for my modems, USB3 -> USB2:<br>
><br>
><br>
> /sys/devices/pci0000:00/0000:<wbr>00:14.0/usb2/2-1 -><br>
> /sys/devices/pci0000:00/0000:<wbr>00:14.0/usb1/1-4<br>
> /sys/devices/pci0000:00/0000:<wbr>00:14.0/usb2/2-2 -><br>
> /sys/devices/pci0000:00/0000:<wbr>00:14.0/usb1/1-1<br>
> /sys/devices/pci0000:00/0000:<wbr>00:14.0/usb2/2-3 -><br>
> /sys/devices/pci0000:00/0000:<wbr>00:14.0/usb1/1-6<br>
> /sys/devices/pci0000:00/0000:<wbr>00:14.0/usb2/2-4 -><br>
> /sys/devices/pci0000:00/0000:<wbr>00:14.0/usb1/1-8<br>
><br>
><br>
> My S/N is the same in all modes for MC7455's, useful at least as a backup<br>
> method if it is unreliable.<br>
><br>
> --<br>
> Paul<br>
><br>
><br>
> On 23 Jan 2018 18:06, "Bjørn Mork" <<a href="mailto:bjorn@mork.no">bjorn@mork.no</a>> wrote:<br>
><br>
>> Paul Gildea <<a href="mailto:gildeap@tcd.ie">gildeap@tcd.ie</a>> writes:<br>
>><br>
>> > Checking 2-2 there is no such peer file inside port for some reason.<br>
>><br>
>> OK, at least that explains the failure. And the 2-2 device is of course<br>
>> running at SuperSpeed?<br>
>><br>
>> Tried to read drivers/usb/core/port.c , but not sure I understand if/how<br>
>> this is supposed to work. Looks like there are plenty of possible<br>
>> failure modes. And most will be silently ignored unless you enable<br>
>> kernel debug messages. Yuck.<br>
>><br>
>> Could you do a 'ls -ld /sys/bus/usb/devices/usb*/*-0:<wbr>1.0/usb*-port*/peer'?<br>
>><br>
>> I tried finding examples of missing peers, but all my Linux systems with<br>
>> USB3 look fine. My laptop:<br>
>><br>
>><br>
>> bjorn@miraculix:~$ ls -ld /sys/bus/usb/devices/usb*/*-0:<br>
>> 1.0/usb*-port*/peer<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:59 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port1/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port1<br>
>> lrwxrwxrwx 1 root root 0 Jan 11 13:53 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port2/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port2<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:58 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port3/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port3<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:12 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port6/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port6<br>
>> lrwxrwxrwx 1 root root 0 Jan 11 13:52 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port1/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port1<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:55 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port2/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port2<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:58 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port3/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port3<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:12 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port6/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port6<br>
>><br>
>><br>
>> A desktop:<br>
>><br>
>> bjorn@canardo:~$ ls -ld /sys/bus/usb/devices/usb*/*-0:<wbr>1.0/usb*-port*/peer<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port10/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port10<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port1/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port1<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port2/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port2<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port3/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port3<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port4/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port4<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port5/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port5<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port6/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port6<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port7/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port7<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port8/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port8<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb1/1-0:<wbr>1.0/usb1-port9/peer<br>
>> -> ../../../usb2/2-0:1.0/usb2-<wbr>port9<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port10/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port10<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port1/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port1<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port2/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port2<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port3/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port3<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port4/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port4<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port5/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port5<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port6/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port6<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port7/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port7<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port8/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port8<br>
>> lrwxrwxrwx 1 root root 0 Jan 23 18:44 /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port9/peer<br>
>> -> ../../../usb1/1-0:1.0/usb1-<wbr>port9<br>
>><br>
>> A Linksys router:<br>
>><br>
>> root@wrt1900ac-1:~# ls -ld /sys/bus/usb/devices/usb*/*-0:<br>
>> 1.0/usb*-port*/peer<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:50<br>
>> /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port1/peer -><br>
>> ../../../usb3/3-0:1.0/usb3-<wbr>port1<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:51<br>
>> /sys/bus/usb/devices/usb2/2-0:<wbr>1.0/usb2-port2/peer -><br>
>> ../../../usb3/3-0:1.0/usb3-<wbr>port2<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:50<br>
>> /sys/bus/usb/devices/usb3/3-0:<wbr>1.0/usb3-port1/peer -><br>
>> ../../../usb2/2-0:1.0/usb2-<wbr>port1<br>
>> lrwxrwxrwx 1 root root 0 Jan 12 09:51<br>
>> /sys/bus/usb/devices/usb3/3-0:<wbr>1.0/usb3-port2/peer -><br>
>> ../../../usb2/2-0:1.0/usb2-<wbr>port2<br>
>><br>
>><br>
>> I was really hoping we could use these peer links, because I cannot see<br>
>> how else we're supposed to make the EM7455 upgrade work on SuperSpeed<br>
>> capable ports.<br>
>><br>
>> OK, I see one alternative: The MC7455/EM7455 serial number is the same<br>
>> in bootloader and application mode (at least on my modems...). We could<br>
>> save it and accept the bootloader QDL device on any USB port if the<br>
>> serial number matches.<br>
>><br>
>> Note that this particular serial number behaviour is in no way<br>
>> guaranteed anywhere. So it does feel somewhat less safe than matching<br>
>> USB ports. My EM7565 will change the serial number, for example. But its<br>
>> bootloader use SuperSpeed so it doesn't have the same upgrade issue.<br>
>><br>
>><br>
>> Bjørn<br>
>><br>
<br></blockquote></div><br></div>