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