[][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;
 	}