[WCNCR00148136] softap: add dfs shut down flow

[Description]
Add dfs shut down flow

Change-Id: I9cc613aeeed556d0444889e514c8eb63513da682
Feature: softap
Signed-off-by: Chun Lee <chun.lee@mediatek.com>
CR-Id: WCNCR00148136
diff --git a/common/wlan_oid.c b/common/wlan_oid.c
index ee11d4a..1241a6a 100644
--- a/common/wlan_oid.c
+++ b/common/wlan_oid.c
@@ -12003,7 +12003,9 @@
 	prSetRddReport = (P_PARAM_CUSTOM_SET_RDD_REPORT_T) pvSetBuffer;
 
 	prCmdRddOnOffCtrl = (P_CMD_RDD_ON_OFF_CTRL_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
-					sizeof(P_CMD_RDD_ON_OFF_CTRL_T));
+					sizeof(*prCmdRddOnOffCtrl));
+
+	ASSERT_BREAK((prCmdRddOnOffCtrl != NULL));
 
 	prCmdRddOnOffCtrl->ucDfsCtrl = RDD_RADAR_EMULATE;
 
@@ -12024,9 +12026,11 @@
 					TRUE,   /* fgIsOid*/
 					nicCmdEventSetCommon, /* REF: wlanoidSetDbdcEnable */
 					nicOidCmdTimeoutCommon,
-					sizeof(CMD_RDD_ON_OFF_CTRL_T),
+					sizeof(*prCmdRddOnOffCtrl),
 					(PUINT_8) (prCmdRddOnOffCtrl), pvSetBuffer, u4SetBufferLen);
 
+	cnmMemFree(prAdapter, prCmdRddOnOffCtrl);
+
 	return rWlanStatus;
 }
 
@@ -12067,7 +12071,9 @@
 	prSetRadarDetectMode = (P_PARAM_CUSTOM_SET_RADAR_DETECT_MODE_T) pvSetBuffer;
 
 	prCmdRddOnOffCtrl = (P_CMD_RDD_ON_OFF_CTRL_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
-					sizeof(P_CMD_RDD_ON_OFF_CTRL_T));
+					sizeof(*prCmdRddOnOffCtrl));
+
+	ASSERT_BREAK((prCmdRddOnOffCtrl != NULL));
 
 	prCmdRddOnOffCtrl->ucDfsCtrl = RDD_DET_MODE;
 
@@ -12083,9 +12089,11 @@
 					TRUE,   /* fgIsOid*/
 					nicCmdEventSetCommon, /* REF: wlanoidSetDbdcEnable */
 					nicOidCmdTimeoutCommon,
-					sizeof(CMD_RDD_ON_OFF_CTRL_T),
+					sizeof(*prCmdRddOnOffCtrl),
 					(PUINT_8) (prCmdRddOnOffCtrl), pvSetBuffer, u4SetBufferLen);
 
+	cnmMemFree(prAdapter, prCmdRddOnOffCtrl);
+
 	return rWlanStatus;
 }
 #endif
diff --git a/include/mgmt/p2p_func.h b/include/mgmt/p2p_func.h
index 09eedca..8f9c0bc 100644
--- a/include/mgmt/p2p_func.h
+++ b/include/mgmt/p2p_func.h
@@ -145,6 +145,8 @@
 #if (CFG_SUPPORT_DFS_MASTER == 1)
 VOID p2pFuncStartRdd(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBssIdx);
 
+VOID p2pFuncStopRdd(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBssIdx);
+
 VOID p2pFuncDfsSwitchCh(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prBssInfo, IN P2P_CHNL_REQ_INFO_T rP2pChnlReqInfo);
 
 BOOLEAN p2pFuncCheckWeatherRadarBand(IN P_P2P_CHNL_REQ_INFO_T prChnlReqInfo);
