wlan: Added the gEnableDFSPnoChnlScan ini parameter
Currently DFS channels are sent as a part of PNO request.
This ini variable is added to enable/disable the DFS
channels in PNO request.
Also added a check to handle the scenario where all the
channels sent by supplicant are DFS in PNO request.
Change-Id: Ie95e74bd46ff442eb71451007fa4aa2331d61252
CRs-Fixed: 754763
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index e6e5594..5e82fb2 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1394,6 +1394,11 @@
#define CFG_ENABLE_DFS_CHNL_SCAN_MAX ( 1 )
#define CFG_ENABLE_DFS_CHNL_SCAN_DEFAULT ( 1 )
+#define CFG_ENABLE_DFS_PNO_CHNL_SCAN_NAME "gEnableDFSPnoChnlScan"
+#define CFG_ENABLE_DFS_PNO_CHNL_SCAN_MIN ( 0 )
+#define CFG_ENABLE_DFS_PNO_CHNL_SCAN_MAX ( 1 )
+#define CFG_ENABLE_DFS_PNO_CHNL_SCAN_DEFAULT ( 1 )
+
typedef enum
{
eHDD_LINK_SPEED_REPORT_ACTUAL = 0,
@@ -2684,6 +2689,7 @@
v_U32_t enableCloseLoop;
v_U8_t enableBypass11d;
v_U8_t enableDFSChnlScan;
+ v_U8_t enableDFSPnoChnlScan;
v_U8_t enableDynamicDTIM;
v_U8_t enableAutomaticTxPowerControl;
v_U8_t ShortGI40MhzEnable;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index b5f0067..6527b10 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2227,6 +2227,13 @@
CFG_ENABLE_DFS_CHNL_SCAN_MIN,
CFG_ENABLE_DFS_CHNL_SCAN_MAX ),
+ REG_VARIABLE( CFG_ENABLE_DFS_PNO_CHNL_SCAN_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, enableDFSPnoChnlScan,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_DFS_PNO_CHNL_SCAN_DEFAULT,
+ CFG_ENABLE_DFS_PNO_CHNL_SCAN_MIN,
+ CFG_ENABLE_DFS_PNO_CHNL_SCAN_MAX ),
+
REG_VARIABLE( CFG_ENABLE_DYNAMIC_DTIM_NAME, WLAN_PARAM_Integer,
hdd_config_t, enableDynamicDTIM,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -3571,6 +3578,7 @@
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gApDataAvailPollInterVal] Value = [%u] ",pHddCtx->cfg_ini->apDataAvailPollPeriodInMs);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableBypass11d] Value = [%u] ",pHddCtx->cfg_ini->enableBypass11d);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableDFSChnlScan] Value = [%u] ",pHddCtx->cfg_ini->enableDFSChnlScan);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableDFSPnoChnlScan] Value = [%u] ",pHddCtx->cfg_ini->enableDFSPnoChnlScan);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gReportMaxLinkSpeed] Value = [%u] ",pHddCtx->cfg_ini->reportMaxLinkSpeed);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [thermalMitigationEnable] Value = [%u] ",pHddCtx->cfg_ini->thermalMitigationEnable);
#ifdef WLAN_FEATURE_11AC
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 93329ff..b1887b5 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -13235,6 +13235,8 @@
v_U32_t num_channels_allowed = WNI_CFG_VALID_CHANNEL_LIST_LEN;
eHalStatus status = eHAL_STATUS_FAILURE;
int ret = 0;
+ hdd_config_t *pConfig = NULL;
+ v_U32_t num_ignore_dfs_ch = 0;
if (NULL == pAdapter)
{
@@ -13253,6 +13255,7 @@
return -EINVAL;
}
+ pConfig = pHddCtx->cfg_ini;
hHal = WLAN_HDD_GET_HAL_CTX(pAdapter);
if (NULL == hHal)
{
@@ -13347,6 +13350,16 @@
{
if (request->channels[i]->hw_value == channels_allowed[indx])
{
+ if ((!pConfig->enableDFSPnoChnlScan) &&
+ (NV_CHANNEL_DFS == vos_nv_getChannelEnabledState(channels_allowed[indx])))
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s : Dropping DFS channel : %d",
+ __func__,channels_allowed[indx]);
+ num_ignore_dfs_ch++;
+ break;
+ }
+
valid_ch[num_ch++] = request->channels[i]->hw_value;
len += snprintf(chList+len, 5, "%d ",
request->channels[i]->hw_value);
@@ -13355,8 +13368,16 @@
}
}
hddLog(VOS_TRACE_LEVEL_INFO,"Channel-List: %s ", chList);
- }
+ /*If all channels are DFS and dropped, then ignore the PNO request*/
+ if (num_ignore_dfs_ch == request->n_channels)
+ {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s : All requested channels are DFS channels", __func__);
+ ret = -EINVAL;
+ goto error;
+ }
+ }
/* Filling per profile params */
for (i = 0; i < pPnoRequest->ucNetworksCount; i++)
{