diff options
| author | Deepak Dhamdhere <ddhamdhe@qca.qualcomm.com> | 2014-05-29 01:07:28 -0700 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-06-02 19:40:03 -0700 |
| commit | cc5c6358bee0ded134f4697c79211f95e30eacc2 (patch) | |
| tree | ef9a741c38a027ed70c22db6662c55ca2c744721 | |
| parent | 4ca18bacd797072c86a8249bbd7578d23f99eddf (diff) | |
qcacld: Passive dwell time and other DFS roaming changes
- Change passive dwell time to 110 ms by default.
- If scan home away time is less than that, use passive dwell time
as burst duration.
- Add support for SETDFSSCANMODE and GETDFSSCANMODE commands
- Enable DFS roaming by default.
CRs-Fixed: 670768
Change-Id: I24c026e3964bcb69d07feed67ba128343002f30f
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg.h | 2 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg.c | 28 | ||||
| -rwxr-xr-x | CORE/HDD/src/wlan_hdd_main.c | 56 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 36 | ||||
| -rw-r--r-- | CORE/SME/inc/csrNeighborRoam.h | 1 | ||||
| -rw-r--r-- | CORE/SME/inc/sme_Api.h | 24 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 52 |
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; +} |