diff --git a/mgmt/p2p_func.c b/mgmt/p2p_func.c
index 35580ba..cba7f64 100644
--- a/mgmt/p2p_func.c
+++ b/mgmt/p2p_func.c
@@ -1032,6 +1032,8 @@
 		prCmdRddOnOffCtrl = (P_CMD_RDD_ON_OFF_CTRL_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
 					sizeof(*prCmdRddOnOffCtrl));
 
+		ASSERT_BREAK((prCmdRddOnOffCtrl != NULL));
+
 		prCmdRddOnOffCtrl->ucDfsCtrl = RDD_START;
 
 		prCmdRddOnOffCtrl->ucRddIdx = prAdapter->aprBssInfo[ucBssIdx]->eDBDCBand;
@@ -1060,11 +1062,53 @@
 					FALSE,
 					NULL,
 					NULL,
-					sizeof(CMD_RDD_ON_OFF_CTRL_T), (PUINT_8) prCmdRddOnOffCtrl, NULL, 0);
+					sizeof(*prCmdRddOnOffCtrl), (PUINT_8) prCmdRddOnOffCtrl, NULL, 0);
+
+		cnmMemFree(prAdapter, prCmdRddOnOffCtrl);
 
 	} while (FALSE);
 }				/* p2pFuncStartRdd */
 
+VOID p2pFuncStopRdd(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBssIdx)
+{
+	P_CMD_RDD_ON_OFF_CTRL_T prCmdRddOnOffCtrl;
+
+	DEBUGFUNC("p2pFuncStopRdd()");
+
+	do {
+		ASSERT_BREAK((prAdapter != NULL));
+
+		prCmdRddOnOffCtrl = (P_CMD_RDD_ON_OFF_CTRL_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
+					sizeof(*prCmdRddOnOffCtrl));
+
+		ASSERT_BREAK((prCmdRddOnOffCtrl != NULL));
+
+		prCmdRddOnOffCtrl->ucDfsCtrl = RDD_STOP;
+
+		prCmdRddOnOffCtrl->ucRddIdx = prAdapter->aprBssInfo[ucBssIdx]->eDBDCBand;
+
+		if (prCmdRddOnOffCtrl->ucRddIdx)
+			prCmdRddOnOffCtrl->ucRddInSel = RDD_IN_SEL_1;
+		else
+			prCmdRddOnOffCtrl->ucRddInSel = RDD_IN_SEL_0;
+
+		DBGLOG(P2P, INFO, "p2pFuncStopRdd: Stop Radar detection - DFS ctrl: %d, RDD index: %d\n",
+				prCmdRddOnOffCtrl->ucDfsCtrl, prCmdRddOnOffCtrl->ucRddIdx);
+
+		wlanSendSetQueryCmd(prAdapter,
+					CMD_ID_RDD_ON_OFF_CTRL,
+					TRUE,
+					FALSE,
+					FALSE,
+					NULL,
+					NULL,
+					sizeof(*prCmdRddOnOffCtrl), (PUINT_8) prCmdRddOnOffCtrl, NULL, 0);
+
+		cnmMemFree(prAdapter, prCmdRddOnOffCtrl);
+
+	} while (FALSE);
+}				/* p2pFuncStopRdd */
+
 VOID p2pFuncDfsSwitchCh(IN P_ADAPTER_T prAdapter, IN P_BSS_INFO_T prBssInfo, IN P2P_CHNL_REQ_INFO_T rP2pChnlReqInfo)
 {
 
@@ -1092,7 +1136,9 @@
 		nicUpdateBss(prAdapter, prBssInfo->ucBssIndex);
 
 		prCmdRddOnOffCtrl = (P_CMD_RDD_ON_OFF_CTRL_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
-						sizeof(P_CMD_RDD_ON_OFF_CTRL_T));
+						sizeof(*prCmdRddOnOffCtrl));
+
+		ASSERT_BREAK((prCmdRddOnOffCtrl != NULL));
 
 		prCmdRddOnOffCtrl->ucDfsCtrl = RDD_START_TXQ;
 
