From: Michael Walle <mwalle@kernel.org>
To: "Andrew Lunn" <andrew@lunn.ch>,
"Heiner Kallweit" <hkallweit1@gmail.com>,
"Russell King" <linux@armlinux.org.uk>,
"David S. Miller" <davem@davemloft.net>,
"Eric Dumazet" <edumazet@google.com>,
"Jakub Kicinski" <kuba@kernel.org>,
"Paolo Abeni" <pabeni@redhat.com>,
"Yisen Zhuang" <yisen.zhuang@huawei.com>,
"Salil Mehta" <salil.mehta@huawei.com>,
"Florian Fainelli" <florian.fainelli@broadcom.com>,
"Broadcom internal kernel review list"
<bcm-kernel-feedback-list@broadcom.com>,
"Marek Behún" <kabel@kernel.org>, "Xu Liang" <lxu@maxlinear.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
Simon Horman <simon.horman@corigine.com>,
Michael Walle <mwalle@kernel.org>
Subject: [PATCH net-next v3 11/11] net: mdio: support C45-over-C22 when probed via OF
Date: Wed, 12 Jul 2023 17:07:11 +0200 [thread overview]
Message-ID: <20230620-feature-c45-over-c22-v3-11-9eb37edf7be0@kernel.org> (raw)
In-Reply-To: <20230620-feature-c45-over-c22-v3-0-9eb37edf7be0@kernel.org>
Fall back to C45-over-C22 when the MDIO bus isn't capable of doing C45
transfers. This might be the case if there are broken PHYs on the bus or
if the MDIO controller cannot do C45 transactions at all.
For this to work, split the PHY registration into three steps, as done
in the generic PHY probing code:
(1) add C22 PHYs
(2) scan for broken C22 PHYs
(3) add C45 PHYs
If step (2) detects a broken PHY, any PHYs will be added with
C45-over-C22 access in step (3). Step (3) also ensures, that
C45-over-C22 is used if C45 access is not supported at all on the bus.
Signed-off-by: Michael Walle <mwalle@kernel.org>
---
drivers/net/mdio/of_mdio.c | 63 +++++++++++++++++++++++++++++++++++-----------
1 file changed, 48 insertions(+), 15 deletions(-)
diff --git a/drivers/net/mdio/of_mdio.c b/drivers/net/mdio/of_mdio.c
index 7eb32ebb846d..e9d3cf6b68ee 100644
--- a/drivers/net/mdio/of_mdio.c
+++ b/drivers/net/mdio/of_mdio.c
@@ -100,6 +100,11 @@ static const struct of_device_id whitelist_phys[] = {
{}
};
+static bool of_mdiobus_child_is_c45_phy(struct device_node *child)
+{
+ return of_device_is_compatible(child, "ethernet-phy-ieee802.3-c45");
+}
+
/*
* Return true if the child node is for a phy. It must either:
* o Compatible string of "ethernet-phy-idX.X"
@@ -118,7 +123,7 @@ bool of_mdiobus_child_is_phy(struct device_node *child)
if (of_get_phy_id(child, &phy_id) != -EINVAL)
return true;
- if (of_device_is_compatible(child, "ethernet-phy-ieee802.3-c45"))
+ if (of_mdiobus_child_is_c45_phy(child))
return true;
if (of_device_is_compatible(child, "ethernet-phy-ieee802.3-c22"))
@@ -138,6 +143,32 @@ bool of_mdiobus_child_is_phy(struct device_node *child)
}
EXPORT_SYMBOL(of_mdiobus_child_is_phy);
+static int of_mdiobus_register_child(struct mii_bus *mdio,
+ struct device_node *child, bool *scanphys)
+{
+ int addr, rc;
+
+ addr = of_mdio_parse_addr(&mdio->dev, child);
+ if (addr < 0) {
+ *scanphys = true;
+ return 0;
+ }
+
+ if (mdiobus_is_registered_device(mdio, addr))
+ return 0;
+
+ if (of_mdiobus_child_is_phy(child))
+ rc = of_mdiobus_register_phy(mdio, child, addr);
+ else
+ rc = of_mdiobus_register_device(mdio, child, addr);
+
+ if (rc == -ENODEV)
+ dev_err(&mdio->dev, "MDIO device at address %d is missing.\n",
+ addr);
+
+ return rc;
+}
+
/**
* __of_mdiobus_register - Register mii_bus and create PHYs from the device tree
* @mdio: pointer to mii_bus structure
@@ -178,24 +209,26 @@ int __of_mdiobus_register(struct mii_bus *mdio, struct device_node *np,
if (rc)
return rc;
- /* Loop over the child nodes and register a phy_device for each phy */
+ /* Loop over the child nodes, skipping C45 PHYs so we can scan for
+ * broken C22 PHYs. The C45 PHYs will be registered afterwards.
+ */
for_each_available_child_of_node(np, child) {
- addr = of_mdio_parse_addr(&mdio->dev, child);
- if (addr < 0) {
- scanphys = true;
+ if (of_mdiobus_child_is_c45_phy(child))
continue;
- }
+ rc = of_mdiobus_register_child(mdio, child, &scanphys);
+ if (rc)
+ goto unregister;
+ }
- if (of_mdiobus_child_is_phy(child))
- rc = of_mdiobus_register_phy(mdio, child, addr);
- else
- rc = of_mdiobus_register_device(mdio, child, addr);
+ /* Some C22 PHYs are broken with C45 transactions. */
+ mdiobus_scan_for_broken_c45_access(mdio);
- if (rc == -ENODEV)
- dev_err(&mdio->dev,
- "MDIO device at address %d is missing.\n",
- addr);
- else if (rc)
+ /* Now add any missing C45 PHYs. If C45 access is not allowed, they
+ * will be registered with C45-over-C22 access.
+ */
+ for_each_available_child_of_node(np, child) {
+ rc = of_mdiobus_register_child(mdio, child, &scanphys);
+ if (rc)
goto unregister;
}
--
2.39.2
prev parent reply other threads:[~2023-07-12 15:08 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-12 15:07 [PATCH net-next v3 00/11] net: phy: C45-over-C22 access Michael Walle
2023-07-12 15:07 ` [PATCH net-next v3 01/11] net: phy: get rid of redundant is_c45 information Michael Walle
2023-07-18 17:25 ` Andrew Lunn
2023-07-12 15:07 ` [PATCH net-next v3 02/11] net: phy: introduce phy_has_c45_registers() Michael Walle
2023-07-18 17:26 ` Andrew Lunn
2023-07-18 20:07 ` Andrew Lunn
2023-07-19 7:11 ` Michael Walle
2023-08-01 14:47 ` Michael Walle
2023-08-01 14:57 ` Russell King (Oracle)
2023-08-01 15:20 ` Michael Walle
2023-08-01 15:57 ` Russell King (Oracle)
2023-08-02 15:33 ` Michael Walle
2023-08-02 16:06 ` Russell King (Oracle)
2023-08-02 17:11 ` Michael Walle
2023-08-02 23:00 ` Russell King (Oracle)
2023-08-02 16:15 ` Andrew Lunn
2023-08-02 17:10 ` Russell King (Oracle)
2023-08-02 22:21 ` Andrew Lunn
2023-08-02 22:28 ` Russell King (Oracle)
2023-09-05 8:22 ` Michael Walle
2023-07-12 15:07 ` [PATCH net-next v3 03/11] net: phy: replace is_c45 with phy_accces_mode Michael Walle
2023-07-18 17:40 ` Andrew Lunn
2023-07-18 17:52 ` Russell King (Oracle)
2023-07-18 19:18 ` Andrew Lunn
2023-07-18 21:46 ` Russell King (Oracle)
2023-07-18 23:30 ` Andrew Lunn
2023-07-18 19:53 ` Michael Walle
2023-07-18 20:16 ` Andrew Lunn
2023-07-12 15:07 ` [PATCH net-next v3 04/11] net: phy: make the "prevent_c45_scan" a property of the MII bus Michael Walle
2023-07-18 23:31 ` Andrew Lunn
2023-07-12 15:07 ` [PATCH net-next v3 05/11] net: phy: print an info if a broken C45 bus is found Michael Walle
2023-07-18 23:32 ` Andrew Lunn
2023-07-12 15:07 ` [PATCH net-next v3 06/11] net: phy: add error checks in mmd_phy_indirect() Michael Walle
2023-07-18 23:34 ` Andrew Lunn
2023-07-12 15:07 ` [PATCH net-next v3 07/11] net: phy: introduce phy_mdiobus_read_mmd() Michael Walle
2023-07-18 23:54 ` Andrew Lunn
2023-07-19 7:21 ` Michael Walle
2023-07-12 15:07 ` [PATCH net-next v3 08/11] net: phy: add support for C45-over-C22 transfers Michael Walle
2023-07-13 8:56 ` Simon Horman
2023-07-13 9:00 ` Michael Walle
2023-07-13 9:19 ` Simon Horman
2023-07-12 15:07 ` [PATCH net-next v3 09/11] net: phy: introduce phy_promote_to_c45() Michael Walle
2023-07-13 8:56 ` Simon Horman
2023-07-12 15:07 ` [PATCH net-next v3 10/11] net: mdio: add C45-over-C22 fallback to fwnode_mdiobus_register_phy() Michael Walle
2023-07-19 0:03 ` Andrew Lunn
2023-07-19 7:32 ` Michael Walle
2023-07-12 15:07 ` Michael Walle [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230620-feature-c45-over-c22-v3-11-9eb37edf7be0@kernel.org \
--to=mwalle@kernel.org \
--cc=andrew@lunn.ch \
--cc=bcm-kernel-feedback-list@broadcom.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=florian.fainelli@broadcom.com \
--cc=hkallweit1@gmail.com \
--cc=kabel@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=lxu@maxlinear.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=salil.mehta@huawei.com \
--cc=simon.horman@corigine.com \
--cc=yisen.zhuang@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).