R-Car/xhci-rcar-driver-waits-for-firmware-loading

From eLinux.org
Jump to: navigation, search

Overview

From v5.4, since the following commit has been applied, CONFIG_FW_LOADER_USER_HELPER and CONFIG_FW_LOADER_USER_HELPER_FALLBACK has been enabled on the defconfig.

7f4e4afa140c arm64: defconfig: Enable SDMA on i.mx8mq/8mm

So, when we use defconfig, xhci-rcar driver takes 60 seconds in kernel booting like the following.

[    2.128762] xhci-hcd ee000000.usb: xHCI Host Controller
[    2.134026] xhci-hcd ee000000.usb: new USB bus registered, assigned bus number 7
[    2.141477] xhci-hcd ee000000.usb: Direct firmware load for r8a779x_usb3_v3.dlmem failed with error -2
[    2.150810] xhci-hcd ee000000.usb: Falling back to sysfs fallback for: r8a779x_usb3_v3.dlmem
[   62.429670] xhci-hcd ee000000.usb: can't setup: -11
[   62.434559] xhci-hcd ee000000.usb: USB bus 7 deregistered
[   62.440002] xhci-hcd: probe of ee000000.usb failed with error -11

How to avoid this issue?

We have some options to avoid this issue.

  • Disable CONFIG_FW_LOADER_USER_HELPER{,_FALLBACK}
  • Use kernel module of xhci driver instead of built-in
  • Use request_firmware_direct() instead of request_firmware()

Disable CONFIG_FW_LOADER_USER_HELPER{,_FALLBACK}

Just disable CONFIG_FW_LOADER_USER_HELPER and CONFIG_FW_LOADER_USER_HELPER_FALLBACK.

Location on v5.12:
-> Device Drivers
 -> Generic Driver Options
  -> Firmware loader
   -> Firmware loading facility (FW_LOADER [=y])

     [ ]   Enable the firmware sysfs fallback mechanism
     [ ]     Force the firmware sysfs fallback mechanism when possible

Use kernel module of xhci driver instead of built-in

In v5.12, CONFIG_USB_XHCI_HCD is changed from built-in (=y) to kernel module (=m). And then, xhci-hcd.ko and xhc-plat-hcd are generated.

Location on v5.12:
-> Device Drivers
 -> USB support (USB_SUPPORT [=y])

    <M>   xHCI HCD (USB 3.0) support
    [ ]     xHCI support for debug capability
    < >     Support for additional Renesas xHCI controller with firmw
    -M-     Generic xHCI driver for a platform device
    < >       xHCI support for HiSilicon STB SoCs
    < >     xHCI support for MediaTek SoCs
    < >     xHCI support for Marvell Armada 375/38x/37xx
    -M-     xHCI support for Renesas R-Car SoCs

And then, we can use the xhci rcar driver by using the following commands.

# modprobe xhci-plat-hcd
# lsmod
Module                  Size  Used by
xhci_plat_hcd          24576  0
xhci_hcd              249856  1 xhci_plat_hcd

Use request_firmware_direct() instead of request_firmware()

If we change the xhci-rcar.c like below, we can avoid the issue even if we use defconfig.

diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c
index 1bc4fe7b8c75..5d53517c1112 100644
--- a/drivers/usb/host/xhci-rcar.c
+++ b/drivers/usb/host/xhci-rcar.c
@@ -146,7 +146,7 @@ static int xhci_rcar_download_firmware(struct usb_hcd *hcd)
                firmware_name = priv->firmware_name;

        /* request R-Car USB3.0 firmware */
-       retval = request_firmware(&fw, firmware_name, dev);
+       retval = request_firmware_direct(&fw, firmware_name, dev);
        if (retval)
                return retval;