[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 */