mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
net: macb: fix SGMII with inband aneg disabled
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>
This commit is contained in:
parent
363c5108e4
commit
1338cfef1f
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user