From 30c4c4301ea071945f102607e2afb19f35891d15 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Wed, 29 Apr 2026 11:35:45 +0200 Subject: [PATCH] microchipsw: fix LAN8814 QSGMII soft reset Currently, moving from a port on one LAN8814 PHY package to another results in a no traffic flowing on that new port. It was tracked down to upstream change that fixed the issue that QSGMII was soft reset on .config_init of each of 4 PHY-s in the package resulting in a temporary traffic loss until QSGMII resynced. However, it seems that the QSGMII soft reset timing is crucial and doing the reset during probe only cause the QSGMII link to become partially unsynced (Like 2 or 3 lanes are not synced). So, add an upstream pending patch[1] to fix this, patch was modified as we dont have the inband caps currently. [1] https://patchwork.kernel.org/project/netdevbpf/patch/20260428134138.1741253-1-robert.marko@sartura.hr/ Signed-off-by: Robert Marko --- ...micrel-fix-LAN8814-QSGMII-soft-reset.patch | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 target/linux/microchipsw/patches-6.18/131-net-phy-micrel-fix-LAN8814-QSGMII-soft-reset.patch diff --git a/target/linux/microchipsw/patches-6.18/131-net-phy-micrel-fix-LAN8814-QSGMII-soft-reset.patch b/target/linux/microchipsw/patches-6.18/131-net-phy-micrel-fix-LAN8814-QSGMII-soft-reset.patch new file mode 100644 index 00000000000..f70f2b4eaad --- /dev/null +++ b/target/linux/microchipsw/patches-6.18/131-net-phy-micrel-fix-LAN8814-QSGMII-soft-reset.patch @@ -0,0 +1,56 @@ +From f9184cc6c809bc1de331fa1bece2797f54167985 Mon Sep 17 00:00:00 2001 +From: Robert Marko +Date: Tue, 28 Apr 2026 15:09:36 +0200 +Subject: [PATCH net] net: phy: micrel: fix LAN8814 QSGMII soft reset + +LAN8814 QSGMII soft reset was moved into the probe function to avoid +triggering it for each of 4 PHY-s in the package. + +However, that broke QSGMII link between the MAC and PHY on most LAN8814 +PHY-s, specificaly for us on the Microchip LAN969x switch. +Reading the QSGMII status registers it was visible that lanes were only +partially synced. + +It looks like the reset timing is crucial, so lets move the reset back +into the .config_init function but guard it with phy_package_init_once() +to avoid it being triggered on each of 4 PHY-s in the package. +Change the probe function to use phy_package_probe_once() for coma and PtP +setup. + +Fixes: 96a9178a29a6 ("net: phy: micrel: lan8814 fix reset of the QSGMII interface") +Signed-off-by: Robert Marko +--- + drivers/net/phy/micrel.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +--- a/drivers/net/phy/micrel.c ++++ b/drivers/net/phy/micrel.c +@@ -4389,6 +4389,13 @@ static int lan8814_config_init(struct ph + { + struct kszphy_priv *lan8814 = phydev->priv; + ++ if (phy_package_init_once(phydev)) ++ /* Reset the PHY */ ++ lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, ++ LAN8814_QSGMII_SOFT_RESET, ++ LAN8814_QSGMII_SOFT_RESET_BIT, ++ LAN8814_QSGMII_SOFT_RESET_BIT); ++ + /* Disable ANEG with QSGMII PCS Host side */ + lanphy_modify_page_reg(phydev, LAN8814_PAGE_PORT_REGS, + LAN8814_QSGMII_PCS1G_ANEG_CONFIG, +@@ -4473,13 +4480,7 @@ static int lan8814_probe(struct phy_devi + devm_phy_package_join(&phydev->mdio.dev, phydev, + addr, sizeof(struct lan8814_shared_priv)); + +- if (phy_package_init_once(phydev)) { +- /* Reset the PHY */ +- lanphy_modify_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, +- LAN8814_QSGMII_SOFT_RESET, +- LAN8814_QSGMII_SOFT_RESET_BIT, +- LAN8814_QSGMII_SOFT_RESET_BIT); +- ++ if (phy_package_probe_once(phydev)) { + err = lan8814_release_coma_mode(phydev); + if (err) + return err; -- 2.47.3