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: <20230208101821.871269-1-alexander.sverdlin@siemens.com>
Date:   Wed,  8 Feb 2023 11:18:20 +0100
From:   "A. Sverdlin" <alexander.sverdlin@...mens.com>
To:     Wei Fang <wei.fang@....com>, Shenwei Wang <shenwei.wang@....com>,
        Clark Wang <xiaoning.wang@....com>,
        NXP Linux Team <linux-imx@....com>, netdev@...r.kernel.org
Cc:     Alexander Sverdlin <alexander.sverdlin@...mens.com>,
        linux-kernel@...r.kernel.org
Subject: [PATCH] net: fec: Defer probe if other FEC has deferred MDIO

From: Alexander Sverdlin <alexander.sverdlin@...mens.com>

In FEC_QUIRK_SINGLE_MDIO case, if fec1 has mdio subnode which is being
probe-deferred because of, for instance, reset-gpio, defer any consequtive
fec2+ probe, we don't want them to register DT-less MDIO bus, but to share
DT-aware MDIO bus from fec1.

Signed-off-by: Alexander Sverdlin <alexander.sverdlin@...mens.com>
---
 drivers/net/ethernet/freescale/fec_main.c | 34 +++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 2341597408d12..d4d6dc10dba71 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -2301,14 +2301,13 @@ static int fec_enet_mii_init(struct platform_device *pdev)
 	 * mdio interface in board design, and need to be configured by
 	 * fec0 mii_bus.
 	 */
-	if ((fep->quirks & FEC_QUIRK_SINGLE_MDIO) && fep->dev_id > 0) {
+	if (fep->quirks & FEC_QUIRK_SINGLE_MDIO) {
 		/* fec1 uses fec0 mii_bus */
 		if (mii_cnt && fec0_mii_bus) {
 			fep->mii_bus = fec0_mii_bus;
 			mii_cnt++;
 			return 0;
 		}
-		return -ENOENT;
 	}
 
 	bus_freq = 2500000; /* 2.5MHz by default */
@@ -2319,6 +2318,37 @@ static int fec_enet_mii_init(struct platform_device *pdev)
 							  "suppress-preamble");
 	}
 
+	while (!node) {
+		/* If we've got so far there is either no FEC node with mdio
+		 * subnode at all (in this case original behavior was to go on
+		 * and create an MDIO bus not related to any DT node), or there
+		 * is another FEC node with mdio subnode out there (in this case
+		 * we defer the probe until MDIO bus will be instantiated in the
+		 * context of its parent node.
+		 */
+		struct device_node *np, *cp;
+		const struct of_device_id *of_id = of_match_device(fec_dt_ids, &pdev->dev);
+
+		if (!of_id)
+			break;
+
+		/* Loop over nodes with same "compatible" as pdev has */
+		for_each_compatible_node(np, NULL, of_id->compatible) {
+			if (!of_device_is_available(np))
+				continue;
+
+			cp = of_get_child_by_name(np, "mdio");
+			if (cp) {
+				of_node_put(cp);
+				of_node_put(np);
+
+				return -EPROBE_DEFER;
+			}
+		}
+
+		break;
+	}
+
 	/*
 	 * Set MII speed (= clk_get_rate() / 2 * phy_speed)
 	 *
-- 
2.34.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