xref: /wlan-driver/qca-wifi-host-cmn/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name /*
19*5113495bSYour Name  * DOC: contains scan north bound interface definitions
20*5113495bSYour Name  */
21*5113495bSYour Name 
22*5113495bSYour Name #include <scheduler_api.h>
23*5113495bSYour Name #include <wlan_scan_ucfg_api.h>
24*5113495bSYour Name #include <wlan_objmgr_global_obj.h>
25*5113495bSYour Name #include <wlan_objmgr_cmn.h>
26*5113495bSYour Name #include <wlan_serialization_api.h>
27*5113495bSYour Name #include <wlan_scan_tgt_api.h>
28*5113495bSYour Name #include <wlan_scan_utils_api.h>
29*5113495bSYour Name #include <wlan_reg_ucfg_api.h>
30*5113495bSYour Name #include <wlan_reg_services_api.h>
31*5113495bSYour Name #include <wlan_utility.h>
32*5113495bSYour Name #include "../../core/src/wlan_scan_main.h"
33*5113495bSYour Name #include "../../core/src/wlan_scan_manager.h"
34*5113495bSYour Name #include "../../core/src/wlan_scan_cache_db.h"
35*5113495bSYour Name #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
36*5113495bSYour Name #include <wlan_pmo_obj_mgmt_api.h>
37*5113495bSYour Name #endif
38*5113495bSYour Name #ifdef WLAN_POLICY_MGR_ENABLE
39*5113495bSYour Name #include <wlan_dfs_utils_api.h>
40*5113495bSYour Name #include <wlan_policy_mgr_api.h>
41*5113495bSYour Name #endif
42*5113495bSYour Name #include "cfg_ucfg_api.h"
43*5113495bSYour Name #include "wlan_extscan_api.h"
44*5113495bSYour Name 
ucfg_scan_register_bcn_cb(struct wlan_objmgr_psoc * psoc,update_beacon_cb cb,enum scan_cb_type type)45*5113495bSYour Name QDF_STATUS ucfg_scan_register_bcn_cb(struct wlan_objmgr_psoc *psoc,
46*5113495bSYour Name 	update_beacon_cb cb, enum scan_cb_type type)
47*5113495bSYour Name {
48*5113495bSYour Name 	return scm_scan_register_bcn_cb(psoc, cb, type);
49*5113495bSYour Name }
50*5113495bSYour Name 
ucfg_scan_get_result(struct wlan_objmgr_pdev * pdev,struct scan_filter * filter)51*5113495bSYour Name qdf_list_t *ucfg_scan_get_result(struct wlan_objmgr_pdev *pdev,
52*5113495bSYour Name 	struct scan_filter *filter)
53*5113495bSYour Name {
54*5113495bSYour Name 	return scm_get_scan_result(pdev, filter);
55*5113495bSYour Name }
56*5113495bSYour Name 
ucfg_scan_db_iterate(struct wlan_objmgr_pdev * pdev,scan_iterator_func func,void * arg)57*5113495bSYour Name QDF_STATUS ucfg_scan_db_iterate(struct wlan_objmgr_pdev *pdev,
58*5113495bSYour Name 	scan_iterator_func func, void *arg)
59*5113495bSYour Name {
60*5113495bSYour Name 	return scm_iterate_scan_db(pdev, func, arg);
61*5113495bSYour Name }
62*5113495bSYour Name 
ucfg_scan_purge_results(qdf_list_t * scan_list)63*5113495bSYour Name QDF_STATUS ucfg_scan_purge_results(qdf_list_t *scan_list)
64*5113495bSYour Name {
65*5113495bSYour Name 	return scm_purge_scan_results(scan_list);
66*5113495bSYour Name }
67*5113495bSYour Name 
ucfg_scan_flush_results(struct wlan_objmgr_pdev * pdev,struct scan_filter * filter)68*5113495bSYour Name QDF_STATUS ucfg_scan_flush_results(struct wlan_objmgr_pdev *pdev,
69*5113495bSYour Name 	struct scan_filter *filter)
70*5113495bSYour Name {
71*5113495bSYour Name 	return scm_flush_results(pdev, filter);
72*5113495bSYour Name }
73*5113495bSYour Name 
ucfg_scan_filter_valid_channel(struct wlan_objmgr_pdev * pdev,uint32_t * chan_freq_list,uint32_t num_chan)74*5113495bSYour Name void ucfg_scan_filter_valid_channel(struct wlan_objmgr_pdev *pdev,
75*5113495bSYour Name 	uint32_t *chan_freq_list, uint32_t num_chan)
76*5113495bSYour Name {
77*5113495bSYour Name 	scm_filter_valid_channel(pdev, chan_freq_list, num_chan);
78*5113495bSYour Name }
79*5113495bSYour Name 
ucfg_scan_get_entry_frame_len(struct scan_cache_entry * scan_entry)80*5113495bSYour Name uint32_t ucfg_scan_get_entry_frame_len(struct scan_cache_entry *scan_entry)
81*5113495bSYour Name {
82*5113495bSYour Name 	return util_scan_entry_frame_len(scan_entry);
83*5113495bSYour Name }
84*5113495bSYour Name 
ucfg_scan_init(void)85*5113495bSYour Name QDF_STATUS ucfg_scan_init(void)
86*5113495bSYour Name {
87*5113495bSYour Name 	QDF_STATUS status;
88*5113495bSYour Name 
89*5113495bSYour Name 	status = wlan_objmgr_register_psoc_create_handler(WLAN_UMAC_COMP_SCAN,
90*5113495bSYour Name 		wlan_scan_psoc_created_notification, NULL);
91*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
92*5113495bSYour Name 		scm_err("Failed to register psoc create handler");
93*5113495bSYour Name 		goto fail_create_psoc;
94*5113495bSYour Name 	}
95*5113495bSYour Name 
96*5113495bSYour Name 	status = wlan_objmgr_register_psoc_destroy_handler(WLAN_UMAC_COMP_SCAN,
97*5113495bSYour Name 		wlan_scan_psoc_destroyed_notification, NULL);
98*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
99*5113495bSYour Name 		scm_err("Failed to create psoc delete handler");
100*5113495bSYour Name 		goto fail_psoc_destroy;
101*5113495bSYour Name 	}
102*5113495bSYour Name 	scm_debug("scan psoc create and delete handler registered with objmgr");
103*5113495bSYour Name 
104*5113495bSYour Name 	status = wlan_objmgr_register_vdev_create_handler(WLAN_UMAC_COMP_SCAN,
105*5113495bSYour Name 		wlan_scan_vdev_created_notification, NULL);
106*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
107*5113495bSYour Name 		scm_err("Failed to register vdev create handler");
108*5113495bSYour Name 		goto fail_pdev_create;
109*5113495bSYour Name 	}
110*5113495bSYour Name 
111*5113495bSYour Name 	status = wlan_objmgr_register_vdev_destroy_handler(WLAN_UMAC_COMP_SCAN,
112*5113495bSYour Name 		wlan_scan_vdev_destroyed_notification, NULL);
113*5113495bSYour Name 	if (QDF_IS_STATUS_SUCCESS(status)) {
114*5113495bSYour Name 		scm_debug("scan vdev create and delete handler registered with objmgr");
115*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
116*5113495bSYour Name 	}
117*5113495bSYour Name 
118*5113495bSYour Name 	scm_err("Failed to destroy vdev delete handler");
119*5113495bSYour Name 	wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_SCAN,
120*5113495bSYour Name 				wlan_scan_vdev_created_notification, NULL);
121*5113495bSYour Name fail_pdev_create:
122*5113495bSYour Name 	wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_SCAN,
123*5113495bSYour Name 				wlan_scan_psoc_destroyed_notification, NULL);
124*5113495bSYour Name fail_psoc_destroy:
125*5113495bSYour Name 	wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_SCAN,
126*5113495bSYour Name 			wlan_scan_psoc_created_notification, NULL);
127*5113495bSYour Name fail_create_psoc:
128*5113495bSYour Name 	return status;
129*5113495bSYour Name }
130*5113495bSYour Name 
ucfg_scan_deinit(void)131*5113495bSYour Name QDF_STATUS ucfg_scan_deinit(void)
132*5113495bSYour Name {
133*5113495bSYour Name 	QDF_STATUS status;
134*5113495bSYour Name 
135*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_SCAN,
136*5113495bSYour Name 		wlan_scan_psoc_created_notification, NULL);
137*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
138*5113495bSYour Name 		scm_err("Failed to unregister psoc create handler");
139*5113495bSYour Name 
140*5113495bSYour Name 	status = wlan_objmgr_unregister_psoc_destroy_handler(
141*5113495bSYour Name 				WLAN_UMAC_COMP_SCAN,
142*5113495bSYour Name 				wlan_scan_psoc_destroyed_notification, NULL);
143*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
144*5113495bSYour Name 		scm_err("Failed to unregister psoc delete handler");
145*5113495bSYour Name 
146*5113495bSYour Name 	status = wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_SCAN,
147*5113495bSYour Name 		wlan_scan_vdev_created_notification, NULL);
148*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
149*5113495bSYour Name 		scm_err("Failed to unregister vdev create handler");
150*5113495bSYour Name 
151*5113495bSYour Name 	status = wlan_objmgr_unregister_vdev_destroy_handler(
152*5113495bSYour Name 			WLAN_UMAC_COMP_SCAN,
153*5113495bSYour Name 			wlan_scan_vdev_destroyed_notification, NULL);
154*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
155*5113495bSYour Name 		scm_err("Failed to unregister vdev delete handler");
156*5113495bSYour Name 
157*5113495bSYour Name 	return status;
158*5113495bSYour Name }
159*5113495bSYour Name 
160*5113495bSYour Name #ifdef FEATURE_WLAN_SCAN_PNO
161*5113495bSYour Name bool
ucfg_is_6ghz_pno_scan_optimization_supported(struct wlan_objmgr_psoc * psoc)162*5113495bSYour Name ucfg_is_6ghz_pno_scan_optimization_supported(struct wlan_objmgr_psoc *psoc)
163*5113495bSYour Name {
164*5113495bSYour Name 	return wlan_psoc_nif_fw_ext_cap_get(psoc,
165*5113495bSYour Name 					WLAN_SOC_PNO_SCAN_CONFIG_PER_CHANNEL);
166*5113495bSYour Name }
167*5113495bSYour Name 
ucfg_scan_pno_start(struct wlan_objmgr_vdev * vdev,struct pno_scan_req_params * req)168*5113495bSYour Name QDF_STATUS ucfg_scan_pno_start(struct wlan_objmgr_vdev *vdev,
169*5113495bSYour Name 	struct pno_scan_req_params *req)
170*5113495bSYour Name {
171*5113495bSYour Name 	struct scan_vdev_obj *scan_vdev_obj;
172*5113495bSYour Name 	QDF_STATUS status;
173*5113495bSYour Name 
174*5113495bSYour Name 	scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
175*5113495bSYour Name 	if (!scan_vdev_obj) {
176*5113495bSYour Name 		scm_err("null scan_vdev_obj");
177*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
178*5113495bSYour Name 	}
179*5113495bSYour Name 	if (scan_vdev_obj->pno_in_progress) {
180*5113495bSYour Name 		scm_err("pno already in progress");
181*5113495bSYour Name 		return QDF_STATUS_E_ALREADY;
182*5113495bSYour Name 	}
183*5113495bSYour Name 
184*5113495bSYour Name 	status = tgt_scan_pno_start(vdev, req);
185*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
186*5113495bSYour Name 		scm_err("pno start failed");
187*5113495bSYour Name 	else
188*5113495bSYour Name 		scan_vdev_obj->pno_in_progress = true;
189*5113495bSYour Name 
190*5113495bSYour Name 	return status;
191*5113495bSYour Name }
192*5113495bSYour Name 
ucfg_scan_add_flags_to_pno_chan_list(struct wlan_objmgr_vdev * vdev,struct pno_scan_req_params * req,uint8_t * num_chan,uint32_t short_ssid,int list_idx)193*5113495bSYour Name void ucfg_scan_add_flags_to_pno_chan_list(struct wlan_objmgr_vdev *vdev,
194*5113495bSYour Name 					  struct pno_scan_req_params *req,
195*5113495bSYour Name 					  uint8_t *num_chan,
196*5113495bSYour Name 					  uint32_t short_ssid,
197*5113495bSYour Name 					  int list_idx)
198*5113495bSYour Name {
199*5113495bSYour Name 	struct chan_list *pno_chan_list =
200*5113495bSYour Name 				    &req->networks_list[list_idx].pno_chan_list;
201*5113495bSYour Name 
202*5113495bSYour Name 	/* Add RNR flags to channels based on scan_mode_6g ini */
203*5113495bSYour Name 	scm_add_channel_flags(vdev, pno_chan_list, num_chan,
204*5113495bSYour Name 			      req->scan_policy_colocated_6ghz, true);
205*5113495bSYour Name 	/* Filter RNR flags in pno channel list based on short ssid entry in
206*5113495bSYour Name 	 * RNR db cache.
207*5113495bSYour Name 	 */
208*5113495bSYour Name 	scm_filter_rnr_flag_pno(vdev, short_ssid,
209*5113495bSYour Name 				&req->networks_list[0].pno_chan_list);
210*5113495bSYour Name }
211*5113495bSYour Name 
ucfg_scan_pno_stop(struct wlan_objmgr_vdev * vdev)212*5113495bSYour Name QDF_STATUS ucfg_scan_pno_stop(struct wlan_objmgr_vdev *vdev)
213*5113495bSYour Name {
214*5113495bSYour Name 	struct scan_vdev_obj *scan_vdev_obj;
215*5113495bSYour Name 	QDF_STATUS status;
216*5113495bSYour Name 
217*5113495bSYour Name 	scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
218*5113495bSYour Name 	if (!scan_vdev_obj) {
219*5113495bSYour Name 		scm_err("null scan_vdev_obj");
220*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
221*5113495bSYour Name 	}
222*5113495bSYour Name 	if (!scan_vdev_obj->pno_in_progress) {
223*5113495bSYour Name 		scm_debug("pno already stopped");
224*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
225*5113495bSYour Name 	}
226*5113495bSYour Name 
227*5113495bSYour Name 	status = tgt_scan_pno_stop(vdev, wlan_vdev_get_id(vdev));
228*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
229*5113495bSYour Name 		scm_err("pno stop failed");
230*5113495bSYour Name 	else
231*5113495bSYour Name 		scan_vdev_obj->pno_in_progress = false;
232*5113495bSYour Name 
233*5113495bSYour Name 	return status;
234*5113495bSYour Name }
235*5113495bSYour Name 
ucfg_scan_get_pno_in_progress(struct wlan_objmgr_vdev * vdev)236*5113495bSYour Name bool ucfg_scan_get_pno_in_progress(struct wlan_objmgr_vdev *vdev)
237*5113495bSYour Name {
238*5113495bSYour Name 	struct scan_vdev_obj *scan_vdev_obj;
239*5113495bSYour Name 
240*5113495bSYour Name 	scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
241*5113495bSYour Name 	if (!scan_vdev_obj) {
242*5113495bSYour Name 		scm_err("null scan_vdev_obj");
243*5113495bSYour Name 		return false;
244*5113495bSYour Name 	}
245*5113495bSYour Name 
246*5113495bSYour Name 	return scan_vdev_obj->pno_in_progress;
247*5113495bSYour Name }
248*5113495bSYour Name 
ucfg_scan_get_pno_match(struct wlan_objmgr_vdev * vdev)249*5113495bSYour Name bool ucfg_scan_get_pno_match(struct wlan_objmgr_vdev *vdev)
250*5113495bSYour Name {
251*5113495bSYour Name 	struct scan_vdev_obj *scan_vdev_obj;
252*5113495bSYour Name 
253*5113495bSYour Name 	scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
254*5113495bSYour Name 	if (!scan_vdev_obj) {
255*5113495bSYour Name 		scm_err("null scan_vdev_obj");
256*5113495bSYour Name 		return false;
257*5113495bSYour Name 	}
258*5113495bSYour Name 
259*5113495bSYour Name 	return scan_vdev_obj->pno_match_evt_received;
260*5113495bSYour Name }
261*5113495bSYour Name 
262*5113495bSYour Name static QDF_STATUS
wlan_pno_global_init(struct wlan_objmgr_psoc * psoc,struct wlan_scan_obj * scan_obj)263*5113495bSYour Name wlan_pno_global_init(struct wlan_objmgr_psoc *psoc,
264*5113495bSYour Name 		     struct wlan_scan_obj *scan_obj)
265*5113495bSYour Name {
266*5113495bSYour Name 	struct nlo_mawc_params *mawc_cfg;
267*5113495bSYour Name 	struct pno_def_config *pno_def;
268*5113495bSYour Name 
269*5113495bSYour Name 	pno_def = &scan_obj->pno_cfg;
270*5113495bSYour Name 	qdf_wake_lock_create(&pno_def->pno_wake_lock, "wlan_pno_wl");
271*5113495bSYour Name 	qdf_runtime_lock_init(&pno_def->pno_runtime_pm_lock);
272*5113495bSYour Name 	mawc_cfg = &pno_def->mawc_params;
273*5113495bSYour Name 	pno_def->channel_prediction = cfg_get(psoc, CFG_PNO_CHANNEL_PREDICTION);
274*5113495bSYour Name 	pno_def->top_k_num_of_channels =
275*5113495bSYour Name 			cfg_get(psoc, CFG_TOP_K_NUM_OF_CHANNELS);
276*5113495bSYour Name 	pno_def->stationary_thresh = cfg_get(psoc, CFG_STATIONARY_THRESHOLD);
277*5113495bSYour Name 	pno_def->channel_prediction_full_scan =
278*5113495bSYour Name 			cfg_get(psoc, CFG_CHANNEL_PREDICTION_SCAN_TIMER);
279*5113495bSYour Name 	pno_def->adaptive_dwell_mode =
280*5113495bSYour Name 			cfg_get(psoc, CFG_ADAPTIVE_PNOSCAN_DWELL_MODE);
281*5113495bSYour Name 	pno_def->dfs_chnl_scan_enabled =
282*5113495bSYour Name 			cfg_get(psoc, CFG_ENABLE_DFS_PNO_CHNL_SCAN);
283*5113495bSYour Name 	pno_def->scan_support_enabled =
284*5113495bSYour Name 			cfg_get(psoc, CFG_PNO_SCAN_SUPPORT);
285*5113495bSYour Name 	pno_def->scan_timer_repeat_value =
286*5113495bSYour Name 			cfg_get(psoc, CFG_PNO_SCAN_TIMER_REPEAT_VALUE);
287*5113495bSYour Name 	pno_def->slow_scan_multiplier =
288*5113495bSYour Name 			cfg_get(psoc, CFG_PNO_SLOW_SCAN_MULTIPLIER);
289*5113495bSYour Name 	pno_def->scan_backoff_multiplier =
290*5113495bSYour Name 			cfg_get(psoc, CFG_SCAN_BACKOFF_MULTIPLIER);
291*5113495bSYour Name 	pno_def->max_sched_scan_plan_interval =
292*5113495bSYour Name 			cfg_get(psoc, CFG_MAX_SCHED_SCAN_PLAN_INTERVAL);
293*5113495bSYour Name 	pno_def->max_sched_scan_plan_iterations =
294*5113495bSYour Name 			cfg_get(psoc, CFG_MAX_SCHED_SCAN_PLAN_ITERATIONS);
295*5113495bSYour Name 	pno_def->user_config_sched_scan_plan =
296*5113495bSYour Name 			cfg_get(psoc, CFG_USER_CONFIG_SCHED_SCAN_PLAN);
297*5113495bSYour Name 
298*5113495bSYour Name 	mawc_cfg->enable = cfg_get(psoc, CFG_MAWC_NLO_ENABLED);
299*5113495bSYour Name 	mawc_cfg->exp_backoff_ratio =
300*5113495bSYour Name 			cfg_get(psoc, CFG_MAWC_NLO_EXP_BACKOFF_RATIO);
301*5113495bSYour Name 	mawc_cfg->init_scan_interval =
302*5113495bSYour Name 			cfg_get(psoc, CFG_MAWC_NLO_INIT_SCAN_INTERVAL);
303*5113495bSYour Name 	mawc_cfg->max_scan_interval =
304*5113495bSYour Name 			cfg_get(psoc, CFG_MAWC_NLO_MAX_SCAN_INTERVAL);
305*5113495bSYour Name 
306*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
307*5113495bSYour Name }
308*5113495bSYour Name 
309*5113495bSYour Name static QDF_STATUS
wlan_pno_global_deinit(struct wlan_scan_obj * scan_obj)310*5113495bSYour Name wlan_pno_global_deinit(struct wlan_scan_obj *scan_obj)
311*5113495bSYour Name {
312*5113495bSYour Name 	qdf_runtime_lock_deinit(&scan_obj->pno_cfg.pno_runtime_pm_lock);
313*5113495bSYour Name 	qdf_wake_lock_destroy(&scan_obj->pno_cfg.pno_wake_lock);
314*5113495bSYour Name 
315*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
316*5113495bSYour Name }
317*5113495bSYour Name 
318*5113495bSYour Name QDF_STATUS
ucfg_scan_get_pno_def_params(struct wlan_objmgr_vdev * vdev,struct pno_scan_req_params * req)319*5113495bSYour Name ucfg_scan_get_pno_def_params(struct wlan_objmgr_vdev *vdev,
320*5113495bSYour Name 	struct pno_scan_req_params *req)
321*5113495bSYour Name {
322*5113495bSYour Name 	struct scan_default_params *scan_def;
323*5113495bSYour Name 	struct wlan_scan_obj *scan;
324*5113495bSYour Name 	struct pno_def_config *pno_def;
325*5113495bSYour Name 
326*5113495bSYour Name 	if (!vdev || !req) {
327*5113495bSYour Name 		scm_err("vdev: 0x%pK, req: 0x%pK",
328*5113495bSYour Name 			vdev, req);
329*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
330*5113495bSYour Name 	}
331*5113495bSYour Name 
332*5113495bSYour Name 	scan = wlan_vdev_get_scan_obj(vdev);
333*5113495bSYour Name 	if (!scan) {
334*5113495bSYour Name 		scm_err("scan is NULL");
335*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
336*5113495bSYour Name 	}
337*5113495bSYour Name 	scan_def = wlan_vdev_get_def_scan_params(vdev);
338*5113495bSYour Name 	if (!scan_def) {
339*5113495bSYour Name 		scm_err("wlan_vdev_get_def_scan_params returned NULL");
340*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
341*5113495bSYour Name 	}
342*5113495bSYour Name 
343*5113495bSYour Name 	pno_def = &scan->pno_cfg;
344*5113495bSYour Name 	req->active_dwell_time = scan_def->active_dwell;
345*5113495bSYour Name 	req->passive_dwell_time = scan_def->passive_dwell;
346*5113495bSYour Name 	req->scan_random.randomize = scan_def->enable_mac_spoofing;
347*5113495bSYour Name 
348*5113495bSYour Name 	/*
349*5113495bSYour Name 	 *  Update active and passive dwell time depending
350*5113495bSYour Name 	 *  upon the present active concurrency mode
351*5113495bSYour Name 	 */
352*5113495bSYour Name 	wlan_scan_update_pno_dwell_time(vdev, req, scan_def);
353*5113495bSYour Name 	req->adaptive_dwell_mode = pno_def->adaptive_dwell_mode;
354*5113495bSYour Name 	req->pno_channel_prediction = pno_def->channel_prediction;
355*5113495bSYour Name 	req->top_k_num_of_channels = pno_def->top_k_num_of_channels;
356*5113495bSYour Name 	req->stationary_thresh = pno_def->stationary_thresh;
357*5113495bSYour Name 	req->channel_prediction_full_scan =
358*5113495bSYour Name 			pno_def->channel_prediction_full_scan;
359*5113495bSYour Name 	req->mawc_params.vdev_id = wlan_vdev_get_id(vdev);
360*5113495bSYour Name 	qdf_mem_copy(&req->mawc_params, &pno_def->mawc_params,
361*5113495bSYour Name 			sizeof(req->mawc_params));
362*5113495bSYour Name 
363*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
364*5113495bSYour Name }
365*5113495bSYour Name 
366*5113495bSYour Name QDF_STATUS
ucfg_scan_register_pno_cb(struct wlan_objmgr_psoc * psoc,scan_event_handler event_cb,void * arg)367*5113495bSYour Name ucfg_scan_register_pno_cb(struct wlan_objmgr_psoc *psoc,
368*5113495bSYour Name 	scan_event_handler event_cb, void *arg)
369*5113495bSYour Name {
370*5113495bSYour Name 	struct wlan_scan_obj *scan;
371*5113495bSYour Name 
372*5113495bSYour Name 	if (!psoc) {
373*5113495bSYour Name 		scm_err("null psoc");
374*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
375*5113495bSYour Name 	}
376*5113495bSYour Name 
377*5113495bSYour Name 	scan = wlan_psoc_get_scan_obj(psoc);
378*5113495bSYour Name 	if (!scan) {
379*5113495bSYour Name 		scm_err("scan object null");
380*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
381*5113495bSYour Name 	}
382*5113495bSYour Name 
383*5113495bSYour Name 	qdf_spin_lock_bh(&scan->lock);
384*5113495bSYour Name 	scan->pno_cfg.pno_cb.func = event_cb;
385*5113495bSYour Name 	scan->pno_cfg.pno_cb.arg = arg;
386*5113495bSYour Name 	qdf_spin_unlock_bh(&scan->lock);
387*5113495bSYour Name 	scm_debug("event_cb: 0x%pK, arg: 0x%pK", event_cb, arg);
388*5113495bSYour Name 
389*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
390*5113495bSYour Name }
391*5113495bSYour Name 
392*5113495bSYour Name #else
393*5113495bSYour Name 
394*5113495bSYour Name static inline QDF_STATUS
wlan_pno_global_init(struct wlan_objmgr_psoc * psoc,struct wlan_scan_obj * scan_obj)395*5113495bSYour Name wlan_pno_global_init(struct wlan_objmgr_psoc *psoc,
396*5113495bSYour Name 		     struct wlan_scan_obj *scan_obj)
397*5113495bSYour Name {
398*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
399*5113495bSYour Name }
400*5113495bSYour Name 
401*5113495bSYour Name static inline QDF_STATUS
wlan_pno_global_deinit(struct wlan_scan_obj * scan_obj)402*5113495bSYour Name wlan_pno_global_deinit(struct wlan_scan_obj *scan_obj)
403*5113495bSYour Name {
404*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
405*5113495bSYour Name }
406*5113495bSYour Name 
407*5113495bSYour Name #endif
408*5113495bSYour Name 
409*5113495bSYour Name QDF_STATUS
ucfg_scan_set_custom_scan_chan_list(struct wlan_objmgr_pdev * pdev,struct chan_list * chan_list)410*5113495bSYour Name ucfg_scan_set_custom_scan_chan_list(struct wlan_objmgr_pdev *pdev,
411*5113495bSYour Name 				    struct chan_list *chan_list)
412*5113495bSYour Name {
413*5113495bSYour Name 	uint8_t pdev_id;
414*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
415*5113495bSYour Name 
416*5113495bSYour Name 	if (!pdev || !chan_list) {
417*5113495bSYour Name 		scm_warn("pdev: 0x%pK, chan_list: 0x%pK", pdev, chan_list);
418*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
419*5113495bSYour Name 	}
420*5113495bSYour Name 	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
421*5113495bSYour Name 	scan_obj = wlan_pdev_get_scan_obj(pdev);
422*5113495bSYour Name 
423*5113495bSYour Name 	qdf_mem_copy(&scan_obj->pdev_info[pdev_id].custom_chan_list,
424*5113495bSYour Name 			chan_list, sizeof(*chan_list));
425*5113495bSYour Name 
426*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
427*5113495bSYour Name }
428*5113495bSYour Name 
429*5113495bSYour Name QDF_STATUS
ucfg_scm_scan_free_scan_request_mem(struct scan_start_request * req)430*5113495bSYour Name ucfg_scm_scan_free_scan_request_mem(struct scan_start_request *req)
431*5113495bSYour Name {
432*5113495bSYour Name 	return scm_scan_free_scan_request_mem(req);
433*5113495bSYour Name }
434*5113495bSYour Name 
ucfg_scan_psoc_set_enable(struct wlan_objmgr_psoc * psoc,enum scan_disable_reason reason)435*5113495bSYour Name QDF_STATUS ucfg_scan_psoc_set_enable(struct wlan_objmgr_psoc *psoc,
436*5113495bSYour Name 				     enum scan_disable_reason reason)
437*5113495bSYour Name {
438*5113495bSYour Name 	return wlan_scan_psoc_set_enable(psoc, reason);
439*5113495bSYour Name }
440*5113495bSYour Name 
ucfg_scan_psoc_set_disable(struct wlan_objmgr_psoc * psoc,enum scan_disable_reason reason)441*5113495bSYour Name QDF_STATUS ucfg_scan_psoc_set_disable(struct wlan_objmgr_psoc *psoc,
442*5113495bSYour Name 				      enum scan_disable_reason reason)
443*5113495bSYour Name {
444*5113495bSYour Name 	return wlan_scan_psoc_set_disable(psoc, reason);
445*5113495bSYour Name }
446*5113495bSYour Name 
447*5113495bSYour Name 
ucfg_scan_vdev_set_enable(struct wlan_objmgr_vdev * vdev,enum scan_disable_reason reason)448*5113495bSYour Name QDF_STATUS ucfg_scan_vdev_set_enable(struct wlan_objmgr_vdev *vdev,
449*5113495bSYour Name 				     enum scan_disable_reason reason)
450*5113495bSYour Name {
451*5113495bSYour Name 	struct scan_vdev_obj *scan_vdev_obj;
452*5113495bSYour Name 
453*5113495bSYour Name 	scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
454*5113495bSYour Name 	if (!scan_vdev_obj) {
455*5113495bSYour Name 		scm_err("null scan_vdev_obj");
456*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
457*5113495bSYour Name 	}
458*5113495bSYour Name 
459*5113495bSYour Name 	scan_vdev_obj->scan_disabled &= ~reason;
460*5113495bSYour Name 
461*5113495bSYour Name 	scm_debug("Vdev scan_disabled %x", scan_vdev_obj->scan_disabled);
462*5113495bSYour Name 
463*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
464*5113495bSYour Name }
465*5113495bSYour Name 
ucfg_scan_vdev_set_disable(struct wlan_objmgr_vdev * vdev,enum scan_disable_reason reason)466*5113495bSYour Name QDF_STATUS ucfg_scan_vdev_set_disable(struct wlan_objmgr_vdev *vdev,
467*5113495bSYour Name 				      enum scan_disable_reason reason)
468*5113495bSYour Name {
469*5113495bSYour Name 	struct scan_vdev_obj *scan_vdev_obj;
470*5113495bSYour Name 
471*5113495bSYour Name 	scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
472*5113495bSYour Name 	if (!scan_vdev_obj) {
473*5113495bSYour Name 		scm_err("null scan_vdev_obj");
474*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
475*5113495bSYour Name 	}
476*5113495bSYour Name 
477*5113495bSYour Name 	scan_vdev_obj->scan_disabled |= reason;
478*5113495bSYour Name 
479*5113495bSYour Name 	scm_debug("Vdev scan_disabled %x", scan_vdev_obj->scan_disabled);
480*5113495bSYour Name 
481*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
482*5113495bSYour Name }
483*5113495bSYour Name 
484*5113495bSYour Name 
ucfg_scan_set_miracast(struct wlan_objmgr_psoc * psoc,bool enable)485*5113495bSYour Name QDF_STATUS ucfg_scan_set_miracast(
486*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc, bool enable)
487*5113495bSYour Name {
488*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
489*5113495bSYour Name 
490*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
491*5113495bSYour Name 	if (!scan_obj) {
492*5113495bSYour Name 		scm_err("Failed to get scan object");
493*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
494*5113495bSYour Name 	}
495*5113495bSYour Name 	scan_obj->miracast_enabled = enable;
496*5113495bSYour Name 	scm_debug("set miracast_enable to %d", scan_obj->miracast_enabled);
497*5113495bSYour Name 
498*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
499*5113495bSYour Name }
500*5113495bSYour Name 
501*5113495bSYour Name QDF_STATUS
ucfg_scan_set_wide_band_scan(struct wlan_objmgr_pdev * pdev,bool enable)502*5113495bSYour Name ucfg_scan_set_wide_band_scan(struct wlan_objmgr_pdev *pdev, bool enable)
503*5113495bSYour Name {
504*5113495bSYour Name 	uint8_t pdev_id;
505*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
506*5113495bSYour Name 
507*5113495bSYour Name 	if (!pdev) {
508*5113495bSYour Name 		scm_warn("null vdev");
509*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
510*5113495bSYour Name 	}
511*5113495bSYour Name 	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
512*5113495bSYour Name 	scan_obj = wlan_pdev_get_scan_obj(pdev);
513*5113495bSYour Name 	if (!scan_obj)
514*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
515*5113495bSYour Name 
516*5113495bSYour Name 	scm_debug("set wide_band_scan to %d", enable);
517*5113495bSYour Name 	scan_obj->pdev_info[pdev_id].wide_band_scan = enable;
518*5113495bSYour Name 
519*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
520*5113495bSYour Name }
521*5113495bSYour Name 
ucfg_scan_get_wide_band_scan(struct wlan_objmgr_pdev * pdev)522*5113495bSYour Name bool ucfg_scan_get_wide_band_scan(struct wlan_objmgr_pdev *pdev)
523*5113495bSYour Name {
524*5113495bSYour Name 	uint8_t pdev_id;
525*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
526*5113495bSYour Name 
527*5113495bSYour Name 	if (!pdev) {
528*5113495bSYour Name 		scm_warn("null vdev");
529*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
530*5113495bSYour Name 	}
531*5113495bSYour Name 	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
532*5113495bSYour Name 	scan_obj = wlan_pdev_get_scan_obj(pdev);
533*5113495bSYour Name 	if (!scan_obj)
534*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
535*5113495bSYour Name 
536*5113495bSYour Name 	return scan_obj->pdev_info[pdev_id].wide_band_scan;
537*5113495bSYour Name }
538*5113495bSYour Name 
539*5113495bSYour Name #ifdef WLAN_DFS_CHAN_HIDDEN_SSID
540*5113495bSYour Name QDF_STATUS
ucfg_scan_config_hidden_ssid_for_bssid(struct wlan_objmgr_pdev * pdev,uint8_t * bssid,struct wlan_ssid * ssid)541*5113495bSYour Name ucfg_scan_config_hidden_ssid_for_bssid(struct wlan_objmgr_pdev *pdev,
542*5113495bSYour Name 				       uint8_t *bssid, struct wlan_ssid *ssid)
543*5113495bSYour Name {
544*5113495bSYour Name 	uint8_t pdev_id;
545*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
546*5113495bSYour Name 
547*5113495bSYour Name 	if (!pdev) {
548*5113495bSYour Name 		scm_warn("null vdev");
549*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
550*5113495bSYour Name 	}
551*5113495bSYour Name 	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
552*5113495bSYour Name 	scan_obj = wlan_pdev_get_scan_obj(pdev);
553*5113495bSYour Name 	if (!scan_obj)
554*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
555*5113495bSYour Name 
556*5113495bSYour Name 	scm_debug("Configure bsssid:" QDF_MAC_ADDR_FMT " ssid:" QDF_SSID_FMT,
557*5113495bSYour Name 		  QDF_MAC_ADDR_REF(bssid),
558*5113495bSYour Name 		  QDF_SSID_REF(ssid->length, ssid->ssid));
559*5113495bSYour Name 	qdf_mem_copy(scan_obj->pdev_info[pdev_id].conf_bssid,
560*5113495bSYour Name 		     bssid, QDF_MAC_ADDR_SIZE);
561*5113495bSYour Name 	scan_obj->pdev_info[pdev_id].conf_ssid.length = ssid->length;
562*5113495bSYour Name 	qdf_mem_copy(scan_obj->pdev_info[pdev_id].conf_ssid.ssid,
563*5113495bSYour Name 		     ssid->ssid,
564*5113495bSYour Name 		     scan_obj->pdev_info[pdev_id].conf_ssid.length);
565*5113495bSYour Name 
566*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
567*5113495bSYour Name }
568*5113495bSYour Name #endif /* WLAN_DFS_CHAN_HIDDEN_SSID */
569*5113495bSYour Name 
570*5113495bSYour Name QDF_STATUS
ucfg_scan_cancel_sync(struct scan_cancel_request * req)571*5113495bSYour Name ucfg_scan_cancel_sync(struct scan_cancel_request *req)
572*5113495bSYour Name {
573*5113495bSYour Name 	QDF_STATUS status;
574*5113495bSYour Name 	bool cancel_vdev = false, cancel_pdev = false;
575*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
576*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
577*5113495bSYour Name 	uint32_t max_wait_iterations = SCM_CANCEL_SCAN_WAIT_ITERATION;
578*5113495bSYour Name 
579*5113495bSYour Name 	if (!req || !req->vdev) {
580*5113495bSYour Name 		scm_err("req or vdev within req is NULL");
581*5113495bSYour Name 		if (req)
582*5113495bSYour Name 			qdf_mem_free(req);
583*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
584*5113495bSYour Name 	}
585*5113495bSYour Name 
586*5113495bSYour Name 	if (req->cancel_req.req_type == WLAN_SCAN_CANCEL_PDEV_ALL)
587*5113495bSYour Name 		cancel_pdev = true;
588*5113495bSYour Name 	else if (req->cancel_req.req_type == WLAN_SCAN_CANCEL_VDEV_ALL ||
589*5113495bSYour Name 		 req->cancel_req.req_type == WLAN_SCAN_CANCEL_HOST_VDEV_ALL)
590*5113495bSYour Name 		cancel_vdev = true;
591*5113495bSYour Name 
592*5113495bSYour Name 	vdev = req->vdev;
593*5113495bSYour Name 	status = wlan_scan_cancel(req);
594*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
595*5113495bSYour Name 		return status;
596*5113495bSYour Name 
597*5113495bSYour Name 	if (cancel_pdev) {
598*5113495bSYour Name 		pdev = wlan_vdev_get_pdev(vdev);
599*5113495bSYour Name 		while ((wlan_get_pdev_status(pdev) !=
600*5113495bSYour Name 		     SCAN_NOT_IN_PROGRESS) && max_wait_iterations) {
601*5113495bSYour Name 			scm_debug("wait for all pdev scan to get complete");
602*5113495bSYour Name 			qdf_sleep(SCM_CANCEL_SCAN_WAIT_TIME);
603*5113495bSYour Name 			max_wait_iterations--;
604*5113495bSYour Name 		}
605*5113495bSYour Name 	} else if (cancel_vdev) {
606*5113495bSYour Name 		while ((wlan_get_vdev_status(vdev) !=
607*5113495bSYour Name 		     SCAN_NOT_IN_PROGRESS) && max_wait_iterations) {
608*5113495bSYour Name 			scm_debug("wait for all vdev scan to get complete");
609*5113495bSYour Name 			qdf_sleep(SCM_CANCEL_SCAN_WAIT_TIME);
610*5113495bSYour Name 			max_wait_iterations--;
611*5113495bSYour Name 		}
612*5113495bSYour Name 	}
613*5113495bSYour Name 
614*5113495bSYour Name 	if (!max_wait_iterations) {
615*5113495bSYour Name 		scm_err("Failed to wait for scans to get complete");
616*5113495bSYour Name 		return QDF_STATUS_E_TIMEOUT;
617*5113495bSYour Name 	}
618*5113495bSYour Name 
619*5113495bSYour Name 	return status;
620*5113495bSYour Name }
621*5113495bSYour Name 
622*5113495bSYour Name uint8_t*
ucfg_get_scan_requester_name(struct wlan_objmgr_psoc * psoc,wlan_scan_requester requester)623*5113495bSYour Name ucfg_get_scan_requester_name(struct wlan_objmgr_psoc *psoc,
624*5113495bSYour Name 	wlan_scan_requester requester)
625*5113495bSYour Name {
626*5113495bSYour Name 	int idx = requester & WLAN_SCAN_REQUESTER_ID_MASK;
627*5113495bSYour Name 	struct wlan_scan_obj *scan;
628*5113495bSYour Name 	struct scan_requester_info *requesters;
629*5113495bSYour Name 
630*5113495bSYour Name 	if (!psoc) {
631*5113495bSYour Name 		scm_err("null psoc");
632*5113495bSYour Name 		return "null";
633*5113495bSYour Name 	}
634*5113495bSYour Name 	scan = wlan_psoc_get_scan_obj(psoc);
635*5113495bSYour Name 	if (!scan)
636*5113495bSYour Name 		return "null";
637*5113495bSYour Name 
638*5113495bSYour Name 	requesters = scan->requesters;
639*5113495bSYour Name 
640*5113495bSYour Name 	if ((idx < WLAN_MAX_REQUESTORS) &&
641*5113495bSYour Name 		(requesters[idx].requester == requester)) {
642*5113495bSYour Name 		return requesters[idx].module;
643*5113495bSYour Name 	}
644*5113495bSYour Name 
645*5113495bSYour Name 	return (uint8_t *)"unknown";
646*5113495bSYour Name }
647*5113495bSYour Name 
648*5113495bSYour Name static QDF_STATUS
scm_add_scan_event_handler(struct pdev_scan_ev_handler * pdev_ev_handler,scan_event_handler event_cb,void * arg)649*5113495bSYour Name scm_add_scan_event_handler(struct pdev_scan_ev_handler *pdev_ev_handler,
650*5113495bSYour Name 	scan_event_handler event_cb, void *arg)
651*5113495bSYour Name {
652*5113495bSYour Name 	struct cb_handler *cb_handler;
653*5113495bSYour Name 	uint32_t handler_cnt = pdev_ev_handler->handler_cnt;
654*5113495bSYour Name 
655*5113495bSYour Name 	/* Assign next available slot to this registration request */
656*5113495bSYour Name 	cb_handler = &(pdev_ev_handler->cb_handlers[handler_cnt]);
657*5113495bSYour Name 	cb_handler->func = event_cb;
658*5113495bSYour Name 	cb_handler->arg = arg;
659*5113495bSYour Name 	pdev_ev_handler->handler_cnt++;
660*5113495bSYour Name 
661*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
662*5113495bSYour Name }
663*5113495bSYour Name 
664*5113495bSYour Name QDF_STATUS
ucfg_scan_register_event_handler(struct wlan_objmgr_pdev * pdev,scan_event_handler event_cb,void * arg)665*5113495bSYour Name ucfg_scan_register_event_handler(struct wlan_objmgr_pdev *pdev,
666*5113495bSYour Name 	scan_event_handler event_cb, void *arg)
667*5113495bSYour Name {
668*5113495bSYour Name 	uint32_t idx;
669*5113495bSYour Name 	struct wlan_scan_obj *scan;
670*5113495bSYour Name 	struct pdev_scan_ev_handler *pdev_ev_handler;
671*5113495bSYour Name 	struct cb_handler *cb_handler;
672*5113495bSYour Name 
673*5113495bSYour Name 	/* scan event handler call back can't be NULL */
674*5113495bSYour Name 	if (!pdev || !event_cb) {
675*5113495bSYour Name 		scm_err("pdev: %pK, event_cb: %pK", pdev, event_cb);
676*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
677*5113495bSYour Name 	}
678*5113495bSYour Name 
679*5113495bSYour Name 	scm_debug("pdev: %pK, event_cb: %pK, arg: %pK\n", pdev, event_cb, arg);
680*5113495bSYour Name 
681*5113495bSYour Name 	scan = wlan_pdev_get_scan_obj(pdev);
682*5113495bSYour Name 	pdev_ev_handler = wlan_pdev_get_pdev_scan_ev_handlers(pdev);
683*5113495bSYour Name 	if (!pdev_ev_handler) {
684*5113495bSYour Name 		scm_err("null pdev_ev_handler");
685*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
686*5113495bSYour Name 	}
687*5113495bSYour Name 	cb_handler = &(pdev_ev_handler->cb_handlers[0]);
688*5113495bSYour Name 
689*5113495bSYour Name 	qdf_spin_lock_bh(&scan->lock);
690*5113495bSYour Name 	/* Ensure its not a duplicate registration request */
691*5113495bSYour Name 	for (idx = 0; idx < MAX_SCAN_EVENT_HANDLERS_PER_PDEV;
692*5113495bSYour Name 		idx++, cb_handler++) {
693*5113495bSYour Name 		if ((cb_handler->func == event_cb) &&
694*5113495bSYour Name 			(cb_handler->arg == arg)) {
695*5113495bSYour Name 			qdf_spin_unlock_bh(&scan->lock);
696*5113495bSYour Name 			scm_debug("func: %pK, arg: %pK already exists",
697*5113495bSYour Name 				  event_cb, arg);
698*5113495bSYour Name 			return QDF_STATUS_SUCCESS;
699*5113495bSYour Name 		}
700*5113495bSYour Name 	}
701*5113495bSYour Name 
702*5113495bSYour Name 	QDF_ASSERT(pdev_ev_handler->handler_cnt <
703*5113495bSYour Name 			MAX_SCAN_EVENT_HANDLERS_PER_PDEV);
704*5113495bSYour Name 
705*5113495bSYour Name 	if (pdev_ev_handler->handler_cnt >= MAX_SCAN_EVENT_HANDLERS_PER_PDEV) {
706*5113495bSYour Name 		qdf_spin_unlock_bh(&scan->lock);
707*5113495bSYour Name 		scm_warn("No more registrations possible");
708*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
709*5113495bSYour Name 	}
710*5113495bSYour Name 
711*5113495bSYour Name 	scm_add_scan_event_handler(pdev_ev_handler, event_cb, arg);
712*5113495bSYour Name 	qdf_spin_unlock_bh(&scan->lock);
713*5113495bSYour Name 
714*5113495bSYour Name 	scm_debug("event_cb: 0x%pK, arg: 0x%pK", event_cb, arg);
715*5113495bSYour Name 
716*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
717*5113495bSYour Name }
718*5113495bSYour Name 
719*5113495bSYour Name static QDF_STATUS
wlan_scan_global_init(struct wlan_objmgr_psoc * psoc,struct wlan_scan_obj * scan_obj)720*5113495bSYour Name wlan_scan_global_init(struct wlan_objmgr_psoc *psoc,
721*5113495bSYour Name 		      struct wlan_scan_obj *scan_obj)
722*5113495bSYour Name {
723*5113495bSYour Name 	scan_obj->scan_disabled = 0;
724*5113495bSYour Name 	scan_obj->drop_bcn_on_chan_mismatch =
725*5113495bSYour Name 			 cfg_get(psoc, CFG_DROP_BCN_ON_CHANNEL_MISMATCH);
726*5113495bSYour Name 	scan_obj->drop_bcn_on_invalid_freq =
727*5113495bSYour Name 			 cfg_get(psoc, CFG_DROP_BCN_ON_INVALID_FREQ);
728*5113495bSYour Name 	scan_obj->disable_timeout = false;
729*5113495bSYour Name 	scan_obj->obss_scan_offload = false;
730*5113495bSYour Name 	scan_obj->scan_def.active_dwell =
731*5113495bSYour Name 			 cfg_get(psoc, CFG_ACTIVE_MAX_CHANNEL_TIME);
732*5113495bSYour Name 	/* the ini is disallow DFS channel scan if ini is 1, so negate that */
733*5113495bSYour Name 	scan_obj->scan_def.allow_dfs_chan_in_first_scan =
734*5113495bSYour Name 				!cfg_get(psoc, CFG_INITIAL_NO_DFS_SCAN);
735*5113495bSYour Name 	scan_obj->scan_def.allow_dfs_chan_in_scan =
736*5113495bSYour Name 				cfg_get(psoc, CFG_ENABLE_DFS_SCAN);
737*5113495bSYour Name 	scan_obj->scan_def.skip_dfs_chan_in_p2p_search =
738*5113495bSYour Name 				cfg_get(psoc, CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH);
739*5113495bSYour Name 	scan_obj->scan_def.use_wake_lock_in_user_scan =
740*5113495bSYour Name 				cfg_get(psoc, CFG_ENABLE_WAKE_LOCK_IN_SCAN);
741*5113495bSYour Name 	scan_obj->scan_def.active_dwell_2g =
742*5113495bSYour Name 			 cfg_get(psoc, CFG_ACTIVE_MAX_2G_CHANNEL_TIME);
743*5113495bSYour Name 	scan_obj->scan_def.min_dwell_time_6g =
744*5113495bSYour Name 			cfg_get(psoc, CFG_MIN_6G_CHANNEL_TIME);
745*5113495bSYour Name 	scan_obj->scan_def.active_dwell_6g =
746*5113495bSYour Name 			 cfg_get(psoc, CFG_ACTIVE_MAX_6G_CHANNEL_TIME);
747*5113495bSYour Name 	scan_obj->scan_def.passive_dwell_6g =
748*5113495bSYour Name 			 cfg_get(psoc, CFG_PASSIVE_MAX_6G_CHANNEL_TIME);
749*5113495bSYour Name 	scan_obj->scan_def.active_dwell_time_6g_conc =
750*5113495bSYour Name 			 cfg_get(psoc, CFG_ACTIVE_MAX_6G_CHANNEL_TIME_CONC);
751*5113495bSYour Name 	scan_obj->scan_def.passive_dwell_time_6g_conc =
752*5113495bSYour Name 			 cfg_get(psoc, CFG_PASSIVE_MAX_6G_CHANNEL_TIME_CONC);
753*5113495bSYour Name 	scan_obj->scan_def.passive_dwell =
754*5113495bSYour Name 			 cfg_get(psoc, CFG_PASSIVE_MAX_CHANNEL_TIME);
755*5113495bSYour Name 	scan_obj->scan_def.max_rest_time = SCAN_MAX_REST_TIME;
756*5113495bSYour Name 	scan_obj->scan_def.sta_miracast_mcc_rest_time =
757*5113495bSYour Name 					SCAN_STA_MIRACAST_MCC_REST_TIME;
758*5113495bSYour Name 	scan_obj->scan_def.min_rest_time = SCAN_MIN_REST_TIME;
759*5113495bSYour Name 	scan_obj->scan_def.conc_active_dwell =
760*5113495bSYour Name 			cfg_get(psoc, CFG_ACTIVE_MAX_CHANNEL_TIME_CONC);
761*5113495bSYour Name 	scan_obj->scan_def.conc_passive_dwell =
762*5113495bSYour Name 			cfg_get(psoc, CFG_PASSIVE_MAX_CHANNEL_TIME_CONC);
763*5113495bSYour Name 	scan_obj->scan_def.conc_max_rest_time =
764*5113495bSYour Name 			cfg_get(psoc, CFG_MAX_REST_TIME_CONC);
765*5113495bSYour Name 	scan_obj->scan_def.conc_min_rest_time =
766*5113495bSYour Name 			cfg_get(psoc, CFG_MIN_REST_TIME_CONC);
767*5113495bSYour Name 	scan_obj->scan_def.conc_idle_time =
768*5113495bSYour Name 			cfg_get(psoc, CFG_IDLE_TIME_CONC);
769*5113495bSYour Name 	scan_obj->scan_def.conc_chlist_trim =
770*5113495bSYour Name 			cfg_get(psoc, CFG_CHAN_LIST_TRIM_CONC);
771*5113495bSYour Name 	scan_obj->scan_def.repeat_probe_time =
772*5113495bSYour Name 			cfg_get(psoc, CFG_SCAN_PROBE_REPEAT_TIME);
773*5113495bSYour Name 	scan_obj->scan_def.probe_spacing_time = SCAN_PROBE_SPACING_TIME;
774*5113495bSYour Name 	scan_obj->scan_def.probe_delay = SCAN_PROBE_DELAY;
775*5113495bSYour Name 	scan_obj->scan_def.burst_duration = SCAN_BURST_DURATION;
776*5113495bSYour Name 	scan_obj->scan_def.max_scan_time = SCAN_MAX_SCAN_TIME;
777*5113495bSYour Name 	scan_obj->scan_def.num_probes = cfg_get(psoc, CFG_SCAN_NUM_PROBES);
778*5113495bSYour Name 	scan_obj->scan_def.scan_cache_aging_time =
779*5113495bSYour Name 			(cfg_get(psoc, CFG_SCAN_AGING_TIME) * 1000);
780*5113495bSYour Name 	scan_obj->scan_def.max_bss_per_pdev = SCAN_MAX_BSS_PDEV;
781*5113495bSYour Name 	scan_obj->scan_def.scan_priority = SCAN_PRIORITY;
782*5113495bSYour Name 	scan_obj->scan_def.idle_time = SCAN_NETWORK_IDLE_TIMEOUT;
783*5113495bSYour Name 	scan_obj->scan_def.adaptive_dwell_time_mode =
784*5113495bSYour Name 			cfg_get(psoc, CFG_ADAPTIVE_SCAN_DWELL_MODE);
785*5113495bSYour Name 	scan_obj->scan_def.adaptive_dwell_time_mode_nc =
786*5113495bSYour Name 			cfg_get(psoc, CFG_ADAPTIVE_SCAN_DWELL_MODE_NC);
787*5113495bSYour Name 	scan_obj->scan_def.honour_nl_scan_policy_flags =
788*5113495bSYour Name 			cfg_get(psoc, CFG_HONOUR_NL_SCAN_POLICY_FLAGS);
789*5113495bSYour Name 	scan_obj->scan_def.enable_mac_spoofing =
790*5113495bSYour Name 			cfg_get(psoc, CFG_ENABLE_MAC_ADDR_SPOOFING);
791*5113495bSYour Name 	scan_obj->scan_def.extscan_adaptive_dwell_mode =
792*5113495bSYour Name 			cfg_get(psoc, CFG_ADAPTIVE_EXTSCAN_DWELL_MODE);
793*5113495bSYour Name 
794*5113495bSYour Name 	/* init burst durations */
795*5113495bSYour Name 	scan_obj->scan_def.sta_scan_burst_duration =
796*5113495bSYour Name 				cfg_get(psoc, CFG_STA_SCAN_BURST_DURATION);
797*5113495bSYour Name 	scan_obj->scan_def.p2p_scan_burst_duration =
798*5113495bSYour Name 				cfg_get(psoc, CFG_P2P_SCAN_BURST_DURATION);
799*5113495bSYour Name 	scan_obj->scan_def.go_scan_burst_duration =
800*5113495bSYour Name 				cfg_get(psoc, CFG_GO_SCAN_BURST_DURATION);
801*5113495bSYour Name 	scan_obj->scan_def.ap_scan_burst_duration =
802*5113495bSYour Name 				cfg_get(psoc, CFG_AP_SCAN_BURST_DURATION);
803*5113495bSYour Name 	/* scan control flags */
804*5113495bSYour Name 	scan_obj->scan_def.scan_f_passive = true;
805*5113495bSYour Name 	scan_obj->scan_def.scan_f_ofdm_rates = true;
806*5113495bSYour Name 	scan_obj->scan_def.scan_f_2ghz = true;
807*5113495bSYour Name 	scan_obj->scan_def.scan_f_5ghz = true;
808*5113495bSYour Name 	scan_obj->scan_def.scan_f_chan_stat_evnt =
809*5113495bSYour Name 				cfg_get(psoc, CFG_ENABLE_SNR_MONITORING);
810*5113495bSYour Name 	/* scan event flags */
811*5113495bSYour Name 	scan_obj->scan_def.scan_ev_started = true;
812*5113495bSYour Name 	scan_obj->scan_def.scan_ev_completed = true;
813*5113495bSYour Name 	scan_obj->scan_def.scan_ev_bss_chan = true;
814*5113495bSYour Name 	scan_obj->scan_def.scan_ev_foreign_chan = true;
815*5113495bSYour Name 	scan_obj->scan_def.scan_ev_foreign_chn_exit = true;
816*5113495bSYour Name 	scan_obj->scan_def.scan_ev_dequeued = true;
817*5113495bSYour Name 	scan_obj->scan_def.scan_ev_preempted = true;
818*5113495bSYour Name 	scan_obj->scan_def.scan_ev_start_failed = true;
819*5113495bSYour Name 	scan_obj->scan_def.scan_ev_restarted = true;
820*5113495bSYour Name 	scan_obj->scan_def.enable_connected_scan =
821*5113495bSYour Name 		cfg_get(psoc, CFG_ENABLE_CONNECTED_SCAN);
822*5113495bSYour Name 	scan_obj->scan_def.scan_mode_6g = cfg_get(psoc, CFG_6GHZ_SCAN_MODE);
823*5113495bSYour Name 	scan_obj->scan_def.duty_cycle_6ghz =
824*5113495bSYour Name 		cfg_get(psoc, CFG_6GHZ_SCAN_MODE_DUTY_CYCLE);
825*5113495bSYour Name 	scan_obj->allow_bss_with_incomplete_ie =
826*5113495bSYour Name 		cfg_get(psoc, CFG_SCAN_ALLOW_BSS_WITH_CORRUPTED_IE);
827*5113495bSYour Name 
828*5113495bSYour Name 	scan_obj->scan_def.skip_6g_and_indoor_freq =
829*5113495bSYour Name 		cfg_get(psoc, CFG_SKIP_6GHZ_AND_INDOOR_FREQ_SCAN);
830*5113495bSYour Name 	scan_obj->scan_def.last_scan_ageout_time =
831*5113495bSYour Name 		cfg_get(psoc, CFG_LAST_SCAN_AGEOUT_TIME);
832*5113495bSYour Name 	scan_obj->aux_mac_support = false;
833*5113495bSYour Name 
834*5113495bSYour Name 	/* init scan id seed */
835*5113495bSYour Name 	qdf_atomic_init(&scan_obj->scan_ids);
836*5113495bSYour Name 
837*5113495bSYour Name 	/* init extscan */
838*5113495bSYour Name 	wlan_extscan_global_init(psoc, scan_obj);
839*5113495bSYour Name 
840*5113495bSYour Name 	return wlan_pno_global_init(psoc, scan_obj);
841*5113495bSYour Name }
842*5113495bSYour Name 
843*5113495bSYour Name static void
wlan_scan_global_deinit(struct wlan_objmgr_psoc * psoc)844*5113495bSYour Name wlan_scan_global_deinit(struct wlan_objmgr_psoc *psoc)
845*5113495bSYour Name {
846*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
847*5113495bSYour Name 
848*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
849*5113495bSYour Name 	wlan_pno_global_deinit(scan_obj);
850*5113495bSYour Name 	wlan_extscan_global_deinit();
851*5113495bSYour Name }
852*5113495bSYour Name 
853*5113495bSYour Name static QDF_STATUS
scm_remove_scan_event_handler(struct pdev_scan_ev_handler * pdev_ev_handler,struct cb_handler * entry)854*5113495bSYour Name scm_remove_scan_event_handler(struct pdev_scan_ev_handler *pdev_ev_handler,
855*5113495bSYour Name 	struct cb_handler *entry)
856*5113495bSYour Name {
857*5113495bSYour Name 	struct cb_handler *last_entry;
858*5113495bSYour Name 	uint32_t handler_cnt = pdev_ev_handler->handler_cnt;
859*5113495bSYour Name 
860*5113495bSYour Name 	/* Replace event handler being deleted
861*5113495bSYour Name 	 * with the last one in the list.
862*5113495bSYour Name 	 */
863*5113495bSYour Name 	last_entry = &(pdev_ev_handler->cb_handlers[handler_cnt - 1]);
864*5113495bSYour Name 	entry->func = last_entry->func;
865*5113495bSYour Name 	entry->arg = last_entry->arg;
866*5113495bSYour Name 
867*5113495bSYour Name 	/* Clear our last entry */
868*5113495bSYour Name 	last_entry->func = NULL;
869*5113495bSYour Name 	last_entry->arg = NULL;
870*5113495bSYour Name 	pdev_ev_handler->handler_cnt--;
871*5113495bSYour Name 
872*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
873*5113495bSYour Name }
874*5113495bSYour Name 
875*5113495bSYour Name void
ucfg_scan_unregister_event_handler(struct wlan_objmgr_pdev * pdev,scan_event_handler event_cb,void * arg)876*5113495bSYour Name ucfg_scan_unregister_event_handler(struct wlan_objmgr_pdev *pdev,
877*5113495bSYour Name 	scan_event_handler event_cb, void *arg)
878*5113495bSYour Name {
879*5113495bSYour Name 	uint8_t found = false;
880*5113495bSYour Name 	uint32_t idx;
881*5113495bSYour Name 	uint32_t handler_cnt;
882*5113495bSYour Name 	struct wlan_scan_obj *scan;
883*5113495bSYour Name 	struct cb_handler *cb_handler;
884*5113495bSYour Name 	struct pdev_scan_ev_handler *pdev_ev_handler;
885*5113495bSYour Name 
886*5113495bSYour Name 	scm_debug("pdev: %pK, event_cb: 0x%pK, arg: 0x%pK", pdev, event_cb,
887*5113495bSYour Name 		  arg);
888*5113495bSYour Name 	if (!pdev) {
889*5113495bSYour Name 		scm_err("null pdev");
890*5113495bSYour Name 		return;
891*5113495bSYour Name 	}
892*5113495bSYour Name 	scan = wlan_pdev_get_scan_obj(pdev);
893*5113495bSYour Name 	if (!scan)
894*5113495bSYour Name 		return;
895*5113495bSYour Name 
896*5113495bSYour Name 	pdev_ev_handler = wlan_pdev_get_pdev_scan_ev_handlers(pdev);
897*5113495bSYour Name 	if (!pdev_ev_handler)
898*5113495bSYour Name 		return;
899*5113495bSYour Name 
900*5113495bSYour Name 	cb_handler = &(pdev_ev_handler->cb_handlers[0]);
901*5113495bSYour Name 
902*5113495bSYour Name 	qdf_spin_lock_bh(&scan->lock);
903*5113495bSYour Name 	handler_cnt = pdev_ev_handler->handler_cnt;
904*5113495bSYour Name 	if (!handler_cnt) {
905*5113495bSYour Name 		qdf_spin_unlock_bh(&scan->lock);
906*5113495bSYour Name 		scm_info("No event handlers registered");
907*5113495bSYour Name 		return;
908*5113495bSYour Name 	}
909*5113495bSYour Name 
910*5113495bSYour Name 	for (idx = 0; idx < MAX_SCAN_EVENT_HANDLERS_PER_PDEV;
911*5113495bSYour Name 		idx++, cb_handler++) {
912*5113495bSYour Name 		if ((cb_handler->func == event_cb) &&
913*5113495bSYour Name 			(cb_handler->arg == arg)) {
914*5113495bSYour Name 			/* Event handler found, remove it
915*5113495bSYour Name 			 * from event handler list.
916*5113495bSYour Name 			 */
917*5113495bSYour Name 			found = true;
918*5113495bSYour Name 			scm_remove_scan_event_handler(pdev_ev_handler,
919*5113495bSYour Name 				cb_handler);
920*5113495bSYour Name 			handler_cnt--;
921*5113495bSYour Name 			break;
922*5113495bSYour Name 		}
923*5113495bSYour Name 	}
924*5113495bSYour Name 	qdf_spin_unlock_bh(&scan->lock);
925*5113495bSYour Name 
926*5113495bSYour Name 	scm_debug("event handler %s, remaining handlers: %d",
927*5113495bSYour Name 		  (found ? "removed" : "not found"), handler_cnt);
928*5113495bSYour Name }
929*5113495bSYour Name 
930*5113495bSYour Name QDF_STATUS
ucfg_scan_init_ssid_params(struct scan_start_request * req,uint32_t num_ssid,struct wlan_ssid * ssid_list)931*5113495bSYour Name ucfg_scan_init_ssid_params(struct scan_start_request *req,
932*5113495bSYour Name 		uint32_t num_ssid, struct wlan_ssid *ssid_list)
933*5113495bSYour Name {
934*5113495bSYour Name 	uint32_t max_ssid = sizeof(req->scan_req.ssid) /
935*5113495bSYour Name 				sizeof(req->scan_req.ssid[0]);
936*5113495bSYour Name 
937*5113495bSYour Name 	if (!req) {
938*5113495bSYour Name 		scm_err("null request");
939*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
940*5113495bSYour Name 	}
941*5113495bSYour Name 	if (!num_ssid) {
942*5113495bSYour Name 		/* empty channel list provided */
943*5113495bSYour Name 		req->scan_req.num_ssids = 0;
944*5113495bSYour Name 		qdf_mem_zero(&req->scan_req.ssid[0],
945*5113495bSYour Name 			sizeof(req->scan_req.ssid));
946*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
947*5113495bSYour Name 	}
948*5113495bSYour Name 	if (!ssid_list) {
949*5113495bSYour Name 		scm_err("null ssid_list while num_ssid: %d", num_ssid);
950*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
951*5113495bSYour Name 	}
952*5113495bSYour Name 	if (num_ssid > max_ssid) {
953*5113495bSYour Name 		/* got a big list. alert and continue */
954*5113495bSYour Name 		scm_warn("overflow: received %d, max supported : %d",
955*5113495bSYour Name 			num_ssid, max_ssid);
956*5113495bSYour Name 		return QDF_STATUS_E_E2BIG;
957*5113495bSYour Name 	}
958*5113495bSYour Name 
959*5113495bSYour Name 	if (max_ssid > num_ssid)
960*5113495bSYour Name 		max_ssid = num_ssid;
961*5113495bSYour Name 
962*5113495bSYour Name 	req->scan_req.num_ssids = max_ssid;
963*5113495bSYour Name 	qdf_mem_copy(&req->scan_req.ssid[0], ssid_list,
964*5113495bSYour Name 		(req->scan_req.num_ssids * sizeof(req->scan_req.ssid[0])));
965*5113495bSYour Name 
966*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
967*5113495bSYour Name }
968*5113495bSYour Name 
969*5113495bSYour Name QDF_STATUS
ucfg_scan_init_bssid_params(struct scan_start_request * req,uint32_t num_bssid,struct qdf_mac_addr * bssid_list)970*5113495bSYour Name ucfg_scan_init_bssid_params(struct scan_start_request *req,
971*5113495bSYour Name 		uint32_t num_bssid, struct qdf_mac_addr *bssid_list)
972*5113495bSYour Name {
973*5113495bSYour Name 	uint32_t max_bssid = sizeof(req->scan_req.bssid_list) /
974*5113495bSYour Name 				sizeof(req->scan_req.bssid_list[0]);
975*5113495bSYour Name 
976*5113495bSYour Name 	if (!req) {
977*5113495bSYour Name 		scm_err("null request");
978*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
979*5113495bSYour Name 	}
980*5113495bSYour Name 	if (!num_bssid) {
981*5113495bSYour Name 		/* empty channel list provided */
982*5113495bSYour Name 		req->scan_req.num_bssid = 0;
983*5113495bSYour Name 		qdf_mem_zero(&req->scan_req.bssid_list[0],
984*5113495bSYour Name 			sizeof(req->scan_req.bssid_list));
985*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
986*5113495bSYour Name 	}
987*5113495bSYour Name 	if (!bssid_list) {
988*5113495bSYour Name 		scm_err("null bssid_list while num_bssid: %d", num_bssid);
989*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
990*5113495bSYour Name 	}
991*5113495bSYour Name 	if (num_bssid > max_bssid) {
992*5113495bSYour Name 		/* got a big list. alert and continue */
993*5113495bSYour Name 		scm_warn("overflow: received %d, max supported : %d",
994*5113495bSYour Name 			num_bssid, max_bssid);
995*5113495bSYour Name 		return QDF_STATUS_E_E2BIG;
996*5113495bSYour Name 	}
997*5113495bSYour Name 
998*5113495bSYour Name 	if (max_bssid > num_bssid)
999*5113495bSYour Name 		max_bssid = num_bssid;
1000*5113495bSYour Name 
1001*5113495bSYour Name 	req->scan_req.num_bssid = max_bssid;
1002*5113495bSYour Name 	qdf_mem_copy(&req->scan_req.bssid_list[0], bssid_list,
1003*5113495bSYour Name 		req->scan_req.num_bssid * sizeof(req->scan_req.bssid_list[0]));
1004*5113495bSYour Name 
1005*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1006*5113495bSYour Name }
1007*5113495bSYour Name 
1008*5113495bSYour Name /**
1009*5113495bSYour Name  * is_chan_enabled_for_scan() - helper API to check if a frequency
1010*5113495bSYour Name  * is allowed to scan.
1011*5113495bSYour Name  * @pdev: pointer to pdev
1012*5113495bSYour Name  * @reg_chan: regulatory_channel object
1013*5113495bSYour Name  * @low_2g: lower 2.4 GHz frequency threshold
1014*5113495bSYour Name  * @high_2g: upper 2.4 GHz frequency threshold
1015*5113495bSYour Name  * @low_5g: lower 5 GHz frequency threshold
1016*5113495bSYour Name  * @high_5g: upper 5 GHz frequency threshold
1017*5113495bSYour Name  *
1018*5113495bSYour Name  * Return: true if scan is allowed. false otherwise.
1019*5113495bSYour Name  */
1020*5113495bSYour Name static bool
is_chan_enabled_for_scan(struct wlan_objmgr_pdev * pdev,struct regulatory_channel * reg_chan,qdf_freq_t low_2g,qdf_freq_t high_2g,qdf_freq_t low_5g,qdf_freq_t high_5g)1021*5113495bSYour Name is_chan_enabled_for_scan(struct wlan_objmgr_pdev *pdev,
1022*5113495bSYour Name 		struct regulatory_channel *reg_chan,
1023*5113495bSYour Name 		qdf_freq_t low_2g, qdf_freq_t high_2g, qdf_freq_t low_5g,
1024*5113495bSYour Name 		qdf_freq_t high_5g)
1025*5113495bSYour Name {
1026*5113495bSYour Name 	if (wlan_reg_is_disable_for_pwrmode(pdev,
1027*5113495bSYour Name 					    reg_chan->center_freq,
1028*5113495bSYour Name 					    REG_BEST_PWR_MODE))
1029*5113495bSYour Name 		return false;
1030*5113495bSYour Name 
1031*5113495bSYour Name 	if (reg_chan->nol_chan)
1032*5113495bSYour Name 		return false;
1033*5113495bSYour Name 
1034*5113495bSYour Name 	/* 2 GHz channel */
1035*5113495bSYour Name 	if ((util_scan_scm_freq_to_band(reg_chan->center_freq) ==
1036*5113495bSYour Name 			WLAN_BAND_2_4_GHZ) &&
1037*5113495bSYour Name 			((reg_chan->center_freq < low_2g) ||
1038*5113495bSYour Name 			(reg_chan->center_freq > high_2g)))
1039*5113495bSYour Name 		return false;
1040*5113495bSYour Name 	else if ((util_scan_scm_freq_to_band(reg_chan->center_freq) ==
1041*5113495bSYour Name 				WLAN_BAND_5_GHZ) &&
1042*5113495bSYour Name 		 ((reg_chan->center_freq < low_5g) ||
1043*5113495bSYour Name 		  (reg_chan->center_freq > high_5g)))
1044*5113495bSYour Name 		return false;
1045*5113495bSYour Name 
1046*5113495bSYour Name 	return true;
1047*5113495bSYour Name }
1048*5113495bSYour Name 
1049*5113495bSYour Name QDF_STATUS
ucfg_scan_init_chanlist_params(struct scan_start_request * req,uint32_t num_chans,uint32_t * chan_list,uint32_t * phymode)1050*5113495bSYour Name ucfg_scan_init_chanlist_params(struct scan_start_request *req,
1051*5113495bSYour Name 		uint32_t num_chans, uint32_t *chan_list, uint32_t *phymode)
1052*5113495bSYour Name {
1053*5113495bSYour Name 	uint32_t idx;
1054*5113495bSYour Name 	QDF_STATUS status;
1055*5113495bSYour Name 	struct regulatory_channel *reg_chan_list = NULL;
1056*5113495bSYour Name 	qdf_freq_t low_2g, high_2g, low_5g, high_5g;
1057*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
1058*5113495bSYour Name 	uint32_t *scan_freqs = NULL;
1059*5113495bSYour Name 	uint32_t max_chans = sizeof(req->scan_req.chan_list.chan) /
1060*5113495bSYour Name 				sizeof(req->scan_req.chan_list.chan[0]);
1061*5113495bSYour Name 	if (!req) {
1062*5113495bSYour Name 		scm_err("null request");
1063*5113495bSYour Name 		return QDF_STATUS_E_NULL_VALUE;
1064*5113495bSYour Name 	}
1065*5113495bSYour Name 
1066*5113495bSYour Name 	if (req->vdev)
1067*5113495bSYour Name 		pdev = wlan_vdev_get_pdev(req->vdev);
1068*5113495bSYour Name 	/*
1069*5113495bSYour Name 	 * If 0 channels are provided for scan and
1070*5113495bSYour Name 	 * wide band scan is enabled, scan all 20 mhz
1071*5113495bSYour Name 	 * available channels. This is required as FW
1072*5113495bSYour Name 	 * scans all channel/phy mode combinations
1073*5113495bSYour Name 	 * provided in scan channel list if 0 chans are
1074*5113495bSYour Name 	 * provided in scan request causing scan to take
1075*5113495bSYour Name 	 * too much time to complete.
1076*5113495bSYour Name 	 */
1077*5113495bSYour Name 	if (pdev && !num_chans) {
1078*5113495bSYour Name 		reg_chan_list = qdf_mem_malloc_atomic(NUM_CHANNELS *
1079*5113495bSYour Name 				sizeof(struct regulatory_channel));
1080*5113495bSYour Name 		if (!reg_chan_list) {
1081*5113495bSYour Name 			status = QDF_STATUS_E_NOMEM;
1082*5113495bSYour Name 			goto end;
1083*5113495bSYour Name 		}
1084*5113495bSYour Name 		scan_freqs =
1085*5113495bSYour Name 			qdf_mem_malloc_atomic(sizeof(uint32_t) * max_chans);
1086*5113495bSYour Name 		if (!scan_freqs) {
1087*5113495bSYour Name 			status = QDF_STATUS_E_NOMEM;
1088*5113495bSYour Name 			goto end;
1089*5113495bSYour Name 		}
1090*5113495bSYour Name 		status = wlan_reg_get_current_chan_list(pdev, reg_chan_list);
1091*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
1092*5113495bSYour Name 			goto end;
1093*5113495bSYour Name 
1094*5113495bSYour Name 		status = wlan_reg_get_freq_range(pdev, &low_2g,
1095*5113495bSYour Name 				&high_2g, &low_5g, &high_5g);
1096*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
1097*5113495bSYour Name 			goto end;
1098*5113495bSYour Name 
1099*5113495bSYour Name 		for (idx = 0, num_chans = 0;
1100*5113495bSYour Name 			(idx < NUM_CHANNELS && num_chans < max_chans); idx++)
1101*5113495bSYour Name 			if ((is_chan_enabled_for_scan(pdev,
1102*5113495bSYour Name 						      &reg_chan_list[idx],
1103*5113495bSYour Name 						      low_2g, high_2g,
1104*5113495bSYour Name 						      low_5g, high_5g)) &&
1105*5113495bSYour Name 			    ((req->scan_req.scan_f_2ghz &&
1106*5113495bSYour Name 			     WLAN_REG_IS_24GHZ_CH_FREQ(
1107*5113495bSYour Name 					reg_chan_list[idx].center_freq)) ||
1108*5113495bSYour Name 			     (req->scan_req.scan_f_5ghz &&
1109*5113495bSYour Name 			      (WLAN_REG_IS_5GHZ_CH_FREQ(
1110*5113495bSYour Name 					reg_chan_list[idx].center_freq) ||
1111*5113495bSYour Name 			       WLAN_REG_IS_49GHZ_FREQ(
1112*5113495bSYour Name 					reg_chan_list[idx].center_freq) ||
1113*5113495bSYour Name 			       WLAN_REG_IS_6GHZ_CHAN_FREQ(
1114*5113495bSYour Name 					reg_chan_list[idx].center_freq)))))
1115*5113495bSYour Name 				scan_freqs[num_chans++] =
1116*5113495bSYour Name 				reg_chan_list[idx].center_freq;
1117*5113495bSYour Name 
1118*5113495bSYour Name 		chan_list = scan_freqs;
1119*5113495bSYour Name 	}
1120*5113495bSYour Name 
1121*5113495bSYour Name 	if (!num_chans) {
1122*5113495bSYour Name 		/* empty channel list provided */
1123*5113495bSYour Name 		qdf_mem_zero(&req->scan_req.chan_list,
1124*5113495bSYour Name 			sizeof(req->scan_req.chan_list));
1125*5113495bSYour Name 		req->scan_req.chan_list.num_chan = 0;
1126*5113495bSYour Name 		status = QDF_STATUS_SUCCESS;
1127*5113495bSYour Name 		goto end;
1128*5113495bSYour Name 	}
1129*5113495bSYour Name 	if (!chan_list) {
1130*5113495bSYour Name 		scm_info("null chan_list while num_chans: %d", num_chans);
1131*5113495bSYour Name 		status = QDF_STATUS_E_NULL_VALUE;
1132*5113495bSYour Name 		goto end;
1133*5113495bSYour Name 	}
1134*5113495bSYour Name 
1135*5113495bSYour Name 	if (num_chans > max_chans) {
1136*5113495bSYour Name 		/* got a big list. alert and fail */
1137*5113495bSYour Name 		scm_warn("overflow: received %d, max supported : %d",
1138*5113495bSYour Name 			num_chans, max_chans);
1139*5113495bSYour Name 		status = QDF_STATUS_E_E2BIG;
1140*5113495bSYour Name 		goto end;
1141*5113495bSYour Name 	}
1142*5113495bSYour Name 
1143*5113495bSYour Name 	req->scan_req.chan_list.num_chan = num_chans;
1144*5113495bSYour Name 	for (idx = 0; idx < num_chans; idx++) {
1145*5113495bSYour Name 		req->scan_req.chan_list.chan[idx].freq =
1146*5113495bSYour Name 			(chan_list[idx] > WLAN_24_GHZ_BASE_FREQ) ?
1147*5113495bSYour Name 			chan_list[idx] :
1148*5113495bSYour Name 			wlan_reg_legacy_chan_to_freq(pdev, chan_list[idx]);
1149*5113495bSYour Name 		if (phymode)
1150*5113495bSYour Name 			req->scan_req.chan_list.chan[idx].phymode =
1151*5113495bSYour Name 				phymode[idx];
1152*5113495bSYour Name 		else if (req->scan_req.chan_list.chan[idx].freq <=
1153*5113495bSYour Name 			WLAN_CHAN_15_FREQ)
1154*5113495bSYour Name 			req->scan_req.chan_list.chan[idx].phymode =
1155*5113495bSYour Name 				SCAN_PHY_MODE_11G;
1156*5113495bSYour Name 		else if (req->scan_req.chan_list.chan[idx].freq <=
1157*5113495bSYour Name 			 WLAN_REG_MAX_5GHZ_CHAN_FREQ)
1158*5113495bSYour Name 			req->scan_req.chan_list.chan[idx].phymode =
1159*5113495bSYour Name 				SCAN_PHY_MODE_11A;
1160*5113495bSYour Name 		else
1161*5113495bSYour Name 			req->scan_req.chan_list.chan[idx].phymode =
1162*5113495bSYour Name 				SCAN_PHY_MODE_11AX_HE20;
1163*5113495bSYour Name 	}
1164*5113495bSYour Name 
1165*5113495bSYour Name end:
1166*5113495bSYour Name 	if (scan_freqs)
1167*5113495bSYour Name 		qdf_mem_free(scan_freqs);
1168*5113495bSYour Name 
1169*5113495bSYour Name 	if (reg_chan_list)
1170*5113495bSYour Name 		qdf_mem_free(reg_chan_list);
1171*5113495bSYour Name 
1172*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1173*5113495bSYour Name }
1174*5113495bSYour Name 
1175*5113495bSYour Name enum scm_scan_status
ucfg_scan_get_vdev_status(struct wlan_objmgr_vdev * vdev)1176*5113495bSYour Name ucfg_scan_get_vdev_status(struct wlan_objmgr_vdev *vdev)
1177*5113495bSYour Name {
1178*5113495bSYour Name 	return wlan_get_vdev_status(vdev);
1179*5113495bSYour Name }
1180*5113495bSYour Name 
1181*5113495bSYour Name enum scm_scan_status
ucfg_scan_get_pdev_status(struct wlan_objmgr_pdev * pdev)1182*5113495bSYour Name ucfg_scan_get_pdev_status(struct wlan_objmgr_pdev *pdev)
1183*5113495bSYour Name {
1184*5113495bSYour Name 	return wlan_get_pdev_status(pdev);
1185*5113495bSYour Name }
1186*5113495bSYour Name 
1187*5113495bSYour Name static void
scan_register_unregister_bcn_cb(struct wlan_objmgr_psoc * psoc,bool enable)1188*5113495bSYour Name scan_register_unregister_bcn_cb(struct wlan_objmgr_psoc *psoc,
1189*5113495bSYour Name 				bool enable)
1190*5113495bSYour Name {
1191*5113495bSYour Name 	QDF_STATUS status;
1192*5113495bSYour Name 	struct mgmt_txrx_mgmt_frame_cb_info cb_info[2];
1193*5113495bSYour Name 
1194*5113495bSYour Name 	cb_info[0].frm_type = MGMT_PROBE_RESP;
1195*5113495bSYour Name 	cb_info[0].mgmt_rx_cb = tgt_scan_bcn_probe_rx_callback;
1196*5113495bSYour Name 	cb_info[1].frm_type = MGMT_BEACON;
1197*5113495bSYour Name 	cb_info[1].mgmt_rx_cb = tgt_scan_bcn_probe_rx_callback;
1198*5113495bSYour Name 
1199*5113495bSYour Name 	if (enable)
1200*5113495bSYour Name 		status = wlan_mgmt_txrx_register_rx_cb(psoc,
1201*5113495bSYour Name 					 WLAN_UMAC_COMP_SCAN, cb_info, 2);
1202*5113495bSYour Name 	else
1203*5113495bSYour Name 		status = wlan_mgmt_txrx_deregister_rx_cb(psoc,
1204*5113495bSYour Name 					 WLAN_UMAC_COMP_SCAN, cb_info, 2);
1205*5113495bSYour Name 	if (status != QDF_STATUS_SUCCESS)
1206*5113495bSYour Name 		scm_err("%s the Handle with MGMT TXRX layer has failed",
1207*5113495bSYour Name 			enable ? "Registering" : "Deregistering");
1208*5113495bSYour Name }
1209*5113495bSYour Name 
ucfg_scan_update_user_config(struct wlan_objmgr_psoc * psoc,struct scan_user_cfg * scan_cfg)1210*5113495bSYour Name QDF_STATUS ucfg_scan_update_user_config(struct wlan_objmgr_psoc *psoc,
1211*5113495bSYour Name 	struct scan_user_cfg *scan_cfg)
1212*5113495bSYour Name {
1213*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1214*5113495bSYour Name 	struct scan_default_params *scan_def;
1215*5113495bSYour Name 
1216*5113495bSYour Name 	if (!psoc) {
1217*5113495bSYour Name 		scm_err("null psoc");
1218*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1219*5113495bSYour Name 	}
1220*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1221*5113495bSYour Name 	if (!scan_obj) {
1222*5113495bSYour Name 		scm_err("Failed to get scan object");
1223*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1224*5113495bSYour Name 	}
1225*5113495bSYour Name 
1226*5113495bSYour Name 	scan_def = &scan_obj->scan_def;
1227*5113495bSYour Name 	scan_obj->ie_allowlist = scan_cfg->ie_allowlist;
1228*5113495bSYour Name 	scan_def->sta_miracast_mcc_rest_time =
1229*5113495bSYour Name 				scan_cfg->sta_miracast_mcc_rest_time;
1230*5113495bSYour Name 
1231*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1232*5113495bSYour Name }
1233*5113495bSYour Name 
1234*5113495bSYour Name #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
1235*5113495bSYour Name static QDF_STATUS
scan_cancel_pdev_scan(struct wlan_objmgr_pdev * pdev)1236*5113495bSYour Name scan_cancel_pdev_scan(struct wlan_objmgr_pdev *pdev)
1237*5113495bSYour Name {
1238*5113495bSYour Name 	struct scan_cancel_request *req;
1239*5113495bSYour Name 	QDF_STATUS status;
1240*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
1241*5113495bSYour Name 
1242*5113495bSYour Name 	req = qdf_mem_malloc_atomic(sizeof(*req));
1243*5113495bSYour Name 	if (!req) {
1244*5113495bSYour Name 		scm_err("Failed to allocate memory");
1245*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1246*5113495bSYour Name 	}
1247*5113495bSYour Name 
1248*5113495bSYour Name 	vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SCAN_ID);
1249*5113495bSYour Name 	if (!vdev) {
1250*5113495bSYour Name 		scm_err("Failed to get vdev");
1251*5113495bSYour Name 		qdf_mem_free(req);
1252*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1253*5113495bSYour Name 	}
1254*5113495bSYour Name 	req->vdev = vdev;
1255*5113495bSYour Name 	req->cancel_req.scan_id = INVAL_SCAN_ID;
1256*5113495bSYour Name 	req->cancel_req.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
1257*5113495bSYour Name 	req->cancel_req.vdev_id = INVAL_VDEV_ID;
1258*5113495bSYour Name 	req->cancel_req.req_type = WLAN_SCAN_CANCEL_PDEV_ALL;
1259*5113495bSYour Name 	status = ucfg_scan_cancel_sync(req);
1260*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
1261*5113495bSYour Name 		scm_err("Cancel scan request failed");
1262*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_SCAN_ID);
1263*5113495bSYour Name 
1264*5113495bSYour Name 	return status;
1265*5113495bSYour Name }
1266*5113495bSYour Name 
1267*5113495bSYour Name static QDF_STATUS
ucfg_scan_suspend_handler(struct wlan_objmgr_psoc * psoc,void * arg)1268*5113495bSYour Name ucfg_scan_suspend_handler(struct wlan_objmgr_psoc *psoc, void *arg)
1269*5113495bSYour Name {
1270*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev = NULL;
1271*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1272*5113495bSYour Name 	int i;
1273*5113495bSYour Name 	wlan_scan_psoc_set_disable(psoc, REASON_SUSPEND);
1274*5113495bSYour Name 
1275*5113495bSYour Name 	/* Check all pdev */
1276*5113495bSYour Name 	for (i = 0; i < WLAN_UMAC_MAX_PDEVS; i++) {
1277*5113495bSYour Name 		pdev = wlan_objmgr_get_pdev_by_id(psoc, i, WLAN_SCAN_ID);
1278*5113495bSYour Name 		if (!pdev)
1279*5113495bSYour Name 			continue;
1280*5113495bSYour Name 		if (wlan_get_pdev_status(pdev) != SCAN_NOT_IN_PROGRESS)
1281*5113495bSYour Name 			status = scan_cancel_pdev_scan(pdev);
1282*5113495bSYour Name 		scm_disable_obss_pdev_scan(psoc, pdev);
1283*5113495bSYour Name 		wlan_objmgr_pdev_release_ref(pdev, WLAN_SCAN_ID);
1284*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status)) {
1285*5113495bSYour Name 			scm_err("failed to cancel scan for pdev_id %d", i);
1286*5113495bSYour Name 			return status;
1287*5113495bSYour Name 		}
1288*5113495bSYour Name 	}
1289*5113495bSYour Name 
1290*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1291*5113495bSYour Name }
1292*5113495bSYour Name 
1293*5113495bSYour Name static QDF_STATUS
ucfg_scan_resume_handler(struct wlan_objmgr_psoc * psoc,void * arg)1294*5113495bSYour Name ucfg_scan_resume_handler(struct wlan_objmgr_psoc *psoc, void *arg)
1295*5113495bSYour Name {
1296*5113495bSYour Name 	wlan_scan_psoc_set_enable(psoc, REASON_SUSPEND);
1297*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1298*5113495bSYour Name }
1299*5113495bSYour Name 
1300*5113495bSYour Name static inline void
scan_register_pmo_handler(void)1301*5113495bSYour Name scan_register_pmo_handler(void)
1302*5113495bSYour Name {
1303*5113495bSYour Name 	pmo_register_suspend_handler(WLAN_UMAC_COMP_SCAN,
1304*5113495bSYour Name 		ucfg_scan_suspend_handler, NULL);
1305*5113495bSYour Name 	pmo_register_resume_handler(WLAN_UMAC_COMP_SCAN,
1306*5113495bSYour Name 		ucfg_scan_resume_handler, NULL);
1307*5113495bSYour Name }
1308*5113495bSYour Name 
1309*5113495bSYour Name static inline void
scan_unregister_pmo_handler(void)1310*5113495bSYour Name scan_unregister_pmo_handler(void)
1311*5113495bSYour Name {
1312*5113495bSYour Name 	pmo_unregister_suspend_handler(WLAN_UMAC_COMP_SCAN,
1313*5113495bSYour Name 		ucfg_scan_suspend_handler);
1314*5113495bSYour Name 	pmo_unregister_resume_handler(WLAN_UMAC_COMP_SCAN,
1315*5113495bSYour Name 		ucfg_scan_resume_handler);
1316*5113495bSYour Name }
1317*5113495bSYour Name 
1318*5113495bSYour Name #else
1319*5113495bSYour Name static inline void
scan_register_pmo_handler(void)1320*5113495bSYour Name scan_register_pmo_handler(void)
1321*5113495bSYour Name {
1322*5113495bSYour Name }
1323*5113495bSYour Name 
1324*5113495bSYour Name static inline void
scan_unregister_pmo_handler(void)1325*5113495bSYour Name scan_unregister_pmo_handler(void)
1326*5113495bSYour Name {
1327*5113495bSYour Name }
1328*5113495bSYour Name #endif
1329*5113495bSYour Name 
1330*5113495bSYour Name QDF_STATUS
ucfg_scan_psoc_open(struct wlan_objmgr_psoc * psoc)1331*5113495bSYour Name ucfg_scan_psoc_open(struct wlan_objmgr_psoc *psoc)
1332*5113495bSYour Name {
1333*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1334*5113495bSYour Name 
1335*5113495bSYour Name 	scm_debug("psoc open: 0x%pK", psoc);
1336*5113495bSYour Name 	if (!psoc) {
1337*5113495bSYour Name 		scm_err("null psoc");
1338*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1339*5113495bSYour Name 	}
1340*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1341*5113495bSYour Name 	if (!scan_obj) {
1342*5113495bSYour Name 		scm_err("Failed to get scan object");
1343*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1344*5113495bSYour Name 	}
1345*5113495bSYour Name 	/* Initialize the scan Globals */
1346*5113495bSYour Name 	wlan_scan_global_init(psoc, scan_obj);
1347*5113495bSYour Name 	qdf_spinlock_create(&scan_obj->lock);
1348*5113495bSYour Name 	scan_register_pmo_handler();
1349*5113495bSYour Name 	scm_db_init(psoc);
1350*5113495bSYour Name 	scm_channel_list_db_init(psoc);
1351*5113495bSYour Name 
1352*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1353*5113495bSYour Name }
1354*5113495bSYour Name 
1355*5113495bSYour Name QDF_STATUS
ucfg_scan_psoc_close(struct wlan_objmgr_psoc * psoc)1356*5113495bSYour Name ucfg_scan_psoc_close(struct wlan_objmgr_psoc *psoc)
1357*5113495bSYour Name {
1358*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1359*5113495bSYour Name 
1360*5113495bSYour Name 	scm_debug("psoc close: 0x%pK", psoc);
1361*5113495bSYour Name 	if (!psoc) {
1362*5113495bSYour Name 		scm_err("null psoc");
1363*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1364*5113495bSYour Name 	}
1365*5113495bSYour Name 	scm_db_deinit(psoc);
1366*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1367*5113495bSYour Name 	if (!scan_obj) {
1368*5113495bSYour Name 		scm_err("Failed to get scan object");
1369*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1370*5113495bSYour Name 	}
1371*5113495bSYour Name 	scan_unregister_pmo_handler();
1372*5113495bSYour Name 	qdf_spinlock_destroy(&scan_obj->lock);
1373*5113495bSYour Name 	wlan_scan_global_deinit(psoc);
1374*5113495bSYour Name 	scm_channel_list_db_deinit(psoc);
1375*5113495bSYour Name 
1376*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1377*5113495bSYour Name }
1378*5113495bSYour Name 
scm_serialization_scan_rules_cb(union wlan_serialization_rules_info * comp_info,uint8_t comp_id)1379*5113495bSYour Name static bool scm_serialization_scan_rules_cb(
1380*5113495bSYour Name 		union wlan_serialization_rules_info *comp_info,
1381*5113495bSYour Name 		uint8_t comp_id)
1382*5113495bSYour Name {
1383*5113495bSYour Name 	switch (comp_id) {
1384*5113495bSYour Name 	case WLAN_UMAC_COMP_TDLS:
1385*5113495bSYour Name 		if (comp_info->scan_info.is_tdls_in_progress) {
1386*5113495bSYour Name 			scm_debug("Cancel scan. Tdls in progress");
1387*5113495bSYour Name 			return false;
1388*5113495bSYour Name 		}
1389*5113495bSYour Name 		break;
1390*5113495bSYour Name 	case WLAN_UMAC_COMP_DFS:
1391*5113495bSYour Name 		if (comp_info->scan_info.is_cac_in_progress) {
1392*5113495bSYour Name 			scm_debug("Cancel scan. CAC in progress");
1393*5113495bSYour Name 			return false;
1394*5113495bSYour Name 		}
1395*5113495bSYour Name 		break;
1396*5113495bSYour Name 	case WLAN_UMAC_COMP_MLME:
1397*5113495bSYour Name 		if (comp_info->scan_info.is_scan_for_connect) {
1398*5113495bSYour Name 			scm_debug("Allow scan request from connect");
1399*5113495bSYour Name 			return true;
1400*5113495bSYour Name 		}
1401*5113495bSYour Name 
1402*5113495bSYour Name 		if (comp_info->scan_info.is_mlme_op_in_progress) {
1403*5113495bSYour Name 			scm_debug("Cancel scan. MLME operation in progress");
1404*5113495bSYour Name 			return false;
1405*5113495bSYour Name 		}
1406*5113495bSYour Name 		break;
1407*5113495bSYour Name 	default:
1408*5113495bSYour Name 		scm_debug("not handled comp_id %d", comp_id);
1409*5113495bSYour Name 		break;
1410*5113495bSYour Name 	}
1411*5113495bSYour Name 
1412*5113495bSYour Name 	return true;
1413*5113495bSYour Name }
1414*5113495bSYour Name 
1415*5113495bSYour Name QDF_STATUS
ucfg_scan_psoc_enable(struct wlan_objmgr_psoc * psoc)1416*5113495bSYour Name ucfg_scan_psoc_enable(struct wlan_objmgr_psoc *psoc)
1417*5113495bSYour Name {
1418*5113495bSYour Name 	QDF_STATUS status;
1419*5113495bSYour Name 
1420*5113495bSYour Name 	scm_debug("psoc enable: 0x%pK", psoc);
1421*5113495bSYour Name 	if (!psoc) {
1422*5113495bSYour Name 		scm_err("null psoc");
1423*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1424*5113495bSYour Name 	}
1425*5113495bSYour Name 	/* Subscribe for scan events from lmac layesr */
1426*5113495bSYour Name 	status = tgt_scan_register_ev_handler(psoc);
1427*5113495bSYour Name 	QDF_ASSERT(status == QDF_STATUS_SUCCESS);
1428*5113495bSYour Name 	if (!wlan_reg_is_11d_offloaded(psoc))
1429*5113495bSYour Name 		scm_11d_cc_db_init(psoc);
1430*5113495bSYour Name 	scan_register_unregister_bcn_cb(psoc, true);
1431*5113495bSYour Name 	status = wlan_serialization_register_apply_rules_cb(psoc,
1432*5113495bSYour Name 				WLAN_SER_CMD_SCAN,
1433*5113495bSYour Name 				scm_serialization_scan_rules_cb);
1434*5113495bSYour Name 	QDF_ASSERT(status == QDF_STATUS_SUCCESS);
1435*5113495bSYour Name 	return status;
1436*5113495bSYour Name }
1437*5113495bSYour Name 
1438*5113495bSYour Name QDF_STATUS
ucfg_scan_psoc_disable(struct wlan_objmgr_psoc * psoc)1439*5113495bSYour Name ucfg_scan_psoc_disable(struct wlan_objmgr_psoc *psoc)
1440*5113495bSYour Name {
1441*5113495bSYour Name 	QDF_STATUS status;
1442*5113495bSYour Name 
1443*5113495bSYour Name 	scm_debug("psoc disable: 0x%pK", psoc);
1444*5113495bSYour Name 	if (!psoc) {
1445*5113495bSYour Name 		scm_err("null psoc");
1446*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1447*5113495bSYour Name 	}
1448*5113495bSYour Name 	/* Unsubscribe for scan events from lmac layesr */
1449*5113495bSYour Name 	status = tgt_scan_unregister_ev_handler(psoc);
1450*5113495bSYour Name 	QDF_ASSERT(status == QDF_STATUS_SUCCESS);
1451*5113495bSYour Name 	scan_register_unregister_bcn_cb(psoc, false);
1452*5113495bSYour Name 	if (!wlan_reg_is_11d_offloaded(psoc))
1453*5113495bSYour Name 		scm_11d_cc_db_deinit(psoc);
1454*5113495bSYour Name 
1455*5113495bSYour Name 	return status;
1456*5113495bSYour Name }
1457*5113495bSYour Name 
1458*5113495bSYour Name uint32_t
ucfg_scan_get_max_active_scans(struct wlan_objmgr_psoc * psoc)1459*5113495bSYour Name ucfg_scan_get_max_active_scans(struct wlan_objmgr_psoc *psoc)
1460*5113495bSYour Name {
1461*5113495bSYour Name 	struct scan_default_params *scan_params = NULL;
1462*5113495bSYour Name 
1463*5113495bSYour Name 	if (!psoc) {
1464*5113495bSYour Name 		scm_err("null psoc");
1465*5113495bSYour Name 		return 0;
1466*5113495bSYour Name 	}
1467*5113495bSYour Name 	scan_params = wlan_scan_psoc_get_def_params(psoc);
1468*5113495bSYour Name 	if (!scan_params) {
1469*5113495bSYour Name 		scm_err("Failed to get scan object");
1470*5113495bSYour Name 		return 0;
1471*5113495bSYour Name 	}
1472*5113495bSYour Name 
1473*5113495bSYour Name 	return scan_params->max_active_scans_allowed;
1474*5113495bSYour Name }
1475*5113495bSYour Name 
ucfg_copy_ie_allowlist_attrs(struct wlan_objmgr_psoc * psoc,struct probe_req_allowlist_attr * ie_allowlist)1476*5113495bSYour Name bool ucfg_copy_ie_allowlist_attrs(struct wlan_objmgr_psoc *psoc,
1477*5113495bSYour Name 				  struct probe_req_allowlist_attr *ie_allowlist)
1478*5113495bSYour Name {
1479*5113495bSYour Name 	struct wlan_scan_obj *scan_obj = NULL;
1480*5113495bSYour Name 
1481*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1482*5113495bSYour Name 	if (!scan_obj)
1483*5113495bSYour Name 		return false;
1484*5113495bSYour Name 
1485*5113495bSYour Name 	qdf_mem_copy(ie_allowlist, &scan_obj->ie_allowlist,
1486*5113495bSYour Name 		     sizeof(*ie_allowlist));
1487*5113495bSYour Name 
1488*5113495bSYour Name 	return true;
1489*5113495bSYour Name }
1490*5113495bSYour Name 
ucfg_ie_allowlist_enabled(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_vdev * vdev)1491*5113495bSYour Name bool ucfg_ie_allowlist_enabled(struct wlan_objmgr_psoc *psoc,
1492*5113495bSYour Name 			       struct wlan_objmgr_vdev *vdev)
1493*5113495bSYour Name {
1494*5113495bSYour Name 	struct wlan_scan_obj *scan_obj = NULL;
1495*5113495bSYour Name 
1496*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1497*5113495bSYour Name 	if (!scan_obj)
1498*5113495bSYour Name 		return false;
1499*5113495bSYour Name 
1500*5113495bSYour Name 	if ((wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE) ||
1501*5113495bSYour Name 	    wlan_vdev_is_up(vdev) == QDF_STATUS_SUCCESS)
1502*5113495bSYour Name 		return false;
1503*5113495bSYour Name 
1504*5113495bSYour Name 	if (!scan_obj->ie_allowlist.allow_list)
1505*5113495bSYour Name 		return false;
1506*5113495bSYour Name 
1507*5113495bSYour Name 	return true;
1508*5113495bSYour Name }
1509*5113495bSYour Name 
ucfg_scan_set_bt_activity(struct wlan_objmgr_psoc * psoc,bool bt_a2dp_active)1510*5113495bSYour Name void ucfg_scan_set_bt_activity(struct wlan_objmgr_psoc *psoc,
1511*5113495bSYour Name 			       bool bt_a2dp_active)
1512*5113495bSYour Name {
1513*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1514*5113495bSYour Name 
1515*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1516*5113495bSYour Name 	if (!scan_obj) {
1517*5113495bSYour Name 		scm_err("Failed to get scan object");
1518*5113495bSYour Name 		return;
1519*5113495bSYour Name 	}
1520*5113495bSYour Name 	scan_obj->bt_a2dp_enabled = bt_a2dp_active;
1521*5113495bSYour Name }
1522*5113495bSYour Name 
ucfg_scan_get_bt_activity(struct wlan_objmgr_psoc * psoc)1523*5113495bSYour Name bool ucfg_scan_get_bt_activity(struct wlan_objmgr_psoc *psoc)
1524*5113495bSYour Name {
1525*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1526*5113495bSYour Name 
1527*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1528*5113495bSYour Name 	if (!scan_obj) {
1529*5113495bSYour Name 		scm_err("Failed to get scan object");
1530*5113495bSYour Name 		return false;
1531*5113495bSYour Name 	}
1532*5113495bSYour Name 
1533*5113495bSYour Name 	return scan_obj->bt_a2dp_enabled;
1534*5113495bSYour Name }
1535*5113495bSYour Name 
ucfg_scan_wake_lock_in_user_scan(struct wlan_objmgr_psoc * psoc)1536*5113495bSYour Name bool ucfg_scan_wake_lock_in_user_scan(struct wlan_objmgr_psoc *psoc)
1537*5113495bSYour Name {
1538*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1539*5113495bSYour Name 
1540*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1541*5113495bSYour Name 	if (!scan_obj)
1542*5113495bSYour Name 		return false;
1543*5113495bSYour Name 
1544*5113495bSYour Name 	return scan_obj->scan_def.use_wake_lock_in_user_scan;
1545*5113495bSYour Name }
1546*5113495bSYour Name 
ucfg_scan_is_connected_scan_enabled(struct wlan_objmgr_psoc * psoc)1547*5113495bSYour Name bool ucfg_scan_is_connected_scan_enabled(struct wlan_objmgr_psoc *psoc)
1548*5113495bSYour Name {
1549*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1550*5113495bSYour Name 
1551*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1552*5113495bSYour Name 	if (!scan_obj) {
1553*5113495bSYour Name 		scm_err("Failed to get scan object");
1554*5113495bSYour Name 		return cfg_default(CFG_ENABLE_CONNECTED_SCAN);
1555*5113495bSYour Name 	}
1556*5113495bSYour Name 
1557*5113495bSYour Name 	return scan_obj->scan_def.enable_connected_scan;
1558*5113495bSYour Name }
1559*5113495bSYour Name 
ucfg_scan_is_mac_spoofing_enabled(struct wlan_objmgr_psoc * psoc)1560*5113495bSYour Name bool ucfg_scan_is_mac_spoofing_enabled(struct wlan_objmgr_psoc *psoc)
1561*5113495bSYour Name {
1562*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1563*5113495bSYour Name 
1564*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1565*5113495bSYour Name 	if (!scan_obj) {
1566*5113495bSYour Name 		scm_err("Failed to get scan object");
1567*5113495bSYour Name 		return cfg_default(CFG_ENABLE_MAC_ADDR_SPOOFING);
1568*5113495bSYour Name 	}
1569*5113495bSYour Name 
1570*5113495bSYour Name 	return scan_obj->scan_def.enable_mac_spoofing;
1571*5113495bSYour Name }
1572*5113495bSYour Name 
1573*5113495bSYour Name enum scan_dwelltime_adaptive_mode
ucfg_scan_get_extscan_adaptive_dwell_mode(struct wlan_objmgr_psoc * psoc)1574*5113495bSYour Name ucfg_scan_get_extscan_adaptive_dwell_mode(struct wlan_objmgr_psoc *psoc)
1575*5113495bSYour Name {
1576*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1577*5113495bSYour Name 
1578*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1579*5113495bSYour Name 	if (!scan_obj) {
1580*5113495bSYour Name 		scm_err("Failed to get scan object");
1581*5113495bSYour Name 		return cfg_default(CFG_ADAPTIVE_EXTSCAN_DWELL_MODE);
1582*5113495bSYour Name 	}
1583*5113495bSYour Name 
1584*5113495bSYour Name 	return scan_obj->scan_def.extscan_adaptive_dwell_mode;
1585*5113495bSYour Name }
1586*5113495bSYour Name 
1587*5113495bSYour Name QDF_STATUS
ucfg_scan_set_global_config(struct wlan_objmgr_psoc * psoc,enum scan_config config,uint32_t val)1588*5113495bSYour Name ucfg_scan_set_global_config(struct wlan_objmgr_psoc *psoc,
1589*5113495bSYour Name 			       enum scan_config config, uint32_t val)
1590*5113495bSYour Name {
1591*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1592*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1593*5113495bSYour Name 
1594*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1595*5113495bSYour Name 	if (!scan_obj) {
1596*5113495bSYour Name 		scm_err("Failed to get scan object config:%d, val:%d",
1597*5113495bSYour Name 				config, val);
1598*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1599*5113495bSYour Name 	}
1600*5113495bSYour Name 	switch (config) {
1601*5113495bSYour Name 	case SCAN_CFG_DISABLE_SCAN_COMMAND_TIMEOUT:
1602*5113495bSYour Name 		scan_obj->disable_timeout = !!val;
1603*5113495bSYour Name 		break;
1604*5113495bSYour Name 	case SCAN_CFG_DROP_BCN_ON_CHANNEL_MISMATCH:
1605*5113495bSYour Name 		scan_obj->drop_bcn_on_chan_mismatch = !!val;
1606*5113495bSYour Name 		break;
1607*5113495bSYour Name 
1608*5113495bSYour Name 	default:
1609*5113495bSYour Name 		status = QDF_STATUS_E_INVAL;
1610*5113495bSYour Name 		break;
1611*5113495bSYour Name 	}
1612*5113495bSYour Name 
1613*5113495bSYour Name 	return status;
1614*5113495bSYour Name }
1615*5113495bSYour Name 
1616*5113495bSYour Name QDF_STATUS
ucfg_scan_get_global_config(struct wlan_objmgr_psoc * psoc,enum scan_config config,uint32_t * val)1617*5113495bSYour Name ucfg_scan_get_global_config(struct wlan_objmgr_psoc *psoc,
1618*5113495bSYour Name 			       enum scan_config config, uint32_t *val)
1619*5113495bSYour Name {
1620*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1621*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_SUCCESS;
1622*5113495bSYour Name 
1623*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1624*5113495bSYour Name 	if (!scan_obj || !val) {
1625*5113495bSYour Name 		scm_err("scan object:%pK config:%d, val:0x%pK",
1626*5113495bSYour Name 				scan_obj, config, val);
1627*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1628*5113495bSYour Name 	}
1629*5113495bSYour Name 	switch (config) {
1630*5113495bSYour Name 	case SCAN_CFG_DISABLE_SCAN_COMMAND_TIMEOUT:
1631*5113495bSYour Name 		*val = scan_obj->disable_timeout;
1632*5113495bSYour Name 		break;
1633*5113495bSYour Name 	case SCAN_CFG_DROP_BCN_ON_CHANNEL_MISMATCH:
1634*5113495bSYour Name 		*val = scan_obj->drop_bcn_on_chan_mismatch;
1635*5113495bSYour Name 		break;
1636*5113495bSYour Name 
1637*5113495bSYour Name 	default:
1638*5113495bSYour Name 		status = QDF_STATUS_E_INVAL;
1639*5113495bSYour Name 		break;
1640*5113495bSYour Name 	}
1641*5113495bSYour Name 
1642*5113495bSYour Name 	return status;
1643*5113495bSYour Name }
1644*5113495bSYour Name 
ucfg_scan_set_obss_scan_offload(struct wlan_objmgr_psoc * psoc,bool value)1645*5113495bSYour Name void ucfg_scan_set_obss_scan_offload(struct wlan_objmgr_psoc *psoc, bool value)
1646*5113495bSYour Name {
1647*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1648*5113495bSYour Name 
1649*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1650*5113495bSYour Name 	if (!scan_obj) {
1651*5113495bSYour Name 		scm_err("NULL scan obj");
1652*5113495bSYour Name 		return;
1653*5113495bSYour Name 	}
1654*5113495bSYour Name 
1655*5113495bSYour Name 	scan_obj->obss_scan_offload = value;
1656*5113495bSYour Name }
1657*5113495bSYour Name 
1658*5113495bSYour Name #ifdef FEATURE_WLAN_SCAN_PNO
ucfg_scan_is_pno_offload_enabled(struct wlan_objmgr_psoc * psoc)1659*5113495bSYour Name bool ucfg_scan_is_pno_offload_enabled(struct wlan_objmgr_psoc *psoc)
1660*5113495bSYour Name {
1661*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1662*5113495bSYour Name 
1663*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1664*5113495bSYour Name 	if (!scan_obj) {
1665*5113495bSYour Name 		scm_err("NULL scan obj");
1666*5113495bSYour Name 		return false;
1667*5113495bSYour Name 	}
1668*5113495bSYour Name 
1669*5113495bSYour Name 	return scan_obj->pno_cfg.pno_offload_enabled;
1670*5113495bSYour Name }
1671*5113495bSYour Name 
ucfg_scan_set_pno_offload(struct wlan_objmgr_psoc * psoc,bool value)1672*5113495bSYour Name void ucfg_scan_set_pno_offload(struct wlan_objmgr_psoc *psoc, bool value)
1673*5113495bSYour Name {
1674*5113495bSYour Name 	 struct wlan_scan_obj *scan_obj;
1675*5113495bSYour Name 
1676*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1677*5113495bSYour Name 	if (!scan_obj) {
1678*5113495bSYour Name 		scm_err("NULL scan obj");
1679*5113495bSYour Name 		return;
1680*5113495bSYour Name 	}
1681*5113495bSYour Name 
1682*5113495bSYour Name 	scan_obj->pno_cfg.pno_offload_enabled = value;
1683*5113495bSYour Name }
1684*5113495bSYour Name 
ucfg_scan_get_pno_scan_support(struct wlan_objmgr_psoc * psoc)1685*5113495bSYour Name bool ucfg_scan_get_pno_scan_support(struct wlan_objmgr_psoc *psoc)
1686*5113495bSYour Name {
1687*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1688*5113495bSYour Name 
1689*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1690*5113495bSYour Name 	if (!scan_obj) {
1691*5113495bSYour Name 		scm_err("NULL scan obj");
1692*5113495bSYour Name 		return cfg_default(CFG_PNO_SCAN_SUPPORT);
1693*5113495bSYour Name 	}
1694*5113495bSYour Name 
1695*5113495bSYour Name 	return scan_obj->pno_cfg.scan_support_enabled;
1696*5113495bSYour Name }
1697*5113495bSYour Name 
ucfg_get_scan_backoff_multiplier(struct wlan_objmgr_psoc * psoc)1698*5113495bSYour Name uint8_t ucfg_get_scan_backoff_multiplier(struct wlan_objmgr_psoc *psoc)
1699*5113495bSYour Name {
1700*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1701*5113495bSYour Name 
1702*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1703*5113495bSYour Name 	if (!scan_obj) {
1704*5113495bSYour Name 		scm_err("NULL scan obj");
1705*5113495bSYour Name 		return cfg_default(CFG_SCAN_BACKOFF_MULTIPLIER);
1706*5113495bSYour Name 	}
1707*5113495bSYour Name 	return scan_obj->pno_cfg.scan_backoff_multiplier;
1708*5113495bSYour Name }
1709*5113495bSYour Name 
ucfg_scan_is_dfs_chnl_scan_enabled(struct wlan_objmgr_psoc * psoc)1710*5113495bSYour Name bool ucfg_scan_is_dfs_chnl_scan_enabled(struct wlan_objmgr_psoc *psoc)
1711*5113495bSYour Name {
1712*5113495bSYour Name 		struct wlan_scan_obj *scan_obj;
1713*5113495bSYour Name 
1714*5113495bSYour Name 		scan_obj = wlan_psoc_get_scan_obj(psoc);
1715*5113495bSYour Name 		if (!scan_obj) {
1716*5113495bSYour Name 			scm_err("NULL scan obj");
1717*5113495bSYour Name 			return cfg_default(CFG_ENABLE_DFS_PNO_CHNL_SCAN);
1718*5113495bSYour Name 		}
1719*5113495bSYour Name 		return scan_obj->pno_cfg.dfs_chnl_scan_enabled;
1720*5113495bSYour Name }
1721*5113495bSYour Name 
ucfg_scan_get_scan_timer_repeat_value(struct wlan_objmgr_psoc * psoc)1722*5113495bSYour Name uint32_t ucfg_scan_get_scan_timer_repeat_value(struct wlan_objmgr_psoc *psoc)
1723*5113495bSYour Name {
1724*5113495bSYour Name 		struct wlan_scan_obj *scan_obj;
1725*5113495bSYour Name 
1726*5113495bSYour Name 		scan_obj = wlan_psoc_get_scan_obj(psoc);
1727*5113495bSYour Name 		if (!scan_obj) {
1728*5113495bSYour Name 			scm_err("NULL scan obj");
1729*5113495bSYour Name 			return cfg_default(CFG_PNO_SCAN_TIMER_REPEAT_VALUE);
1730*5113495bSYour Name 		}
1731*5113495bSYour Name 		return scan_obj->pno_cfg.scan_timer_repeat_value;
1732*5113495bSYour Name }
1733*5113495bSYour Name 
ucfg_scan_get_slow_scan_multiplier(struct wlan_objmgr_psoc * psoc)1734*5113495bSYour Name uint32_t ucfg_scan_get_slow_scan_multiplier(struct wlan_objmgr_psoc *psoc)
1735*5113495bSYour Name {
1736*5113495bSYour Name 		struct wlan_scan_obj *scan_obj;
1737*5113495bSYour Name 
1738*5113495bSYour Name 		scan_obj = wlan_psoc_get_scan_obj(psoc);
1739*5113495bSYour Name 		if (!scan_obj) {
1740*5113495bSYour Name 			scm_err("NULL scan obj");
1741*5113495bSYour Name 			return cfg_default(CFG_PNO_SLOW_SCAN_MULTIPLIER);
1742*5113495bSYour Name 		}
1743*5113495bSYour Name 		return scan_obj->pno_cfg.slow_scan_multiplier;
1744*5113495bSYour Name }
1745*5113495bSYour Name 
1746*5113495bSYour Name uint32_t
ucfg_scan_get_max_sched_scan_plan_interval(struct wlan_objmgr_psoc * psoc)1747*5113495bSYour Name ucfg_scan_get_max_sched_scan_plan_interval(struct wlan_objmgr_psoc *psoc)
1748*5113495bSYour Name {
1749*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1750*5113495bSYour Name 
1751*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1752*5113495bSYour Name 	if (!scan_obj) {
1753*5113495bSYour Name 		scm_err("Failed to get scan object");
1754*5113495bSYour Name 		return cfg_default(CFG_MAX_SCHED_SCAN_PLAN_INTERVAL);
1755*5113495bSYour Name 	}
1756*5113495bSYour Name 
1757*5113495bSYour Name 	return scan_obj->pno_cfg.max_sched_scan_plan_interval;
1758*5113495bSYour Name }
1759*5113495bSYour Name 
1760*5113495bSYour Name uint32_t
ucfg_scan_get_max_sched_scan_plan_iterations(struct wlan_objmgr_psoc * psoc)1761*5113495bSYour Name ucfg_scan_get_max_sched_scan_plan_iterations(struct wlan_objmgr_psoc *psoc)
1762*5113495bSYour Name {
1763*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1764*5113495bSYour Name 
1765*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1766*5113495bSYour Name 	if (!scan_obj) {
1767*5113495bSYour Name 		scm_err("Failed to get scan object");
1768*5113495bSYour Name 		return cfg_default(CFG_MAX_SCHED_SCAN_PLAN_ITERATIONS);
1769*5113495bSYour Name 	}
1770*5113495bSYour Name 
1771*5113495bSYour Name 	return scan_obj->pno_cfg.max_sched_scan_plan_iterations;
1772*5113495bSYour Name }
1773*5113495bSYour Name 
1774*5113495bSYour Name bool
ucfg_scan_get_user_config_sched_scan_plan(struct wlan_objmgr_psoc * psoc)1775*5113495bSYour Name ucfg_scan_get_user_config_sched_scan_plan(struct wlan_objmgr_psoc *psoc)
1776*5113495bSYour Name {
1777*5113495bSYour Name 	struct wlan_scan_obj *scan_obj;
1778*5113495bSYour Name 
1779*5113495bSYour Name 	scan_obj = wlan_psoc_get_scan_obj(psoc);
1780*5113495bSYour Name 	if (!scan_obj) {
1781*5113495bSYour Name 		scm_err("Failed to get scan object");
1782*5113495bSYour Name 		return cfg_default(CFG_MAX_SCHED_SCAN_PLAN_ITERATIONS);
1783*5113495bSYour Name 	}
1784*5113495bSYour Name 
1785*5113495bSYour Name 	return scan_obj->pno_cfg.user_config_sched_scan_plan;
1786*5113495bSYour Name }
1787*5113495bSYour Name #endif
1788