This patch force the XLG MAC link state in the phylink link_up() and
link_down() helpers when not using in-band auto-negotiation. This mimics
what's already done for the GMAC and follows what's advised in the
phylink documentation.

Signed-off-by: Antoine Tenart <antoine.ten...@bootlin.com>
---
 drivers/net/ethernet/marvell/mvpp2/mvpp2.h    |  2 ++
 .../net/ethernet/marvell/mvpp2/mvpp2_main.c   | 35 +++++++++++++------
 2 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h 
b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
index 687e011de5ef..c9edeac9ec01 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2.h
@@ -430,6 +430,8 @@
 #define MVPP22_XLG_CTRL0_REG                   0x100
 #define     MVPP22_XLG_CTRL0_PORT_EN           BIT(0)
 #define     MVPP22_XLG_CTRL0_MAC_RESET_DIS     BIT(1)
+#define     MVPP22_XLG_CTRL0_FORCE_LINK_DOWN   BIT(2)
+#define     MVPP22_XLG_CTRL0_FORCE_LINK_PASS   BIT(3)
 #define     MVPP22_XLG_CTRL0_RX_FLOW_CTRL_EN   BIT(7)
 #define     MVPP22_XLG_CTRL0_TX_FLOW_CTRL_EN   BIT(8)
 #define     MVPP22_XLG_CTRL0_MIB_CNT_DIS       BIT(14)
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c 
b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index 59ee9e7545b0..9138baa392d8 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -4685,6 +4685,7 @@ static void mvpp2_mac_config(struct net_device *dev, 
unsigned int mode,
 
        /* Make sure the port is disabled when reconfiguring the mode */
        mvpp2_port_disable(port);
+
        if (port->priv->hw_version == MVPP22 && change_interface) {
                mvpp22_gop_mask_irq(port);
 
@@ -4718,11 +4719,18 @@ static void mvpp2_mac_link_up(struct net_device *dev, 
unsigned int mode,
        struct mvpp2_port *port = netdev_priv(dev);
        u32 val;
 
-       if (!phylink_autoneg_inband(mode) && !mvpp2_is_xlg(interface)) {
-               val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
-               val &= ~MVPP2_GMAC_FORCE_LINK_DOWN;
-               val |= MVPP2_GMAC_FORCE_LINK_PASS;
-               writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
+       if (!phylink_autoneg_inband(mode)) {
+               if (mvpp2_is_xlg(interface)) {
+                       val = readl(port->base + MVPP22_XLG_CTRL0_REG);
+                       val &= ~MVPP22_XLG_CTRL0_FORCE_LINK_DOWN;
+                       val |= MVPP22_XLG_CTRL0_FORCE_LINK_PASS;
+                       writel(val, port->base + MVPP22_XLG_CTRL0_REG);
+               } else {
+                       val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
+                       val &= ~MVPP2_GMAC_FORCE_LINK_DOWN;
+                       val |= MVPP2_GMAC_FORCE_LINK_PASS;
+                       writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
+               }
        }
 
        mvpp2_port_enable(port);
@@ -4738,11 +4746,18 @@ static void mvpp2_mac_link_down(struct net_device *dev, 
unsigned int mode,
        struct mvpp2_port *port = netdev_priv(dev);
        u32 val;
 
-       if (!phylink_autoneg_inband(mode) && !mvpp2_is_xlg(interface)) {
-               val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
-               val &= ~MVPP2_GMAC_FORCE_LINK_PASS;
-               val |= MVPP2_GMAC_FORCE_LINK_DOWN;
-               writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
+       if (!phylink_autoneg_inband(mode)) {
+               if (mvpp2_is_xlg(interface)) {
+                       val = readl(port->base + MVPP22_XLG_CTRL0_REG);
+                       val &= ~MVPP22_XLG_CTRL0_FORCE_LINK_PASS;
+                       val |= MVPP22_XLG_CTRL0_FORCE_LINK_DOWN;
+                       writel(val, port->base + MVPP22_XLG_CTRL0_REG);
+               } else {
+                       val = readl(port->base + MVPP2_GMAC_AUTONEG_CONFIG);
+                       val &= ~MVPP2_GMAC_FORCE_LINK_PASS;
+                       val |= MVPP2_GMAC_FORCE_LINK_DOWN;
+                       writel(val, port->base + MVPP2_GMAC_AUTONEG_CONFIG);
+               }
        }
 
        netif_tx_stop_all_queues(dev);
-- 
2.20.1

Reply via email to