[WCNCR00148136] softap: fix dfs memory bugs and remove jp illegal chan

[Description]
Fix dfs bugs and remove channel
1. Fix dfs memory bugs
2. Remove jp 5g illegal channel:38,42,46

Change-Id: I309ee89b313a67ead3a26b8656f036e28b503c39
Feature: softap
Signed-off-by: Chun Lee <chun.lee@mediatek.com>
CR-Id: WCNCR00148136
diff --git a/include/nic_cmd_event.h b/include/nic_cmd_event.h
index 6dd2f1d..a9e0cc7 100644
--- a/include/nic_cmd_event.h
+++ b/include/nic_cmd_event.h
@@ -1577,12 +1577,17 @@
 } CMD_BT_OVER_WIFI, *P_CMD_BT_OVER_WIFI;
 
 #if (CFG_SUPPORT_DFS_MASTER == 1)
+typedef enum _ENUM_REG_DOMAIN_T {
+	REG_DEFAULT = 0,
+	REG_JP_53,
+	REG_JP_56
+} ENUM_REG_DOMAIN_T, *P_ENUM_REG_DOMAIN_T;
+
 typedef struct _CMD_RDD_ON_OFF_CTRL_T {
 	UINT_8 ucDfsCtrl;
 	UINT_8 ucRddIdx;
-	UINT_16 u2CountryCode;
 	UINT_8 ucRddInSel;
-	UINT_8 ucReserve[3];
+	UINT_8 ucRegDomain;
 } CMD_RDD_ON_OFF_CTRL_T, *P_CMD_RDD_ON_OFF_CTRL_T;
 #endif
 
@@ -2263,6 +2268,34 @@
 	UINT_8 aucReserved2[8];
 } EVENT_CH_PRIVILEGE_T, *P_EVENT_CH_PRIVILEGE_T;
 
