xref: /wlan-dirver/qca-wifi-host-cmn/umac/scan/core/src/wlan_scan_main.h (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
1 /*
2  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /*
20  * DOC: contains scan init/deinit public api
21  */
22 
23 #ifndef _WLAN_SCAN_MAIN_API_H_
24 #define _WLAN_SCAN_MAIN_API_H_
25 
26 #include <qdf_atomic.h>
27 #include <wlan_objmgr_psoc_obj.h>
28 #include <wlan_objmgr_pdev_obj.h>
29 #include <wlan_objmgr_vdev_obj.h>
30 #include <wlan_scan_public_structs.h>
31 #include "wlan_scan_cache_db.h"
32 #include "wlan_scan_11d.h"
33 #include "cfg_scan.h"
34 
35 #define scm_alert(params...) \
36 	QDF_TRACE_FATAL(QDF_MODULE_ID_SCAN, params)
37 #define scm_err(params...) \
38 	QDF_TRACE_ERROR(QDF_MODULE_ID_SCAN, params)
39 #define scm_warn(params...) \
40 	QDF_TRACE_WARN(QDF_MODULE_ID_SCAN, params)
41 #define scm_notice(params...) \
42 	QDF_TRACE_INFO(QDF_MODULE_ID_SCAN, params)
43 #define scm_info(params...) \
44 	QDF_TRACE_INFO(QDF_MODULE_ID_SCAN, params)
45 #define scm_debug(params...) \
46 	QDF_TRACE_DEBUG(QDF_MODULE_ID_SCAN, params)
47 
48 /* Rate Limited Logs */
49 #define scm_alert_rl(params...) \
50 	QDF_TRACE_FATAL_RL(QDF_MODULE_ID_SCAN, params)
51 #define scm_err_rl(params...) \
52 	QDF_TRACE_ERROR_RL(QDF_MODULE_ID_SCAN, params)
53 #define scm_warn_rl(params...) \
54 	QDF_TRACE_WARN_RL(QDF_MODULE_ID_SCAN, params)
55 #define scm_info_rl(params...) \
56 	QDF_TRACE_INFO_RL(QDF_MODULE_ID_SCAN, params)
57 #define scm_debug_rl(params...) \
58 	QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_SCAN, params)
59 
60 #define scm_nofl_alert(params...) \
61 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_SCAN, params)
62 #define scm_nofl_err(params...) \
63 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_SCAN, params)
64 #define scm_nofl_warn(params...) \
65 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_SCAN, params)
66 #define scm_nofl_info(params...) \
67 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_SCAN, params)
68 #define scm_nofl_debug(params...) \
69 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_SCAN, params)
70 
71 #define scm_hex_dump(level, data, buf_len) \
72 		qdf_trace_hex_dump(QDF_MODULE_ID_SCAN, level, data, buf_len)
73 
74 #define MAX_SCAN_EVENT_HANDLERS_PER_PDEV   100
75 #define WLAN_MAX_MODULE_NAME    40
76 #define WLAN_MAX_REQUESTORS     200
77 #define WLAN_SCAN_ID_MASK 0x00000FFF
78 #define WLAN_HOST_SCAN_REQ_ID_PREFIX 0x0000A000
79 #define SCAN_NPROBES_DEFAULT 2
80 #define WLAN_P2P_SOCIAL_CHANNELS 3
81 
82 #define SCAN_BURST_SCAN_MAX_NUM_OFFCHANNELS  (3)
83 #define SCAN_SCAN_IDLE_TIME_DEFAULT          (25)
84 #define SCAN_3PORT_CONC_SCAN_MAX_BURST_DURATION  (25)
85 #define SCAN_CTS_DURATION_MS_MAX             (32)
86 #define SCAN_ROAM_SCAN_CHANNEL_SWITCH_TIME    (4)
87 #define SCAN_DWELL_TIME_PROBE_TIME_MAP_SIZE      (11)
88 #define SCAN_GO_MIN_ACTIVE_SCAN_BURST_DURATION   (40)
89 #define SCAN_GO_MAX_ACTIVE_SCAN_BURST_DURATION   (240)
90 #define SCAN_P2P_SCAN_MAX_BURST_DURATION     (240)
91 #define SCAN_GO_BURST_SCAN_MAX_NUM_OFFCHANNELS   (6)
92 
93 /* MAX RNR entries per channel*/
94 #define WLAN_MAX_RNR_COUNT 15
95 
96 /*
97  * Maximum numbers of callback functions that may be invoked
98  * for a particular scan event.
99  */
100 #define MAX_SCAN_EVENT_LISTENERS (MAX_SCAN_EVENT_HANDLERS_PER_PDEV + 1)
101 
102 /**
103  * struct probe_time_dwell_time - probe time, dwell time map
104  * @dwell_time: dwell time
105  * @probe_time: repeat probe time
106  */
107 struct probe_time_dwell_time {
108 	uint8_t dwell_time;
109 	uint8_t probe_time;
110 };
111 
112 /*
113  * For the requestor id:
114  *     bit  0~12 is used for real requestor id.
115  *     bit 13~15 is used for requestor prefix.
116  *     bit 16~19 is used by specific user to aware it is issued by himself.
117  *     bit 20~31 is reserved.
118  */
119 #define WLAN_SCAN_REQUESTER_ID_PREFIX 0x0000A000
120 #define WLAN_SCAN_REQUESTER_ID_MASK 0x00001FFF
121 
122 #define SCM_NUM_RSSI_CAT        15
123 #define SCAN_STA_MIRACAST_MCC_REST_TIME 400
124 
125 #define SCAN_TIMEOUT_GRACE_PERIOD 10
126 #define SCAN_MAX_BSS_PDEV 100
127 #define SCAN_PRIORITY SCAN_PRIORITY_LOW
128 
129 /* DBS Scan policy selection ext flags */
130 #define SCAN_FLAG_EXT_DBS_SCAN_POLICY_MASK  0x00000003
131 #define SCAN_FLAG_EXT_DBS_SCAN_POLICY_BIT   0
132 #define SCAN_DBS_POLICY_DEFAULT             0x0
133 #define SCAN_DBS_POLICY_FORCE_NONDBS        0x1
134 #define SCAN_DBS_POLICY_IGNORE_DUTY         0x2
135 #define SCAN_DBS_POLICY_MAX                 0x3
136 /* Minimum number of channels for enabling DBS Scan */
137 #define SCAN_MIN_CHAN_DBS_SCAN_THRESHOLD         8
138 /*
139  * Enable Reception of Public Action frame with this flag
140  */
141 #define SCAN_FLAG_EXT_FILTER_PUBLIC_ACTION_FRAME 0x4
142 
143 /* Indicate to scan all PSC channel */
144 #define SCAN_FLAG_EXT_6GHZ_SCAN_ALL_PSC_CH 0x8
145 
146 /* Indicate to scan all NON-PSC channel */
147 #define SCAN_FLAG_EXT_6GHZ_SCAN_ALL_NON_PSC_CH 0x10
148 
149 /* Indicate to save scan result matching hint from scan client */
150 #define SCAN_FLAG_EXT_6GHZ_MATCH_HINT 0x20
151 
152 /* Skip any channel on which RNR information is not received */
153 #define SCAN_FLAG_EXT_6GHZ_SKIP_NON_RNR_CH 0x40
154 
155 /* Indicate client hint req is high priority than FW rnr or FILS discovery */
156 #define SCAN_FLAG_EXT_6GHZ_CLIENT_HIGH_PRIORITY 0x80
157 
158 /* RRM scan type indication */
159 #define SCAN_FLAG_EXT_RRM_SCAN_IND 0x400
160 
161 /* Probe request frame with unicast RA indication */
162 #define SCAN_FLAG_EXT_FORCE_UNICAST_RA  0x1000
163 
164 /* Passive dwell time if bt_a2dp is enabled. Time in msecs*/
165 #define PASSIVE_DWELL_TIME_BT_A2DP_ENABLED 28
166 
167 /**
168  * struct cb_handler - defines scan event handler
169  * call back function and arguments
170  * @func: handler function pointer
171  * @arg: argument to handler function
172  */
173 struct cb_handler {
174 	scan_event_handler func;
175 	void *arg;
176 };
177 
178 /**
179  * struct pdev_scan_ev_handler - pdev scan event handlers
180  * @cb_handler: array of registered scan handlers
181  */
182 struct pdev_scan_ev_handler {
183 	uint32_t handler_cnt;
184 	struct cb_handler cb_handlers[MAX_SCAN_EVENT_HANDLERS_PER_PDEV];
185 };
186 
187 /**
188  * struct global_scan_ev_handlers - per pdev registered scan event handlers
189  * @pdev_scan_ev_handler: per pdev registered scan event handlers
190  */
191 struct global_scan_ev_handlers {
192 	struct pdev_scan_ev_handler pdev_ev_handlers[WLAN_UMAC_MAX_PDEVS];
193 };
194 
195 /**
196  * struct scan_requester_info - defines scan requester id
197  * and event handler mapping
198  * @requester:   requester ID allocated
199  * @module:      module name of requester
200  * @ev_handler:  event handlerto be invoked
201  */
202 struct scan_requester_info {
203 	wlan_scan_requester requester;
204 	uint8_t module[WLAN_MAX_MODULE_NAME];
205 	struct cb_handler ev_handler;
206 };
207 
208 /**
209  * struct pdev_scan_info - defines per pdev scan info
210  * @wide_band_scan: wide band scan capability
211  * @last_scan_time: time of last scan start on this pdev
212  * @custom_chan_list: scan only these channels
213  * @conf_bssid: configured bssid of the hidden AP
214  * @conf_ssid: configured desired ssid
215  */
216 struct pdev_scan_info {
217 	bool wide_band_scan;
218 	qdf_time_t last_scan_time;
219 	struct chan_list custom_chan_list;
220 	uint8_t conf_bssid[QDF_MAC_ADDR_SIZE];
221 	struct wlan_ssid conf_ssid;
222 };
223 
224 /**
225  * struct scan_vdev_obj - scan vdev obj
226  * @pno_match_evt_received: pno match received
227  * @pno_in_progress: pno in progress
228  * @scan_disabled: if scan is disabled for this vdev
229  * @first_scan_done: Whether its the first scan or not for this particular vdev.
230  */
231 struct scan_vdev_obj {
232 	bool pno_match_evt_received;
233 	bool pno_in_progress;
234 	uint32_t scan_disabled;
235 	bool first_scan_done;
236 };
237 
238 #ifdef FEATURE_WLAN_SCAN_PNO
239 /**
240  * struct pno_def_config - def configuration for PNO
241  * @pno_offload_enabled: flag to check if PNO offload is enabled/disabled
242  * @channel_prediction: config PNO channel prediction feature status
243  * @top_k_num_of_channels: def top K number of channels are used for tanimoto
244  * distance calculation.
245  * @stationary_thresh: def threshold val to determine that STA is stationary.
246  * @pnoscan_adaptive_dwell_mode: def adaptive dwelltime mode for pno scan
247  * @channel_prediction_full_scan: def periodic timer upon which full scan needs
248  * to be triggered.
249  * @dfs_chnl_scan_enable: Enable dfs channel PNO scan
250  * @scan_support_enabled: PNO scan support enabled/disabled
251  * @scan_timer_repeat_value: PNO scan timer repeat value
252  * @slow_scan_multiplier: PNO slow scan timer multiplier
253  * @max_sched_scan_plan_interval: PNO scan interval
254  * @max_sched_scan_plan_iterations: PNO scan number of iterations
255  * @scan_backoff_multiplier: Scan banckoff multiplier
256  * @pno_wake_lock: pno wake lock
257  * @pno_runtime_pm_lock: pno runtime pm lock
258  * @pno_cb: callback to call on PNO completion
259  * @mawc_params: Configuration parameters for NLO MAWC.
260  * @user_config_sched_scan_plan: if enabled set user confing sched scan plan
261  */
262 struct pno_def_config {
263 	bool pno_offload_enabled;
264 	bool channel_prediction;
265 	uint8_t top_k_num_of_channels;
266 	uint8_t stationary_thresh;
267 	enum scan_dwelltime_adaptive_mode adaptive_dwell_mode;
268 	uint32_t channel_prediction_full_scan;
269 	bool dfs_chnl_scan_enabled;
270 	bool scan_support_enabled;
271 	uint32_t scan_timer_repeat_value;
272 	uint32_t slow_scan_multiplier;
273 	uint32_t max_sched_scan_plan_interval;
274 	uint32_t max_sched_scan_plan_iterations;
275 	uint8_t scan_backoff_multiplier;
276 	qdf_wake_lock_t pno_wake_lock;
277 	qdf_runtime_lock_t pno_runtime_pm_lock;
278 	struct cb_handler pno_cb;
279 	struct nlo_mawc_params mawc_params;
280 	bool user_config_sched_scan_plan;
281 };
282 #endif
283 
284 #ifdef FEATURE_WLAN_EXTSCAN
285 /**
286  * struct extscan_def_config - def configuration for EXTSCAN
287  * @extscan_enabled: enable extscan
288  * @extscan_passive_max_chn_time: max passive channel time
289  * @extscan_passive_min_chn_time: min passive channel time
290  * @extscan_active_max_chn_time: max active channel time
291  * @extscan_active_min_chn_time: min active channel time
292  */
293 struct extscan_def_config {
294 	bool     extscan_enabled;
295 	uint32_t extscan_passive_max_chn_time;
296 	uint32_t extscan_passive_min_chn_time;
297 	uint32_t extscan_active_max_chn_time;
298 	uint32_t extscan_active_min_chn_time;
299 };
300 #endif
301 
302 /**
303  * struct scan_default_params - default scan parameters to be used
304  * @active_dwell: default active dwell time
305  * @allow_dfs_chan_in_first_scan: first scan should contain dfs channels or not.
306  * @allow_dfs_chan_in_scan: Scan DFS channels or not.
307  * @skip_dfs_chan_in_p2p_search: Skip DFS channels in p2p search.
308  * @use_wake_lock_in_user_scan: if wake lock will be acquired during user scan
309  * @active_dwell_2g: default active dwell time for 2G channels, if it's not zero
310  * @min_dwell_time_6g: default min dwell time for 6G channels
311  * @active_dwell_6g: default active dwell time for 6G channels
312  * @passive_dwell_6g: default passive dwell time for 6G channels
313  * @active_dwell_time_6g_conc: default concurrent active dwell time for 6G
314  * @passive_dwell_time_6g_conc: default concurrent passive dwell time for 6G
315  * @passive_dwell:default passive dwell time
316  * @max_rest_time: default max rest time
317  * @sta_miracast_mcc_rest_time: max rest time for miracast and mcc
318  * @min_rest_time: default min rest time
319  * @idle_time: default idle time
320  * @conc_active_dwell: default concurrent active dwell time
321  * @conc_passive_dwell: default concurrent passive dwell time
322  * @conc_max_rest_time: default concurrent max rest time
323  * @conc_min_rest_time: default concurrent min rest time
324  * @conc_idle_time: default concurrent idle time
325  * @repeat_probe_time: default repeat probe time
326  * @probe_spacing_time: default probe spacing time
327  * @probe_delay: default probe delay
328  * @burst_duration: default burst duration
329  * @max_scan_time: default max scan time
330  * @num_probes: default maximum number of probes to sent
331  * @cache_aging_time: default scan cache aging time
332  * @select_5gh_margin: Prefer connecting to 5G AP even if
333  *      its RSSI is lower by select_5gh_margin dbm than 2.4G AP.
334  *      applicable if prefer_5ghz is set.
335  * @enable_mac_spoofing: enable mac address spoof in scan
336  * @max_bss_per_pdev: maximum number of bss entries to be maintained per pdev
337  * @max_active_scans_allowed: maximum number of active parallel scan allowed
338  *                            per psoc
339  * @scan_mode_6g: scan mode in 6Ghz
340  * @duty_cycle_6ghz: Enable optimization on 6g channels for every full scan
341  *                   except the duty cycle. So that every nth scan(depending on
342  *                   duty cycle) is a full scan and rest are all optimized scans
343  * @enable_connected_scan: enable scans after connection
344  * @scan_priority: default scan priority
345  * @adaptive_dwell_time_mode: adaptive dwell mode with connection
346  * @adaptive_dwell_time_mode_nc: adaptive dwell mode without connection
347  * @honour_nl_scan_policy_flags: honour nl80211 scan policy flags
348  * @extscan_adaptive_dwell_mode: Adaptive dwell mode during ext scan
349  * @scan_f_passive: passively scan all channels including active channels
350  * @scan_f_bcast_probe: add wild card ssid prbreq even if ssid_list is specified
351  * @scan_f_cck_rates: add cck rates to rates/xrates ie in prb req
352  * @scan_f_ofdm_rates: add ofdm rates to rates/xrates ie in prb req
353  * @scan_f_chan_stat_evnt: enable indication of chan load and noise floor
354  * @scan_f_filter_prb_req: filter Probe request frames
355  * @scan_f_bypass_dfs_chn: when set, do not scan DFS channels
356  * @scan_f_continue_on_err:continue scan even if few certain erros have occurred
357  * @scan_f_offchan_mgmt_tx: allow mgmt transmission during off channel scan
358  * @scan_f_offchan_data_tx: allow data transmission during off channel scan
359  * @scan_f_promisc_mode: scan with promiscuous mode
360  * @scan_f_capture_phy_err: enable capture ppdu with phy errrors
361  * @scan_f_strict_passive_pch: do passive scan on passive channels
362  * @scan_f_half_rate: enable HALF (10MHz) rate support
363  * @scan_f_quarter_rate: set Quarter (5MHz) rate support
364  * @scan_f_force_active_dfs_chn: allow to send probe req on DFS channel
365  * @scan_f_add_tpc_ie_in_probe: add TPC ie in probe req frame
366  * @scan_f_add_ds_ie_in_probe: add DS ie in probe req frame
367  * @scan_f_add_spoofed_mac_in_probe: use random mac address for TA in probe
368  * @scan_f_add_rand_seq_in_probe: use random sequence number in probe
369  * @scan_f_en_ie_whitelist_in_probe: enable ie whitelist in probe
370  * @scan_f_forced: force scan even in presence of data traffic
371  * @scan_f_2ghz: scan 2.4 GHz channels
372  * @scan_f_5ghz: scan 5 GHz channels
373  * @scan_f_wide_band: scan in 40 MHz or higher bandwidth
374  * @scan_flags: variable to read and set scan_f_* flags in one shot
375  *              can be used to dump all scan_f_* flags for debug
376  * @scan_ev_started: notify scan started event
377  * @scan_ev_completed: notify scan completed event
378  * @scan_ev_bss_chan: notify bss chan event
379  * @scan_ev_foreign_chan: notify foreign chan event
380  * @scan_ev_dequeued: notify scan request dequed event
381  * @scan_ev_preempted: notify scan preempted event
382  * @scan_ev_start_failed: notify scan start failed event
383  * @scan_ev_restarted: notify scan restarted event
384  * @scan_ev_foreign_chn_exit: notify foreign chan exit event
385  * @scan_ev_invalid: notify invalid scan request event
386  * @scan_ev_gpio_timeout: notify gpio timeout event
387  * @scan_ev_suspended: notify scan suspend event
388  * @scan_ev_resumed: notify scan resumed event
389  * @scan_events: variable to read and set scan_ev_* flags in one shot
390  *               can be used to dump all scan_ev_* flags for debug
391  * @roam_params: roam related params
392  */
393 struct scan_default_params {
394 	uint32_t active_dwell;
395 	bool allow_dfs_chan_in_first_scan;
396 	bool allow_dfs_chan_in_scan;
397 	bool skip_dfs_chan_in_p2p_search;
398 	bool use_wake_lock_in_user_scan;
399 	uint32_t active_dwell_2g;
400 	uint32_t min_dwell_time_6g;
401 	uint32_t active_dwell_6g;
402 	uint32_t passive_dwell_6g;
403 	uint32_t active_dwell_time_6g_conc;
404 	uint32_t passive_dwell_time_6g_conc;
405 	uint32_t passive_dwell;
406 	uint32_t max_rest_time;
407 	uint32_t sta_miracast_mcc_rest_time;
408 	uint32_t min_rest_time;
409 	uint32_t idle_time;
410 	uint32_t conc_active_dwell;
411 	uint32_t conc_passive_dwell;
412 	uint32_t conc_max_rest_time;
413 	uint32_t conc_min_rest_time;
414 	uint32_t conc_idle_time;
415 	uint32_t repeat_probe_time;
416 	uint32_t probe_spacing_time;
417 	uint32_t probe_delay;
418 	uint32_t burst_duration;
419 	uint32_t max_scan_time;
420 	uint32_t num_probes;
421 	qdf_time_t scan_cache_aging_time;
422 	uint32_t select_5ghz_margin;
423 	bool enable_mac_spoofing;
424 	uint32_t usr_cfg_probe_rpt_time;
425 	uint32_t usr_cfg_num_probes;
426 	uint16_t max_bss_per_pdev;
427 	uint32_t max_active_scans_allowed;
428 	uint8_t sta_scan_burst_duration;
429 	uint8_t p2p_scan_burst_duration;
430 	uint8_t go_scan_burst_duration;
431 	uint8_t ap_scan_burst_duration;
432 	enum scan_mode_6ghz scan_mode_6g;
433 	uint8_t duty_cycle_6ghz;
434 	bool enable_connected_scan;
435 	enum scan_priority scan_priority;
436 	enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode;
437 	enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode_nc;
438 	bool honour_nl_scan_policy_flags;
439 	enum scan_dwelltime_adaptive_mode extscan_adaptive_dwell_mode;
440 	union {
441 		struct {
442 			uint32_t scan_f_passive:1,
443 				scan_f_bcast_probe:1,
444 				scan_f_cck_rates:1,
445 				scan_f_ofdm_rates:1,
446 				scan_f_chan_stat_evnt:1,
447 				scan_f_filter_prb_req:1,
448 				scan_f_bypass_dfs_chn:1,
449 				scan_f_continue_on_err:1,
450 				scan_f_offchan_mgmt_tx:1,
451 				scan_f_offchan_data_tx:1,
452 				scan_f_promisc_mode:1,
453 				scan_f_capture_phy_err:1,
454 				scan_f_strict_passive_pch:1,
455 				scan_f_half_rate:1,
456 				scan_f_quarter_rate:1,
457 				scan_f_force_active_dfs_chn:1,
458 				scan_f_add_tpc_ie_in_probe:1,
459 				scan_f_add_ds_ie_in_probe:1,
460 				scan_f_add_spoofed_mac_in_probe:1,
461 				scan_f_add_rand_seq_in_probe:1,
462 				scan_f_en_ie_whitelist_in_probe:1,
463 				scan_f_forced:1,
464 				scan_f_2ghz:1,
465 				scan_f_5ghz:1,
466 				scan_f_wide_band:1;
467 		};
468 		uint32_t scan_flags;
469 	};
470 	union {
471 		struct {
472 			uint32_t scan_ev_started:1,
473 				scan_ev_completed:1,
474 				scan_ev_bss_chan:1,
475 				scan_ev_foreign_chan:1,
476 				scan_ev_dequeued:1,
477 				scan_ev_preempted:1,
478 				scan_ev_start_failed:1,
479 				scan_ev_restarted:1,
480 				scan_ev_foreign_chn_exit:1,
481 				scan_ev_invalid:1,
482 				scan_ev_gpio_timeout:1,
483 				scan_ev_suspended:1,
484 				scan_ev_resumed:1;
485 		};
486 		uint32_t scan_events;
487 	};
488 };
489 
490 /**
491  * struct scan_cb - nif/sif function callbacks
492  * @inform_beacon: cb to indicate frame to OS
493  * @update_beacon: cb to indicate frame to MLME
494  * @unlink_bss: cb to unlink bss from kernel cache
495  */
496 struct scan_cb {
497 	update_beacon_cb inform_beacon;
498 	update_beacon_cb update_beacon;
499 	update_beacon_cb unlink_bss;
500 	/* Define nif/sif function callbacks here */
501 };
502 
503 /**
504  * struct wlan_scan_obj - scan object definition
505  * @scan_disabled: if scan is disabled
506  * @scan_db:    scan cache data base
507  * @cc_db:      pointer of country code data base
508  * @lock:       spin lock
509  * @scan_def:   default scan parameters
510  * @cb:         nif/sif function callbacks
511  * @requesters: requester allocation pool
512  * @scan_ids:   last allocated scan id
513  * @global_evhandlers:  registered scan event handlers
514  * @pdev_info: pointer to pdev info
515  * @pno_cfg: default pno configuration
516  * @extscan_cfg: default extscan configuration
517  * @ie_whitelist: default ie whitelist attrs
518  * @bt_a2dp_enabled: if bt a2dp is enabled
519  * @miracast_enabled: miracast enabled
520  * @disable_timeout: command timeout disabled
521  * @drop_bcn_on_chan_mismatch: drop bcn if channel mismatch
522  * @obss_scan_offload: if obss scan offload is enabled
523  * @drop_bcn_on_invalid_freq: drop bcn if freq is invalid in IEs (DS/HT/HE)
524  * @scan_start_request_buff: buffer used to pass
525  *      scan config to event handlers
526  * @rnr_channel_db: RNR channel list database
527  * @duty_cycle_cnt_6ghz: Scan count to track the full scans and decide whether
528  *                        to optimizate 6g channels in the scan request based
529  *                        on the ini scan_mode_6ghz_duty_cycle.
530  * @allow_bss_with_incomplete_ie: Continue scan entry even if any corrupted IES are
531  *			    present.
532  */
533 struct wlan_scan_obj {
534 	uint32_t scan_disabled;
535 	qdf_spinlock_t lock;
536 	qdf_atomic_t scan_ids;
537 	struct scan_dbs scan_db[WLAN_UMAC_MAX_PDEVS];
538 	struct scan_country_code_db *cc_db;
539 	struct scan_default_params scan_def;
540 	struct scan_cb cb;
541 	struct scan_requester_info requesters[WLAN_MAX_REQUESTORS];
542 	struct global_scan_ev_handlers global_evhandlers;
543 	struct pdev_scan_info pdev_info[WLAN_UMAC_MAX_PDEVS];
544 #ifdef FEATURE_WLAN_SCAN_PNO
545 	struct pno_def_config pno_cfg;
546 #endif
547 #ifdef FEATURE_WLAN_EXTSCAN
548 	struct extscan_def_config extscan_cfg;
549 #endif
550 	struct probe_req_whitelist_attr ie_whitelist;
551 	bool bt_a2dp_enabled;
552 	bool miracast_enabled;
553 	bool disable_timeout;
554 	bool drop_bcn_on_chan_mismatch;
555 	bool drop_bcn_on_invalid_freq;
556 	bool obss_scan_offload;
557 	struct scan_start_request scan_start_request_buff;
558 #ifdef FEATURE_6G_SCAN_CHAN_SORT_ALGO
559 	struct channel_list_db rnr_channel_db;
560 #endif
561 #ifdef ENABLE_SCAN_PROFILE
562 	uint64_t scan_listener_cb_exe_dur[MAX_SCAN_EVENT_LISTENERS];
563 	uint64_t scm_scan_event_duration;
564 	uint64_t scm_scan_to_post_scan_duration;
565 #endif
566 	uint16_t duty_cycle_cnt_6ghz;
567 	bool allow_bss_with_incomplete_ie;
568 };
569 
570 #ifdef ENABLE_SCAN_PROFILE
571 static inline
572 void scm_duration_init(struct wlan_scan_obj *scan)
573 {
574 	if (!scan)
575 		return;
576 
577 	scan->scm_scan_event_duration = 0;
578 	scan->scm_scan_to_post_scan_duration = 0;
579 }
580 
581 static inline
582 void scm_event_duration_start(struct wlan_scan_obj *scan)
583 {
584 	if (!scan)
585 		return;
586 
587 	scan->scm_scan_event_duration =
588 		qdf_ktime_to_ms(qdf_ktime_get());
589 }
590 
591 static inline
592 void scm_event_duration_end(struct wlan_scan_obj *scan)
593 {
594 	if (!scan)
595 		return;
596 
597 	scan->scm_scan_event_duration =
598 		(qdf_ktime_to_ms(qdf_ktime_get()) -
599 		 scan->scm_scan_event_duration);
600 }
601 
602 static inline
603 void scm_to_post_scan_duration_set(struct wlan_scan_obj *scan)
604 {
605 	if (!scan)
606 		return;
607 
608 	scan->scm_scan_to_post_scan_duration =
609 		(qdf_ktime_to_ms(qdf_ktime_get()) -
610 		 scan->scm_scan_event_duration);
611 }
612 
613 static inline
614 void scm_listener_cb_exe_dur_start(struct wlan_scan_obj *scan, uint8_t index)
615 {
616 	if (!scan || (index >= MAX_SCAN_EVENT_LISTENERS))
617 		return;
618 
619 	scan->scan_listener_cb_exe_dur[index] =
620 		qdf_ktime_to_ms(qdf_ktime_get());
621 }
622 
623 static inline
624 void scm_listener_cb_exe_dur_end(struct wlan_scan_obj *scan, uint8_t index)
625 {
626 	if (!scan || (index >= MAX_SCAN_EVENT_LISTENERS))
627 		return;
628 
629 	scan->scan_listener_cb_exe_dur[index] =
630 		(qdf_ktime_to_ms(qdf_ktime_get()) -
631 		 scan->scan_listener_cb_exe_dur[index]);
632 }
633 
634 static inline
635 void scm_listener_duration_init(struct wlan_scan_obj *scan)
636 {
637 	if (!scan)
638 		return;
639 
640 	qdf_mem_set(&scan->scan_listener_cb_exe_dur,
641 		    sizeof(uint64_t) * MAX_SCAN_EVENT_LISTENERS,
642 		    0);
643 }
644 #else
645 static inline
646 void scm_duration_init(struct wlan_scan_obj *scan)
647 {
648 }
649 
650 static inline
651 void scm_event_duration_start(struct wlan_scan_obj *scan)
652 {
653 }
654 
655 static inline
656 void scm_event_duration_end(struct wlan_scan_obj *scan)
657 {
658 }
659 
660 static inline
661 void scm_to_post_scan_duration_set(struct wlan_scan_obj *scan)
662 {
663 }
664 
665 static inline
666 void scm_listener_cb_exe_dur_start(struct wlan_scan_obj *scan, uint8_t index)
667 {
668 }
669 
670 static inline
671 void scm_listener_cb_exe_dur_end(struct wlan_scan_obj *scan, uint8_t index)
672 {
673 }
674 
675 static inline
676 void scm_listener_duration_init(struct wlan_scan_obj *scan)
677 {
678 }
679 #endif
680 
681 /**
682  * wlan_psoc_get_scan_obj() - private API to get scan object from psoc
683  * @psoc: psoc object
684  *
685  * Return: scan object
686  */
687 #define wlan_psoc_get_scan_obj(psoc) \
688 	wlan_psoc_get_scan_obj_fl(psoc, \
689 				  __func__, __LINE__)
690 
691 static inline struct wlan_scan_obj *
692 wlan_psoc_get_scan_obj_fl(struct wlan_objmgr_psoc *psoc,
693 			  const char *func, uint32_t line)
694 {
695 	struct wlan_scan_obj *scan_obj;
696 
697 	scan_obj = (struct wlan_scan_obj *)
698 		wlan_objmgr_psoc_get_comp_private_obj(psoc,
699 				WLAN_UMAC_COMP_SCAN);
700 	if (!scan_obj) {
701 		scm_err("%s:%u, Failed to get scan object", func, line);
702 		return NULL;
703 	}
704 	return scan_obj;
705 }
706 
707 /**
708  * wlan_pdev_get_scan_obj() - private API to get scan object from pdev
709  * @psoc: pdev object
710  *
711  * Return: scan object
712  */
713 static inline struct wlan_scan_obj *
714 wlan_pdev_get_scan_obj(struct wlan_objmgr_pdev *pdev)
715 {
716 	struct wlan_objmgr_psoc *psoc;
717 
718 	psoc = wlan_pdev_get_psoc(pdev);
719 
720 	return wlan_psoc_get_scan_obj(psoc);
721 }
722 
723 /**
724  * wlan_vdev_get_scan_obj() - private API to get scan object from vdev
725  * @psoc: vdev object
726  *
727  * Return: scan object
728  */
729 static inline struct wlan_scan_obj *
730 wlan_vdev_get_scan_obj(struct wlan_objmgr_vdev *vdev)
731 {
732 	struct wlan_objmgr_pdev *pdev;
733 
734 	pdev = wlan_vdev_get_pdev(vdev);
735 
736 	return wlan_pdev_get_scan_obj(pdev);
737 }
738 
739 /**
740  * wlan_get_vdev_scan_obj() - private API to get scan object vdev
741  * @vdev: vdev object
742  *
743  * Return: scan object
744  */
745 static inline struct scan_vdev_obj *
746 wlan_get_vdev_scan_obj(struct wlan_objmgr_vdev *vdev)
747 {
748 	struct scan_vdev_obj *scan_vdev_obj;
749 
750 	scan_vdev_obj = (struct scan_vdev_obj *)
751 		wlan_objmgr_vdev_get_comp_private_obj(vdev,
752 				WLAN_UMAC_COMP_SCAN);
753 
754 	return scan_vdev_obj;
755 }
756 
757 /**
758  * wlan_scan_vdev_get_pdev_id() - private API to get pdev id from vdev object
759  * @vdev: vdev object
760  *
761  * Return: parent pdev id
762  */
763 static inline uint8_t
764 wlan_scan_vdev_get_pdev_id(struct wlan_objmgr_vdev *vdev)
765 {
766 	struct wlan_objmgr_pdev *pdev;
767 
768 	pdev = wlan_vdev_get_pdev(vdev);
769 
770 	return wlan_objmgr_pdev_get_pdev_id(pdev);
771 }
772 
773 /**
774  * wlan_pdev_get_pdev_scan_ev_handlers() - private API to get
775  * pdev scan event handlers
776  * @vdev: pdev object
777  *
778  * Return: pdev_scan_ev_handler object
779  */
780 static inline struct pdev_scan_ev_handler*
781 wlan_pdev_get_pdev_scan_ev_handlers(struct wlan_objmgr_pdev *pdev)
782 {
783 	uint8_t pdevid;
784 	struct wlan_scan_obj *scan = NULL;
785 
786 	if (!pdev)
787 		goto err;
788 
789 	pdevid = wlan_objmgr_pdev_get_pdev_id(pdev);
790 	scan = wlan_pdev_get_scan_obj(pdev);
791 	if (!scan)
792 		goto err;
793 
794 	return &scan->global_evhandlers.pdev_ev_handlers[pdevid];
795 
796 err:
797 	scm_err("NULL pointer, pdev: 0x%pK, scan_obj: 0x%pK",
798 		pdev, scan);
799 	return NULL;
800 }
801 
802 /**
803  * wlan_vdev_get_pdev_scan_ev_handlers() - private API to get
804  * pdev scan event handlers
805  * @vdev: vdev object
806  *
807  * Return: pdev_scan_ev_handler object
808  */
809 static inline struct pdev_scan_ev_handler*
810 wlan_vdev_get_pdev_scan_ev_handlers(struct wlan_objmgr_vdev *vdev)
811 {
812 	struct wlan_objmgr_pdev *pdev;
813 
814 	pdev = wlan_vdev_get_pdev(vdev);
815 
816 	return wlan_pdev_get_pdev_scan_ev_handlers(pdev);
817 }
818 
819 /**
820  * wlan_scan_psoc_get_def_params() - private API to get scan defaults
821  * @psoc: psoc object
822  *
823  * Return: scan defaults
824  */
825 static inline struct scan_default_params*
826 wlan_scan_psoc_get_def_params(struct wlan_objmgr_psoc *psoc)
827 {
828 	struct wlan_scan_obj *scan = NULL;
829 
830 	if (!psoc) {
831 		scm_err("null psoc");
832 		return NULL;
833 	}
834 	scan = wlan_psoc_get_scan_obj(psoc);
835 
836 	if (!scan)
837 		return NULL;
838 
839 	return &scan->scan_def;
840 }
841 
842 /**
843  * wlan_vdev_get_def_scan_params() - private API to get scan defaults
844  * @vdev: vdev object
845  *
846  * Return: scan defaults
847  */
848 static inline struct scan_default_params*
849 wlan_vdev_get_def_scan_params(struct wlan_objmgr_vdev *vdev)
850 {
851 	struct wlan_objmgr_psoc *psoc = NULL;
852 
853 	if (!vdev) {
854 		scm_err("null vdev");
855 		return NULL;
856 	}
857 	psoc = wlan_vdev_get_psoc(vdev);
858 
859 	return wlan_scan_psoc_get_def_params(psoc);
860 }
861 
862 /**
863  * wlan_scan_psoc_set_disable() - private API to disable scans for psoc
864  * @psoc: psoc on which scans need to be disabled
865  * @reason: reason for enable/disabled
866  *
867  * Return: QDF_STATUS.
868  */
869 static inline QDF_STATUS
870 wlan_scan_psoc_set_disable(struct wlan_objmgr_psoc *psoc,
871 			   enum scan_disable_reason reason)
872 {
873 	struct wlan_scan_obj *scan_obj;
874 
875 	scan_obj = wlan_psoc_get_scan_obj(psoc);
876 	if (!scan_obj) {
877 		scm_err("Failed to get scan object");
878 		return QDF_STATUS_E_NULL_VALUE;
879 	}
880 
881 	scan_obj->scan_disabled |= reason;
882 
883 	scm_debug("Psoc scan_disabled %x", scan_obj->scan_disabled);
884 
885 	return QDF_STATUS_SUCCESS;
886 }
887 
888 static inline QDF_STATUS
889 wlan_scan_psoc_set_enable(struct wlan_objmgr_psoc *psoc,
890 			  enum scan_disable_reason reason)
891 {
892 	struct wlan_scan_obj *scan_obj;
893 
894 	scan_obj = wlan_psoc_get_scan_obj(psoc);
895 	if (!scan_obj) {
896 		scm_err("Failed to get scan object");
897 		return QDF_STATUS_E_NULL_VALUE;
898 	}
899 
900 	scan_obj->scan_disabled &= ~reason;
901 	scm_debug("Psoc scan_disabled %x", scan_obj->scan_disabled);
902 
903 	return QDF_STATUS_SUCCESS;
904 }
905 
906 /**
907  * wlan_scan_psoc_created_notification() - scan psoc create handler
908  * @psoc: psoc object
909  * @arg_list: Argument list
910  *
911  * Return: QDF_STATUS
912  */
913 QDF_STATUS wlan_scan_psoc_created_notification(struct wlan_objmgr_psoc *psoc,
914 	void *arg_list);
915 
916 /**
917  * wlan_scan_psoc_deleted_notification() - scan psoc delete handler
918  * @psoc: psoc object
919  * @arg_list: Argument list
920  *
921  * Return: QDF_STATUS
922  */
923 QDF_STATUS wlan_scan_psoc_destroyed_notification(struct wlan_objmgr_psoc *psoc,
924 	void *arg_list);
925 
926 /**
927  * wlan_scan_vdev_created_notification() - scan psoc create handler
928  * @vdev: vdev object
929  * @arg_list: Argument list
930  *
931  * Return: QDF_STATUS
932  */
933 QDF_STATUS wlan_scan_vdev_created_notification(struct wlan_objmgr_vdev *vdev,
934 	void *arg_list);
935 
936 /**
937  * wlan_scan_vdev_destroyed_notification() - scan psoc delete handler
938  * @vdev: vdev object
939  * @arg_list: Argument list
940  *
941  * Return: QDF_STATUS
942  */
943 QDF_STATUS wlan_scan_vdev_destroyed_notification(struct wlan_objmgr_vdev *vdev,
944 	void *arg_list);
945 
946 #endif
947