@@ -1105,7 +1151,9 @@
 					FALSE,
 					NULL,
 					NULL,
-					sizeof(CMD_RDD_ON_OFF_CTRL_T), (PUINT_8) prCmdRddOnOffCtrl, NULL, 0);
+					sizeof(*prCmdRddOnOffCtrl), (PUINT_8) prCmdRddOnOffCtrl, NULL, 0);
+
+		cnmMemFree(prAdapter, prCmdRddOnOffCtrl);
 
 		prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter, prBssInfo->u4PrivateData);
 
diff --git a/mgmt/p2p_role_fsm.c b/mgmt/p2p_role_fsm.c
index 1b69269..d57a271 100644
--- a/mgmt/p2p_role_fsm.c
+++ b/mgmt/p2p_role_fsm.c
@@ -1067,7 +1067,9 @@
 		if (!prP2pBssInfo)
 			break;
 
-
+#if (CFG_SUPPORT_DFS_MASTER == 1)
+		p2pFuncStopRdd(prAdapter, prP2pBssInfo->ucBssIndex);
+#endif
 
 		if (prP2pRoleFsmInfo->eCurrentState != P2P_ROLE_STATE_REQING_CHANNEL) {
 			p2pFuncStopGO(prAdapter, prP2pBssInfo);
diff --git a/os/linux/gl_ate_agent.c b/os/linux/gl_ate_agent.c
index 2bbbee2..23e766e 100644
--- a/os/linux/gl_ate_agent.c
+++ b/os/linux/gl_ate_agent.c
@@ -2070,20 +2070,20 @@
 {
 	INT_32 i4Status;
 	INT_32 rv;
-	int byPassCacTime;
-	UINT_8 ucByPassCacTime;
+	INT_32 i4ByPassCacTime;
+	UINT_32 u4ByPassCacTime;
 
 	DBGLOG(REQ, INFO, "MT6632 : ATE_AGENT iwpriv Set By Pass Cac, buf: %s\n", prInBuf);
 
-	rv = kstrtoint(prInBuf, 0, &byPassCacTime);
+	rv = kstrtoint(prInBuf, 0, &i4ByPassCacTime);
 
 	DBGLOG(REQ, INFO, "MT6632 : ATE_AGENT iwpriv Set By Pass Cac, prInBuf: %s\n", prInBuf);
-	DBGLOG(INIT, ERROR, "MT6632 : ATE_AGENT iwpriv Set By Pass Cac : %dsec\n", byPassCacTime);
+	DBGLOG(INIT, ERROR, "MT6632 : ATE_AGENT iwpriv Set By Pass Cac : %dsec\n", i4ByPassCacTime);
 
-	ucByPassCacTime = (UINT_8) byPassCacTime;
+	u4ByPassCacTime = (UINT_32) i4ByPassCacTime;
 
 	if (rv == 0)
-		i4Status = p2pFuncSetManualCacTime(ucByPassCacTime);
+		i4Status = p2pFuncSetManualCacTime(u4ByPassCacTime);
 	else
 		return -EINVAL;
 
diff --git a/os/linux/gl_p2p_cfg80211.c b/os/linux/gl_p2p_cfg80211.c
index de39374..314c6e4 100644
--- a/os/linux/gl_p2p_cfg80211.c
+++ b/os/linux/gl_p2p_cfg80211.c
@@ -1750,6 +1750,11 @@
 		DBGLOG(P2P, TRACE, "mtk_p2p_cfg80211_stop_ap.\n");
 		prGlueInfo = *((P_GLUE_INFO_T *) wiphy_priv(wiphy));
 
+#if (CFG_SUPPORT_DFS_MASTER == 1)
+		netif_carrier_off(dev);
+		netif_tx_stop_all_queues(dev);
+#endif
+
 		if (mtk_Netdev_To_RoleIdx(prGlueInfo, dev, &ucRoleIdx) < 0)
 			break;
 		/* Switch OP MOde. */