Jetson TX1: tegra21x_xusb_firmware failed to init

Hi everybody,
Recently, I try to boot Jetson TX1 from NFS server but USB port (type A) and also Ethernet port (RJ45) do not work.
When I check booting process, I saw this message:
“tegra-xhci tegra-xhci: failed to init firmware from filesystem: tegra21x_xusb_firmware”

Are there anyone who know to fix this problem? Any suggestion is appreciated.
Thank in advance.
P.S. Root file on NFS server is from Jetpack3.0 (${Jetpack3.0 path}/64_TX1/Linux_for_Tegra_64_tx1/rootfs/)

From what stage of boot do you see those messages? Could you attach a log from serial console for boot?

One issue would be if you have USB running at USB3 speed once it boots to Linux. The U-Boot stage only supports USB2. At the moment of switching from USB2 to USB3 speed any USB device in use from U-Boot will be lost. If this is where your loss is occurring, then you’d have to make sure your USB is set to restrict to USB2 when it reaches Linux.

If the issue is not related to losing connection during transition from U-Boot to Linux, then you might check to see if the NVIDIA-specific files are in place:

sha1sum -c /etc/nv_tegra_release

Dear linuxdev,
You can see the log file as attached file. I also check internet, usb and NVIDIA-specific files when booting is finished. Additionally, how can i make sure USB is set to restrict to USB2 when it reaches Linux??
Looking for your reply.
Thanks.
P.S. In my case, USB OTG is use for connecting with USB to Ethernet adapter to get internet connection on u-boot

Jetson_TX1_NFS_booting.log (84.4 KB)

Here’s what it looks like…tell me if this is correct: You’re using a USB ethernet to network boot. At some point after the Linux kernel loads and while in Linux with boot partially complete you get the network/firmware error. Is this correct?

If so, then this applies: The U-Boot stage uses the standard xhci controller (USB2). In Linux, if that port is USB2, then the same controller continues and there is no interruption of USB service. If instead Linux uses USB3, then the tegra_xhci controller takes over and the original xhci controller goes away. When that happens the transition from USB2 to USB3 wipes out anything which was set up on USB2/U-Boot (including any USB ethernet).

Possibly if you disconnect the USB ethernet device and plug it back in then it might be able to re-establish its connection. Give that a try. Then run “lsusb -t” to see the speed of each connection. If the ethernet has a parent root HUB with speed “5000M”, then you found your problem. It isn’t possible to transition from USB2 to USB3 controllers without losing the USB device connected to it. You can tell Linux to keep that port at USB2 speed cap, and this would prevent losing the device during boot.

Dear linuxdev,
It is true that I am using USB ethernet to network boot and when kernel is loading, I got the message “tegra-xhci tegra-xhci: failed to init firmware from filesystem: tegra21x_xusb_firmware” as in log file I attached last mail. This make Ethernet port and USB type A do not work while micro USB still work, USB to Ethernet adapter connected with micro USB works fine.

After booting is finished, I run command “lsusb -t” and get this feedback

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=tegra-ehci/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, Driver=asix, 480M

but if I disconnect USB ethernet adapter device and plug it back on micro USB, I got this feedback

[   62.581169] regulator_get() failed for (tegra-ehci.0,usb_vbus), -19
[   62.589878] usb_phy: failed regulator_get vdd_vbus_usb:-19, inst:0
[   63.631123] Could not add tegra-ehci.0 to power domain using device tree

and of course the ethernet was down.
What should I do in this case?
Looking for your reply.
Thanks.
P.S. How can I tell Linux to keep USB2 speed cap? Is it right that I have to recompile kernel?

I think for any port to work in both boot and Linux the driver must be the older xhci driver, not tegra_xhci. I’m not where I can check right now, but I think there is only one legacy xhci controller. For this to work you must be connected to a port using USB2 with the older xhci driver in both U-Boot and Linux stages of boot. The ideal solution is probably not possible…to port tegra_xhci into U-Boot. If there is only one legacy xhci controller (I’d have to check if that is the case), then it seems likely only the micro-OTG USB port would work. It isn’t just about speed cap, it is about switching from xhci controller to tegra_xhci controller…when USB3 is specified this is just one of the causes of forcing change to a new controller.

Since I am not where I can verify, can someone say if both USB ports can be used with legacy USB2 via xhci driver? Or if only one legacy xhci controller exists and thus both ports cannot be xhci?