1 /* 2 * Copyright (c) 2013, 2016-2020 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2005-2006 Atheros Communications, Inc. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /** 19 * DOC: This file has main dfs structures. 20 */ 21 22 #ifndef _DFS_H_ 23 #define _DFS_H_ 24 25 #include <qdf_types.h> /* QDF_NBUF_EXEMPT_NO_EXEMPTION, etc. */ 26 #include <qdf_net_types.h> /* QDF_NBUF_EXEMPT_NO_EXEMPTION, etc. */ 27 #include <qdf_nbuf.h> /* qdf_nbuf_t, etc. */ 28 #include <qdf_util.h> /* qdf_assert */ 29 #include <qdf_lock.h> /* qdf_spinlock */ 30 #include <qdf_time.h> 31 #include <qdf_timer.h> 32 #include <qdf_str.h> /* qdf_str_lcopy */ 33 34 #include <wlan_dfs_ioctl.h> 35 #include "dfs_structs.h" 36 #include "dfs_channel.h" 37 #include "dfs_ioctl_private.h" 38 #include <i_qdf_types.h> /* For qdf_packed*/ 39 #include "queue.h" /* For STAILQ_ENTRY */ 40 #include <wlan_objmgr_psoc_obj.h> 41 #include <wlan_objmgr_pdev_obj.h> 42 #include <osdep.h> 43 #include <wlan_cmn.h> 44 #include "target_type.h" 45 #ifdef QCA_SUPPORT_AGILE_DFS 46 #include <wlan_sm_engine.h> /* for struct wlan_sm */ 47 #endif 48 #include <wlan_dfs_public_struct.h> 49 #include <reg_services_public_struct.h> 50 51 /* File Line and Submodule String */ 52 #define FLSM(x, str) #str " : " FL(x) 53 /* Cast to dfs type */ 54 #define DC(x) ((struct wlan_dfs *)(x)) 55 56 /** 57 * dfs_log: dfs logging using submodule MASKs and 58 * QDF trace level. 59 * The logging is controlled by two bitmasks: 60 * 1) submodule bitmask: sm 61 * 2) trace level masks: level 62 * 63 * @dfs: The dfs object pointer or NULL if dfs is not defined. 64 * @sm: Submodule BITMASK. 65 * @level: QDF trace level. 66 * @args...: Variable argument list. 67 * 68 * The submodule(sm) cannot be empty even if argument dfs is NULL. 69 * Else the macro will create a compilation error. 70 * One may provide WLAN_DEBUG_DFS_ALWAYS when the argument dfs is NULL. 71 * Example:- 72 * dfs_log(NULL, WLAN_DEBUG_DFS_ALWAYS, QDF_TRACE_LEVEL_INFO,"Error pulse"); 73 * 74 * Why DC(x) is required? 75 * Since NULL is defined as ((void *)(0)), if the argument "dfs" 76 * in a call to the macro "dfs_log" is NULL 77 * then during compilation (NULL)->dfs_debug_mask will dereference 78 * a (void *) type, which is illegal. Therefore, we need 79 * the cast: (DC(dfs))->dfs_debug_mask. 80 * Example:- 81 * dfs_log(NULL, WLAN_DEBUG_DFS, QDF_TRACE_LEVEL_INFO,"dfs is NULL"); 82 */ 83 #define dfs_log(dfs, sm, level, args...) do { \ 84 if (((dfs) == NULL) || \ 85 ((sm) == WLAN_DEBUG_DFS_ALWAYS) || \ 86 ((sm) & ((DC(dfs))->dfs_debug_mask))) { \ 87 QDF_TRACE(QDF_MODULE_ID_DFS, level, ## args); \ 88 } \ 89 } while (0) 90 91 #define dfs_logfl(dfs, level, sm, format, args...) \ 92 dfs_log(dfs, sm, level, FLSM(format, sm), ## args) 93 94 #define dfs_alert(dfs, sm, format, args...) \ 95 dfs_logfl(dfs, QDF_TRACE_LEVEL_FATAL, sm, format, ## args) 96 97 #define dfs_err(dfs, sm, format, args...) \ 98 dfs_logfl(dfs, QDF_TRACE_LEVEL_ERROR, sm, format, ## args) 99 100 #define dfs_warn(dfs, sm, format, args...) \ 101 dfs_logfl(dfs, QDF_TRACE_LEVEL_WARN, sm, format, ## args) 102 103 #define dfs_info(dfs, sm, format, args...) \ 104 dfs_logfl(dfs, QDF_TRACE_LEVEL_INFO, sm, format, ## args) 105 106 #define dfs_debug(dfs, sm, format, args...) \ 107 dfs_logfl(dfs, QDF_TRACE_LEVEL_DEBUG, sm, format, ## args) 108 109 #define DFS_MIN(a, b) ((a) < (b)?(a):(b)) 110 #define DFS_MAX(a, b) ((a) > (b)?(a) : (b)) 111 #define DFS_DIFF(a, b)(DFS_MAX(a, b) - DFS_MIN(a, b)) 112 113 /** 114 * Maximum number of radar events to be processed in a single iteration. 115 * Allows soft watchdog to run. 116 */ 117 #define MAX_EVENTS 100 118 119 /** 120 * Constants to use for chirping detection. 121 * 122 * All are unconverted as HW reports them. 123 * 124 * XXX Are these constants with or without fast clock 5GHz operation? 125 * XXX Peregrine reports pulses in microseconds, not hardware clocks! 126 */ 127 128 #define MAX_DUR_FOR_LOW_RSSI 4 129 130 /** 131 * Cascade has issue with reported duration especially when there is a 132 * crossover of chirp from one segment to another. It may report a value 133 * of duration that is well below 50us for a valid FCC type 5 chirping 134 * pulse. For now changing minimum duration as a work around. This will 135 * affect all chips but since we detect chirp with Merlin+, we may be OK 136 * for now. We need a more robust solution for this. 137 */ 138 #define MIN_BIN5_DUR_CAS 25 /* 50 * 1.25*/ 139 #define MIN_BIN5_DUR_MICROSEC_CAS 20 140 #define MIN_BIN5_DUR 63 /* 50 * 1.25*/ 141 #define MIN_BIN5_DUR_MICROSEC 50 142 #define MAYBE_BIN5_DUR 35 /* 28 * 1.25*/ 143 #define MAYBE_BIN5_DUR_MICROSEC 28 144 145 /* Conversion is already done using dfs->dur_multiplier */ 146 #define MAX_BIN5_DUR 145 /* use 145 for osprey */ 147 #define MAX_BIN5_DUR_MICROSEC 105 148 149 #define DFS_MARGIN_EQUAL(a, b, margin) ((DFS_DIFF(a, b)) <= margin) 150 #define DFS_MAX_STAGGERED_BURSTS 3 151 152 /** 153 * All filter thresholds in the radar filter tables are effective at a 50% 154 * channel loading. 155 */ 156 #define DFS_CHAN_LOADING_THRESH 50 157 #define DFS_EXT_CHAN_LOADING_THRESH 30 158 #define DFS_DEFAULT_PRI_MARGIN 6 159 #define DFS_DEFAULT_FIXEDPATTERN_PRI_MARGIN 4 160 161 #define WLAN_DFSQ_LOCK(_dfs) qdf_spin_lock_bh(&(_dfs)->dfs_radarqlock) 162 #define WLAN_DFSQ_UNLOCK(_dfs) qdf_spin_unlock_bh(&(_dfs)->dfs_radarqlock) 163 #define WLAN_DFSQ_LOCK_CREATE(_dfs) qdf_spinlock_create( \ 164 &(_dfs)->dfs_radarqlock) 165 #define WLAN_DFSQ_LOCK_DESTROY(_dfs) qdf_spinlock_destroy( \ 166 &(_dfs)->dfs_radarqlock) 167 168 #define WLAN_ARQ_LOCK(_dfs) qdf_spin_lock_bh(&(_dfs)->dfs_arqlock) 169 #define WLAN_ARQ_UNLOCK(_dfs) qdf_spin_unlock_bh(&(_dfs)->dfs_arqlock) 170 #define WLAN_ARQ_LOCK_CREATE(_dfs) qdf_spinlock_create(&(_dfs)->dfs_arqlock) 171 #define WLAN_ARQ_LOCK_DESTROY(_dfs) qdf_spinlock_destroy(&(_dfs)->dfs_arqlock) 172 173 #define WLAN_DFSEVENTQ_LOCK(_dfs) qdf_spin_lock_bh(&(_dfs)->dfs_eventqlock) 174 #define WLAN_DFSEVENTQ_UNLOCK(_dfs) qdf_spin_unlock_bh( \ 175 &(_dfs)->dfs_eventqlock) 176 #define WLAN_DFSEVENTQ_LOCK_CREATE(_dfs) qdf_spinlock_create( \ 177 &(_dfs)->dfs_eventqlock) 178 #define WLAN_DFSEVENTQ_LOCK_DESTROY(_dfs) qdf_spinlock_destroy( \ 179 &(_dfs)->dfs_eventqlock) 180 181 #define WLAN_DFSNOL_LOCK(_dfs) qdf_spin_lock_bh(&(_dfs)->dfs_nol_lock) 182 #define WLAN_DFSNOL_UNLOCK(_dfs) qdf_spin_unlock_bh(&(_dfs)->dfs_nol_lock) 183 #define WLAN_DFSNOL_LOCK_CREATE(_dfs) qdf_spinlock_create( \ 184 &(_dfs)->dfs_nol_lock) 185 #define WLAN_DFSNOL_LOCK_DESTROY(_dfs) qdf_spinlock_destroy( \ 186 &(_dfs)->dfs_nol_lock) 187 188 #define PRECAC_LIST_LOCK(_dfs) qdf_spin_lock_irqsave( \ 189 &(_dfs)->dfs_precac_lock) 190 #define PRECAC_LIST_UNLOCK(_dfs) qdf_spin_unlock_irqrestore( \ 191 &(_dfs)->dfs_precac_lock) 192 #define PRECAC_LIST_LOCK_CREATE(_dfs) qdf_spinlock_create( \ 193 &(_dfs)->dfs_precac_lock) 194 #define PRECAC_LIST_LOCK_DESTROY(_dfs) qdf_spinlock_destroy( \ 195 &(_dfs)->dfs_precac_lock) 196 197 #define WLAN_DFS_DATA_STRUCT_LOCK(_dfs) \ 198 qdf_spin_lock_bh(&(_dfs)->dfs_data_struct_lock) 199 #define WLAN_DFS_DATA_STRUCT_UNLOCK(_dfs) \ 200 qdf_spin_unlock_bh(&(_dfs)->dfs_data_struct_lock) 201 #define WLAN_DFS_DATA_STRUCT_LOCK_CREATE(_dfs) \ 202 qdf_spinlock_create(&(_dfs)->dfs_data_struct_lock) 203 #define WLAN_DFS_DATA_STRUCT_LOCK_DESTROY(_dfs) \ 204 qdf_spinlock_destroy(&(_dfs)->dfs_data_struct_lock) 205 206 /* Wrappers to call MLME radar during mode switch lock. */ 207 #define DFS_RADAR_MODE_SWITCH_LOCK(_dfs) \ 208 dfs_mlme_acquire_radar_mode_switch_lock((_dfs)->dfs_pdev_obj) 209 #define DFS_RADAR_MODE_SWITCH_UNLOCK(_dfs) \ 210 dfs_mlme_release_radar_mode_switch_lock((_dfs)->dfs_pdev_obj) 211 212 /* Mask for time stamp from descriptor */ 213 #define DFS_TSMASK 0xFFFFFFFF 214 /* Shift for time stamp from descriptor */ 215 #define DFS_TSSHIFT 32 216 /* 64 bit TSF wrap value */ 217 #define DFS_TSF_WRAP 0xFFFFFFFFFFFFFFFFULL 218 /* TS mask for 64 bit value */ 219 #define DFS_64BIT_TSFMASK 0x0000000000007FFFULL 220 221 #define DFS_AR_RADAR_RSSI_THR 5 /* in dB */ 222 #define DFS_AR_RADAR_RESET_INT 1 /* in secs */ 223 #define DFS_AR_RADAR_MAX_HISTORY 500 224 #define DFS_AR_REGION_WIDTH 128 225 #define DFS_AR_RSSI_THRESH_STRONG_PKTS 17 /* in dB */ 226 #define DFS_AR_RSSI_DOUBLE_THRESHOLD 15 /* in dB */ 227 #define DFS_AR_MAX_NUM_ACK_REGIONS 9 228 #define DFS_AR_ACK_DETECT_PAR_THRESH 20 229 #define DFS_AR_PKT_COUNT_THRESH 20 230 231 #define DFS_MAX_DL_SIZE 64 232 #define DFS_MAX_DL_MASK 0x3F 233 234 #define DFS_NOL_TIME DFS_NOL_TIMEOUT_US 235 /* 30 minutes in usecs */ 236 237 #define DFS_WAIT_TIME (60*1000000) /* 1 minute in usecs */ 238 239 #define DFS_DISABLE_TIME (3*60*1000000) /* 3 minutes in usecs */ 240 241 #define DFS_MAX_B5_SIZE 128 242 #define DFS_MAX_B5_MASK 0x0000007F /* 128 */ 243 244 /* Max number of overlapping filters */ 245 #define DFS_MAX_RADAR_OVERLAP 16 246 247 /* Max number of dfs events which can be q'd */ 248 #define DFS_MAX_EVENTS 1024 249 250 #define DFS_RADAR_EN 0x80000000 /* Radar detect is capable */ 251 #define DFS_AR_EN 0x40000000 /* AR detect is capable */ 252 /* Radar detect in second segment is capable */ 253 #define DFS_SECOND_SEGMENT_RADAR_EN 0x20000000 254 #define DFS_MAX_RSSI_VALUE 0x7fffffff /* Max rssi value */ 255 256 #define DFS_BIN_MAX_PULSES 60 /* max num of pulses in a burst */ 257 #define DFS_BIN5_PRI_LOWER_LIMIT 990 /* us */ 258 259 /** 260 * To cover the single pusle burst case, change from 2010 us to 261 * 2010000 us. 262 */ 263 264 /** 265 * This is reverted back to 2010 as larger value causes false 266 * bin5 detect (EV76432, EV76320) 267 */ 268 #define DFS_BIN5_PRI_HIGHER_LIMIT 2010 /* us */ 269 270 #define DFS_BIN5_WIDTH_MARGIN 4 /* us */ 271 #define DFS_BIN5_RSSI_MARGIN 5 /* dBm */ 272 273 /** 274 * Following threshold is not specified but should be 275 * okay statistically. 276 */ 277 #define DFS_BIN5_BRI_LOWER_LIMIT 300000 /* us */ 278 #define DFS_BIN5_BRI_UPPER_LIMIT 12000000 /* us */ 279 280 /* Max number of pulses kept in buffer */ 281 #define DFS_MAX_PULSE_BUFFER_SIZE 1024 282 #define DFS_MAX_PULSE_BUFFER_MASK 0x3ff 283 284 #define DFS_FAST_CLOCK_MULTIPLIER (800/11) 285 #define DFS_NO_FAST_CLOCK_MULTIPLIER (80) 286 #define DFS_BIG_SIDX 10000 287 288 /* Min value of valid psidx diff */ 289 #define DFS_MIN_PSIDX_DIFF 4 290 /* Max value of valid psidx diff */ 291 #define DFS_MAX_PSIDX_DIFF 16 292 293 /** 294 * Software use: channel interference used for as AR as well as RADAR 295 * interference detection. 296 */ 297 #define CHANNEL_INTERFERENCE 0x01 298 299 #define CHANNEL_2GHZ 0x00080 /* 2 GHz spectrum channel. */ 300 #define CHANNEL_OFDM 0x00040 /* OFDM channel */ 301 #define CHANNEL_TURBO 0x00010 /* Turbo Channel */ 302 #define CHANNEL_108G (CHANNEL_2GHZ|CHANNEL_OFDM|CHANNEL_TURBO) 303 304 /* qdf_packed - denotes structure is packed. */ 305 #define qdf_packed __qdf_packed 306 307 #define SEG_ID_PRIMARY 0 308 #define SEG_ID_SECONDARY 1 309 310 /* MIN and MAX width for different regions */ 311 #define REG0_MIN_WIDTH 33 312 #define REG0_MAX_WIDTH 38 313 #define REG1_MIN_WIDTH 39 314 #define REG1_MAX_WIDTH 44 315 #define REG2_MIN_WIDTH 53 316 #define REG2_MAX_WIDTH 58 317 #define REG3_MIN_WIDTH 126 318 #define REG3_MAX_WIDTH 140 319 #define REG4_MIN_WIDTH 141 320 #define REG4_MAX_WIDTH 160 321 #define REG5_MIN_WIDTH 189 322 #define REG5_MAX_WIDTH 210 323 #define REG6_MIN_WIDTH 360 324 #define REG6_MAX_WIDTH 380 325 #define REG7_MIN_WIDTH 257 326 #define REG7_MAX_WIDTH 270 327 #define REG8_MIN_WIDTH 295 328 #define REG8_MAX_WIDTH 302 329 330 #define OVER_SAMPLING_FREQ 44000 331 #define SAMPLING_FREQ 40000 332 #define HUNDRED 100 333 #define NUM_BINS 128 334 #define THOUSAND 1000 335 336 /* Array offset to ETSI legacy pulse */ 337 #define ETSI_LEGACY_PULSE_ARR_OFFSET 4 338 339 #define ETSI_RADAR_EN302_502_FREQ_LOWER 5725 340 #define ETSI_RADAR_EN302_502_FREQ_UPPER 5865 341 342 #define DFS_NOL_ADD_CHAN_LOCKED(dfs, freq, timeout) \ 343 do { \ 344 WLAN_DFSNOL_LOCK(dfs); \ 345 dfs_nol_addchan(dfs, freq, timeout); \ 346 WLAN_DFSNOL_UNLOCK(dfs); \ 347 } while (0) 348 349 /* 350 * Free the NOL element in a thread. This is to avoid freeing the 351 * timer object from within timer callback function . The nol element 352 * contains the timer Object. 353 */ 354 #define DFS_NOL_DELETE_CHAN_LOCKED(dfs, freq, chwidth) \ 355 do { \ 356 WLAN_DFSNOL_LOCK(dfs); \ 357 dfs_nol_delete(dfs, freq, chwidth); \ 358 qdf_sched_work(NULL, &dfs->dfs_nol_elem_free_work); \ 359 WLAN_DFSNOL_UNLOCK(dfs); \ 360 } while (0) 361 362 #define DFS_GET_NOL_LOCKED(dfs, dfs_nol, nchan) \ 363 do { \ 364 WLAN_DFSNOL_LOCK(dfs); \ 365 dfs_get_nol(dfs, dfs_nol, nchan); \ 366 WLAN_DFSNOL_UNLOCK(dfs); \ 367 } while (0) 368 369 #define DFS_PRINT_NOL_LOCKED(dfs) \ 370 do { \ 371 WLAN_DFSNOL_LOCK(dfs); \ 372 dfs_print_nol(dfs); \ 373 WLAN_DFSNOL_UNLOCK(dfs); \ 374 } while (0) 375 376 #define DFS_NOL_FREE_LIST_LOCKED(dfs) \ 377 do { \ 378 WLAN_DFSNOL_LOCK(dfs); \ 379 dfs_nol_free_list(dfs); \ 380 WLAN_DFSNOL_UNLOCK(dfs); \ 381 } while (0) 382 383 /* Host sends the average parameters of the radar pulses and starts the status 384 * wait timer with this timeout. 385 */ 386 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 387 #define HOST_DFS_STATUS_WAIT_TIMER_MS 200 388 #endif 389 390 /* 391 * USENOL_DISABLE_NOL_HOST_AND_FW : Do not add radar hit channel to NOL 392 * in host and FW. Enable CSA on the same channel. 393 */ 394 #define USENOL_DISABLE_NOL_HOST_AND_FW 0 395 /* 396 * USENOL_ENABLE_NOL_HOST_AND_FW : Add the radar hit channel to NOL in 397 * host and FW (in case of FO). NOL timer cannot be configured by the user 398 * as FW does not allow manipulating NOL timeout. If noltimeout is configured, 399 * (say 1 min) FW will not be intimated about the configuration and hence NOL 400 * timer may elapse at different instances in host (after 1 min) and FW (after 401 * default 30 min) which could lead to DFS Violation if host tries to come up 402 * on the channel after host NOL timeout (of 1 min) as the FW would still 403 * have the channel in NOL list. 404 */ 405 #define USENOL_ENABLE_NOL_HOST_AND_FW 1 406 /* 407 * USENOL_ENABLE_NOL_HOST_DISABLE_NOL_FW : Add the radar hit channel to NOL 408 * in host. NOL timer can be configured by user. NOL in FW (for FO) is disabled. 409 */ 410 #define USENOL_ENABLE_NOL_HOST_DISABLE_NOL_FW 2 411 412 /** 413 * enum detector_id - Detector ID values. 414 * @DETECTOR_ID_0: Detector ID 0 (Non Agile). 415 * @DETECTOR_ID_1: Detector ID 1 (Non Agile in 80p80MHz supported devices, 416 * Agile detector in true 160MHz supported devices). 417 * @DETECTOR_ID_2: Detector ID 2 (Agile detector in 80p80MHZ supported devices). 418 * @AGILE_DETECTOR_ID_TRUE_160MHZ: Agile detector ID in true 160MHz devices. 419 * @AGILE_DETECTOR_ID_80p80: Agile detector ID in 80p80MHz supported devices. 420 * @INVALID_DETECTOR_ID: Invalid detector id. 421 */ 422 enum detector_id { 423 DETECTOR_ID_0, 424 DETECTOR_ID_1, 425 DETECTOR_ID_2, 426 AGILE_DETECTOR_ID_TRUE_160MHZ = DETECTOR_ID_1, 427 AGILE_DETECTOR_ID_80P80 = DETECTOR_ID_2, 428 INVALID_DETECTOR_ID, 429 }; 430 431 /** 432 * struct dfs_pulseparams - DFS pulse param structure. 433 * @p_time: Time for start of pulse in usecs. 434 * @p_dur: Duration of pulse in usecs. 435 * @p_rssi: RSSI of pulse. 436 * @p_seg_id: Segment id. 437 * @p_sidx: Sidx value. 438 * @p_delta_peak: Delta peak value. 439 * @p_psidx_diff: The difference in the FFT peak index between the short FFT 440 * and the first long FFT. 441 * @p_seq_num: Sequence number. 442 */ 443 struct dfs_pulseparams { 444 uint64_t p_time; 445 uint8_t p_dur; 446 uint8_t p_rssi; 447 uint8_t p_seg_id; 448 int16_t p_sidx; 449 int8_t p_delta_peak; 450 int16_t p_psidx_diff; 451 uint32_t p_seq_num; 452 } qdf_packed; 453 454 /** 455 * struct dfs_pulseline - Pulseline structure. 456 * @pl_elems[]: array of pulses in delay line. 457 * @pl_firstelem: Index of the first element. 458 * @pl_lastelem: Index of the last element. 459 * @pl_numelems: Number of elements in the delay line. 460 */ 461 struct dfs_pulseline { 462 struct dfs_pulseparams pl_elems[DFS_MAX_PULSE_BUFFER_SIZE]; 463 uint32_t pl_firstelem; 464 uint32_t pl_lastelem; 465 uint32_t pl_numelems; 466 } qdf_packed; 467 468 #define DFS_EVENT_CHECKCHIRP 0x01 /* Whether to check the chirp flag */ 469 #define DFS_EVENT_HW_CHIRP 0x02 /* hardware chirp */ 470 #define DFS_EVENT_SW_CHIRP 0x04 /* software chirp */ 471 /* Whether the event contains valid psidx diff value*/ 472 #define DFS_EVENT_VALID_PSIDX_DIFF 0x08 473 474 /* Use this only if the event has CHECKCHIRP set. */ 475 #define DFS_EVENT_ISCHIRP(e) \ 476 ((e)->re_flags & (DFS_EVENT_HW_CHIRP | DFS_EVENT_SW_CHIRP)) 477 478 /** 479 * Check if the given event is to be rejected as not possibly 480 * a chirp. This means: 481 * (a) it's a hardware or software checked chirp, and 482 * (b) the HW/SW chirp bits are both 0. 483 */ 484 #define DFS_EVENT_NOTCHIRP(e) \ 485 (((e)->re_flags & (DFS_EVENT_CHECKCHIRP)) && (!DFS_EVENT_ISCHIRP((e)))) 486 487 /** 488 * struct dfs_event - DFS event structure. 489 * @re_full_ts: 64-bit full timestamp from interrupt time. 490 * @re_ts: Original 15 bit recv timestamp. 491 * @re_rssi: Rssi of radar event. 492 * @re_dur: Duration of radar pulse. 493 * @re_chanindex: Channel of event. 494 * @re_flags: Event flags. 495 * @re_freq: Centre frequency of event, KHz. 496 * @re_freq_lo: Lower bounds of frequency, KHz. 497 * @re_freq_hi: Upper bounds of frequency, KHz. 498 * @re_seg_id: HT80_80/HT160 use. 499 * @re_sidx: Seg index. 500 * @re_freq_offset_khz: Freq offset in KHz 501 * @re_peak_mag: Peak mag. 502 * @re_total_gain: Total gain. 503 * @re_mb_gain: Mb gain. 504 * @re_relpwr_db: Relpower in db. 505 * @re_delta_diff: Delta diff. 506 * @re_delta_peak: Delta peak. 507 * @re_psidx_diff: Psidx diff. 508 * @re_list: List of radar events. 509 */ 510 struct dfs_event { 511 uint64_t re_full_ts; 512 uint32_t re_ts; 513 uint8_t re_rssi; 514 uint8_t re_dur; 515 uint8_t re_chanindex; 516 uint8_t re_flags; 517 uint32_t re_freq; 518 uint32_t re_freq_lo; 519 uint32_t re_freq_hi; 520 uint8_t re_seg_id; 521 int re_sidx; 522 u_int re_freq_offset_khz; 523 int re_peak_mag; 524 int re_total_gain; 525 int re_mb_gain; 526 int re_relpwr_db; 527 uint8_t re_delta_diff; 528 int8_t re_delta_peak; 529 int16_t re_psidx_diff; 530 531 STAILQ_ENTRY(dfs_event) re_list; 532 } qdf_packed; 533 534 #define DFS_AR_MAX_ACK_RADAR_DUR 511 535 #define DFS_AR_MAX_NUM_PEAKS 3 536 #define DFS_AR_ARQ_SIZE 2048 /* 8K AR events for buffer size */ 537 #define DFS_AR_ARQ_SEQSIZE 2049 /* Sequence counter wrap for AR */ 538 539 #define DFS_RADARQ_SIZE 512 /* 1K radar events for buffer size */ 540 #define DFS_RADARQ_SEQSIZE 513 /* Sequence counter wrap for radar */ 541 /* Number of radar channels we keep state for */ 542 #define DFS_NUM_RADAR_STATES 64 543 /* Max number radar filters for each type */ 544 #define DFS_MAX_NUM_RADAR_FILTERS 10 545 /* Number of different radar types */ 546 #define DFS_MAX_RADAR_TYPES 32 547 /* Number of filter index table rows */ 548 #define DFS_NUM_FT_IDX_TBL_ROWS 256 549 550 /* RADAR filter pattern type 1*/ 551 #define WLAN_DFS_RF_PATTERN_TYPE_1 1 552 553 /** 554 * struct dfs_ar_state - DFS AR state structure. 555 * @ar_prevwidth: Previous width. 556 * @ar_phyerrcount[]: Phy error count. 557 * @ar_acksum: Acksum. 558 * @ar_packetthreshold: Thresh to determine traffic load. 559 * @ar_parthreshold: Thresh to determine peak. 560 * @ar_radarrssi: Rssi threshold for AR event. 561 * @ar_prevtimestamp: Prev time stamp. 562 * @ar_peaklist[]: Peak list. 563 */ 564 struct dfs_ar_state { 565 uint32_t ar_prevwidth; 566 uint32_t ar_phyerrcount[DFS_AR_MAX_ACK_RADAR_DUR]; 567 uint32_t ar_acksum; 568 uint32_t ar_packetthreshold; 569 uint32_t ar_parthreshold; 570 uint32_t ar_radarrssi; 571 uint16_t ar_prevtimestamp; 572 uint16_t ar_peaklist[DFS_AR_MAX_NUM_PEAKS]; 573 }; 574 575 /** 576 * struct dfs_delayelem - Delay Element. 577 * @de_time: Current "filter" time for start of pulse in usecs. 578 * @de_dur: Duration of pulse in usecs. 579 * @de_rssi: Rssi of pulse in dB. 580 * @de_ts: Time stamp for this delay element. 581 * @de_seg_id: Segment id for HT80_80/HT160 use. 582 * @de_sidx: Sidx value. 583 * @de_delta_peak: Delta peak. 584 * @de_psidx_diff: Psidx diff. 585 * @de_seq_num: Sequence number. 586 */ 587 struct dfs_delayelem { 588 uint32_t de_time; 589 uint8_t de_dur; 590 uint8_t de_rssi; 591 uint64_t de_ts; 592 uint8_t de_seg_id; 593 int16_t de_sidx; 594 int8_t de_delta_peak; 595 int16_t de_psidx_diff; 596 uint32_t de_seq_num; 597 } qdf_packed; 598 599 /** 600 * struct dfs_delayline - DFS Delay Line. 601 * @dl_elems[]: Array of pulses in delay line. 602 * @dl_last_ts: Last timestamp the delay line was used (in usecs). 603 * @dl_firstelem: Index of the first element. 604 * @dl_lastelem: Index of the last element. 605 * @dl_numelems: Number of elements in the delay line. 606 * The following is to handle fractional PRI pulses that can cause false 607 * detection. 608 * @dl_seq_num_start: Sequence number of first pulse that was part of 609 * threshold match. 610 * @dl_seq_num_stop: Sequence number of last pulse that was part of threshold 611 * match. 612 * The following is required because the first pulse may or may not be in the 613 * delay line but we will find it iin the pulse line using dl_seq_num_second's 614 * diff_ts value. 615 * @dl_seq_num_second: Sequence number of second pulse that was part of 616 * threshold match. 617 * @dl_search_pri: We need final search PRI to identify possible fractional 618 * PRI issue. 619 * @dl_min_sidx: Minimum sidx value of pulses used to match thershold. 620 * Used for sidx spread check. 621 * @dl_max_sidx: Maximum sidx value of pulses used to match thershold. 622 * Used for sidx spread check. 623 * @dl_delta_peak_match_count: Number of pulse in the delay line that had valid 624 * delta peak value. 625 * @dl_psidx_diff_match_count: Number of pulse in the delay line that had valid 626 * psidx diff value. 627 */ 628 struct dfs_delayline { 629 struct dfs_delayelem dl_elems[DFS_MAX_DL_SIZE]; 630 uint64_t dl_last_ts; 631 uint32_t dl_firstelem; 632 uint32_t dl_lastelem; 633 uint32_t dl_numelems; 634 uint32_t dl_seq_num_start; 635 uint32_t dl_seq_num_stop; 636 uint32_t dl_seq_num_second; 637 uint32_t dl_search_pri; 638 int16_t dl_min_sidx; 639 int8_t dl_max_sidx; 640 uint8_t dl_delta_peak_match_count; 641 uint8_t dl_psidx_diff_match_count; 642 } qdf_packed; 643 644 /** 645 * struct dfs_filter - Dfs filter. 646 * @rf_dl: Delay line of pulses for this filter. 647 * @rf_numpulses: Number of pulses in the filter. 648 * @rf_minpri: Min pri to be considered for this filter. 649 * @rf_maxpri: Max pri to be considered for this filter. 650 * @rf_threshold: Match filter output threshold for radar detect. 651 * @rf_filterlen: Length (in usecs) of the filter. 652 * @rf_patterntype: Fixed or variable pattern type. 653 * @rf_fixed_pri_radar_pulse: indicates if it is a fixed pri pulse. 654 * @rf_mindur: Min duration for this radar filter. 655 * @rf_maxdur: Max duration for this radar filter. 656 * @rf_ignore_pri_window: Ignore pri window. 657 * @rf_pulseid: Unique ID corresponding to the original filter ID. 658 * To reduce false detection, look at frequency spread. For now we will use 659 * sidx spread. But for HT160 frequency spread will be a better measure. 660 * @rf_sidx_spread: Maximum SIDX value spread in a matched sequence 661 * excluding FCC Bin 5. 662 * @rf_check_delta_peak: Minimum allowed delta_peak value for a pulse to be 663 * considetred for this filter's match. 664 */ 665 struct dfs_filter { 666 struct dfs_delayline rf_dl; 667 uint32_t rf_numpulses; 668 uint32_t rf_minpri; 669 uint32_t rf_maxpri; 670 uint32_t rf_threshold; 671 uint32_t rf_filterlen; 672 uint32_t rf_patterntype; 673 uint32_t rf_fixed_pri_radar_pulse; 674 uint32_t rf_mindur; 675 uint32_t rf_maxdur; 676 uint32_t rf_ignore_pri_window; 677 uint32_t rf_pulseid; 678 uint16_t rf_sidx_spread; 679 int8_t rf_check_delta_peak; 680 } qdf_packed; 681 682 /** 683 * struct dfs_filtertype - Structure of DFS Filter type. 684 * @ft_filters[]: Array of ptrs storing addresses for struct of dfs_filter. 685 * @ft_filterdur: Duration of pulse which specifies filter type. 686 * @ft_numfilters: Num filters of this type. 687 * @ft_last_ts: Last timestamp this filtertype was used (in usecs). 688 * @ft_mindur: Min pulse duration to be considered for this filter type. 689 * @ft_maxdur: Max pulse duration to be considered for this filter type. 690 * @ft_rssithresh: Min rssi to be considered for this filter type. 691 * @ft_numpulses: Num pulses in each filter of this type. 692 * @ft_patterntype: Fixed or variable pattern type. 693 * @ft_minpri: Min pri to be considered for this type. 694 * @ft_rssimargin: Rssi threshold margin. In Turbo Mode HW reports rssi 3dB 695 * lower than in non TURBO mode. This will offset that diff. 696 */ 697 struct dfs_filtertype { 698 struct dfs_filter *ft_filters[DFS_MAX_NUM_RADAR_FILTERS]; 699 uint32_t ft_filterdur; 700 uint32_t ft_numfilters; 701 uint64_t ft_last_ts; 702 uint32_t ft_mindur; 703 uint32_t ft_maxdur; 704 uint32_t ft_rssithresh; 705 uint32_t ft_numpulses; 706 uint32_t ft_patterntype; 707 uint32_t ft_minpri; 708 uint32_t ft_rssimargin; 709 }; 710 711 /** 712 * struct dfs_channel - Channel structure for dfs component. 713 * @dfs_ch_freq: Frequency in Mhz. 714 * @dfs_ch_flags: Channel flags. 715 * @dfs_ch_flagext: Extended channel flags. 716 * @dfs_ch_ieee: IEEE channel number. 717 * @dfs_ch_vhtop_ch_freq_seg1: IEEE Channel Center of primary segment 718 * @dfs_ch_vhtop_ch_freq_seg2: IEEE Channel Center applicable for 80+80MHz 719 * mode of operation. 720 * @dfs_ch_mhz_freq_seg1: Channel center frequency of primary segment in 721 * MHZ. 722 * @dfs_ch_mhz_freq_seg2: Channel center frequency of secondary segment 723 * in MHZ applicable only for 80+80MHZ mode of 724 * operation. 725 */ 726 struct dfs_channel { 727 uint16_t dfs_ch_freq; 728 uint64_t dfs_ch_flags; 729 uint16_t dfs_ch_flagext; 730 uint8_t dfs_ch_ieee; 731 uint8_t dfs_ch_vhtop_ch_freq_seg1; 732 uint8_t dfs_ch_vhtop_ch_freq_seg2; 733 uint16_t dfs_ch_mhz_freq_seg1; 734 uint16_t dfs_ch_mhz_freq_seg2; 735 }; 736 737 /** 738 * struct dfs_state - DFS state. 739 * @rs_chan: Channel info. 740 * @rs_chanindex: Channel index in radar structure. 741 * @rs_numradarevents: Number of radar events. 742 * @rs_param: Phy param. 743 */ 744 struct dfs_state { 745 struct dfs_channel rs_chan; 746 uint8_t rs_chanindex; 747 uint32_t rs_numradarevents; 748 struct wlan_dfs_phyerr_param rs_param; 749 }; 750 751 #define DFS_NOL_TIMEOUT_S (30*60) /* 30 minutes in seconds */ 752 #define DFS_NOL_TIMEOUT_MS (DFS_NOL_TIMEOUT_S * 1000) 753 #define DFS_NOL_TIMEOUT_US (DFS_NOL_TIMEOUT_MS * 1000) 754 755 /** 756 * struct dfs_nolelem - DFS NOL element. 757 * @nol_dfs Back pointer to dfs object. 758 * @nol_freq: Centre frequency. 759 * @nol_chwidth: Event width (MHz). 760 * @nol_start_us: NOL start time in us. 761 * @nol_timeout_ms: NOL timeout value in msec. 762 * @nol_timer: Per element NOL timer. 763 * @nol_next: Next element pointer. 764 */ 765 struct dfs_nolelem { 766 TAILQ_ENTRY(dfs_nolelem) nolelem_list; 767 struct wlan_dfs *nol_dfs; 768 uint32_t nol_freq; 769 uint32_t nol_chwidth; 770 uint64_t nol_start_us; 771 uint32_t nol_timeout_ms; 772 qdf_timer_t nol_timer; 773 struct dfs_nolelem *nol_next; 774 } qdf_packed; 775 776 777 /** 778 * struct dfs_info - DFS Info. 779 * @rn_ftindex: Number of different types of radars. 780 * @rn_lastfull_ts: Last 64 bit timstamp from recv interrupt. 781 * @rn_last_ts: last 15 bit ts from recv descriptor. 782 * @rn_last_unique_ts: last unique 32 bit ts from recv descriptor. 783 * @rn_ts_prefix: Prefix to prepend to 15 bit recv ts. 784 * @rn_numbin5radars: Number of bin5 radar pulses to search for. 785 * @rn_fastdivGCval: Value of fast diversity gc limit from init file. 786 * @rn_minrssithresh: Min rssi for all radar types. 787 * @rn_maxpulsedur: Max pulse width in TSF ticks. 788 * @dfs_ext_chan_busy: Ext chan busy. 789 * @ext_chan_busy_ts: Ext chan busy time. 790 * @dfs_bin5_chirp_ts: Ext bin5 chrip time. 791 * @dfs_last_bin5_dur: Last bin5 during. 792 */ 793 struct dfs_info { 794 uint32_t rn_ftindex; 795 uint64_t rn_lastfull_ts; 796 uint16_t rn_last_ts; 797 uint32_t rn_last_unique_ts; 798 uint64_t rn_ts_prefix; 799 uint32_t rn_numbin5radars; 800 uint32_t rn_fastdivGCval; 801 int32_t rn_minrssithresh; 802 uint32_t rn_maxpulsedur; 803 uint8_t dfs_ext_chan_busy; 804 uint64_t ext_chan_busy_ts; 805 uint64_t dfs_bin5_chirp_ts; 806 uint8_t dfs_last_bin5_dur; 807 } qdf_packed; 808 809 /** 810 * struct dfs_bin5elem - BIN5 elements. 811 * @be_ts: Timestamp for the bin5 element. 812 * @be_rssi: Rssi for the bin5 element. 813 * @be_dur: Duration of bin5 element. 814 */ 815 struct dfs_bin5elem { 816 uint64_t be_ts; 817 uint32_t be_rssi; 818 uint32_t be_dur; 819 }; 820 821 /** 822 * struct dfs_bin5radars - BIN5 radars. 823 * @br_elems[]: List of bin5 elems that fall within the time window. 824 * @br_firstelem: Index of the first element. 825 * @br_lastelem: Index of the last element. 826 * @br_numelems: Number of elements in the delay line. 827 * @br_pulse: Original info about bin5 pulse. 828 */ 829 struct dfs_bin5radars { 830 struct dfs_bin5elem br_elems[DFS_MAX_B5_SIZE]; 831 uint32_t br_firstelem; 832 uint32_t br_lastelem; 833 uint32_t br_numelems; 834 struct dfs_bin5pulse br_pulse; 835 }; 836 837 /** 838 * struct dfs_stats - DFS stats. 839 * @num_radar_detects: Total num. of radar detects. 840 * @num_seg_two_radar_detects: Total num. of radar detected in secondary segment 841 * @total_phy_errors: Total PHY errors. 842 * @owl_phy_errors: OWL PHY errors. 843 * @pri_phy_errors: Primary channel phy errors. 844 * @ext_phy_errors: Extension channel phy errors. 845 * @dc_phy_errors: DC PHY errors. 846 * @early_ext_phy_errors: Extension channel early radar found error. 847 * @bwinfo_errors: Bogus bandwidth info received in descriptor. 848 * @datalen_discards: data length at least three bytes of payload. 849 * @rssi_discards: RSSI is not accurate. 850 * @last_reset_tstamp: Last reset timestamp. 851 */ 852 struct dfs_stats { 853 uint32_t num_radar_detects; 854 uint32_t num_seg_two_radar_detects; 855 uint32_t total_phy_errors; 856 uint32_t owl_phy_errors; 857 uint32_t pri_phy_errors; 858 uint32_t ext_phy_errors; 859 uint32_t dc_phy_errors; 860 uint32_t early_ext_phy_errors; 861 uint32_t bwinfo_errors; 862 uint32_t datalen_discards; 863 uint32_t rssi_discards; 864 uint64_t last_reset_tstamp; 865 }; 866 867 #define DFS_EVENT_LOG_SIZE 256 868 869 /** 870 * struct dfs_event_log - DFS event log. 871 * @ts: 64-bit full timestamp from interrupt time. 872 * @diff_ts: Diff timestamp. 873 * @rssi: Rssi of radar event. 874 * @dur: Duration of radar pulse. 875 * @is_chirp: Chirp flag. 876 * @seg_id: HT80_80/HT160 use. 877 * @sidx: Seg index. 878 * @freq_offset_khz: Freq offset in KHz 879 * @peak_mag: Peak mag. 880 * @total_gain: Total gain. 881 * @mb_gain: Mb gain. 882 * @relpwr_db: Relpower in db. 883 * @delta_diff: Delta diff. 884 * @delta_peak: Delta peak. 885 * @psidx_diff: Psidx diff. 886 */ 887 888 struct dfs_event_log { 889 uint64_t ts; 890 uint32_t diff_ts; 891 uint8_t rssi; 892 uint8_t dur; 893 int is_chirp; 894 uint8_t seg_id; 895 int sidx; 896 u_int freq_offset_khz; 897 int peak_mag; 898 int total_gain; 899 int mb_gain; 900 int relpwr_db; 901 uint8_t delta_diff; 902 int8_t delta_peak; 903 int16_t psidx_diff; 904 }; 905 906 #define WLAN_DFS_WEATHER_CHANNEL_WAIT_MIN 10 /*10 minutes*/ 907 #define WLAN_DFS_WEATHER_CHANNEL_WAIT_S (WLAN_DFS_WEATHER_CHANNEL_WAIT_MIN * 60) 908 #define WLAN_DFS_WEATHER_CHANNEL_WAIT_MS \ 909 ((WLAN_DFS_WEATHER_CHANNEL_WAIT_S) * 1000) /*in MS*/ 910 911 #define WLAN_DFS_WAIT_POLL_PERIOD 2 /* 2 seconds */ 912 #define WLAN_DFS_WAIT_POLL_PERIOD_MS \ 913 ((WLAN_DFS_WAIT_POLL_PERIOD) * 1000) /*in MS*/ 914 915 #define DFS_DEBUG_TIMEOUT_S 30 /* debug timeout is 30 seconds */ 916 #define DFS_DEBUG_TIMEOUT_MS (DFS_DEBUG_TIMEOUT_S * 1000) 917 918 #define RSSI_POSSIBLY_FALSE 50 919 #define SEARCH_FFT_REPORT_PEAK_MAG_THRSH 40 920 921 #define MIN_DFS_SUBCHAN_BW 20 /* Minimum bandwidth of each subchannel. */ 922 923 #define FREQ_OFFSET_BOUNDARY_FOR_80MHZ 40 924 925 #define FREQ_OFFSET_BOUNDARY_FOR_160MHZ 80 926 927 /** 928 * struct dfs_mode_switch_defer_params - Parameters storing DFS information 929 * before defer, as part of HW mode switch. 930 * 931 * @radar_params: Deferred radar parameters. 932 * @is_cac_completed: Boolean representing CAC completion event. 933 * @is_radar_detected: Boolean representing radar event. 934 */ 935 struct dfs_mode_switch_defer_params { 936 struct radar_found_info *radar_params; 937 bool is_cac_completed; 938 bool is_radar_detected; 939 }; 940 941 #ifdef QCA_SUPPORT_AGILE_DFS 942 #define DFS_PSOC_NO_IDX 0xFF 943 /** 944 * enum dfs_agile_sm_state - DFS AGILE SM states. 945 * @DFS_AGILE_S_INIT: Default state or the start state of the Agile SM. 946 * @DFS_AGILE_S_RUNNING: Agile Engine is being run. 947 * @DFS_AGILE_S_COMPLETE: The Agile Engine's minimum run is complete. 948 However, it is still running. Used only for RCAC 949 as RCAC needs to run continuously (uninterrupted) 950 until the channel change. 951 * @DFS_AGILE_S_MAX: Max (invalid) state. 952 */ 953 enum dfs_agile_sm_state { 954 DFS_AGILE_S_INIT, 955 DFS_AGILE_S_RUNNING, 956 DFS_AGILE_S_COMPLETE, 957 DFS_AGILE_S_MAX, 958 }; 959 960 /** 961 * struct dfs_rcac_params - DFS Rolling CAC channel parameters. 962 * @rcac_pri_freq: Rolling CAC channel's primary frequency. 963 * @rcac_ch_params: Rolling CAC channel parameters. 964 */ 965 struct dfs_rcac_params { 966 qdf_freq_t rcac_pri_freq; 967 struct ch_params rcac_ch_params; 968 }; 969 #endif 970 971 /** 972 * struct wlan_dfs - The main dfs structure. 973 * @dfs_debug_mask: Current debug bitmask. 974 * @dfs_curchan_radindex: Current channel radar index. 975 * @dfs_extchan_radindex: Extension channel radar index. 976 * @dfsdomain: Current DFS domain. 977 * @dfs_proc_phyerr: Flags for Phy Errs to process. 978 * @dfs_eventq: Q of free dfs event objects. 979 * @dfs_eventqlock: Lock for free dfs event list. 980 * @dfs_radarq: Q of radar events. 981 * @dfs_radarqlock: Lock for dfs q. 982 * @dfs_arq: Q of AR events. 983 * @dfs_arqlock: Lock for AR q. 984 * @dfs_ar_state: AR state. 985 * @dfs_radar[]: Per-Channel Radar detector state. 986 * @dfs_radarf[]: One filter for each radar pulse type. 987 * @dfs_rinfo: State vars for radar processing. 988 * @dfs_b5radars: Array of bin5 radar events. 989 * @dfs_ftindextable: Map of radar durs to filter types. 990 * @dfs_nol: Non occupancy list for radar. 991 * @dfs_nol_count: How many items? 992 * @dfs_defaultparams: Default phy params per radar state. 993 * @wlan_dfs_stats: DFS related stats. 994 * @pulses: Pulse history. 995 * @events: Events structure. 996 * @wlan_radar_tasksched: Radar task is scheduled. 997 * @wlan_dfswait: Waiting on channel for radar detect. 998 * @wlan_dfstest: Test timer in progress. 999 * @dfs_caps: Object of wlan_dfs_caps structure. 1000 * @wlan_dfstest_ieeechan: IEEE chan num to return to after a dfs mute 1001 * test. 1002 * @wlan_dfs_cac_time: CAC period. 1003 * @wlan_dfstesttime: Time to stay off chan during dfs test. 1004 * @wlan_dfswaittimer: Dfs wait timer. 1005 * @wlan_dfstesttimer: Dfs mute test timer. 1006 * @wlan_dfs_debug_timer: Dfs debug timer. 1007 * @dfs_bangradar_type: Radar simulation type. 1008 * @is_radar_found_on_secondary_seg: Radar on second segment. 1009 * @is_radar_during_precac: Radar found during precac. 1010 * @dfs_precac_lock: Lock to protect precac lists. 1011 * @dfs_precac_secondary_freq: Second segment freq for precac. 1012 * Applicable to only legacy chips. 1013 * @dfs_precac_secondary_freq_mhz: Second segment freq in MHZ for precac. 1014 * Applicable to only legacy chips. 1015 * @dfs_precac_primary_freq: PreCAC Primary freq applicable only to 1016 * legacy chips. 1017 * @dfs_precac_primary_freq_mhz: PreCAC Primary freq in MHZ applicable only 1018 * to legacy chips. 1019 * @dfs_defer_precac_channel_change: Defer precac channel change. 1020 * @dfs_precac_inter_chan: Intermediate non-DFS channel used while 1021 * doing precac. 1022 * @dfs_precac_inter_chan_freq: Intermediate non-DFS freq used while 1023 * doing precac. 1024 * @dfs_autoswitch_des_chan: Desired channel which has to be used 1025 * after precac. 1026 * @dfs_autoswitch_chan: Desired channel of dfs_channel structure 1027 * which will be prioritized for preCAC. 1028 * @dfs_autoswitch_des_mode: Desired PHY mode which has to be used 1029 * after precac. 1030 * @dfs_pre_cac_timeout_channel_change: Channel change due to precac timeout. 1031 * @wlan_dfs_task_timer: Dfs wait timer. 1032 * @dur_multiplier: Duration multiplier. 1033 * @wlan_dfs_isdfsregdomain: True when AP is in DFS domain 1034 * @wlan_dfs_false_rssi_thres: False RSSI Threshold. 1035 * @wlan_dfs_peak_mag: Peak mag. 1036 * @radar_log[]: Radar log. 1037 * @dfs_event_log_count: Event log count. 1038 * @dfs_event_log_on: Event log on. 1039 * @dfs_phyerr_count: Same as number of PHY radar interrupts. 1040 * @dfs_phyerr_reject_count: When TLV is supported, # of radar events 1041 * ignored after TLV is parsed. 1042 * @dfs_phyerr_queued_count: Number of radar events queued for matching 1043 * the filters. 1044 * @dfs_phyerr_freq_min: Phyerr min freq. 1045 * @dfs_phyerr_freq_max: Phyerr max freq. 1046 * @dfs_phyerr_w53_counter: Phyerr w53 counter. 1047 * @dfs_pri_multiplier: Allow pulse if they are within multiple of 1048 * PRI for the radar type. 1049 * @wlan_dfs_nol_timeout: NOL timeout. 1050 * @update_nol: Update NOL. 1051 * @dfs_seq_num: Sequence number. 1052 * @dfs_nol_event[]: NOL event. 1053 * @dfs_nol_timer: NOL list processing. 1054 * @dfs_nol_free_list: NOL free list. 1055 * @dfs_nol_elem_free_work: The work queue to free an NOL element. 1056 * @dfs_cac_timer: CAC timer. 1057 * @dfs_cac_valid_timer: Ignore CAC when this timer is running. 1058 * @dfs_cac_timeout_override: Overridden cac timeout. 1059 * @dfs_enable: DFS Enable. 1060 * @dfs_cac_timer_running: DFS CAC timer running. 1061 * @dfs_ignore_dfs: Ignore DFS. 1062 * @dfs_ignore_cac: Ignore CAC. 1063 * @dfs_cac_valid: DFS CAC valid. 1064 * @dfs_cac_valid_time: Time for which CAC will be valid and will 1065 * not be re-done. 1066 * @dfs_precac_timeout_override: Overridden precac timeout. 1067 * @dfs_num_precac_freqs: Number of PreCAC VHT80 frequencies. 1068 * @dfs_precac_list: PreCAC list (contains individual trees). 1069 * @dfs_precac_chwidth: PreCAC channel width enum. 1070 * @dfs_curchan: DFS current channel. 1071 * @dfs_prevchan: DFS previous channel. 1072 * @dfs_cac_started_chan: CAC started channel. 1073 * @dfs_pdev_obj: DFS pdev object. 1074 * @dfs_is_offload_enabled: Set if DFS offload enabled. 1075 * @dfs_agile_precac_freq_mhz: Freq in MHZ configured on Agile DFS engine. 1076 * @dfs_use_nol: Use the NOL when radar found(default: TRUE) 1077 * @dfs_nol_lock: Lock to protect nol list. 1078 * @tx_leakage_threshold: Tx leakage threshold for dfs. 1079 * @dfs_use_nol_subchannel_marking: Use subchannel marking logic to add only 1080 * radar affected subchannel instead of all 1081 * bonding channels. 1082 * @dfs_host_wait_timer: The timer that is started from host after 1083 * sending the average radar parameters. 1084 * Before this timeout host expects its dfs 1085 * status from fw. 1086 * @dfs_average_pri: Average pri value of the received radar 1087 * pulses. 1088 * @dfs_average_duration: Average duration of the received radar 1089 * pulses. 1090 * @dfs_average_sidx: Average sidx of the received radar pulses. 1091 * @dfs_is_host_wait_running: Indicates if host dfs status wait timer is 1092 * running. 1093 * @dfs_average_params_sent: Indicates if host has sent the average 1094 * radar parameters. 1095 * @dfs_no_res_from_fw: Indicates no response from fw. 1096 * @dfs_spoof_check_failed: Indicates if the spoof check has failed. 1097 * @dfs_spoof_test_done: Indicates if the sppof test is done. 1098 * @dfs_status_timeout_override: Used to change the timeout value of 1099 * dfs_host_wait_timer. 1100 * @dfs_is_stadfs_enabled: Is STADFS enabled. 1101 * @dfs_min_sidx: Minimum sidx of the received radar pulses. 1102 * @dfs_max_sidx: Maximum sidx of the received radar pulses. 1103 * @dfs_seg_id: Segment ID of the radar hit channel. 1104 * @dfs_is_chirp: Radar Chirp in pulse present or not. 1105 * @dfs_bw_reduced: DFS bandwidth reduced channel bit. 1106 * @dfs_freq_offset: Frequency offset where radar was found. 1107 * @dfs_cac_aborted: DFS cac is aborted. 1108 * @dfs_disable_radar_marking: To mark or unmark NOL chan as radar hit. 1109 * @dfs_data_struct_lock: DFS data structure lock. This is to protect 1110 * all the filtering data structures. For 1111 * example: dfs_bin5radars, dfs_filtertype, 1112 * etc. 1113 * @dfs_nol_ie_bandwidth: Minimum Bandwidth of subchannels that 1114 * are added to NOL. 1115 * @dfs_nol_ie_startfreq: The centre frequency of the starting 1116 * subchannel in the current channel list 1117 * to be sent in NOL IE with RCSA. 1118 * @dfs_nol_ie_bitmap: The bitmap of radar affected subchannels 1119 * in the current channel list 1120 * to be sent in NOL IE with RCSA. 1121 * @dfs_is_rcsa_ie_sent: To send or to not send RCSA IE. 1122 * @dfs_is_nol_ie_sent: To send or to not send NOL IE. 1123 * @dfs_legacy_precac_ucfg: User configuration for legacy preCAC in 1124 * partial offload chipsets. 1125 * @dfs_agile_precac_ucfg: User configuration for agile preCAC. 1126 * @dfs_agile_rcac_ucfg: User configuration for Rolling CAC. 1127 * @dfs_fw_adfs_support_non_160: Target Agile DFS support for non-160 BWs. 1128 * @dfs_fw_adfs_support_160: Target Agile DFS support for 160 BW. 1129 * @dfs_allow_hw_pulses: Allow/Block HW pulses. When synthetic 1130 * pulses are injected, the HW pulses should 1131 * be blocked and this variable should be 1132 * false so that HW pulses and synthetic 1133 * pulses do not get mixed up. 1134 * defer timer running. 1135 * @dfs_defer_params: DFS deferred event parameters (allocated 1136 * only for the duration of defer alone). 1137 * @dfs_agile_detector_id: Agile detector ID for the DFS object. 1138 * @dfs_agile_rcac_freq_ucfg: User programmed Rolling CAC frequency in 1139 * MHZ. 1140 * @dfs_rcac_param: Primary frequency and Channel params of 1141 * the selected RCAC channel. 1142 * @dfs_chan_postnol_freq: Frequency the AP switches to, post NOL. 1143 * @dfs_chan_postnol_mode: Phymode the AP switches to, post NOL. 1144 * @dfs_chan_postnol_cfreq2: Secondary center frequency the AP 1145 * switches to, post NOL. 1146 * @dfs_channel_state_array: Stores the channel states like CAC STARTED, 1147 * CAC REQUIRED, CAC COMPLETED, NOL, 1148 * PRECAC STARTED, PRECAC COMPLETED etc. of 1149 * all the DFS channels. 1150 */ 1151 struct wlan_dfs { 1152 uint32_t dfs_debug_mask; 1153 int16_t dfs_curchan_radindex; 1154 int16_t dfs_extchan_radindex; 1155 uint32_t dfsdomain; 1156 uint32_t dfs_proc_phyerr; 1157 1158 STAILQ_HEAD(, dfs_event) dfs_eventq; 1159 qdf_spinlock_t dfs_eventqlock; 1160 1161 STAILQ_HEAD(, dfs_event) dfs_radarq; 1162 qdf_spinlock_t dfs_radarqlock; 1163 1164 STAILQ_HEAD(, dfs_event) dfs_arq; 1165 qdf_spinlock_t dfs_arqlock; 1166 1167 struct dfs_ar_state dfs_ar_state; 1168 struct dfs_state dfs_radar[DFS_NUM_RADAR_STATES]; 1169 struct dfs_filtertype *dfs_radarf[DFS_MAX_RADAR_TYPES]; 1170 struct dfs_info dfs_rinfo; 1171 struct dfs_bin5radars *dfs_b5radars; 1172 int8_t **dfs_ftindextable; 1173 struct dfs_nolelem *dfs_nol; 1174 int dfs_nol_count; 1175 struct wlan_dfs_phyerr_param dfs_defaultparams; 1176 struct dfs_stats wlan_dfs_stats; 1177 struct dfs_pulseline *pulses; 1178 struct dfs_event *events; 1179 1180 uint32_t wlan_radar_tasksched:1, 1181 wlan_dfswait:1, 1182 wlan_dfstest:1; 1183 struct wlan_dfs_caps dfs_caps; 1184 uint8_t wlan_dfstest_ieeechan; 1185 uint32_t wlan_dfs_cac_time; 1186 uint32_t wlan_dfstesttime; 1187 qdf_timer_t wlan_dfswaittimer; 1188 qdf_timer_t wlan_dfstesttimer; 1189 qdf_timer_t wlan_dfs_debug_timer; 1190 enum dfs_bangradar_types dfs_bangradar_type; 1191 bool is_radar_found_on_secondary_seg; 1192 bool is_radar_during_precac; 1193 qdf_spinlock_t dfs_precac_lock; 1194 bool dfs_precac_enable; 1195 #ifdef CONFIG_CHAN_NUM_API 1196 uint8_t dfs_precac_secondary_freq; 1197 uint8_t dfs_precac_primary_freq; 1198 #endif 1199 #ifdef CONFIG_CHAN_FREQ_API 1200 uint16_t dfs_precac_secondary_freq_mhz; 1201 uint16_t dfs_precac_primary_freq_mhz; 1202 #endif 1203 uint8_t dfs_defer_precac_channel_change; 1204 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 1205 #ifdef CONFIG_CHAN_NUM_API 1206 uint8_t dfs_precac_inter_chan; 1207 uint8_t dfs_autoswitch_des_chan; 1208 #endif 1209 enum wlan_phymode dfs_autoswitch_des_mode; 1210 #endif 1211 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 1212 #ifdef CONFIG_CHAN_FREQ_API 1213 struct dfs_channel *dfs_autoswitch_chan; 1214 uint16_t dfs_precac_inter_chan_freq; 1215 #endif 1216 #endif 1217 uint8_t dfs_pre_cac_timeout_channel_change:1; 1218 qdf_timer_t wlan_dfs_task_timer; 1219 int dur_multiplier; 1220 uint16_t wlan_dfs_isdfsregdomain; 1221 int wlan_dfs_false_rssi_thres; 1222 int wlan_dfs_peak_mag; 1223 struct dfs_event_log radar_log[DFS_EVENT_LOG_SIZE]; 1224 int dfs_event_log_count; 1225 int dfs_event_log_on; 1226 int dfs_phyerr_count; 1227 int dfs_phyerr_reject_count; 1228 int dfs_phyerr_queued_count; 1229 int dfs_phyerr_freq_min; 1230 int dfs_phyerr_freq_max; 1231 int dfs_phyerr_w53_counter; 1232 int dfs_pri_multiplier; 1233 int wlan_dfs_nol_timeout; 1234 bool update_nol; 1235 uint32_t dfs_seq_num; 1236 int dfs_nol_event[DFS_CHAN_MAX]; 1237 qdf_timer_t dfs_nol_timer; 1238 1239 TAILQ_HEAD(, dfs_nolelem) dfs_nol_free_list; 1240 qdf_work_t dfs_nol_elem_free_work; 1241 1242 qdf_timer_t dfs_cac_timer; 1243 qdf_timer_t dfs_cac_valid_timer; 1244 int dfs_cac_timeout_override; 1245 uint8_t dfs_enable:1, 1246 dfs_cac_timer_running:1, 1247 dfs_ignore_dfs:1, 1248 dfs_ignore_cac:1, 1249 dfs_cac_valid:1; 1250 uint32_t dfs_cac_valid_time; 1251 int dfs_precac_timeout_override; 1252 uint8_t dfs_num_precac_freqs; 1253 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) 1254 uint8_t dfs_disable_radar_marking; 1255 #endif 1256 TAILQ_HEAD(, dfs_precac_entry) dfs_precac_list; 1257 enum phy_ch_width dfs_precac_chwidth; 1258 1259 struct dfs_channel *dfs_curchan; 1260 struct dfs_channel *dfs_prevchan; 1261 struct dfs_channel dfs_cac_started_chan; 1262 struct wlan_objmgr_pdev *dfs_pdev_obj; 1263 struct dfs_soc_priv_obj *dfs_soc_obj; 1264 #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS) 1265 uint8_t dfs_psoc_idx; 1266 #endif 1267 #ifdef CONFIG_CHAN_NUM_API 1268 uint8_t dfs_agile_precac_freq; 1269 #endif 1270 #ifdef CONFIG_CHAN_FREQ_API 1271 uint16_t dfs_agile_precac_freq_mhz; 1272 #endif 1273 bool dfs_is_offload_enabled; 1274 int dfs_use_nol; 1275 qdf_spinlock_t dfs_nol_lock; 1276 uint16_t tx_leakage_threshold; 1277 bool dfs_use_nol_subchannel_marking; 1278 uint8_t dfs_spoof_test_done:1; 1279 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 1280 qdf_timer_t dfs_host_wait_timer; 1281 uint32_t dfs_average_pri; 1282 uint32_t dfs_average_duration; 1283 uint32_t dfs_average_sidx; 1284 uint8_t dfs_is_host_wait_running:1, 1285 dfs_average_params_sent:1, 1286 dfs_no_res_from_fw:1, 1287 dfs_spoof_check_failed:1; 1288 struct dfs_channel dfs_radar_found_chan; 1289 int dfs_status_timeout_override; 1290 #endif 1291 bool dfs_is_stadfs_enabled; 1292 int32_t dfs_min_sidx; 1293 int32_t dfs_max_sidx; 1294 uint8_t dfs_seg_id; 1295 uint8_t dfs_is_chirp; 1296 bool dfs_bw_reduced; 1297 int32_t dfs_freq_offset; 1298 bool dfs_cac_aborted; 1299 qdf_spinlock_t dfs_data_struct_lock; 1300 #if defined(QCA_DFS_RCSA_SUPPORT) 1301 uint8_t dfs_nol_ie_bandwidth; 1302 uint16_t dfs_nol_ie_startfreq; 1303 uint8_t dfs_nol_ie_bitmap; 1304 bool dfs_is_rcsa_ie_sent; 1305 bool dfs_is_nol_ie_sent; 1306 #endif 1307 uint8_t dfs_legacy_precac_ucfg:1, 1308 dfs_agile_precac_ucfg:1, 1309 #if defined(QCA_SUPPORT_ADFS_RCAC) 1310 dfs_agile_rcac_ucfg:1, 1311 #endif 1312 dfs_fw_adfs_support_non_160:1, 1313 dfs_fw_adfs_support_160:1; 1314 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(WLAN_DFS_SYNTHETIC_RADAR) 1315 bool dfs_allow_hw_pulses; 1316 #endif 1317 struct dfs_mode_switch_defer_params dfs_defer_params; 1318 uint8_t dfs_agile_detector_id; 1319 #if defined(QCA_SUPPORT_ADFS_RCAC) 1320 uint16_t dfs_agile_rcac_freq_ucfg; 1321 struct dfs_rcac_params dfs_rcac_param; 1322 #endif 1323 uint16_t dfs_lowest_pri_limit; 1324 #if defined(QCA_SUPPORT_DFS_CHAN_POSTNOL) 1325 qdf_freq_t dfs_chan_postnol_freq; 1326 enum phy_ch_width dfs_chan_postnol_mode; 1327 qdf_freq_t dfs_chan_postnol_cfreq2; 1328 #endif 1329 #if defined(WLAN_DISP_CHAN_INFO) 1330 enum channel_dfs_state dfs_channel_state_array[NUM_DFS_CHANS]; 1331 #endif /* WLAN_DISP_CHAN_INFO */ 1332 }; 1333 1334 #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS) 1335 /** 1336 * struct wlan_dfs_priv - dfs private struct with agile capability info 1337 * @wlan_dfs: pointer to wlan_dfs object. 1338 * @agile_precac_active: agile precac active information for wlan_dfs_priv obj 1339 */ 1340 struct wlan_dfs_priv { 1341 struct wlan_dfs *dfs; 1342 bool agile_precac_active; 1343 }; 1344 #endif 1345 1346 /** 1347 * struct dfs_soc_priv_obj - dfs private data 1348 * @psoc: pointer to PSOC object information 1349 * @pdev: pointer to PDEV object information 1350 * @dfs_is_phyerr_filter_offload: For some chip like Rome indicates too many 1351 * phyerr packets in a short time, which causes 1352 * OS hang. If this feild is configured as true, 1353 * FW will do the pre-check, filter out some 1354 * kinds of invalid phyerrors and indicate 1355 * radar detection related information to host. 1356 * @dfs_priv: array of dfs private structs with agile capability info 1357 * @num_dfs_privs: array size of dfs private structs for given psoc. 1358 * @cur_dfs_index: index of the current dfs object using the Agile Engine. 1359 * It is used to index struct wlan_dfs_priv dfs_priv[] array. 1360 * @dfs_precac_timer: agile precac timer 1361 * @dfs_precac_timer_running: precac timer running flag 1362 * @ocac_status: Off channel CAC complete status 1363 * @dfs_nol_ctx: dfs NOL data for all radios. 1364 * @dfs_rcac_timer: Agile RCAC (Rolling CAC) timer. 1365 * @dfs_agile_sm_hdl: The handle for the state machine that drives Agile 1366 * Engine. 1367 * @dfs_agile_sm_cur_state: Current state of the Agile State Machine. 1368 * @dfs_rcac_sm_lock: DFS Rolling CAC state machine lock. 1369 */ 1370 struct dfs_soc_priv_obj { 1371 struct wlan_objmgr_psoc *psoc; 1372 struct wlan_objmgr_pdev *pdev; 1373 bool dfs_is_phyerr_filter_offload; 1374 #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS) 1375 struct wlan_dfs_priv dfs_priv[WLAN_UMAC_MAX_PDEVS]; 1376 uint8_t num_dfs_privs; 1377 uint8_t cur_agile_dfs_index; 1378 qdf_timer_t dfs_precac_timer; 1379 uint8_t dfs_precac_timer_running; 1380 bool precac_state_started; 1381 bool ocac_status; 1382 #endif 1383 struct dfsreq_nolinfo *dfs_psoc_nolinfo; 1384 #ifdef QCA_SUPPORT_ADFS_RCAC 1385 qdf_timer_t dfs_rcac_timer; 1386 #endif 1387 #ifdef QCA_SUPPORT_AGILE_DFS 1388 struct wlan_sm *dfs_agile_sm_hdl; 1389 enum dfs_agile_sm_state dfs_agile_sm_cur_state; 1390 qdf_spinlock_t dfs_agile_sm_lock; 1391 #endif 1392 }; 1393 1394 /** 1395 * enum DFS debug - This should match the table from if_ath.c. 1396 * @WLAN_DEBUG_DFS: Minimal DFS debug. 1397 * @WLAN_DEBUG_DFS1: Normal DFS debug. 1398 * @WLAN_DEBUG_DFS2: Maximal DFS debug. 1399 * @WLAN_DEBUG_DFS3: Matched filterID display. 1400 * @WLAN_DEBUG_DFS_PHYERR: Phy error parsing. 1401 * @WLAN_DEBUG_DFS_NOL: NOL related entries. 1402 * @WLAN_DEBUG_DFS_PHYERR_SUM: PHY error summary. 1403 * @WLAN_DEBUG_DFS_PHYERR_PKT: PHY error payload. 1404 * @WLAN_DEBUG_DFS_BIN5: BIN5 checks. 1405 * @WLAN_DEBUG_DFS_BIN5_FFT: BIN5 FFT check. 1406 * @WLAN_DEBUG_DFS_BIN5_PULSE: BIN5 pulse check. 1407 * @WLAN_DEBUG_DFS_FALSE_DET: False detection debug related prints. 1408 * @WLAN_DEBUG_DFS_FALSE_DET2: Second level check to confirm poisitive 1409 * detection. 1410 * @WLAN_DEBUG_DFS_RANDOM_CHAN: Random channel selection. 1411 * @WLAN_DEBUG_DFS_AGILE: Agile PreCAC/RCAC 1412 */ 1413 enum { 1414 WLAN_DEBUG_DFS = 0x00000100, 1415 WLAN_DEBUG_DFS1 = 0x00000200, 1416 WLAN_DEBUG_DFS2 = 0x00000400, 1417 WLAN_DEBUG_DFS3 = 0x00000800, 1418 WLAN_DEBUG_DFS_PHYERR = 0x00001000, 1419 WLAN_DEBUG_DFS_NOL = 0x00002000, 1420 WLAN_DEBUG_DFS_PHYERR_SUM = 0x00004000, 1421 WLAN_DEBUG_DFS_PHYERR_PKT = 0x00008000, 1422 WLAN_DEBUG_DFS_BIN5 = 0x00010000, 1423 WLAN_DEBUG_DFS_BIN5_FFT = 0x00020000, 1424 WLAN_DEBUG_DFS_BIN5_PULSE = 0x00040000, 1425 WLAN_DEBUG_DFS_FALSE_DET = 0x00080000, 1426 WLAN_DEBUG_DFS_FALSE_DET2 = 0x00100000, 1427 WLAN_DEBUG_DFS_RANDOM_CHAN = 0x00200000, 1428 WLAN_DEBUG_DFS_AGILE = 0x00400000, 1429 WLAN_DEBUG_DFS_MAX = 0x80000000, 1430 WLAN_DEBUG_DFS_ALWAYS = WLAN_DEBUG_DFS_MAX 1431 }; 1432 1433 /** 1434 * enum host dfs spoof check status. 1435 * @HOST_DFS_CHECK_PASSED: Host indicates RADAR detected and the FW 1436 * confirms it to be spoof radar to host. 1437 * @HOST_DFS_CHECK_FAILED: Host doesn't indicate RADAR detected or spoof 1438 * radar parameters by 1439 * WMI_HOST_DFS_RADAR_FOUND_CMDID doesn't match. 1440 * @HOST_DFS_STATUS_CHECK_HW_RADAR: Host indicates RADAR detected and the 1441 * FW confirms it to be real HW radar to host. 1442 */ 1443 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 1444 enum { 1445 HOST_DFS_STATUS_CHECK_PASSED = 0, 1446 HOST_DFS_STATUS_CHECK_FAILED = 1, 1447 HOST_DFS_STATUS_CHECK_HW_RADAR = 2 1448 }; 1449 #endif 1450 1451 /** 1452 * struct dfs_phy_err - DFS phy error. 1453 * @fulltsf: 64-bit TSF as read from MAC. 1454 * @is_pri: Detected on primary channel. 1455 * @is_ext: Detected on extension channel. 1456 * @is_dc: Detected at DC. 1457 * @is_early: Early detect. 1458 * @do_check_chirp: Whether to check hw_chirp/sw_chirp. 1459 * @is_hw_chirp: Hardware-detected chirp. 1460 * @is_sw_chirp: Software detected chirp. 1461 * @rs_tstamp: 32 bit TSF from RX descriptor (event). 1462 * @freq: Centre frequency of event - KHz. 1463 * @freq_lo: Lower bounds of frequency - KHz. 1464 * @freq_hi: Upper bounds of frequency - KHz. 1465 * @rssi: Pulse RSSI. 1466 * @dur: Pulse duration, raw (not uS). 1467 * @seg_id: HT80_80/HT160 use. 1468 * @sidx: Seg index. 1469 * @freq_offset_khz: Freq offset in KHz. 1470 * @peak_mag: Peak mag. 1471 * @total_gain: Total gain. 1472 * @mb_gain: Mb gain. 1473 * @relpwr_db: Relpower in DB. 1474 * @pulse_delta_diff: Pulse delta diff. 1475 * @pulse_delta_peak: Pulse delta peak. 1476 * @pulse_psidx_diff: Pulse psidx diff. 1477 * 1478 * Chirp notes! 1479 * 1480 * Pre-Sowl chips don't do FFT reports, so chirp pulses simply show up 1481 * as long duration pulses. 1482 * 1483 * The bin5 checking code would simply look for a chirp pulse of the correct 1484 * duration (within MIN_BIN5_DUR and MAX_BIN5_DUR) and add it to the "chirp" 1485 * pattern. 1486 * 1487 * For Sowl and later, an FFT was done on longer duration frames. If those 1488 * frames looked like a chirp, their duration was adjusted to fall within 1489 * the chirp duration limits. If the pulse failed the chirp test (it had 1490 * no FFT data or the FFT didn't meet the chirping requirements) then the 1491 * pulse duration was adjusted to be greater than MAX_BIN5_DUR, so it 1492 * would always fail chirp detection. 1493 * 1494 * This is pretty horrible. 1495 * 1496 * The eventual goal for chirp handling is thus: 1497 * 1498 * 1)In case someone ever wants to do chirp detection with this code on 1499 * chips that don't support chirp detection, you can still do it based 1500 * on pulse duration. That's your problem to solve. 1501 * 1502 * 2)For chips that do hardware chirp detection or FFT, the "do_check_chirp" 1503 * bit should be set. 1504 * 1505 * 3)Then, either is_hw_chirp or is_sw_chirp is set, indicating that 1506 * the hardware or software post-processing of the chirp event found 1507 * that indeed it was a chirp. 1508 * 1509 * 4)Finally, the bin5 code should just check whether the chirp bits are 1510 * set and behave appropriately, falling back onto the duration checks 1511 * if someone wishes to use this on older hardware (or with disabled 1512 * FFTs, for whatever reason.) 1513 * 1514 * XXX TODO: 1515 * 1516 * 1)add duration in uS and raw duration, so the PHY error parsing 1517 * code is responsible for doing the duration calculation; 1518 * 2)add ts in raw and corrected, so the PHY error parsing 1519 * code is responsible for doing the offsetting, not the radar 1520 * event code. 1521 */ 1522 struct dfs_phy_err { 1523 uint64_t fulltsf; 1524 uint32_t is_pri:1, 1525 is_ext:1, 1526 is_dc:1, 1527 is_early:1, 1528 do_check_chirp:1, 1529 is_hw_chirp:1, 1530 is_sw_chirp:1; 1531 uint32_t rs_tstamp; 1532 uint32_t freq; 1533 uint32_t freq_lo; 1534 uint32_t freq_hi; 1535 uint8_t rssi; 1536 uint8_t dur; 1537 uint8_t seg_id; 1538 int sidx; 1539 u_int freq_offset_khz; 1540 int peak_mag; 1541 int total_gain; 1542 int mb_gain; 1543 int relpwr_db; 1544 uint8_t pulse_delta_diff; 1545 int8_t pulse_delta_peak; 1546 int16_t pulse_psidx_diff; 1547 }; 1548 1549 /** 1550 * struct rx_radar_status - Parsed radar status 1551 * @raw_tsf: Raw tsf 1552 * @tsf_offset: TSF offset. 1553 * @rssi: RSSI. 1554 * @pulse_duration: Pulse duration. 1555 * @is_chirp: Is chirp. 1556 * @delta_peak: Delta peak. 1557 * @delta_diff: Delta diff. 1558 * @sidx: Starting frequency. 1559 * @freq_offset: Frequency offset. 1560 * @agc_total_gain: AGC total gain. 1561 * @agc_mb_gain: AGC MB gain. 1562 */ 1563 struct rx_radar_status { 1564 uint32_t raw_tsf; 1565 uint32_t tsf_offset; 1566 int rssi; 1567 int pulse_duration; 1568 int is_chirp:1; 1569 int delta_peak; 1570 int delta_diff; 1571 int sidx; 1572 int freq_offset; /* in KHz */ 1573 int agc_total_gain; 1574 int agc_mb_gain; 1575 }; 1576 1577 /** 1578 * struct rx_search_fft_report - FFT report. 1579 * @total_gain_db: Total gain in Db. 1580 * @base_pwr_db: Base power in Db. 1581 * @fft_chn_idx: FFT channel index. 1582 * @peak_sidx: Peak sidx. 1583 * @relpwr_db: Real power in Db. 1584 * @avgpwr_db: Average power in Db. 1585 * @peak_mag: Peak Mag. 1586 * @num_str_bins_ib: Num dtr BINs IB 1587 * @seg_id: Segment ID 1588 */ 1589 struct rx_search_fft_report { 1590 uint32_t total_gain_db; 1591 uint32_t base_pwr_db; 1592 int fft_chn_idx; 1593 int peak_sidx; 1594 int relpwr_db; 1595 int avgpwr_db; 1596 int peak_mag; 1597 int num_str_bins_ib; 1598 int seg_id; 1599 }; 1600 1601 /** 1602 * dfs_process_radarevent() - process the radar event generated for a pulse. 1603 * @dfs: Pointer to wlan_dfs structure. 1604 * @chan: Current channel. 1605 * 1606 * There is currently no way to specify that a radar event has occurred on 1607 * a specific channel, so the current methodology is to mark both the pri 1608 * and ext channels as being unavailable. This should be fixed for 802.11ac 1609 * or we'll quickly run out of valid channels to use. 1610 * 1611 * If Radar found, this marks the channel (and the extension channel, if HT40) 1612 * as having seen a radar event. It marks CHAN_INTERFERENCE and will add it to 1613 * the local NOL implementation. This is only done for 'usenol=1', as the other 1614 * two modes don't do radar notification or CAC/CSA/NOL; it just notes there 1615 * was a radar. 1616 */ 1617 void dfs_process_radarevent(struct wlan_dfs *dfs, 1618 struct dfs_channel *chan); 1619 1620 /** 1621 * dfs_nol_addchan() - Add channel to NOL. 1622 * @dfs: Pointer to wlan_dfs structure. 1623 * @freq: frequency to add to NOL. 1624 * @dfs_nol_timeout: NOL timeout. 1625 */ 1626 void dfs_nol_addchan(struct wlan_dfs *dfs, 1627 uint16_t freq, 1628 uint32_t dfs_nol_timeout); 1629 1630 /** 1631 * dfs_get_nol() - Get NOL. 1632 * @dfs: Pointer to wlan_dfs structure. 1633 * @dfs_nol: Pointer to dfsreq_nolelem structure to save the channels from NOL. 1634 * @nchan: Number of channels. 1635 */ 1636 void dfs_get_nol(struct wlan_dfs *dfs, 1637 struct dfsreq_nolelem *dfs_nol, 1638 int *nchan); 1639 1640 /** 1641 * dfs_set_nol() - Set NOL. 1642 * @dfs: Pointer to wlan_dfs structure. 1643 * @dfs_nol: Pointer to dfsreq_nolelem structure. 1644 * @nchan: Number of channels. 1645 */ 1646 void dfs_set_nol(struct wlan_dfs *dfs, 1647 struct dfsreq_nolelem *dfs_nol, 1648 int nchan); 1649 1650 /** 1651 * dfs_nol_update() - NOL update 1652 * @dfs: Pointer to wlan_dfs structure. 1653 * 1654 * Notify the driver/umac that it should update the channel radar/NOL flags 1655 * based on the current NOL list. 1656 */ 1657 void dfs_nol_update(struct wlan_dfs *dfs); 1658 1659 /** 1660 * dfs_nol_timer_cleanup() - NOL timer cleanup. 1661 * @dfs: Pointer to wlan_dfs structure. 1662 * 1663 * Cancels the NOL timer and frees the NOL elements. 1664 */ 1665 void dfs_nol_timer_cleanup(struct wlan_dfs *dfs); 1666 1667 /** 1668 * dfs_nol_timer_detach() - Free NOL timer. 1669 * @dfs: Pointer to wlan_dfs structure. 1670 */ 1671 void dfs_nol_timer_detach(struct wlan_dfs *dfs); 1672 1673 /** 1674 * dfs_nol_workqueue_cleanup() - Flushes NOL workqueue. 1675 * @dfs: Pointer to wlan_dfs structure. 1676 * 1677 * Flushes the NOL workqueue. 1678 */ 1679 void dfs_nol_workqueue_cleanup(struct wlan_dfs *dfs); 1680 1681 /** 1682 * dfs_retain_bin5_burst_pattern() - Retain the BIN5 burst pattern. 1683 * @dfs: Pointer to wlan_dfs structure. 1684 * @diff_ts: Timestamp diff. 1685 * @old_dur: Old duration. 1686 */ 1687 uint8_t dfs_retain_bin5_burst_pattern(struct wlan_dfs *dfs, 1688 uint32_t diff_ts, 1689 uint8_t old_dur); 1690 1691 /** 1692 * dfs_bin5_check_pulse() - BIN5 check pulse. 1693 * @dfs: Pointer to wlan_dfs structure. 1694 * @re: Pointer to dfs_event structure. 1695 * @br: Pointer to dfs_bin5radars structure. 1696 * 1697 * Reject the pulse if: 1698 * 1) It's outside the RSSI threshold; 1699 * 2) It's outside the pulse duration; 1700 * 3) It's been verified by HW/SW chirp checking 1701 * and neither of those found a chirp. 1702 */ 1703 int dfs_bin5_check_pulse(struct wlan_dfs *dfs, 1704 struct dfs_event *re, 1705 struct dfs_bin5radars *br); 1706 1707 /** 1708 * dfs_bin5_addpulse() - BIN5 add pulse. 1709 * @dfs: Pointer to wlan_dfs structure. 1710 * @br: Pointer to dfs_bin5radars structure. 1711 * @re: Pointer to dfs_event structure. 1712 * @thists: Timestamp. 1713 */ 1714 int dfs_bin5_addpulse(struct wlan_dfs *dfs, 1715 struct dfs_bin5radars *br, 1716 struct dfs_event *re, 1717 uint64_t thists); 1718 1719 /** 1720 * dfs_bin5_check() - BIN5 check. 1721 * @dfs: Pointer to wlan_dfs structure. 1722 * 1723 * If the dfs structure is NULL (which should be illegal if everyting is working 1724 * properly, then signify that a bin5 radar was found. 1725 */ 1726 int dfs_bin5_check(struct wlan_dfs *dfs); 1727 1728 /** 1729 * dfs_check_chirping() - Check chirping. 1730 * @dfs: Pointer to wlan_dfs structure. 1731 * @buf: Phyerr buffer 1732 * @datalen: Phyerr buf length 1733 * @is_ctl: detected on primary channel. 1734 * @is_ext: detected on extension channel. 1735 * @slope: Slope 1736 * @is_dc: DC found 1737 * 1738 * This examines the FFT data contained in the PHY error information to figure 1739 * out whether the pulse is moving across frequencies. 1740 */ 1741 int dfs_check_chirping(struct wlan_dfs *dfs, 1742 void *buf, 1743 uint16_t datalen, 1744 int is_ctl, 1745 int is_ext, 1746 int *slope, 1747 int *is_dc); 1748 1749 /** 1750 * dfs_get_random_bin5_dur() - Get random BIN5 duration. 1751 * @dfs: Pointer to wlan_dfs structure. 1752 * @tstamp: Timestamp. 1753 * 1754 * Chirping pulses may get cut off at DC and report lower durations. 1755 * This function will compute a suitable random duration for each pulse. 1756 * Duration must be between 50 and 100 us, but remember that in 1757 * wlan_process_phyerr() which calls this function, we are dealing with the 1758 * HW reported duration (unconverted). dfs_process_radarevent() will 1759 * actually convert the duration into the correct value. 1760 * This function doesn't take into account whether the hardware 1761 * is operating in 5GHz fast clock mode or not. 1762 * And this function doesn't take into account whether the hardware 1763 * is peregrine or not. 1764 */ 1765 int dfs_get_random_bin5_dur(struct wlan_dfs *dfs, 1766 uint64_t tstamp); 1767 1768 /** 1769 * dfs_print_delayline() - Prints delayline. 1770 * @dfs: Pointer to wlan_dfs structure. 1771 * @dl: Pointer to dfs_delayline structure. 1772 */ 1773 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 1774 void dfs_print_delayline(struct wlan_dfs *dfs, 1775 struct dfs_delayline *dl); 1776 #else 1777 static inline 1778 void dfs_print_delayline(struct wlan_dfs *dfs, struct dfs_delayline *dl) 1779 { 1780 } 1781 #endif 1782 1783 /** 1784 * dfs_print_nol() - Print NOL elements. 1785 * @dfs: Pointer to wlan_dfs structure. 1786 */ 1787 void dfs_print_nol(struct wlan_dfs *dfs); 1788 1789 /** 1790 * dfs_print_filter() - Prints the filter. 1791 * @dfs: Pointer to wlan_dfs structure. 1792 * @rf: Pointer to dfs_filter structure. 1793 */ 1794 void dfs_print_filter(struct wlan_dfs *dfs, 1795 struct dfs_filter *rf); 1796 1797 /** 1798 * dfs_getchanstate() - Get chan state. 1799 * @dfs: Pointer to wlan_dfs structure. 1800 * @index: To save the index of dfs_radar[] 1801 * @ext_chan_flag: Extension channel flag; 1802 */ 1803 struct dfs_state *dfs_getchanstate(struct wlan_dfs *dfs, 1804 uint8_t *index, 1805 int ext_ch_flag); 1806 1807 /** 1808 * dfs_round() - DFS found. 1809 * @val: Convert durations to TSF ticks. 1810 * 1811 * Return: TSF ticks. 1812 */ 1813 uint32_t dfs_round(int32_t val); 1814 1815 /** 1816 * dfs_reset_alldelaylines() - Reset alldelaylines. 1817 * @dfs: Pointer to wlan_dfs structure. 1818 */ 1819 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 1820 void dfs_reset_alldelaylines(struct wlan_dfs *dfs); 1821 #else 1822 static inline void dfs_reset_alldelaylines(struct wlan_dfs *dfs) 1823 { 1824 } 1825 #endif 1826 1827 /** 1828 * dfs_reset_delayline() - Clear only a single delay line. 1829 * @dl: Pointer to dfs_delayline structure. 1830 */ 1831 void dfs_reset_delayline(struct dfs_delayline *dl); 1832 1833 /** 1834 * dfs_reset_filter_delaylines() - Reset filter delaylines. 1835 * @dft: Pointer to dfs_filtertype structure. 1836 */ 1837 void dfs_reset_filter_delaylines(struct dfs_filtertype *dft); 1838 1839 /** 1840 * dfs_reset_radarq() - Reset radar queue. 1841 * @dfs: Pointer to wlan_dfs structure. 1842 */ 1843 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 1844 void dfs_reset_radarq(struct wlan_dfs *dfs); 1845 #else 1846 static inline void dfs_reset_radarq(struct wlan_dfs *dfs) 1847 { 1848 } 1849 #endif 1850 1851 /** 1852 * dfs_add_pulse() - Adds pulse to the queue. 1853 * @dfs: Pointer to wlan_dfs structure. 1854 * @rf: Pointer to dfs_filter structure. 1855 * @re: Pointer to dfs_event structure. 1856 * @deltaT: deltaT value. 1857 * @this_ts: Last time stamp. 1858 */ 1859 void dfs_add_pulse(struct wlan_dfs *dfs, 1860 struct dfs_filter *rf, 1861 struct dfs_event *re, 1862 uint32_t deltaT, 1863 uint64_t this_ts); 1864 1865 /** 1866 * dfs_bin_check() - BIN check 1867 * @dfs: Pointer to wlan_dfs structure. 1868 * @rf: Pointer to dfs_filter structure. 1869 * @deltaT: deltaT value. 1870 * @width: Width 1871 * @ext_chan_flag: Extension channel flag. 1872 */ 1873 int dfs_bin_check(struct wlan_dfs *dfs, 1874 struct dfs_filter *rf, 1875 uint32_t deltaT, 1876 uint32_t dur, 1877 int ext_chan_flag); 1878 1879 /** 1880 * dfs_bin_pri_check() - BIN PRI check 1881 * @dfs: Pointer to wlan_dfs structure. 1882 * @rf: Pointer to dfs_filter structure. 1883 * @dl: Pointer to dfs_delayline structure. 1884 * @score: Primary score. 1885 * @refpri: Current "filter" time for start of pulse in usecs. 1886 * @refdur: Duration value. 1887 * @ext_chan_flag: Extension channel flag. 1888 * @fundamentalpri: Highest PRI. 1889 */ 1890 int dfs_bin_pri_check(struct wlan_dfs *dfs, 1891 struct dfs_filter *rf, 1892 struct dfs_delayline *dl, 1893 uint32_t score, 1894 uint32_t refpri, 1895 uint32_t refdur, 1896 int ext_chan_flag, 1897 int fundamentalpri); 1898 1899 /** 1900 * dfs_staggered_check() - Detection implementation for staggered PRIs. 1901 * @dfs: Pointer to wlan_dfs structure. 1902 * @rf: Pointer to dfs_filter structure. 1903 * @deltaT: Delta of the Timestamp. 1904 * @width: Duration of radar pulse. 1905 * 1906 * Return: 1 on success and 0 on failure. 1907 */ 1908 int dfs_staggered_check(struct wlan_dfs *dfs, 1909 struct dfs_filter *rf, 1910 uint32_t deltaT, 1911 uint32_t width); 1912 1913 /** 1914 * dfs_get_pri_margin() - Get Primary margin. 1915 * @dfs: Pointer to wlan_dfs structure. 1916 * @is_extchan_detect: Extension channel detect. 1917 * @is_fixed_pattern: Fixed pattern. 1918 * 1919 * For the extension channel, if legacy traffic is present, we see a lot of 1920 * false alarms, so make the PRI margin narrower depending on the busy % for 1921 * the extension channel. 1922 * 1923 * Return: Returns pri_margin. 1924 */ 1925 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 1926 int dfs_get_pri_margin(struct wlan_dfs *dfs, 1927 int is_extchan_detect, 1928 int is_fixed_pattern); 1929 #else 1930 static inline 1931 int dfs_get_pri_margin(struct wlan_dfs *dfs, 1932 int is_extchan_detect, 1933 int is_fixed_pattern) 1934 { 1935 return 0; 1936 } 1937 #endif 1938 1939 /** 1940 * dfs_get_filter_threshold() - Get filter threshold. 1941 * @dfs: Pointer to wlan_dfs structure. 1942 * @rf: Pointer to dfs_filter structure. 1943 * @is_extchan_detect: Extension channel detect. 1944 * 1945 * For the extension channel, if legacy traffic is present, we see a lot of 1946 * false alarms, so make the thresholds higher depending on the busy % for the 1947 * extension channel. 1948 * 1949 * Return: Returns threshold. 1950 */ 1951 int dfs_get_filter_threshold(struct wlan_dfs *dfs, 1952 struct dfs_filter *rf, 1953 int is_extchan_detect); 1954 1955 #if defined(QCA_MCL_DFS_SUPPORT) 1956 /** 1957 * dfs_process_ar_event() - Process the ar event. 1958 * @dfs: Pointer to wlan_dfs structure. 1959 * @chan: Current channel structure. 1960 */ 1961 static inline void dfs_process_ar_event(struct wlan_dfs *dfs, 1962 struct dfs_channel *chan) 1963 { 1964 } 1965 1966 /** 1967 * dfs_reset_ar() - resets the ar state. 1968 * @dfs: pointer to wlan_dfs structure. 1969 */ 1970 static inline void dfs_reset_ar(struct wlan_dfs *dfs) 1971 { 1972 } 1973 1974 /** 1975 * dfs_reset_arq() - resets the ar queue. 1976 * @dfs: pointer to wlan_dfs structure. 1977 */ 1978 static inline void dfs_reset_arq(struct wlan_dfs *dfs) 1979 { 1980 } 1981 1982 #else 1983 void dfs_process_ar_event(struct wlan_dfs *dfs, 1984 struct dfs_channel *chan); 1985 1986 void dfs_reset_ar(struct wlan_dfs *dfs); 1987 void dfs_reset_arq(struct wlan_dfs *dfs); 1988 #endif 1989 1990 /** 1991 * dfs_is_radar_enabled() - check if radar detection is enabled. 1992 * @dfs: Pointer to wlan_dfs structure. 1993 * @ignore_dfs: if 1 then radar detection is disabled.. 1994 */ 1995 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 1996 void dfs_is_radar_enabled(struct wlan_dfs *dfs, 1997 int *ignore_dfs); 1998 #else 1999 static inline void dfs_is_radar_enabled(struct wlan_dfs *dfs, 2000 int *ignore_dfs) 2001 { 2002 } 2003 #endif 2004 2005 /** 2006 * dfs_process_phyerr_bb_tlv() - Parses the PHY error and populates the 2007 * dfs_phy_err struct. 2008 * @dfs: Pointer to wlan_dfs structure. 2009 * @buf: Phyerr buffer 2010 * @datalen: Phyerr buf len 2011 * @rssi: RSSI 2012 * @ext_rssi: Extension RSSI. 2013 * @rs_tstamp: Time stamp. 2014 * @fulltsf: TSF64. 2015 * @e: Pointer to dfs_phy_err structure. 2016 * 2017 * Return: Returns 1. 2018 */ 2019 int dfs_process_phyerr_bb_tlv(struct wlan_dfs *dfs, 2020 void *buf, 2021 uint16_t datalen, 2022 uint8_t rssi, 2023 uint8_t ext_rssi, 2024 uint32_t rs_tstamp, 2025 uint64_t fulltsf, 2026 struct dfs_phy_err *e); 2027 2028 /** 2029 * dfs_reset() - DFS reset 2030 * @dfs: Pointer to wlan_dfs structure. 2031 */ 2032 void dfs_reset(struct wlan_dfs *dfs); 2033 2034 /** 2035 * dfs_radar_enable() - Enables the radar. 2036 * @dfs: Pointer to wlan_dfs structure. 2037 * @no_cac: If no_cac is 0, it cancels the CAC. 2038 */ 2039 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2040 void dfs_radar_enable(struct wlan_dfs *dfs, 2041 int no_cac, uint32_t opmode); 2042 #else 2043 static inline void dfs_radar_enable(struct wlan_dfs *dfs, 2044 int no_cac, uint32_t opmode) 2045 { 2046 } 2047 #endif 2048 2049 /** 2050 * dfs_process_phyerr() - Process phyerr. 2051 * @dfs: Pointer to wlan_dfs structure. 2052 * @buf: Phyerr buffer. 2053 * @datalen: phyerr buffer length. 2054 * @r_rssi: RSSI. 2055 * @r_ext_rssi: Extension channel RSSI. 2056 * @r_rs_tstamp: Timestamp. 2057 * @r_fulltsf: TSF64. 2058 */ 2059 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2060 void dfs_process_phyerr(struct wlan_dfs *dfs, 2061 void *buf, 2062 uint16_t datalen, 2063 uint8_t r_rssi, 2064 uint8_t r_ext_rssi, 2065 uint32_t r_rs_tstamp, 2066 uint64_t r_fulltsf); 2067 #else 2068 static inline void dfs_process_phyerr(struct wlan_dfs *dfs, 2069 void *buf, 2070 uint16_t datalen, 2071 uint8_t r_rssi, 2072 uint8_t r_ext_rssi, 2073 uint32_t r_rs_tstamp, 2074 uint64_t r_fulltsf) 2075 { 2076 } 2077 #endif 2078 2079 #ifdef QCA_MCL_DFS_SUPPORT 2080 /** 2081 * dfs_process_phyerr_filter_offload() - Process radar event. 2082 * @dfs: Pointer to wlan_dfs structure. 2083 * @wlan_radar_event: Pointer to radar_event_info structure. 2084 * 2085 * Return: None 2086 */ 2087 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2088 void dfs_process_phyerr_filter_offload(struct wlan_dfs *dfs, 2089 struct radar_event_info *wlan_radar_event); 2090 #else 2091 static inline void dfs_process_phyerr_filter_offload( 2092 struct wlan_dfs *dfs, 2093 struct radar_event_info *wlan_radar_event) 2094 { 2095 } 2096 #endif 2097 #endif 2098 2099 /** 2100 * dfs_get_radars() - Based on the chipset, calls init radar table functions. 2101 * @dfs: Pointer to wlan_dfs structure. 2102 */ 2103 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2104 void dfs_get_radars(struct wlan_dfs *dfs); 2105 #else 2106 static inline void dfs_get_radars(struct wlan_dfs *dfs) 2107 { 2108 } 2109 #endif 2110 2111 /** 2112 * dfs_attach() - Wrapper function to allocate memory for wlan_dfs members. 2113 * @dfs: Pointer to wlan_dfs structure. 2114 */ 2115 int dfs_attach(struct wlan_dfs *dfs); 2116 2117 2118 /** 2119 * dfs_create_object() - Creates DFS object. 2120 * @dfs: Pointer to wlan_dfs structure. 2121 */ 2122 int dfs_create_object(struct wlan_dfs **dfs); 2123 2124 /** 2125 * dfs_destroy_object() - Destroys the DFS object. 2126 * @dfs: Pointer to wlan_dfs structure. 2127 */ 2128 void dfs_destroy_object(struct wlan_dfs *dfs); 2129 2130 /** 2131 * dfs_detach() - Wrapper function to free dfs variables. 2132 * @dfs: Pointer to wlan_dfs structure. 2133 */ 2134 void dfs_detach(struct wlan_dfs *dfs); 2135 2136 /** 2137 * dfs_cac_valid_reset() - Cancels the dfs_cac_valid_timer timer. 2138 * @dfs: Pointer to wlan_dfs structure. 2139 * @prevchan_ieee: Prevchan number. 2140 * @prevchan_flags: Prevchan flags. 2141 */ 2142 #ifdef CONFIG_CHAN_NUM_API 2143 void dfs_cac_valid_reset(struct wlan_dfs *dfs, 2144 uint8_t prevchan_ieee, 2145 uint32_t prevchan_flags); 2146 #endif 2147 2148 /** 2149 * dfs_cac_valid_reset_for_freq() - Cancels the dfs_cac_valid_timer timer. 2150 * @dfs: Pointer to wlan_dfs structure. 2151 * @prevchan_chan: Prevchan frequency 2152 * @prevchan_flags: Prevchan flags. 2153 */ 2154 #ifdef CONFIG_CHAN_FREQ_API 2155 void dfs_cac_valid_reset_for_freq(struct wlan_dfs *dfs, 2156 uint16_t prevchan_freq, 2157 uint32_t prevchan_flags); 2158 #endif 2159 2160 /** 2161 * dfs_cac_stop() - Clear the AP CAC timer. 2162 * @dfs: Pointer to wlan_dfs structure. 2163 */ 2164 void dfs_cac_stop(struct wlan_dfs *dfs); 2165 2166 /** 2167 * dfs_cancel_cac_timer() - Cancels the CAC timer. 2168 * @dfs: Pointer to wlan_dfs structure. 2169 */ 2170 void dfs_cancel_cac_timer(struct wlan_dfs *dfs); 2171 2172 /** 2173 * dfs_start_cac_timer() - Starts the CAC timer. 2174 * @dfs: Pointer to wlan_dfs structure. 2175 */ 2176 void dfs_start_cac_timer(struct wlan_dfs *dfs); 2177 2178 /** 2179 * dfs_set_update_nol_flag() - Sets update_nol flag. 2180 * @dfs: Pointer to wlan_dfs structure. 2181 * @val: update_nol flag. 2182 */ 2183 void dfs_set_update_nol_flag(struct wlan_dfs *dfs, 2184 bool val); 2185 2186 /** 2187 * dfs_get_update_nol_flag() - Returns update_nol flag. 2188 * @dfs: Pointer to wlan_dfs structure. 2189 */ 2190 bool dfs_get_update_nol_flag(struct wlan_dfs *dfs); 2191 2192 /** 2193 * dfs_get_use_nol() - Get usenol. 2194 * @dfs: Pointer to wlan_dfs structure. 2195 */ 2196 int dfs_get_use_nol(struct wlan_dfs *dfs); 2197 2198 /** 2199 * dfs_get_nol_timeout() - Get NOL timeout. 2200 * @dfs: Pointer to wlan_dfs structure. 2201 */ 2202 int dfs_get_nol_timeout(struct wlan_dfs *dfs); 2203 2204 /** 2205 * dfs_is_ap_cac_timer_running() - Returns the dfs cac timer. 2206 * @dfs: Pointer to wlan_dfs structure. 2207 */ 2208 int dfs_is_ap_cac_timer_running(struct wlan_dfs *dfs); 2209 2210 /** 2211 * dfs_control()- Used to process ioctls related to DFS. 2212 * @dfs: Pointer to wlan_dfs structure. 2213 * @id: Command type. 2214 * @indata: Input buffer. 2215 * @insize: size of the input buffer. 2216 * @outdata: A buffer for the results. 2217 * @outsize: Size of the output buffer. 2218 */ 2219 int dfs_control(struct wlan_dfs *dfs, 2220 u_int id, 2221 void *indata, 2222 uint32_t insize, 2223 void *outdata, 2224 uint32_t *outsize); 2225 2226 /** 2227 * dfs_getnol() - Wrapper function for dfs_get_nol() 2228 * @dfs: Pointer to wlan_dfs structure. 2229 * @dfs_nolinfo: Pointer to dfsreq_nolinfo structure. 2230 */ 2231 void dfs_getnol(struct wlan_dfs *dfs, 2232 void *dfs_nolinfo); 2233 2234 /** 2235 * dfs_get_override_cac_timeout() - Get override CAC timeout value. 2236 * @dfs: Pointer to DFS object. 2237 * @cac_timeout: Pointer to save the CAC timeout value. 2238 */ 2239 int dfs_get_override_cac_timeout(struct wlan_dfs *dfs, 2240 int *cac_timeout); 2241 2242 /** 2243 * dfs_override_cac_timeout() - Override the default CAC timeout. 2244 * @dfs: Pointer to DFS object. 2245 * @cac_timeout: CAC timeout value. 2246 */ 2247 int dfs_override_cac_timeout(struct wlan_dfs *dfs, 2248 int cac_timeout); 2249 2250 /** 2251 * dfs_clear_nolhistory() - unmarks WLAN_CHAN_CLR_HISTORY_RADAR flag for 2252 * all the channels in dfs_ch_channels. 2253 * @dfs: Pointer to wlan_dfs structure. 2254 */ 2255 #if !defined(QCA_MCL_DFS_SUPPORT) 2256 void dfs_clear_nolhistory(struct wlan_dfs *dfs); 2257 #else 2258 static inline void 2259 dfs_clear_nolhistory(struct wlan_dfs *dfs) 2260 { 2261 } 2262 #endif 2263 2264 /** 2265 * ol_if_dfs_configure() - Initialize the RADAR table for offload chipsets. 2266 * @dfs: Pointer to wlan_dfs structure. 2267 * 2268 * This is called during a channel change or regulatory domain 2269 * reset; in order to fetch the new configuration information and 2270 * program the DFS pattern matching module. 2271 * 2272 * Eventually this should be split into "fetch config" (which can 2273 * happen at regdomain selection time) and "configure DFS" (which 2274 * can happen at channel config time) so as to minimise overheads 2275 * when doing channel changes. However, this'll do for now. 2276 */ 2277 void ol_if_dfs_configure(struct wlan_dfs *dfs); 2278 2279 /** 2280 * dfs_init_radar_filters() - Init Radar filters. 2281 * @dfs: Pointer to wlan_dfs structure. 2282 * @radar_info: Pointer to wlan_dfs_radar_tab_info structure. 2283 */ 2284 int dfs_init_radar_filters(struct wlan_dfs *dfs, 2285 struct wlan_dfs_radar_tab_info *radar_info); 2286 2287 /** 2288 * dfs_print_filters() - Print the filters. 2289 * @dfs: Pointer to wlan_dfs structure. 2290 */ 2291 void dfs_print_filters(struct wlan_dfs *dfs); 2292 2293 /** 2294 * dfs_clear_stats() - Clear stats. 2295 * @dfs: Pointer to wlan_dfs structure. 2296 */ 2297 void dfs_clear_stats(struct wlan_dfs *dfs); 2298 2299 /** 2300 * dfs_radar_disable() - Disables the radar. 2301 * @dfs: Pointer to wlan_dfs structure. 2302 */ 2303 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2304 int dfs_radar_disable(struct wlan_dfs *dfs); 2305 #else 2306 static inline int dfs_radar_disable(struct wlan_dfs *dfs) 2307 { 2308 return 0; 2309 } 2310 #endif 2311 2312 /** 2313 * dfs_get_debug_info() - Get debug info. 2314 * @dfs: Pointer to wlan_dfs structure. 2315 * @data: void pointer to the data to save dfs_proc_phyerr. 2316 */ 2317 int dfs_get_debug_info(struct wlan_dfs *dfs, 2318 void *data); 2319 2320 /** 2321 * dfs_cac_timer_attach() - Initialize cac timers. 2322 * @dfs: Pointer to wlan_dfs structure. 2323 */ 2324 void dfs_cac_timer_attach(struct wlan_dfs *dfs); 2325 2326 /** 2327 * dfs_cac_timer_reset() - Cancel dfs cac timers. 2328 * @dfs: Pointer to wlan_dfs structure. 2329 */ 2330 void dfs_cac_timer_reset(struct wlan_dfs *dfs); 2331 2332 /** 2333 * dfs_cac_timer_detach() - Free dfs cac timers. 2334 * @dfs: Pointer to wlan_dfs structure. 2335 */ 2336 void dfs_cac_timer_detach(struct wlan_dfs *dfs); 2337 2338 /** 2339 * dfs_nol_timer_init() - Initialize NOL timers. 2340 * @dfs: Pointer to wlan_dfs structure. 2341 */ 2342 void dfs_nol_timer_init(struct wlan_dfs *dfs); 2343 2344 /** 2345 * dfs_nol_attach() - Initialize NOL variables. 2346 * @dfs: Pointer to wlan_dfs structure. 2347 */ 2348 void dfs_nol_attach(struct wlan_dfs *dfs); 2349 2350 /** 2351 * dfs_nol_detach() - Detach NOL variables. 2352 * @dfs: Pointer to wlan_dfs structure. 2353 */ 2354 void dfs_nol_detach(struct wlan_dfs *dfs); 2355 2356 /** 2357 * dfs_print_nolhistory() - Print NOL history. 2358 * @dfs: Pointer to wlan_dfs structure. 2359 */ 2360 void dfs_print_nolhistory(struct wlan_dfs *dfs); 2361 2362 /** 2363 * dfs_stacac_stop() - Clear the STA CAC timer. 2364 * @dfs: Pointer to wlan_dfs structure. 2365 */ 2366 void dfs_stacac_stop(struct wlan_dfs *dfs); 2367 2368 /** 2369 * dfs_find_precac_secondary_vht80_chan() - Get a VHT80 channel with the 2370 * precac primary center frequency. 2371 * @dfs: Pointer to wlan_dfs structure. 2372 * @chan: Pointer to dfs channel structure. 2373 */ 2374 void dfs_find_precac_secondary_vht80_chan(struct wlan_dfs *dfs, 2375 struct dfs_channel *chan); 2376 2377 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 2378 /** 2379 * dfs_precac_csa() - Automatically switch the channel to the DFS channel 2380 * on which PreCAC was completed without finding a RADAR. 2381 * Use CSA with TBTT_COUNT to switch the channel. 2382 * @dfs: Pointer to dfs handler. 2383 * 2384 * Return: Void 2385 */ 2386 void dfs_precac_csa(struct wlan_dfs *dfs); 2387 #endif 2388 2389 /** 2390 * dfs_phyerr_param_copy() - Function to copy src buf to dest buf. 2391 * @dst: dest buf. 2392 * @src: src buf. 2393 */ 2394 void dfs_phyerr_param_copy(struct wlan_dfs_phyerr_param *dst, 2395 struct wlan_dfs_phyerr_param *src); 2396 2397 /** 2398 * dfs_get_thresholds() - Get the threshold value. 2399 * @dfs: Pointer to wlan_dfs structure. 2400 * @param: Pointer to wlan_dfs_phyerr_param structure. 2401 */ 2402 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2403 int dfs_get_thresholds(struct wlan_dfs *dfs, 2404 struct wlan_dfs_phyerr_param *param); 2405 #else 2406 static inline int dfs_get_thresholds(struct wlan_dfs *dfs, 2407 struct wlan_dfs_phyerr_param *param) 2408 { 2409 return 0; 2410 } 2411 #endif 2412 2413 /** 2414 * dfs_set_thresholds() - Sets the threshold value. 2415 * @dfs: Pointer to wlan_dfs structure. 2416 * @threshtype: DFS ioctl param type. 2417 * @value: Threshold value. 2418 */ 2419 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2420 int dfs_set_thresholds(struct wlan_dfs *dfs, 2421 const uint32_t threshtype, 2422 const uint32_t value); 2423 #else 2424 static inline int dfs_set_thresholds(struct wlan_dfs *dfs, 2425 const uint32_t threshtype, 2426 const uint32_t value) 2427 { 2428 return 0; 2429 } 2430 #endif 2431 2432 /** 2433 * dfs_check_intersect_excl() - Check whether curfreq falls within lower_freq 2434 * and upper_freq, exclusively. 2435 * @low_freq : lower bound frequency value. 2436 * @high_freq: upper bound frequency value. 2437 * @chan_freq: Current frequency value to be checked. 2438 * 2439 * Return: returns true if overlap found, else returns false. 2440 */ 2441 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2442 bool dfs_check_intersect_excl(int low_freq, int high_freq, int chan_freq); 2443 #else 2444 static inline bool dfs_check_intersect_excl(int low_freq, int high_freq, 2445 int chan_freq) 2446 { 2447 return false; 2448 } 2449 #endif 2450 2451 /** 2452 * dfs_check_etsi_overlap() - Check whether given frequency centre/channel 2453 * width entry overlap with frequency spread in any way. 2454 * @center_freq : current channel centre frequency. 2455 * @chan_width : current channel width. 2456 * @en302_502_freq_low : overlap frequency lower bound. 2457 * @en302_502_freq_high : overlap frequency upper bound. 2458 * 2459 * Return: returns 1 if overlap found, else returns 0. 2460 */ 2461 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2462 int dfs_check_etsi_overlap(int center_freq, int chan_width, 2463 int en302_502_freq_low, int en302_502_freq_high); 2464 #else 2465 static inline int dfs_check_etsi_overlap(int center_freq, int chan_width, 2466 int en302_502_freq_low, 2467 int en302_502_freq_high) 2468 { 2469 return 0; 2470 } 2471 #endif 2472 2473 /** 2474 * dfs_is_en302_502_applicable() - Check whether current channel frequecy spread 2475 * overlaps with EN 302 502 radar type 2476 * frequency range. 2477 *@dfs: Pointer to wlan_dfs structure. 2478 * 2479 * Return: returns true if overlap found, else returns false. 2480 */ 2481 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) 2482 bool dfs_is_en302_502_applicable(struct wlan_dfs *dfs); 2483 #else 2484 static inline bool dfs_is_en302_502_applicable(struct wlan_dfs *dfs) 2485 { 2486 return false; 2487 } 2488 #endif 2489 2490 /** 2491 * dfs_set_current_channel() - Set DFS current channel. 2492 * @dfs: Pointer to wlan_dfs structure. 2493 * @dfs_ch_freq: Frequency in Mhz. 2494 * @dfs_ch_flags: Channel flags. 2495 * @dfs_ch_flagext: Extended channel flags. 2496 * @dfs_ch_ieee: IEEE channel number. 2497 * @dfs_ch_vhtop_ch_freq_seg1: Channel Center frequency1. 2498 * @dfs_ch_vhtop_ch_freq_seg2: Channel Center frequency2. 2499 */ 2500 #ifdef CONFIG_CHAN_NUM_API 2501 void dfs_set_current_channel(struct wlan_dfs *dfs, 2502 uint16_t dfs_ch_freq, 2503 uint64_t dfs_ch_flags, 2504 uint16_t dfs_ch_flagext, 2505 uint8_t dfs_ch_ieee, 2506 uint8_t dfs_ch_vhtop_ch_freq_seg1, 2507 uint8_t dfs_ch_vhtop_ch_freq_seg2); 2508 #endif 2509 2510 #ifdef CONFIG_CHAN_FREQ_API 2511 /** 2512 * dfs_set_current_channel_for_freq() - Set DFS current channel. 2513 * @dfs: Pointer to wlan_dfs structure. 2514 * @dfs_chan_freq: Frequency in Mhz. 2515 * @dfs_chan_flags: Channel flags. 2516 * @dfs_chan_flagext: Extended channel flags. 2517 * @dfs_chan_ieee: IEEE channel number. 2518 * @dfs_chan_vhtop_freq_seg1: Channel Center frequency1. 2519 * @dfs_chan_vhtop_freq_seg2: Channel Center frequency2. 2520 * @dfs_chan_mhz_freq_seg1: Channel center frequency of primary segment in MHZ. 2521 * @dfs_chan_mhz_freq_seg2: Channel center frequency of secondary segment in MHZ 2522 * applicable only for 80+80MHZ mode of operation. 2523 * @is_channel_updated: boolean to represent channel update. 2524 */ 2525 void dfs_set_current_channel_for_freq(struct wlan_dfs *dfs, 2526 uint16_t dfs_chan_freq, 2527 uint64_t dfs_chan_flags, 2528 uint16_t dfs_chan_flagext, 2529 uint8_t dfs_chan_ieee, 2530 uint8_t dfs_chan_vhtop_freq_seg1, 2531 uint8_t dfs_chan_vhtop_freq_seg2, 2532 uint16_t dfs_chan_mhz_freq_seg1, 2533 uint16_t dfs_chan_mhz_freq_seg2, 2534 bool *is_channel_updated); 2535 2536 #endif 2537 /** 2538 * dfs_get_nol_chfreq_and_chwidth() - Get channel freq and width from NOL list. 2539 * @dfs_nol: Pointer to NOL channel entry. 2540 * @nol_chfreq: Pointer to save channel frequency. 2541 * @nol_chwidth: Pointer to save channel width. 2542 * @index: Index to dfs_nol list. 2543 */ 2544 void dfs_get_nol_chfreq_and_chwidth(struct dfsreq_nolelem *dfs_nol, 2545 uint32_t *nol_chfreq, 2546 uint32_t *nol_chwidth, 2547 int index); 2548 2549 /** 2550 * dfs_process_phyerr_owl() - Process an Owl-style phy error. 2551 * @dfs: Pointer to wlan_dfs structure. 2552 * @buf: Phyerr buffer 2553 * @datalen: Phyerr buf len 2554 * @rssi: RSSI 2555 * @ext_rssi: Extension RSSI. 2556 * @rs_tstamp: Time stamp. 2557 * @fulltsf: TSF64. 2558 * @e: Pointer to dfs_phy_err structure. 2559 * 2560 * Return: Returns 1. 2561 */ 2562 int dfs_process_phyerr_owl(struct wlan_dfs *dfs, 2563 void *buf, 2564 uint16_t datalen, 2565 uint8_t rssi, 2566 uint8_t ext_rssi, 2567 uint32_t rs_tstamp, 2568 uint64_t fulltsf, 2569 struct dfs_phy_err *e); 2570 2571 /** 2572 * dfs_process_phyerr_sowl() -Process a Sowl/Howl style phy error. 2573 * @dfs: Pointer to wlan_dfs structure. 2574 * @buf: Phyerr buffer 2575 * @datalen: Phyerr buf len 2576 * @rssi: RSSI 2577 * @ext_rssi: Extension RSSI. 2578 * @rs_tstamp: Time stamp. 2579 * @fulltsf: TSF64. 2580 * @e: Pointer to dfs_phy_err structure. 2581 * 2582 * Return: Returns 1. 2583 */ 2584 int dfs_process_phyerr_sowl(struct wlan_dfs *dfs, 2585 void *buf, 2586 uint16_t datalen, 2587 uint8_t rssi, 2588 uint8_t ext_rssi, 2589 uint32_t rs_tstamp, 2590 uint64_t fulltsf, 2591 struct dfs_phy_err *e); 2592 2593 /** 2594 * dfs_process_phyerr_merlin() - Process a Merlin/Osprey style phy error. 2595 * dfs_phy_err struct. 2596 * @dfs: Pointer to wlan_dfs structure. 2597 * @buf: Phyerr buffer 2598 * @datalen: Phyerr buf len 2599 * @rssi: RSSI 2600 * @ext_rssi: Extension RSSI. 2601 * @rs_tstamp: Time stamp. 2602 * @fulltsf: TSF64. 2603 * @e: Pointer to dfs_phy_err structure. 2604 * 2605 * Return: Returns 1. 2606 */ 2607 int dfs_process_phyerr_merlin(struct wlan_dfs *dfs, 2608 void *buf, 2609 uint16_t datalen, 2610 uint8_t rssi, 2611 uint8_t ext_rssi, 2612 uint32_t rs_tstamp, 2613 uint64_t fulltsf, 2614 struct dfs_phy_err *e); 2615 2616 /* 2617 * __dfs_process_radarevent() - Continuation of process a radar event function. 2618 * @dfs: Pointer to wlan_dfs structure. 2619 * @ft: Pointer to dfs_filtertype structure. 2620 * @re: Pointer to dfs_event structure. 2621 * @this_ts: Timestamp. 2622 * 2623 * There is currently no way to specify that a radar event has occurred on 2624 * a specific channel, so the current methodology is to mark both the pri 2625 * and ext channels as being unavailable. This should be fixed for 802.11ac 2626 * or we'll quickly run out of valid channels to use. 2627 * 2628 * Return: If a radar event is found, return 1. Otherwise, return 0. 2629 */ 2630 void __dfs_process_radarevent(struct wlan_dfs *dfs, 2631 struct dfs_filtertype *ft, 2632 struct dfs_event *re, 2633 uint64_t this_ts, 2634 int *found, 2635 int *false_radar_found); 2636 2637 /** 2638 * dfs_radar_found_action() - Radar found action 2639 * @dfs: Pointer to wlan_dfs structure. 2640 * @bangradar: true if radar is due to bangradar command. 2641 * @seg_id: Segment id. 2642 */ 2643 void dfs_radar_found_action(struct wlan_dfs *dfs, 2644 bool bangradar, 2645 uint8_t seg_id); 2646 2647 /** 2648 * bin5_rules_check_internal() - This is a extension of dfs_bin5_check(). 2649 * @dfs: Pointer to wlan_dfs structure. 2650 * @br: Pointer to dfs_bin5radars structure. 2651 * @bursts: Bursts. 2652 * @numevents: Number of events. 2653 * @prev: prev index. 2654 * @i: Index. 2655 * @this: index to br_elems[] 2656 */ 2657 void bin5_rules_check_internal(struct wlan_dfs *dfs, 2658 struct dfs_bin5radars *br, 2659 uint32_t *bursts, 2660 uint32_t *numevents, 2661 uint32_t prev, 2662 uint32_t i, 2663 uint32_t this, 2664 int *index); 2665 2666 /** 2667 * dfs_main_task_testtimer_init() - Initialize dfs task testtimer. 2668 * @dfs: Pointer to wlan_dfs structure. 2669 */ 2670 void dfs_main_task_testtimer_init(struct wlan_dfs *dfs); 2671 2672 /** 2673 * dfs_stop() - Clear dfs timers. 2674 * @dfs: Pointer to wlan_dfs structure. 2675 */ 2676 void dfs_stop(struct wlan_dfs *dfs); 2677 2678 /** 2679 * dfs_update_cur_chan_flags() - Update DFS channel flag and flagext. 2680 * @dfs: Pointer to wlan_dfs structure. 2681 * @flags: New channel flags 2682 * @flagext: New Extended flags 2683 */ 2684 void dfs_update_cur_chan_flags(struct wlan_dfs *dfs, 2685 uint64_t flags, 2686 uint16_t flagext); 2687 2688 /** 2689 * wlan_psoc_get_dfs_txops() - Get dfs_tx_ops pointer 2690 * @psoc: Pointer to psoc structure. 2691 * 2692 * Return: Pointer to dfs_tx_ops. 2693 */ 2694 struct wlan_lmac_if_dfs_tx_ops * 2695 wlan_psoc_get_dfs_txops(struct wlan_objmgr_psoc *psoc); 2696 2697 /** 2698 * dfs_nol_free_list() - Free NOL elements. 2699 * @dfs: Pointer to wlan_dfs structure. 2700 */ 2701 void dfs_nol_free_list(struct wlan_dfs *dfs); 2702 2703 /** 2704 * dfs_second_segment_radar_disable() - Disables the second segment radar. 2705 * @dfs: Pointer to wlan_dfs structure. 2706 * 2707 * This is called when AP detects the radar, to (potentially) disable 2708 * the radar code. 2709 * 2710 * Return: returns 0. 2711 */ 2712 int dfs_second_segment_radar_disable(struct wlan_dfs *dfs); 2713 2714 /** 2715 * dfs_fetch_nol_ie_info() - Fill NOL information to be sent with RCSA. 2716 * @dfs - Pointer to wlan_dfs structure. 2717 * @nol_ie_bandwidth - Minimum subchannel bandwidth. 2718 * @nol_ie_startfreq - Radar affected channel list's first subchannel's 2719 * - centre frequency. 2720 * @nol_ie_bitmap - NOL bitmap denoting affected subchannels. 2721 */ 2722 #if defined(QCA_DFS_RCSA_SUPPORT) 2723 void dfs_fetch_nol_ie_info(struct wlan_dfs *dfs, uint8_t *nol_ie_bandwidth, 2724 uint16_t *nol_ie_startfreq, uint8_t *nol_ie_bitmap); 2725 #else 2726 static inline 2727 void dfs_fetch_nol_ie_info(struct wlan_dfs *dfs, uint8_t *nol_ie_bandwidth, 2728 uint16_t *nol_ie_startfreq, uint8_t *nol_ie_bitmap) 2729 { 2730 *nol_ie_bandwidth = 0; 2731 *nol_ie_startfreq = 0; 2732 *nol_ie_bitmap = 0; 2733 } 2734 #endif 2735 2736 /** 2737 * dfs_set_rcsa_flags() - Set flags that are required for sending RCSA and 2738 * NOL IE. 2739 * @dfs: Pointer to wlan_dfs structure. 2740 * @is_rcsa_ie_sent: Boolean to check if RCSA IE should be sent or not. 2741 * @is_nol_ie_sent: Boolean to check if NOL IE should be sent or not. 2742 */ 2743 #if defined(QCA_DFS_RCSA_SUPPORT) 2744 void dfs_set_rcsa_flags(struct wlan_dfs *dfs, bool is_rcsa_ie_sent, 2745 bool is_nol_ie_sent); 2746 #else 2747 static inline 2748 void dfs_set_rcsa_flags(struct wlan_dfs *dfs, bool is_rcsa_ie_sent, 2749 bool is_nol_ie_sent) 2750 { 2751 } 2752 #endif 2753 2754 /** 2755 * dfs_get_rcsa_flags() - Get flags that are required for sending RCSA and 2756 * NOL IE. 2757 * @dfs: Pointer to wlan_dfs structure. 2758 * @is_rcsa_ie_sent: Boolean to check if RCSA IE should be sent or not. 2759 * @is_nol_ie_sent: Boolean to check if NOL IE should be sent or not. 2760 */ 2761 #if defined(QCA_DFS_RCSA_SUPPORT) 2762 void dfs_get_rcsa_flags(struct wlan_dfs *dfs, bool *is_rcsa_ie_sent, 2763 bool *is_nol_ie_sent); 2764 #else 2765 static inline 2766 void dfs_get_rcsa_flags(struct wlan_dfs *dfs, bool *is_rcsa_ie_sent, 2767 bool *is_nol_ie_sent) 2768 { 2769 *is_rcsa_ie_sent = false; 2770 *is_nol_ie_sent = false; 2771 } 2772 #endif 2773 2774 /** 2775 * dfs_process_nol_ie_bitmap() - Update NOL with external radar information. 2776 * @dfs - Pointer to wlan_dfs structure. 2777 * @nol_ie_bandwidth - Minimum subchannel bandwidth. 2778 * @nol_ie_starfreq - Radar affected channel list's first subchannel's 2779 * - centre frequency. 2780 * @nol_ie_bitmap - Bitmap denoting radar affected subchannels. 2781 * 2782 * Return: True if NOL IE should be propagated, else false. 2783 */ 2784 #if defined(QCA_DFS_RCSA_SUPPORT) 2785 bool dfs_process_nol_ie_bitmap(struct wlan_dfs *dfs, uint8_t nol_ie_bandwidth, 2786 uint16_t nol_ie_startfreq, 2787 uint8_t nol_ie_bitmap); 2788 #else 2789 static inline 2790 bool dfs_process_nol_ie_bitmap(struct wlan_dfs *dfs, uint8_t nol_ie_bandwidth, 2791 uint16_t nol_ie_startfreq, 2792 uint8_t nol_ie_bitmap) 2793 { 2794 return false; 2795 } 2796 #endif 2797 2798 /** 2799 * dfs_is_cac_required() - Check if DFS CAC is required for the current channel. 2800 * @dfs: Pointer to wlan_dfs structure. 2801 * @cur_chan: Pointer to current channel of dfs_channel structure. 2802 * @prev_chan: Pointer to previous channel of dfs_channel structure. 2803 * @continue_current_cac: If AP can start CAC then this variable indicates 2804 * whether to continue with the current CAC or restart the CAC. This variable 2805 * is valid only if this function returns true. 2806 * 2807 * Return: true if AP requires CAC or can continue current CAC, else false. 2808 */ 2809 bool dfs_is_cac_required(struct wlan_dfs *dfs, 2810 struct dfs_channel *cur_chan, 2811 struct dfs_channel *prev_chan, 2812 bool *continue_current_cac); 2813 2814 /** 2815 * dfs_task_testtimer_reset() - stop dfs test timer. 2816 * @dfs: Pointer to wlan_dfs structure. 2817 */ 2818 void dfs_task_testtimer_reset(struct wlan_dfs *dfs); 2819 2820 /** 2821 * dfs_is_freq_in_nol() - check if given channel in nol list 2822 * @dfs: Pointer to wlan_dfs structure 2823 * @freq: channel frequency 2824 * 2825 * check if given channel in nol list. 2826 * 2827 * Return: true if channel in nol, false else 2828 */ 2829 bool dfs_is_freq_in_nol(struct wlan_dfs *dfs, uint32_t freq); 2830 2831 /** 2832 * dfs_task_testtimer_detach() - Free dfs test timer. 2833 * @dfs: Pointer to wlan_dfs structure. 2834 */ 2835 void dfs_task_testtimer_detach(struct wlan_dfs *dfs); 2836 2837 /** 2838 * dfs_timer_detach() - Free dfs timers. 2839 * @dfs: Pointer to wlan_dfs structure. 2840 */ 2841 void dfs_timer_detach(struct wlan_dfs *dfs); 2842 2843 /** 2844 * dfs_is_disable_radar_marking_set() - Check if radar marking is set on 2845 * NOL chan. 2846 * @dfs: Pointer to wlan_dfs structure. 2847 */ 2848 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) 2849 int dfs_is_disable_radar_marking_set(struct wlan_dfs *dfs, 2850 bool *disable_radar_marking); 2851 #else 2852 static inline int dfs_is_disable_radar_marking_set(struct wlan_dfs *dfs, 2853 bool *disable_radar_marking) 2854 { 2855 return QDF_STATUS_SUCCESS; 2856 } 2857 #endif 2858 /** 2859 * dfs_get_disable_radar_marking() - Get the value of disable radar marking. 2860 * @dfs: Pointer to wlan_dfs structure. 2861 */ 2862 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) 2863 bool dfs_get_disable_radar_marking(struct wlan_dfs *dfs); 2864 #endif 2865 2866 /** 2867 * dfs_reset_agile_config() - Reset the ADFS config variables. 2868 * @dfs: Pointer to dfs_soc_priv_obj. 2869 */ 2870 #ifdef QCA_SUPPORT_AGILE_DFS 2871 void dfs_reset_agile_config(struct dfs_soc_priv_obj *dfs_soc); 2872 #endif 2873 2874 /** 2875 * dfs_reinit_timers() - Reinit timers in DFS. 2876 * @dfs: Pointer to wlan_dfs. 2877 */ 2878 int dfs_reinit_timers(struct wlan_dfs *dfs); 2879 2880 /** 2881 * dfs_reset_dfs_prevchan() - Reset DFS previous channel structure. 2882 * @dfs: Pointer to wlan_dfs object. 2883 * 2884 * Return: None. 2885 */ 2886 void dfs_reset_dfs_prevchan(struct wlan_dfs *dfs); 2887 2888 /** 2889 * dfs_init_tmp_psoc_nol() - Init temporary psoc NOL structure. 2890 * @dfs: Pointer to wlan_dfs object. 2891 * @num_radios: Num of radios in the PSOC. 2892 * 2893 * Return: void. 2894 */ 2895 void dfs_init_tmp_psoc_nol(struct wlan_dfs *dfs, uint8_t num_radios); 2896 2897 /** 2898 * dfs_deinit_tmp_psoc_nol() - De-init temporary psoc NOL structure. 2899 * @dfs: Pointer to wlan_dfs object. 2900 * 2901 * Return: void. 2902 */ 2903 void dfs_deinit_tmp_psoc_nol(struct wlan_dfs *dfs); 2904 2905 /** 2906 * dfs_save_dfs_nol_in_psoc() - Save NOL data of given pdev. 2907 * @dfs: Pointer to wlan_dfs object. 2908 * @pdev_id: The pdev ID which will have the NOL data. 2909 * 2910 * Based on the frequency of the NOL channel, copy it to the target pdev_id 2911 * structure in psoc. 2912 * 2913 * Return: void. 2914 */ 2915 void dfs_save_dfs_nol_in_psoc(struct wlan_dfs *dfs, uint8_t pdev_id); 2916 2917 /** 2918 * dfs_reinit_nol_from_psoc_copy() - Reinit saved NOL data to corresponding 2919 * DFS object. 2920 * @dfs: Pointer to wlan_dfs object. 2921 * @pdev_id: pdev_id of the given dfs object. 2922 * @low_5ghz_freq: The low 5GHz frequency value of the target pdev id. 2923 * @high_5ghz_freq: The high 5GHz frequency value of the target pdev id. 2924 * 2925 * Return: void. 2926 */ 2927 void dfs_reinit_nol_from_psoc_copy(struct wlan_dfs *dfs, 2928 uint8_t pdev_id, 2929 uint16_t low_5ghz_freq, 2930 uint16_t high_5ghz_freq); 2931 2932 /** 2933 * dfs_is_hw_mode_switch_in_progress() - Check if HW mode switch in progress. 2934 * @dfs: Pointer to wlan_dfs object. 2935 * 2936 * Return: True if mode switch is in progress, else false. 2937 */ 2938 bool dfs_is_hw_mode_switch_in_progress(struct wlan_dfs *dfs); 2939 2940 /** 2941 * dfs_start_mode_switch_defer_timer() - start mode switch defer timer. 2942 * @dfs: Pointer to wlan_dfs object. 2943 * 2944 * Return: void. 2945 */ 2946 void dfs_start_mode_switch_defer_timer(struct wlan_dfs *dfs); 2947 2948 /** 2949 * dfs_complete_deferred_tasks() - Process mode switch completion event and 2950 * handle deffered tasks. 2951 * @dfs: Pointer to wlan_dfs object. 2952 * 2953 * Return: void. 2954 */ 2955 void dfs_complete_deferred_tasks(struct wlan_dfs *dfs); 2956 2957 /** 2958 * dfs_process_cac_completion() - Process DFS CAC completion event. 2959 * @dfs: Pointer to wlan_dfs object. 2960 * 2961 * Return: void. 2962 */ 2963 void dfs_process_cac_completion(struct wlan_dfs *dfs); 2964 2965 #ifdef WLAN_DFS_TRUE_160MHZ_SUPPORT 2966 /** 2967 * dfs_is_true_160mhz_supported() - Find if true 160MHz is supported. 2968 * @dfs: Pointer to wlan_dfs object. 2969 * 2970 * Return: True if true 160MHz is supported, else false. 2971 */ 2972 bool dfs_is_true_160mhz_supported(struct wlan_dfs *dfs); 2973 2974 /** 2975 * dfs_is_restricted_80p80mhz_supported() - Find if restricted 80p80mhz is 2976 * supported. 2977 * @dfs: Pointer to wlan_dfs object. 2978 * 2979 * Return: True if restricted 160MHz is supported, else false. 2980 */ 2981 bool dfs_is_restricted_80p80mhz_supported(struct wlan_dfs *dfs); 2982 #else 2983 static inline bool dfs_is_true_160mhz_supported(struct wlan_dfs *dfs) 2984 { 2985 return false; 2986 } 2987 2988 static inline bool dfs_is_restricted_80p80mhz_supported(struct wlan_dfs *dfs) 2989 { 2990 return false; 2991 } 2992 #endif /* WLAN_DFS_TRUE_160MHZ_SUPPORT */ 2993 2994 /** 2995 * dfs_get_agile_detector_id() - Find the Agile detector ID for given DFS. 2996 * @dfs: Pointer to wlan_dfs object. 2997 * 2998 * Return: Agile detector value (uint8_t). 2999 */ 3000 #ifdef QCA_SUPPORT_AGILE_DFS 3001 uint8_t dfs_get_agile_detector_id(struct wlan_dfs *dfs); 3002 #else 3003 static inline uint8_t dfs_get_agile_detector_id(struct wlan_dfs *dfs) 3004 { 3005 return INVALID_DETECTOR_ID; 3006 } 3007 #endif 3008 3009 /** 3010 * dfs_is_new_chan_subset_of_old_chan() - Find if new channel is subset of 3011 * old channel. 3012 * @dfs: Pointer to wlan_dfs structure. 3013 * @new_chan: Pointer to new channel of dfs_channel structure. 3014 * @old_chan: Pointer to old channel of dfs_channel structure. 3015 * 3016 * Return: True if new channel is subset of old channel, else false. 3017 */ 3018 bool dfs_is_new_chan_subset_of_old_chan(struct wlan_dfs *dfs, 3019 struct dfs_channel *new_chan, 3020 struct dfs_channel *old_chan); 3021 3022 /** 3023 * dfs_find_dfs_sub_channels_for_freq() - Given a dfs channel, find its 3024 * HT20 subset channels. 3025 * @dfs: Pointer to wlan_dfs structure. 3026 * @chan: Pointer to dfs_channel structure. 3027 * @subchan_arr: Pointer to subchannels array. 3028 * 3029 * Return: Number of sub channels. 3030 */ 3031 uint8_t dfs_find_dfs_sub_channels_for_freq(struct wlan_dfs *dfs, 3032 struct dfs_channel *chan, 3033 uint16_t *subchan_arr); 3034 3035 #ifdef QCA_SUPPORT_DFS_CHAN_POSTNOL 3036 /** 3037 * dfs_set_postnol_freq() - DFS API to set postNOL frequency. 3038 * @dfs: Pointer to wlan_dfs object. 3039 * @postnol_freq: PostNOL frequency value configured by the user. 3040 */ 3041 void dfs_set_postnol_freq(struct wlan_dfs *dfs, qdf_freq_t postnol_freq); 3042 3043 /** 3044 * dfs_set_postnol_mode() - DFS API to set postNOL mode. 3045 * @dfs: Pointer to wlan_dfs object. 3046 * @postnol_mode: PostNOL frequency value configured by the user. 3047 */ 3048 void dfs_set_postnol_mode(struct wlan_dfs *dfs, uint8_t postnol_mode); 3049 3050 /** 3051 * dfs_set_postnol_cfreq2() - DFS API to set postNOL secondary center frequency. 3052 * @dfs: Pointer to wlan_dfs object. 3053 * @postnol_cfreq2: PostNOL secondary center frequency value configured by the 3054 * user. 3055 */ 3056 void dfs_set_postnol_cfreq2(struct wlan_dfs *dfs, qdf_freq_t postnol_cfreq2); 3057 3058 /** 3059 * dfs_get_postnol_freq() - DFS API to get postNOL frequency. 3060 * @dfs: Pointer to wlan_dfs object. 3061 * @postnol_freq: PostNOL frequency value configured by the user. 3062 */ 3063 void dfs_get_postnol_freq(struct wlan_dfs *dfs, qdf_freq_t *postnol_freq); 3064 3065 /** 3066 * dfs_get_postnol_mode() - DFS API to get postNOL mode. 3067 * @dfs: Pointer to wlan_dfs object. 3068 * @postnol_mode: PostNOL frequency value configured by the user. 3069 */ 3070 void dfs_get_postnol_mode(struct wlan_dfs *dfs, uint8_t *postnol_mode); 3071 3072 /** 3073 * dfs_get_postnol_cfreq2() - DFS API to get postNOL secondary center frequency. 3074 * @dfs: Pointer to wlan_dfs object. 3075 * @postnol_cfreq2: PostNOL secondary center frequency value configured by the 3076 * user. 3077 */ 3078 void dfs_get_postnol_cfreq2(struct wlan_dfs *dfs, qdf_freq_t *postnol_cfreq2); 3079 #else 3080 static inline void 3081 dfs_set_postnol_freq(struct wlan_dfs *dfs, qdf_freq_t postnol_freq) 3082 { 3083 } 3084 3085 static inline void 3086 dfs_set_postnol_mode(struct wlan_dfs *dfs, uint8_t postnol_mode) 3087 { 3088 } 3089 3090 static inline void 3091 dfs_set_postnol_cfreq2(struct wlan_dfs *dfs, qdf_freq_t postnol_cfreq2) 3092 { 3093 } 3094 3095 static inline void 3096 dfs_get_postnol_freq(struct wlan_dfs *dfs, qdf_freq_t *postnol_freq) 3097 { 3098 *postnol_freq = 0; 3099 } 3100 3101 static inline void 3102 dfs_get_postnol_mode(struct wlan_dfs *dfs, uint8_t *postnol_mode) 3103 { 3104 *postnol_mode = CH_WIDTH_INVALID; 3105 } 3106 3107 static inline void 3108 dfs_get_postnol_cfreq2(struct wlan_dfs *dfs, qdf_freq_t *postnol_cfreq2) 3109 { 3110 *postnol_cfreq2 = 0; 3111 } 3112 3113 #endif /* QCA_SUPPORT_DFS_CHAN_POSTNOL */ 3114 3115 #endif /* _DFS_H_ */ 3116