lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Wed, 23 Dec 2020 17:24:03 +0100
From:   Pali Rohár <>
To:     Mathias Nyman <>,
        Greg Kroah-Hartman <>,
        Gregory CLEMENT <>,
        Miquel Raynal <>
Cc:     Tomasz Maciej Nowak <>,,, Peter Chen <>
Subject: [PATCH] usb: host: xhci: mvebu: make USB 3.0 PHY optional for Armada 3720

Older ATF does not provide SMC call for USB 3.0 phy power on functionality
and therefore initialization of xhci-hcd is failing when older version of
ATF is used. In this case phy_power_on() function returns -EOPNOTSUPP.

[    3.108467] mvebu-a3700-comphy d0018300.phy: unsupported SMC call, try updating your firmware
[    3.117250] phy phy-d0018300.phy.0: phy poweron failed --> -95
[    3.123465] xhci-hcd: probe of d0058000.usb failed with error -95

This patch calls phy_power_on() in xhci_mvebu_a3700_init_quirk() function
and in case it returns -EOPNOTSUPP then XHCI_SKIP_PHY_INIT quirk is set to
instruct xhci-plat to skip PHY initialization.

This patch fixes above failure by ignoring 'not supported' error in
aardvark driver. In this case it is expected that phy is already power on.

It fixes initialization of xhci-hcd on Espressobin boards where is older
Marvell's Arm Trusted Firmware without SMC call for USB 3.0 phy power.

This is regression introduced in commit bd3d25b07342 ("arm64: dts: marvell:
armada-37xx: link USB hosts with their PHYs") where USB 3.0 phy was defined
and therefore xhci-hcd on Espressobin with older ATF started failing.

Fixes: bd3d25b07342 ("arm64: dts: marvell: armada-37xx: link USB hosts with their PHYs")
Signed-off-by: Pali Rohár <>
Cc: <> # 5.1+: ea17a0f153af: phy: marvell: comphy: Convert internal SMCC firmware return codes to errno
Cc: <> # 5.1+: f768e718911e: usb: host: xhci-plat: add priv quirk for skip PHY initialization


When applying this patch, please include additional line

Cc: <> # 5.1+: <COMMIT_ID>: usb: host: xhci-plat: fix support for XHCI_SKIP_PHY_INIT quirk

with correct COMMIT_ID of mentioned patch which is available in the thread:

As mentioned patch is required for change in this patch to work. Above
mentioned patch is prerequisite for this patch and therefore needs to be
reviewed and applied prior this patch.

Note that same issue as in this USB 3.0 PHY patch was already resolved and
applied also for SATA PHY and PCIe PHY on A3720 SOC in following commits:

And these commits were also backported to stable kernel versions (where
were affected commits which broke drivers initialization).
 drivers/usb/host/xhci-mvebu.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/drivers/usb/host/xhci-mvebu.c b/drivers/usb/host/xhci-mvebu.c
index 60651a50770f..ec4f6d6e44cf 100644
--- a/drivers/usb/host/xhci-mvebu.c
+++ b/drivers/usb/host/xhci-mvebu.c
@@ -8,6 +8,7 @@
 #include <linux/mbus.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
+#include <linux/phy/phy.h>
 #include <linux/usb.h>
 #include <linux/usb/hcd.h>
@@ -77,9 +78,43 @@ int xhci_mvebu_mbus_init_quirk(struct usb_hcd *hcd)
 int xhci_mvebu_a3700_init_quirk(struct usb_hcd *hcd)
 	struct xhci_hcd	*xhci = hcd_to_xhci(hcd);
+	struct device *dev = hcd->self.controller;
+	struct phy *phy;
+	int ret;
 	/* Without reset on resume, the HC won't work at all */
 	xhci->quirks |= XHCI_RESET_ON_RESUME;
+	/* Old bindings miss the PHY handle */
+	phy = of_phy_get(dev->of_node, "usb3-phy");
+	if (IS_ERR(phy) && PTR_ERR(phy) == -EPROBE_DEFER)
+		return -EPROBE_DEFER;
+	else if (IS_ERR(phy))
+		goto phy_out;
+	ret = phy_init(phy);
+	if (ret)
+		goto phy_put;
+	ret = phy_set_mode(phy, PHY_MODE_USB_HOST_SS);
+	if (ret)
+		goto phy_exit;
+	ret = phy_power_on(phy);
+	if (ret == -EOPNOTSUPP) {
+		/* Skip initializatin of XHCI PHY when it is unsupported by firmware */
+		dev_warn(dev, "PHY unsupported by firmware\n");
+		xhci->quirks |= XHCI_SKIP_PHY_INIT;
+	}
+	if (ret)
+		goto phy_exit;
+	phy_power_off(phy);
+	phy_exit(phy);
+	of_phy_put(phy);
 	return 0;

Powered by blists - more mailing lists