[WCNCR00148136] softap: add dfs test cmd

[Description]
Add dfs test cmd

Change-Id: I3a93066c37b6210bfc7dc84e90e1248cbc36528d
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 95f3a6e..ee11d4a 100644
--- a/common/wlan_oid.c
+++ b/common/wlan_oid.c
@@ -12029,6 +12029,65 @@
 
 	return rWlanStatus;
 }
+
+/*----------------------------------------------------------------------------*/
+/*!
+* \brief This routine is called to set rdd report.
+*
+* \param[in] pvAdapter Pointer to the Adapter structure.
+* \param[out] pvQueryBuf A pointer to the buffer that holds the result of
+*                           the query.
+* \param[in] u4QueryBufLen The length of the query buffer.
+* \param[out] pu4QueryInfoLen If the call is successful, returns the number of
+*                            bytes written into the query buffer. If the call
+*                            failed due to invalid length of the query buffer,
+*                            returns the amount of storage needed.
+*
+* \retval WLAN_STATUS_SUCCESS
+* \retval WLAN_STATUS_INVALID_LENGTH
+*/
+/*----------------------------------------------------------------------------*/
+WLAN_STATUS
+wlanoidQuerySetRadarDetectMode(IN P_ADAPTER_T prAdapter, IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen,
+			 OUT PUINT_32 pu4SetInfoLen)
+{
+	P_PARAM_CUSTOM_SET_RADAR_DETECT_MODE_T prSetRadarDetectMode;
+	P_CMD_RDD_ON_OFF_CTRL_T prCmdRddOnOffCtrl;
+	WLAN_STATUS rWlanStatus = WLAN_STATUS_SUCCESS;
+
+	DEBUGFUNC("wlanoidQuerySetRadarDetectMode");
+
+	ASSERT(prAdapter);
+	ASSERT(pu4SetInfoLen);
+
+	*pu4SetInfoLen = sizeof(P_PARAM_CUSTOM_SET_RADAR_DETECT_MODE_T);
+
+	ASSERT(pvSetBuffer);
+
+	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));
+
+	prCmdRddOnOffCtrl->ucDfsCtrl = RDD_DET_MODE;
+
+	prCmdRddOnOffCtrl->ucRadarDetectMode = prSetRadarDetectMode->ucRadarDetectMode;
+
+	DBGLOG(INIT, INFO, "MT6632 : wlanoidQuerySetRadarDetectMode -  DFS ctrl: %.d, Radar Detect Mode: %d\n",
+	prCmdRddOnOffCtrl->ucDfsCtrl, prCmdRddOnOffCtrl->ucRadarDetectMode);
+
+	rWlanStatus = wlanSendSetQueryCmd(prAdapter,
+					CMD_ID_RDD_ON_OFF_CTRL,
+					TRUE,   /* fgSetQuery Bit:  True->write  False->read*/
+					FALSE,   /* fgNeedResp */
+					TRUE,   /* fgIsOid*/
+					nicCmdEventSetCommon, /* REF: wlanoidSetDbdcEnable */
+					nicOidCmdTimeoutCommon,
+					sizeof(CMD_RDD_ON_OFF_CTRL_T),
+					(PUINT_8) (prCmdRddOnOffCtrl), pvSetBuffer, u4SetBufferLen);
+
+	return rWlanStatus;
+}
 #endif
 
 /*----------------------------------------------------------------------------*/
diff --git a/include/mgmt/p2p_func.h b/include/mgmt/p2p_func.h
index bf86db1..09eedca 100644
--- a/include/mgmt/p2p_func.h
+++ b/include/mgmt/p2p_func.h
@@ -162,6 +162,10 @@
 PUINT_8 p2pFuncJpW53RadarType(VOID);
 
 PUINT_8 p2pFuncJpW56RadarType(VOID);
+
+VOID p2pFuncSetRadarDetectMode(IN UINT_8 ucRadarDetectMode);
+
+UINT_8 p2pFuncGetRadarDetectMode(VOID);
 #endif
 
 VOID p2pFuncSetChannel(IN P_ADAPTER_T prAdapter, IN UINT_8 ucRoleIdx, IN P_RF_CHANNEL_INFO_T prRfChannelInfo);
