blob: 3a8e3ec9897a731df0d50fea2eba8310763a8f53 [file] [log] [blame]
Om Prakash Tripathi7e3f45d2016-12-28 16:58:54 +05301/*
Abhinav Kumarf9074e22019-01-03 15:07:49 +05302 * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
Om Prakash Tripathi7e3f45d2016-12-28 16:58:54 +05303 *
Srinivas Pitla39a92222018-10-05 10:52:48 +05304 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
Om Prakash Tripathi7e3f45d2016-12-28 16:58:54 +05307 *
Srinivas Pitla39a92222018-10-05 10:52:48 +05308 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Om Prakash Tripathi7e3f45d2016-12-28 16:58:54 +053015 */
16
17/*
18 * DOC: contains scan north bound interface definitions
19 */
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -080020
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +053021#include <scheduler_api.h>
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -080022#include <wlan_scan_ucfg_api.h>
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -080023#include <wlan_objmgr_global_obj.h>
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +053024#include <wlan_objmgr_cmn.h>
25#include <wlan_serialization_api.h>
26#include <wlan_scan_tgt_api.h>
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +053027#include <wlan_scan_utils_api.h>
28#include <wlan_reg_ucfg_api.h>
Ganesh Kondabattinidb183cc2017-07-27 11:42:33 +053029#include <wlan_reg_services_api.h>
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +053030#include <wlan_utility.h>
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +053031#include "../../core/src/wlan_scan_main.h"
32#include "../../core/src/wlan_scan_manager.h"
33#include "../../core/src/wlan_scan_cache_db.h"
Wu Gaodd58f632018-05-17 16:14:00 +080034#ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
Abhishek Singh9f6058d2017-04-25 13:47:31 +053035#include <wlan_pmo_obj_mgmt_api.h>
36#endif
Ganesh Kondabattinidb183cc2017-07-27 11:42:33 +053037#ifdef WLAN_POLICY_MGR_ENABLE
Yeshwanth Sriram Guntukaf70a37b2018-01-18 16:08:25 +053038#include <wlan_dfs_utils_api.h>
Ganesh Kondabattinidb183cc2017-07-27 11:42:33 +053039#include <wlan_policy_mgr_api.h>
40#endif
Sandeep Puligillaba6526d2018-04-05 01:10:13 -070041#include "cfg_ucfg_api.h"
Harprit Chhabada20ffac72018-08-03 12:30:34 -070042#include "wlan_extscan_api.h"
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -080043
Abhishek Singh4caf1a92017-02-21 15:01:08 +053044QDF_STATUS ucfg_scan_register_bcn_cb(struct wlan_objmgr_psoc *psoc,
45 update_beacon_cb cb, enum scan_cb_type type)
46{
47 return scm_scan_register_bcn_cb(psoc, cb, type);
48}
49
Abhishek Singh37bf2e02017-02-21 15:19:55 +053050qdf_list_t *ucfg_scan_get_result(struct wlan_objmgr_pdev *pdev,
51 struct scan_filter *filter)
52{
53 return scm_get_scan_result(pdev, filter);
54}
55
56QDF_STATUS ucfg_scan_db_iterate(struct wlan_objmgr_pdev *pdev,
57 scan_iterator_func func, void *arg)
58{
59 return scm_iterate_scan_db(pdev, func, arg);
60}
61
62QDF_STATUS ucfg_scan_purge_results(qdf_list_t *scan_list)
63{
64 return scm_purge_scan_results(scan_list);
65}
66
67QDF_STATUS ucfg_scan_flush_results(struct wlan_objmgr_pdev *pdev,
68 struct scan_filter *filter)
69{
70 return scm_flush_results(pdev, filter);
71}
72
73void ucfg_scan_filter_valid_channel(struct wlan_objmgr_pdev *pdev,
hque131d312019-11-21 17:55:27 +080074 uint32_t *chan_freq_list, uint32_t num_chan)
Abhishek Singh37bf2e02017-02-21 15:19:55 +053075{
hque131d312019-11-21 17:55:27 +080076 scm_filter_valid_channel(pdev, chan_freq_list, num_chan);
Abhishek Singh37bf2e02017-02-21 15:19:55 +053077}
78
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -080079QDF_STATUS ucfg_scan_init(void)
80{
81 QDF_STATUS status;
82
83 status = wlan_objmgr_register_psoc_create_handler(WLAN_UMAC_COMP_SCAN,
84 wlan_scan_psoc_created_notification, NULL);
85 if (QDF_IS_STATUS_ERROR(status)) {
86 scm_err("Failed to register psoc create handler");
87 goto fail_create_psoc;
88 }
89
90 status = wlan_objmgr_register_psoc_destroy_handler(WLAN_UMAC_COMP_SCAN,
91 wlan_scan_psoc_destroyed_notification, NULL);
Abhishek Singh8c6e82d2017-03-03 21:57:29 +053092 if (QDF_IS_STATUS_ERROR(status)) {
93 scm_err("Failed to create psoc delete handler");
94 goto fail_psoc_destroy;
95 }
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +053096 scm_debug("scan psoc create and delete handler registered with objmgr");
Abhishek Singh8c6e82d2017-03-03 21:57:29 +053097
98 status = wlan_objmgr_register_vdev_create_handler(WLAN_UMAC_COMP_SCAN,
99 wlan_scan_vdev_created_notification, NULL);
100 if (QDF_IS_STATUS_ERROR(status)) {
101 scm_err("Failed to register vdev create handler");
102 goto fail_pdev_create;
103 }
104
105 status = wlan_objmgr_register_vdev_destroy_handler(WLAN_UMAC_COMP_SCAN,
106 wlan_scan_vdev_destroyed_notification, NULL);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800107 if (QDF_IS_STATUS_SUCCESS(status)) {
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +0530108 scm_debug("scan vdev create and delete handler registered with objmgr");
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800109 return QDF_STATUS_SUCCESS;
110 }
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800111
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530112 scm_err("Failed to destroy vdev delete handler");
113 wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_SCAN,
114 wlan_scan_vdev_created_notification, NULL);
115fail_pdev_create:
116 wlan_objmgr_unregister_psoc_destroy_handler(WLAN_UMAC_COMP_SCAN,
117 wlan_scan_psoc_destroyed_notification, NULL);
118fail_psoc_destroy:
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800119 wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_SCAN,
120 wlan_scan_psoc_created_notification, NULL);
121fail_create_psoc:
122 return status;
123}
124
125QDF_STATUS ucfg_scan_deinit(void)
126{
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530127 QDF_STATUS status;
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800128
129 status = wlan_objmgr_unregister_psoc_create_handler(WLAN_UMAC_COMP_SCAN,
130 wlan_scan_psoc_created_notification, NULL);
131 if (status != QDF_STATUS_SUCCESS)
132 scm_err("Failed to unregister psoc create handler");
133
134 status = wlan_objmgr_unregister_psoc_destroy_handler(
135 WLAN_UMAC_COMP_SCAN,
136 wlan_scan_psoc_destroyed_notification, NULL);
137 if (status != QDF_STATUS_SUCCESS)
138 scm_err("Failed to unregister psoc delete handler");
139
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530140 status = wlan_objmgr_unregister_vdev_create_handler(WLAN_UMAC_COMP_SCAN,
141 wlan_scan_vdev_created_notification, NULL);
142 if (status != QDF_STATUS_SUCCESS)
143 scm_err("Failed to unregister vdev create handler");
144
145 status = wlan_objmgr_unregister_vdev_destroy_handler(
146 WLAN_UMAC_COMP_SCAN,
147 wlan_scan_vdev_destroyed_notification, NULL);
148 if (status != QDF_STATUS_SUCCESS)
149 scm_err("Failed to unregister vdev delete handler");
150
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800151 return status;
152}
153
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530154#ifdef FEATURE_WLAN_SCAN_PNO
155
156QDF_STATUS ucfg_scan_pno_start(struct wlan_objmgr_vdev *vdev,
157 struct pno_scan_req_params *req)
158{
159 struct scan_vdev_obj *scan_vdev_obj;
160 QDF_STATUS status;
161
162 scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
163 if (!scan_vdev_obj) {
164 scm_err("null scan_vdev_obj");
165 return QDF_STATUS_E_INVAL;
166 }
167 if (scan_vdev_obj->pno_in_progress) {
168 scm_err("pno already in progress");
169 return QDF_STATUS_E_ALREADY;
170 }
171
172 status = tgt_scan_pno_start(vdev, req);
173 if (QDF_IS_STATUS_ERROR(status))
174 scm_err("pno start failed");
175 else
176 scan_vdev_obj->pno_in_progress = true;
177
178 return status;
179}
180
181QDF_STATUS ucfg_scan_pno_stop(struct wlan_objmgr_vdev *vdev)
182{
183 struct scan_vdev_obj *scan_vdev_obj;
184 QDF_STATUS status;
185
186 scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
187 if (!scan_vdev_obj) {
188 scm_err("null scan_vdev_obj");
189 return QDF_STATUS_E_INVAL;
190 }
191 if (!scan_vdev_obj->pno_in_progress) {
Yeshwanth Sriram Guntuka0ab053e2018-08-23 18:25:28 +0530192 scm_debug("pno already stopped");
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530193 return QDF_STATUS_E_ALREADY;
194 }
195
196 status = tgt_scan_pno_stop(vdev, wlan_vdev_get_id(vdev));
197 if (QDF_IS_STATUS_ERROR(status))
198 scm_err("pno start failed");
199 else
200 scan_vdev_obj->pno_in_progress = false;
201
202 return status;
203}
204
205bool ucfg_scan_get_pno_in_progress(struct wlan_objmgr_vdev *vdev)
206{
207 struct scan_vdev_obj *scan_vdev_obj;
208
209 scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
210 if (!scan_vdev_obj) {
211 scm_err("null scan_vdev_obj");
212 return false;
213 }
214
215 return scan_vdev_obj->pno_in_progress;
216}
217
218bool ucfg_scan_get_pno_match(struct wlan_objmgr_vdev *vdev)
219{
220 struct scan_vdev_obj *scan_vdev_obj;
221
222 scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
223 if (!scan_vdev_obj) {
224 scm_err("null scan_vdev_obj");
225 return false;
226 }
227
228 return scan_vdev_obj->pno_match_evt_received;
229}
230
231static QDF_STATUS
Pragaspathi Thilagarajcc3af932018-11-28 00:10:18 +0530232wlan_pno_global_init(struct wlan_objmgr_psoc *psoc,
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +0530233 struct wlan_scan_obj *scan_obj)
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530234{
Varun Reddy Yeturuf56e5982017-09-06 13:38:38 -0700235 struct nlo_mawc_params *mawc_cfg;
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +0530236 struct pno_def_config *pno_def;
Varun Reddy Yeturuf56e5982017-09-06 13:38:38 -0700237
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +0530238 pno_def = &scan_obj->pno_cfg;
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530239 qdf_wake_lock_create(&pno_def->pno_wake_lock, "wlan_pno_wl");
Varun Reddy Yeturuf56e5982017-09-06 13:38:38 -0700240 mawc_cfg = &pno_def->mawc_params;
Pragaspathi Thilagarajcc3af932018-11-28 00:10:18 +0530241 pno_def->channel_prediction = cfg_get(psoc, CFG_PNO_CHANNEL_PREDICTION);
242 pno_def->top_k_num_of_channels =
243 cfg_get(psoc, CFG_TOP_K_NUM_OF_CHANNELS);
244 pno_def->stationary_thresh = cfg_get(psoc, CFG_STATIONARY_THRESHOLD);
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530245 pno_def->channel_prediction_full_scan =
Pragaspathi Thilagarajcc3af932018-11-28 00:10:18 +0530246 cfg_get(psoc, CFG_CHANNEL_PREDICTION_SCAN_TIMER);
247 pno_def->adaptive_dwell_mode =
248 cfg_get(psoc, CFG_ADAPTIVE_PNOSCAN_DWELL_MODE);
249 pno_def->dfs_chnl_scan_enabled =
250 cfg_get(psoc, CFG_ENABLE_DFS_PNO_CHNL_SCAN);
251 pno_def->scan_support_enabled =
252 cfg_get(psoc, CFG_PNO_SCAN_SUPPORT);
253 pno_def->scan_timer_repeat_value =
254 cfg_get(psoc, CFG_PNO_SCAN_TIMER_REPEAT_VALUE);
255 pno_def->slow_scan_multiplier =
256 cfg_get(psoc, CFG_PNO_SLOW_SCAN_MULTIPLIER);
257 pno_def->scan_backoff_multiplier =
258 cfg_get(psoc, CFG_SCAN_BACKOFF_MULTIPLIER);
Pragaspathi Thilagaraj9d9a3c42019-02-01 11:53:59 +0530259 pno_def->max_sched_scan_plan_interval =
260 cfg_get(psoc, CFG_MAX_SCHED_SCAN_PLAN_INTERVAL);
261 pno_def->max_sched_scan_plan_iterations =
262 cfg_get(psoc, CFG_MAX_SCHED_SCAN_PLAN_ITERATIONS);
Pragaspathi Thilagarajcc3af932018-11-28 00:10:18 +0530263
264 mawc_cfg->enable = cfg_get(psoc, CFG_MAWC_NLO_ENABLED);
265 mawc_cfg->exp_backoff_ratio =
266 cfg_get(psoc, CFG_MAWC_NLO_EXP_BACKOFF_RATIO);
267 mawc_cfg->init_scan_interval =
268 cfg_get(psoc, CFG_MAWC_NLO_INIT_SCAN_INTERVAL);
269 mawc_cfg->max_scan_interval =
270 cfg_get(psoc, CFG_MAWC_NLO_MAX_SCAN_INTERVAL);
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530271
272 return QDF_STATUS_SUCCESS;
273}
274
275static QDF_STATUS
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +0530276wlan_pno_global_deinit(struct wlan_scan_obj *scan_obj)
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530277{
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +0530278 qdf_wake_lock_destroy(&scan_obj->pno_cfg.pno_wake_lock);
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530279
280 return QDF_STATUS_SUCCESS;
281}
282
gaurank kathpalia29e7f152017-12-22 12:38:57 +0530283#ifdef WLAN_POLICY_MGR_ENABLE
284/*
285 * ucfg_scan_update_pno_dwell_time() - update active and passive dwell time
286 * depending on active concurrency modes
287 * @vdev: vdev object pointer
288 * @req: scan request
289 *
290 * Return: void
291 */
292static void ucfg_scan_update_pno_dwell_time(struct wlan_objmgr_vdev *vdev,
293 struct pno_scan_req_params *req, struct scan_default_params *scan_def)
294{
295 bool sap_or_p2p_present;
296 struct wlan_objmgr_psoc *psoc;
297
298 psoc = wlan_vdev_get_psoc(vdev);
299
300 if (!psoc)
301 return;
302
303 sap_or_p2p_present = policy_mgr_mode_specific_connection_count(
Tushnim Bhattacharyyaf9409182018-03-28 17:23:55 -0700304 psoc, PM_SAP_MODE, NULL) ||
gaurank kathpalia29e7f152017-12-22 12:38:57 +0530305 policy_mgr_mode_specific_connection_count(
Tushnim Bhattacharyyaf9409182018-03-28 17:23:55 -0700306 psoc, PM_P2P_GO_MODE, NULL) ||
gaurank kathpalia29e7f152017-12-22 12:38:57 +0530307 policy_mgr_mode_specific_connection_count(
Tushnim Bhattacharyyaf9409182018-03-28 17:23:55 -0700308 psoc, PM_P2P_CLIENT_MODE, NULL);
gaurank kathpalia29e7f152017-12-22 12:38:57 +0530309
310 if (sap_or_p2p_present) {
311 req->active_dwell_time = scan_def->conc_active_dwell;
312 req->passive_dwell_time = scan_def->conc_passive_dwell;
313 }
314
315}
316#else
317static inline void ucfg_scan_update_pno_dwell_time(struct wlan_objmgr_vdev *vdev,
318 struct pno_scan_req_params *req, struct scan_default_params *scan_def){}
319#endif
320
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530321QDF_STATUS
322ucfg_scan_get_pno_def_params(struct wlan_objmgr_vdev *vdev,
323 struct pno_scan_req_params *req)
324{
325 struct scan_default_params *scan_def;
Sandeep Puligilla659fecb2018-05-02 18:17:44 -0700326 struct wlan_scan_obj *scan;
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530327 struct pno_def_config *pno_def;
328
Sandeep Puligilla659fecb2018-05-02 18:17:44 -0700329 if (!vdev || !req) {
330 scm_err("vdev: 0x%pK, req: 0x%pK",
331 vdev, req);
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530332 return QDF_STATUS_E_INVAL;
333 }
334
Sandeep Puligilla659fecb2018-05-02 18:17:44 -0700335 scan = wlan_vdev_get_scan_obj(vdev);
336 if (!scan) {
337 scm_err("scan is NULL");
338 return QDF_STATUS_E_INVAL;
339 }
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530340 scan_def = wlan_vdev_get_def_scan_params(vdev);
Naveen Rawat6f7ddca2018-01-18 10:53:45 -0800341 if (!scan_def) {
342 scm_err("wlan_vdev_get_def_scan_params returned NULL");
343 return QDF_STATUS_E_NULL_VALUE;
344 }
345
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530346 pno_def = &scan->pno_cfg;
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530347 req->active_dwell_time = scan_def->active_dwell;
348 req->passive_dwell_time = scan_def->passive_dwell;
hangtian71a0cfb2018-08-24 10:54:56 +0800349 req->scan_random.randomize = scan_def->enable_mac_spoofing;
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530350
gaurank kathpalia29e7f152017-12-22 12:38:57 +0530351 /*
352 * Update active and passive dwell time depending
353 * upon the present active concurrency mode
354 */
355 ucfg_scan_update_pno_dwell_time(vdev, req, scan_def);
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530356 req->adaptive_dwell_mode = pno_def->adaptive_dwell_mode;
Dustin Brown03f2ec02018-05-31 14:02:44 -0700357 req->pno_channel_prediction = pno_def->channel_prediction;
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530358 req->top_k_num_of_channels = pno_def->top_k_num_of_channels;
359 req->stationary_thresh = pno_def->stationary_thresh;
360 req->channel_prediction_full_scan =
361 pno_def->channel_prediction_full_scan;
Varun Reddy Yeturuf56e5982017-09-06 13:38:38 -0700362 req->mawc_params.vdev_id = wlan_vdev_get_id(vdev);
363 qdf_mem_copy(&req->mawc_params, &pno_def->mawc_params,
364 sizeof(req->mawc_params));
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530365
366 return QDF_STATUS_SUCCESS;
367}
368
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530369QDF_STATUS
370ucfg_scan_register_pno_cb(struct wlan_objmgr_psoc *psoc,
371 scan_event_handler event_cb, void *arg)
372{
373 struct wlan_scan_obj *scan;
374
375 if (!psoc) {
376 scm_err("null psoc");
377 return QDF_STATUS_E_INVAL;
378 }
sheenam mongad8974032019-06-12 16:00:38 +0530379
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530380 scan = wlan_psoc_get_scan_obj(psoc);
sheenam mongad8974032019-06-12 16:00:38 +0530381 if (!scan) {
382 scm_err("scan object null");
383 return QDF_STATUS_E_INVAL;
384 }
385
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530386 qdf_spin_lock_bh(&scan->lock);
387 scan->pno_cfg.pno_cb.func = event_cb;
388 scan->pno_cfg.pno_cb.arg = arg;
389 qdf_spin_unlock_bh(&scan->lock);
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +0530390 scm_debug("event_cb: 0x%pK, arg: 0x%pK", event_cb, arg);
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530391
392 return QDF_STATUS_SUCCESS;
393}
394
395#else
396
397static inline QDF_STATUS
Pragaspathi Thilagarajcc3af932018-11-28 00:10:18 +0530398wlan_pno_global_init(struct wlan_objmgr_psoc *psoc,
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +0530399 struct wlan_scan_obj *scan_obj)
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530400{
401 return QDF_STATUS_SUCCESS;
402}
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +0530403
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530404static inline QDF_STATUS
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +0530405wlan_pno_global_deinit(struct wlan_scan_obj *scan_obj)
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530406{
407 return QDF_STATUS_SUCCESS;
408}
409
Abhishek Singh8c6e82d2017-03-03 21:57:29 +0530410#endif
411
Om Prakash Tripathi8a4564f2018-04-10 14:54:54 +0530412QDF_STATUS
413ucfg_scan_set_custom_scan_chan_list(struct wlan_objmgr_pdev *pdev,
Abhishek Singhcd0a9fd2019-01-29 17:56:37 +0530414 struct chan_list *chan_list)
Om Prakash Tripathi8a4564f2018-04-10 14:54:54 +0530415{
416 uint8_t pdev_id;
417 struct wlan_scan_obj *scan_obj;
418
419 if (!pdev || !chan_list) {
420 scm_warn("pdev: 0x%pK, chan_list: 0x%pK", pdev, chan_list);
421 return QDF_STATUS_E_NULL_VALUE;
422 }
423 pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
424 scan_obj = wlan_pdev_get_scan_obj(pdev);
425
426 qdf_mem_copy(&scan_obj->pdev_info[pdev_id].custom_chan_list,
427 chan_list, sizeof(*chan_list));
428
429 return QDF_STATUS_SUCCESS;
430}
431
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530432QDF_STATUS
433ucfg_scan_start(struct scan_start_request *req)
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800434{
Krunal Soni5899b0a2017-04-18 13:44:33 -0700435 struct scheduler_msg msg = {0};
Sandeep Puligillad14a1892017-03-06 19:52:55 -0800436 QDF_STATUS status;
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800437
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530438 if (!req || !req->vdev) {
Naveen Rawat6f7ddca2018-01-18 10:53:45 -0800439 scm_err("req or vdev within req is NULL");
Om Prakash Tripathif527f162017-04-11 17:52:12 +0530440 if (req)
441 scm_scan_free_scan_request_mem(req);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530442 return QDF_STATUS_E_NULL_VALUE;
443 }
Abhishek Singh65c4be72017-10-12 11:06:33 +0530444
Abhishek Singh502095b2018-11-21 14:34:49 +0530445 if (!scm_is_scan_allowed(req->vdev)) {
446 scm_err("scan disabled, rejecting the scan req");
447 scm_scan_free_scan_request_mem(req);
448 return QDF_STATUS_E_AGAIN;
449 }
450
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +0530451 scm_debug("reqid: %d, scanid: %d, vdevid: %d",
Abhishek Singhcd0a9fd2019-01-29 17:56:37 +0530452 req->scan_req.scan_req_id, req->scan_req.scan_id,
453 req->scan_req.vdev_id);
Yeshwanth Sriram Guntukaf70a37b2018-01-18 16:08:25 +0530454
Om Prakash Tripathif527f162017-04-11 17:52:12 +0530455 /* Try to get vdev reference. Return if reference could
456 * not be taken. Reference will be released once scan
457 * request handling completes along with free of @req.
458 */
459 status = wlan_objmgr_vdev_try_get_ref(req->vdev, WLAN_SCAN_ID);
460 if (QDF_IS_STATUS_ERROR(status)) {
461 scm_info("unable to get reference");
462 scm_scan_free_scan_request_mem(req);
463 return status;
464 }
465
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530466 msg.bodyptr = req;
467 msg.callback = scm_scan_start_req;
Om Prakash Tripathi62d03802017-06-06 03:17:12 +0530468 msg.flush_callback = scm_scan_start_flush_callback;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530469
gaurank kathpaliad0499512018-08-28 19:34:37 +0530470 status = scheduler_post_message(QDF_MODULE_ID_OS_IF,
471 QDF_MODULE_ID_SCAN,
472 QDF_MODULE_ID_OS_IF, &msg);
Om Prakash Tripathif527f162017-04-11 17:52:12 +0530473 if (QDF_IS_STATUS_ERROR(status)) {
474 wlan_objmgr_vdev_release_ref(req->vdev, WLAN_SCAN_ID);
Om Prakash Tripathif527f162017-04-11 17:52:12 +0530475 scm_scan_free_scan_request_mem(req);
Sandeep Puligillad14a1892017-03-06 19:52:55 -0800476 }
477
478 return status;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530479}
480
Abhishek Singh502095b2018-11-21 14:34:49 +0530481QDF_STATUS ucfg_scan_psoc_set_enable(struct wlan_objmgr_psoc *psoc,
482 enum scan_disable_reason reason)
Abhishek Singh65c4be72017-10-12 11:06:33 +0530483{
484 struct wlan_scan_obj *scan_obj;
485
486 scan_obj = wlan_psoc_get_scan_obj(psoc);
487 if (!scan_obj) {
488 scm_err("Failed to get scan object");
489 return QDF_STATUS_E_NULL_VALUE;
490 }
Abhishek Singh502095b2018-11-21 14:34:49 +0530491
492 scan_obj->scan_disabled &= ~reason;
493 scm_debug("Psoc scan_disabled %x", scan_obj->scan_disabled);
Abhishek Singh65c4be72017-10-12 11:06:33 +0530494
495 return QDF_STATUS_SUCCESS;
496}
497
Abhishek Singh502095b2018-11-21 14:34:49 +0530498QDF_STATUS ucfg_scan_psoc_set_disable(struct wlan_objmgr_psoc *psoc,
499 enum scan_disable_reason reason)
Abhishek Singh65c4be72017-10-12 11:06:33 +0530500{
501 struct wlan_scan_obj *scan_obj;
502
503 scan_obj = wlan_psoc_get_scan_obj(psoc);
504 if (!scan_obj) {
505 scm_err("Failed to get scan object");
Abhishek Singh502095b2018-11-21 14:34:49 +0530506 return QDF_STATUS_E_NULL_VALUE;
Abhishek Singh65c4be72017-10-12 11:06:33 +0530507 }
Abhishek Singh502095b2018-11-21 14:34:49 +0530508
509 scan_obj->scan_disabled |= reason;
510
511 scm_debug("Psoc scan_disabled %x", scan_obj->scan_disabled);
512
513 return QDF_STATUS_SUCCESS;
Abhishek Singh65c4be72017-10-12 11:06:33 +0530514}
515
Abhishek Singh502095b2018-11-21 14:34:49 +0530516
517QDF_STATUS ucfg_scan_vdev_set_enable(struct wlan_objmgr_vdev *vdev,
518 enum scan_disable_reason reason)
519{
520 struct scan_vdev_obj *scan_vdev_obj;
521
522 scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
523 if (!scan_vdev_obj) {
524 scm_err("null scan_vdev_obj");
525 return QDF_STATUS_E_NULL_VALUE;
526 }
527
528 scan_vdev_obj->scan_disabled &= ~reason;
529
530 scm_debug("Vdev scan_disabled %x", scan_vdev_obj->scan_disabled);
531
532 return QDF_STATUS_SUCCESS;
533}
534
535QDF_STATUS ucfg_scan_vdev_set_disable(struct wlan_objmgr_vdev *vdev,
536 enum scan_disable_reason reason)
537{
538 struct scan_vdev_obj *scan_vdev_obj;
539
540 scan_vdev_obj = wlan_get_vdev_scan_obj(vdev);
541 if (!scan_vdev_obj) {
542 scm_err("null scan_vdev_obj");
543 return QDF_STATUS_E_NULL_VALUE;
544 }
545
546 scan_vdev_obj->scan_disabled |= reason;
547
548 scm_debug("Vdev scan_disabled %x", scan_vdev_obj->scan_disabled);
549
550 return QDF_STATUS_SUCCESS;
551}
552
553
Yeshwanth Sriram Guntukaf70a37b2018-01-18 16:08:25 +0530554QDF_STATUS ucfg_scan_set_miracast(
555 struct wlan_objmgr_psoc *psoc, bool enable)
556{
557 struct wlan_scan_obj *scan_obj;
558
559 scan_obj = wlan_psoc_get_scan_obj(psoc);
560 if (!scan_obj) {
561 scm_err("Failed to get scan object");
562 return QDF_STATUS_E_NULL_VALUE;
563 }
564 scan_obj->miracast_enabled = enable;
565 scm_debug("set miracast_enable to %d", scan_obj->miracast_enabled);
566
567 return QDF_STATUS_SUCCESS;
568}
569
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +0530570QDF_STATUS
571ucfg_scan_set_wide_band_scan(struct wlan_objmgr_pdev *pdev, bool enable)
572{
573 uint8_t pdev_id;
574 struct wlan_scan_obj *scan_obj;
575
576 if (!pdev) {
577 scm_warn("null vdev");
578 return QDF_STATUS_E_NULL_VALUE;
579 }
580 pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
581 scan_obj = wlan_pdev_get_scan_obj(pdev);
Harprit Chhabada2de9f012018-10-30 15:10:52 -0700582 if (!scan_obj)
583 return QDF_STATUS_E_FAILURE;
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +0530584
585 scm_debug("set wide_band_scan to %d", enable);
586 scan_obj->pdev_info[pdev_id].wide_band_scan = enable;
587
588 return QDF_STATUS_SUCCESS;
589}
590
591bool ucfg_scan_get_wide_band_scan(struct wlan_objmgr_pdev *pdev)
592{
593 uint8_t pdev_id;
594 struct wlan_scan_obj *scan_obj;
595
596 if (!pdev) {
597 scm_warn("null vdev");
598 return QDF_STATUS_E_NULL_VALUE;
599 }
600 pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
601 scan_obj = wlan_pdev_get_scan_obj(pdev);
Harprit Chhabada2de9f012018-10-30 15:10:52 -0700602 if (!scan_obj)
603 return QDF_STATUS_E_FAILURE;
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +0530604
605 return scan_obj->pdev_info[pdev_id].wide_band_scan;
606}
Abhishek Singh65c4be72017-10-12 11:06:33 +0530607
Basamma Yakkanahalliab48ce32018-07-06 18:49:19 +0530608#ifdef WLAN_DFS_CHAN_HIDDEN_SSID
609QDF_STATUS
610ucfg_scan_config_hidden_ssid_for_bssid(struct wlan_objmgr_pdev *pdev,
611 uint8_t *bssid, struct wlan_ssid *ssid)
612{
613 uint8_t pdev_id;
614 struct wlan_scan_obj *scan_obj;
615
616 if (!pdev) {
617 scm_warn("null vdev");
618 return QDF_STATUS_E_NULL_VALUE;
619 }
620 pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
621 scan_obj = wlan_pdev_get_scan_obj(pdev);
Harprit Chhabada2de9f012018-10-30 15:10:52 -0700622 if (!scan_obj)
623 return QDF_STATUS_E_FAILURE;
Basamma Yakkanahalliab48ce32018-07-06 18:49:19 +0530624
625 scm_debug("Configure bsssid:%pM ssid:%.*s",
626 bssid, ssid->length, ssid->ssid);
627 qdf_mem_copy(scan_obj->pdev_info[pdev_id].conf_bssid,
628 bssid, QDF_MAC_ADDR_SIZE);
629 scan_obj->pdev_info[pdev_id].conf_ssid.length = ssid->length;
630 qdf_mem_copy(scan_obj->pdev_info[pdev_id].conf_ssid.ssid,
631 ssid->ssid,
632 scan_obj->pdev_info[pdev_id].conf_ssid.length);
633
634 return QDF_STATUS_SUCCESS;
635}
636#endif /* WLAN_DFS_CHAN_HIDDEN_SSID */
637
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530638QDF_STATUS
639ucfg_scan_cancel(struct scan_cancel_request *req)
640{
Krunal Soni5899b0a2017-04-18 13:44:33 -0700641 struct scheduler_msg msg = {0};
Sandeep Puligillad14a1892017-03-06 19:52:55 -0800642 QDF_STATUS status;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530643
644 if (!req || !req->vdev) {
Naveen Rawat6f7ddca2018-01-18 10:53:45 -0800645 scm_err("req or vdev within req is NULL");
Sandeep Puligillad14a1892017-03-06 19:52:55 -0800646 if (req)
647 qdf_mem_free(req);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530648 return QDF_STATUS_E_NULL_VALUE;
649 }
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +0530650 scm_debug("reqid: %d, scanid: %d, vdevid: %d, type: %d",
651 req->cancel_req.requester, req->cancel_req.scan_id,
652 req->cancel_req.vdev_id, req->cancel_req.req_type);
Om Prakash Tripathif527f162017-04-11 17:52:12 +0530653
Dustin Brownc2fa9512017-11-27 15:29:36 -0800654 status = wlan_objmgr_vdev_try_get_ref(req->vdev, WLAN_SCAN_ID);
655 if (QDF_IS_STATUS_ERROR(status)) {
656 scm_info("Failed to get vdev ref; status:%d", status);
657 goto req_free;
658 }
Om Prakash Tripathif527f162017-04-11 17:52:12 +0530659
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530660 msg.bodyptr = req;
661 msg.callback = scm_scan_cancel_req;
Om Prakash Tripathi62d03802017-06-06 03:17:12 +0530662 msg.flush_callback = scm_scan_cancel_flush_callback;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530663
gaurank kathpaliad0499512018-08-28 19:34:37 +0530664 status = scheduler_post_message(QDF_MODULE_ID_OS_IF,
665 QDF_MODULE_ID_SCAN,
666 QDF_MODULE_ID_OS_IF, &msg);
Madhvapathi Sriram1397a332018-12-19 12:50:25 +0530667 if (QDF_IS_STATUS_ERROR(status))
Dustin Brownc2fa9512017-11-27 15:29:36 -0800668 goto vdev_put;
Sandeep Puligillad14a1892017-03-06 19:52:55 -0800669
Dustin Brownc2fa9512017-11-27 15:29:36 -0800670 return QDF_STATUS_SUCCESS;
671
672vdev_put:
673 wlan_objmgr_vdev_release_ref(req->vdev, WLAN_SCAN_ID);
674
675req_free:
676 qdf_mem_free(req);
677
Sandeep Puligillad14a1892017-03-06 19:52:55 -0800678 return status;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530679}
680
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530681QDF_STATUS
682ucfg_scan_cancel_sync(struct scan_cancel_request *req)
683{
684 QDF_STATUS status;
685 bool cancel_vdev = false, cancel_pdev = false;
686 struct wlan_objmgr_vdev *vdev;
687 struct wlan_objmgr_pdev *pdev;
688 uint32_t max_wait_iterations = SCM_CANCEL_SCAN_WAIT_ITERATION;
689 qdf_event_t cancel_scan_event;
690
691 if (!req || !req->vdev) {
Naveen Rawat6f7ddca2018-01-18 10:53:45 -0800692 scm_err("req or vdev within req is NULL");
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530693 if (req)
694 qdf_mem_free(req);
695 return QDF_STATUS_E_NULL_VALUE;
696 }
697
698 if (req->cancel_req.req_type ==
699 WLAN_SCAN_CANCEL_PDEV_ALL)
700 cancel_pdev = true;
701 else if (req->cancel_req.req_type ==
702 WLAN_SCAN_CANCEL_VDEV_ALL)
703 cancel_vdev = true;
704
705 vdev = req->vdev;
706 status = ucfg_scan_cancel(req);
Madhvapathi Sriram1397a332018-12-19 12:50:25 +0530707 if (QDF_IS_STATUS_ERROR(status))
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530708 return status;
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530709
Harprit Chhabada61851e72018-09-12 15:37:10 -0700710 memset(&cancel_scan_event, 0, sizeof(cancel_scan_event));
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530711 /*
712 * If cancel req is to cancel all scan of pdev or vdev
Jeff Johnson090ee922018-05-12 13:22:27 -0700713 * wait until all scan of pdev or vdev get cancelled
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530714 */
715 qdf_event_create(&cancel_scan_event);
716 qdf_event_reset(&cancel_scan_event);
717
718 if (cancel_pdev) {
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530719 pdev = wlan_vdev_get_pdev(vdev);
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530720 while ((ucfg_scan_get_pdev_status(pdev) !=
721 SCAN_NOT_IN_PROGRESS) && max_wait_iterations) {
722 scm_debug("wait for all pdev scan to get complete");
723 qdf_wait_single_event(&cancel_scan_event,
Om Prakash Tripathifeecb9f2019-02-19 16:56:32 +0530724 SCM_CANCEL_SCAN_WAIT_TIME);
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530725 max_wait_iterations--;
726 }
727 } else if (cancel_vdev) {
728 while ((ucfg_scan_get_vdev_status(vdev) !=
729 SCAN_NOT_IN_PROGRESS) && max_wait_iterations) {
730 scm_debug("wait for all vdev scan to get complete");
731 qdf_wait_single_event(&cancel_scan_event,
Om Prakash Tripathifeecb9f2019-02-19 16:56:32 +0530732 SCM_CANCEL_SCAN_WAIT_TIME);
Abhishek Singhf95b9e42017-04-25 12:12:01 +0530733 max_wait_iterations--;
734 }
735 }
736
737 qdf_event_destroy(&cancel_scan_event);
738
739 if (!max_wait_iterations) {
740 scm_err("Failed to wait for scans to get complete");
741 return QDF_STATUS_E_TIMEOUT;
742 }
743
744 return status;
745}
746
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530747wlan_scan_requester
748ucfg_scan_register_requester(struct wlan_objmgr_psoc *psoc,
749 uint8_t *name, scan_event_handler event_cb, void *arg)
750{
751 int i, j;
752 struct wlan_scan_obj *scan;
753 struct scan_requester_info *requesters;
754 wlan_scan_requester requester = {0};
755
756 if (!psoc) {
757 scm_err("null psoc");
758 return 0;
759 }
760 scan = wlan_psoc_get_scan_obj(psoc);
Harprit Chhabada2de9f012018-10-30 15:10:52 -0700761 if (!scan)
762 return 0;
763
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530764 requesters = scan->requesters;
765 qdf_spin_lock_bh(&scan->lock);
766 for (i = 0; i < WLAN_MAX_REQUESTORS; ++i) {
767 if (requesters[i].requester == 0) {
768 requesters[i].requester =
769 WLAN_SCAN_REQUESTER_ID_PREFIX | i;
770 j = 0;
771 while (name[j] && (j < (WLAN_MAX_MODULE_NAME - 1))) {
772 requesters[i].module[j] = name[j];
773 ++j;
774 }
775 requesters[i].module[j] = 0;
776 requesters[i].ev_handler.func = event_cb;
777 requesters[i].ev_handler.arg = arg;
778 requester = requesters[i].requester;
779 break;
780 }
781 }
782 qdf_spin_unlock_bh(&scan->lock);
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +0530783 scm_debug("module: %s, event_cb: 0x%pK, arg: 0x%pK, reqid: %d",
784 name, event_cb, arg, requester);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530785
786 return requester;
787}
788
789void
790ucfg_scan_unregister_requester(struct wlan_objmgr_psoc *psoc,
791 wlan_scan_requester requester)
792{
Abhishek Singh8d80aa82018-11-01 09:56:26 +0530793 int idx;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530794 struct wlan_scan_obj *scan;
795 struct scan_requester_info *requesters;
796
Abhishek Singh8d80aa82018-11-01 09:56:26 +0530797 idx = requester & WLAN_SCAN_REQUESTER_ID_PREFIX;
798 if (idx != WLAN_SCAN_REQUESTER_ID_PREFIX) {
799 scm_err("prefix didn't match for requester id %d", requester);
800 return;
801 }
802
803 idx = requester & WLAN_SCAN_REQUESTER_ID_MASK;
Paul Zhang8b7ea682017-11-30 12:15:46 +0800804 if (idx >= WLAN_MAX_REQUESTORS) {
Abhishek Singh8d80aa82018-11-01 09:56:26 +0530805 scm_err("requester id %d greater than max value", requester);
Paul Zhang8b7ea682017-11-30 12:15:46 +0800806 return;
807 }
808
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530809 if (!psoc) {
810 scm_err("null psoc");
811 return;
812 }
813 scan = wlan_psoc_get_scan_obj(psoc);
Harprit Chhabada2de9f012018-10-30 15:10:52 -0700814 if (!scan)
815 return;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530816 requesters = scan->requesters;
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +0530817 scm_debug("reqid: %d", requester);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530818
819 qdf_spin_lock_bh(&scan->lock);
820 requesters[idx].requester = 0;
821 requesters[idx].module[0] = 0;
822 requesters[idx].ev_handler.func = NULL;
823 requesters[idx].ev_handler.arg = NULL;
824 qdf_spin_unlock_bh(&scan->lock);
825}
826
827uint8_t*
828ucfg_get_scan_requester_name(struct wlan_objmgr_psoc *psoc,
829 wlan_scan_requester requester)
830{
Paul Zhang8b7ea682017-11-30 12:15:46 +0800831 int idx = requester & WLAN_SCAN_REQUESTER_ID_MASK;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530832 struct wlan_scan_obj *scan;
833 struct scan_requester_info *requesters;
834
835 if (!psoc) {
836 scm_err("null psoc");
837 return "null";
838 }
839 scan = wlan_psoc_get_scan_obj(psoc);
Harprit Chhabada2de9f012018-10-30 15:10:52 -0700840 if (!scan)
841 return "null";
842
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530843 requesters = scan->requesters;
844
845 if ((idx < WLAN_MAX_REQUESTORS) &&
846 (requesters[idx].requester == requester)) {
847 return requesters[idx].module;
848 }
849
850 return (uint8_t *)"unknown";
851}
852
853wlan_scan_id
854ucfg_scan_get_scan_id(struct wlan_objmgr_psoc *psoc)
855{
856 wlan_scan_id id;
857 struct wlan_scan_obj *scan;
858
859 if (!psoc) {
860 QDF_ASSERT(0);
861 scm_err("null psoc");
862 return 0;
863 }
sheenam mongad8974032019-06-12 16:00:38 +0530864
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530865 scan = wlan_psoc_get_scan_obj(psoc);
sheenam mongad8974032019-06-12 16:00:38 +0530866 if (!scan) {
867 scm_err("scan object null");
868 return 0;
869 }
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530870
871 id = qdf_atomic_inc_return(&scan->scan_ids);
872 id = id & WLAN_SCAN_ID_MASK;
873 /* Mark this scan request as triggered by host
874 * by setting WLAN_HOST_SCAN_REQ_ID_PREFIX flag.
875 */
876 id = id | WLAN_HOST_SCAN_REQ_ID_PREFIX;
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +0530877 scm_debug("scan_id: 0x%x", id);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530878
879 return id;
880}
881
882static QDF_STATUS
883scm_add_scan_event_handler(struct pdev_scan_ev_handler *pdev_ev_handler,
884 scan_event_handler event_cb, void *arg)
885{
886 struct cb_handler *cb_handler;
887 uint32_t handler_cnt = pdev_ev_handler->handler_cnt;
888
889 /* Assign next available slot to this registration request */
890 cb_handler = &(pdev_ev_handler->cb_handlers[handler_cnt]);
891 cb_handler->func = event_cb;
892 cb_handler->arg = arg;
893 pdev_ev_handler->handler_cnt++;
894
895 return QDF_STATUS_SUCCESS;
896}
897
898QDF_STATUS
Om Prakash Tripathid088a8a2017-04-04 17:12:51 +0530899ucfg_scan_register_event_handler(struct wlan_objmgr_pdev *pdev,
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530900 scan_event_handler event_cb, void *arg)
901{
902 uint32_t idx;
903 struct wlan_scan_obj *scan;
904 struct pdev_scan_ev_handler *pdev_ev_handler;
905 struct cb_handler *cb_handler;
906
907 /* scan event handler call back can't be NULL */
Om Prakash Tripathid088a8a2017-04-04 17:12:51 +0530908 if (!pdev || !event_cb) {
Jeff Johnson878533e2017-09-18 10:07:54 -0700909 scm_err("pdev: %pK, event_cb: %pK", pdev, event_cb);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530910 return QDF_STATUS_E_NULL_VALUE;
911 }
912
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +0530913 scm_debug("pdev: %pK, event_cb: %pK, arg: %pK\n", pdev, event_cb, arg);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530914
Om Prakash Tripathid088a8a2017-04-04 17:12:51 +0530915 scan = wlan_pdev_get_scan_obj(pdev);
916 pdev_ev_handler = wlan_pdev_get_pdev_scan_ev_handlers(pdev);
Om Prakash Tripathi510a27c2019-03-01 11:53:18 +0530917 if (!pdev_ev_handler) {
918 scm_err("null pdev_ev_handler");
919 return QDF_STATUS_E_NULL_VALUE;
920 }
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530921 cb_handler = &(pdev_ev_handler->cb_handlers[0]);
922
923 qdf_spin_lock_bh(&scan->lock);
924 /* Ensure its not a duplicate registration request */
925 for (idx = 0; idx < MAX_SCAN_EVENT_HANDLERS_PER_PDEV;
926 idx++, cb_handler++) {
927 if ((cb_handler->func == event_cb) &&
928 (cb_handler->arg == arg)) {
929 qdf_spin_unlock_bh(&scan->lock);
Yeshwanth Sriram Guntuka0ab053e2018-08-23 18:25:28 +0530930 scm_debug("func: %pK, arg: %pK already exists",
931 event_cb, arg);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530932 return QDF_STATUS_SUCCESS;
933 }
934 }
935
936 QDF_ASSERT(pdev_ev_handler->handler_cnt <
937 MAX_SCAN_EVENT_HANDLERS_PER_PDEV);
938
939 if (pdev_ev_handler->handler_cnt >= MAX_SCAN_EVENT_HANDLERS_PER_PDEV) {
940 qdf_spin_unlock_bh(&scan->lock);
941 scm_warn("No more registrations possible");
942 return QDF_STATUS_E_NOMEM;
943 }
944
945 scm_add_scan_event_handler(pdev_ev_handler, event_cb, arg);
946 qdf_spin_unlock_bh(&scan->lock);
947
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +0530948 scm_debug("event_cb: 0x%pK, arg: 0x%pK", event_cb, arg);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530949
950 return QDF_STATUS_SUCCESS;
951}
952
953static QDF_STATUS
Sandeep Puligillaba6526d2018-04-05 01:10:13 -0700954wlan_scan_global_init(struct wlan_objmgr_psoc *psoc,
955 struct wlan_scan_obj *scan_obj)
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +0530956{
Abhishek Singh502095b2018-11-21 14:34:49 +0530957 scan_obj->scan_disabled = 0;
Abhinav Kumarf9074e22019-01-03 15:07:49 +0530958 scan_obj->drop_bcn_on_chan_mismatch =
959 cfg_get(psoc, CFG_DROP_BCN_ON_CHANNEL_MISMATCH);
Om Prakash Tripathi339dc262018-02-08 15:23:20 +0530960 scan_obj->disable_timeout = false;
Sandeep Puligillaba6526d2018-04-05 01:10:13 -0700961 scan_obj->scan_def.active_dwell =
962 cfg_get(psoc, CFG_ACTIVE_MAX_CHANNEL_TIME);
gaurank kathpalia575539a2019-01-07 17:23:37 +0530963 /* the ini is disallow DFS channel scan if ini is 1, so negate that */
964 scan_obj->scan_def.allow_dfs_chan_in_first_scan =
965 !cfg_get(psoc, CFG_INITIAL_NO_DFS_SCAN);
966 scan_obj->scan_def.allow_dfs_chan_in_scan =
967 cfg_get(psoc, CFG_ENABLE_DFS_SCAN);
Bala Venkateshfbf6d922019-02-26 14:26:23 +0530968 scan_obj->scan_def.skip_dfs_chan_in_p2p_search =
969 cfg_get(psoc, CFG_ENABLE_SKIP_DFS_IN_P2P_SEARCH);
Abhishek Singh0c1dedb2018-11-13 18:24:20 +0530970 scan_obj->scan_def.use_wake_lock_in_user_scan =
971 cfg_get(psoc, CFG_ENABLE_WAKE_LOCK_IN_SCAN);
Arif Hussain4c6f33a2018-07-23 18:10:34 -0700972 scan_obj->scan_def.active_dwell_2g =
973 cfg_get(psoc, CFG_ACTIVE_MAX_2G_CHANNEL_TIME);
Sandeep Puligilla5e0d7ad2019-08-02 14:03:46 -0700974 scan_obj->scan_def.active_dwell_6g =
975 cfg_get(psoc, CFG_ACTIVE_MAX_6G_CHANNEL_TIME);
976 scan_obj->scan_def.passive_dwell_6g =
977 cfg_get(psoc, CFG_PASSIVE_MAX_6G_CHANNEL_TIME);
Sandeep Puligillaba6526d2018-04-05 01:10:13 -0700978 scan_obj->scan_def.passive_dwell =
979 cfg_get(psoc, CFG_PASSIVE_MAX_CHANNEL_TIME);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800980 scan_obj->scan_def.max_rest_time = SCAN_MAX_REST_TIME;
Yeshwanth Sriram Guntukaf70a37b2018-01-18 16:08:25 +0530981 scan_obj->scan_def.sta_miracast_mcc_rest_time =
982 SCAN_STA_MIRACAST_MCC_REST_TIME;
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800983 scan_obj->scan_def.min_rest_time = SCAN_MIN_REST_TIME;
Sandeep Puligilla5957f002018-07-19 19:04:18 -0700984 scan_obj->scan_def.conc_active_dwell =
985 cfg_get(psoc, CFG_ACTIVE_MAX_CHANNEL_TIME_CONC);
986 scan_obj->scan_def.conc_passive_dwell =
987 cfg_get(psoc, CFG_PASSIVE_MAX_CHANNEL_TIME_CONC);
988 scan_obj->scan_def.conc_max_rest_time =
989 cfg_get(psoc, CFG_MAX_REST_TIME_CONC);
990 scan_obj->scan_def.conc_min_rest_time =
991 cfg_get(psoc, CFG_MIN_REST_TIME_CONC);
992 scan_obj->scan_def.conc_idle_time =
993 cfg_get(psoc, CFG_IDLE_TIME_CONC);
Sandeep Puligilla13699a12018-07-17 21:30:54 -0700994 scan_obj->scan_def.repeat_probe_time =
995 cfg_get(psoc, CFG_SCAN_PROBE_REPEAT_TIME);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -0800996 scan_obj->scan_def.probe_spacing_time = SCAN_PROBE_SPACING_TIME;
997 scan_obj->scan_def.probe_delay = SCAN_PROBE_DELAY;
998 scan_obj->scan_def.burst_duration = SCAN_BURST_DURATION;
999 scan_obj->scan_def.max_scan_time = SCAN_MAX_SCAN_TIME;
Sandeep Puligilla13699a12018-07-17 21:30:54 -07001000 scan_obj->scan_def.num_probes = cfg_get(psoc, CFG_SCAN_NUM_PROBES);
Pragaspathi Thilagaraj9d9a3c42019-02-01 11:53:59 +05301001 scan_obj->scan_def.scan_cache_aging_time =
1002 (cfg_get(psoc, CFG_SCAN_AGING_TIME) * 1000);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001003 scan_obj->scan_def.max_bss_per_pdev = SCAN_MAX_BSS_PDEV;
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001004 scan_obj->scan_def.scan_priority = SCAN_PRIORITY;
1005 scan_obj->scan_def.idle_time = SCAN_NETWORK_IDLE_TIMEOUT;
Sandeep Puligilla13699a12018-07-17 21:30:54 -07001006 scan_obj->scan_def.adaptive_dwell_time_mode =
1007 cfg_get(psoc, CFG_ADAPTIVE_SCAN_DWELL_MODE);
Paul Zhang5753f9b2018-12-19 10:05:39 +08001008 scan_obj->scan_def.adaptive_dwell_time_mode_nc =
1009 cfg_get(psoc, CFG_ADAPTIVE_SCAN_DWELL_MODE_NC);
bings47c737d2019-04-19 14:38:25 +08001010 scan_obj->scan_def.honour_nl_scan_policy_flags =
1011 cfg_get(psoc, CFG_HONOUR_NL_SCAN_POLICY_FLAGS);
Pragaspathi Thilagaraj9d9a3c42019-02-01 11:53:59 +05301012 scan_obj->scan_def.enable_mac_spoofing =
1013 cfg_get(psoc, CFG_ENABLE_MAC_ADDR_SPOOFING);
Jianmin Zhu52a2b332019-11-13 15:12:34 +08001014 scan_obj->scan_def.is_bssid_hint_priority =
1015 cfg_get(psoc, CFG_IS_BSSID_HINT_PRIORITY);
Pragaspathi Thilagaraj1e618d62019-02-06 20:03:27 +05301016 scan_obj->scan_def.extscan_adaptive_dwell_mode =
1017 cfg_get(psoc, CFG_ADAPTIVE_EXTSCAN_DWELL_MODE);
Pragaspathi Thilagaraj9d9a3c42019-02-01 11:53:59 +05301018
Bala Venkatesh7f726aa2019-02-14 13:07:34 +05301019 /* init burst durations */
1020 scan_obj->scan_def.sta_scan_burst_duration =
1021 cfg_get(psoc, CFG_STA_SCAN_BURST_DURATION);
1022 scan_obj->scan_def.p2p_scan_burst_duration =
1023 cfg_get(psoc, CFG_P2P_SCAN_BURST_DURATION);
1024 scan_obj->scan_def.go_scan_burst_duration =
1025 cfg_get(psoc, CFG_GO_SCAN_BURST_DURATION);
1026 scan_obj->scan_def.ap_scan_burst_duration =
1027 cfg_get(psoc, CFG_AP_SCAN_BURST_DURATION);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001028 /* scan contrl flags */
1029 scan_obj->scan_def.scan_f_passive = true;
Sandeep Puligilla7acd31f2017-02-25 16:35:35 -08001030 scan_obj->scan_def.scan_f_ofdm_rates = true;
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001031 scan_obj->scan_def.scan_f_2ghz = true;
1032 scan_obj->scan_def.scan_f_5ghz = true;
Sandeep Puligillaeb272d02019-01-16 01:40:26 -08001033 scan_obj->scan_def.scan_f_chan_stat_evnt =
1034 cfg_get(psoc, CFG_ENABLE_SNR_MONITORING);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001035 /* scan event flags */
1036 scan_obj->scan_def.scan_ev_started = true;
1037 scan_obj->scan_def.scan_ev_completed = true;
1038 scan_obj->scan_def.scan_ev_bss_chan = true;
1039 scan_obj->scan_def.scan_ev_foreign_chan = true;
Sathish Kumar7f9408b2017-08-11 15:00:04 +05301040 scan_obj->scan_def.scan_ev_foreign_chn_exit = true;
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001041 scan_obj->scan_def.scan_ev_dequeued = true;
Sandeep Puligilla7acd31f2017-02-25 16:35:35 -08001042 scan_obj->scan_def.scan_ev_preempted = true;
1043 scan_obj->scan_def.scan_ev_start_failed = true;
1044 scan_obj->scan_def.scan_ev_restarted = true;
Sandeep Puligillafa3c8262019-03-13 09:47:14 -07001045 scan_obj->scan_def.enable_connected_scan =
1046 cfg_get(psoc, CFG_ENABLE_CONNECTED_SCAN);
Sandeep Puligilla59391992019-10-15 10:32:14 -07001047 scan_obj->scan_def.scan_mode_6g = cfg_get(psoc, CFG_6GHZ_SCAN_MODE);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301048 /* init scan id seed */
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001049 qdf_atomic_init(&scan_obj->scan_ids);
1050
Harprit Chhabada20ffac72018-08-03 12:30:34 -07001051 /* init extscan */
1052 wlan_extscan_global_init(psoc, scan_obj);
1053
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +05301054 return wlan_pno_global_init(psoc, scan_obj);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001055}
1056
Harprit Chhabada20ffac72018-08-03 12:30:34 -07001057static void
1058wlan_scan_global_deinit(struct wlan_objmgr_psoc *psoc)
1059{
1060 struct wlan_scan_obj *scan_obj;
1061
1062 scan_obj = wlan_psoc_get_scan_obj(psoc);
Pragaspathi Thilagaraj522a2a92019-01-24 19:16:00 +05301063 wlan_pno_global_deinit(scan_obj);
Harprit Chhabada20ffac72018-08-03 12:30:34 -07001064 wlan_extscan_global_deinit();
1065}
1066
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301067static QDF_STATUS
1068scm_remove_scan_event_handler(struct pdev_scan_ev_handler *pdev_ev_handler,
1069 struct cb_handler *entry)
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001070{
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301071 struct cb_handler *last_entry;
1072 uint32_t handler_cnt = pdev_ev_handler->handler_cnt;
1073
1074 /* Replace event handler being deleted
1075 * with the last one in the list.
1076 */
1077 last_entry = &(pdev_ev_handler->cb_handlers[handler_cnt - 1]);
1078 entry->func = last_entry->func;
1079 entry->arg = last_entry->arg;
1080
1081 /* Clear our last entry */
1082 last_entry->func = NULL;
1083 last_entry->arg = NULL;
1084 pdev_ev_handler->handler_cnt--;
1085
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001086 return QDF_STATUS_SUCCESS;
1087}
1088
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301089void
Om Prakash Tripathid088a8a2017-04-04 17:12:51 +05301090ucfg_scan_unregister_event_handler(struct wlan_objmgr_pdev *pdev,
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301091 scan_event_handler event_cb, void *arg)
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001092{
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301093 uint8_t found = false;
1094 uint32_t idx;
1095 uint32_t handler_cnt;
1096 struct wlan_scan_obj *scan;
1097 struct cb_handler *cb_handler;
1098 struct pdev_scan_ev_handler *pdev_ev_handler;
1099
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +05301100 scm_debug("pdev: %pK, event_cb: 0x%pK, arg: 0x%pK", pdev, event_cb,
1101 arg);
Om Prakash Tripathid088a8a2017-04-04 17:12:51 +05301102 if (!pdev) {
1103 scm_err("null pdev");
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301104 return;
1105 }
Om Prakash Tripathid088a8a2017-04-04 17:12:51 +05301106 scan = wlan_pdev_get_scan_obj(pdev);
Harprit Chhabada2de9f012018-10-30 15:10:52 -07001107 if (!scan)
1108 return;
1109
Om Prakash Tripathid088a8a2017-04-04 17:12:51 +05301110 pdev_ev_handler = wlan_pdev_get_pdev_scan_ev_handlers(pdev);
Om Prakash Tripathi510a27c2019-03-01 11:53:18 +05301111 if (!pdev_ev_handler)
1112 return;
1113
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301114 cb_handler = &(pdev_ev_handler->cb_handlers[0]);
1115
1116 qdf_spin_lock_bh(&scan->lock);
1117 handler_cnt = pdev_ev_handler->handler_cnt;
1118 if (!handler_cnt) {
1119 qdf_spin_unlock_bh(&scan->lock);
1120 scm_info("No event handlers registered");
Om Prakash Tripathi89db19b2017-02-25 15:53:30 +05301121 return;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301122 }
1123
1124 for (idx = 0; idx < MAX_SCAN_EVENT_HANDLERS_PER_PDEV;
1125 idx++, cb_handler++) {
1126 if ((cb_handler->func == event_cb) &&
1127 (cb_handler->arg == arg)) {
1128 /* Event handler found, remove it
1129 * from event handler list.
1130 */
1131 found = true;
1132 scm_remove_scan_event_handler(pdev_ev_handler,
1133 cb_handler);
1134 handler_cnt--;
1135 break;
1136 }
1137 }
1138 qdf_spin_unlock_bh(&scan->lock);
1139
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +05301140 scm_debug("event handler %s, remaining handlers: %d",
1141 (found ? "removed" : "not found"), handler_cnt);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301142}
1143
1144QDF_STATUS
1145ucfg_scan_init_default_params(struct wlan_objmgr_vdev *vdev,
1146 struct scan_start_request *req)
1147{
1148 struct scan_default_params *def;
1149
1150 if (!vdev | !req) {
Jeff Johnson878533e2017-09-18 10:07:54 -07001151 scm_err("vdev: 0x%pK, req: 0x%pK", vdev, req);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301152 return QDF_STATUS_E_INVAL;
1153 }
1154 def = wlan_vdev_get_def_scan_params(vdev);
Naveen Rawat6f7ddca2018-01-18 10:53:45 -08001155 if (!def) {
1156 scm_err("wlan_vdev_get_def_scan_params returned NULL");
1157 return QDF_STATUS_E_NULL_VALUE;
1158 }
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301159
1160 /* Zero out everything and explicitly set fields as required */
1161 qdf_mem_zero(req, sizeof(*req));
1162
1163 req->vdev = vdev;
1164 req->scan_req.vdev_id = wlan_vdev_get_id(vdev);
gaurank kathpalia5ba222a2019-04-19 15:44:37 +05301165 req->scan_req.scan_type = SCAN_TYPE_DEFAULT;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301166 req->scan_req.scan_priority = def->scan_priority;
1167 req->scan_req.dwell_time_active = def->active_dwell;
Arif Hussain4c6f33a2018-07-23 18:10:34 -07001168 req->scan_req.dwell_time_active_2g = def->active_dwell_2g;
Sandeep Puligilla5e0d7ad2019-08-02 14:03:46 -07001169 req->scan_req.dwell_time_active_6g = def->active_dwell_6g;
1170 req->scan_req.dwell_time_passive_6g = def->passive_dwell_6g;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301171 req->scan_req.dwell_time_passive = def->passive_dwell;
1172 req->scan_req.min_rest_time = def->min_rest_time;
1173 req->scan_req.max_rest_time = def->max_rest_time;
1174 req->scan_req.repeat_probe_time = def->repeat_probe_time;
1175 req->scan_req.probe_spacing_time = def->probe_spacing_time;
1176 req->scan_req.idle_time = def->idle_time;
1177 req->scan_req.max_scan_time = def->max_scan_time;
1178 req->scan_req.probe_delay = def->probe_delay;
1179 req->scan_req.burst_duration = def->burst_duration;
1180 req->scan_req.n_probes = def->num_probes;
Abhishek Singhf9297e52017-03-09 12:57:37 +05301181 req->scan_req.adaptive_dwell_time_mode =
1182 def->adaptive_dwell_time_mode;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301183 req->scan_req.scan_flags = def->scan_flags;
1184 req->scan_req.scan_events = def->scan_events;
Kiran Kumar Lokere584e6612017-10-12 17:55:36 -07001185 req->scan_req.scan_random.randomize = def->enable_mac_spoofing;
Abhishek Singh7d30bf72017-08-18 15:19:10 +05301186
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001187 return QDF_STATUS_SUCCESS;
1188}
1189
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301190QDF_STATUS
1191ucfg_scan_init_ssid_params(struct scan_start_request *req,
1192 uint32_t num_ssid, struct wlan_ssid *ssid_list)
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001193{
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301194 uint32_t max_ssid = sizeof(req->scan_req.ssid) /
1195 sizeof(req->scan_req.ssid[0]);
1196
1197 if (!req) {
1198 scm_err("null request");
1199 return QDF_STATUS_E_NULL_VALUE;
1200 }
1201 if (!num_ssid) {
1202 /* empty channel list provided */
1203 req->scan_req.num_ssids = 0;
1204 qdf_mem_zero(&req->scan_req.ssid[0],
1205 sizeof(req->scan_req.ssid));
1206 return QDF_STATUS_SUCCESS;
1207 }
1208 if (!ssid_list) {
1209 scm_err("null ssid_list while num_ssid: %d", num_ssid);
1210 return QDF_STATUS_E_NULL_VALUE;
1211 }
1212 if (num_ssid > max_ssid) {
1213 /* got a big list. alert and continue */
1214 scm_warn("overflow: received %d, max supported : %d",
1215 num_ssid, max_ssid);
1216 return QDF_STATUS_E_E2BIG;
1217 }
1218
1219 if (max_ssid > num_ssid)
1220 max_ssid = num_ssid;
1221
1222 req->scan_req.num_ssids = max_ssid;
1223 qdf_mem_copy(&req->scan_req.ssid[0], ssid_list,
1224 (req->scan_req.num_ssids * sizeof(req->scan_req.ssid[0])));
1225
1226 return QDF_STATUS_SUCCESS;
1227}
1228
1229QDF_STATUS
1230ucfg_scan_init_bssid_params(struct scan_start_request *req,
1231 uint32_t num_bssid, struct qdf_mac_addr *bssid_list)
1232{
1233 uint32_t max_bssid = sizeof(req->scan_req.bssid_list) /
1234 sizeof(req->scan_req.bssid_list[0]);
1235
1236 if (!req) {
1237 scm_err("null request");
1238 return QDF_STATUS_E_NULL_VALUE;
1239 }
1240 if (!num_bssid) {
1241 /* empty channel list provided */
1242 req->scan_req.num_bssid = 0;
1243 qdf_mem_zero(&req->scan_req.bssid_list[0],
1244 sizeof(req->scan_req.bssid_list));
1245 return QDF_STATUS_SUCCESS;
1246 }
1247 if (!bssid_list) {
1248 scm_err("null bssid_list while num_bssid: %d", num_bssid);
1249 return QDF_STATUS_E_NULL_VALUE;
1250 }
1251 if (num_bssid > max_bssid) {
1252 /* got a big list. alert and continue */
1253 scm_warn("overflow: received %d, max supported : %d",
1254 num_bssid, max_bssid);
1255 return QDF_STATUS_E_E2BIG;
1256 }
1257
1258 if (max_bssid > num_bssid)
1259 max_bssid = num_bssid;
1260
1261 req->scan_req.num_bssid = max_bssid;
1262 qdf_mem_copy(&req->scan_req.bssid_list[0], bssid_list,
1263 req->scan_req.num_bssid * sizeof(req->scan_req.bssid_list[0]));
1264
1265 return QDF_STATUS_SUCCESS;
1266}
1267
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301268/**
1269 * is_chan_enabled_for_scan() - helper API to check if a frequency
1270 * is allowed to scan.
1271 * @reg_chan: regulatory_channel object
1272 * @low_2g: lower 2.4 GHz frequency thresold
1273 * @high_2g: upper 2.4 GHz frequency thresold
1274 * @low_5g: lower 5 GHz frequency thresold
1275 * @high_5g: upper 5 GHz frequency thresold
1276 *
1277 * Return: true if scan is allowed. false otherwise.
1278 */
1279static bool
1280is_chan_enabled_for_scan(struct regulatory_channel *reg_chan,
1281 uint32_t low_2g, uint32_t high_2g, uint32_t low_5g,
1282 uint32_t high_5g)
1283{
1284 if (reg_chan->state == CHANNEL_STATE_DISABLE)
1285 return false;
1286 if (reg_chan->nol_chan)
1287 return false;
1288 /* 2 GHz channel */
1289 if ((util_scan_scm_chan_to_band(reg_chan->chan_num) ==
1290 WLAN_BAND_2_4_GHZ) &&
1291 ((reg_chan->center_freq < low_2g) ||
1292 (reg_chan->center_freq > high_2g)))
1293 return false;
Shashikala Prabhu58b8be02018-11-15 11:05:16 +05301294 else if ((util_scan_scm_chan_to_band(reg_chan->chan_num) ==
1295 WLAN_BAND_5_GHZ) &&
1296 ((reg_chan->center_freq < low_5g) ||
1297 (reg_chan->center_freq > high_5g)))
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301298 return false;
1299
1300 return true;
1301}
1302
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301303QDF_STATUS
1304ucfg_scan_init_chanlist_params(struct scan_start_request *req,
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +05301305 uint32_t num_chans, uint32_t *chan_list, uint32_t *phymode)
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301306{
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +05301307 uint32_t idx;
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301308 QDF_STATUS status;
1309 struct regulatory_channel *reg_chan_list = NULL;
1310 uint32_t low_2g, high_2g, low_5g, high_5g;
1311 struct wlan_objmgr_pdev *pdev = NULL;
1312 uint32_t *scan_freqs = NULL;
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +05301313 uint32_t max_chans = sizeof(req->scan_req.chan_list.chan) /
1314 sizeof(req->scan_req.chan_list.chan[0]);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301315 if (!req) {
1316 scm_err("null request");
1317 return QDF_STATUS_E_NULL_VALUE;
1318 }
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301319
1320 if (req->vdev)
1321 pdev = wlan_vdev_get_pdev(req->vdev);
1322 /*
1323 * If 0 channels are provided for scan and
1324 * wide band scan is enabled, scan all 20 mhz
1325 * available channels. This is required as FW
1326 * scans all channel/phy mode combinations
1327 * provided in scan channel list if 0 chans are
1328 * provided in scan request causing scan to take
1329 * too much time to complete.
1330 */
Om Prakash Tripathia2f9c7c2018-10-29 17:45:05 +05301331 if (pdev && !num_chans) {
Om Prakash Tripathi9b56f5d2018-05-29 11:42:19 +05301332 reg_chan_list = qdf_mem_malloc_atomic(NUM_CHANNELS *
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301333 sizeof(struct regulatory_channel));
1334 if (!reg_chan_list) {
1335 scm_err("Couldn't allocate reg_chan_list memory");
1336 status = QDF_STATUS_E_NOMEM;
1337 goto end;
1338 }
Om Prakash Tripathi9b56f5d2018-05-29 11:42:19 +05301339 scan_freqs =
1340 qdf_mem_malloc_atomic(sizeof(uint32_t) * max_chans);
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301341 if (!scan_freqs) {
1342 scm_err("Couldn't allocate scan_freqs memory");
1343 status = QDF_STATUS_E_NOMEM;
1344 goto end;
1345 }
1346 status = ucfg_reg_get_current_chan_list(pdev, reg_chan_list);
1347 if (QDF_IS_STATUS_ERROR(status)) {
1348 scm_err("Couldn't get current chan list");
1349 goto end;
1350 }
1351 status = wlan_reg_get_freq_range(pdev, &low_2g,
1352 &high_2g, &low_5g, &high_5g);
1353 if (QDF_IS_STATUS_ERROR(status)) {
1354 scm_err("Couldn't get frequency range");
1355 goto end;
1356 }
1357
1358 for (idx = 0, num_chans = 0;
1359 (idx < NUM_CHANNELS && num_chans < max_chans); idx++)
1360 if (is_chan_enabled_for_scan(&reg_chan_list[idx],
1361 low_2g, high_2g, low_5g, high_5g))
1362 scan_freqs[num_chans++] =
1363 reg_chan_list[idx].center_freq;
1364
1365 chan_list = scan_freqs;
1366 }
1367
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301368 if (!num_chans) {
1369 /* empty channel list provided */
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +05301370 qdf_mem_zero(&req->scan_req.chan_list,
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301371 sizeof(req->scan_req.chan_list));
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +05301372 req->scan_req.chan_list.num_chan = 0;
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301373 status = QDF_STATUS_SUCCESS;
1374 goto end;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301375 }
1376 if (!chan_list) {
1377 scm_err("null chan_list while num_chans: %d", num_chans);
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301378 status = QDF_STATUS_E_NULL_VALUE;
1379 goto end;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301380 }
1381
1382 if (num_chans > max_chans) {
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301383 /* got a big list. alert and fail */
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301384 scm_warn("overflow: received %d, max supported : %d",
1385 num_chans, max_chans);
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301386 status = QDF_STATUS_E_E2BIG;
1387 goto end;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301388 }
1389
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301390 req->scan_req.chan_list.num_chan = num_chans;
1391 for (idx = 0; idx < num_chans; idx++) {
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +05301392 req->scan_req.chan_list.chan[idx].freq =
1393 (chan_list[idx] > WLAN_24_GHZ_BASE_FREQ) ?
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301394 chan_list[idx] :
1395 wlan_reg_chan_to_freq(pdev, chan_list[idx]);
1396 if (phymode)
1397 req->scan_req.chan_list.chan[idx].phymode =
1398 phymode[idx];
1399 else if (req->scan_req.chan_list.chan[idx].freq <=
1400 WLAN_CHAN_15_FREQ)
1401 req->scan_req.chan_list.chan[idx].phymode =
1402 SCAN_PHY_MODE_11G;
1403 else
1404 req->scan_req.chan_list.chan[idx].phymode =
1405 SCAN_PHY_MODE_11A;
1406
1407 scm_debug("chan[%d]: freq:%d, phymode:%d", idx,
1408 req->scan_req.chan_list.chan[idx].freq,
1409 req->scan_req.chan_list.chan[idx].phymode);
Om Prakash Tripathi3e166ff2017-11-03 16:11:11 +05301410 }
1411
Om Prakash Tripathi7dd49fe2017-12-28 17:22:14 +05301412end:
1413 if (scan_freqs)
1414 qdf_mem_free(scan_freqs);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301415
Abhiram Jogadenuf5caeed2018-11-12 12:01:20 +05301416 if (reg_chan_list)
1417 qdf_mem_free(reg_chan_list);
1418
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301419 return QDF_STATUS_SUCCESS;
1420}
1421
1422static inline enum scm_scan_status
1423get_scan_status_from_serialization_status(
1424 enum wlan_serialization_cmd_status status)
1425{
1426 enum scm_scan_status scan_status;
1427
1428 switch (status) {
1429 case WLAN_SER_CMD_IN_PENDING_LIST:
1430 scan_status = SCAN_IS_PENDING;
1431 break;
1432 case WLAN_SER_CMD_IN_ACTIVE_LIST:
1433 scan_status = SCAN_IS_ACTIVE;
1434 break;
1435 case WLAN_SER_CMDS_IN_ALL_LISTS:
1436 scan_status = SCAN_IS_ACTIVE_AND_PENDING;
1437 break;
1438 case WLAN_SER_CMD_NOT_FOUND:
1439 scan_status = SCAN_NOT_IN_PROGRESS;
1440 break;
1441 default:
1442 scm_warn("invalid serialization status %d", status);
1443 QDF_ASSERT(0);
1444 scan_status = SCAN_NOT_IN_PROGRESS;
1445 break;
1446 }
1447
1448 return scan_status;
1449}
1450
1451enum scm_scan_status
1452ucfg_scan_get_vdev_status(struct wlan_objmgr_vdev *vdev)
1453{
1454 enum wlan_serialization_cmd_status status;
1455
1456 if (!vdev) {
1457 scm_err("null vdev");
Tushnim Bhattacharyyaf9409182018-03-28 17:23:55 -07001458 return SCAN_NOT_IN_PROGRESS;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301459 }
1460 status = wlan_serialization_vdev_scan_status(vdev);
1461
1462 return get_scan_status_from_serialization_status(status);
1463}
1464
1465enum scm_scan_status
1466ucfg_scan_get_pdev_status(struct wlan_objmgr_pdev *pdev)
1467{
1468 enum wlan_serialization_cmd_status status;
1469
1470 if (!pdev) {
1471 scm_err("null pdev");
Abhishek Singhf95b9e42017-04-25 12:12:01 +05301472 return SCAN_NOT_IN_PROGRESS;
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301473 }
1474 status = wlan_serialization_pdev_scan_status(pdev);
1475
1476 return get_scan_status_from_serialization_status(status);
1477}
1478
Abhishek Singh4caf1a92017-02-21 15:01:08 +05301479static void
1480ucfg_scan_register_unregister_bcn_cb(struct wlan_objmgr_psoc *psoc,
1481 bool enable)
1482{
1483 QDF_STATUS status;
1484 struct mgmt_txrx_mgmt_frame_cb_info cb_info[2];
1485
1486 cb_info[0].frm_type = MGMT_PROBE_RESP;
1487 cb_info[0].mgmt_rx_cb = tgt_scan_bcn_probe_rx_callback;
1488 cb_info[1].frm_type = MGMT_BEACON;
1489 cb_info[1].mgmt_rx_cb = tgt_scan_bcn_probe_rx_callback;
1490
1491 if (enable)
1492 status = wlan_mgmt_txrx_register_rx_cb(psoc,
1493 WLAN_UMAC_COMP_SCAN, cb_info, 2);
1494 else
1495 status = wlan_mgmt_txrx_deregister_rx_cb(psoc,
1496 WLAN_UMAC_COMP_SCAN, cb_info, 2);
1497 if (status != QDF_STATUS_SUCCESS)
1498 scm_err("%s the Handle with MGMT TXRX layer has failed",
1499 enable ? "Registering" : "Deregistering");
1500}
1501
Abhishek Singh2f132462017-03-06 16:48:59 +05301502QDF_STATUS ucfg_scan_update_user_config(struct wlan_objmgr_psoc *psoc,
1503 struct scan_user_cfg *scan_cfg)
1504{
1505 struct wlan_scan_obj *scan_obj;
1506 struct scan_default_params *scan_def;
1507
1508 if (!psoc) {
1509 scm_err("null psoc");
1510 return QDF_STATUS_E_FAILURE;
1511 }
1512 scan_obj = wlan_psoc_get_scan_obj(psoc);
Jeff Johnson82eb2122019-03-20 12:16:13 -07001513 if (!scan_obj) {
Abhishek Singh2f132462017-03-06 16:48:59 +05301514 scm_err("Failed to get scan object");
1515 return QDF_STATUS_E_FAILURE;
1516 }
1517
1518 scan_def = &scan_obj->scan_def;
Rajeev Kumar Sirasanagandlaa3f4a292017-06-21 12:01:22 +05301519 scan_obj->ie_whitelist = scan_cfg->ie_whitelist;
Yeshwanth Sriram Guntukaf70a37b2018-01-18 16:08:25 +05301520 scan_def->sta_miracast_mcc_rest_time =
1521 scan_cfg->sta_miracast_mcc_rest_time;
Abhishek Singh2f132462017-03-06 16:48:59 +05301522
Abhishek Singh7b599032017-11-10 14:42:31 +05301523 qdf_mem_copy(&scan_def->score_config, &scan_cfg->score_config,
1524 sizeof(struct scoring_config));
1525 scm_validate_scoring_config(&scan_def->score_config);
1526
1527 return QDF_STATUS_SUCCESS;
Abhishek Singh2f132462017-03-06 16:48:59 +05301528}
1529
Wu Gaodd58f632018-05-17 16:14:00 +08001530#ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301531static QDF_STATUS
1532ucfg_scan_cancel_pdev_scan(struct wlan_objmgr_pdev *pdev)
1533{
1534 struct scan_cancel_request *req;
1535 QDF_STATUS status;
1536 struct wlan_objmgr_vdev *vdev;
1537
Om Prakash Tripathi9b56f5d2018-05-29 11:42:19 +05301538 req = qdf_mem_malloc_atomic(sizeof(*req));
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301539 if (!req) {
1540 scm_err("Failed to allocate memory");
1541 return QDF_STATUS_E_NOMEM;
1542 }
1543
Abhishek Singhfda72d72018-11-14 11:59:36 +05301544 vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SCAN_ID);
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301545 if (!vdev) {
1546 scm_err("Failed to get vdev");
Abhishek Singhfda72d72018-11-14 11:59:36 +05301547 qdf_mem_free(req);
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301548 return QDF_STATUS_E_INVAL;
1549 }
1550 req->vdev = vdev;
1551 req->cancel_req.scan_id = INVAL_SCAN_ID;
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301552 req->cancel_req.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301553 req->cancel_req.vdev_id = INVAL_VDEV_ID;
1554 req->cancel_req.req_type = WLAN_SCAN_CANCEL_PDEV_ALL;
1555 status = ucfg_scan_cancel_sync(req);
1556 if (QDF_IS_STATUS_ERROR(status))
1557 scm_err("Cancel scan request failed");
Abhishek Singhfda72d72018-11-14 11:59:36 +05301558 wlan_objmgr_vdev_release_ref(vdev, WLAN_SCAN_ID);
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301559
1560 return status;
1561}
1562
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301563static QDF_STATUS
1564ucfg_scan_suspend_handler(struct wlan_objmgr_psoc *psoc, void *arg)
1565{
1566 struct wlan_objmgr_pdev *pdev = NULL;
1567 QDF_STATUS status = QDF_STATUS_SUCCESS;
1568 int i;
1569
Abhishek Singh502095b2018-11-21 14:34:49 +05301570 ucfg_scan_psoc_set_disable(psoc, REASON_SUSPEND);
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301571 /* Check all pdev */
1572 for (i = 0; i < WLAN_UMAC_MAX_PDEVS; i++) {
1573 pdev = wlan_objmgr_get_pdev_by_id(psoc, i, WLAN_SCAN_ID);
1574 if (!pdev)
1575 continue;
1576 if (ucfg_scan_get_pdev_status(pdev) !=
1577 SCAN_NOT_IN_PROGRESS)
1578 status = ucfg_scan_cancel_pdev_scan(pdev);
1579 wlan_objmgr_pdev_release_ref(pdev, WLAN_SCAN_ID);
1580 if (QDF_IS_STATUS_ERROR(status)) {
1581 scm_err("failed to cancel scan for pdev_id %d", i);
1582 return status;
1583 }
1584 }
1585
1586 return QDF_STATUS_SUCCESS;
1587}
1588
1589static QDF_STATUS
1590ucfg_scan_resume_handler(struct wlan_objmgr_psoc *psoc, void *arg)
1591{
Abhishek Singh502095b2018-11-21 14:34:49 +05301592 ucfg_scan_psoc_set_enable(psoc, REASON_SUSPEND);
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301593 return QDF_STATUS_SUCCESS;
1594}
1595
1596static inline void
1597ucfg_scan_register_pmo_handler(void)
1598{
1599 pmo_register_suspend_handler(WLAN_UMAC_COMP_SCAN,
1600 ucfg_scan_suspend_handler, NULL);
1601 pmo_register_resume_handler(WLAN_UMAC_COMP_SCAN,
1602 ucfg_scan_resume_handler, NULL);
1603}
1604
1605static inline void
1606ucfg_scan_unregister_pmo_handler(void)
1607{
1608 pmo_unregister_suspend_handler(WLAN_UMAC_COMP_SCAN,
1609 ucfg_scan_suspend_handler);
1610 pmo_unregister_resume_handler(WLAN_UMAC_COMP_SCAN,
1611 ucfg_scan_resume_handler);
1612}
1613
1614#else
1615static inline void
1616ucfg_scan_register_pmo_handler(void)
1617{
1618}
1619
1620static inline void
1621ucfg_scan_unregister_pmo_handler(void)
1622{
1623}
1624#endif
1625
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301626QDF_STATUS
1627ucfg_scan_psoc_open(struct wlan_objmgr_psoc *psoc)
1628{
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001629 struct wlan_scan_obj *scan_obj;
1630
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +05301631 scm_debug("psoc open: 0x%pK", psoc);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301632 if (!psoc) {
1633 scm_err("null psoc");
1634 return QDF_STATUS_E_FAILURE;
1635 }
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001636 scan_obj = wlan_psoc_get_scan_obj(psoc);
Jeff Johnson82eb2122019-03-20 12:16:13 -07001637 if (!scan_obj) {
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001638 scm_err("Failed to get scan object");
1639 return QDF_STATUS_E_FAILURE;
1640 }
1641 /* Initialize the scan Globals */
Sandeep Puligillaba6526d2018-04-05 01:10:13 -07001642 wlan_scan_global_init(psoc, scan_obj);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301643 qdf_spinlock_create(&scan_obj->lock);
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301644 ucfg_scan_register_pmo_handler();
Zhu Jianmin83273712018-03-27 16:24:24 +08001645 scm_db_init(psoc);
Sandeep Puligillad763fee2019-11-08 14:00:10 -08001646 scm_channel_list_db_init(psoc);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001647
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301648 return QDF_STATUS_SUCCESS;
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001649}
1650
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301651QDF_STATUS
1652ucfg_scan_psoc_close(struct wlan_objmgr_psoc *psoc)
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001653{
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001654 struct wlan_scan_obj *scan_obj;
1655
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +05301656 scm_debug("psoc close: 0x%pK", psoc);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301657 if (!psoc) {
1658 scm_err("null psoc");
1659 return QDF_STATUS_E_FAILURE;
1660 }
Zhu Jianmin83273712018-03-27 16:24:24 +08001661 scm_db_deinit(psoc);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001662 scan_obj = wlan_psoc_get_scan_obj(psoc);
Jeff Johnson82eb2122019-03-20 12:16:13 -07001663 if (!scan_obj) {
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001664 scm_err("Failed to get scan object");
1665 return QDF_STATUS_E_FAILURE;
1666 }
Abhishek Singh9f6058d2017-04-25 13:47:31 +05301667 ucfg_scan_unregister_pmo_handler();
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301668 qdf_spinlock_destroy(&scan_obj->lock);
Harprit Chhabada20ffac72018-08-03 12:30:34 -07001669 wlan_scan_global_deinit(psoc);
Sandeep Puligillad763fee2019-11-08 14:00:10 -08001670 scm_channel_list_db_deinit(psoc);
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001671
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301672 return QDF_STATUS_SUCCESS;
1673}
1674
Sandeep Puligilla140c41e2017-04-03 22:53:39 -07001675static bool scm_serialization_scan_rules_cb(
1676 union wlan_serialization_rules_info *comp_info,
1677 uint8_t comp_id)
1678{
1679 switch (comp_id) {
Shashikala Prabhu76192e12017-08-18 18:25:28 +05301680 case WLAN_UMAC_COMP_TDLS:
Sandeep Puligilla140c41e2017-04-03 22:53:39 -07001681 if (comp_info->scan_info.is_tdls_in_progress) {
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +05301682 scm_debug("Cancel scan. Tdls in progress");
Sandeep Puligilla140c41e2017-04-03 22:53:39 -07001683 return false;
1684 }
1685 break;
Shashikala Prabhu76192e12017-08-18 18:25:28 +05301686 case WLAN_UMAC_COMP_DFS:
Sandeep Puligilla140c41e2017-04-03 22:53:39 -07001687 if (comp_info->scan_info.is_cac_in_progress) {
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +05301688 scm_debug("Cancel scan. CAC in progress");
Sandeep Puligilla140c41e2017-04-03 22:53:39 -07001689 return false;
1690 }
1691 break;
Srinivas Pitla1ff074c2018-12-05 18:08:20 +05301692 case WLAN_UMAC_COMP_MLME:
1693 if (comp_info->scan_info.is_mlme_op_in_progress) {
1694 scm_debug("Cancel scan. MLME operation in progress");
1695 return false;
1696 }
1697 break;
Sandeep Puligilla140c41e2017-04-03 22:53:39 -07001698 default:
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +05301699 scm_debug("not handled comp_id %d", comp_id);
Sandeep Puligilla140c41e2017-04-03 22:53:39 -07001700 break;
1701 }
1702
1703 return true;
1704}
1705
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301706QDF_STATUS
1707ucfg_scan_psoc_enable(struct wlan_objmgr_psoc *psoc)
1708{
1709 QDF_STATUS status;
1710
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +05301711 scm_debug("psoc enable: 0x%pK", psoc);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301712 if (!psoc) {
1713 scm_err("null psoc");
1714 return QDF_STATUS_E_FAILURE;
1715 }
1716 /* Subscribe for scan events from lmac layesr */
1717 status = tgt_scan_register_ev_handler(psoc);
1718 QDF_ASSERT(status == QDF_STATUS_SUCCESS);
Liangwei Dong36462d52018-08-01 05:01:14 -04001719 if (!wlan_reg_is_11d_offloaded(psoc))
Paul Zhangca615212018-02-02 17:43:37 +08001720 scm_11d_cc_db_init(psoc);
Abhishek Singh4caf1a92017-02-21 15:01:08 +05301721 ucfg_scan_register_unregister_bcn_cb(psoc, true);
Sandeep Puligilla140c41e2017-04-03 22:53:39 -07001722 status = wlan_serialization_register_apply_rules_cb(psoc,
1723 WLAN_SER_CMD_SCAN,
1724 scm_serialization_scan_rules_cb);
1725 QDF_ASSERT(status == QDF_STATUS_SUCCESS);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301726 return status;
1727}
1728
1729QDF_STATUS
1730ucfg_scan_psoc_disable(struct wlan_objmgr_psoc *psoc)
1731{
1732 QDF_STATUS status;
1733
Yeshwanth Sriram Guntukadad6b5b2018-07-17 13:23:46 +05301734 scm_debug("psoc disable: 0x%pK", psoc);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301735 if (!psoc) {
1736 scm_err("null psoc");
1737 return QDF_STATUS_E_FAILURE;
1738 }
1739 /* Unsubscribe for scan events from lmac layesr */
1740 status = tgt_scan_unregister_ev_handler(psoc);
1741 QDF_ASSERT(status == QDF_STATUS_SUCCESS);
Abhishek Singh4caf1a92017-02-21 15:01:08 +05301742 ucfg_scan_register_unregister_bcn_cb(psoc, false);
Liangwei Dong36462d52018-08-01 05:01:14 -04001743 if (!wlan_reg_is_11d_offloaded(psoc))
Paul Zhangca615212018-02-02 17:43:37 +08001744 scm_11d_cc_db_deinit(psoc);
Om Prakash Tripathi22f95dc2016-12-19 10:45:59 +05301745
Sandeep Puligilla2e1088d2016-12-27 19:58:17 -08001746 return status;
1747}
Om Prakash Tripathi0078b782017-04-12 12:23:40 +05301748
1749uint32_t
1750ucfg_scan_get_max_active_scans(struct wlan_objmgr_psoc *psoc)
1751{
1752 struct scan_default_params *scan_params = NULL;
1753
1754 if (!psoc) {
1755 scm_err("null psoc");
1756 return 0;
1757 }
1758 scan_params = wlan_scan_psoc_get_def_params(psoc);
Naveen Rawat6f7ddca2018-01-18 10:53:45 -08001759 if (!scan_params) {
1760 scm_err("Failed to get scan object");
1761 return 0;
1762 }
Om Prakash Tripathi0078b782017-04-12 12:23:40 +05301763
1764 return scan_params->max_active_scans_allowed;
1765}
Rajeev Kumar Sirasanagandlaa3f4a292017-06-21 12:01:22 +05301766
1767bool ucfg_copy_ie_whitelist_attrs(struct wlan_objmgr_psoc *psoc,
1768 struct probe_req_whitelist_attr *ie_whitelist)
1769{
1770 struct wlan_scan_obj *scan_obj = NULL;
1771
1772 scan_obj = wlan_psoc_get_scan_obj(psoc);
1773 if (!scan_obj)
1774 return false;
1775
1776 qdf_mem_copy(ie_whitelist, &scan_obj->ie_whitelist,
1777 sizeof(*ie_whitelist));
1778
1779 return true;
1780}
1781
1782bool ucfg_ie_whitelist_enabled(struct wlan_objmgr_psoc *psoc,
1783 struct wlan_objmgr_vdev *vdev)
1784{
1785 struct wlan_scan_obj *scan_obj = NULL;
1786
1787 scan_obj = wlan_psoc_get_scan_obj(psoc);
1788 if (!scan_obj)
1789 return false;
1790
1791 if ((wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE) ||
Bala Venkateshf96d9cf2019-03-29 11:27:16 +05301792 wlan_vdev_is_up(vdev) == QDF_STATUS_SUCCESS)
Rajeev Kumar Sirasanagandlaa3f4a292017-06-21 12:01:22 +05301793 return false;
1794
1795 if (!scan_obj->ie_whitelist.white_list)
1796 return false;
1797
1798 return true;
1799}
Yeshwanth Sriram Guntukab9e2f662017-12-14 17:56:04 +05301800
1801void ucfg_scan_set_bt_activity(struct wlan_objmgr_psoc *psoc,
1802 bool bt_a2dp_active)
1803{
1804 struct wlan_scan_obj *scan_obj;
1805
1806 scan_obj = wlan_psoc_get_scan_obj(psoc);
1807 if (!scan_obj) {
1808 scm_err("Failed to get scan object");
1809 return;
1810 }
1811 scan_obj->bt_a2dp_enabled = bt_a2dp_active;
1812}
1813
1814bool ucfg_scan_get_bt_activity(struct wlan_objmgr_psoc *psoc)
1815{
1816 struct wlan_scan_obj *scan_obj;
1817
1818 scan_obj = wlan_psoc_get_scan_obj(psoc);
1819 if (!scan_obj) {
1820 scm_err("Failed to get scan object");
1821 return false;
1822 }
1823
1824 return scan_obj->bt_a2dp_enabled;
1825}
Om Prakash Tripathi5e47d432018-02-23 16:56:09 +05301826
Abhishek Singh0c1dedb2018-11-13 18:24:20 +05301827bool ucfg_scan_wake_lock_in_user_scan(struct wlan_objmgr_psoc *psoc)
1828{
1829 struct wlan_scan_obj *scan_obj;
1830
1831 scan_obj = wlan_psoc_get_scan_obj(psoc);
1832 if (!scan_obj)
1833 return false;
1834
1835 return scan_obj->scan_def.use_wake_lock_in_user_scan;
1836}
1837
Sandeep Puligillaeb272d02019-01-16 01:40:26 -08001838bool ucfg_scan_is_connected_scan_enabled(struct wlan_objmgr_psoc *psoc)
1839{
1840 struct wlan_scan_obj *scan_obj;
1841
1842 scan_obj = wlan_psoc_get_scan_obj(psoc);
1843 if (!scan_obj) {
1844 scm_err("Failed to get scan object");
1845 return cfg_default(CFG_ENABLE_CONNECTED_SCAN);
1846 }
1847
1848 return scan_obj->scan_def.enable_connected_scan;
1849}
1850
Pragaspathi Thilagaraj9d9a3c42019-02-01 11:53:59 +05301851bool ucfg_scan_is_mac_spoofing_enabled(struct wlan_objmgr_psoc *psoc)
1852{
1853 struct wlan_scan_obj *scan_obj;
1854
1855 scan_obj = wlan_psoc_get_scan_obj(psoc);
1856 if (!scan_obj) {
1857 scm_err("Failed to get scan object");
1858 return cfg_default(CFG_ENABLE_MAC_ADDR_SPOOFING);
1859 }
1860
1861 return scan_obj->scan_def.enable_mac_spoofing;
1862}
1863
Pragaspathi Thilagaraj1e618d62019-02-06 20:03:27 +05301864enum scan_dwelltime_adaptive_mode
1865ucfg_scan_get_extscan_adaptive_dwell_mode(struct wlan_objmgr_psoc *psoc)
1866{
1867 struct wlan_scan_obj *scan_obj;
1868
1869 scan_obj = wlan_psoc_get_scan_obj(psoc);
1870 if (!scan_obj) {
1871 scm_err("Failed to get scan object");
1872 return cfg_default(CFG_ADAPTIVE_EXTSCAN_DWELL_MODE);
1873 }
1874
1875 return scan_obj->scan_def.extscan_adaptive_dwell_mode;
1876}
1877
Om Prakash Tripathi5e47d432018-02-23 16:56:09 +05301878QDF_STATUS
1879ucfg_scan_set_global_config(struct wlan_objmgr_psoc *psoc,
1880 enum scan_config config, uint32_t val)
1881{
1882 struct wlan_scan_obj *scan_obj;
1883 QDF_STATUS status = QDF_STATUS_SUCCESS;
1884
1885 scan_obj = wlan_psoc_get_scan_obj(psoc);
1886 if (!scan_obj) {
1887 scm_err("Failed to get scan object config:%d, val:%d",
1888 config, val);
1889 return QDF_STATUS_E_INVAL;
1890 }
1891 switch (config) {
1892 case SCAN_CFG_DISABLE_SCAN_COMMAND_TIMEOUT:
1893 scan_obj->disable_timeout = !!val;
1894 break;
1895 case SCAN_CFG_DROP_BCN_ON_CHANNEL_MISMATCH:
1896 scan_obj->drop_bcn_on_chan_mismatch = !!val;
1897 break;
1898
1899 default:
1900 status = QDF_STATUS_E_INVAL;
1901 break;
1902 }
1903
1904 return status;
1905}
1906
Sandeep Puligillae062e822018-02-28 00:27:10 -08001907QDF_STATUS ucfg_scan_update_mlme_by_bssinfo(struct wlan_objmgr_pdev *pdev,
1908 struct bss_info *bss_info, struct mlme_info *mlme)
1909{
1910 QDF_STATUS status;
1911
1912 status = scm_scan_update_mlme_by_bssinfo(pdev, bss_info, mlme);
1913
1914 return status;
1915}
1916
Om Prakash Tripathi5e47d432018-02-23 16:56:09 +05301917QDF_STATUS
1918ucfg_scan_get_global_config(struct wlan_objmgr_psoc *psoc,
1919 enum scan_config config, uint32_t *val)
1920{
1921 struct wlan_scan_obj *scan_obj;
1922 QDF_STATUS status = QDF_STATUS_SUCCESS;
1923
1924 scan_obj = wlan_psoc_get_scan_obj(psoc);
1925 if (!scan_obj || !val) {
1926 scm_err("scan object:%pK config:%d, val:0x%pK",
1927 scan_obj, config, val);
1928 return QDF_STATUS_E_INVAL;
1929 }
1930 switch (config) {
1931 case SCAN_CFG_DISABLE_SCAN_COMMAND_TIMEOUT:
1932 *val = scan_obj->disable_timeout;
1933 break;
1934 case SCAN_CFG_DROP_BCN_ON_CHANNEL_MISMATCH:
1935 *val = scan_obj->drop_bcn_on_chan_mismatch;
1936 break;
1937
1938 default:
1939 status = QDF_STATUS_E_INVAL;
1940 break;
1941 }
1942
1943 return status;
1944}
Pragaspathi Thilagarajcc3af932018-11-28 00:10:18 +05301945
1946#ifdef FEATURE_WLAN_SCAN_PNO
1947bool ucfg_scan_is_pno_offload_enabled(struct wlan_objmgr_psoc *psoc)
1948{
1949 struct wlan_scan_obj *scan_obj;
1950
1951 scan_obj = wlan_psoc_get_scan_obj(psoc);
1952 if (!scan_obj) {
1953 scm_err("NULL scan obj");
1954 return false;
1955 }
1956
1957 return scan_obj->pno_cfg.pno_offload_enabled;
1958}
1959
1960void ucfg_scan_set_pno_offload(struct wlan_objmgr_psoc *psoc, bool value)
1961{
1962 struct wlan_scan_obj *scan_obj;
1963
1964 scan_obj = wlan_psoc_get_scan_obj(psoc);
1965 if (!scan_obj) {
1966 scm_err("NULL scan obj");
1967 return;
1968 }
1969
1970 scan_obj->pno_cfg.pno_offload_enabled = value;
1971}
1972
1973bool ucfg_scan_get_pno_scan_support(struct wlan_objmgr_psoc *psoc)
1974{
1975 struct wlan_scan_obj *scan_obj;
1976
1977 scan_obj = wlan_psoc_get_scan_obj(psoc);
1978 if (!scan_obj) {
1979 scm_err("NULL scan obj");
1980 return cfg_default(CFG_PNO_SCAN_SUPPORT);
1981 }
1982
1983 return scan_obj->pno_cfg.scan_support_enabled;
1984}
1985
1986uint8_t ucfg_get_scan_backoff_multiplier(struct wlan_objmgr_psoc *psoc)
1987{
1988 struct wlan_scan_obj *scan_obj;
1989
1990 scan_obj = wlan_psoc_get_scan_obj(psoc);
1991 if (!scan_obj) {
1992 scm_err("NULL scan obj");
1993 return cfg_default(CFG_SCAN_BACKOFF_MULTIPLIER);
1994 }
1995 return scan_obj->pno_cfg.scan_backoff_multiplier;
1996}
1997
1998bool ucfg_scan_is_dfs_chnl_scan_enabled(struct wlan_objmgr_psoc *psoc)
1999{
2000 struct wlan_scan_obj *scan_obj;
2001
2002 scan_obj = wlan_psoc_get_scan_obj(psoc);
2003 if (!scan_obj) {
2004 scm_err("NULL scan obj");
2005 return cfg_default(CFG_ENABLE_DFS_PNO_CHNL_SCAN);
2006 }
2007 return scan_obj->pno_cfg.dfs_chnl_scan_enabled;
2008}
2009
2010uint32_t ucfg_scan_get_scan_timer_repeat_value(struct wlan_objmgr_psoc *psoc)
2011{
2012 struct wlan_scan_obj *scan_obj;
2013
2014 scan_obj = wlan_psoc_get_scan_obj(psoc);
2015 if (!scan_obj) {
2016 scm_err("NULL scan obj");
2017 return cfg_default(CFG_PNO_SCAN_TIMER_REPEAT_VALUE);
2018 }
2019 return scan_obj->pno_cfg.scan_timer_repeat_value;
2020}
2021
2022uint32_t ucfg_scan_get_slow_scan_multiplier(struct wlan_objmgr_psoc *psoc)
2023{
2024 struct wlan_scan_obj *scan_obj;
2025
2026 scan_obj = wlan_psoc_get_scan_obj(psoc);
2027 if (!scan_obj) {
2028 scm_err("NULL scan obj");
2029 return cfg_default(CFG_PNO_SLOW_SCAN_MULTIPLIER);
2030 }
2031 return scan_obj->pno_cfg.slow_scan_multiplier;
2032}
Pragaspathi Thilagaraj9d9a3c42019-02-01 11:53:59 +05302033
2034uint32_t
2035ucfg_scan_get_max_sched_scan_plan_interval(struct wlan_objmgr_psoc *psoc)
2036{
2037 struct wlan_scan_obj *scan_obj;
2038
2039 scan_obj = wlan_psoc_get_scan_obj(psoc);
2040 if (!scan_obj) {
2041 scm_err("Failed to get scan object");
2042 return cfg_default(CFG_MAX_SCHED_SCAN_PLAN_INTERVAL);
2043 }
2044
2045 return scan_obj->pno_cfg.max_sched_scan_plan_interval;
2046}
2047
2048uint32_t
2049ucfg_scan_get_max_sched_scan_plan_iterations(struct wlan_objmgr_psoc *psoc)
2050{
2051 struct wlan_scan_obj *scan_obj;
2052
2053 scan_obj = wlan_psoc_get_scan_obj(psoc);
2054 if (!scan_obj) {
2055 scm_err("Failed to get scan object");
2056 return cfg_default(CFG_MAX_SCHED_SCAN_PLAN_ITERATIONS);
2057 }
2058
2059 return scan_obj->pno_cfg.max_sched_scan_plan_iterations;
2060}
2061
Pragaspathi Thilagarajcc3af932018-11-28 00:10:18 +05302062#endif