diff options
author | Antoine Tenart <antoine.tenart@free-electrons.com> | 2017-08-30 10:29:19 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-08-30 15:17:46 -0700 |
commit | 89273bc060d8c7a70999736fe15b2fb3326d0da8 (patch) | |
tree | c120ec6f4a8a818ae096d9c9be1271299657d4f9 /drivers/net/ethernet/marvell | |
parent | 65a2c09aea8b9b620bbb3e59f68090a2b7151865 (diff) | |
download | linux-89273bc060d8c7a70999736fe15b2fb3326d0da8.tar.bz2 |
net: mvpp2: dynamic reconfiguration of the comphy/GoP/MAC
This patch adds logic to reconfigure the comphy/GoP/MAC when the link
state is updated at runtime. This is very useful on boards where many
link speed are supported: depending on what is negotiated the PPv2
driver will automatically reconfigures the link between the PHY and the
MAC.
Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/marvell')
-rw-r--r-- | drivers/net/ethernet/marvell/mvpp2.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c index 670395235932..358a9de9daa7 100644 --- a/drivers/net/ethernet/marvell/mvpp2.c +++ b/drivers/net/ethernet/marvell/mvpp2.c @@ -5771,9 +5771,28 @@ static void mvpp2_link_event(struct net_device *dev) { struct mvpp2_port *port = netdev_priv(dev); struct phy_device *phydev = dev->phydev; + bool link_reconfigured = false; u32 val; if (phydev->link) { + if (port->phy_interface != phydev->interface && port->comphy) { + /* disable current port for reconfiguration */ + mvpp2_interrupts_disable(port); + netif_carrier_off(port->dev); + mvpp2_port_disable(port); + phy_power_off(port->comphy); + + /* comphy reconfiguration */ + port->phy_interface = phydev->interface; + mvpp22_comphy_init(port); + + /* gop/mac reconfiguration */ + mvpp22_gop_init(port); + mvpp2_port_mii_set(port); + + link_reconfigured = true; + } + if ((port->speed != phydev->speed) || (port->duplex != phydev->duplex)) { mvpp2_gmac_set_autoneg(port, phydev); @@ -5783,7 +5802,7 @@ static void mvpp2_link_event(struct net_device *dev) } } - if (phydev->link != port->link) { + if (phydev->link != port->link || link_reconfigured) { port->link = phydev->link; if (phydev->link) { |