summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h2
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c28
-rwxr-xr-xCORE/HDD/src/wlan_hdd_main.c56
-rw-r--r--CORE/SERVICES/WMA/wma.c36
-rw-r--r--CORE/SME/inc/csrNeighborRoam.h1
-rw-r--r--CORE/SME/inc/sme_Api.h24
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c52
7 files changed, 185 insertions, 14 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index fc59ebe9f684..1bd9a2d43981 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2460,7 +2460,7 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */
#define CFG_ROAMING_DFS_CHANNEL_NAME "gAllowDFSChannelRoam"
#define CFG_ROAMING_DFS_CHANNEL_MIN (0)
#define CFG_ROAMING_DFS_CHANNEL_MAX (1)
-#define CFG_ROAMING_DFS_CHANNEL_DEFAULT (0)
+#define CFG_ROAMING_DFS_CHANNEL_DEFAULT (1)
#ifdef MSM_PLATFORM
#define CFG_BUS_BANDWIDTH_HIGH_THRESHOLD "gBusBandwidthHighThreshold"
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 7ef6a69890b6..513f4779f969 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -244,6 +244,15 @@ static void cbNotifySetEnableFastRoamInConcurrency(hdd_context_t *pHddCtx, unsig
sme_UpdateEnableFastRoamInConcurrency((tHalHandle)(pHddCtx->hHal), pHddCtx->cfg_ini->bFastRoamInConIniFeatureEnabled );
}
+static void cbNotifySetDFSScanMode(hdd_context_t *pHddCtx, unsigned long NotifyId)
+{
+ /* at the point this routine is called, the value in the cfg_ini table has
+ * already been updated
+ */
+ sme_UpdateDFSScanMode((tHalHandle)(pHddCtx->hHal),
+ pHddCtx->cfg_ini->allowDFSChannelRoam);
+}
+
#endif
REG_TABLE_ENTRY g_registry_table[] =
@@ -2012,6 +2021,15 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_ROAM_BEACON_RSSI_WEIGHT_MIN,
CFG_ROAM_BEACON_RSSI_WEIGHT_MAX,
cbNotifySetRoamBeaconRssiWeight, 0 ),
+
+ REG_DYNAMIC_VARIABLE( CFG_ROAMING_DFS_CHANNEL_NAME , WLAN_PARAM_Integer,
+ hdd_config_t, allowDFSChannelRoam,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ROAMING_DFS_CHANNEL_DEFAULT,
+ CFG_ROAMING_DFS_CHANNEL_MIN,
+ CFG_ROAMING_DFS_CHANNEL_MAX,
+ cbNotifySetDFSScanMode, 0),
+
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
REG_VARIABLE( CFG_QOS_WMM_BURST_SIZE_DEFN_NAME , WLAN_PARAM_Integer,
@@ -3372,13 +3390,6 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_ENABLE_MEMORY_DEBUG_MAX ),
#endif
- REG_VARIABLE( CFG_ROAMING_DFS_CHANNEL_NAME , WLAN_PARAM_Integer,
- hdd_config_t, allowDFSChannelRoam,
- VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
- CFG_ROAMING_DFS_CHANNEL_DEFAULT,
- CFG_ROAMING_DFS_CHANNEL_MIN,
- CFG_ROAMING_DFS_CHANNEL_MAX ),
-
REG_VARIABLE( CFG_DEBUG_P2P_REMAIN_ON_CHANNEL_NAME, WLAN_PARAM_Integer,
hdd_config_t, debugP2pRemainOnChannel,
VAR_FLAGS_OPTIONAL,
@@ -3808,6 +3819,9 @@ static void print_hdd_cfg(hdd_context_t *pHddCtx)
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
"Name = [nRoamBeaconRssiWeight] Value = [%u] ",
pHddCtx->cfg_ini->nRoamBeaconRssiWeight);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [allowDFSChannelRoam] Value = [%u] ",
+ pHddCtx->cfg_ini->allowDFSChannelRoam);
#endif
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [burstSizeDefinition] Value = [0x%x] ",pHddCtx->cfg_ini->burstSizeDefinition);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [tsInfoAckPolicy] Value = [0x%x] ",pHddCtx->cfg_ini->tsInfoAckPolicy);
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index d374d1aa5db1..5a5640124fbc 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -5265,6 +5265,62 @@ static int hdd_driver_command(hdd_adapter_t *pAdapter,
pAdapterNode = pNext;
}
}
+ else if (strncmp(command, "SETDFSSCANMODE", 14) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_BOOLEAN dfsScanMode = CFG_ROAMING_DFS_CHANNEL_DEFAULT;
+
+ /* Move pointer to ahead of SETDFSSCANMODE<delimiter> */
+ value = value + 15;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &dfsScanMode);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of
+ * datatype, then also kstrtou8 fails
+ */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed range [%d - %d]", __func__,
+ CFG_ROAMING_DFS_CHANNEL_MIN,
+ CFG_ROAMING_DFS_CHANNEL_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ if ((dfsScanMode < CFG_ROAMING_DFS_CHANNEL_MIN) ||
+ (dfsScanMode > CFG_ROAMING_DFS_CHANNEL_MAX))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "dfsScanMode value %d is out of range"
+ " (Min: %d Max: %d)", dfsScanMode,
+ CFG_ROAMING_DFS_CHANNEL_MIN,
+ CFG_ROAMING_DFS_CHANNEL_MAX);
+ ret = -EINVAL;
+ goto exit;
+ }
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to Set DFS Scan Mode = %d",
+ __func__, dfsScanMode);
+
+ pHddCtx->cfg_ini->allowDFSChannelRoam = dfsScanMode;
+ sme_UpdateDFSScanMode((tHalHandle)(pHddCtx->hHal), dfsScanMode);
+ }
+ else if (strncmp(command, "GETDFSSCANMODE", 14) == 0)
+ {
+ tANI_BOOLEAN dfsScanMode =
+ sme_GetDFSScanMode((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = scnprintf(extra, sizeof(extra), "%s %d", command, dfsScanMode);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
else {
MTRACE(vos_trace(VOS_MODULE_ID_HDD,
TRACE_CODE_HDD_UNSUPPORTED_IOCTL,
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index cd4ffc9e15fa..f17bd30301a0 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -5362,7 +5362,7 @@ VOS_STATUS wma_roam_scan_offload_chan_list(tp_wma_handle wma_handle,
chan_list_fp->vdev_id = wma_handle->roam_offload_vdev_id;
chan_list_fp->num_chan = chan_count;
if (chan_count > 0 && list_type == CHANNEL_LIST_STATIC) {
- /* NCHO or other app is in control */
+ /* external app is controlling channel list */
chan_list_fp->chan_list_type = WMI_ROAM_SCAN_CHAN_LIST_TYPE_STATIC;
} else {
/* umac supplied occupied channel list in LFR */
@@ -5529,6 +5529,7 @@ v_VOID_t wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
wmi_start_scan_cmd_fixed_param *scan_params)
{
tANI_U8 channels_per_burst = 0;
+ tANI_U32 val = 0;
if (NULL == pMac) {
WMA_LOGE("%s: pMac is NULL", __func__);
@@ -5563,6 +5564,18 @@ v_VOID_t wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
* to scan;
*/
+ if (wlan_cfgGetInt(pMac, WNI_CFG_PASSIVE_MAXIMUM_CHANNEL_TIME, &val) != eSIR_SUCCESS)
+ {
+ /*
+ * Could not get max channel value from CFG. Log error.
+ */
+ WMA_LOGE("could not retrieve passive max channel value");
+
+ /* use a default value of 110ms */
+ val = WMA_ROAM_DWELL_TIME_PASSIVE_DEFAULT;
+ }
+
+ scan_params->dwell_time_passive = val;
/*
* Here is the formula,
* T(HomeAway) = N * T(dwell) + (N+1) * T(cs)
@@ -5570,8 +5583,10 @@ v_VOID_t wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
*/
scan_params->dwell_time_active = roam_req->NeighborScanChannelMaxTime;
if (roam_req->HomeAwayTime < 2*WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME) {
- // clearly we can't follow home away time
- scan_params->burst_duration = scan_params->dwell_time_active;
+ /* clearly we can't follow home away time.
+ * Make it a split scan.
+ */
+ scan_params->burst_duration = 0;
} else {
channels_per_burst =
(roam_req->HomeAwayTime - WMA_ROAM_SCAN_CHANNEL_SWITCH_TIME)
@@ -5588,8 +5603,16 @@ v_VOID_t wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
channels_per_burst * scan_params->dwell_time_active;
}
}
-
- scan_params->dwell_time_passive = scan_params->dwell_time_active;
+ if (pMac->roam.configParam.allowDFSChannelRoam &&
+ roam_req->HomeAwayTime > 0 &&
+ roam_req->ChannelCacheType != CHANNEL_LIST_STATIC) {
+ /* Roaming on DFS channels is supported and it is not app channel list.
+ * It is ok to override homeAwayTime to accomodate DFS dwell time in burst
+ * duration.
+ */
+ scan_params->burst_duration = MAX(scan_params->burst_duration,
+ scan_params->dwell_time_passive);
+ }
scan_params->min_rest_time = roam_req->NeighborScanTimerPeriod;
scan_params->max_rest_time = roam_req->NeighborScanTimerPeriod;
scan_params->repeat_probe_time = (roam_req->nProbes > 0) ?
@@ -5610,7 +5633,7 @@ v_VOID_t wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
scan_params->probe_delay = 0;
scan_params->max_scan_time = WMA_HW_DEF_SCAN_MAX_DURATION;
scan_params->idle_time = scan_params->min_rest_time;
- scan_params->burst_duration = WMA_ROAM_DWELL_TIME_PASSIVE_DEFAULT;
+ scan_params->burst_duration = 0;
scan_params->n_probes = 0;
}
@@ -5618,6 +5641,7 @@ v_VOID_t wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle,
if (!pMac->roam.configParam.allowDFSChannelRoam) {
scan_params->scan_ctrl_flags |= WMI_SCAN_BYPASS_DFS_CHN;
}
+
WMA_LOGI("%s: Rome roam scan parameters:"
" dwell_time_active = %d, dwell_time_passive = %d",
__func__,
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index cc603fe84470..420eb53c0ab4 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -298,6 +298,7 @@ VOS_STATUS csrNeighborRoamMergeChannelLists(tpAniSirGlobal pMac,
#define REASON_ROAM_BMISS_FIRST_BCNT_CHANGED 20
#define REASON_ROAM_BMISS_FINAL_BCNT_CHANGED 21
#define REASON_ROAM_BEACON_RSSI_WEIGHT_CHANGED 22
+#define REASON_ROAM_DFS_SCAN_MODE_CHANGED 23
eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 command, tANI_U8 reason);
eHalStatus csrNeighborRoamCandidateFoundIndHdlr(tpAniSirGlobal pMac, void* pMsg);
eHalStatus csrNeighborRoamHandoffReqHdlr(tpAniSirGlobal pMac, void* pMsg);
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 272f476d8bc9..379a54957dbf 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3595,4 +3595,28 @@ eHalStatus sme_StatsExtRequest(tANI_U8 session_id, tpStatsExtRequestReq input);
eHalStatus sme_StatsExtEvent (tHalHandle hHal, void* pMsg);
#endif
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateDFSScanMode
+ \brief Update DFS roam Mode
+ This function is called through dynamic setConfig callback function
+ to configure isAllowDFSChannelRoam.
+ \param hHal - HAL handle for device
+ \param isAllowDFSChannelRoam - Enable/Disable DFS roaming scan
+ \return eHAL_STATUS_SUCCESS - SME update allowDFSChannelRoam config
+ successfully.
+ Other status means SME is failed to update isAllowDFSChannelRoam.
+ \sa
+ -------------------------------------------------------------------------*/
+eHalStatus sme_UpdateDFSScanMode(tHalHandle hHal, v_BOOL_t isAllowDFSChannelRoam);
+
+/*--------------------------------------------------------------------------
+ \brief sme_GetDFSScanMode() - get DFS SCAN Mode
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return DFS roaming mode Enabled(1)/Disabled(0)
+ \sa
+ --------------------------------------------------------------------------*/
+v_BOOL_t sme_GetDFSScanMode(tHalHandle hHal);
+
+
#endif //#if !defined( __SME_API_H )
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index aac2cdbf15d0..2e8f1afdedcd 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -12337,3 +12337,55 @@ eHalStatus sme_StatsExtEvent(tHalHandle hHal, void* pMsg)
}
#endif
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateDFSScanMode
+ \brief Update DFS roam Mode
+ This function is called through dynamic setConfig callback function
+ to configure isAllowDFSChannelRoam.
+ \param hHal - HAL handle for device
+ \param isAllowDFSChannelRoam - Enable/Disable DFS roaming scan
+ \return eHAL_STATUS_SUCCESS - SME update allowDFSChannelRoam config
+ successfully.
+ Other status means SME is failed to update isAllowDFSChannelRoam.
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_UpdateDFSScanMode(tHalHandle hHal, v_BOOL_t isAllowDFSChannelRoam)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set AllowDFSChannelRoam Mode to "
+ "%d - old value is %d - roam state is %s",
+ isAllowDFSChannelRoam,
+ pMac->roam.configParam.allowDFSChannelRoam,
+ macTraceGetNeighbourRoamState(
+ pMac->roam.neighborRoamInfo.neighborRoamState));
+ pMac->roam.configParam.allowDFSChannelRoam = isAllowDFSChannelRoam;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ if (pMac->roam.configParam.isRoamOffloadScanEnabled)
+ {
+ csrRoamOffloadScan(pMac, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+ REASON_ROAM_DFS_SCAN_MODE_CHANGED);
+ }
+#endif
+
+ return status ;
+}
+/*--------------------------------------------------------------------------
+ \brief sme_GetWESMode() - get WES Mode
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return DFS roaming mode Enabled(1)/Disabled(0)
+ \sa
+ --------------------------------------------------------------------------*/
+v_BOOL_t sme_GetDFSScanMode(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.allowDFSChannelRoam;
+}