diff --git a/include/mgmt/p2p_role.h b/include/mgmt/p2p_role.h
index 696d581..e528daa 100644
--- a/include/mgmt/p2p_role.h
+++ b/include/mgmt/p2p_role.h
@@ -191,7 +191,7 @@
 	UINT_8 ucPRICountM1TH;
 	UINT_8 ucPRICountM2;
 	UINT_8 ucPRICountM2TH;
-	UINT_32 u4PRI1st;
+	UINT_32 u4PRI1stUs;
 	LONG_PULSE_BUFFER_T arLpbContent[32];
 	PERIODIC_PULSE_BUFFER_T arPpbContent[32];
 } P2P_RADAR_INFO_T, *P_P2P_RADAR_INFO_T;
diff --git a/include/nic_cmd_event.h b/include/nic_cmd_event.h
index f000b6a..6197a17 100644
--- a/include/nic_cmd_event.h
+++ b/include/nic_cmd_event.h
@@ -1593,6 +1593,7 @@
 	UINT_8 ucRddIdx;
 	UINT_8 ucRddInSel;
 	UINT_8 ucRegDomain;
+	UINT_8 ucRadarDetectMode;
 } CMD_RDD_ON_OFF_CTRL_T, *P_CMD_RDD_ON_OFF_CTRL_T;
 #endif
 
@@ -2317,7 +2318,7 @@
 	UINT_8 ucPRICountM1TH;
 	UINT_8 ucPRICountM2;
 	UINT_8 ucPRICountM2TH;
-	UINT_32 u4PRI1st;
+	UINT_32 u4PRI1stUs;
 	LONG_PULSE_BUFFER_T arLpbContent[32];
 	PERIODIC_PULSE_BUFFER_T arPpbContent[32];
 } EVENT_RDD_REPORT_T, *P_EVENT_RDD_REPORT_T;
diff --git a/include/wlan_oid.h b/include/wlan_oid.h
index fe25815..6e1a232 100644
--- a/include/wlan_oid.h
+++ b/include/wlan_oid.h
@@ -723,6 +723,10 @@
 typedef struct _PARAM_CUSTOM_SET_RDD_REPORT_T {
 	UINT_8 ucDbdcIdx; /* 0:Band 0, 1: Band1 */
 } PARAM_CUSTOM_SET_RDD_REPORT_T, *P_PARAM_CUSTOM_SET_RDD_REPORT_T;
+
+typedef struct _PARAM_CUSTOM_SET_RADAR_DETECT_MODE_T {
+	UINT_8 ucRadarDetectMode; /* 0:Switch channel, 1: Don't switch channel */
+} PARAM_CUSTOM_SET_RADAR_DETECT_MODE_T, *P_PARAM_CUSTOM_SET_RADAR_DETECT_MODE_T;
 #endif
 
 typedef struct _PARAM_CUSTOM_ACCESS_RX_STAT {
@@ -2749,6 +2753,10 @@
 WLAN_STATUS
 wlanoidQuerySetRddReport(IN P_ADAPTER_T prAdapter,
 			IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen);
+
+WLAN_STATUS
+wlanoidQuerySetRadarDetectMode(IN P_ADAPTER_T prAdapter,
+			IN PVOID pvSetBuffer, IN UINT_32 u4SetBufferLen, OUT PUINT_32 pu4SetInfoLen);
 #endif
 
 #if CFG_AUTO_CHANNEL_SEL_SUPPORT
diff --git a/mgmt/cnm.c b/mgmt/cnm.c
index 7206015..55daee3 100644
--- a/mgmt/cnm.c
+++ b/mgmt/cnm.c
@@ -435,6 +435,8 @@
 		}
 	}
 
+	p2pFuncRadarInfoInit();
+
 	g_rP2pRadarInfo.ucRadarReportMode = prEventBody->ucRadarReportMode;
 	g_rP2pRadarInfo.ucRddIdx = prEventBody->ucRddIdx;
 	g_rP2pRadarInfo.ucLongDetected = prEventBody->ucLongDetected;
@@ -447,7 +449,7 @@
 	g_rP2pRadarInfo.ucPRICountM1TH = prEventBody->ucPRICountM1TH;
 	g_rP2pRadarInfo.ucPRICountM2 = prEventBody->ucPRICountM2;
 	g_rP2pRadarInfo.ucPRICountM2TH = prEventBody->ucPRICountM2TH;
