[][Fix wandev not free]
[Description]
Fix wandev not free in wifi<->eth case.
To avoid "waiting for wandev to become free".
[Release-log]
N/A
Change-Id: Iea2d682b3f83f20b7eb5af80fc82e5e3dc7aec86
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/4656758
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
index de869b6..c0794e3 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.c
@@ -264,6 +264,7 @@
}
hnat_priv->g_ppdev = dev_get_by_name(&init_net, hnat_priv->ppd);
+ hnat_priv->g_wandev = dev_get_by_name(&init_net, hnat_priv->wan);
dev_info(hnat_priv->dev, "PPE%d hwnat start\n", ppe_id);
@@ -385,6 +386,9 @@
if (hnat_priv->g_ppdev)
dev_put(hnat_priv->g_ppdev);
+
+ if (hnat_priv->g_wandev)
+ dev_put(hnat_priv->g_wandev);
}
static struct notifier_block nf_hnat_netdevice_nb __read_mostly = {
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
index 178815b..c99b1ef 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat.h
@@ -657,6 +657,7 @@
u32 foe_etry_num;
struct net_device *g_ppdev;
+ struct net_device *g_wandev;
struct net_device *wifi_hook_if[MAX_IF_NUM];
struct extdev_entry *ext_if[MAX_EXT_DEVS];
struct timer_list hnat_sma_build_entry_timer;
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
index 7ced311..15404cd 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c
@@ -109,11 +109,11 @@
static inline struct net_device *get_wandev_from_index(int index)
{
- struct net_device *wandev = 0;
+ if (!hnat_priv->g_wandev)
+ hnat_priv->g_wandev = dev_get_by_name(&init_net, hnat_priv->wan);
- wandev = dev_get_by_name(&init_net, hnat_priv->wan);
- if (wandev->ifindex == index)
- return wandev;
+ if (hnat_priv->g_wandev && hnat_priv->g_wandev->ifindex == index)
+ return hnat_priv->g_wandev;
return NULL;
}
@@ -238,6 +238,24 @@
foe_clear_all_bind_entries(dev);
break;
+ case NETDEV_UNREGISTER:
+ if (IS_PPD(dev) && hnat_priv->g_ppdev) {
+ hnat_priv->g_ppdev = NULL;
+ dev_put(dev);
+ }
+ if (IS_WAN(dev) && hnat_priv->g_wandev) {
+ hnat_priv->g_wandev = NULL;
+ dev_put(dev);
+ }
+
+ break;
+ case NETDEV_REGISTER:
+ if (IS_PPD(dev) && !hnat_priv->g_ppdev)
+ hnat_priv->g_ppdev = dev_get_by_name(&init_net, hnat_priv->ppd);
+ if (IS_WAN(dev) && !hnat_priv->g_wandev)
+ hnat_priv->g_wandev = dev_get_by_name(&init_net, hnat_priv->wan);
+
+ break;
default:
break;
}