diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 7c512b989a42..c394acfc1ba4 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -412,6 +412,31 @@ enum hdd_dot11_mode { #define CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MAX (300) #define CFG_NEIGHBOR_SCAN_TIMER_PERIOD_DEFAULT (200) +/* + * + * gRoamRestTimeMin - Set min neighbor scan timer period + * @Min: 3 + * @Max: 300 + * @Default: 200 + * + * This is the min rest time after which firmware will check for traffic + * and if there no traffic it will move to a new channel to scan + * else it will stay on the home channel till gNeighborScanTimerPeriod time + * and then will move to a new channel to scan. + * + * Related: None + * + * Supported Feature: LFR Scan + * + * Usage: External + * + * + */ +#define CFG_NEIGHBOR_SCAN_MIN_TIMER_PERIOD_NAME "gRoamRestTimeMin" +#define CFG_NEIGHBOR_SCAN_MIN_TIMER_PERIOD_MIN (3) +#define CFG_NEIGHBOR_SCAN_MIN_TIMER_PERIOD_MAX (300) +#define CFG_NEIGHBOR_SCAN_MIN_TIMER_PERIOD_DEFAULT (200) + /* * * gOpportunisticThresholdDiff - Set oppurtunistic threshold diff @@ -10611,6 +10636,7 @@ struct hdd_config { bool fFTResourceReqSupported; uint16_t nNeighborScanPeriod; + uint16_t neighbor_scan_min_period; uint8_t nNeighborLookupRssiThreshold; uint8_t delay_before_vdev_stop; uint8_t nOpportunisticThresholdDiff; diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index ff87115ade64..ff5431ad57ca 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -175,6 +175,25 @@ cb_notify_set_neighbor_scan_period(hdd_context_t *pHddCtx, pHddCtx->config->nNeighborScanPeriod); } +/* + * cb_notify_set_neighbor_scan_min_period() - configure min rest + * time during roaming scan + * + * @hdd_ctx: HDD context data structure + * @notify_id: Identifies 1 of the 4 parameters to be modified + * + * Picks up the value from hdd configuration and passes it to SME. + * Return: void + */ +static void +cb_notify_set_neighbor_scan_min_period(hdd_context_t *pHddCtx, + unsigned long notifyId) +{ + sme_set_neighbor_scan_min_period(pHddCtx->hHal, 0, + pHddCtx->config-> + neighbor_scan_min_period); +} + static void cb_notify_set_neighbor_results_refresh_period(hdd_context_t *pHddCtx, unsigned long notifyId) @@ -1275,6 +1294,16 @@ struct reg_table_entry g_registry_table[] = { CFG_NEIGHBOR_SCAN_TIMER_PERIOD_MAX, cb_notify_set_neighbor_scan_period, 0), + REG_DYNAMIC_VARIABLE(CFG_NEIGHBOR_SCAN_MIN_TIMER_PERIOD_NAME, + WLAN_PARAM_Integer, + struct hdd_config, neighbor_scan_min_period, + VAR_FLAGS_OPTIONAL | + VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_NEIGHBOR_SCAN_MIN_TIMER_PERIOD_DEFAULT, + CFG_NEIGHBOR_SCAN_MIN_TIMER_PERIOD_MIN, + CFG_NEIGHBOR_SCAN_MIN_TIMER_PERIOD_MAX, + cb_notify_set_neighbor_scan_min_period, 0), + REG_DYNAMIC_VARIABLE(CFG_NEIGHBOR_LOOKUP_RSSI_THRESHOLD_NAME, WLAN_PARAM_Integer, struct hdd_config, nNeighborLookupRssiThreshold, @@ -5522,6 +5551,8 @@ void hdd_cfg_print(hdd_context_t *pHddCtx) pHddCtx->config->nMaxNeighborReqTries); hdd_info("Name = [nNeighborScanPeriod] Value = [%u] ", pHddCtx->config->nNeighborScanPeriod); + hdd_info("Name = [n_neighbor_scan_min_period] Value = [%u] ", + pHddCtx->config->neighbor_scan_min_period); hdd_info("Name = [nNeighborScanResultsRefreshPeriod] Value = [%u] ", pHddCtx->config->nNeighborResultsRefreshPeriod); hdd_info("Name = [nEmptyScanRefreshPeriod] Value = [%u] ", @@ -7484,6 +7515,9 @@ QDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx) pConfig->nNeighborScanMinChanTime; smeConfig->csrConfig.neighborRoamConfig.nNeighborScanTimerPeriod = pConfig->nNeighborScanPeriod; + smeConfig->csrConfig.neighborRoamConfig. + neighbor_scan_min_timer_period = + pConfig->neighbor_scan_min_period; smeConfig->csrConfig.neighborRoamConfig.nMaxNeighborRetries = pConfig->nMaxNeighborReqTries; smeConfig->csrConfig.neighborRoamConfig.nNeighborResultsRefreshPeriod = diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index e30acfd1d330..048db4e6a24e 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -3028,6 +3028,7 @@ typedef struct sSirRoamOffloadScanReq { uint8_t Command; uint8_t reason; uint16_t NeighborScanTimerPeriod; + uint16_t neighbor_scan_min_timer_period; uint16_t NeighborRoamScanRefreshPeriod; uint16_t NeighborScanChannelMinTime; uint16_t NeighborScanChannelMaxTime; diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index cec91f0aa2a9..02bf47c49784 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -1058,6 +1058,7 @@ typedef struct tagCsr11rConfigParams { typedef struct tagCsrNeighborRoamConfigParams { uint32_t nNeighborScanTimerPeriod; + uint32_t neighbor_scan_min_timer_period; uint8_t nNeighborLookupRssiThreshold; uint16_t nNeighborScanMinChanTime; uint16_t nNeighborScanMaxChanTime; diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index f0edfd7305dc..e4e06bacb95a 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -429,6 +429,7 @@ typedef struct tagCsr11rConfig { typedef struct tagCsrNeighborRoamConfig { uint32_t nNeighborScanTimerPeriod; + uint32_t neighbor_scan_min_timer_period; uint8_t nNeighborLookupRssiThreshold; uint16_t nNeighborScanMinChanTime; uint16_t nNeighborScanMaxChanTime; diff --git a/core/sme/inc/csr_neighbor_roam.h b/core/sme/inc/csr_neighbor_roam.h index dff1bd9d2556..056b46fe499f 100644 --- a/core/sme/inc/csr_neighbor_roam.h +++ b/core/sme/inc/csr_neighbor_roam.h @@ -54,6 +54,7 @@ typedef enum { typedef struct sCsrNeighborRoamCfgParams { uint8_t maxNeighborRetries; uint32_t neighborScanPeriod; + uint32_t neighbor_scan_min_period; tCsrChannelInfo channelInfo; uint8_t neighborLookupThreshold; uint8_t neighborReassocThreshold; diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index fece2e13c2af..7430373797be 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -640,6 +640,8 @@ uint16_t sme_get_neighbor_scan_max_chan_time(tHalHandle hHal, QDF_STATUS sme_set_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId, const uint16_t nNeighborScanPeriod); uint16_t sme_get_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId); +QDF_STATUS sme_set_neighbor_scan_min_period(tHalHandle h_hal, + uint8_t session_id, const uint16_t neighbor_scan_min_period); QDF_STATUS sme_set_roam_bmiss_first_bcnt(tHalHandle hHal, uint8_t sessionId, const uint8_t nRoamBmissFirstBcnt); uint8_t sme_get_roam_bmiss_first_bcnt(tHalHandle hHal); diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 617e8a695350..926d84fc88a5 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -8957,7 +8957,55 @@ uint16_t sme_get_neighbor_scan_period(tHalHandle hHal, uint8_t sessionId) neighborScanPeriod; } +/** + * sme_set_neighbor_scan_min_period() - Update neighbor_scan_min_period + * This function is called through dynamic setConfig callback function + * to configure neighbor_scan_min_period + * + * @hal - HAL handle for device + * @session_id - Session Identifier + * @neighbor_scan_min_period - neighbor scan min period + * + * Return - QDF_STATUS + */ +QDF_STATUS sme_set_neighbor_scan_min_period(tHalHandle hal, + uint8_t session_id, + const uint16_t + neighbor_scan_min_period) +{ + tpAniSirGlobal pmac = PMAC_STRUCT(hal); + QDF_STATUS status = QDF_STATUS_SUCCESS; + tCsrNeighborRoamConfig *p_neighbor_roam_config = NULL; + tpCsrNeighborRoamControlInfo p_neighbor_roam_info = NULL; + if (session_id >= CSR_ROAM_SESSION_MAX) { + sme_err("Invalid sme session id: %d", session_id); + return QDF_STATUS_E_INVAL; + } + + status = sme_acquire_global_lock(&pmac->sme); + if (QDF_IS_STATUS_SUCCESS(status)) { + p_neighbor_roam_config = + &pmac->roam.configParam.neighborRoamConfig; + p_neighbor_roam_info = &pmac-> + roam.neighborRoamInfo[session_id]; + sme_debug("LFR:set neighbor scan min period, old:%d, " + "new: %d, state: %s", + pmac->roam.configParam.neighborRoamConfig. + neighbor_scan_min_timer_period, + neighbor_scan_min_period, + mac_trace_get_neighbour_roam_state(pmac->roam. + neighborRoamInfo[session_id]. + neighborRoamState)); + p_neighbor_roam_config->neighbor_scan_min_timer_period = + neighbor_scan_min_period; + p_neighbor_roam_info->cfgParams.neighbor_scan_min_period = + neighbor_scan_min_period; + sme_release_global_lock(&pmac->sme); + } + + return status; +} /*-------------------------------------------------------------------------- \brief sme_get_roam_rssi_diff() - get Roam rssi diff diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 8820dc6342fb..18bfcfaacff9 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -1428,6 +1428,8 @@ static void init_config_param(tpAniSirGlobal pMac) pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime = 40; pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod = 200; + pMac->roam.configParam.neighborRoamConfig. + neighbor_scan_min_timer_period = 200; pMac->roam.configParam.neighborRoamConfig.neighborScanChanList. numChannels = 3; pMac->roam.configParam.neighborRoamConfig.neighborScanChanList. @@ -2558,6 +2560,9 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac, sme_debug("nNeighborScanTimerPerioid: %d", pMac->roam.configParam.neighborRoamConfig. nNeighborScanTimerPeriod); + sme_debug("neighbor_scan_min_timer_period: %d", + pMac->roam.configParam.neighborRoamConfig. + neighbor_scan_min_timer_period); sme_debug("nNeighborLookupRssiThreshold: %d", pMac->roam.configParam.neighborRoamConfig. nNeighborLookupRssiThreshold); @@ -17146,6 +17151,8 @@ csr_create_roam_scan_offload_request(tpAniSirGlobal mac_ctx, req_buf->reason = reason; req_buf->NeighborScanTimerPeriod = roam_info->cfgParams.neighborScanPeriod; + req_buf->neighbor_scan_min_timer_period = + roam_info->cfgParams.neighbor_scan_min_period; req_buf->NeighborRoamScanRefreshPeriod = roam_info->cfgParams.neighborResultsRefreshPeriod; req_buf->NeighborScanChannelMinTime = diff --git a/core/sme/src/csr/csr_neighbor_roam.c b/core/sme/src/csr/csr_neighbor_roam.c index 15b94e381187..f51f80b10cb7 100644 --- a/core/sme/src/csr/csr_neighbor_roam.c +++ b/core/sme/src/csr/csr_neighbor_roam.c @@ -1264,6 +1264,9 @@ QDF_STATUS csr_neighbor_roam_init(tpAniSirGlobal pMac, uint8_t sessionId) pNeighborRoamInfo->cfgParams.neighborScanPeriod = pMac->roam.configParam.neighborRoamConfig. nNeighborScanTimerPeriod; + pNeighborRoamInfo->cfgParams.neighbor_scan_min_period = + pMac->roam.configParam.neighborRoamConfig. + neighbor_scan_min_timer_period; pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod = pMac->roam.configParam.neighborRoamConfig. nNeighborResultsRefreshPeriod; diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 93104bd71e6b..24b72d3ae77a 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -1398,9 +1398,12 @@ void wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle, __func__, roam_req->NeighborScanChannelMinTime, roam_req->NeighborScanChannelMaxTime); - WMA_LOGD("%s: NeighborScanTimerPeriod: %d HomeAwayTime: %d nProbes: %d", + WMA_LOGD("%s: NeighborScanTimerPeriod: %d " + "neighbor_scan_min_timer_period %d " + "HomeAwayTime: %d nProbes: %d", __func__, roam_req->NeighborScanTimerPeriod, + roam_req->neighbor_scan_min_timer_period, roam_req->HomeAwayTime, roam_req->nProbes); /* @@ -1476,7 +1479,8 @@ void wma_roam_scan_fill_scan_params(tp_wma_handle wma_handle, QDF_MAX(scan_params->burst_duration, scan_params->dwell_time_passive); } - scan_params->min_rest_time = roam_req->NeighborScanTimerPeriod; + scan_params->min_rest_time = + roam_req->neighbor_scan_min_timer_period; scan_params->max_rest_time = roam_req->NeighborScanTimerPeriod; scan_params->repeat_probe_time = (roam_req->nProbes > 0) ? QDF_MAX(scan_params->dwell_time_active /