summaryrefslogtreecommitdiff
path: root/net/dsa-uclass.c
diff options
context:
space:
mode:
authorVladimir Oltean <vladimir.oltean@nxp.com>2021-12-05 01:00:34 +0200
committerRamon Fried <ramon@neureality.ai>2022-01-15 18:49:03 +0200
commit0fa4448d5191f9397e5acbd6c83073523cc6c4bd (patch)
tree8ff9d3ea2e018783b35981a79d6c4cdcb1ca5fbd /net/dsa-uclass.c
parentc2969792c46ce42a4429e41b4b81f42a5873ef07 (diff)
net: dsa: fix phydev->speed being uninitialized for the CPU port fixed PHY
If the DSA API is going to allow drivers to do things such as: - phy_config in dsa_ops :: port_probe - phy_startup in dsa_ops :: port_enable then it would actually be good if the ->port_probe() method would actually be called in all cases before the ->port_enable() is. Currently this is true for user ports, but not true for the CPU port, because the CPU port does not have a udevice registered for it (this is all part of DSA's design). So the current issue is that after phy_startup has finished for the CPU port, its phydev->speed is an uninitialized value, because phy_config() was never called for the priv->cpu_port_fixed_phy, and it is precisely phy_config() who copies the speed into the phydev in the case of the fixed PHY driver. So we need to simulate a probing event for the CPU port by manually calling the driver's ->port_probe() method for the CPU port. Fixes: 8a2982574854 ("net: dsa: introduce a .port_probe() method in struct dsa_ops") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
Diffstat (limited to 'net/dsa-uclass.c')
-rw-r--r--net/dsa-uclass.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/net/dsa-uclass.c b/net/dsa-uclass.c
index 606b1539a7..9ff55a02fb 100644
--- a/net/dsa-uclass.c
+++ b/net/dsa-uclass.c
@@ -466,6 +466,8 @@ static int dsa_pre_probe(struct udevice *dev)
{
struct dsa_pdata *pdata = dev_get_uclass_plat(dev);
struct dsa_priv *priv = dev_get_uclass_priv(dev);
+ struct dsa_ops *ops = dsa_get_ops(dev);
+ int err;
priv->num_ports = pdata->num_ports;
priv->cpu_port = pdata->cpu_port;
@@ -477,6 +479,15 @@ static int dsa_pre_probe(struct udevice *dev)
uclass_find_device_by_ofnode(UCLASS_ETH, pdata->master_node,
&priv->master_dev);
+
+ /* Simulate a probing event for the CPU port */
+ if (ops->port_probe) {
+ err = ops->port_probe(dev, priv->cpu_port,
+ priv->cpu_port_fixed_phy);
+ if (err)
+ return err;
+ }
+
return 0;
}