net: ftgmac100: support fixed link
authorTao Ren <rentao.bupt@gmail.com>
Wed, 7 Sep 2022 05:44:52 +0000 (22:44 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 15 Sep 2022 10:41:37 +0000 (12:41 +0200)
Support fixed link in ftgmac100 driver. Fixed link is used on several
Meta OpenBMC platforms, such as Elbert (AST2620) and Wedge400 (AST2520).

Signed-off-by: Tao Ren <rentao.bupt@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/faraday/ftgmac100.c

index 9277d5f..da04bee 100644 (file)
@@ -1701,10 +1701,14 @@ err_register_mdiobus:
 
 static void ftgmac100_phy_disconnect(struct net_device *netdev)
 {
+       struct ftgmac100 *priv = netdev_priv(netdev);
+
        if (!netdev->phydev)
                return;
 
        phy_disconnect(netdev->phydev);
+       if (of_phy_is_fixed_link(priv->dev->of_node))
+               of_phy_deregister_fixed_link(priv->dev->of_node);
 }
 
 static void ftgmac100_destroy_mdio(struct net_device *netdev)
@@ -1867,6 +1871,26 @@ static int ftgmac100_probe(struct platform_device *pdev)
                        err = -EINVAL;
                        goto err_phy_connect;
                }
+       } else if (np && of_phy_is_fixed_link(np)) {
+               struct phy_device *phy;
+
+               err = of_phy_register_fixed_link(np);
+               if (err) {
+                       dev_err(&pdev->dev, "Failed to register fixed PHY\n");
+                       goto err_phy_connect;
+               }
+
+               phy = of_phy_get_and_connect(priv->netdev, np,
+                                            &ftgmac100_adjust_link);
+               if (!phy) {
+                       dev_err(&pdev->dev, "Failed to connect to fixed PHY\n");
+                       of_phy_deregister_fixed_link(np);
+                       err = -EINVAL;
+                       goto err_phy_connect;
+               }
+
+               /* Display what we found */
+               phy_attached_info(phy);
        } else if (np && of_get_property(np, "phy-handle", NULL)) {
                struct phy_device *phy;