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