xref: /wlan-driver/qca-wifi-host-cmn/umac/dfs/dispatcher/inc/wlan_dfs_utils_api.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 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  *
5*5113495bSYour Name  *
6*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
7*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
8*5113495bSYour Name  * above copyright notice and this permission notice appear in all
9*5113495bSYour Name  * copies.
10*5113495bSYour Name  *
11*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
12*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
15*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
16*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
17*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
18*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
19*5113495bSYour Name  */
20*5113495bSYour Name 
21*5113495bSYour Name /**
22*5113495bSYour Name  * DOC: This file has the DFS dispatcher API which is exposed to outside of DFS
23*5113495bSYour Name  * component.
24*5113495bSYour Name  */
25*5113495bSYour Name 
26*5113495bSYour Name #ifndef _WLAN_DFS_UTILS_API_H_
27*5113495bSYour Name #define _WLAN_DFS_UTILS_API_H_
28*5113495bSYour Name 
29*5113495bSYour Name #include "wlan_dfs_ucfg_api.h"
30*5113495bSYour Name #include "wlan_reg_services_api.h"
31*5113495bSYour Name #include <wlan_objmgr_vdev_obj.h>
32*5113495bSYour Name 
33*5113495bSYour Name /* Add channel to nol */
34*5113495bSYour Name #define DFS_NOL_SET                  1
35*5113495bSYour Name 
36*5113495bSYour Name /* Remove channel from nol */
37*5113495bSYour Name #define DFS_NOL_RESET                0
38*5113495bSYour Name 
39*5113495bSYour Name /* Mark nol-history flag for the channel */
40*5113495bSYour Name #define DFS_NOL_HISTORY_SET 1
41*5113495bSYour Name 
42*5113495bSYour Name /* Clear nol-history flag from the channel */
43*5113495bSYour Name #define DFS_NOL_HISTORY_RESET 0
44*5113495bSYour Name 
45*5113495bSYour Name /* Max nol channels */
46*5113495bSYour Name #define DFS_MAX_NOL_CHANNEL         80
47*5113495bSYour Name 
48*5113495bSYour Name /* WLAN 2.4GHz start freq */
49*5113495bSYour Name #define DFS_24_GHZ_BASE_FREQ     (2407)
50*5113495bSYour Name 
51*5113495bSYour Name /* WLAN 5GHz start freq */
52*5113495bSYour Name #define DFS_5_GHZ_BASE_FREQ      (5000)
53*5113495bSYour Name 
54*5113495bSYour Name /* WLAN 2.4 GHz channel number 6 */
55*5113495bSYour Name #define DFS_24_GHZ_CHANNEL_6        (6)
56*5113495bSYour Name 
57*5113495bSYour Name /* WLAN 2.4 GHz channel number 14 */
58*5113495bSYour Name #define DFS_24_GHZ_CHANNEL_14      (14)
59*5113495bSYour Name 
60*5113495bSYour Name /* WLAN 2.4 GHz channel number 15 */
61*5113495bSYour Name #define DFS_24_GHZ_CHANNEL_15      (15)
62*5113495bSYour Name 
63*5113495bSYour Name /* WLAN 2.4 GHz channel number 27 */
64*5113495bSYour Name #define DFS_24_GHZ_CHANNEL_27      (27)
65*5113495bSYour Name 
66*5113495bSYour Name /* WLAN 5GHz channel number 170 */
67*5113495bSYour Name #define DFS_5_GHZ_CHANNEL_170     (170)
68*5113495bSYour Name 
69*5113495bSYour Name /* WLAN 5MHz channel spacing */
70*5113495bSYour Name #define DFS_CHAN_SPACING_5MHZ       (5)
71*5113495bSYour Name 
72*5113495bSYour Name /* WLAN 20Hz channel spacing */
73*5113495bSYour Name #define DFS_CHAN_SPACING_20MHZ     (20)
74*5113495bSYour Name 
75*5113495bSYour Name /* WLAN 2.4GHz channel number 14 freq */
76*5113495bSYour Name #define DFS_CHAN_14_FREQ         (2484)
77*5113495bSYour Name 
78*5113495bSYour Name /* WLAN 2.4GHz channel number 15 freq */
79*5113495bSYour Name #define DFS_CHAN_15_FREQ         (2512)
80*5113495bSYour Name 
81*5113495bSYour Name /* WLAN 5GHz channel number 170 freq */
82*5113495bSYour Name #define DFS_CHAN_170_FREQ        (5852)
83*5113495bSYour Name 
84*5113495bSYour Name #define IS_CHAN_DFS(_flags) ((_flags) & REGULATORY_CHAN_RADAR)
85*5113495bSYour Name 
86*5113495bSYour Name extern struct dfs_to_mlme global_dfs_to_mlme;
87*5113495bSYour Name 
88*5113495bSYour Name /**
89*5113495bSYour Name  * utils_dfs_cac_valid_reset_for_freq() - Cancels the dfs_cac_valid_timer timer.
90*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
91*5113495bSYour Name  * @prevchan_freq: Prevchan frequency.
92*5113495bSYour Name  * @prevchan_flags: Prevchan flags.
93*5113495bSYour Name  *
94*5113495bSYour Name  * Wrapper function for dfs_cac_valid_reset_for_freq(). This function called
95*5113495bSYour Name  * from outside of DFS component.
96*5113495bSYour Name  */
97*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
98*5113495bSYour Name QDF_STATUS utils_dfs_cac_valid_reset_for_freq(struct wlan_objmgr_pdev *pdev,
99*5113495bSYour Name 					      uint16_t prevchan_freq,
100*5113495bSYour Name 					      uint32_t prevchan_flags);
101*5113495bSYour Name #endif
102*5113495bSYour Name 
103*5113495bSYour Name /**
104*5113495bSYour Name  * utils_dfs_reset() - Reset DFS members.
105*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
106*5113495bSYour Name  */
107*5113495bSYour Name QDF_STATUS utils_dfs_reset(struct wlan_objmgr_pdev *pdev);
108*5113495bSYour Name 
109*5113495bSYour Name /**
110*5113495bSYour Name  * utils_dfs_is_freq_in_nol() -  check if given channel in nol list
111*5113495bSYour Name  * @pdev: Pointer to DFS pdev object
112*5113495bSYour Name  * @freq: channel frequency
113*5113495bSYour Name  *
114*5113495bSYour Name  * check if given channel in nol list.
115*5113495bSYour Name  *
116*5113495bSYour Name  * Return: true if channel in nol, false else
117*5113495bSYour Name  */
118*5113495bSYour Name bool utils_dfs_is_freq_in_nol(struct wlan_objmgr_pdev *pdev, uint32_t freq);
119*5113495bSYour Name 
120*5113495bSYour Name /**
121*5113495bSYour Name  * utils_dfs_reset_precaclists() - Clears and initializes precac_list.
122*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
123*5113495bSYour Name  *
124*5113495bSYour Name  * Wrapper function for dfs_reset_precaclists(). This function called from
125*5113495bSYour Name  * outside of DFS component.
126*5113495bSYour Name  */
127*5113495bSYour Name QDF_STATUS utils_dfs_reset_precaclists(struct wlan_objmgr_pdev *pdev);
128*5113495bSYour Name 
129*5113495bSYour Name /**
130*5113495bSYour Name  * utils_dfs_unmark_precac_nol_for_freq() - Clears precac channel marked as NOL.
131*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
132*5113495bSYour Name  * @chan_freq: channel freq to be unmarked as NOL.
133*5113495bSYour Name  *
134*5113495bSYour Name  * Return void.
135*5113495bSYour Name  */
136*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
137*5113495bSYour Name void utils_dfs_unmark_precac_nol_for_freq(struct wlan_objmgr_pdev *pdev,
138*5113495bSYour Name 					  uint16_t chan_freq);
139*5113495bSYour Name #endif
140*5113495bSYour Name 
141*5113495bSYour Name /**
142*5113495bSYour Name  * utils_dfs_cancel_precac_timer() - Cancel the precac timer.
143*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
144*5113495bSYour Name  *
145*5113495bSYour Name  * wrapper function for dfs_cancel_precac_timer(). this function called from
146*5113495bSYour Name  * outside of dfs component.
147*5113495bSYour Name  */
148*5113495bSYour Name QDF_STATUS utils_dfs_cancel_precac_timer(struct wlan_objmgr_pdev *pdev);
149*5113495bSYour Name 
150*5113495bSYour Name /**
151*5113495bSYour Name  * utils_dfs_start_precac_timer() - Start the precac timer.
152*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
153*5113495bSYour Name  *
154*5113495bSYour Name  * Wrapper function for dfs_start_precac_timer(). This function called from
155*5113495bSYour Name  * outside of dfs component.
156*5113495bSYour Name  *
157*5113495bSYour Name  * Return:
158*5113495bSYour Name  * * QDF_STATUS_E_FAILURE: Failed to start timer.
159*5113495bSYour Name  * * QDF_STATUS_SUCCESS: Timer started successfully.
160*5113495bSYour Name  */
161*5113495bSYour Name QDF_STATUS utils_dfs_start_precac_timer(struct wlan_objmgr_pdev *pdev);
162*5113495bSYour Name 
163*5113495bSYour Name #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
164*5113495bSYour Name /**
165*5113495bSYour Name  * utils_dfs_precac_decide_pref_chan_for_freq() - Choose preferred channel
166*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
167*5113495bSYour Name  * @ch_freq: Pointer to channel frequency.
168*5113495bSYour Name  * @mode: Configured PHY mode.
169*5113495bSYour Name  *
170*5113495bSYour Name  * Wrapper function for dfs_decide_precac_preferred_chan_for_freq(). This
171*5113495bSYour Name  * function called from outside of dfs component.
172*5113495bSYour Name  *
173*5113495bSYour Name  * Return: True if intermediate channel needs to configure. False otherwise.
174*5113495bSYour Name  */
175*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
176*5113495bSYour Name bool
177*5113495bSYour Name utils_dfs_precac_decide_pref_chan_for_freq(struct wlan_objmgr_pdev *pdev,
178*5113495bSYour Name 					   uint16_t *ch_freq,
179*5113495bSYour Name 					   enum wlan_phymode mode);
180*5113495bSYour Name #endif
181*5113495bSYour Name #endif
182*5113495bSYour Name 
183*5113495bSYour Name /**
184*5113495bSYour Name  * utils_dfs_cancel_cac_timer() - Cancels the CAC timer.
185*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
186*5113495bSYour Name  *
187*5113495bSYour Name  * wrapper function for dfs_cancel_cac_timer(). this
188*5113495bSYour Name  * function called from outside of dfs component.
189*5113495bSYour Name  */
190*5113495bSYour Name QDF_STATUS utils_dfs_cancel_cac_timer(struct wlan_objmgr_pdev *pdev);
191*5113495bSYour Name 
192*5113495bSYour Name /**
193*5113495bSYour Name  * utils_dfs_start_cac_timer() - Starts the CAC timer.
194*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
195*5113495bSYour Name  *
196*5113495bSYour Name  * wrapper function for dfs_start_cac_timer(). this
197*5113495bSYour Name  * function called from outside of dfs component.
198*5113495bSYour Name  */
199*5113495bSYour Name QDF_STATUS utils_dfs_start_cac_timer(struct wlan_objmgr_pdev *pdev);
200*5113495bSYour Name 
201*5113495bSYour Name /**
202*5113495bSYour Name  * utils_dfs_cac_stop() - Clear the AP CAC timer.
203*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
204*5113495bSYour Name  *
205*5113495bSYour Name  * wrapper function for dfs_cac_stop(). this
206*5113495bSYour Name  * function called from outside of dfs component.
207*5113495bSYour Name  */
208*5113495bSYour Name QDF_STATUS utils_dfs_cac_stop(struct wlan_objmgr_pdev *pdev);
209*5113495bSYour Name 
210*5113495bSYour Name /**
211*5113495bSYour Name  * utils_dfs_stacac_stop() - Clear the STA CAC timer.
212*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
213*5113495bSYour Name  *
214*5113495bSYour Name  * wrapper function for dfs_stacac_stop(). this
215*5113495bSYour Name  * function called from outside of dfs component.
216*5113495bSYour Name  */
217*5113495bSYour Name QDF_STATUS utils_dfs_stacac_stop(struct wlan_objmgr_pdev *pdev);
218*5113495bSYour Name 
219*5113495bSYour Name /**
220*5113495bSYour Name  * utils_dfs_get_usenol() - Returns use_nol flag.
221*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
222*5113495bSYour Name  * @usenol: Pointer to usenol value.
223*5113495bSYour Name  *
224*5113495bSYour Name  * wrapper function for dfs_get_usenol(). this
225*5113495bSYour Name  * function called from outside of dfs component.
226*5113495bSYour Name  */
227*5113495bSYour Name QDF_STATUS utils_dfs_get_usenol(struct wlan_objmgr_pdev *pdev,
228*5113495bSYour Name 		uint16_t *usenol);
229*5113495bSYour Name 
230*5113495bSYour Name /**
231*5113495bSYour Name  * utils_dfs_is_spruce_spur_war_applicable() - Is Spruce spur WAR applicable
232*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
233*5113495bSYour Name  *
234*5113495bSYour Name  * Spur or leakage transmissions is observed in Spruce HW in
235*5113495bSYour Name  * frequencies from 5260MHz to 5320MHz when one of the following
236*5113495bSYour Name  * conditions is true,
237*5113495bSYour Name  * i) The AP is transmitting in 52/56/60/64 in 80MHz mode and then the  AP
238*5113495bSYour Name  * moves to the adjacent channel 36/44/48 in 80MHz mode and starts
239*5113495bSYour Name  * transmitting.
240*5113495bSYour Name  * ii) The AP is transmitting in 36/44/48/52/56/60/64 in 160MHz mode and then
241*5113495bSYour Name  * the  AP moves to the adjacent channel 36/44/48 in 80MHz mode and starts
242*5113495bSYour Name  * transmitting.
243*5113495bSYour Name  *
244*5113495bSYour Name  * Hence, the spruce spur WAR becomes applicable when,
245*5113495bSYour Name  * a) the target is Spruce,
246*5113495bSYour Name  * b) the primary channel is 52/56/60/64, and the home channel width is 80MHz.
247*5113495bSYour Name  * c) or, the primary channel is 36/44/48/52/56/60/64 and the home channel width
248*5113495bSYour Name  *    is 160MHz.
249*5113495bSYour Name  *
250*5113495bSYour Name  * When the conditions (a) and (b) or (c) is true, random channel selection
251*5113495bSYour Name  * should make sure to prevent moving to the adjacent channels 36/44/48 in
252*5113495bSYour Name  * 80MHz mode. Failing to do so will cause spur transmissions in channel 52
253*5113495bSYour Name  * through 64.
254*5113495bSYour Name  *
255*5113495bSYour Name  * Return: true if Spruce spur WAR is applicable else false.
256*5113495bSYour Name  */
257*5113495bSYour Name bool utils_dfs_is_spruce_spur_war_applicable(struct wlan_objmgr_pdev *pdev);
258*5113495bSYour Name 
259*5113495bSYour Name /**
260*5113495bSYour Name  * utils_dfs_radar_disable() - Disables the radar.
261*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
262*5113495bSYour Name  *
263*5113495bSYour Name  * wrapper function for  dfs_radar_disable(). this
264*5113495bSYour Name  * function called from outside of dfs component.
265*5113495bSYour Name  */
266*5113495bSYour Name QDF_STATUS utils_dfs_radar_disable(struct wlan_objmgr_pdev *pdev);
267*5113495bSYour Name 
268*5113495bSYour Name /**
269*5113495bSYour Name  * utils_dfs_set_update_nol_flag() - Sets update_nol flag.
270*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
271*5113495bSYour Name  * @val: update_nol flag.
272*5113495bSYour Name  *
273*5113495bSYour Name  * wrapper function for dfs_set_update_nol_flag(). this
274*5113495bSYour Name  * function called from outside of dfs component.
275*5113495bSYour Name  */
276*5113495bSYour Name QDF_STATUS utils_dfs_set_update_nol_flag(struct wlan_objmgr_pdev *pdev,
277*5113495bSYour Name 		bool val);
278*5113495bSYour Name 
279*5113495bSYour Name /**
280*5113495bSYour Name  * utils_dfs_get_update_nol_flag() - Returns update_nol flag.
281*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
282*5113495bSYour Name  * @nol_flag: Fill nol_flag in this variable.
283*5113495bSYour Name  *
284*5113495bSYour Name  * wrapper function for dfs_get_update_nol_flag(). this
285*5113495bSYour Name  * function called from outside of dfs component.
286*5113495bSYour Name  */
287*5113495bSYour Name QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev,
288*5113495bSYour Name 		bool *nol_flag);
289*5113495bSYour Name 
290*5113495bSYour Name /**
291*5113495bSYour Name  * utils_dfs_get_dfs_use_nol() - Get usenol.
292*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
293*5113495bSYour Name  * @dfs_use_nol: Pointer to dfs_use_nol.
294*5113495bSYour Name  *
295*5113495bSYour Name  * wrapper function for dfs_get_dfs_use_nol(). this
296*5113495bSYour Name  * function called from outside of dfs component.
297*5113495bSYour Name  */
298*5113495bSYour Name QDF_STATUS utils_dfs_get_dfs_use_nol(struct wlan_objmgr_pdev *pdev,
299*5113495bSYour Name 		int *dfs_use_nol);
300*5113495bSYour Name 
301*5113495bSYour Name /**
302*5113495bSYour Name  * utils_dfs_get_nol_timeout() - Get NOL timeout.
303*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
304*5113495bSYour Name  * @dfs_nol_timeout: Pointer to dfs_nol_timeout.
305*5113495bSYour Name  *
306*5113495bSYour Name  * wrapper function for dfs_get_nol_timeout(). this
307*5113495bSYour Name  * function called from outside of dfs component.
308*5113495bSYour Name  */
309*5113495bSYour Name QDF_STATUS utils_dfs_get_nol_timeout(struct wlan_objmgr_pdev *pdev,
310*5113495bSYour Name 		int *dfs_nol_timeout);
311*5113495bSYour Name 
312*5113495bSYour Name /**
313*5113495bSYour Name  * utils_dfs_nol_addchan() - Add channel to NOL.
314*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
315*5113495bSYour Name  * @freq: channel frequency to add to NOL.
316*5113495bSYour Name  * @dfs_nol_timeout: NOL timeout.
317*5113495bSYour Name  *
318*5113495bSYour Name  * wrapper function for dfs_nol_addchan(). this
319*5113495bSYour Name  * function called from outside of dfs component.
320*5113495bSYour Name  */
321*5113495bSYour Name QDF_STATUS utils_dfs_nol_addchan(struct wlan_objmgr_pdev *pdev,
322*5113495bSYour Name 		uint16_t freq,
323*5113495bSYour Name 		uint32_t dfs_nol_timeout);
324*5113495bSYour Name 
325*5113495bSYour Name /**
326*5113495bSYour Name  * utils_dfs_nol_update() - NOL update
327*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
328*5113495bSYour Name  *
329*5113495bSYour Name  * wrapper function for dfs_nol_update(). this
330*5113495bSYour Name  * function called from outside of dfs component.
331*5113495bSYour Name  */
332*5113495bSYour Name QDF_STATUS utils_dfs_nol_update(struct wlan_objmgr_pdev *pdev);
333*5113495bSYour Name 
334*5113495bSYour Name /**
335*5113495bSYour Name  * utils_dfs_second_segment_radar_disable() - Disables the second segment radar.
336*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
337*5113495bSYour Name  *
338*5113495bSYour Name  * This is called when AP detects the radar, to (potentially) disable
339*5113495bSYour Name  * the radar code.
340*5113495bSYour Name  */
341*5113495bSYour Name QDF_STATUS utils_dfs_second_segment_radar_disable(
342*5113495bSYour Name 		struct wlan_objmgr_pdev *pdev);
343*5113495bSYour Name 
344*5113495bSYour Name /**
345*5113495bSYour Name  * utils_dfs_fetch_nol_ie_info() - Fills the arguments with NOL information
346*5113495bSYour Name  * needed for sending RCSA.
347*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
348*5113495bSYour Name  * @nol_ie_bandwidth: Minimum DFS subchannel Bandwidth.
349*5113495bSYour Name  * @nol_ie_startfreq: Radar affected channel list start subchannel's centre
350*5113495bSYour Name  * frequency.
351*5113495bSYour Name  * @nol_ie_bitmap: Bitmap of radar affected subchannels.
352*5113495bSYour Name  */
353*5113495bSYour Name QDF_STATUS utils_dfs_fetch_nol_ie_info(struct wlan_objmgr_pdev *pdev,
354*5113495bSYour Name 				       uint8_t *nol_ie_bandwidth,
355*5113495bSYour Name 				       uint16_t *nol_ie_startfreq,
356*5113495bSYour Name 				       uint8_t *nol_ie_bitmap);
357*5113495bSYour Name 
358*5113495bSYour Name /**
359*5113495bSYour Name  * utils_dfs_set_rcsa_flags() - Set flags that are required for sending
360*5113495bSYour Name  * RCSA and NOL IE.
361*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
362*5113495bSYour Name  * @is_rcsa_ie_sent: Boolean to check if RCSA IE should be sent or not.
363*5113495bSYour Name  * @is_nol_ie_sent: Boolean to check if NOL IE should be sent or not.
364*5113495bSYour Name  */
365*5113495bSYour Name 
366*5113495bSYour Name QDF_STATUS utils_dfs_set_rcsa_flags(struct wlan_objmgr_pdev *pdev,
367*5113495bSYour Name 				    bool is_rcsa_ie_sent,
368*5113495bSYour Name 				    bool is_nol_ie_sent);
369*5113495bSYour Name 
370*5113495bSYour Name /**
371*5113495bSYour Name  * utils_dfs_get_rcsa_flags() - Get flags that are required for sending
372*5113495bSYour Name  * RCSA and NOL IE.
373*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
374*5113495bSYour Name  * @is_rcsa_ie_sent: Boolean to check if RCSA IE should be sent or not.
375*5113495bSYour Name  * @is_nol_ie_sent: Boolean to check if NOL IE should be sent or not.
376*5113495bSYour Name  */
377*5113495bSYour Name 
378*5113495bSYour Name QDF_STATUS utils_dfs_get_rcsa_flags(struct wlan_objmgr_pdev *pdev,
379*5113495bSYour Name 				    bool *is_rcsa_ie_sent,
380*5113495bSYour Name 				    bool *is_nol_ie_sent);
381*5113495bSYour Name 
382*5113495bSYour Name /**
383*5113495bSYour Name  * utils_dfs_process_nol_ie_bitmap() - Update NOL with external radar
384*5113495bSYour Name  * information.
385*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
386*5113495bSYour Name  * @nol_ie_bandwidth: Minimum DFS subchannel Bandwidth.
387*5113495bSYour Name  * @nol_ie_startfreq: Radar affected channel list start channel's
388*5113495bSYour Name  * centre frequency.
389*5113495bSYour Name  * @nol_ie_bitmap: Bitmap of radar affected subchannels.
390*5113495bSYour Name  *
391*5113495bSYour Name  * Return: True if NOL IE should be propagated, else false.
392*5113495bSYour Name  */
393*5113495bSYour Name bool utils_dfs_process_nol_ie_bitmap(struct wlan_objmgr_pdev *pdev,
394*5113495bSYour Name 				     uint8_t nol_ie_bandwidth,
395*5113495bSYour Name 				     uint16_t nol_ie_startfreq,
396*5113495bSYour Name 				     uint8_t nol_ie_bitmap);
397*5113495bSYour Name 
398*5113495bSYour Name /**
399*5113495bSYour Name  * utils_dfs_bw_reduce() - Set bw reduce.
400*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
401*5113495bSYour Name  * @bw_reduce: Fill bw_reduce value in this variable.
402*5113495bSYour Name  *
403*5113495bSYour Name  * Return: QDF_STATUS
404*5113495bSYour Name  */
405*5113495bSYour Name QDF_STATUS utils_dfs_bw_reduce(struct wlan_objmgr_pdev *pdev,
406*5113495bSYour Name 				bool bw_reduce);
407*5113495bSYour Name 
408*5113495bSYour Name /**
409*5113495bSYour Name  * utils_dfs_is_bw_reduce() - Get bw reduce.
410*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
411*5113495bSYour Name  * @bw_reduce: Pointer to get bw_reduce value.
412*5113495bSYour Name  *
413*5113495bSYour Name  * Return: QDF_STATUS
414*5113495bSYour Name  */
415*5113495bSYour Name QDF_STATUS utils_dfs_is_bw_reduce(struct wlan_objmgr_pdev *pdev,
416*5113495bSYour Name 				  bool *bw_reduce);
417*5113495bSYour Name /**
418*5113495bSYour Name  * utils_dfs_set_cac_timer_running() - Sets the cac timer running.
419*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
420*5113495bSYour Name  * @val: Set this value to dfs_cac_timer_running variable.
421*5113495bSYour Name  */
422*5113495bSYour Name QDF_STATUS utils_dfs_set_cac_timer_running(struct wlan_objmgr_pdev *pdev,
423*5113495bSYour Name 		int val);
424*5113495bSYour Name 
425*5113495bSYour Name /**
426*5113495bSYour Name  * utils_dfs_get_nol_chfreq_and_chwidth() - Sets the cac timer running.
427*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
428*5113495bSYour Name  * @nollist: Pointer to NOL channel entry.
429*5113495bSYour Name  * @nol_chfreq: Pointer to save channel frequency.
430*5113495bSYour Name  * @nol_chwidth: Pointer to save channel width.
431*5113495bSYour Name  * @index: Index into nol list.
432*5113495bSYour Name  */
433*5113495bSYour Name QDF_STATUS utils_dfs_get_nol_chfreq_and_chwidth(struct wlan_objmgr_pdev *pdev,
434*5113495bSYour Name 		void *nollist,
435*5113495bSYour Name 		uint32_t *nol_chfreq,
436*5113495bSYour Name 		uint32_t *nol_chwidth,
437*5113495bSYour Name 		int index);
438*5113495bSYour Name 
439*5113495bSYour Name /**
440*5113495bSYour Name  * utils_dfs_get_random_channel_for_freq() - Get random channel.
441*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
442*5113495bSYour Name  * @flags: random channel selection flags.
443*5113495bSYour Name  * @ch_params: current channel params.
444*5113495bSYour Name  * @hw_mode: current operating mode.
445*5113495bSYour Name  * @target_chan: Pointer to target_chan freq.
446*5113495bSYour Name  * @acs_info: acs range info.
447*5113495bSYour Name  *
448*5113495bSYour Name  * wrapper function for get_random_chan(). this
449*5113495bSYour Name  * function called from outside of dfs component.
450*5113495bSYour Name  *
451*5113495bSYour Name  * Return: QDF_STATUS
452*5113495bSYour Name  */
453*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
454*5113495bSYour Name QDF_STATUS
455*5113495bSYour Name utils_dfs_get_random_channel_for_freq(struct wlan_objmgr_pdev *pdev,
456*5113495bSYour Name 				      uint16_t flags,
457*5113495bSYour Name 				      struct ch_params *ch_params,
458*5113495bSYour Name 				      uint32_t *hw_mode, uint16_t *target_chan,
459*5113495bSYour Name 				      struct dfs_acs_info *acs_info);
460*5113495bSYour Name #endif
461*5113495bSYour Name 
462*5113495bSYour Name /**
463*5113495bSYour Name  * utils_dfs_get_vdev_random_channel_for_freq() - Get random channel for vdev
464*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
465*5113495bSYour Name  * @vdev: vdev of the request
466*5113495bSYour Name  * @flags: random channel selection flags.
467*5113495bSYour Name  * @ch_params: current channel params.
468*5113495bSYour Name  * @hw_mode: current operating mode.
469*5113495bSYour Name  * @target_chan_freq: Pointer to target_chan_freq.
470*5113495bSYour Name  * @acs_info: acs range info.
471*5113495bSYour Name  *
472*5113495bSYour Name  * Get random channel based on vdev interface type. If the vdev is null,
473*5113495bSYour Name  * the function will get random channel by SAP interface type.
474*5113495bSYour Name  *
475*5113495bSYour Name  * Return: QDF_STATUS
476*5113495bSYour Name  */
477*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
478*5113495bSYour Name QDF_STATUS utils_dfs_get_vdev_random_channel_for_freq(
479*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_vdev *vdev,
480*5113495bSYour Name 	uint16_t flags, struct ch_params *ch_params, uint32_t *hw_mode,
481*5113495bSYour Name 	uint16_t *target_chan_freq, struct dfs_acs_info *acs_info);
482*5113495bSYour Name #endif
483*5113495bSYour Name 
484*5113495bSYour Name /**
485*5113495bSYour Name  * utils_dfs_bw_reduced_channel_for_freq() - Get BW reduced channel.
486*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
487*5113495bSYour Name  * @ch_params: current channel params.
488*5113495bSYour Name  * @hw_mode: current operating mode.
489*5113495bSYour Name  * @target_chan_freq: Pointer to target_chan freq.
490*5113495bSYour Name  *
491*5113495bSYour Name  * wrapper function for get bw_reduced_channel. this
492*5113495bSYour Name  * function called from outside of dfs component.
493*5113495bSYour Name  *
494*5113495bSYour Name  * Return: QDF_STATUS
495*5113495bSYour Name  */
496*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
497*5113495bSYour Name QDF_STATUS utils_dfs_bw_reduced_channel_for_freq(struct wlan_objmgr_pdev *pdev,
498*5113495bSYour Name 						 struct ch_params *ch_params,
499*5113495bSYour Name 						 uint32_t *hw_mode,
500*5113495bSYour Name 						 uint16_t *target_chan_freq);
501*5113495bSYour Name #endif
502*5113495bSYour Name 
503*5113495bSYour Name /**
504*5113495bSYour Name  * utils_dfs_init_nol() - Initialize nol from platform driver.
505*5113495bSYour Name  * @pdev: pdev handler.
506*5113495bSYour Name  *
507*5113495bSYour Name  * Initialize nol from platform driver.
508*5113495bSYour Name  *
509*5113495bSYour Name  * Return: None
510*5113495bSYour Name  */
511*5113495bSYour Name #ifdef QCA_DFS_NOL_PLATFORM_DRV_SUPPORT
512*5113495bSYour Name void utils_dfs_init_nol(struct wlan_objmgr_pdev *pdev);
513*5113495bSYour Name #else
utils_dfs_init_nol(struct wlan_objmgr_pdev * pdev)514*5113495bSYour Name static inline void utils_dfs_init_nol(struct wlan_objmgr_pdev *pdev)
515*5113495bSYour Name {
516*5113495bSYour Name }
517*5113495bSYour Name #endif
518*5113495bSYour Name /**
519*5113495bSYour Name  * utils_dfs_save_nol() - save nol list to platform driver.
520*5113495bSYour Name  * @pdev: pdev handler.
521*5113495bSYour Name  *
522*5113495bSYour Name  * Save nol list to platform driver.
523*5113495bSYour Name  *
524*5113495bSYour Name  * Return: None
525*5113495bSYour Name  */
526*5113495bSYour Name void utils_dfs_save_nol(struct wlan_objmgr_pdev *pdev);
527*5113495bSYour Name 
528*5113495bSYour Name /**
529*5113495bSYour Name  * utils_dfs_print_nol_channels() - log nol channels.
530*5113495bSYour Name  * @pdev: pdev handler.
531*5113495bSYour Name  *
532*5113495bSYour Name  * log nol channels.
533*5113495bSYour Name  *
534*5113495bSYour Name  * Return: None
535*5113495bSYour Name  */
536*5113495bSYour Name #ifdef DFS_COMPONENT_ENABLE
537*5113495bSYour Name void utils_dfs_print_nol_channels(struct wlan_objmgr_pdev *pdev);
538*5113495bSYour Name #else
utils_dfs_print_nol_channels(struct wlan_objmgr_pdev * pdev)539*5113495bSYour Name static inline void utils_dfs_print_nol_channels(struct wlan_objmgr_pdev *pdev)
540*5113495bSYour Name {
541*5113495bSYour Name }
542*5113495bSYour Name #endif
543*5113495bSYour Name 
544*5113495bSYour Name /**
545*5113495bSYour Name  * utils_dfs_clear_nol_channels() - clear nol list.
546*5113495bSYour Name  * @pdev: pdev handler.
547*5113495bSYour Name  *
548*5113495bSYour Name  * log nol channels.
549*5113495bSYour Name  *
550*5113495bSYour Name  * Return: None
551*5113495bSYour Name  */
552*5113495bSYour Name void utils_dfs_clear_nol_channels(struct wlan_objmgr_pdev *pdev);
553*5113495bSYour Name 
554*5113495bSYour Name /**
555*5113495bSYour Name  * utils_is_dfs_chan_for_freq() - is channel dfs.
556*5113495bSYour Name  * @pdev: pdev handler.
557*5113495bSYour Name  * @chan_freq: Channel frequency in MHZ.
558*5113495bSYour Name  *
559*5113495bSYour Name  * is channel dfs.
560*5113495bSYour Name  *
561*5113495bSYour Name  * Return: True if channel dfs, else false.
562*5113495bSYour Name  */
563*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_is_dfs_chan_for_freq(struct wlan_objmgr_pdev * pdev,uint32_t chan_freq)564*5113495bSYour Name static inline bool utils_is_dfs_chan_for_freq(struct wlan_objmgr_pdev *pdev,
565*5113495bSYour Name 					      uint32_t chan_freq)
566*5113495bSYour Name {
567*5113495bSYour Name 	return wlan_reg_is_dfs_for_freq(pdev, chan_freq);
568*5113495bSYour Name }
569*5113495bSYour Name #endif
570*5113495bSYour Name 
571*5113495bSYour Name /**
572*5113495bSYour Name  * utils_is_dfs_cfreq2_ch() - is channel dfs cfreq2.
573*5113495bSYour Name  * @pdev: pdev handler.
574*5113495bSYour Name  *
575*5113495bSYour Name  * is channel dfs.
576*5113495bSYour Name  *
577*5113495bSYour Name  * Return: True if channel dfs cfreq2, else false.
578*5113495bSYour Name  */
579*5113495bSYour Name bool utils_is_dfs_cfreq2_ch(struct wlan_objmgr_pdev *pdev);
580*5113495bSYour Name 
581*5113495bSYour Name /**
582*5113495bSYour Name  * utils_dfs_reg_update_nol_chan_for_freq() - set nol channel
583*5113495bSYour Name  *
584*5113495bSYour Name  * @pdev: pdev ptr
585*5113495bSYour Name  * @ch_list: freq channel list to be returned
586*5113495bSYour Name  * @num_ch: number of channels
587*5113495bSYour Name  * @nol_ch: nol flag
588*5113495bSYour Name  *
589*5113495bSYour Name  * Return: void
590*5113495bSYour Name  */
591*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
592*5113495bSYour Name void utils_dfs_reg_update_nol_chan_for_freq(struct wlan_objmgr_pdev *pdev,
593*5113495bSYour Name 					    uint16_t *ch_list,
594*5113495bSYour Name 					    uint8_t num_ch,
595*5113495bSYour Name 					    bool nol_ch);
596*5113495bSYour Name #endif
597*5113495bSYour Name /**
598*5113495bSYour Name  * utils_dfs_freq_to_chan() - convert channel freq to channel number
599*5113495bSYour Name  * @freq: frequency
600*5113495bSYour Name  *
601*5113495bSYour Name  * Return: channel number
602*5113495bSYour Name  */
603*5113495bSYour Name uint8_t utils_dfs_freq_to_chan(uint32_t freq);
604*5113495bSYour Name 
605*5113495bSYour Name /**
606*5113495bSYour Name  * utils_dfs_chan_to_freq() - convert channel number to frequency
607*5113495bSYour Name  * @chan: channel number
608*5113495bSYour Name  *
609*5113495bSYour Name  * Return: frequency
610*5113495bSYour Name  */
611*5113495bSYour Name #ifdef DFS_COMPONENT_ENABLE
612*5113495bSYour Name uint32_t utils_dfs_chan_to_freq(uint8_t chan);
613*5113495bSYour Name #else
utils_dfs_chan_to_freq(uint8_t chan)614*5113495bSYour Name static inline uint32_t utils_dfs_chan_to_freq(uint8_t chan)
615*5113495bSYour Name {
616*5113495bSYour Name 	return 0;
617*5113495bSYour Name }
618*5113495bSYour Name #endif
619*5113495bSYour Name /**
620*5113495bSYour Name  * utils_dfs_update_cur_chan_flags() - Update DFS channel flag and flagext.
621*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
622*5113495bSYour Name  * @flags: New channel flags
623*5113495bSYour Name  * @flagext: New Extended flags
624*5113495bSYour Name  *
625*5113495bSYour Name  * Return: QDF_STATUS
626*5113495bSYour Name  */
627*5113495bSYour Name QDF_STATUS utils_dfs_update_cur_chan_flags(struct wlan_objmgr_pdev *pdev,
628*5113495bSYour Name 		uint64_t flags,
629*5113495bSYour Name 		uint16_t flagext);
630*5113495bSYour Name 
631*5113495bSYour Name #ifdef MOBILE_DFS_SUPPORT
632*5113495bSYour Name /**
633*5113495bSYour Name  * utils_dfs_mark_leaking_chan_for_freq() - to mark channel leaking in to nol
634*5113495bSYour Name  * @pdev: Pointer to pdev structure.
635*5113495bSYour Name  * @ch_width: channel width
636*5113495bSYour Name  * @temp_ch_lst_sz: the target channel list
637*5113495bSYour Name  * @temp_ch_lst: the target frequency list
638*5113495bSYour Name  *
639*5113495bSYour Name  * This function removes the channels from temp channel list that
640*5113495bSYour Name  * (if selected as target channel) will cause leakage in one of
641*5113495bSYour Name  * the NOL channels
642*5113495bSYour Name  *
643*5113495bSYour Name  * Return: QDF_STATUS
644*5113495bSYour Name  */
645*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
646*5113495bSYour Name QDF_STATUS utils_dfs_mark_leaking_chan_for_freq(struct wlan_objmgr_pdev *pdev,
647*5113495bSYour Name 						enum phy_ch_width ch_width,
648*5113495bSYour Name 						uint8_t temp_ch_lst_sz,
649*5113495bSYour Name 						uint16_t *temp_ch_lst);
650*5113495bSYour Name #endif
651*5113495bSYour Name 
652*5113495bSYour Name /**
653*5113495bSYour Name  * utils_dfs_can_ignore_radar_event() - check whether to skip radar event
654*5113495bSYour Name  * processing
655*5113495bSYour Name  * @pdev: Pointer to pdev structure.
656*5113495bSYour Name  *
657*5113495bSYour Name  * This function will check with policy mgr to process radar event or not based
658*5113495bSYour Name  * on current concurrency mode and dfs policy.
659*5113495bSYour Name  *
660*5113495bSYour Name  * Return: true - ignore radar event processing, otherwise false.
661*5113495bSYour Name  */
662*5113495bSYour Name bool utils_dfs_can_ignore_radar_event(struct wlan_objmgr_pdev *pdev);
663*5113495bSYour Name #else
664*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_dfs_mark_leaking_chan_for_freq(struct wlan_objmgr_pdev * pdev,enum phy_ch_width ch_width,uint8_t temp_ch_lst_sz,uint16_t * temp_ch_lst)665*5113495bSYour Name static inline QDF_STATUS utils_dfs_mark_leaking_chan_for_freq
666*5113495bSYour Name 	(struct wlan_objmgr_pdev *pdev,
667*5113495bSYour Name 	enum phy_ch_width ch_width,
668*5113495bSYour Name 	uint8_t temp_ch_lst_sz,
669*5113495bSYour Name 	uint16_t *temp_ch_lst)
670*5113495bSYour Name {
671*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
672*5113495bSYour Name }
673*5113495bSYour Name #endif
674*5113495bSYour Name static inline bool
utils_dfs_can_ignore_radar_event(struct wlan_objmgr_pdev * pdev)675*5113495bSYour Name utils_dfs_can_ignore_radar_event(struct wlan_objmgr_pdev *pdev)
676*5113495bSYour Name {
677*5113495bSYour Name 	return false;
678*5113495bSYour Name }
679*5113495bSYour Name #endif
680*5113495bSYour Name /**
681*5113495bSYour Name  * utils_get_dfsdomain() - Get DFS domain.
682*5113495bSYour Name  * @pdev: Pointer to PDEV structure.
683*5113495bSYour Name  *
684*5113495bSYour Name  * Return: DFS domain.
685*5113495bSYour Name  */
686*5113495bSYour Name int utils_get_dfsdomain(struct wlan_objmgr_pdev *pdev);
687*5113495bSYour Name 
688*5113495bSYour Name #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
689*5113495bSYour Name /**
690*5113495bSYour Name  * utils_dfs_is_spoof_check_failed() - get spoof check status.
691*5113495bSYour Name  * @pdev: pdev ptr
692*5113495bSYour Name  * @is_spoof_check_failed: pointer containing the status.
693*5113495bSYour Name  *
694*5113495bSYour Name  * Return: QDF_STATUS.
695*5113495bSYour Name  */
696*5113495bSYour Name QDF_STATUS utils_dfs_is_spoof_check_failed(struct wlan_objmgr_pdev *pdev,
697*5113495bSYour Name 					   bool *is_spoof_check_failed);
698*5113495bSYour Name 
699*5113495bSYour Name /**
700*5113495bSYour Name  * utils_dfs_is_spoof_done() - get spoof check status.
701*5113495bSYour Name  * @pdev: pdev ptr
702*5113495bSYour Name  *
703*5113495bSYour Name  * Return: True if dfs_spoof_test_done is set.
704*5113495bSYour Name  */
705*5113495bSYour Name bool utils_dfs_is_spoof_done(struct wlan_objmgr_pdev *pdev);
706*5113495bSYour Name #else
707*5113495bSYour Name static inline
utils_dfs_is_spoof_check_failed(struct wlan_objmgr_pdev * pdev,bool * is_spoof_check_failed)708*5113495bSYour Name QDF_STATUS utils_dfs_is_spoof_check_failed(struct wlan_objmgr_pdev *pdev,
709*5113495bSYour Name 					   bool *is_spoof_check_failed)
710*5113495bSYour Name {
711*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
712*5113495bSYour Name }
713*5113495bSYour Name 
714*5113495bSYour Name static inline
utils_dfs_is_spoof_done(struct wlan_objmgr_pdev * pdev)715*5113495bSYour Name bool utils_dfs_is_spoof_done(struct wlan_objmgr_pdev *pdev)
716*5113495bSYour Name {
717*5113495bSYour Name 	return true;
718*5113495bSYour Name }
719*5113495bSYour Name #endif
720*5113495bSYour Name 
721*5113495bSYour Name /**
722*5113495bSYour Name  * dfs_get_num_chans() - Get the number of channels supported by the regulatory.
723*5113495bSYour Name  *
724*5113495bSYour Name  * Return: Number of supported channels.
725*5113495bSYour Name  */
726*5113495bSYour Name int dfs_get_num_chans(void);
727*5113495bSYour Name 
728*5113495bSYour Name /**
729*5113495bSYour Name  * utils_dfs_get_chan_list() - Get channel list from regdb.
730*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
731*5113495bSYour Name  * @clist: Pointer to current channel list
732*5113495bSYour Name  * @num_chan: number of channels in the current channel list.
733*5113495bSYour Name  */
734*5113495bSYour Name void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
735*5113495bSYour Name 			     void *clist,
736*5113495bSYour Name 			     uint32_t *num_chan);
737*5113495bSYour Name 
738*5113495bSYour Name /**
739*5113495bSYour Name  * utils_dfs_get_nol_history_chan_list() - Get nol_history channels from regdb
740*5113495bSYour Name  * component.
741*5113495bSYour Name  * @pdev: Pointer to pdev structure.
742*5113495bSYour Name  * @clist: Pointer to channel list.
743*5113495bSYour Name  * @num_chan: number of channels.
744*5113495bSYour Name  */
745*5113495bSYour Name void utils_dfs_get_nol_history_chan_list(struct wlan_objmgr_pdev *pdev,
746*5113495bSYour Name 					 void *clist, uint32_t *num_chan);
747*5113495bSYour Name 
748*5113495bSYour Name /**
749*5113495bSYour Name  * utils_dfs_reg_update_nol_history_chan_for_freq() - set nol history channel
750*5113495bSYour Name  *
751*5113495bSYour Name  * @pdev: pdev ptr
752*5113495bSYour Name  * @freq_list: freq channel list to be returned
753*5113495bSYour Name  * @num_chan: number of channels
754*5113495bSYour Name  * @nol_history_chan: nol history flag
755*5113495bSYour Name  *
756*5113495bSYour Name  * Return: void
757*5113495bSYour Name  */
758*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
759*5113495bSYour Name void
760*5113495bSYour Name utils_dfs_reg_update_nol_history_chan_for_freq(struct wlan_objmgr_pdev *pdev,
761*5113495bSYour Name 					       uint16_t *freq_list,
762*5113495bSYour Name 					       uint8_t num_chan,
763*5113495bSYour Name 					       bool nol_history_chan);
764*5113495bSYour Name #endif
765*5113495bSYour Name 
766*5113495bSYour Name /**
767*5113495bSYour Name  * utils_dfs_is_cac_required() - Check if CAC is required on the cur_chan.
768*5113495bSYour Name  * @pdev: pdev ptr
769*5113495bSYour Name  * @cur_chan: Pointer to current channel of wlan_channel structure.
770*5113495bSYour Name  * @prev_chan: Pointer to previous channel of wlan_channel structure.
771*5113495bSYour Name  * @continue_current_cac: If AP can start CAC then this variable indicates
772*5113495bSYour Name  * whether to continue with the current CAC or restart the CAC. This variable
773*5113495bSYour Name  * is valid only if this function returns true.
774*5113495bSYour Name  *
775*5113495bSYour Name  * Return: true if AP requires CAC or can continue current CAC, else false.
776*5113495bSYour Name  */
777*5113495bSYour Name bool utils_dfs_is_cac_required(struct wlan_objmgr_pdev *pdev,
778*5113495bSYour Name 			       struct wlan_channel *cur_chan,
779*5113495bSYour Name 			       struct wlan_channel *prev_chan,
780*5113495bSYour Name 			       bool *continue_current_cac);
781*5113495bSYour Name 
782*5113495bSYour Name /**
783*5113495bSYour Name  * utils_dfs_is_cac_required_on_dfs_curchan() - Check if CAC is required on the
784*5113495bSYour Name  * dfs_curchan.
785*5113495bSYour Name  * @pdev: pdev ptr
786*5113495bSYour Name  * @continue_current_cac: If AP can start CAC then this variable indicates
787*5113495bSYour Name  * whether to continue with the current CAC or restart the CAC. This variable
788*5113495bSYour Name  * is valid only if this function returns true.
789*5113495bSYour Name  * @is_vap_restart: Flag to indicate if vap is restarted/started.
790*5113495bSYour Name  * True: VAP restart. False: VAP start
791*5113495bSYour Name  *
792*5113495bSYour Name  * This API checks if the dfs_curchan is a subset of the dfs_prevchan.
793*5113495bSYour Name  * dfs_curchan and dfs_prevchan are updated after start response by
794*5113495bSYour Name  * dfs_set_current_channel().
795*5113495bSYour Name  *
796*5113495bSYour Name  * Return: true if AP requires CAC or can continue current CAC, else false.
797*5113495bSYour Name  */
798*5113495bSYour Name bool
799*5113495bSYour Name utils_dfs_is_cac_required_on_dfs_curchan(struct wlan_objmgr_pdev *pdev,
800*5113495bSYour Name 					 bool *continue_current_cac,
801*5113495bSYour Name 					 bool is_vap_restart);
802*5113495bSYour Name 
803*5113495bSYour Name /**
804*5113495bSYour Name  * utils_dfs_is_precac_done() - Check if precac has been done in chosen channel
805*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
806*5113495bSYour Name  * @wlan_chan: Pointer to wlan channel object that can be accessed by other
807*5113495bSYour Name  * components.
808*5113495bSYour Name  * Wrapper function for dfs_is_precac_done(). This API is called from outside
809*5113495bSYour Name  * the dfs component.
810*5113495bSYour Name  *
811*5113495bSYour Name  * Return:
812*5113495bSYour Name  * * True :If precac is done on channel.
813*5113495bSYour Name  * * False:If precac is not done on channel.
814*5113495bSYour Name  */
815*5113495bSYour Name bool utils_dfs_is_precac_done(struct wlan_objmgr_pdev *pdev,
816*5113495bSYour Name 			      struct wlan_channel *wlan_chan);
817*5113495bSYour Name /**
818*5113495bSYour Name  * utils_dfs_get_disable_radar_marking() - Retrieve the value of disable radar.
819*5113495bSYour Name  * marking.
820*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
821*5113495bSYour Name  * @disable_radar_marking: pointer to retrieve the value of
822*5113495bSYour Name  *                         disable_radar_marking.
823*5113495bSYour Name  */
824*5113495bSYour Name #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
825*5113495bSYour Name QDF_STATUS utils_dfs_get_disable_radar_marking(struct wlan_objmgr_pdev *pdev,
826*5113495bSYour Name 					       bool *disable_radar_marking);
827*5113495bSYour Name #else
828*5113495bSYour Name static inline
utils_dfs_get_disable_radar_marking(struct wlan_objmgr_pdev * pdev,bool * disable_radar_marking)829*5113495bSYour Name QDF_STATUS utils_dfs_get_disable_radar_marking(struct wlan_objmgr_pdev *pdev,
830*5113495bSYour Name 					       bool *disable_radar_marking)
831*5113495bSYour Name {
832*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
833*5113495bSYour Name }
834*5113495bSYour Name #endif
835*5113495bSYour Name 
836*5113495bSYour Name /**
837*5113495bSYour Name  * utils_dfs_deliver_event() - Deliver DFS event to userspace.
838*5113495bSYour Name  * @pdev: Pointer to DFS pdev object
839*5113495bSYour Name  * @freq: frequency radar hit on
840*5113495bSYour Name  * @event: event being sent
841*5113495bSYour Name  */
842*5113495bSYour Name void utils_dfs_deliver_event(struct wlan_objmgr_pdev *pdev, uint16_t freq,
843*5113495bSYour Name 			     enum WLAN_DFS_EVENTS event);
844*5113495bSYour Name 
845*5113495bSYour Name /**
846*5113495bSYour Name  * utils_dfs_reset_dfs_prevchan() - Reset DFS previous channel structure.
847*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
848*5113495bSYour Name  *
849*5113495bSYour Name  * Return: None.
850*5113495bSYour Name  */
851*5113495bSYour Name void utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev *pdev);
852*5113495bSYour Name 
853*5113495bSYour Name #ifdef QCA_SUPPORT_AGILE_DFS
854*5113495bSYour Name /**
855*5113495bSYour Name  * utils_dfs_agile_sm_deliver_evt() - API to post events to DFS Agile SM.
856*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
857*5113495bSYour Name  * @event: Event to be posted to DFS AGILE SM.
858*5113495bSYour Name  *
859*5113495bSYour Name  * Return: None.
860*5113495bSYour Name  */
861*5113495bSYour Name void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
862*5113495bSYour Name 				    enum dfs_agile_sm_evt event);
863*5113495bSYour Name #else
864*5113495bSYour Name static inline
utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev * pdev,enum dfs_agile_sm_evt event)865*5113495bSYour Name void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
866*5113495bSYour Name 				    enum dfs_agile_sm_evt event)
867*5113495bSYour Name {
868*5113495bSYour Name }
869*5113495bSYour Name #endif/*QCA_SUPPORT_AGILE_DFS*/
870*5113495bSYour Name 
871*5113495bSYour Name #ifdef QCA_SUPPORT_ADFS_RCAC
872*5113495bSYour Name /**
873*5113495bSYour Name  * utils_dfs_get_rcac_channel() - Get the completed Rolling CAC channel if
874*5113495bSYour Name  *                                available.
875*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
876*5113495bSYour Name  * @chan_params: current channel params.
877*5113495bSYour Name  * @target_chan_freq: Pointer to target_chan freq.
878*5113495bSYour Name  *
879*5113495bSYour Name  * Return: QDF_STATUS.
880*5113495bSYour Name  */
881*5113495bSYour Name QDF_STATUS utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev *pdev,
882*5113495bSYour Name 				      struct ch_params *chan_params,
883*5113495bSYour Name 				      qdf_freq_t *target_chan_freq);
884*5113495bSYour Name #else
885*5113495bSYour Name static inline
utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev * pdev,struct ch_params * chan_params,qdf_freq_t * target_chan_freq)886*5113495bSYour Name QDF_STATUS utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev *pdev,
887*5113495bSYour Name 				      struct ch_params *chan_params,
888*5113495bSYour Name 				      qdf_freq_t *target_chan_freq)
889*5113495bSYour Name {
890*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
891*5113495bSYour Name }
892*5113495bSYour Name #endif /* QCA_SUPPORT_ADFS_RCAC */
893*5113495bSYour Name 
894*5113495bSYour Name #ifdef ATH_SUPPORT_ZERO_CAC_DFS
895*5113495bSYour Name /**
896*5113495bSYour Name  * utils_dfs_precac_status_for_channel() - API to find the preCAC status
897*5113495bSYour Name  * of the given channel.
898*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
899*5113495bSYour Name  * @deschan: Pointer to desired channel of wlan_channel structure.
900*5113495bSYour Name  */
901*5113495bSYour Name enum precac_status_for_chan
902*5113495bSYour Name utils_dfs_precac_status_for_channel(struct wlan_objmgr_pdev *pdev,
903*5113495bSYour Name 				    struct wlan_channel *deschan);
904*5113495bSYour Name #else
905*5113495bSYour Name static inline enum precac_status_for_chan
utils_dfs_precac_status_for_channel(struct wlan_objmgr_pdev * pdev,struct wlan_channel * deschan)906*5113495bSYour Name utils_dfs_precac_status_for_channel(struct wlan_objmgr_pdev *pdev,
907*5113495bSYour Name 				    struct wlan_channel *deschan)
908*5113495bSYour Name {
909*5113495bSYour Name 	return DFS_INVALID_PRECAC_STATUS;
910*5113495bSYour Name }
911*5113495bSYour Name #endif
912*5113495bSYour Name 
913*5113495bSYour Name #if defined(WLAN_DISP_CHAN_INFO)
914*5113495bSYour Name /**
915*5113495bSYour Name  * utils_dfs_get_chan_dfs_state() - Get the channel state array of the channels
916*5113495bSYour Name  * in a radio.
917*5113495bSYour Name  * @pdev: Pointer to the pdev.
918*5113495bSYour Name  * @dfs_ch_s: Output channel state array of the dfs channels in the radio.
919*5113495bSYour Name  *
920*5113495bSYour Name  * Return: QDF_STATUS.
921*5113495bSYour Name  */
922*5113495bSYour Name QDF_STATUS utils_dfs_get_chan_dfs_state(struct wlan_objmgr_pdev *pdev,
923*5113495bSYour Name 					enum channel_dfs_state *dfs_ch_s);
924*5113495bSYour Name 
925*5113495bSYour Name /**
926*5113495bSYour Name  * utils_dfs_update_chan_state_array() - Update the channel state of the dfs
927*5113495bSYour Name  * channel indicated by the frequency. The dfs event is converted to
928*5113495bSYour Name  * appropriate dfs state.
929*5113495bSYour Name  * @pdev: Pointer to the pdev.
930*5113495bSYour Name  * @freq: Input frequency.
931*5113495bSYour Name  * @event: Input dfs event.
932*5113495bSYour Name  *
933*5113495bSYour Name  * Return: QDF_STATUS.
934*5113495bSYour Name  */
935*5113495bSYour Name QDF_STATUS utils_dfs_update_chan_state_array(struct wlan_objmgr_pdev *pdev,
936*5113495bSYour Name 					     qdf_freq_t freq,
937*5113495bSYour Name 					     enum WLAN_DFS_EVENTS event);
938*5113495bSYour Name 
939*5113495bSYour Name /**
940*5113495bSYour Name  * dfs_init_chan_state_array() - Initialize the dfs channel state array.
941*5113495bSYour Name  *
942*5113495bSYour Name  * @pdev: Pointer to the pdev.
943*5113495bSYour Name  *
944*5113495bSYour Name  * Return: QDF_STATUS.
945*5113495bSYour Name  */
946*5113495bSYour Name QDF_STATUS dfs_init_chan_state_array(struct wlan_objmgr_pdev *pdev);
947*5113495bSYour Name #else
948*5113495bSYour Name static inline
utils_dfs_get_chan_dfs_state(struct wlan_objmgr_pdev * pdev,enum channel_dfs_state * dfs_ch_s)949*5113495bSYour Name QDF_STATUS utils_dfs_get_chan_dfs_state(struct wlan_objmgr_pdev *pdev,
950*5113495bSYour Name 					enum channel_dfs_state *dfs_ch_s)
951*5113495bSYour Name {
952*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
953*5113495bSYour Name }
954*5113495bSYour Name 
955*5113495bSYour Name static inline
utils_dfs_update_chan_state_array(struct wlan_objmgr_pdev * pdev,uint16_t freq,enum WLAN_DFS_EVENTS event)956*5113495bSYour Name QDF_STATUS utils_dfs_update_chan_state_array(struct wlan_objmgr_pdev *pdev,
957*5113495bSYour Name 					     uint16_t freq,
958*5113495bSYour Name 					     enum WLAN_DFS_EVENTS event)
959*5113495bSYour Name {
960*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
961*5113495bSYour Name }
962*5113495bSYour Name 
963*5113495bSYour Name static inline
dfs_init_chan_state_array(struct wlan_objmgr_pdev * pdev)964*5113495bSYour Name QDF_STATUS dfs_init_chan_state_array(struct wlan_objmgr_pdev *pdev)
965*5113495bSYour Name {
966*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
967*5113495bSYour Name }
968*5113495bSYour Name #endif /* WLAN_DISP_CHAN_INFO */
969*5113495bSYour Name 
970*5113495bSYour Name /**
971*5113495bSYour Name  * utils_dfs_radar_enable() - Enables the radar.
972*5113495bSYour Name  * @pdev: Pointer to DFS pdev object.
973*5113495bSYour Name  *
974*5113495bSYour Name  * This is called each time for eCSA occurs but don't change channel due
975*5113495bSYour Name  * to channel switch disabled in dfs test mode.
976*5113495bSYour Name  *
977*5113495bSYour Name  * Return: QDF_STATUS.
978*5113495bSYour Name  */
979*5113495bSYour Name QDF_STATUS utils_dfs_radar_enable(struct wlan_objmgr_pdev *pdev);
980*5113495bSYour Name 
981*5113495bSYour Name /**
982*5113495bSYour Name  * utils_dfs_convert_freq_to_index() - Converts a channel frequency
983*5113495bSYour Name  * to the DFS channel state array index. The input frequency should be a 5 GHz
984*5113495bSYour Name  * channel frequency and this check should be done in the caller.
985*5113495bSYour Name  *
986*5113495bSYour Name  * @freq: Input DFS channel frequency.
987*5113495bSYour Name  * @index: Output DFS channel state array index.
988*5113495bSYour Name  *
989*5113495bSYour Name  * Return: None.
990*5113495bSYour Name  */
991*5113495bSYour Name void utils_dfs_convert_freq_to_index(qdf_freq_t freq, int8_t *index);
992*5113495bSYour Name 
993*5113495bSYour Name /**
994*5113495bSYour Name  * utils_dfs_convert_wlan_phymode_to_chwidth() - Map phymode to
995*5113495bSYour Name  * channel width.
996*5113495bSYour Name  * @phymode: phymode of type wlan_phymode.
997*5113495bSYour Name  *
998*5113495bSYour Name  * Return channel width of type phy_ch_width
999*5113495bSYour Name  */
1000*5113495bSYour Name enum phy_ch_width
1001*5113495bSYour Name utils_dfs_convert_wlan_phymode_to_chwidth(enum wlan_phymode phymode);
1002*5113495bSYour Name 
1003*5113495bSYour Name /**
1004*5113495bSYour Name  * utils_dfs_get_radar_bitmap_from_nolie() - Read the NOL IE bitmap of the RCSA
1005*5113495bSYour Name  * frame, puncture the nol infected channels and formulate the radar puncture
1006*5113495bSYour Name  * bitmap.
1007*5113495bSYour Name  * @pdev: Pointer to struct wlan_objmgr_pdev
1008*5113495bSYour Name  * @phy_mode: Phymode of enum wlan_phymode.
1009*5113495bSYour Name  * @nol_ie_start_freq: Start frequency of the NOL infected channels
1010*5113495bSYour Name  * @nol_ie_bitmap : NOL IE bitmap
1011*5113495bSYour Name  *
1012*5113495bSYour Name  * Return: Punctured radar bitmap
1013*5113495bSYour Name  */
1014*5113495bSYour Name #if defined(WLAN_FEATURE_11BE) && defined(QCA_DFS_BW_EXPAND) && \
1015*5113495bSYour Name 	defined(QCA_DFS_RCSA_SUPPORT)
1016*5113495bSYour Name uint16_t
1017*5113495bSYour Name utils_dfs_get_radar_bitmap_from_nolie(struct wlan_objmgr_pdev *pdev,
1018*5113495bSYour Name 				      enum wlan_phymode phy_mode,
1019*5113495bSYour Name 				      qdf_freq_t nol_ie_start_freq,
1020*5113495bSYour Name 				      uint8_t nol_ie_bitmap);
1021*5113495bSYour Name #else
1022*5113495bSYour Name static inline uint16_t
utils_dfs_get_radar_bitmap_from_nolie(struct wlan_objmgr_pdev * pdev,enum wlan_phymode phy_mode,qdf_freq_t nol_ie_start_freq,uint8_t nol_ie_bitmap)1023*5113495bSYour Name utils_dfs_get_radar_bitmap_from_nolie(struct wlan_objmgr_pdev *pdev,
1024*5113495bSYour Name 				      enum wlan_phymode phy_mode,
1025*5113495bSYour Name 				      qdf_freq_t nol_ie_start_freq,
1026*5113495bSYour Name 				      uint8_t nol_ie_bitmap)
1027*5113495bSYour Name {
1028*5113495bSYour Name 	return NO_SCHANS_PUNC;
1029*5113495bSYour Name }
1030*5113495bSYour Name #endif
1031*5113495bSYour Name #endif /* _WLAN_DFS_UTILS_API_H_ */
1032