]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: macb: fix SGMII with inband aneg disabled
authorCharles Perry <charles.perry@microchip.com>
Tue, 24 Feb 2026 20:28:52 +0000 (12:28 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 27 Feb 2026 03:19:24 +0000 (19:19 -0800)
Make it possible to connect a PHY which does not use inband
autoneg to a gem MAC using phylink's information.

The previous implementation relied on whether or not the link
was a fixed-link to disable SGMII autoneg. This commit extend
this to all link which are not configured for inband
autonegotiation.

Signed-off-by: Charles Perry <charles.perry@microchip.com>
Link: https://patch.msgid.link/20260224202854.112813-2-charles.perry@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/cadence/macb_main.c

index 3709b2224879e5f6d8f50d1506218427478bd5fc..fc26e70e23d42f9afca2c4f85d5e165e66a6df24 100644 (file)
@@ -574,6 +574,26 @@ static int macb_pcs_config(struct phylink_pcs *pcs,
                           const unsigned long *advertising,
                           bool permit_pause_to_mac)
 {
+       struct macb *bp = container_of(pcs, struct macb, phylink_sgmii_pcs);
+       u32 old, new;
+
+       old = gem_readl(bp, PCSANADV);
+       new = phylink_mii_c22_pcs_encode_advertisement(interface, advertising);
+       if (new != -EINVAL && old != new)
+               gem_writel(bp, PCSANADV, new);
+
+       /* Disable AN if it's not to be used, enable otherwise.
+        * Must be written after PCSSEL is set in NCFGR which is done in
+        * macb_mac_config(), otherwise writes will not take effect.
+        */
+       old = gem_readl(bp, PCSCNTRL);
+       if (neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED)
+               new = old | BMCR_ANENABLE;
+       else
+               new = old & ~BMCR_ANENABLE;
+       if (old != new)
+               gem_writel(bp, PCSCNTRL, new);
+
        return 0;
 }
 
@@ -628,22 +648,6 @@ static void macb_mac_config(struct phylink_config *config, unsigned int mode,
        if (old_ncr ^ ncr)
                macb_or_gem_writel(bp, NCR, ncr);
 
-       /* Disable AN for SGMII fixed link configuration, enable otherwise.
-        * Must be written after PCSSEL is set in NCFGR,
-        * otherwise writes will not take effect.
-        */
-       if (macb_is_gem(bp) && state->interface == PHY_INTERFACE_MODE_SGMII) {
-               u32 pcsctrl, old_pcsctrl;
-
-               old_pcsctrl = gem_readl(bp, PCSCNTRL);
-               if (mode == MLO_AN_FIXED)
-                       pcsctrl = old_pcsctrl & ~GEM_BIT(PCSAUTONEG);
-               else
-                       pcsctrl = old_pcsctrl | GEM_BIT(PCSAUTONEG);
-               if (old_pcsctrl != pcsctrl)
-                       gem_writel(bp, PCSCNTRL, pcsctrl);
-       }
-
        spin_unlock_irqrestore(&bp->lock, flags);
 }