+typedef struct _LONG_PULSE_BUFFER_T {
+	UINT_32 u4LongStartTime;
+	UINT_16 u2LongPulseWidth;
+} LONG_PULSE_BUFFER_T, *PLONG_PULSE_BUFFER_T;
+
+typedef struct _PERIODIC_PULSE_BUFFER_T {
+	UINT_32 u4PeriodicStartTime;
+	UINT_16 u2PeriodicPulseWidth;
+	INT_16 i2PeriodicPulsePower;
+} PERIODIC_PULSE_BUFFER_T, *PPERIODIC_PULSE_BUFFER_T;
+
+typedef struct _EVENT_RDD_REPORT_T {
+	UINT_8 ucRadarReportMode; /*0: Only report radar detected;   1:  Add parameter reports*/
+	UINT_8 ucRddIdx;
+	UINT_8 ucLongDetected;
+	UINT_8 ucPeriodicDetected;
+	UINT_8 ucLPBNum;
+	UINT_8 ucPPBNum;
+	UINT_8 ucLPBPeriodValid;
+	UINT_8 ucLPBWidthValid;
+	UINT_8 ucPRICountM1;
+	UINT_8 ucPRICountM1TH;
+	UINT_8 ucPRICountM2;
+	UINT_8 ucPRICountM2TH;
+	LONG_PULSE_BUFFER_T arLpbContent[32];
+	PERIODIC_PULSE_BUFFER_T arPpbContent[32];
+} EVENT_RDD_REPORT_T, *P_EVENT_RDD_REPORT_T;
+
 typedef struct _EVENT_BSS_BEACON_TIMEOUT_T {
 	UINT_8 ucBssIndex;
 	UINT_8 ucReasonCode;
diff --git a/mgmt/p2p_func.c b/mgmt/p2p_func.c
index 5d5c76a..3eff14d 100644
--- a/mgmt/p2p_func.c
+++ b/mgmt/p2p_func.c
@@ -990,15 +990,23 @@
 VOID p2pFuncStartRdd(IN P_ADAPTER_T prAdapter, IN UINT_8 ucBssIdx)
 {
 	P_CMD_RDD_ON_OFF_CTRL_T prCmdRddOnOffCtrl;
+	P_P2P_ROLE_FSM_INFO_T prP2pRoleFsmInfo = (P_P2P_ROLE_FSM_INFO_T) NULL;
 	UINT_8 ucCountryChar[2];
+	UINT_16 u2CountryCode;
+	UINT_8 ucReqChnlNum;
 
 	DEBUGFUNC("p2pFuncStartRdd()");
 
 	do {
 		ASSERT_BREAK((prAdapter != NULL));
 
+		prP2pRoleFsmInfo = P2P_ROLE_INDEX_2_ROLE_FSM_INFO(prAdapter,
+				prAdapter->aprBssInfo[ucBssIdx]->u4PrivateData);
+
+		ucReqChnlNum = prP2pRoleFsmInfo->rChnlReqInfo.ucReqChnlNum;
+
 		prCmdRddOnOffCtrl = (P_CMD_RDD_ON_OFF_CTRL_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG,
-					sizeof(P_CMD_RDD_ON_OFF_CTRL_T));
+					sizeof(*prCmdRddOnOffCtrl));
 
 		prCmdRddOnOffCtrl->ucDfsCtrl = RDD_START;
 
@@ -1006,8 +1014,17 @@
 
 		ucCountryChar[0] = (UINT_8) prAdapter->rWifiVar.rConnSettings.u2CountryCode;
 		ucCountryChar[1] = (UINT_8) (prAdapter->rWifiVar.rConnSettings.u2CountryCode >> 8);
-		prCmdRddOnOffCtrl->u2CountryCode = (((UINT_16) ucCountryChar[0]) << 8) | ((UINT_16) ucCountryChar[1]);
-		DBGLOG(P2P, INFO, "Country code =  %x\n", prCmdRddOnOffCtrl->u2CountryCode);
+		u2CountryCode = (((UINT_16) ucCountryChar[0]) << 8) | ((UINT_16) ucCountryChar[1]);
+		DBGLOG(P2P, INFO, "Country code =  %x\n", u2CountryCode);
+
+		if (u2CountryCode == COUNTRY_CODE_JP) {
+			if (ucReqChnlNum >= 52 && ucReqChnlNum <= 64)
+				prCmdRddOnOffCtrl->ucRegDomain = REG_JP_53;
+			else if (ucReqChnlNum >= 100 && ucReqChnlNum <= 140)
+				prCmdRddOnOffCtrl->ucRegDomain = REG_JP_56;
+		} else {
+			prCmdRddOnOffCtrl->ucRegDomain = REG_DEFAULT;
+		}
 
 		if (prCmdRddOnOffCtrl->ucRddIdx)
 			prCmdRddOnOffCtrl->ucRddInSel = RDD_IN_SEL_1;
@@ -1080,6 +1097,18 @@
 						prGlueInfo->prP2PInfo[prP2pRoleFsmInfo->ucRoleIndex]->chandef);
 		DBGLOG(P2P, INFO, "p2pFuncDfsSwitchCh: Update to OS Done\n");
 
+		if (prGlueInfo->prP2PInfo[prP2pRoleFsmInfo->ucRoleIndex]->chandef->chan)
+			cnmMemFree(prGlueInfo->prAdapter,
+				prGlueInfo->prP2PInfo[prP2pRoleFsmInfo->ucRoleIndex]->chandef->chan);
+
+		prGlueInfo->prP2PInfo[prP2pRoleFsmInfo->ucRoleIndex]->chandef->chan = NULL;
+
+		if (prGlueInfo->prP2PInfo[prP2pRoleFsmInfo->ucRoleIndex]->chandef)
+			cnmMemFree(prGlueInfo->prAdapter,
+				prGlueInfo->prP2PInfo[prP2pRoleFsmInfo->ucRoleIndex]->chandef);
+
+		prGlueInfo->prP2PInfo[prP2pRoleFsmInfo->ucRoleIndex]->chandef = NULL;
+
 	} while (FALSE);
 }				/* p2pFuncDfsSwitchCh */
 #endif
