[][kernel][common][eth][Fix panic issue for mtk_pending_work]
[Description]
Fix panic issue for mtk_pending_work.
If without this patch, mtk_pending_work might cause kernel panic
in the one gmac system.
[Release-log]
N/A
Change-Id: I9d2940645d738bac8888a7410c5ad5586a08c115
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/6814894
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 d35dddb..ee9cd47 100755
--- 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
@@ -3561,10 +3561,15 @@
mtk_prepare_reset_fe(eth);
/* Trigger Wifi SER reset */
- call_netdevice_notifiers(MTK_FE_START_RESET, eth->netdev[0]);
- rtnl_unlock();
- wait_for_completion_timeout(&wait_ser_done, 5000);
- rtnl_lock();
+ for (i = 0; i < MTK_MAC_COUNT; i++) {
+ if (!eth->netdev[i])
+ continue;
+ call_netdevice_notifiers(MTK_FE_START_RESET, eth->netdev[i]);
+ rtnl_unlock();
+ wait_for_completion_timeout(&wait_ser_done, 5000);
+ rtnl_lock();
+ break;
+ }
while (test_and_set_bit_lock(MTK_RESETTING, ð->state))
cpu_relax();
@@ -3591,7 +3596,7 @@
/* restart DMA and enable IRQs */
for (i = 0; i < MTK_MAC_COUNT; i++) {
- if (!test_bit(i, &restart))
+ if (!test_bit(i, &restart) || !eth->netdev[i])
continue;
err = mtk_open(eth->netdev[i]);
if (err) {
@@ -3615,6 +3620,8 @@
/* Power up sgmii */
for (i = 0; i < MTK_MAC_COUNT; i++) {
+ if (!eth->netdev[i])
+ continue;
mac = netdev_priv(eth->netdev[i]);
phy_node = of_parse_phandle(mac->of_node, "phy-handle", 0);
if (!phy_node && eth->xgmii->regmap_sgmii[i]) {
@@ -3623,11 +3630,15 @@
}
}
- call_netdevice_notifiers(MTK_FE_RESET_NAT_DONE, eth->netdev[0]);
- pr_info("[%s] HNAT reset done !\n", __func__);
-
- call_netdevice_notifiers(MTK_FE_RESET_DONE, eth->netdev[0]);
- pr_info("[%s] WiFi SER reset done !\n", __func__);
+ for (i = 0; i < MTK_MAC_COUNT; i++) {
+ if (!eth->netdev[i])
+ continue;
+ call_netdevice_notifiers(MTK_FE_RESET_NAT_DONE, eth->netdev[i]);
+ pr_info("[%s] HNAT reset done !\n", __func__);
+ call_netdevice_notifiers(MTK_FE_RESET_DONE, eth->netdev[i]);
+ pr_info("[%s] WiFi SER reset done !\n", __func__);
+ break;
+ }
atomic_dec(&reset_lock);
if (atomic_read(&force) > 0)