[PATCH] net: bcmgenet: Fix attaching to PYH failed on RPi 4B

From: Jian-Hong Pan
Date: Mon Jun 21 2021 - 06:35:55 EST


The Broadcom UniMAC MDIO bus comes too late. So, GENET cannot find the
ethernet PHY on UniMAC MDIO bus. This leads GENET fail to attach the
PHY.

bcmgenet fd580000.ethernet: GENET 5.0 EPHY: 0x0000
...
could not attach to PHY
bcmgenet fd580000.ethernet eth0: failed to connect to PHY
uart-pl011 fe201000.serial: no DMA platform data
libphy: bcmgenet MII bus: probed
...
unimac-mdio unimac-mdio.-19: Broadcom UniMAC MDIO bus

This patch makes GENET try to connect the PHY up to 3 times. Also, waits
a while between each time for mdio-bcm-unimac module's loading and
probing.

Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=213485
Signed-off-by: Jian-Hong Pan <jhp@xxxxxxxxxxxxx>
---
drivers/net/ethernet/broadcom/genet/bcmmii.c | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 5335244e4577..64f244471fd3 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -289,6 +289,7 @@ int bcmgenet_mii_probe(struct net_device *dev)
struct phy_device *phydev;
u32 phy_flags = 0;
int ret;
+ int i;

/* Communicate the integrated PHY revision */
if (priv->internal_phy)
@@ -301,8 +302,22 @@ int bcmgenet_mii_probe(struct net_device *dev)
priv->old_pause = -1;

if (dn) {
- phydev = of_phy_connect(dev, priv->phy_dn, bcmgenet_mii_setup,
- phy_flags, priv->phy_interface);
+ /* Try to connect the PHY on UniMAC DMIO bus up to 3 times.
+ * Wait a while between each time for mdio-bcm-unimac module's
+ * loading and probing.
+ */
+ phydev = NULL;
+ for (i = 1; i < 4 && !phydev; i++) {
+ netdev_info(dev,
+ "connect %s on UniMAC MDIO bus %d time",
+ priv->phy_dn->full_name, i);
+ phydev = of_phy_connect(dev, priv->phy_dn,
+ bcmgenet_mii_setup,
+ phy_flags, priv->phy_interface);
+ if (!phydev && i < 3)
+ msleep(500);
+ }
+
if (!phydev) {
pr_err("could not attach to PHY\n");
return -ENODEV;
--
2.32.0