diff --git a/os/linux/gl_init.c b/os/linux/gl_init.c
index 9c6bff5..af4f6f1 100644
--- a/os/linux/gl_init.c
+++ b/os/linux/gl_init.c
@@ -216,26 +216,24 @@
 	.max_power          = 30,                       \
 }
 static struct ieee80211_channel mtk_5ghz_channels[] = {
-	CHAN5G(34, 0), CHAN5G(36, 0),
-	CHAN5G(38, 0), CHAN5G(40, 0),
-	CHAN5G(42, 0), CHAN5G(44, 0),
-	CHAN5G(46, 0), CHAN5G(48, 0),
-	CHAN5G(52, 0), CHAN5G(56, 0),
-	CHAN5G(60, 0), CHAN5G(64, 0),
-	CHAN5G(100, 0), CHAN5G(104, 0),
-	CHAN5G(108, 0), CHAN5G(112, 0),
-	CHAN5G(116, 0), CHAN5G(120, 0),
-	CHAN5G(124, 0), CHAN5G(128, 0),
-	CHAN5G(132, 0), CHAN5G(136, 0),
-	CHAN5G(140, 0), CHAN5G(149, 0),
-	CHAN5G(153, 0), CHAN5G(157, 0),
-	CHAN5G(161, 0), CHAN5G(165, 0),
-	CHAN5G(169, 0), CHAN5G(173, 0),
-	CHAN5G(184, 0), CHAN5G(188, 0),
-	CHAN5G(192, 0), CHAN5G(196, 0),
-	CHAN5G(200, 0), CHAN5G(204, 0),
-	CHAN5G(208, 0), CHAN5G(212, 0),
-	CHAN5G(216, 0),
+	CHAN5G(34, 0), CHAN5G(36, 0),  /* Remove CH38, 42, 46 */
+	CHAN5G(40, 0), CHAN5G(44, 0),
+	CHAN5G(48, 0), CHAN5G(52, 0),
+	CHAN5G(56, 0), CHAN5G(60, 0),
+	CHAN5G(64, 0), CHAN5G(100, 0),
+	CHAN5G(104, 0), CHAN5G(108, 0),
+	CHAN5G(112, 0), CHAN5G(116, 0),
+	CHAN5G(120, 0), CHAN5G(124, 0),
+	CHAN5G(128, 0),	CHAN5G(132, 0),
+	CHAN5G(136, 0),	CHAN5G(140, 0),
+	CHAN5G(149, 0),	CHAN5G(153, 0),
+	CHAN5G(157, 0),	CHAN5G(161, 0),
+	CHAN5G(165, 0),	CHAN5G(169, 0),
+	CHAN5G(173, 0), CHAN5G(184, 0),
+	CHAN5G(188, 0),	CHAN5G(192, 0),
+	CHAN5G(196, 0),	CHAN5G(200, 0),
+	CHAN5G(204, 0),	CHAN5G(208, 0),
+	CHAN5G(212, 0),	CHAN5G(216, 0),
 };
 
 #define RATETAB_ENT(_rate, _rateid, _flags) \
diff --git a/os/linux/gl_p2p_kal.c b/os/linux/gl_p2p_kal.c
index f2b5cdd..e132ca7 100644
--- a/os/linux/gl_p2p_kal.c
+++ b/os/linux/gl_p2p_kal.c
@@ -1307,9 +1307,13 @@
 		if (prGlueInfo->prP2PInfo[ucRoleIndex]->chandef->chan)
 			cnmMemFree(prGlueInfo->prAdapter, prGlueInfo->prP2PInfo[ucRoleIndex]->chandef->chan);
 
+		prGlueInfo->prP2PInfo[ucRoleIndex]->chandef->chan = NULL;
+
 		if (prGlueInfo->prP2PInfo[ucRoleIndex]->chandef)
 			cnmMemFree(prGlueInfo->prAdapter, prGlueInfo->prP2PInfo[ucRoleIndex]->chandef);
 
+		prGlueInfo->prP2PInfo[ucRoleIndex]->chandef = NULL;
+
 	} while (FALSE);
 
 }				/* kalP2PRddDetectUpdate */
@@ -1332,13 +1336,6 @@
 				prGlueInfo->prP2PInfo[ucRoleIndex]->chandef, NL80211_RADAR_CAC_FINISHED, GFP_KERNEL);
 		DBGLOG(INIT, INFO, "kalP2PCacFinishedUpdate: Update to OS Done\n");
 
-		if (prGlueInfo->prP2PInfo[ucRoleIndex]->chandef->chan)
-			cnmMemFree(prGlueInfo->prAdapter, prGlueInfo->prP2PInfo[ucRoleIndex]->chandef->chan);
-
-		if (prGlueInfo->prP2PInfo[ucRoleIndex]->chandef)
-			cnmMemFree(prGlueInfo->prAdapter, prGlueInfo->prP2PInfo[ucRoleIndex]->chandef);
-
-
 	} while (FALSE);
 
 }				/* kalP2PRddDetectUpdate */