[Feature][T8TSK-298][WIFI]wifi hwnat diff between 2 core and 4 core

Only Configure: No
Affected branch: GSW3.0-No-Connman
Affected module: WIFI
Is it affected on both ZXIC and MTK: only MTK
Self-test: Yes
Doc Update: No

Change-Id: I5c9240af9473c967bd6d248019d592f8004e41d6
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_mount_nand b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_mount_nand
index f901286..9e3d750 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_mount_nand
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-core/initial/files/init_mount_nand
@@ -186,6 +186,11 @@
 
 #you.chen@2022-07-11 add for load oemapp begin
 init_oemapp() {
+	#jb.qi add for enable hwnat on 20231205
+	RESULT="$(cat /proc/cpuinfo|grep processor|wc -l)"
+	if [ $RESULT = 2 ]; then
+		ifconfig eth0 up
+	fi
 
 	mnt_folder oemdata /oemdata
 
diff --git a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.c b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.c
index 25d9476..9164ea7 100755
--- a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.c
+++ b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.c
@@ -61,6 +61,14 @@
 #include <linux/notifier.h>
 #include <linux/irq.h>
 #include <net/addrconf.h>
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+#include <net/ra_nat.h>
+#include <linux/kthread.h>
+#include <linux/sched.h>
+#include <linux/workqueue.h>
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
 #ifdef ENABLE_ADAPTIVE_SCHED
 #include <linux/cpufreq.h>
 #endif /* ENABLE_ADAPTIVE_SCHED */
@@ -3577,6 +3585,17 @@
 	uint8 htsfdlystat_sz = 0;
 
 	DHD_TRACE(("%s: Enter\n", __FUNCTION__));
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+	if (ppe_hook_tx_wifi) {
+		 if (ppe_hook_tx_wifi(skb, 0) == 0) {
+			 printk("morris ppe_hook_tx_wifi debug");
+				dev_kfree_skb_any(skb);
+				return NETDEV_TX_OK;
+		 }
+	}
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
 
 	if (dhd_query_bus_erros(&dhd->pub)) {
 #ifdef CFI_CHECK
@@ -4990,11 +5009,32 @@
 			bcm_object_trace_opr(skb, BCM_OBJDBG_REMOVE,
 				__FUNCTION__, __LINE__);
 			DHD_PERIM_UNLOCK_ALL((dhd->fwder_unit % FWDER_MAX_UNIT));
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+			if (ppe_hook_rx_wifi){
+				FOE_MAGIC_TAG(skb) = FOE_MAGIC_WLAN;
+				if (ppe_hook_rx_wifi(skb)) {
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
 #if defined(DHD_LB_RXP)
 			netif_receive_skb(skb);
 #else /* !defined(DHD_LB_RXP) */
 			netif_rx(skb);
 #endif /* !defined(DHD_LB_RXP) */
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+			}
+		}
+		if (!ppe_hook_rx_wifi){
+
+			#if defined(DHD_LB_RXP)
+			netif_receive_skb(skb);
+			#else /* !defined(DHD_LB_RXP) */
+			netif_rx(skb);
+			#endif /* !defined(DHD_LB_RXP) */
+		 }
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
 			DHD_PERIM_LOCK_ALL((dhd->fwder_unit % FWDER_MAX_UNIT));
 		} else {
 			if (dhd->rxthread_enabled) {
@@ -5021,11 +5061,32 @@
 		dhd_tcpack_suppress_set(&dhd->pub, TCPACK_SUP_OFF);
 #endif /* BCMPCIE && DHDTCPACK_SUPPRESS */
 				DHD_PERIM_UNLOCK_ALL((dhd->fwder_unit % FWDER_MAX_UNIT));
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+		if (ppe_hook_rx_wifi) {
+                	FOE_MAGIC_TAG(skb) = FOE_MAGIC_WLAN;
+                	if (ppe_hook_rx_wifi(skb)) {
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
+
 #if defined(DHD_LB_RXP)
 				netif_receive_skb(skb);
 #else /* !defined(DHD_LB_RXP) */
 				netif_rx_ni(skb);
 #endif /* defined(DHD_LB_RXP) */
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+			}
+		}
+			if (!ppe_hook_rx_wifi){
+#if defined(DHD_LB_RXP)
+				netif_receive_skb(skb);
+#else /* !defined(DHD_LB_RXP) */
+                       		netif_rx_ni(skb);
+#endif /* !defined(DHD_LB_RXP) */
+     			}
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
 				DHD_PERIM_LOCK_ALL((dhd->fwder_unit % FWDER_MAX_UNIT));
 			}
 		}
@@ -12481,6 +12542,21 @@
 		DHD_ERROR(("couldn't register the net device [%s], err %d\n", net->name, err));
 		goto fail;
 	}
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+	else {
+
+                if (ppe_dev_register_hook != NULL){
+                       printk("\n\nppe_dev_register_hook\n\n");
+                       ppe_dev_register_hook(net);
+		}
+		else{
+
+		}
+
+       }
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
 
 	printf("Register interface [%s]  MAC: "MACDBG"\n\n", net->name,
 #if defined(CUSTOMER_HW4_DEBUG)
diff --git a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.h b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.h
index 53a727a..d449b24 100755
--- a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.h
+++ b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.h
@@ -401,7 +401,14 @@
 
 int dhd_get_fw_mode(struct dhd_info *dhdinfo);
 bool dhd_update_fw_nv_path(struct dhd_info *dhdinfo);
-
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+extern int (*ppe_hook_rx_wifi)(struct sk_buff *skb);
+extern int (*ppe_hook_tx_wifi)(struct sk_buff *skb, int gmac_no);
+extern void (*ppe_dev_register_hook)(struct net_device *dev);
+extern void (*ppe_dev_unregister_hook)(struct net_device *dev);
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
 #if defined(BT_OVER_SDIO)
 int dhd_net_bus_get(struct net_device *dev);
 int dhd_net_bus_put(struct net_device *dev);
diff --git a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_msgbuf.c b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_msgbuf.c
index 26638d4..1e4c18f 100755
--- a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_msgbuf.c
+++ b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_msgbuf.c
@@ -4537,7 +4537,11 @@
 			dhd->rx_pktgetfail++;
 			break;
 		}
-
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+		skb_reserve((struct sk_buff*)p, NET_SKB_PAD+4);
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
 		pktlen[i] = PKTLEN(dhd->osh, p);
 		if (SECURE_DMA_ENAB(dhd->osh)) {
 			pa = SECURE_DMA_MAP(dhd->osh, PKTDATA(dhd->osh, p), pktlen[i],
diff --git a/src/kernel/linux/v4.19/net/core/skbuff.c b/src/kernel/linux/v4.19/net/core/skbuff.c
index 5ca38ed..3a8cad0 100644
--- a/src/kernel/linux/v4.19/net/core/skbuff.c
+++ b/src/kernel/linux/v4.19/net/core/skbuff.c
@@ -399,8 +399,13 @@
 	void *data;
 
 	len += NET_SKB_PAD;
-
+/*jb.qi add for wifi hwnat on 20231205 start*/
+#if CONFIG_MTK_CORE_NUM == 2
+	if(true ||
+#else
 	if ((len > SKB_WITH_OVERHEAD(PAGE_SIZE)) ||
+#endif
+/*jb.qi add for wifi hwnat on 20231205 end*/
 	    (gfp_mask & (__GFP_DIRECT_RECLAIM | GFP_DMA))) {
 		skb = __alloc_skb(len, gfp_mask, SKB_ALLOC_RX, NUMA_NO_NODE);
 		if (!skb)