net: stmmac: make mdio register skips PHY scanning for fixed-link
authorOng Boon Leong <boon.leong.ong@intel.com>
Wed, 15 Jun 2022 08:39:08 +0000 (16:39 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 17 Jun 2022 09:55:35 +0000 (10:55 +0100)
stmmac_mdio_register() lacks fixed-link consideration and only skip PHY
scanning if it has done DT style PHY discovery. So, for DT or ACPI _DSD
setting of fixed-link, the PHY scanning should not happen.

v2: fix incorrect order related to fwnode that is not caught in non-DT
    platform.

Tested-by: Emilio Riva <emilio.riva@ericsson.com>
Signed-off-by: Ong Boon Leong <boon.leong.ong@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c

index d1a7cf4567bc26bb34a605404b2303e1f87b9bb7..fe263cad8248e523263f5c54e7599b63782a37cf 100644 (file)
@@ -1128,18 +1128,20 @@ static void stmmac_check_pcs_mode(struct stmmac_priv *priv)
 static int stmmac_init_phy(struct net_device *dev)
 {
        struct stmmac_priv *priv = netdev_priv(dev);
-       struct device_node *node;
+       struct fwnode_handle *fwnode;
        int ret;
 
-       node = priv->plat->phylink_node;
+       fwnode = of_fwnode_handle(priv->plat->phylink_node);
+       if (!fwnode)
+               fwnode = dev_fwnode(priv->device);
 
-       if (node)
-               ret = phylink_of_phy_connect(priv->phylink, node, 0);
+       if (fwnode)
+               ret = phylink_fwnode_phy_connect(priv->phylink, fwnode, 0);
 
        /* Some DT bindings do not set-up the PHY handle. Let's try to
         * manually parse it
         */
-       if (!node || ret) {
+       if (!fwnode || ret) {
                int addr = priv->plat->phy_addr;
                struct phy_device *phydev;
 
index 03d3d1f7aa4b20a9f58b9f3211b50bf4e1f8111a..5f177ea807258c35aa9edb835e976dfbbbd109ca 100644 (file)
@@ -434,9 +434,11 @@ int stmmac_mdio_register(struct net_device *ndev)
        int err = 0;
        struct mii_bus *new_bus;
        struct stmmac_priv *priv = netdev_priv(ndev);
+       struct fwnode_handle *fwnode = of_fwnode_handle(priv->plat->phylink_node);
        struct stmmac_mdio_bus_data *mdio_bus_data = priv->plat->mdio_bus_data;
        struct device_node *mdio_node = priv->plat->mdio_node;
        struct device *dev = ndev->dev.parent;
+       struct fwnode_handle *fixed_node;
        int addr, found, max_addr;
 
        if (!mdio_bus_data)
@@ -490,6 +492,18 @@ int stmmac_mdio_register(struct net_device *ndev)
        if (priv->plat->has_xgmac)
                stmmac_xgmac2_mdio_read(new_bus, 0, MII_ADDR_C45);
 
+       /* If fixed-link is set, skip PHY scanning */
+       if (!fwnode)
+               fwnode = dev_fwnode(priv->device);
+
+       if (fwnode) {
+               fixed_node = fwnode_get_named_child_node(fwnode, "fixed-link");
+               if (fixed_node) {
+                       fwnode_handle_put(fixed_node);
+                       goto bus_register_done;
+               }
+       }
+
        if (priv->plat->phy_node || mdio_node)
                goto bus_register_done;