From 874a28a4f9aa59485bc37792cfa8f2f9192fcb32 Mon Sep 17 00:00:00 2001 From: Bhadram Varka Date: Fri, 18 Nov 2022 11:31:45 +0530 Subject: [PATCH] NVIDIA: SAUCE: net: phy: aqr113c: skip PHY low power mode BugLink: https://bugs.launchpad.net/bugs/2072591 Issue: Uncorrectable Errors are observed when the MGBE1 the interface is going down or in SC7 since PHY is put into low power mode without powering the UPHY lanes and UPHY lanes can't be power down in ethernet server enabled case where lanes are shared with other VF's. Fix: Skip PHY low power mode in automotive platforms. http://nvbugs/3683205 Signed-off-by: Bhadram Varka Signed-off-by: Revanth Kumar Uppala Tested-by: Abhilash G Reviewed-by: Abhilash G Reviewed-by: Laxman Dewangan Signed-off-by: Laxman Dewangan Acked-by: Jacob Martin Acked-by: Noah Wager Signed-off-by: Noah Wager --- drivers/net/phy/aquantia/aquantia_main.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/drivers/net/phy/aquantia/aquantia_main.c b/drivers/net/phy/aquantia/aquantia_main.c index 05561afcec61..cc3b220913b9 100644 --- a/drivers/net/phy/aquantia/aquantia_main.c +++ b/drivers/net/phy/aquantia/aquantia_main.c @@ -227,6 +227,7 @@ struct aqr107_priv { int led_mode1; int led_mode2; int wol_status; + bool skip_lpm; /* skip low power mode */ }; static int aqr107_get_sset_count(struct phy_device *phydev) @@ -951,8 +952,12 @@ static int aqr107_get_rate_matching(struct phy_device *phydev, static int aqr107_suspend(struct phy_device *phydev) { + struct aqr107_priv *priv = phydev->priv; int err; + if (priv->skip_lpm) + return 0; + err = phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, MDIO_CTRL1, MDIO_CTRL1_LPOWER); if (err) @@ -963,8 +968,12 @@ static int aqr107_suspend(struct phy_device *phydev) static int aqr107_resume(struct phy_device *phydev) { + struct aqr107_priv *priv = phydev->priv; int err; + if (priv->skip_lpm) + return 0; + err = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, MDIO_CTRL1, MDIO_CTRL1_LPOWER); if (err) @@ -1049,6 +1058,8 @@ static int aqr113c_config_init(struct phy_device *phydev) static int aqr107_probe(struct phy_device *phydev) { + struct device_node *node = phydev->mdio.dev.of_node; + struct aqr107_priv *priv; int ret; phydev->priv = devm_kzalloc(&phydev->mdio.dev, @@ -1059,6 +1070,13 @@ static int aqr107_probe(struct phy_device *phydev) ret = aqr_firmware_load(phydev); if (ret) return ret; + + priv = phydev->priv; + if (of_property_read_bool(node, "aquantia,skip-lpm")) + priv->skip_lpm = true; + else + priv->skip_lpm = false; + aqr_read_led_mode_cfg(phydev); return aqr_hwmon_probe(phydev);