lists.openwall.net   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  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20180108130116.80148-1-arnd@arndb.de>
Date:   Mon,  8 Jan 2018 14:01:10 +0100
From:   Arnd Bergmann <arnd@...db.de>
To:     Kishon Vijay Abraham I <kishon@...com>
Cc:     Eric Anholt <eric@...olt.net>,
        Florian Fainelli <f.fainelli@...il.com>,
        devicetree@...r.kernel.org, linux-arm-kernel@...ts.infradead.org,
        Rob Herring <robh+dt@...nel.org>, linux-usb@...r.kernel.org,
        Arnd Bergmann <arnd@...db.de>, stable@...r.kernel.org,
        Stefan Wahren <stefan.wahren@...e.com>,
        Felipe Balbi <balbi@...nel.org>,
        Andrzej Pietrasiewicz <andrzej.p@...sung.com>,
        linux-kernel@...r.kernel.org
Subject: [PATCH] phy: work around 'phys' references to usb-phy devices

Stefan Wahren reports a problem with a warning fix that was merged
for v4.15: we had lots of device nodes with a 'phys' property pointing
to a device node that is not compliant with the binding documented in
Documentation/devicetree/bindings/phy/phy-bindings.txt

This generally works because USB HCD drivers that support both the generic
phy subsystem and the older usb-phy subsystem ignore most errors from
phy_get() and related calls and then use the usb-phy driver instead.

However, usb_add_hcd() (along with the respective functions in dwc2 and
dwc3) propagate the EPROBE_DEFER return code so we can try again whenever
the driver gets loaded. In case the driver is written for the usb-phy
subsystem (like usb-generic-phy aka usb-nop-xceiv), we will never load
a generic-phy driver for it, and keep failing here.

There is only a small number of remaining usb-phy drivers that support
device tree, so this adds a workaround by providing a full list of the
potentially affected drivers, and always failing the probe with -ENODEV
here, which is the same behavior that we used to get with incorrect
device tree files. Since we generally want older kernels to also want
to work with the fixed devicetree files, it would be good to backport
the patch into stable kernels as well (3.13+ are possibly affected).
Reverting back to the DTS sources that work would in theory fix USB
support for now, but in the long run we'd run into the same problem
again when the drivers get ported from usb-phy to generic-phy.

Fixes: 014d6da6cb25 ("ARM: dts: bcm283x: Fix DTC warnings about missing phy-cells")
Link: https://marc.info/?l=linux-usb&m=151518314314753&w=2
Cc: stable@...r.kernel.org
Cc: Stefan Wahren <stefan.wahren@...e.com>
Cc: Felipe Balbi <balbi@...nel.org>
Signed-off-by: Arnd Bergmann <arnd@...db.de>
---
This obviously needs to be tested, I wrote this up as a reply to
Stefan's bug report. I'm fairly sure that I covered all usb-phy
driver strings here. My goal is to have a fix merged into 4.15
rather than reverting all the DT fixes.
---
 drivers/phy/phy-core.c | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/drivers/phy/phy-core.c b/drivers/phy/phy-core.c
index b4964b067aec..bb4dd2a2de2d 100644
--- a/drivers/phy/phy-core.c
+++ b/drivers/phy/phy-core.c
@@ -387,6 +387,24 @@ int phy_calibrate(struct phy *phy)
 }
 EXPORT_SYMBOL_GPL(phy_calibrate);
 
+static struct of_device_id __maybe_unused legacy_usbphy[] = {
+	{ .compatible = "fsl,imx23-usbphy" },
+	{ .compatible = "fsl,imx6q-usbphy" },
+	{ .compatible = "fsl,imx6sl-usbphy" },
+	{ .compatible = "fsl,imx6sx-usbphy" },
+	{ .compatible = "fsl,imx6ul-usbphy" },
+	{ .compatible = "fsl,vf610-usbphy" },
+	{ .compatible = "nvidia,tegra20-usb-phy" },
+	{ .compatible = "nvidia,tegra30-usb-phy" },
+	{ .compatible = "nxp,isp1301" },
+	{ .compatible = "ti,am335x-usb-ctrl-module" },
+	{ .compatible = "ti,am335x-usb-phy" },
+	{ .compatible = "ti,keystone-usbphy" },
+	{ .compatible = "ti,twl6030-usb" },
+	{ .compatible = "usb-nop-xceiv" },
+	{},
+};
+
 /**
  * _of_phy_get() - lookup and obtain a reference to a phy by phandle
  * @np: device_node for which to get the phy
@@ -410,6 +428,15 @@ static struct phy *_of_phy_get(struct device_node *np, int index)
 	if (ret)
 		return ERR_PTR(-ENODEV);
 
+	/*
+	 * Some USB host controllers use a "phys" property to refer to
+	 * a device that does not have a generic phy driver but that
+	 * has a driver for the older usb-phy framework.
+	 * We must not return -EPROBE_DEFER for those, so bail out early.
+	 */
+	if (of_match_node(legacy_usbphy, args.np))
+		return ERR_PTR(-ENODEV);
+
 	mutex_lock(&phy_provider_mutex);
 	phy_provider = of_phy_provider_lookup(args.np);
 	if (IS_ERR(phy_provider) || !try_module_get(phy_provider->owner)) {
-- 
2.9.0

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