Commit 2dfa4e31 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'net-phy-microchip-lan88xx-reliability-fixes'

Oleksij Rempel says:

====================
net: phy: microchip: LAN88xx reliability fixes

This patch series improves the reliability of the Microchip LAN88xx
PHYs, particularly in edge cases involving fixed link configurations or
forced speed modes.

Patch 1 assigns genphy_soft_reset() to the .soft_reset hook to ensure
that stale link partner advertisement (LPA) bits are properly cleared
during reconfiguration. Without this, outdated autonegotiation bits may
remain visible in some parallel detection cases.

Patch 2 restricts the 100 Mbps workaround (originally intended to handle
cable length switching) to only run when the link transitions to the
PHY_NOLINK state. This prevents repeated toggling that can confuse
autonegotiating link partners such as the Intel i350, leading to
unstable link cycles.

Both patches were tested on a LAN7850 (with integrated LAN88xx PHY)
against an Intel I350 NIC. The full test suite - autonegotiation, fixed
link, and parallel detection - passed successfully.
====================

Link: https://patch.msgid.link/20250709130753.3994461-1-o.rempel@pengutronix.de


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 01b8114b dd4360c0
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -332,7 +332,7 @@ static void lan88xx_link_change_notify(struct phy_device *phydev)
	 * As workaround, set to 10 before setting to 100
	 * at forced 100 F/H mode.
	 */
	if (!phydev->autoneg && phydev->speed == 100) {
	if (phydev->state == PHY_NOLINK && !phydev->autoneg && phydev->speed == 100) {
		/* disable phy interrupt */
		temp = phy_read(phydev, LAN88XX_INT_MASK);
		temp &= ~LAN88XX_INT_MASK_MDINTPIN_EN_;
@@ -488,6 +488,7 @@ static struct phy_driver microchip_phy_driver[] = {
	.config_init	= lan88xx_config_init,
	.config_aneg	= lan88xx_config_aneg,
	.link_change_notify = lan88xx_link_change_notify,
	.soft_reset	= genphy_soft_reset,

	/* Interrupt handling is broken, do not define related
	 * functions to force polling.