summaryrefslogtreecommitdiffstats
path: root/drivers/net/phy/phylink.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2020-07-21 13:04:00 +0200
committerDavid S. Miller <davem@davemloft.net>2020-07-22 00:46:50 +0200
commit16319a7d31b5df881ab61c9a9e8b4265355d157f (patch)
treeb7b5c074046884b383ca47f2480ad6bd8edeb174 /drivers/net/phy/phylink.c
parentnet: phylink: rearrange resolve mac_config() call (diff)
downloadlinux-16319a7d31b5df881ab61c9a9e8b4265355d157f.tar.xz
linux-16319a7d31b5df881ab61c9a9e8b4265355d157f.zip
net: phylink: ensure link is down when changing interface
The only PHYs that are used with phylink which change their interface are the BCM84881 and MV88X3310 family, both of which only change their interface modes on link-up events. However, rather than relying upon this behaviour by the PHY, we should give a stronger guarantee when resolving that the link will be down whenever we change the interface mode. This patch implements that stronger guarantee for resolve. Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/phy/phylink.c')
-rw-r--r--drivers/net/phy/phylink.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
index 8ffe5df5c296..1507ea8a9385 100644
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
@@ -620,8 +620,18 @@ static void phylink_resolve(struct work_struct *w)
}
}
- if (mac_config)
+ if (mac_config) {
+ if (link_state.interface != pl->link_config.interface) {
+ /* The interface has changed, force the link down and
+ * then reconfigure.
+ */
+ if (cur_link_state) {
+ phylink_link_down(pl);
+ cur_link_state = false;
+ }
+ }
phylink_mac_config(pl, &link_state);
+ }
if (link_state.link != cur_link_state) {
pl->old_link_state = link_state.link;