diff options
| -rw-r--r-- | core/hdd/inc/wlan_hdd_cfg.h | 48 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg.c | 12 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.c | 46 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_scan.c | 86 | ||||
| -rw-r--r-- | core/mac/inc/sir_api.h | 2 |
5 files changed, 161 insertions, 33 deletions
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index c65f13197a26..28db9d890ec4 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -5502,6 +5502,52 @@ enum dot11p_mode { /* * <ini> + * g_max_sched_scan_plan_int - pno sched max scan plan interval. + * @Min: 1 + * @Max: 7200 + * @Default: 3600 + * + * This ini is used to set max sched scan plan interval for pno scan + * (value in seconds). + * + * Related: gPNOScanSupport + * + * Supported Feature: PNO scan + * + * Usage: External + * + * </ini> + */ +#define CFG_MAX_SCHED_SCAN_PLAN_INT_NAME "g_max_sched_scan_plan_int" +#define CFG_MAX_SCHED_SCAN_PLAN_INT_MIN (1) +#define CFG_MAX_SCHED_SCAN_PLAN_INT_MAX (7200) +#define CFG_MAX_SCHED_SCAN_PLAN_INT_DEFAULT (3600) + +/* + * <ini> + * g_max_sched_scan_plan_iterations - pno sched max scan plan iterations. + * @Min: 1 + * @Max: 100 + * @Default: 10 + * + * This ini is used to set max sched scan plan iterations for pno scan + * (value in seconds). + * + * Related: gPNOScanSupport + * + * Supported Feature: PNO scan + * + * Usage: External + * + * </ini> + */ +#define CFG_MAX_SCHED_SCAN_PLAN_ITRNS_NAME "g_max_sched_scan_plan_iterations" +#define CFG_MAX_SCHED_SCAN_PLAN_ITRNS_MIN (1) +#define CFG_MAX_SCHED_SCAN_PLAN_ITRNS_MAX (100) +#define CFG_MAX_SCHED_SCAN_PLAN_ITRNS_DEFAULT (10) + +/* + * <ini> * gper_roam_enabled - To enabled/disable PER based roaming in FW * @Min: 0 * @Max: 1 @@ -6331,6 +6377,8 @@ struct hdd_config { uint32_t per_roam_low_rate_threshold; uint32_t per_roam_th_percent; uint32_t per_roam_rest_time; + uint32_t max_sched_scan_plan_interval; + uint32_t max_sched_scan_plan_iterations; }; #define VAR_OFFSET(_Struct, _Var) (offsetof(_Struct, _Var)) diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index ea11965c0eca..b240d39682b3 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -4189,6 +4189,18 @@ REG_TABLE_ENTRY g_registry_table[] = { CFG_PER_ROAM_REST_TIME_DEFAULT, CFG_PER_ROAM_REST_TIME_MIN, CFG_PER_ROAM_REST_TIME_MAX), + REG_VARIABLE(CFG_MAX_SCHED_SCAN_PLAN_INT_NAME, WLAN_PARAM_Integer, + struct hdd_config, max_sched_scan_plan_interval, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_MAX_SCHED_SCAN_PLAN_INT_DEFAULT, + CFG_MAX_SCHED_SCAN_PLAN_INT_MIN, + CFG_MAX_SCHED_SCAN_PLAN_INT_MAX), + REG_VARIABLE(CFG_MAX_SCHED_SCAN_PLAN_ITRNS_NAME, WLAN_PARAM_Integer, + struct hdd_config, max_sched_scan_plan_iterations, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_MAX_SCHED_SCAN_PLAN_ITRNS_DEFAULT, + CFG_MAX_SCHED_SCAN_PLAN_ITRNS_MIN, + CFG_MAX_SCHED_SCAN_PLAN_ITRNS_MAX), }; /** diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index fd7bffb53e75..a19b537a9296 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -9017,6 +9017,40 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = { }, }; +#if ((LINUX_VERSION_CODE > KERNEL_VERSION(4, 4, 0)) || \ + defined(CFG80211_MULTI_SCAN_PLAN_BACKPORT)) && \ + defined(FEATURE_WLAN_SCAN_PNO) +/** + * hdd_config_sched_scan_plans_to_wiphy() - configure sched scan plans to wiphy + * @wiphy: pointer to wiphy + * @config: pointer to config + * + * Return: None + */ +static void hdd_config_sched_scan_plans_to_wiphy(struct wiphy *wiphy, + struct hdd_config *config) +{ + if (config->configPNOScanSupport) { + wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; + wiphy->max_sched_scan_ssids = SIR_PNO_MAX_SUPP_NETWORKS; + wiphy->max_match_sets = SIR_PNO_MAX_SUPP_NETWORKS; + wiphy->max_sched_scan_ie_len = SIR_MAC_MAX_IE_LENGTH; + wiphy->max_sched_scan_plans = SIR_PNO_MAX_PLAN_REQUEST; + if (config->max_sched_scan_plan_interval) + wiphy->max_sched_scan_plan_interval = + config->max_sched_scan_plan_interval; + if (config->max_sched_scan_plan_iterations) + wiphy->max_sched_scan_plan_iterations = + config->max_sched_scan_plan_iterations; + } +} +#else +static void hdd_config_sched_scan_plans_to_wiphy(struct wiphy *wiphy, + struct hdd_config *config) +{ +} +#endif + /** * hdd_cfg80211_wiphy_alloc() - Allocate wiphy context * @priv_size: Size of the hdd context. @@ -9163,17 +9197,7 @@ int wlan_hdd_cfg80211_init(struct device *dev, wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_VHT_IBSS); #endif -#ifdef FEATURE_WLAN_SCAN_PNO - if (pCfg->configPNOScanSupport) { - wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; - wiphy->max_sched_scan_ssids = SIR_PNO_MAX_SUPP_NETWORKS; - wiphy->max_match_sets = SIR_PNO_MAX_SUPP_NETWORKS; - wiphy->max_sched_scan_ie_len = SIR_MAC_MAX_IE_LENGTH; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)) || defined(WITH_BACKPORTS) - wiphy->max_sched_scan_plans = SIR_PNO_MAX_PLAN_REQUEST; -#endif - } -#endif /*FEATURE_WLAN_SCAN_PNO */ + hdd_config_sched_scan_plans_to_wiphy(wiphy, pCfg); #if defined QCA_WIFI_FTM if (cds_get_conparam() != QDF_GLOBAL_FTM_MODE) { diff --git a/core/hdd/src/wlan_hdd_scan.c b/core/hdd/src/wlan_hdd_scan.c index c271194691a8..2ebdc1771268 100644 --- a/core/hdd/src/wlan_hdd_scan.c +++ b/core/hdd/src/wlan_hdd_scan.c @@ -2374,6 +2374,70 @@ static QDF_STATUS wlan_hdd_is_pno_allowed(hdd_adapter_t *adapter) } +#if ((LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)) || \ + defined(CFG80211_MULTI_SCAN_PLAN_BACKPORT)) && \ + defined(FEATURE_WLAN_SCAN_PNO) +/** + * hdd_config_sched_scan_plan() - configures the sched scan plans + * from the framework. + * @pno_req: pointer to PNO scan request + * @request: pointer to scan request from framework + * + * Return: None + */ +static void hdd_config_sched_scan_plan(tpSirPNOScanReq pno_req, + struct cfg80211_sched_scan_request *request, + hdd_context_t *hdd_ctx) +{ + /* + * As of now max 2 scan plans were supported by firmware + * if number of scan plan supported by firmware increased below logic + * must change. + */ + if (request->n_scan_plans == SIR_PNO_MAX_PLAN_REQUEST) { + pno_req->fast_scan_period = + request->scan_plans[0].interval * MSEC_PER_SEC; + pno_req->fast_scan_max_cycles = + request->scan_plans[0].iterations; + pno_req->slow_scan_period = + request->scan_plans[1].interval * MSEC_PER_SEC; + hdd_notice("Base scan interval: %d sec, scan cycles: %d, slow scan interval %d", + request->scan_plans[0].interval, + request->scan_plans[0].iterations, + request->scan_plans[1].interval); + } else if (request->n_scan_plans == 1) { + pno_req->fast_scan_period = + request->scan_plans[0].interval * MSEC_PER_SEC; + /* + * if only one scan plan is configured from framework + * then both fast and slow scan should be configured with the + * same value that is why fast scan cycles are hardcoded to one + */ + pno_req->fast_scan_max_cycles = 1; + pno_req->slow_scan_period = + request->scan_plans[0].interval * MSEC_PER_SEC; + } else { + hdd_err("Invalid number of scan plans %d !!", + request->n_scan_plans); + } +} +#else +static void hdd_config_sched_scan_plan(tpSirPNOScanReq pno_req, + struct cfg80211_sched_scan_request *request, + hdd_context_t *hdd_ctx) +{ + pno_req->fast_scan_period = request->interval; + pno_req->fast_scan_max_cycles = + hdd_ctx->config->configPNOScanTimerRepeatValue; + pno_req->slow_scan_period = + hdd_ctx->config->pno_slow_scan_multiplier * + pno_req->fast_scan_period; + hdd_notice("Base scan interval: %d sec PNOScanTimerRepeatValue: %d", + (request->interval / 1000), + hdd_ctx->config->configPNOScanTimerRepeatValue); +} +#endif + /** * __wlan_hdd_cfg80211_sched_scan_start() - cfg80211 scheduled scan(pno) start * @wiphy: Pointer to wiphy @@ -2600,27 +2664,7 @@ static int __wlan_hdd_cfg80211_sched_scan_start(struct wiphy *wiphy, * switches slow_scan_period. This is less frequent scans and firmware * shall be in slow_scan_period mode until next PNO Start. */ -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)) || defined(WITH_BACKPORTS) - if (WARN_ON(request->n_scan_plans > SIR_PNO_MAX_PLAN_REQUEST)) { - ret = -EINVAL; - goto error; - } - - /* TBD: only one sched_scan plan we can support now, so we only - * retrieve the first plan and ignore the rest of them. - * If there are more than 1 sched_pan request we can support, the - * PnoRequet structure will also need to be revised. - */ - pPnoRequest->fast_scan_period = request->scan_plans[0].interval * - MSEC_PER_SEC; -#else - pPnoRequest->fast_scan_period = request->interval; -#endif - pPnoRequest->fast_scan_max_cycles = - config->configPNOScanTimerRepeatValue; - pPnoRequest->slow_scan_period = - config->pno_slow_scan_multiplier * - pPnoRequest->fast_scan_period; + hdd_config_sched_scan_plan(pPnoRequest, request, pHddCtx); hdd_info("Base scan interval: %d sec PNOScanTimerRepeatValue: %d", (pPnoRequest->fast_scan_period / 1000), diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index b72bc3707ad9..6f352fa8dbc0 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -2873,7 +2873,7 @@ typedef struct sAniIbssRouteTable { /* Set PNO */ -#define SIR_PNO_MAX_PLAN_REQUEST 1 +#define SIR_PNO_MAX_PLAN_REQUEST 2 #define SIR_PNO_MAX_NETW_CHANNELS 26 #define SIR_PNO_MAX_NETW_CHANNELS_EX 60 #define SIR_PNO_MAX_SUPP_NETWORKS 16 |
