[WCNCR00166605]cert: Modification flow control threshold value for WMM certification

[Description]
Change netif_stop_subqueue threshold for different priority AC queues.

Change-Id: I970e444a6070a08df7c397a4985fdb7bacbfd203
Signed-off-by: Ryan Hou <ryan.hou@mediatek.com>
CR-Id: WCNCR00166605
Feature: cert
Reviewed-on: http://gerrit.mediatek.inc:8080/1255180
CheckPatch: Check Patch <srv_checkpatch@mediatek.com>
Reviewed-by: TH3 Huang <th3.huang@mediatek.com>
Reviewed-by: Wayne Guo <wayne.guo@mediatek.com>
Build: srv_neptune_adm <srv_neptune_adm@mediatek.com>
diff --git a/os/linux/gl_kal.c b/os/linux/gl_kal.c
index 5be6e6d..b67cfaa 100644
--- a/os/linux/gl_kal.c
+++ b/os/linux/gl_kal.c
@@ -1503,14 +1503,40 @@
 	 *     Else, remians the original threshold.
 	*/
 	if (prGlueInfo->prAdapter->rWifiVar.ucTpTestMode == ENUM_TP_TEST_MODE_SIGMA_AC_N_PMF) {
+		P_BSS_INFO_T prWmmBssInfo = prGlueInfo->prAdapter->aprBssInfo[ucBssIndex];
+
 		if ((u2QueueIdx < 3) &&
-		   (GLUE_GET_REF_CNT(prGlueInfo->ai4TxPendingFrameNumPerQueue[ucBssIndex][u2QueueIdx+1])
-		    > 64))
-			u4MaxTxPendingNum = (prGlueInfo->prAdapter->rWifiVar.u4NetifStopTh >> 3);
+			(GLUE_GET_REF_CNT(prGlueInfo->ai4TxPendingFrameNumPerQueue[ucBssIndex][u2QueueIdx+1])
+			> CFG_CERT_WMM_MAX_TX_PENDING)) {
+			/*
+			*	Use au8Statistics[RX_SIZE_ERR_DROP_COUNT] to track RX traffic in certification.
+			*/
+			if ((prWmmBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT) &&
+				((prDev->stats.rx_packets -
+				(prGlueInfo->prAdapter->rRxCtrl.au8Statistics[RX_SIZE_ERR_DROP_COUNT]))
+				> CFG_CERT_WMM_MAX_RX_NUM))
+
+				u4MaxTxPendingNum = CFG_CERT_WMM_LOW_STOP_TX_WITH_RX;
+
+			else
+				u4MaxTxPendingNum = CFG_CERT_WMM_LOW_STOP_TX_WO_RX;
+		}
 		else if ((u2QueueIdx > 0) &&
 			(GLUE_GET_REF_CNT(prGlueInfo->ai4TxPendingFrameNumPerQueue[ucBssIndex][u2QueueIdx-1])
-		    > 64))
-			u4MaxTxPendingNum = (prGlueInfo->prAdapter->rWifiVar.u4NetifStopTh * 3);
+			> CFG_CERT_WMM_MAX_TX_PENDING)) {
+			/*
+			*	Use au8Statistics[RX_SIZE_ERR_DROP_COUNT] to track RX traffic in certification.
+			*/
+			if ((prWmmBssInfo->eCurrentOPMode == OP_MODE_ACCESS_POINT) &&
+				((prDev->stats.rx_packets -
+				(prGlueInfo->prAdapter->rRxCtrl.au8Statistics[RX_SIZE_ERR_DROP_COUNT]))
+				> CFG_CERT_WMM_MAX_RX_NUM))
+
+				u4MaxTxPendingNum = CFG_CERT_WMM_HIGH_STOP_TX_WITH_RX;
+
+			else
+				u4MaxTxPendingNum = CFG_CERT_WMM_HIGH_STOP_TX_WO_RX;
+		}
 		else
 			u4MaxTxPendingNum = prGlueInfo->prAdapter->rWifiVar.u4NetifStopTh;
 	}
@@ -1525,6 +1551,10 @@
 		       GLUE_GET_REF_CNT(prGlueInfo->i4TxPendingFrameNum),
 		       GLUE_GET_REF_CNT(prGlueInfo->ai4TxPendingFrameNumPerQueue[ucBssIndex]
 					[u2QueueIdx]));
+
+		/* Re-use au8Statistics[RX_SIZE_ERR_DROP_COUNT] buffer to track RX traffic in certification */
+		if (prGlueInfo->prAdapter->rWifiVar.ucTpTestMode == ENUM_TP_TEST_MODE_SIGMA_AC_N_PMF)
+			prGlueInfo->prAdapter->rRxCtrl.au8Statistics[RX_SIZE_ERR_DROP_COUNT] = prDev->stats.rx_packets;
 	}
 
 	/* Update NetDev statisitcs */
diff --git a/os/linux/include/gl_os.h b/os/linux/include/gl_os.h
index b1e7dad..f5aaea1 100644
--- a/os/linux/include/gl_os.h
+++ b/os/linux/include/gl_os.h
@@ -93,6 +93,14 @@
 #define CFG_TX_STOP_NETIF_PER_QUEUE_THRESHOLD   512	/* packets */
 #define CFG_TX_START_NETIF_PER_QUEUE_THRESHOLD  128	/* packets */
 
+/* WMM Certification Related */
+#define CFG_CERT_WMM_MAX_TX_PENDING			20
+#define CFG_CERT_WMM_MAX_RX_NUM				10
+#define CFG_CERT_WMM_HIGH_STOP_TX_WITH_RX	(CFG_TX_STOP_NETIF_PER_QUEUE_THRESHOLD * 3)
+#define CFG_CERT_WMM_HIGH_STOP_TX_WO_RX		(CFG_TX_STOP_NETIF_PER_QUEUE_THRESHOLD * 2)
+#define CFG_CERT_WMM_LOW_STOP_TX_WITH_RX	(CFG_TX_STOP_NETIF_PER_QUEUE_THRESHOLD >> 4)
+#define CFG_CERT_WMM_LOW_STOP_TX_WO_RX		(CFG_TX_STOP_NETIF_PER_QUEUE_THRESHOLD >> 3)
+
 #define CHIP_NAME    "MT6632"
 
 #define DRV_NAME "["CHIP_NAME"]: "