-	g_rP2pRadarInfo.u4PRI1st = prEventBody->u4PRI1st;
+	g_rP2pRadarInfo.u4PRI1stUs = prEventBody->u4PRI1stUs;
 	kalMemCopy(&g_rP2pRadarInfo.arLpbContent[0], &prEventBody->arLpbContent[0],
 				prEventBody->ucLPBNum*sizeof(LONG_PULSE_BUFFER_T));
 	kalMemCopy(&g_rP2pRadarInfo.arPpbContent[0], &prEventBody->arPpbContent[0],
diff --git a/mgmt/p2p_func.c b/mgmt/p2p_func.c
index e5a109c..3099641 100644
--- a/mgmt/p2p_func.c
+++ b/mgmt/p2p_func.c
@@ -81,6 +81,7 @@
 #if (CFG_SUPPORT_DFS_MASTER == 1)
 BOOLEAN g_fgManualCac = FALSE;
 UINT_32 g_u4ManualCacTime;
+UINT_8 g_ucRadarDetectMode;
 P2P_RADAR_INFO_T g_rP2pRadarInfo;
 PUINT_8 apucW53RadarType[3] = {
 	(PUINT_8) DISP_STRING("Unknown Type"),
@@ -1183,7 +1184,10 @@
 
 VOID p2pFuncRadarInfoInit(VOID)
 {
-	UINT_8 ucCnt;
+
+	kalMemZero(&g_rP2pRadarInfo, sizeof(g_rP2pRadarInfo));
+
+/*	UINT_8 ucCnt;
 
 	g_rP2pRadarInfo.ucRadarReportMode = 0;
 	g_rP2pRadarInfo.ucRddIdx = 0;
@@ -1197,7 +1201,7 @@
 	g_rP2pRadarInfo.ucPRICountM1TH = 0;
 	g_rP2pRadarInfo.ucPRICountM2 = 0;
 	g_rP2pRadarInfo.ucPRICountM2TH = 0;
-	g_rP2pRadarInfo.u4PRI1st = 0;
+	g_rP2pRadarInfo.u4PRI1stUs = 0;
 
 	for (ucCnt = 0; ucCnt < 32; ucCnt++) {
 		g_rP2pRadarInfo.arPpbContent[ucCnt].u4PeriodicStartTime = 0;
@@ -1207,6 +1211,7 @@
 		g_rP2pRadarInfo.arLpbContent[ucCnt].u4LongStartTime = 0;
 		g_rP2pRadarInfo.arLpbContent[ucCnt].u2LongPulseWidth = 0;
 	}
+*/
 
 }
 
@@ -1250,24 +1255,24 @@
 		DBGLOG(P2P, INFO, "start time	pulse width	PRI\n");
 
 		if (g_rP2pRadarInfo.ucPeriodicDetected) {
-			DBGLOG(P2P, INFO, "%d		%d		-\n"
+			DBGLOG(P2P, INFO, "%-10d    %-11d    -\n"
 				, g_rP2pRadarInfo.arPpbContent[ucCnt].u4PeriodicStartTime
 				, g_rP2pRadarInfo.arPpbContent[ucCnt].u2PeriodicPulseWidth);
 
 			for (ucCnt = 1; ucCnt < g_rP2pRadarInfo.ucPPBNum; ucCnt++) {
-				DBGLOG(P2P, INFO, "%d		%d		%d\n"
+				DBGLOG(P2P, INFO, "%-10d    %-11d    %d\n"
 					, g_rP2pRadarInfo.arPpbContent[ucCnt].u4PeriodicStartTime
 					, g_rP2pRadarInfo.arPpbContent[ucCnt].u2PeriodicPulseWidth
 					, (g_rP2pRadarInfo.arPpbContent[ucCnt].u4PeriodicStartTime
 						- g_rP2pRadarInfo.arPpbContent[ucCnt-1].u4PeriodicStartTime) * 2 / 5);
 			}
 		} else if (g_rP2pRadarInfo.ucLongDetected) {
-			DBGLOG(P2P, INFO, "%d		%d		-\n"
+			DBGLOG(P2P, INFO, "%-10d    %-11d    -\n"
 				, g_rP2pRadarInfo.arLpbContent[ucCnt].u4LongStartTime
 				, g_rP2pRadarInfo.arLpbContent[ucCnt].u2LongPulseWidth);
 
 			for (ucCnt = 1; ucCnt < g_rP2pRadarInfo.ucLPBNum; ucCnt++) {
-				DBGLOG(P2P, INFO, "%d		%d		%d\n"
+				DBGLOG(P2P, INFO, "%-10d    %-11d    %d\n"
 					, g_rP2pRadarInfo.arLpbContent[ucCnt].u4LongStartTime
 					, g_rP2pRadarInfo.arLpbContent[ucCnt].u2LongPulseWidth
 					, (g_rP2pRadarInfo.arLpbContent[ucCnt].u4LongStartTime
@@ -1282,15 +1287,15 @@
 	UINT_32 u4Type1Diff;
 	UINT_32 u4Type2Diff;
 
-	if (g_rP2pRadarInfo.u4PRI1st >= 1428)
-		u4Type1Diff = g_rP2pRadarInfo.u4PRI1st - 1428;
+	if (g_rP2pRadarInfo.u4PRI1stUs >= 1428)
+		u4Type1Diff = g_rP2pRadarInfo.u4PRI1stUs - 1428;
 	else
-		u4Type1Diff = 1428 - g_rP2pRadarInfo.u4PRI1st;
+		u4Type1Diff = 1428 - g_rP2pRadarInfo.u4PRI1stUs;
 
-	if (g_rP2pRadarInfo.u4PRI1st >= 3846)
-		u4Type2Diff = g_rP2pRadarInfo.u4PRI1st - 3846;
+	if (g_rP2pRadarInfo.u4PRI1stUs >= 3846)
+		u4Type2Diff = g_rP2pRadarInfo.u4PRI1stUs - 3846;
 	else
-		u4Type2Diff = 3846 - g_rP2pRadarInfo.u4PRI1st;
+		u4Type2Diff = 3846 - g_rP2pRadarInfo.u4PRI1stUs;
 
 	if (u4Type1Diff < u4Type2Diff)
 		return apucW53RadarType[1];
@@ -1306,20 +1311,20 @@
 	if (g_rP2pRadarInfo.ucLongDetected)
 		return apucW56RadarType[7];
 
-	if (g_rP2pRadarInfo.u4PRI1st >= 3980 && g_rP2pRadarInfo.u4PRI1st <= 4020)
+	if (g_rP2pRadarInfo.u4PRI1stUs >= 3980 && g_rP2pRadarInfo.u4PRI1stUs <= 4020)
 		return apucW56RadarType[3];
 
-	if (g_rP2pRadarInfo.u4PRI1st >= 1368 && g_rP2pRadarInfo.u4PRI1st <= 1448) {
+	if (g_rP2pRadarInfo.u4PRI1stUs >= 1368 && g_rP2pRadarInfo.u4PRI1stUs <= 1448) {
 
-		if (g_rP2pRadarInfo.u4PRI1st >= 1388)
-			u4Type1Diff = g_rP2pRadarInfo.u4PRI1st - 1388;
+		if (g_rP2pRadarInfo.u4PRI1stUs >= 1388)
+			u4Type1Diff = g_rP2pRadarInfo.u4PRI1stUs - 1388;
 		else
-			u4Type1Diff = 1388 - g_rP2pRadarInfo.u4PRI1st;
+			u4Type1Diff = 1388 - g_rP2pRadarInfo.u4PRI1stUs;
 
-		if (g_rP2pRadarInfo.u4PRI1st >= 1428)
-			u4Type2Diff = g_rP2pRadarInfo.u4PRI1st - 1428;
+		if (g_rP2pRadarInfo.u4PRI1stUs >= 1428)
+			u4Type2Diff = g_rP2pRadarInfo.u4PRI1stUs - 1428;
 		else
-			u4Type2Diff = 1428 - g_rP2pRadarInfo.u4PRI1st;
+			u4Type2Diff = 1428 - g_rP2pRadarInfo.u4PRI1stUs;
 
 		if (u4Type1Diff < u4Type2Diff)
 			return apucW56RadarType[1];
@@ -1328,15 +1333,15 @@
 
 	}
 
-	if (g_rP2pRadarInfo.u4PRI1st >= 130 && g_rP2pRadarInfo.u4PRI1st < 200)
+	if (g_rP2pRadarInfo.u4PRI1stUs >= 130 && g_rP2pRadarInfo.u4PRI1stUs < 200)
 		return apucW56RadarType[4];
 
-	if (g_rP2pRadarInfo.u4PRI1st >= 200 && g_rP2pRadarInfo.u4PRI1st <= 520) {
+	if (g_rP2pRadarInfo.u4PRI1stUs >= 200 && g_rP2pRadarInfo.u4PRI1stUs <= 520) {
 
-		if (g_rP2pRadarInfo.u4PRI1st <= 230)
+		if (g_rP2pRadarInfo.u4PRI1stUs <= 230)
 		return apucW56RadarType[9];
 
-		if (g_rP2pRadarInfo.u4PRI1st >= 323 && g_rP2pRadarInfo.u4PRI1st <= 343)
+		if (g_rP2pRadarInfo.u4PRI1stUs >= 323 && g_rP2pRadarInfo.u4PRI1stUs <= 343)
 			return apucW56RadarType[10];
 
 		return apucW56RadarType[11];
@@ -1344,6 +1349,18 @@
 
 	return apucW56RadarType[0];
 }
+
+VOID p2pFuncSetRadarDetectMode(IN UINT_8 ucRadarDetectMode)
+{
+	g_ucRadarDetectMode = ucRadarDetectMode;
+
+	DBGLOG(P2P, INFO, "p2pFuncSetRadarDetectMode: g_ucRadarDetectMode: %d\n", g_ucRadarDetectMode);
+}
+
+UINT_8 p2pFuncGetRadarDetectMode(VOID)
+{
+	return g_ucRadarDetectMode;
+}
 #endif
 
 #if 0
diff --git a/mgmt/p2p_role_fsm.c b/mgmt/p2p_role_fsm.c
index 2c50709..d6ffe78 100644
--- a/mgmt/p2p_role_fsm.c
+++ b/mgmt/p2p_role_fsm.c
@@ -1215,10 +1215,14 @@
 				prP2pRoleFsmInfo->eCurrentState != P2P_ROLE_STATE_IDLE)
 			ASSERT(FALSE);
 
+		if (p2pFuncGetRadarDetectMode())
+			DBGLOG(P2P, INFO, "p2pRoleFsmRunEventRadarDet: Ignore radar event\n");
+		else {
 		if (prP2pRoleFsmInfo->eCurrentState == P2P_ROLE_STATE_DFS_CAC)
 			p2pRoleFsmStateTransition(prAdapter, prP2pRoleFsmInfo, P2P_ROLE_STATE_IDLE);
 
 		kalP2PRddDetectUpdate(prAdapter->prGlueInfo, prP2pRoleFsmInfo->ucRoleIndex);
+		}
 
 		p2pFuncShowRadarInfo(prAdapter, prMsgP2pRddDetMsg->ucBssIndex);
 
diff --git a/os/linux/gl_ate_agent.c b/os/linux/gl_ate_agent.c
index 4cf6dc2..2bbbee2 100644
--- a/os/linux/gl_ate_agent.c
+++ b/os/linux/gl_ate_agent.c
@@ -175,6 +175,7 @@
 #if (CFG_SUPPORT_DFS_MASTER == 1)
 	{"RDDReport", SetRddReport},
 	{"ByPassCac", SetByPassCac},
+	{"RadarDetectMode", SetRadarDetectMode},
 #endif
 
 	{NULL,}
@@ -2089,6 +2090,49 @@
 	return i4Status;
 }
 
+/*----------------------------------------------------------------------------*/
+/*!
+* \brief  This routine is called to Set Radar Detect Mode.
+*
+* \param[in] prNetDev		Pointer to the Net Device
+* \param[in] prInBuf		A pointer to the command string buffer
+* \param[out] None
+*
+* \retval 0				On success.
+* \retval -EINVAL			If invalid argument.
+*/
+/*----------------------------------------------------------------------------*/
+int SetRadarDetectMode(struct net_device *prNetDev, UINT_8 *prInBuf)
+{
+	INT_32 i4Status;
+	INT_32 rv;
+	int radarDetectMode;
+	UINT_8 ucRadarDetectMode;
+
+	DBGLOG(REQ, INFO, "MT6632 : ATE_AGENT iwpriv Set Radar Detect Mode, buf: %s\n", prInBuf);
+
+	rv = kstrtoint(prInBuf, 0, &radarDetectMode);
+
+	DBGLOG(REQ, INFO, "MT6632 : ATE_AGENT iwpriv Set Radar Detect Mode, prInBuf: %s\n", prInBuf);
+	DBGLOG(INIT, ERROR, "MT6632 : ATE_AGENT iwpriv Set Radar Detect Mode : %d\n", radarDetectMode);
+
+	ucRadarDetectMode = (UINT_8) radarDetectMode;
+
+	if (ucRadarDetectMode > 1) {
+		DBGLOG(REQ, ERROR, "Radar Detect Mode > 1, Invalid data\n");
+		return WLAN_STATUS_INVALID_DATA;
+	}
+
+	p2pFuncSetRadarDetectMode(ucRadarDetectMode);
+
+	if (rv == 0)
+		i4Status = MT_ATESetRadarDetectMode(prNetDev, ucRadarDetectMode);
+	else
+		return -EINVAL;
+
+	return i4Status;
+}
+
 #endif
 
 /*----------------------------------------------------------------------------*/
diff --git a/os/linux/gl_hook_api.c b/os/linux/gl_hook_api.c
index 393dd0d..3d20778 100644
--- a/os/linux/gl_hook_api.c
+++ b/os/linux/gl_hook_api.c
@@ -2610,6 +2610,45 @@
 
 	return i4Status;
 }
+
+/*----------------------------------------------------------------------------*/
+/*!
+* \brief  Hook API for Set Radar Detect Mode.
+*
+* \param[in] prNetDev				 Pointer to the Net Device
+* \param[in] ucRadarDetectMode         Radar Detect Mode
+* \param[out] None
+*
+* \retval 0				On success.
+* \retval -EFAULT			If kalIoctl return nonzero.
+* \retval -EINVAL			If invalid argument.
+*/
+/*----------------------------------------------------------------------------*/
+INT_32 MT_ATESetRadarDetectMode(struct net_device *prNetDev, UINT_8 ucRadarDetectMode)
+{
+	UINT_32 u4BufLen = 0;
+	PARAM_CUSTOM_SET_RADAR_DETECT_MODE_T rSetRadarDetectMode;
+	P_GLUE_INFO_T prGlueInfo = NULL;
+	WLAN_STATUS i4Status = WLAN_STATUS_SUCCESS;
+
+	prGlueInfo = *((P_GLUE_INFO_T *) netdev_priv(prNetDev));
+	kalMemSet(&rSetRadarDetectMode, 0, sizeof(PARAM_CUSTOM_SET_RADAR_DETECT_MODE_T));
+
+	/* Set Rdd Report */
+	DBGLOG(INIT, INFO, "MT6632 : QA_AGENT Set Radar Detect Mode: %d\n", ucRadarDetectMode);
+	rSetRadarDetectMode.ucRadarDetectMode = ucRadarDetectMode;
+
+	i4Status = kalIoctl(prGlueInfo,
+				wlanoidQuerySetRadarDetectMode,
+				&rSetRadarDetectMode,
+				sizeof(PARAM_CUSTOM_SET_RADAR_DETECT_MODE_T), FALSE, FALSE, TRUE, &u4BufLen);
+
+	if (i4Status != WLAN_STATUS_SUCCESS)
+		return -EFAULT;
+
+	return i4Status;
+}
+
 #endif
 
 #if CFG_SUPPORT_TX_BF
diff --git a/os/linux/include/gl_ate_agent.h b/os/linux/include/gl_ate_agent.h
index c1403df..c61d8f4 100644
--- a/os/linux/include/gl_ate_agent.h
+++ b/os/linux/include/gl_ate_agent.h
@@ -190,6 +190,7 @@
 #if (CFG_SUPPORT_DFS_MASTER == 1)
 int SetRddReport(struct net_device *prNetDev, UINT_8 *prInBuf);
 int SetByPassCac(struct net_device *prNetDev, UINT_8 *prInBuf);
+int SetRadarDetectMode(struct net_device *prNetDev, UINT_8 *prInBuf);
 #endif
 
 
diff --git a/os/linux/include/gl_hook_api.h b/os/linux/include/gl_hook_api.h
index b3387d9..9c14f72 100644
--- a/os/linux/include/gl_hook_api.h
+++ b/os/linux/include/gl_hook_api.h
@@ -148,6 +148,7 @@
 INT_32 MT_ATESetTxTargetPower(struct net_device *prNetDev, UINT_8 ucTxTargetPower);
 #if (CFG_SUPPORT_DFS_MASTER == 1)
 INT_32 MT_ATESetRddReport(struct net_device *prNetDev, UINT_8 ucDbdcIdx);
+INT_32 MT_ATESetRadarDetectMode(struct net_device *prNetDev, UINT_8 ucRadarDetectMode);
 #endif