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