diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c index df6076887b6a..fc7ba082505b 100644 --- a/os_if/linux/scan/src/wlan_cfg80211_scan.c +++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c @@ -392,6 +392,7 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev, struct pdev_osif_priv *osif_priv; struct wlan_objmgr_psoc *psoc; wlan_scan_id scan_id; + bool is_p2p_scan = false; /* Get the vdev object */ vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev(pdev, dev->dev_addr, @@ -427,6 +428,7 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev, } /* fill the scan request structure */ req->vdev = vdev; + req->scan_req.vdev_id = wlan_vdev_get_id(vdev); req->scan_req.scan_id = scan_id; req->scan_req.scan_req_id = req_id; /* @@ -460,17 +462,58 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev, (wlan_vdev_mlme_get_opmode(vdev) == QDF_P2P_GO_MODE)) req->scan_req.scan_f_passive = false; - if (!request->no_cck) { + if ((request->n_ssids == 1) && request->ssids && + !qdf_mem_cmp(&request->ssids[0], "DIRECT-", 7)) + is_p2p_scan = true; + + if (is_p2p_scan && request->no_cck) { + req->scan_req.adaptive_dwell_time_mode = + SCAN_DWELL_MODE_STATIC; + req->scan_req.dwell_time_active += + P2P_SEARCH_DWELL_TIME_INC; + req->scan_req.repeat_probe_time = + req->scan_req.dwell_time_active / 5; + req->scan_req.burst_duration = + BURST_SCAN_MAX_NUM_OFFCHANNELS * + req->scan_req.dwell_time_active; + if (req->scan_req.burst_duration > + P2P_SCAN_MAX_BURST_DURATION) { + uint8_t channels = + P2P_SCAN_MAX_BURST_DURATION / + req->scan_req.dwell_time_active; + if (channels) + req->scan_req.burst_duration = + channels * + req->scan_req.dwell_time_active; + else + req->scan_req.burst_duration = + P2P_SCAN_MAX_BURST_DURATION; + } + req->scan_req.scan_ev_bss_chan = false; + } else { req->scan_req.scan_f_cck_rates = true; if (!req->scan_req.num_ssids) req->scan_req.scan_f_bcast_probe = true; req->scan_req.scan_f_add_tpc_ie_in_probe = true; - req->scan_req.scan_f_filter_prb_req = true; } req->scan_req.scan_f_add_ds_ie_in_probe = true; + req->scan_req.scan_f_filter_prb_req = true; + req->scan_req.n_probes = (req->scan_req.repeat_probe_time > 0) ? + (req->scan_req.dwell_time_active / + req->scan_req.repeat_probe_time) : 0; + + /* + * FW require at least 1 MAC to send probe request. + * If MAC is all 0 set it to BC addr as this is the address on + * which fw will send probe req. + */ + req->scan_req.num_bssid = 1; qdf_mem_copy(&req->scan_req.bssid_list[0].bytes, request->bssid, QDF_MAC_ADDR_SIZE); + if (qdf_is_macaddr_zero(&req->scan_req.bssid_list[0])) + qdf_set_macaddr_broadcast(&req->scan_req.bssid_list[0]); + if (request->n_channels) { char chl[(request->n_channels * 5) + 1]; int len = 0; @@ -494,9 +537,7 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev, req->scan_req.num_chan = num_chan; /* P2P increase the scan priority */ - if ((request->n_ssids == 1) && - (request->ssids != NULL) && - qdf_mem_cmp(&request->ssids[0], "DIRECT-", 7)) + if (is_p2p_scan) req->scan_req.scan_priority = SCAN_PRIORITY_HIGH; if (request->ie_len) { req->scan_req.extraie.ptr = qdf_mem_malloc(request->ie_len); @@ -510,6 +551,10 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev, qdf_mem_copy(req->scan_req.extraie.ptr, request->ie, request->ie_len); } + + if (request->flags & NL80211_SCAN_FLAG_FLUSH) + ucfg_scan_flush_results(pdev, NULL); + /* Enqueue the scan request */ wlan_scan_request_enqueue(pdev, request, source, req->scan_req.scan_id); @@ -524,8 +569,6 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev, } } - if (request->flags & NL80211_SCAN_FLAG_FLUSH) - ucfg_scan_flush_results(pdev, NULL); end: wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID); return status; diff --git a/umac/scan/core/src/wlan_scan_main.h b/umac/scan/core/src/wlan_scan_main.h index 8d519b04045a..3b14ea75209d 100644 --- a/umac/scan/core/src/wlan_scan_main.h +++ b/umac/scan/core/src/wlan_scan_main.h @@ -57,8 +57,8 @@ #ifdef CONFIG_MCL #define SCAN_ACTIVE_DWELL_TIME 40 #define SCAN_PASSIVE_DWELL_TIME 110 -#define SCAN_MAX_REST_TIME 100 -#define SCAN_MIN_REST_TIME 50 +#define SCAN_MAX_REST_TIME 0 +#define SCAN_MIN_REST_TIME 0 #define SCAN_BURST_DURATION 0 #define SCAN_CONC_ACTIVE_DWELL_TIME 20 #define SCAN_CONC_PASSIVE_DWELL_TIME 100 @@ -70,7 +70,7 @@ #define SCAN_PROBE_DELAY 0 #define SCAN_MAX_SCAN_TIME 30000 #define SCAN_NUM_PROBES 2 -#define SCAN_NETWORK_IDLE_TIMEOUT 25 +#define SCAN_NETWORK_IDLE_TIMEOUT 0 #else #define SCAN_ACTIVE_DWELL_TIME 105 #define SCAN_PASSIVE_DWELL_TIME 300 @@ -229,6 +229,7 @@ struct scan_default_params { uint16_t max_bss_per_pdev; uint8_t max_num_scan_allowed; enum scan_priority scan_priority; + enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode; union { struct { uint32_t scan_f_passive:1, diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h index f25a12486220..e0e383b8a2da 100644 --- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h +++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h @@ -46,6 +46,11 @@ typedef uint32_t wlan_scan_id; #define SCM_BSS_CAP_VALUE_UAPSD 1 #define SCM_BSS_CAP_VALUE_5GHZ 2 +#define BURST_SCAN_MAX_NUM_OFFCHANNELS 3 +#define P2P_SCAN_MAX_BURST_DURATION 180 +/* Increase dwell time for P2P search in ms */ +#define P2P_SEARCH_DWELL_TIME_INC 20 + /* forward declaration */ struct wlan_objmgr_vdev; struct wlan_objmgr_pdev; @@ -444,6 +449,21 @@ struct scan_extra_params_legacy { uint32_t init_rest_time; }; +/** + * enum scan_dwelltime_adaptive_mode: dwelltime_mode + * @SCAN_DWELL_MODE_DEFAULT: Use firmware default mode + * @SCAN_DWELL_MODE_CONSERVATIVE: Conservative adaptive mode + * @SCAN_DWELL_MODE_MODERATE: Moderate adaptive mode + * @SCAN_DWELL_MODE_AGGRESSIVE: Aggressive adaptive mode + * @SCAN_DWELL_MODE_STATIC: static adaptive mode + */ +enum scan_dwelltime_adaptive_mode { + SCAN_DWELL_MODE_DEFAULT = 0, + SCAN_DWELL_MODE_CONSERVATIVE = 1, + SCAN_DWELL_MODE_MODERATE = 2, + SCAN_DWELL_MODE_AGGRESSIVE = 3, + SCAN_DWELL_MODE_STATIC = 4 +}; /** * struct scan_req_params - start scan request parameter @@ -579,6 +599,7 @@ struct scan_req_params { }; uint32_t scan_flags; }; + enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode; uint32_t burst_duration; uint32_t num_chan; uint32_t num_bssid; diff --git a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c index 27ab1027d9f9..8e3d6b5eea68 100644 --- a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c +++ b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c @@ -360,6 +360,7 @@ wlan_scan_global_init(struct wlan_scan_obj *scan_obj) scan_obj->scan_def.max_num_scan_allowed = SCAN_MAX_NUM_SCAN_ALLOWED; scan_obj->scan_def.scan_priority = SCAN_PRIORITY; scan_obj->scan_def.idle_time = SCAN_NETWORK_IDLE_TIMEOUT; + scan_obj->scan_def.adaptive_dwell_time_mode = SCAN_DWELL_MODE_DEFAULT; /* scan contrl flags */ scan_obj->scan_def.scan_f_passive = true; scan_obj->scan_def.scan_f_ofdm_rates = true; @@ -478,6 +479,8 @@ ucfg_scan_init_default_params(struct wlan_objmgr_vdev *vdev, req->scan_req.probe_delay = def->probe_delay; req->scan_req.burst_duration = def->burst_duration; req->scan_req.n_probes = def->num_probes; + req->scan_req.adaptive_dwell_time_mode = + def->adaptive_dwell_time_mode; req->scan_req.scan_flags = def->scan_flags; req->scan_req.scan_events = def->scan_events;