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