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