[][kernel][common][eth][Fix a traffic stuck issue when changing the SGMII autoneg mode]
[Description]
Fix a traffic stuck issue when changing the SGMII autoneg mode.
Without this patch, the users may encounter a traffic stuck issue when
they change the SGMII autoneg mode using the ethtool.
[Release-log]
N/A
Change-Id: I5f3f9fe3716a81aa619ba1fefee27e972c8856c9
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8260077
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 6cf9fc5..6dfa6da 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -702,6 +702,9 @@
regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val);
spin_unlock(ð->syscfg0_lock);
+ /* Save the syscfg0 value for mac_finish */
+ mac->syscfg0 = val;
+
mac->interface = state->interface;
}
@@ -721,9 +724,6 @@
/* Decide how GMAC and SGMIISYS be mapped */
sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ?
0 : mac->id;
-
- /* Save the syscfg0 value for mac_finish */
- mac->syscfg0 = val;
spin_unlock(ð->syscfg0_lock);
} else if (state->interface == PHY_INTERFACE_MODE_USXGMII ||
state->interface == PHY_INTERFACE_MODE_10GKR ||
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_sgmii.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_sgmii.c
index 3cc8f90..bdb6662 100755
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_sgmii.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_sgmii.c
@@ -144,7 +144,7 @@
mdelay(1);
}
-int mtk_sgmii_need_powerdown(struct mtk_sgmii_pcs *mpcs)
+int mtk_sgmii_need_powerdown(struct mtk_sgmii_pcs *mpcs, unsigned int bmcr)
{
u32 val;
@@ -153,6 +153,10 @@
if (!(val & SGMII_LINK_STATYS))
return true;
+ /* need to power down sgmii if autoneg change */
+ if ((val & SGMII_AN_ENABLE) != bmcr)
+ return true;
+
return false;
}
@@ -455,7 +459,7 @@
}
if (mpcs->interface != interface ||
- mtk_sgmii_need_powerdown(mpcs)) {
+ mtk_sgmii_need_powerdown(mpcs, bmcr)) {
link_timer = phylink_get_link_timer_ns(interface);
if (link_timer < 0)
return link_timer;