From 47c737dba8435e20febe3de129c63dcb4b902eec Mon Sep 17 00:00:00 2001 From: bings Date: Fri, 19 Apr 2019 14:38:25 +0800 Subject: [PATCH] qcacmn: Add ini to honour NL80211 scan policy flags Currently dwell time is determined by scan policy flags from kernel. Sometimes when we suspect the scan result is not full enough, we need to set dwell time by force through ini. Add ini to decide whether to honour NL80211 scan policy flags, so that we can disable dwell time changed by scan policy flag from kernel. Change-Id: Ia0b9f957a7de901513479522e008e4bcbd6b2c0e CRs-Fixed: 2428630 --- os_if/linux/scan/src/wlan_cfg80211_scan.c | 16 +++++----- umac/scan/core/src/wlan_scan_main.h | 2 ++ umac/scan/core/src/wlan_scan_manager.c | 5 ++++ umac/scan/dispatcher/inc/wlan_scan_api.h | 9 ++++++ umac/scan/dispatcher/inc/wlan_scan_cfg.h | 30 +++++++++++++++++++ umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h | 13 ++++++++ umac/scan/dispatcher/src/wlan_scan_api.c | 11 +++++++ umac/scan/dispatcher/src/wlan_scan_ucfg_api.c | 2 ++ 8 files changed, 81 insertions(+), 7 deletions(-) diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c index 26928ded05..c6fda4ca75 100644 --- a/os_if/linux/scan/src/wlan_cfg80211_scan.c +++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c @@ -1405,13 +1405,15 @@ int wlan_cfg80211_scan(struct wlan_objmgr_vdev *vdev, req->scan_req.scan_type = SCAN_TYPE_P2P_SEARCH; /* Set dwell time mode according to scan policy type flags */ - if (req->scan_req.scan_policy_high_accuracy) - req->scan_req.adaptive_dwell_time_mode = - SCAN_DWELL_MODE_STATIC; - if ((req->scan_req.scan_policy_low_power) || - (req->scan_req.scan_policy_low_span)) - req->scan_req.adaptive_dwell_time_mode = - SCAN_DWELL_MODE_AGGRESSIVE; + if (ucfg_scan_cfg_honour_nl_scan_policy_flags(psoc)) { + if (req->scan_req.scan_policy_high_accuracy) + req->scan_req.adaptive_dwell_time_mode = + SCAN_DWELL_MODE_STATIC; + if (req->scan_req.scan_policy_low_power || + req->scan_req.scan_policy_low_span) + req->scan_req.adaptive_dwell_time_mode = + SCAN_DWELL_MODE_AGGRESSIVE; + } /* * FW require at least 1 MAC to send probe request. diff --git a/umac/scan/core/src/wlan_scan_main.h b/umac/scan/core/src/wlan_scan_main.h index 421080ee4a..0c990e06c8 100644 --- a/umac/scan/core/src/wlan_scan_main.h +++ b/umac/scan/core/src/wlan_scan_main.h @@ -312,6 +312,7 @@ struct extscan_def_config { * @scan_priority: default scan priority * @adaptive_dwell_time_mode: adaptive dwell mode with connection * @adaptive_dwell_time_mode_nc: adaptive dwell mode without connection + * @honour_nl_scan_policy_flags: honour nl80211 scan policy flags * @extscan_adaptive_dwell_mode: Adaptive dwell mode during ext scan * @scan_f_passive: passively scan all channels including active channels * @scan_f_bcast_probe: add wild card ssid prbreq even if ssid_list is specified @@ -396,6 +397,7 @@ struct scan_default_params { enum scan_priority scan_priority; enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode; enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode_nc; + bool honour_nl_scan_policy_flags; enum scan_dwelltime_adaptive_mode extscan_adaptive_dwell_mode; union { struct { diff --git a/umac/scan/core/src/wlan_scan_manager.c b/umac/scan/core/src/wlan_scan_manager.c index c71a45e20f..27a2575b9f 100644 --- a/umac/scan/core/src/wlan_scan_manager.c +++ b/umac/scan/core/src/wlan_scan_manager.c @@ -443,6 +443,11 @@ scm_update_dbs_scan_ctrl_ext_flag(struct scan_start_request *req) goto end; } + if (!wlan_scan_cfg_honour_nl_scan_policy_flags(psoc)) { + scm_debug("nl scan policy flags not honoured, goto end"); + goto end; + } + if (req->scan_req.scan_policy_high_accuracy) { scm_debug("high accuracy scan received, going for non-dbs scan"); scan_dbs_policy = SCAN_DBS_POLICY_FORCE_NONDBS; diff --git a/umac/scan/dispatcher/inc/wlan_scan_api.h b/umac/scan/dispatcher/inc/wlan_scan_api.h index cbad19c487..a55e9e457f 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_api.h +++ b/umac/scan/dispatcher/inc/wlan_scan_api.h @@ -106,6 +106,15 @@ void wlan_scan_cfg_get_conc_passive_dwelltime(struct wlan_objmgr_psoc *psoc, void wlan_scan_cfg_set_conc_passive_dwelltime(struct wlan_objmgr_psoc *psoc, uint32_t dwell_time); +/** + * wlan_scan_cfg_honour_nl_scan_policy_flags() - API to get nl scan policy + * flags honoured + * @psoc: pointer to psoc object + * + * Return: nl scan policy flags honoured or not + */ +bool wlan_scan_cfg_honour_nl_scan_policy_flags(struct wlan_objmgr_psoc *psoc); + /** * wlan_scan_cfg_get_conc_max_resttime() - API to get max rest time * @psoc: pointer to psoc object diff --git a/umac/scan/dispatcher/inc/wlan_scan_cfg.h b/umac/scan/dispatcher/inc/wlan_scan_cfg.h index d5467e45c5..fd28e5a739 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_cfg.h +++ b/umac/scan/dispatcher/inc/wlan_scan_cfg.h @@ -252,6 +252,35 @@ 0, 4, MCL_OR_WIN_VALUE(4, 0),\ CFG_VALUE_OR_DEFAULT,\ "Enable adaptive dwell mode without connection") + +/* + * + * honour_nl_scan_policy_flags - This ini will decide whether to honour + * NL80211 scan policy flags + * @Min: 0 + * @Max: 1 + * @Default: 1 + * + * This parameter will decide whether to honour scan flags such as + * NL80211_SCAN_FLAG_HIGH_ACCURACY , NL80211_SCAN_FLAG_LOW_SPAN, + * NL80211_SCAN_FLAG_LOW_POWER. + * Acceptable values for this: + * 0: Config is disabled + * 1: Config is enabled + * + * Related: None + * + * Supported Feature: Scan + * + * Usage: Internal + * + * + */ +#define CFG_HONOUR_NL_SCAN_POLICY_FLAGS CFG_INI_BOOL(\ + "honour_nl_scan_policy_flags",\ + true, \ + "honour NL80211 scan policy flags") + /* * * is_bssid_hint_priority - Set priority for connection with bssid_hint @@ -1124,6 +1153,7 @@ CFG(CFG_SCAN_PROBE_REPEAT_TIME) \ CFG(CFG_ADAPTIVE_SCAN_DWELL_MODE) \ CFG(CFG_ADAPTIVE_SCAN_DWELL_MODE_NC) \ + CFG(CFG_HONOUR_NL_SCAN_POLICY_FLAGS) \ CFG(CFG_IS_BSSID_HINT_PRIORITY) \ CFG(CFG_PASSIVE_MAX_CHANNEL_TIME_CONC) \ CFG(CFG_ACTIVE_MAX_CHANNEL_TIME_CONC) \ diff --git a/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h b/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h index f3771ea27f..22edb48082 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h +++ b/umac/scan/dispatcher/inc/wlan_scan_ucfg_api.h @@ -805,6 +805,19 @@ void ucfg_scan_cfg_set_dfs_chan_scan_allowed(struct wlan_objmgr_psoc *psoc, */ bool ucfg_scan_wake_lock_in_user_scan(struct wlan_objmgr_psoc *psoc); +/** + * ucfg_scan_cfg_honour_nl_scan_policy_flags() - API to get nl scan policy + * flags honoured. + * @psoc: pointer to psoc object + * + * Return: nl scan flags is honoured or not + */ +static inline +bool ucfg_scan_cfg_honour_nl_scan_policy_flags(struct wlan_objmgr_psoc *psoc) +{ + return wlan_scan_cfg_honour_nl_scan_policy_flags(psoc); +} + /** * ucfg_scan_cfg_get_conc_max_resttime() - API to get max rest time * @psoc: pointer to psoc object diff --git a/umac/scan/dispatcher/src/wlan_scan_api.c b/umac/scan/dispatcher/src/wlan_scan_api.c index d4f50c36e4..030e580d98 100644 --- a/umac/scan/dispatcher/src/wlan_scan_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_api.c @@ -141,6 +141,17 @@ wlan_scan_cfg_set_dfs_chan_scan_allowed(struct wlan_objmgr_psoc *psoc, scan_obj->scan_def.allow_dfs_chan_in_scan = enable_dfs_scan; } +bool wlan_scan_cfg_honour_nl_scan_policy_flags(struct wlan_objmgr_psoc *psoc) +{ + struct wlan_scan_obj *scan_obj; + + scan_obj = wlan_psoc_get_scan_obj(psoc); + if (!scan_obj) + return false; + + return scan_obj->scan_def.honour_nl_scan_policy_flags; +} + void wlan_scan_cfg_get_conc_max_resttime(struct wlan_objmgr_psoc *psoc, uint32_t *rest_time) { diff --git a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c index 3eb3f9421e..8b8d8c6797 100644 --- a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c @@ -992,6 +992,8 @@ wlan_scan_global_init(struct wlan_objmgr_psoc *psoc, cfg_get(psoc, CFG_ADAPTIVE_SCAN_DWELL_MODE); scan_obj->scan_def.adaptive_dwell_time_mode_nc = cfg_get(psoc, CFG_ADAPTIVE_SCAN_DWELL_MODE_NC); + scan_obj->scan_def.honour_nl_scan_policy_flags = + cfg_get(psoc, CFG_HONOUR_NL_SCAN_POLICY_FLAGS); scan_obj->scan_def.enable_mac_spoofing = cfg_get(psoc, CFG_ENABLE_MAC_ADDR_SPOOFING); scan_obj->scan_def.extscan_adaptive_dwell_mode =