Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89273bc0 authored by Antoine Tenart's avatar Antoine Tenart Committed by David S. Miller
Browse files

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: default avatarAntoine Tenart <antoine.tenart@free-electrons.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 65a2c09a
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -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) {