summaryrefslogtreecommitdiffstats
path: root/drivers/net/phy/phy.c
diff options
context:
space:
mode:
authorOleksij Rempel <o.rempel@pengutronix.de>2022-04-14 09:55:30 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2022-04-19 09:15:38 +0200
commitc98f35284701306db8b76e0f17b4ced7d78b655e (patch)
treedfab5aac238494e6d51c72da71c4dddd9eb7537a /drivers/net/phy/phy.c
parentb310b08f087e3b3dbbfc0515fb262fde71ae91cd (diff)
downloadbarebox-c98f35284701306db8b76e0f17b4ced7d78b655e.tar.gz
barebox-c98f35284701306db8b76e0f17b4ced7d78b655e.tar.xz
net: phy: do not call adjust_link() form phy_device_attach()
phy_device_attach() is usually called from eth_open() to enable interface, configure MAC, etc. Some times we have situations like this: 1. find and configure PHY 2. define PHY as clock provider for MAC 3. reset and configure MAC 4. detect link and speed and configure MAC accordingly. Which works as expected unless we use fixed PHY. Since fixed-phy was handled differently by the PHY code, we did step 4. before step 3. In this case we will loose MAC speed configuration at least on designware-eqos Ethernet controller. With this change, we handle real PHY and virtual fixed-PHY in the same way. So, adjust_link() (step 4.) will be called after edev->open() (step 3.) as it should be for both variants. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> Link: https://lore.barebox.org/20220414075530.1372003-1-o.rempel@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/net/phy/phy.c')
-rw-r--r--drivers/net/phy/phy.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index e8e8dad5bd..241e0f82d5 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -54,6 +54,13 @@ int phy_update_status(struct phy_device *phydev)
return ret;
}
+ /*
+ * If the phy is a fixed-link, set it to active state to trigger
+ * MAC configuration
+ */
+ if (!phydev->bus && !phydev->link)
+ phydev->link = 1;
+
if (phydev->speed == oldspeed && phydev->duplex == oldduplex &&
phydev->link == oldlink)
return 0;
@@ -311,7 +318,7 @@ static struct phy_device *of_phy_register_fixed_link(struct device_node *np,
phydev->dev.parent = &edev->dev;
phydev->registered = 1;
- phydev->link = 1;
+ phydev->link = 0;
if (of_property_read_u32(np, "speed", &phydev->speed))
return NULL;
@@ -400,10 +407,6 @@ static int phy_device_attach(struct phy_device *phy, struct eth_device *edev,
phy->adjust_link = adjust_link;
- /* If the phy is a fixed-link, then call adjust_link directly */
- if (!phy->bus && adjust_link)
- adjust_link(edev);
-
return 0;
}