]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: phy: atheros: avoid error in ar803x_of_init() when PHY has no OF node
authorVladimir Oltean <vladimir.oltean@nxp.com>
Wed, 23 Feb 2022 13:20:56 +0000 (15:20 +0200)
committerRamon Fried <ramon@neureality.ai>
Sun, 10 Apr 2022 05:44:12 +0000 (08:44 +0300)
A DM_ETH driver may use phy_connect() towards a PHY address on an MDIO
bus which is not specified in the device tree, as evidenced by:

pfe_eth_probe
-> pfe_phy_configure
   -> phy_connect

When this happens, the PHY will have an invalid OF node.

When ar803x_config() runs, it silently fails at ar803x_of_init(), and
therefore, fails to run the rest of the initialization.

This makes MII_BMCR contain what it had after BMCR_RESET (0x8000) has
been written into it by phy_reset(). Since BMCR_RESET is volatile and
self-clearing, the MII_BMCR ends up having a value of 0x0. The further
configuration of this register, which is supposed to be handled by
genphy_config_aneg() lower in ar803x_config(), never gets a chance to
run due to this early error from ar803x_of_init().

As a result of having MII_BMCR as 0, the following symptom appears:

=> setenv ethact pfe_eth0
=> setenv ipaddr 10.0.0.1
=> ping 10.0.0.2
pfe_eth0 Waiting for PHY auto negotiation to complete......... TIMEOUT !
Could not initialize PHY pfe_eth0

Manually writing 0x1140 into register 0 of the PHY makes the connection
work, but it is rather desirable that the port works without any manual
intervention.

Fixes: fe6293a80959 ("phy: atheros: add device tree bindings and config")
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
drivers/net/phy/atheros.c

index f922fecd6b5d9a61098833fc2ef6dfbcf12bb8e0..fa1fe08518f4baa1f7d97bc9dc36601cea6fc0e1 100644 (file)
@@ -199,7 +199,7 @@ static int ar803x_of_init(struct phy_device *phydev)
 
        node = phy_get_ofnode(phydev);
        if (!ofnode_valid(node))
-               return -EINVAL;
+               return 0;
 
        priv = malloc(sizeof(*priv));
        if (!priv)