[PATCH] net: cpsw: fix probe with fixed-link
Andreas Schmidt
mail at schmidt-andreas.de
Tue Feb 13 13:48:16 PST 2018
If cpsw slave is set to fixed-link cpsw probe still try to probe and use
a phy. This patch fix cpsw probe in case of fixed-link.
Signed-off-by: Andreas Schmidt <mail at schmidt-andreas.de>
---
drivers/net/cpsw.c | 41 +++++++++++++++++++++++++++--------------
1 file changed, 27 insertions(+), 14 deletions(-)
diff --git a/drivers/net/cpsw.c b/drivers/net/cpsw.c
index d11ca33f7..37e480248 100644
--- a/drivers/net/cpsw.c
+++ b/drivers/net/cpsw.c
@@ -184,6 +184,7 @@ struct cpsw_slave {
struct eth_device edev;
struct cpsw_priv *cpsw;
struct device_d dev;
+ int fixed_link;
};
struct cpdma_desc {
@@ -913,18 +914,20 @@ static int cpsw_slave_setup(struct cpsw_slave *slave, int slave_num,
struct eth_device *edev = &slave->edev;
struct device_d *dev = &slave->dev;
int ret;
- struct phy_device *phy;
+ struct phy_device *phy = NULL;
- phy = mdiobus_scan(&priv->miibus, priv->slaves[slave_num].phy_id);
- if (IS_ERR(phy)) {
- ret = PTR_ERR(phy);
- goto err_out;
- }
+ if (!slave->fixed_link) {
+ phy = mdiobus_scan(&priv->miibus, priv->slaves[slave_num].phy_id);
+ if (IS_ERR(phy)) {
+ ret = PTR_ERR(phy);
+ goto err_out;
+ }
- phy->dev.device_node = priv->slaves[slave_num].dev.device_node;
- ret = phy_register_device(phy);
- if (ret)
- goto err_out;
+ phy->dev.device_node = priv->slaves[slave_num].dev.device_node;
+ ret = phy_register_device(phy);
+ if (ret)
+ goto err_out;
+ }
sprintf(dev->name, "cpsw-slave");
dev->id = slave->slave_num;
@@ -957,7 +960,8 @@ static int cpsw_slave_setup(struct cpsw_slave *slave, int slave_num,
return 0;
err_register_dev:
- phy_unregister_device(phy);
+ if (!slave->fixed_link)
+ phy_unregister_device(phy);
err_register_edev:
unregister_device(dev);
err_out:
@@ -1103,11 +1107,20 @@ static int cpsw_probe_dt(struct cpsw_priv *priv)
uint32_t phy_id[2];
ret = of_property_read_u32_array(child, "phy_id", phy_id, 2);
- if (ret)
- return ret;
+ if (!ret) {
+ slave->phy_id = phy_id[1];
+ slave->fixed_link = 0;
+ } else {
+ struct device_node *fl_np;
+ fl_np = of_find_node_by_name(child, "fixed-link");
+ if (fl_np) {
+ slave->phy_id = -1;
+ slave->fixed_link = 1;
+ } else
+ return ret;
+ }
slave->dev.device_node = child;
- slave->phy_id = phy_id[1];
slave->phy_if = of_get_phy_mode(child);
slave->slave_num = i;
--
2.14.1
More information about the barebox
mailing list