1  /*
2   * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3   * Copyright (c) 2022-2023 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  /* Aux Scan Flags */
169  #define SCAN_FLAG_EXT_AUX_LOW_LATENCY_SCAN	0x00008000
170  #define SCAN_FLAG_EXT_AUX_RELIABLE_SCAN		0x00010000
171  #define SCAN_FLAG_EXT_AUX_LOW_POWER_SCAN	0x00040000
172  #define SCAN_FLAG_EXT_AUX_FAST_SCAN		0x00020000
173  
174  #define SCAN_FLAG_EXT_STOP_IF_BSSID_FOUND	0x00080000
175  /**
176   * struct cb_handler - defines scan event handler
177   * call back function and arguments
178   * @func: handler function pointer
179   * @arg: argument to handler function
180   */
181  struct cb_handler {
182  	scan_event_handler func;
183  	void *arg;
184  };
185  
186  /**
187   * struct pdev_scan_ev_handler - pdev scan event handlers
188   * @handler_cnt: number of valid entries in @cb_handler
189   * @cb_handlers: array of registered scan handlers
190   */
191  struct pdev_scan_ev_handler {
192  	uint32_t handler_cnt;
193  	struct cb_handler cb_handlers[MAX_SCAN_EVENT_HANDLERS_PER_PDEV];
194  };
195  
196  /**
197   * struct global_scan_ev_handlers - per pdev registered scan event handlers
198   * @pdev_ev_handlers: per pdev registered scan event handlers
199   */
200  struct global_scan_ev_handlers {
201  	struct pdev_scan_ev_handler pdev_ev_handlers[WLAN_UMAC_MAX_PDEVS];
202  };
203  
204  /**
205   * struct scan_requester_info - defines scan requester id
206   * and event handler mapping
207   * @requester:   requester ID allocated
208   * @module:      module name of requester
209   * @ev_handler:  event handlerto be invoked
210   */
211  struct scan_requester_info {
212  	wlan_scan_requester requester;
213  	uint8_t module[WLAN_MAX_MODULE_NAME];
214  	struct cb_handler ev_handler;
215  };
216  
217  /**
218   * struct pdev_scan_info - defines per pdev scan info
219   * @wide_band_scan: wide band scan capability
220   * @last_scan_time: time of last scan start on this pdev
221   * @custom_chan_list: scan only these channels
222   * @conf_bssid: configured bssid of the hidden AP
223   * @conf_ssid: configured desired ssid
224   * @chan_scan_info: channel list scan info
225   */
226  struct pdev_scan_info {
227  	bool wide_band_scan;
228  	qdf_time_t last_scan_time;
229  	struct chan_list custom_chan_list;
230  	uint8_t conf_bssid[QDF_MAC_ADDR_SIZE];
231  	struct wlan_ssid conf_ssid;
232  	struct chan_list_scan_info chan_scan_info;
233  };
234  
235  /**
236   * struct scan_vdev_obj - scan vdev obj
237   * @pno_match_evt_received: pno match received
238   * @pno_in_progress: pno in progress
239   * @scan_disabled: if scan is disabled for this vdev
240   * @first_scan_done: Whether its the first scan or not for this particular vdev.
241   */
242  struct scan_vdev_obj {
243  	bool pno_match_evt_received;
244  	bool pno_in_progress;
245  	uint32_t scan_disabled;
246  	bool first_scan_done;
247  };
248  
249  #ifdef FEATURE_WLAN_SCAN_PNO
250  /**
251   * struct pno_def_config - def configuration for PNO
252   * @pno_offload_enabled: flag to check if PNO offload is enabled/disabled
253   * @channel_prediction: config PNO channel prediction feature status
254   * @top_k_num_of_channels: def top K number of channels are used for tanimoto
255   * distance calculation.
256   * @stationary_thresh: def threshold val to determine that STA is stationary.
257   * @adaptive_dwell_mode: def adaptive dwelltime mode for pno scan
258   * @channel_prediction_full_scan: def periodic timer upon which full scan needs
259   * to be triggered.
260   * @dfs_chnl_scan_enabled: Enable dfs channel PNO scan
261   * @scan_support_enabled: PNO scan support enabled/disabled
262   * @scan_timer_repeat_value: PNO scan timer repeat value
263   * @slow_scan_multiplier: PNO slow scan timer multiplier
264   * @max_sched_scan_plan_interval: PNO scan interval
265   * @max_sched_scan_plan_iterations: PNO scan number of iterations
266   * @scan_backoff_multiplier: Scan banckoff multiplier
267   * @pno_wake_lock: pno wake lock
268   * @pno_runtime_pm_lock: pno runtime pm lock
269   * @pno_cb: callback to call on PNO completion
270   * @mawc_params: Configuration parameters for NLO MAWC.
271   * @user_config_sched_scan_plan: if enabled set user confing sched scan plan
272   */
273  struct pno_def_config {
274  	bool pno_offload_enabled;
275  	bool channel_prediction;
276  	uint8_t top_k_num_of_channels;
277  	uint8_t stationary_thresh;
278  	enum scan_dwelltime_adaptive_mode adaptive_dwell_mode;
279  	uint32_t channel_prediction_full_scan;
280  	bool dfs_chnl_scan_enabled;
281  	bool scan_support_enabled;
282  	uint32_t scan_timer_repeat_value;
283  	uint32_t slow_scan_multiplier;
284  	uint32_t max_sched_scan_plan_interval;
285  	uint32_t max_sched_scan_plan_iterations;
286  	uint8_t scan_backoff_multiplier;
287  	qdf_wake_lock_t pno_wake_lock;
288  	qdf_runtime_lock_t pno_runtime_pm_lock;
289  	struct cb_handler pno_cb;
290  	struct nlo_mawc_params mawc_params;
291  	bool user_config_sched_scan_plan;
292  };
293  #endif
294  
295  #ifdef FEATURE_WLAN_EXTSCAN
296  /**
297   * struct extscan_def_config - def configuration for EXTSCAN
298   * @extscan_enabled: enable extscan
299   * @extscan_passive_max_chn_time: max passive channel time
300   * @extscan_passive_min_chn_time: min passive channel time
301   * @extscan_active_max_chn_time: max active channel time
302   * @extscan_active_min_chn_time: min active channel time
303   */
304  struct extscan_def_config {
305  	bool     extscan_enabled;
306  	uint32_t extscan_passive_max_chn_time;
307  	uint32_t extscan_passive_min_chn_time;
308  	uint32_t extscan_active_max_chn_time;
309  	uint32_t extscan_active_min_chn_time;
310  };
311  #endif
312  
313  /**
314   * struct scan_default_params - default scan parameters to be used
315   * @active_dwell: default active dwell time
316   * @allow_dfs_chan_in_first_scan: first scan should contain dfs channels or not.
317   * @allow_dfs_chan_in_scan: Scan DFS channels or not.
318   * @skip_dfs_chan_in_p2p_search: Skip DFS channels in p2p search.
319   * @use_wake_lock_in_user_scan: if wake lock will be acquired during user scan
320   * @active_dwell_2g: default active dwell time for 2G channels, if it's not zero
321   * @min_dwell_time_6g: default min dwell time for 6G channels
322   * @active_dwell_6g: default active dwell time for 6G channels
323   * @passive_dwell_6g: default passive dwell time for 6G channels
324   * @active_dwell_time_6g_conc: default concurrent active dwell time for 6G
325   * @passive_dwell_time_6g_conc: default concurrent passive dwell time for 6G
326   * @passive_dwell:default passive dwell time
327   * @max_rest_time: default max rest time
328   * @sta_miracast_mcc_rest_time: max rest time for miracast and mcc
329   * @min_rest_time: default min rest time
330   * @idle_time: default idle time
331   * @conc_active_dwell: default concurrent active dwell time
332   * @conc_passive_dwell: default concurrent passive dwell time
333   * @conc_max_rest_time: default concurrent max rest time
334   * @conc_min_rest_time: default concurrent min rest time
335   * @conc_idle_time: default concurrent idle time
336   * @conc_chlist_trim: enable to trim concurrent scan channel list
337   * @repeat_probe_time: default repeat probe time
338   * @probe_spacing_time: default probe spacing time
339   * @probe_delay: default probe delay
340   * @burst_duration: default burst duration
341   * @max_scan_time: default max scan time
342   * @num_probes: default maximum number of probes to sent
343   * @scan_cache_aging_time: default scan cache aging time
344   * @select_5ghz_margin: Prefer connecting to 5 GHz AP even if
345   *      its RSSI is lower by @select_5ghz_margin dbm than 2.4 GHz AP.
346   *      applicable if prefer_5ghz is set.
347   * @enable_mac_spoofing: enable mac address spoof in scan
348   * @usr_cfg_probe_rpt_time:
349   * @usr_cfg_num_probes:
350   * @max_bss_per_pdev: maximum number of bss entries to be maintained per pdev
351   * @max_active_scans_allowed: maximum number of active parallel scan allowed
352   *                            per psoc
353   * @sta_scan_burst_duration:
354   * @p2p_scan_burst_duration:
355   * @go_scan_burst_duration:
356   * @ap_scan_burst_duration:
357   * @scan_mode_6g: scan mode in 6 GHz
358   * @duty_cycle_6ghz: Enable optimization on 6 GHz channels for every full scan
359   *                   except the duty cycle. So that every nth scan(depending on
360   *                   duty cycle) is a full scan and rest are all optimized scans
361   * @enable_connected_scan: enable scans after connection
362   * @scan_priority: default scan priority
363   * @adaptive_dwell_time_mode: adaptive dwell mode with connection
364   * @adaptive_dwell_time_mode_nc: adaptive dwell mode without connection
365   * @honour_nl_scan_policy_flags: honour nl80211 scan policy flags
366   * @extscan_adaptive_dwell_mode: Adaptive dwell mode during ext scan
367   * @skip_6g_and_indoor_freq: skip 6 GHz and 5 GHz indoor freq channel for
368   * STA scan if hw is non-DBS and SAP is present
369   * @last_scan_ageout_time: use last full scan results for provided time in ms
370   * @scan_f_passive: passively scan all channels including active channels
371   * @scan_f_bcast_probe: add wild card ssid prbreq even if ssid_list is specified
372   * @scan_f_cck_rates: add cck rates to rates/xrates ie in prb req
373   * @scan_f_ofdm_rates: add ofdm rates to rates/xrates ie in prb req
374   * @scan_f_chan_stat_evnt: enable indication of chan load and noise floor
375   * @scan_f_filter_prb_req: filter Probe request frames
376   * @scan_f_bypass_dfs_chn: when set, do not scan DFS channels
377   * @scan_f_continue_on_err:continue scan even if few certain errors have occurred
378   * @scan_f_offchan_mgmt_tx: allow mgmt transmission during off channel scan
379   * @scan_f_offchan_data_tx: allow data transmission during off channel scan
380   * @scan_f_promisc_mode: scan with promiscuous mode
381   * @scan_f_capture_phy_err: enable capture ppdu with phy errors
382   * @scan_f_strict_passive_pch: do passive scan on passive channels
383   * @scan_f_half_rate: enable HALF (10MHz) rate support
384   * @scan_f_quarter_rate: set Quarter (5MHz) rate support
385   * @scan_f_force_active_dfs_chn: allow to send probe req on DFS channel
386   * @scan_f_add_tpc_ie_in_probe: add TPC ie in probe req frame
387   * @scan_f_add_ds_ie_in_probe: add DS ie in probe req frame
388   * @scan_f_add_spoofed_mac_in_probe: use random mac address for TA in probe
389   * @scan_f_add_rand_seq_in_probe: use random sequence number in probe
390   * @scan_f_en_ie_allowlist_in_probe: enable ie allowlist in probe
391   * @scan_f_forced: force scan even in presence of data traffic
392   * @scan_f_2ghz: scan 2.4 GHz channels
393   * @scan_f_5ghz: scan 5 GHz channels
394   * @scan_f_wide_band: scan in 40 MHz or higher bandwidth
395   * @scan_flags: variable to read and set scan_f_* flags in one shot
396   *              can be used to dump all scan_f_* flags for debug
397   * @scan_ev_started: notify scan started event
398   * @scan_ev_completed: notify scan completed event
399   * @scan_ev_bss_chan: notify bss chan event
400   * @scan_ev_foreign_chan: notify foreign chan event
401   * @scan_ev_dequeued: notify scan request dequeued event
402   * @scan_ev_preempted: notify scan preempted event
403   * @scan_ev_start_failed: notify scan start failed event
404   * @scan_ev_restarted: notify scan restarted event
405   * @scan_ev_foreign_chn_exit: notify foreign chan exit event
406   * @scan_ev_invalid: notify invalid scan request event
407   * @scan_ev_gpio_timeout: notify gpio timeout event
408   * @scan_ev_suspended: notify scan suspend event
409   * @scan_ev_resumed: notify scan resumed event
410   * @scan_events: variable to read and set scan_ev_* flags in one shot
411   *               can be used to dump all scan_ev_* flags for debug
412   */
413  struct scan_default_params {
414  	uint32_t active_dwell;
415  	bool allow_dfs_chan_in_first_scan;
416  	bool allow_dfs_chan_in_scan;
417  	bool skip_dfs_chan_in_p2p_search;
418  	bool use_wake_lock_in_user_scan;
419  	uint32_t active_dwell_2g;
420  	uint32_t min_dwell_time_6g;
421  	uint32_t active_dwell_6g;
422  	uint32_t passive_dwell_6g;
423  	uint32_t active_dwell_time_6g_conc;
424  	uint32_t passive_dwell_time_6g_conc;
425  	uint32_t passive_dwell;
426  	uint32_t max_rest_time;
427  	uint32_t sta_miracast_mcc_rest_time;
428  	uint32_t min_rest_time;
429  	uint32_t idle_time;
430  	uint32_t conc_active_dwell;
431  	uint32_t conc_passive_dwell;
432  	uint32_t conc_max_rest_time;
433  	uint32_t conc_min_rest_time;
434  	uint32_t conc_idle_time;
435  	bool conc_chlist_trim;
436  	uint32_t repeat_probe_time;
437  	uint32_t probe_spacing_time;
438  	uint32_t probe_delay;
439  	uint32_t burst_duration;
440  	uint32_t max_scan_time;
441  	uint32_t num_probes;
442  	qdf_time_t scan_cache_aging_time;
443  	uint32_t select_5ghz_margin;
444  	bool enable_mac_spoofing;
445  	uint32_t usr_cfg_probe_rpt_time;
446  	uint32_t usr_cfg_num_probes;
447  	uint16_t max_bss_per_pdev;
448  	uint32_t max_active_scans_allowed;
449  	uint8_t sta_scan_burst_duration;
450  	uint8_t p2p_scan_burst_duration;
451  	uint8_t go_scan_burst_duration;
452  	uint8_t ap_scan_burst_duration;
453  	enum scan_mode_6ghz scan_mode_6g;
454  	uint8_t duty_cycle_6ghz;
455  	bool enable_connected_scan;
456  	enum scan_priority scan_priority;
457  	enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode;
458  	enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode_nc;
459  	bool honour_nl_scan_policy_flags;
460  	enum scan_dwelltime_adaptive_mode extscan_adaptive_dwell_mode;
461  	bool skip_6g_and_indoor_freq;
462  	uint32_t last_scan_ageout_time;
463  	union {
464  		struct {
465  			uint32_t scan_f_passive:1,
466  				scan_f_bcast_probe:1,
467  				scan_f_cck_rates:1,
468  				scan_f_ofdm_rates:1,
469  				scan_f_chan_stat_evnt:1,
470  				scan_f_filter_prb_req:1,
471  				scan_f_bypass_dfs_chn:1,
472  				scan_f_continue_on_err:1,
473  				scan_f_offchan_mgmt_tx:1,
474  				scan_f_offchan_data_tx:1,
475  				scan_f_promisc_mode:1,
476  				scan_f_capture_phy_err:1,
477  				scan_f_strict_passive_pch:1,
478  				scan_f_half_rate:1,
479  				scan_f_quarter_rate:1,
480  				scan_f_force_active_dfs_chn:1,
481  				scan_f_add_tpc_ie_in_probe:1,
482  				scan_f_add_ds_ie_in_probe:1,
483  				scan_f_add_spoofed_mac_in_probe:1,
484  				scan_f_add_rand_seq_in_probe:1,
485  				scan_f_en_ie_allowlist_in_probe:1,
486  				scan_f_forced:1,
487  				scan_f_2ghz:1,
488  				scan_f_5ghz:1,
489  				scan_f_wide_band:1;
490  		};
491  		uint32_t scan_flags;
492  	};
493  	union {
494  		struct {
495  			uint32_t scan_ev_started:1,
496  				scan_ev_completed:1,
497  				scan_ev_bss_chan:1,
498  				scan_ev_foreign_chan:1,
499  				scan_ev_dequeued:1,
500  				scan_ev_preempted:1,
501  				scan_ev_start_failed:1,
502  				scan_ev_restarted:1,
503  				scan_ev_foreign_chn_exit:1,
504  				scan_ev_invalid:1,
505  				scan_ev_gpio_timeout:1,
506  				scan_ev_suspended:1,
507  				scan_ev_resumed:1;
508  		};
509  		uint32_t scan_events;
510  	};
511  };
512  
513  /**
514   * struct scan_cb - nif/sif function callbacks
515   * @inform_beacon: cb to indicate frame to OS
516   * @update_beacon: cb to indicate frame to MLME
517   * @unlink_bss: cb to unlink bss from kernel cache
518   * @inform_mbssid_bcn_prb_rsp: cb to indicate frames with mbssid
519   */
520  struct scan_cb {
521  	update_beacon_cb inform_beacon;
522  	update_beacon_cb update_beacon;
523  	update_beacon_cb unlink_bss;
524  	update_mbssid_bcn_prb_rsp inform_mbssid_bcn_prb_rsp;
525  	/* Define nif/sif function callbacks here */
526  };
527  
528  /**
529   * struct wlan_scan_obj - scan object definition
530   * @scan_disabled: if scan is disabled
531   * @scan_db:    scan cache data base
532   * @cc_db:      pointer of country code data base
533   * @lock:       spin lock
534   * @scan_def:   default scan parameters
535   * @cb:         nif/sif function callbacks
536   * @requesters: requester allocation pool
537   * @scan_ids:   last allocated scan id
538   * @global_evhandlers:  registered scan event handlers
539   * @pdev_info: pointer to pdev info
540   * @pno_cfg: default pno configuration
541   * @extscan_cfg: default extscan configuration
542   * @ie_allowlist: default ie allowlist attrs
543   * @bt_a2dp_enabled: if bt a2dp is enabled
544   * @miracast_enabled: miracast enabled
545   * @disable_timeout: command timeout disabled
546   * @drop_bcn_on_chan_mismatch: drop bcn if channel mismatch
547   * @obss_scan_offload: if obss scan offload is enabled
548   * @drop_bcn_on_invalid_freq: drop bcn if freq is invalid in IEs (DS/HT/HE)
549   * @scan_start_request_buff: buffer used to pass
550   *      scan config to event handlers
551   * @rnr_channel_db: RNR channel list database
552   * @scan_listener_cb_exe_dur:
553   * @scm_scan_event_duration:
554   * @scm_scan_to_post_scan_duration:
555   * @duty_cycle_cnt_6ghz: Scan count to track the full scans and decide whether
556   *                        to optimizate 6g channels in the scan request based
557   *                        on the ini scan_mode_6ghz_duty_cycle.
558   * @allow_bss_with_incomplete_ie: Continue scan entry even if any corrupted
559   *                                IEs are present.
560   * @aux_mac_support: advertise aux mac support from FW
561   */
562  struct wlan_scan_obj {
563  	uint32_t scan_disabled;
564  	qdf_spinlock_t lock;
565  	qdf_atomic_t scan_ids;
566  	struct scan_dbs scan_db[WLAN_UMAC_MAX_PDEVS];
567  	struct scan_country_code_db *cc_db;
568  	struct scan_default_params scan_def;
569  	struct scan_cb cb;
570  	struct scan_requester_info requesters[WLAN_MAX_REQUESTORS];
571  	struct global_scan_ev_handlers global_evhandlers;
572  	struct pdev_scan_info pdev_info[WLAN_UMAC_MAX_PDEVS];
573  #ifdef FEATURE_WLAN_SCAN_PNO
574  	struct pno_def_config pno_cfg;
575  #endif
576  #ifdef FEATURE_WLAN_EXTSCAN
577  	struct extscan_def_config extscan_cfg;
578  #endif
579  	struct probe_req_allowlist_attr ie_allowlist;
580  	bool bt_a2dp_enabled;
581  	bool miracast_enabled;
582  	bool disable_timeout;
583  	bool drop_bcn_on_chan_mismatch;
584  	bool drop_bcn_on_invalid_freq;
585  	bool obss_scan_offload;
586  	struct scan_start_request scan_start_request_buff;
587  #ifdef FEATURE_6G_SCAN_CHAN_SORT_ALGO
588  	struct channel_list_db rnr_channel_db;
589  #endif
590  #ifdef ENABLE_SCAN_PROFILE
591  	uint64_t scan_listener_cb_exe_dur[MAX_SCAN_EVENT_LISTENERS];
592  	uint64_t scm_scan_event_duration;
593  	uint64_t scm_scan_to_post_scan_duration;
594  #endif
595  	uint16_t duty_cycle_cnt_6ghz;
596  	bool allow_bss_with_incomplete_ie;
597  	bool aux_mac_support;
598  };
599  
600  #ifdef ENABLE_SCAN_PROFILE
601  static inline
scm_duration_init(struct wlan_scan_obj * scan)602  void scm_duration_init(struct wlan_scan_obj *scan)
603  {
604  	if (!scan)
605  		return;
606  
607  	scan->scm_scan_event_duration = 0;
608  	scan->scm_scan_to_post_scan_duration = 0;
609  }
610  
611  static inline
scm_event_duration_start(struct wlan_scan_obj * scan)612  void scm_event_duration_start(struct wlan_scan_obj *scan)
613  {
614  	if (!scan)
615  		return;
616  
617  	scan->scm_scan_event_duration =
618  		qdf_ktime_to_ms(qdf_ktime_get());
619  }
620  
621  static inline
scm_event_duration_end(struct wlan_scan_obj * scan)622  void scm_event_duration_end(struct wlan_scan_obj *scan)
623  {
624  	if (!scan)
625  		return;
626  
627  	scan->scm_scan_event_duration =
628  		(qdf_ktime_to_ms(qdf_ktime_get()) -
629  		 scan->scm_scan_event_duration);
630  }
631  
632  static inline
scm_to_post_scan_duration_set(struct wlan_scan_obj * scan)633  void scm_to_post_scan_duration_set(struct wlan_scan_obj *scan)
634  {
635  	if (!scan)
636  		return;
637  
638  	scan->scm_scan_to_post_scan_duration =
639  		(qdf_ktime_to_ms(qdf_ktime_get()) -
640  		 scan->scm_scan_event_duration);
641  }
642  
643  static inline
scm_listener_cb_exe_dur_start(struct wlan_scan_obj * scan,uint8_t index)644  void scm_listener_cb_exe_dur_start(struct wlan_scan_obj *scan, uint8_t index)
645  {
646  	if (!scan || (index >= MAX_SCAN_EVENT_LISTENERS))
647  		return;
648  
649  	scan->scan_listener_cb_exe_dur[index] =
650  		qdf_ktime_to_ms(qdf_ktime_get());
651  }
652  
653  static inline
scm_listener_cb_exe_dur_end(struct wlan_scan_obj * scan,uint8_t index)654  void scm_listener_cb_exe_dur_end(struct wlan_scan_obj *scan, uint8_t index)
655  {
656  	if (!scan || (index >= MAX_SCAN_EVENT_LISTENERS))
657  		return;
658  
659  	scan->scan_listener_cb_exe_dur[index] =
660  		(qdf_ktime_to_ms(qdf_ktime_get()) -
661  		 scan->scan_listener_cb_exe_dur[index]);
662  }
663  
664  static inline
scm_listener_duration_init(struct wlan_scan_obj * scan)665  void scm_listener_duration_init(struct wlan_scan_obj *scan)
666  {
667  	if (!scan)
668  		return;
669  
670  	qdf_mem_set(&scan->scan_listener_cb_exe_dur,
671  		    sizeof(uint64_t) * MAX_SCAN_EVENT_LISTENERS,
672  		    0);
673  }
674  #else
675  static inline
scm_duration_init(struct wlan_scan_obj * scan)676  void scm_duration_init(struct wlan_scan_obj *scan)
677  {
678  }
679  
680  static inline
scm_event_duration_start(struct wlan_scan_obj * scan)681  void scm_event_duration_start(struct wlan_scan_obj *scan)
682  {
683  }
684  
685  static inline
scm_event_duration_end(struct wlan_scan_obj * scan)686  void scm_event_duration_end(struct wlan_scan_obj *scan)
687  {
688  }
689  
690  static inline
scm_to_post_scan_duration_set(struct wlan_scan_obj * scan)691  void scm_to_post_scan_duration_set(struct wlan_scan_obj *scan)
692  {
693  }
694  
695  static inline
scm_listener_cb_exe_dur_start(struct wlan_scan_obj * scan,uint8_t index)696  void scm_listener_cb_exe_dur_start(struct wlan_scan_obj *scan, uint8_t index)
697  {
698  }
699  
700  static inline
scm_listener_cb_exe_dur_end(struct wlan_scan_obj * scan,uint8_t index)701  void scm_listener_cb_exe_dur_end(struct wlan_scan_obj *scan, uint8_t index)
702  {
703  }
704  
705  static inline
scm_listener_duration_init(struct wlan_scan_obj * scan)706  void scm_listener_duration_init(struct wlan_scan_obj *scan)
707  {
708  }
709  #endif
710  
711  /**
712   * wlan_psoc_get_scan_obj() - private API to get scan object from psoc
713   * @psoc: psoc object
714   *
715   * Return: scan object
716   */
717  #define wlan_psoc_get_scan_obj(psoc) \
718  	wlan_psoc_get_scan_obj_fl(psoc, \
719  				  __func__, __LINE__)
720  
721  static inline struct wlan_scan_obj *
wlan_psoc_get_scan_obj_fl(struct wlan_objmgr_psoc * psoc,const char * func,uint32_t line)722  wlan_psoc_get_scan_obj_fl(struct wlan_objmgr_psoc *psoc,
723  			  const char *func, uint32_t line)
724  {
725  	struct wlan_scan_obj *scan_obj;
726  
727  	scan_obj = (struct wlan_scan_obj *)
728  		wlan_objmgr_psoc_get_comp_private_obj(psoc,
729  				WLAN_UMAC_COMP_SCAN);
730  	if (!scan_obj) {
731  		scm_err("%s:%u, Failed to get scan object", func, line);
732  		return NULL;
733  	}
734  	return scan_obj;
735  }
736  
737  /**
738   * wlan_pdev_get_scan_obj() - private API to get scan object from pdev
739   * @pdev: pdev object
740   *
741   * Return: scan object
742   */
743  static inline struct wlan_scan_obj *
wlan_pdev_get_scan_obj(struct wlan_objmgr_pdev * pdev)744  wlan_pdev_get_scan_obj(struct wlan_objmgr_pdev *pdev)
745  {
746  	struct wlan_objmgr_psoc *psoc;
747  
748  	psoc = wlan_pdev_get_psoc(pdev);
749  
750  	return wlan_psoc_get_scan_obj(psoc);
751  }
752  
753  /**
754   * wlan_vdev_get_scan_obj() - private API to get scan object from vdev
755   * @vdev: vdev object
756   *
757   * Return: scan object
758   */
759  static inline struct wlan_scan_obj *
wlan_vdev_get_scan_obj(struct wlan_objmgr_vdev * vdev)760  wlan_vdev_get_scan_obj(struct wlan_objmgr_vdev *vdev)
761  {
762  	struct wlan_objmgr_pdev *pdev;
763  
764  	pdev = wlan_vdev_get_pdev(vdev);
765  
766  	return wlan_pdev_get_scan_obj(pdev);
767  }
768  
769  /**
770   * wlan_get_vdev_scan_obj() - private API to get scan object vdev
771   * @vdev: vdev object
772   *
773   * Return: scan object
774   */
775  static inline struct scan_vdev_obj *
wlan_get_vdev_scan_obj(struct wlan_objmgr_vdev * vdev)776  wlan_get_vdev_scan_obj(struct wlan_objmgr_vdev *vdev)
777  {
778  	struct scan_vdev_obj *scan_vdev_obj;
779  
780  	scan_vdev_obj = (struct scan_vdev_obj *)
781  		wlan_objmgr_vdev_get_comp_private_obj(vdev,
782  				WLAN_UMAC_COMP_SCAN);
783  
784  	return scan_vdev_obj;
785  }
786  
787  /**
788   * wlan_scan_vdev_get_pdev_id() - private API to get pdev id from vdev object
789   * @vdev: vdev object
790   *
791   * Return: parent pdev id
792   */
793  static inline uint8_t
wlan_scan_vdev_get_pdev_id(struct wlan_objmgr_vdev * vdev)794  wlan_scan_vdev_get_pdev_id(struct wlan_objmgr_vdev *vdev)
795  {
796  	struct wlan_objmgr_pdev *pdev;
797  
798  	pdev = wlan_vdev_get_pdev(vdev);
799  
800  	return wlan_objmgr_pdev_get_pdev_id(pdev);
801  }
802  
803  /**
804   * wlan_pdev_get_pdev_scan_ev_handlers() - private API to get
805   * pdev scan event handlers
806   * @pdev: pdev object
807   *
808   * Return: pdev_scan_ev_handler object
809   */
810  static inline struct pdev_scan_ev_handler*
wlan_pdev_get_pdev_scan_ev_handlers(struct wlan_objmgr_pdev * pdev)811  wlan_pdev_get_pdev_scan_ev_handlers(struct wlan_objmgr_pdev *pdev)
812  {
813  	uint8_t pdevid;
814  	struct wlan_scan_obj *scan = NULL;
815  
816  	if (!pdev)
817  		goto err;
818  
819  	pdevid = wlan_objmgr_pdev_get_pdev_id(pdev);
820  	scan = wlan_pdev_get_scan_obj(pdev);
821  	if (!scan)
822  		goto err;
823  
824  	return &scan->global_evhandlers.pdev_ev_handlers[pdevid];
825  
826  err:
827  	scm_err("NULL pointer, pdev: 0x%pK, scan_obj: 0x%pK",
828  		pdev, scan);
829  	return NULL;
830  }
831  
832  /**
833   * wlan_vdev_get_pdev_scan_ev_handlers() - private API to get
834   * pdev scan event handlers
835   * @vdev: vdev object
836   *
837   * Return: pdev_scan_ev_handler object
838   */
839  static inline struct pdev_scan_ev_handler*
wlan_vdev_get_pdev_scan_ev_handlers(struct wlan_objmgr_vdev * vdev)840  wlan_vdev_get_pdev_scan_ev_handlers(struct wlan_objmgr_vdev *vdev)
841  {
842  	struct wlan_objmgr_pdev *pdev;
843  
844  	pdev = wlan_vdev_get_pdev(vdev);
845  
846  	return wlan_pdev_get_pdev_scan_ev_handlers(pdev);
847  }
848  
849  /**
850   * wlan_scan_psoc_get_def_params() - private API to get scan defaults
851   * @psoc: psoc object
852   *
853   * Return: scan defaults
854   */
855  static inline struct scan_default_params*
wlan_scan_psoc_get_def_params(struct wlan_objmgr_psoc * psoc)856  wlan_scan_psoc_get_def_params(struct wlan_objmgr_psoc *psoc)
857  {
858  	struct wlan_scan_obj *scan = NULL;
859  
860  	if (!psoc) {
861  		scm_err("null psoc");
862  		return NULL;
863  	}
864  	scan = wlan_psoc_get_scan_obj(psoc);
865  
866  	if (!scan)
867  		return NULL;
868  
869  	return &scan->scan_def;
870  }
871  
872  /**
873   * wlan_vdev_get_def_scan_params() - private API to get scan defaults
874   * @vdev: vdev object
875   *
876   * Return: scan defaults
877   */
878  static inline struct scan_default_params*
wlan_vdev_get_def_scan_params(struct wlan_objmgr_vdev * vdev)879  wlan_vdev_get_def_scan_params(struct wlan_objmgr_vdev *vdev)
880  {
881  	struct wlan_objmgr_psoc *psoc = NULL;
882  
883  	if (!vdev) {
884  		scm_err("null vdev");
885  		return NULL;
886  	}
887  	psoc = wlan_vdev_get_psoc(vdev);
888  
889  	return wlan_scan_psoc_get_def_params(psoc);
890  }
891  
892  /**
893   * wlan_scan_psoc_set_disable() - private API to disable scans for psoc
894   * @psoc: psoc on which scans need to be disabled
895   * @reason: reason for enable/disabled
896   *
897   * Return: QDF_STATUS.
898   */
899  static inline QDF_STATUS
wlan_scan_psoc_set_disable(struct wlan_objmgr_psoc * psoc,enum scan_disable_reason reason)900  wlan_scan_psoc_set_disable(struct wlan_objmgr_psoc *psoc,
901  			   enum scan_disable_reason reason)
902  {
903  	struct wlan_scan_obj *scan_obj;
904  
905  	scan_obj = wlan_psoc_get_scan_obj(psoc);
906  	if (!scan_obj) {
907  		scm_err("Failed to get scan object");
908  		return QDF_STATUS_E_NULL_VALUE;
909  	}
910  
911  	scan_obj->scan_disabled |= reason;
912  
913  	scm_debug("Psoc scan_disabled %x", scan_obj->scan_disabled);
914  
915  	return QDF_STATUS_SUCCESS;
916  }
917  
918  static inline QDF_STATUS
wlan_scan_psoc_set_enable(struct wlan_objmgr_psoc * psoc,enum scan_disable_reason reason)919  wlan_scan_psoc_set_enable(struct wlan_objmgr_psoc *psoc,
920  			  enum scan_disable_reason reason)
921  {
922  	struct wlan_scan_obj *scan_obj;
923  
924  	scan_obj = wlan_psoc_get_scan_obj(psoc);
925  	if (!scan_obj) {
926  		scm_err("Failed to get scan object");
927  		return QDF_STATUS_E_NULL_VALUE;
928  	}
929  
930  	scan_obj->scan_disabled &= ~reason;
931  	scm_debug("Psoc scan_disabled %x", scan_obj->scan_disabled);
932  
933  	return QDF_STATUS_SUCCESS;
934  }
935  
936  /**
937   * wlan_scan_psoc_created_notification() - scan psoc create handler
938   * @psoc: psoc object
939   * @arg_list: Argument list
940   *
941   * Return: QDF_STATUS
942   */
943  QDF_STATUS wlan_scan_psoc_created_notification(struct wlan_objmgr_psoc *psoc,
944  	void *arg_list);
945  
946  /**
947   * wlan_scan_psoc_destroyed_notification() - scan psoc delete handler
948   * @psoc: psoc object
949   * @arg_list: Argument list
950   *
951   * Return: QDF_STATUS
952   */
953  QDF_STATUS wlan_scan_psoc_destroyed_notification(struct wlan_objmgr_psoc *psoc,
954  	void *arg_list);
955  
956  /**
957   * wlan_scan_vdev_created_notification() - scan psoc create handler
958   * @vdev: vdev object
959   * @arg_list: Argument list
960   *
961   * Return: QDF_STATUS
962   */
963  QDF_STATUS wlan_scan_vdev_created_notification(struct wlan_objmgr_vdev *vdev,
964  	void *arg_list);
965  
966  /**
967   * wlan_scan_vdev_destroyed_notification() - scan psoc delete handler
968   * @vdev: vdev object
969   * @arg_list: Argument list
970   *
971   * Return: QDF_STATUS
972   */
973  QDF_STATUS wlan_scan_vdev_destroyed_notification(struct wlan_objmgr_vdev *vdev,
974  	void *arg_list);
975  
976  #endif
977