xref: /wlan-driver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-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 implementation which is exposed
23*5113495bSYour Name  * to outside of DFS component.
24*5113495bSYour Name  */
25*5113495bSYour Name #include <wlan_objmgr_vdev_obj.h>
26*5113495bSYour Name #include "wlan_dfs_utils_api.h"
27*5113495bSYour Name #include "wlan_dfs_init_deinit_api.h"
28*5113495bSYour Name #include "wlan_dfs_mlme_api.h"
29*5113495bSYour Name #include "../../core/src/dfs.h"
30*5113495bSYour Name #include "../../core/src/dfs_zero_cac.h"
31*5113495bSYour Name #include <wlan_reg_services_api.h>
32*5113495bSYour Name #include "../../core/src/dfs_random_chan_sel.h"
33*5113495bSYour Name #ifdef QCA_DFS_USE_POLICY_MANAGER
34*5113495bSYour Name #include "wlan_policy_mgr_api.h"
35*5113495bSYour Name #endif
36*5113495bSYour Name #ifdef QCA_DFS_NOL_PLATFORM_DRV_SUPPORT
37*5113495bSYour Name #include <pld_common.h>
38*5113495bSYour Name #endif
39*5113495bSYour Name #include <qdf_module.h>
40*5113495bSYour Name #include "wlan_dfs_lmac_api.h"
41*5113495bSYour Name #include "../../core/src/dfs_internal.h"
42*5113495bSYour Name 
43*5113495bSYour Name struct dfs_nol_info {
44*5113495bSYour Name 	uint16_t num_chans;
45*5113495bSYour Name 	struct dfsreq_nolelem dfs_nol[DFS_MAX_NOL_CHANNEL];
46*5113495bSYour Name };
47*5113495bSYour Name 
utils_dfs_reset(struct wlan_objmgr_pdev * pdev)48*5113495bSYour Name QDF_STATUS utils_dfs_reset(struct wlan_objmgr_pdev *pdev)
49*5113495bSYour Name {
50*5113495bSYour Name 	struct wlan_dfs *dfs;
51*5113495bSYour Name 
52*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
53*5113495bSYour Name 	if (!dfs)
54*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
55*5113495bSYour Name 
56*5113495bSYour Name 	dfs_reset(dfs);
57*5113495bSYour Name 	dfs_nol_update(dfs);
58*5113495bSYour Name 	dfs_reset_precaclists(dfs);
59*5113495bSYour Name 	dfs_init_chan_state_array(pdev);
60*5113495bSYour Name 
61*5113495bSYour Name 	if (dfs->dfs_use_puncture && !dfs->dfs_is_stadfs_enabled)
62*5113495bSYour Name 		dfs_punc_sm_stop_all(dfs);
63*5113495bSYour Name 
64*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
65*5113495bSYour Name }
66*5113495bSYour Name 
utils_dfs_is_freq_in_nol(struct wlan_objmgr_pdev * pdev,uint32_t freq)67*5113495bSYour Name bool utils_dfs_is_freq_in_nol(struct wlan_objmgr_pdev *pdev, uint32_t freq)
68*5113495bSYour Name {
69*5113495bSYour Name 	struct wlan_dfs *dfs;
70*5113495bSYour Name 
71*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
72*5113495bSYour Name 	if (!dfs)
73*5113495bSYour Name 		return false;
74*5113495bSYour Name 
75*5113495bSYour Name 	return dfs_is_freq_in_nol(dfs, freq);
76*5113495bSYour Name }
77*5113495bSYour Name 
78*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_dfs_cac_valid_reset_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t prevchan_freq,uint32_t prevchan_flags)79*5113495bSYour Name QDF_STATUS utils_dfs_cac_valid_reset_for_freq(struct wlan_objmgr_pdev *pdev,
80*5113495bSYour Name 					      uint16_t prevchan_freq,
81*5113495bSYour Name 					      uint32_t prevchan_flags)
82*5113495bSYour Name {
83*5113495bSYour Name 	struct wlan_dfs *dfs;
84*5113495bSYour Name 
85*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
86*5113495bSYour Name 	if (!dfs)
87*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
88*5113495bSYour Name 
89*5113495bSYour Name 	dfs_cac_valid_reset_for_freq(dfs, prevchan_freq, prevchan_flags);
90*5113495bSYour Name 
91*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
92*5113495bSYour Name }
93*5113495bSYour Name 
94*5113495bSYour Name qdf_export_symbol(utils_dfs_cac_valid_reset_for_freq);
95*5113495bSYour Name #endif
96*5113495bSYour Name 
utils_dfs_reset_precaclists(struct wlan_objmgr_pdev * pdev)97*5113495bSYour Name QDF_STATUS utils_dfs_reset_precaclists(struct wlan_objmgr_pdev *pdev)
98*5113495bSYour Name {
99*5113495bSYour Name 	struct wlan_dfs *dfs;
100*5113495bSYour Name 
101*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
102*5113495bSYour Name 	if (!dfs)
103*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
104*5113495bSYour Name 
105*5113495bSYour Name 	dfs_reset_precaclists(dfs);
106*5113495bSYour Name 
107*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
108*5113495bSYour Name }
109*5113495bSYour Name qdf_export_symbol(utils_dfs_reset_precaclists);
110*5113495bSYour Name 
111*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_dfs_unmark_precac_nol_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t chan_freq)112*5113495bSYour Name void utils_dfs_unmark_precac_nol_for_freq(struct wlan_objmgr_pdev *pdev,
113*5113495bSYour Name 					  uint16_t chan_freq)
114*5113495bSYour Name {
115*5113495bSYour Name 	struct wlan_dfs *dfs;
116*5113495bSYour Name 
117*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
118*5113495bSYour Name 	if (!dfs)
119*5113495bSYour Name 		return;
120*5113495bSYour Name 
121*5113495bSYour Name 	dfs_unmark_precac_nol_for_freq(dfs, chan_freq);
122*5113495bSYour Name }
123*5113495bSYour Name 
124*5113495bSYour Name qdf_export_symbol(utils_dfs_unmark_precac_nol_for_freq);
125*5113495bSYour Name #endif
126*5113495bSYour Name 
utils_dfs_cancel_precac_timer(struct wlan_objmgr_pdev * pdev)127*5113495bSYour Name QDF_STATUS utils_dfs_cancel_precac_timer(struct wlan_objmgr_pdev *pdev)
128*5113495bSYour Name {
129*5113495bSYour Name 	struct wlan_dfs *dfs;
130*5113495bSYour Name 
131*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
132*5113495bSYour Name 	if (!dfs)
133*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
134*5113495bSYour Name 
135*5113495bSYour Name 	dfs_cancel_precac_timer(dfs);
136*5113495bSYour Name 
137*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
138*5113495bSYour Name }
139*5113495bSYour Name qdf_export_symbol(utils_dfs_cancel_precac_timer);
140*5113495bSYour Name 
141*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_dfs_start_precac_timer(struct wlan_objmgr_pdev * pdev)142*5113495bSYour Name QDF_STATUS utils_dfs_start_precac_timer(struct wlan_objmgr_pdev *pdev)
143*5113495bSYour Name {
144*5113495bSYour Name 	struct wlan_dfs *dfs;
145*5113495bSYour Name 
146*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
147*5113495bSYour Name 	if (!dfs) {
148*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "NULL dfs");
149*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
150*5113495bSYour Name 	}
151*5113495bSYour Name 
152*5113495bSYour Name 	if (!dfs->dfs_precac_secondary_freq_mhz)
153*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
154*5113495bSYour Name 
155*5113495bSYour Name 	dfs_start_precac_timer_for_freq(dfs,
156*5113495bSYour Name 					dfs->dfs_precac_secondary_freq_mhz);
157*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
158*5113495bSYour Name }
159*5113495bSYour Name #else
160*5113495bSYour Name #endif
161*5113495bSYour Name 
162*5113495bSYour Name #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
163*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
164*5113495bSYour Name bool
utils_dfs_precac_decide_pref_chan_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t * chan_freq,enum wlan_phymode mode)165*5113495bSYour Name utils_dfs_precac_decide_pref_chan_for_freq(struct wlan_objmgr_pdev *pdev,
166*5113495bSYour Name 					   uint16_t *chan_freq,
167*5113495bSYour Name 					   enum wlan_phymode mode)
168*5113495bSYour Name {
169*5113495bSYour Name 	struct wlan_dfs *dfs;
170*5113495bSYour Name 
171*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
172*5113495bSYour Name 	if (!dfs) {
173*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "NULL dfs");
174*5113495bSYour Name 		return false;
175*5113495bSYour Name 	}
176*5113495bSYour Name 	return dfs_decide_precac_preferred_chan_for_freq(dfs, chan_freq, mode);
177*5113495bSYour Name }
178*5113495bSYour Name #endif
179*5113495bSYour Name #endif
utils_dfs_cancel_cac_timer(struct wlan_objmgr_pdev * pdev)180*5113495bSYour Name QDF_STATUS utils_dfs_cancel_cac_timer(struct wlan_objmgr_pdev *pdev)
181*5113495bSYour Name {
182*5113495bSYour Name 	struct wlan_dfs *dfs;
183*5113495bSYour Name 
184*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
185*5113495bSYour Name 	if (!dfs)
186*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
187*5113495bSYour Name 
188*5113495bSYour Name 	dfs_cancel_cac_timer(dfs);
189*5113495bSYour Name 
190*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
191*5113495bSYour Name }
192*5113495bSYour Name qdf_export_symbol(utils_dfs_cancel_cac_timer);
193*5113495bSYour Name 
utils_dfs_start_cac_timer(struct wlan_objmgr_pdev * pdev)194*5113495bSYour Name QDF_STATUS utils_dfs_start_cac_timer(struct wlan_objmgr_pdev *pdev)
195*5113495bSYour Name {
196*5113495bSYour Name 	struct wlan_dfs *dfs;
197*5113495bSYour Name 
198*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
199*5113495bSYour Name 	if (!dfs)
200*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
201*5113495bSYour Name 
202*5113495bSYour Name 	dfs_start_cac_timer(dfs);
203*5113495bSYour Name 
204*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
205*5113495bSYour Name }
206*5113495bSYour Name qdf_export_symbol(utils_dfs_start_cac_timer);
207*5113495bSYour Name 
utils_dfs_cac_stop(struct wlan_objmgr_pdev * pdev)208*5113495bSYour Name QDF_STATUS utils_dfs_cac_stop(struct wlan_objmgr_pdev *pdev)
209*5113495bSYour Name {
210*5113495bSYour Name 	struct wlan_dfs *dfs;
211*5113495bSYour Name 
212*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
213*5113495bSYour Name 	if (!dfs)
214*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
215*5113495bSYour Name 
216*5113495bSYour Name 	dfs_cac_stop(dfs);
217*5113495bSYour Name 	return  QDF_STATUS_SUCCESS;
218*5113495bSYour Name }
219*5113495bSYour Name qdf_export_symbol(utils_dfs_cac_stop);
220*5113495bSYour Name 
221*5113495bSYour Name /** dfs_fill_chan_info() - Fill the dfs channel structure with wlan
222*5113495bSYour Name  * channel.
223*5113495bSYour Name  * @chan: Pointer to DFS channel structure.
224*5113495bSYour Name  * @wlan_chan: Pointer to WLAN Channel structure.
225*5113495bSYour Name  *
226*5113495bSYour Name  * Return: void
227*5113495bSYour Name  */
228*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
dfs_fill_chan_info(struct dfs_channel * chan,struct wlan_channel * wlan_chan)229*5113495bSYour Name static void dfs_fill_chan_info(struct dfs_channel *chan,
230*5113495bSYour Name 			       struct wlan_channel *wlan_chan)
231*5113495bSYour Name {
232*5113495bSYour Name 	chan->dfs_ch_freq = wlan_chan->ch_freq;
233*5113495bSYour Name 	chan->dfs_ch_flags = wlan_chan->ch_flags;
234*5113495bSYour Name 	chan->dfs_ch_flagext = wlan_chan->ch_flagext;
235*5113495bSYour Name 	chan->dfs_ch_ieee = wlan_chan->ch_ieee;
236*5113495bSYour Name 	chan->dfs_ch_vhtop_ch_freq_seg1 = wlan_chan->ch_freq_seg1;
237*5113495bSYour Name 	chan->dfs_ch_vhtop_ch_freq_seg2 = wlan_chan->ch_freq_seg2;
238*5113495bSYour Name 	chan->dfs_ch_mhz_freq_seg1 = wlan_chan->ch_cfreq1;
239*5113495bSYour Name 	chan->dfs_ch_mhz_freq_seg2 = wlan_chan->ch_cfreq2;
240*5113495bSYour Name }
241*5113495bSYour Name #endif
242*5113495bSYour Name 
utils_dfs_is_precac_done(struct wlan_objmgr_pdev * pdev,struct wlan_channel * wlan_chan)243*5113495bSYour Name bool utils_dfs_is_precac_done(struct wlan_objmgr_pdev *pdev,
244*5113495bSYour Name 			      struct wlan_channel *wlan_chan)
245*5113495bSYour Name {
246*5113495bSYour Name 	struct wlan_dfs *dfs;
247*5113495bSYour Name 	struct dfs_channel chan;
248*5113495bSYour Name 
249*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
250*5113495bSYour Name 	if (!dfs)
251*5113495bSYour Name 		return false;
252*5113495bSYour Name 
253*5113495bSYour Name 	dfs_fill_chan_info(&chan, wlan_chan);
254*5113495bSYour Name 
255*5113495bSYour Name 	return dfs_is_precac_done(dfs, &chan);
256*5113495bSYour Name }
257*5113495bSYour Name 
utils_dfs_is_cac_required(struct wlan_objmgr_pdev * pdev,struct wlan_channel * cur_chan,struct wlan_channel * prev_chan,bool * continue_current_cac)258*5113495bSYour Name bool utils_dfs_is_cac_required(struct wlan_objmgr_pdev *pdev,
259*5113495bSYour Name 			       struct wlan_channel *cur_chan,
260*5113495bSYour Name 			       struct wlan_channel *prev_chan,
261*5113495bSYour Name 			       bool *continue_current_cac)
262*5113495bSYour Name {
263*5113495bSYour Name 	struct wlan_dfs *dfs;
264*5113495bSYour Name 	struct dfs_channel cur_channel;
265*5113495bSYour Name 	struct dfs_channel prev_channel;
266*5113495bSYour Name 
267*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
268*5113495bSYour Name 	if (!dfs)
269*5113495bSYour Name 		return false;
270*5113495bSYour Name 
271*5113495bSYour Name 	dfs_fill_chan_info(&cur_channel, cur_chan);
272*5113495bSYour Name 	dfs_fill_chan_info(&prev_channel, prev_chan);
273*5113495bSYour Name 
274*5113495bSYour Name 	return dfs_is_cac_required(dfs,
275*5113495bSYour Name 				   &cur_channel,
276*5113495bSYour Name 				   &prev_channel,
277*5113495bSYour Name 				   continue_current_cac, true);
278*5113495bSYour Name }
279*5113495bSYour Name 
280*5113495bSYour Name bool
utils_dfs_is_cac_required_on_dfs_curchan(struct wlan_objmgr_pdev * pdev,bool * continue_current_cac,bool is_vap_restart)281*5113495bSYour Name utils_dfs_is_cac_required_on_dfs_curchan(struct wlan_objmgr_pdev *pdev,
282*5113495bSYour Name 					 bool *continue_current_cac,
283*5113495bSYour Name 					 bool is_vap_restart)
284*5113495bSYour Name {
285*5113495bSYour Name 	struct wlan_dfs *dfs;
286*5113495bSYour Name 
287*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
288*5113495bSYour Name 	if (!dfs)
289*5113495bSYour Name 		return false;
290*5113495bSYour Name 
291*5113495bSYour Name 	return dfs_is_cac_required(dfs,
292*5113495bSYour Name 				   dfs->dfs_curchan,
293*5113495bSYour Name 				   dfs->dfs_prevchan,
294*5113495bSYour Name 				   continue_current_cac,
295*5113495bSYour Name 				   is_vap_restart);
296*5113495bSYour Name }
297*5113495bSYour Name 
utils_dfs_stacac_stop(struct wlan_objmgr_pdev * pdev)298*5113495bSYour Name QDF_STATUS utils_dfs_stacac_stop(struct wlan_objmgr_pdev *pdev)
299*5113495bSYour Name {
300*5113495bSYour Name 	struct wlan_dfs *dfs;
301*5113495bSYour Name 
302*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
303*5113495bSYour Name 	if (!dfs)
304*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
305*5113495bSYour Name 
306*5113495bSYour Name 	dfs_stacac_stop(dfs);
307*5113495bSYour Name 
308*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
309*5113495bSYour Name }
310*5113495bSYour Name qdf_export_symbol(utils_dfs_stacac_stop);
311*5113495bSYour Name 
utils_dfs_get_usenol(struct wlan_objmgr_pdev * pdev,uint16_t * usenol)312*5113495bSYour Name QDF_STATUS utils_dfs_get_usenol(struct wlan_objmgr_pdev *pdev, uint16_t *usenol)
313*5113495bSYour Name {
314*5113495bSYour Name 	struct wlan_dfs *dfs;
315*5113495bSYour Name 
316*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
317*5113495bSYour Name 	if (!dfs)
318*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
319*5113495bSYour Name 
320*5113495bSYour Name 	*usenol = dfs_get_use_nol(dfs);
321*5113495bSYour Name 
322*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
323*5113495bSYour Name }
324*5113495bSYour Name qdf_export_symbol(utils_dfs_get_usenol);
325*5113495bSYour Name 
utils_dfs_is_spruce_spur_war_applicable(struct wlan_objmgr_pdev * pdev)326*5113495bSYour Name bool utils_dfs_is_spruce_spur_war_applicable(struct wlan_objmgr_pdev *pdev)
327*5113495bSYour Name {
328*5113495bSYour Name 	struct wlan_dfs *dfs;
329*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
330*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
331*5113495bSYour Name 	uint32_t target_type;
332*5113495bSYour Name 	struct wlan_lmac_if_target_tx_ops *tgt_tx_ops;
333*5113495bSYour Name 	qdf_freq_t cur_freq;
334*5113495bSYour Name 
335*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
336*5113495bSYour Name 	if (!dfs)
337*5113495bSYour Name 		return false;
338*5113495bSYour Name 
339*5113495bSYour Name 	psoc = dfs->dfs_soc_obj->psoc;
340*5113495bSYour Name 
341*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
342*5113495bSYour Name 	if (!tx_ops) {
343*5113495bSYour Name 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "tx_ops is NULL");
344*5113495bSYour Name 		return false;
345*5113495bSYour Name 	}
346*5113495bSYour Name 
347*5113495bSYour Name 	tgt_tx_ops = &tx_ops->target_tx_ops;
348*5113495bSYour Name 	target_type = lmac_get_target_type(dfs->dfs_pdev_obj);
349*5113495bSYour Name 
350*5113495bSYour Name 	/* Is the target Spruce? */
351*5113495bSYour Name 	if (!tgt_tx_ops->tgt_is_tgt_type_qcn6122 ||
352*5113495bSYour Name 	    !tgt_tx_ops->tgt_is_tgt_type_qcn9160)
353*5113495bSYour Name 		return false;
354*5113495bSYour Name 
355*5113495bSYour Name 	if (!tgt_tx_ops->tgt_is_tgt_type_qcn6122(target_type) ||
356*5113495bSYour Name 	    !tgt_tx_ops->tgt_is_tgt_type_qcn9160(target_type))
357*5113495bSYour Name 		return false;
358*5113495bSYour Name 
359*5113495bSYour Name 	cur_freq = dfs->dfs_curchan->dfs_ch_freq;
360*5113495bSYour Name 
361*5113495bSYour Name 	/* Is the current channel width 80MHz? */
362*5113495bSYour Name 	if (WLAN_IS_CHAN_MODE_80(dfs->dfs_curchan) ||
363*5113495bSYour Name 	    WLAN_IS_CHAN_MODE_40(dfs->dfs_curchan) ||
364*5113495bSYour Name 	    WLAN_IS_CHAN_MODE_20(dfs->dfs_curchan)) {
365*5113495bSYour Name 		/* is the primary channel 52/56/60/64? */
366*5113495bSYour Name 		bool is_chan_spur_80mhzfreq =
367*5113495bSYour Name 		    DFS_IS_CHAN_SPRUCE_SPUR_FREQ_80MHZ(cur_freq);
368*5113495bSYour Name 		if (is_chan_spur_80mhzfreq)
369*5113495bSYour Name 			return true;
370*5113495bSYour Name 		return false;
371*5113495bSYour Name 	}
372*5113495bSYour Name 
373*5113495bSYour Name 	/* If the current channel width is not 80, is it 160MHz? */
374*5113495bSYour Name 	if (WLAN_IS_CHAN_MODE_160(dfs->dfs_curchan)) {
375*5113495bSYour Name 		/* is the primary channel 36/44/48/52/56/60/64? */
376*5113495bSYour Name 		bool is_chan_spur_160mhz_freq =
377*5113495bSYour Name 		    DFS_IS_CHAN_SPRUCE_SPUR_FREQ_160MHZ(cur_freq);
378*5113495bSYour Name 		if (is_chan_spur_160mhz_freq)
379*5113495bSYour Name 			return true;
380*5113495bSYour Name 		return false;
381*5113495bSYour Name 	}
382*5113495bSYour Name 
383*5113495bSYour Name 	return false;
384*5113495bSYour Name }
385*5113495bSYour Name 
utils_dfs_radar_disable(struct wlan_objmgr_pdev * pdev)386*5113495bSYour Name QDF_STATUS utils_dfs_radar_disable(struct wlan_objmgr_pdev *pdev)
387*5113495bSYour Name {
388*5113495bSYour Name 	struct wlan_dfs *dfs;
389*5113495bSYour Name 
390*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
391*5113495bSYour Name 	if (!dfs)
392*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
393*5113495bSYour Name 
394*5113495bSYour Name 	dfs_radar_disable(dfs);
395*5113495bSYour Name 
396*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
397*5113495bSYour Name }
398*5113495bSYour Name qdf_export_symbol(utils_dfs_radar_disable);
399*5113495bSYour Name 
utils_dfs_set_update_nol_flag(struct wlan_objmgr_pdev * pdev,bool val)400*5113495bSYour Name QDF_STATUS utils_dfs_set_update_nol_flag(struct wlan_objmgr_pdev *pdev,
401*5113495bSYour Name 		bool val)
402*5113495bSYour Name {
403*5113495bSYour Name 	struct wlan_dfs *dfs;
404*5113495bSYour Name 
405*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
406*5113495bSYour Name 	if (!dfs)
407*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
408*5113495bSYour Name 
409*5113495bSYour Name 	dfs_set_update_nol_flag(dfs, val);
410*5113495bSYour Name 
411*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
412*5113495bSYour Name }
413*5113495bSYour Name qdf_export_symbol(utils_dfs_set_update_nol_flag);
414*5113495bSYour Name 
utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev * pdev,bool * nol_flag)415*5113495bSYour Name QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev,
416*5113495bSYour Name 		bool *nol_flag)
417*5113495bSYour Name {
418*5113495bSYour Name 	struct wlan_dfs *dfs;
419*5113495bSYour Name 
420*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
421*5113495bSYour Name 	if (!dfs)
422*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
423*5113495bSYour Name 
424*5113495bSYour Name 	*nol_flag = dfs_get_update_nol_flag(dfs);
425*5113495bSYour Name 
426*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
427*5113495bSYour Name }
428*5113495bSYour Name qdf_export_symbol(utils_dfs_get_update_nol_flag);
429*5113495bSYour Name 
utils_dfs_get_dfs_use_nol(struct wlan_objmgr_pdev * pdev,int * dfs_use_nol)430*5113495bSYour Name QDF_STATUS utils_dfs_get_dfs_use_nol(struct wlan_objmgr_pdev *pdev,
431*5113495bSYour Name 		int *dfs_use_nol)
432*5113495bSYour Name {
433*5113495bSYour Name 	struct wlan_dfs *dfs;
434*5113495bSYour Name 
435*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
436*5113495bSYour Name 	if (!dfs)
437*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
438*5113495bSYour Name 
439*5113495bSYour Name 	*dfs_use_nol = dfs_get_use_nol(dfs);
440*5113495bSYour Name 
441*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
442*5113495bSYour Name }
443*5113495bSYour Name qdf_export_symbol(utils_dfs_get_dfs_use_nol);
444*5113495bSYour Name 
utils_dfs_get_nol_timeout(struct wlan_objmgr_pdev * pdev,int * dfs_nol_timeout)445*5113495bSYour Name QDF_STATUS utils_dfs_get_nol_timeout(struct wlan_objmgr_pdev *pdev,
446*5113495bSYour Name 		int *dfs_nol_timeout)
447*5113495bSYour Name {
448*5113495bSYour Name 	struct wlan_dfs *dfs;
449*5113495bSYour Name 
450*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
451*5113495bSYour Name 	if (!dfs)
452*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
453*5113495bSYour Name 
454*5113495bSYour Name 	*dfs_nol_timeout = dfs_get_nol_timeout(dfs);
455*5113495bSYour Name 
456*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
457*5113495bSYour Name }
458*5113495bSYour Name qdf_export_symbol(utils_dfs_get_nol_timeout);
459*5113495bSYour Name 
utils_dfs_nol_addchan(struct wlan_objmgr_pdev * pdev,uint16_t freq,uint32_t dfs_nol_timeout)460*5113495bSYour Name QDF_STATUS utils_dfs_nol_addchan(struct wlan_objmgr_pdev *pdev,
461*5113495bSYour Name 		uint16_t freq,
462*5113495bSYour Name 		uint32_t dfs_nol_timeout)
463*5113495bSYour Name {
464*5113495bSYour Name 	struct wlan_dfs *dfs;
465*5113495bSYour Name 
466*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
467*5113495bSYour Name 	if (!dfs)
468*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
469*5113495bSYour Name 
470*5113495bSYour Name 	DFS_NOL_ADD_CHAN_LOCKED(dfs, freq, dfs_nol_timeout);
471*5113495bSYour Name 
472*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
473*5113495bSYour Name }
474*5113495bSYour Name qdf_export_symbol(utils_dfs_nol_addchan);
475*5113495bSYour Name 
utils_dfs_nol_update(struct wlan_objmgr_pdev * pdev)476*5113495bSYour Name QDF_STATUS utils_dfs_nol_update(struct wlan_objmgr_pdev *pdev)
477*5113495bSYour Name {
478*5113495bSYour Name 	struct wlan_dfs *dfs;
479*5113495bSYour Name 
480*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
481*5113495bSYour Name 	if (!dfs)
482*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
483*5113495bSYour Name 
484*5113495bSYour Name 	dfs_nol_update(dfs);
485*5113495bSYour Name 
486*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
487*5113495bSYour Name }
488*5113495bSYour Name qdf_export_symbol(utils_dfs_nol_update);
489*5113495bSYour Name 
utils_dfs_second_segment_radar_disable(struct wlan_objmgr_pdev * pdev)490*5113495bSYour Name QDF_STATUS utils_dfs_second_segment_radar_disable(struct wlan_objmgr_pdev *pdev)
491*5113495bSYour Name {
492*5113495bSYour Name 	struct wlan_dfs *dfs;
493*5113495bSYour Name 
494*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
495*5113495bSYour Name 	if (!dfs)
496*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
497*5113495bSYour Name 
498*5113495bSYour Name 	dfs_second_segment_radar_disable(dfs);
499*5113495bSYour Name 
500*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
501*5113495bSYour Name }
502*5113495bSYour Name 
utils_dfs_bw_reduce(struct wlan_objmgr_pdev * pdev,bool bw_reduce)503*5113495bSYour Name QDF_STATUS utils_dfs_bw_reduce(struct wlan_objmgr_pdev *pdev, bool bw_reduce)
504*5113495bSYour Name {
505*5113495bSYour Name 	struct wlan_dfs *dfs;
506*5113495bSYour Name 
507*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
508*5113495bSYour Name 	if (!dfs)
509*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
510*5113495bSYour Name 
511*5113495bSYour Name 	dfs->dfs_bw_reduced = bw_reduce;
512*5113495bSYour Name 
513*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
514*5113495bSYour Name }
515*5113495bSYour Name 
516*5113495bSYour Name qdf_export_symbol(utils_dfs_bw_reduce);
517*5113495bSYour Name 
utils_dfs_is_bw_reduce(struct wlan_objmgr_pdev * pdev,bool * bw_reduce)518*5113495bSYour Name QDF_STATUS utils_dfs_is_bw_reduce(struct wlan_objmgr_pdev *pdev,
519*5113495bSYour Name 				  bool *bw_reduce)
520*5113495bSYour Name {
521*5113495bSYour Name 	struct wlan_dfs *dfs;
522*5113495bSYour Name 
523*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
524*5113495bSYour Name 	if (!dfs)
525*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
526*5113495bSYour Name 
527*5113495bSYour Name 	*bw_reduce = dfs->dfs_bw_reduced;
528*5113495bSYour Name 
529*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
530*5113495bSYour Name }
531*5113495bSYour Name 
utils_dfs_fetch_nol_ie_info(struct wlan_objmgr_pdev * pdev,uint8_t * nol_ie_bandwidth,uint16_t * nol_ie_startfreq,uint8_t * nol_ie_bitmap)532*5113495bSYour Name QDF_STATUS utils_dfs_fetch_nol_ie_info(struct wlan_objmgr_pdev *pdev,
533*5113495bSYour Name 				       uint8_t *nol_ie_bandwidth,
534*5113495bSYour Name 				       uint16_t *nol_ie_startfreq,
535*5113495bSYour Name 				       uint8_t *nol_ie_bitmap)
536*5113495bSYour Name {
537*5113495bSYour Name 	struct wlan_dfs *dfs;
538*5113495bSYour Name 
539*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
540*5113495bSYour Name 	if (!dfs)
541*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
542*5113495bSYour Name 
543*5113495bSYour Name 	dfs_fetch_nol_ie_info(dfs, nol_ie_bandwidth, nol_ie_startfreq,
544*5113495bSYour Name 			      nol_ie_bitmap);
545*5113495bSYour Name 
546*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
547*5113495bSYour Name }
548*5113495bSYour Name 
utils_dfs_set_rcsa_flags(struct wlan_objmgr_pdev * pdev,bool is_rcsa_ie_sent,bool is_nol_ie_sent)549*5113495bSYour Name QDF_STATUS utils_dfs_set_rcsa_flags(struct wlan_objmgr_pdev *pdev,
550*5113495bSYour Name 				    bool is_rcsa_ie_sent,
551*5113495bSYour Name 				    bool is_nol_ie_sent)
552*5113495bSYour Name {
553*5113495bSYour Name 	struct wlan_dfs *dfs;
554*5113495bSYour Name 
555*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
556*5113495bSYour Name 	if (!dfs)
557*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
558*5113495bSYour Name 
559*5113495bSYour Name 	dfs_set_rcsa_flags(dfs, is_rcsa_ie_sent, is_nol_ie_sent);
560*5113495bSYour Name 
561*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
562*5113495bSYour Name }
563*5113495bSYour Name 
utils_dfs_get_rcsa_flags(struct wlan_objmgr_pdev * pdev,bool * is_rcsa_ie_sent,bool * is_nol_ie_sent)564*5113495bSYour Name QDF_STATUS utils_dfs_get_rcsa_flags(struct wlan_objmgr_pdev *pdev,
565*5113495bSYour Name 				    bool *is_rcsa_ie_sent,
566*5113495bSYour Name 				    bool *is_nol_ie_sent)
567*5113495bSYour Name {
568*5113495bSYour Name 	struct wlan_dfs *dfs;
569*5113495bSYour Name 
570*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
571*5113495bSYour Name 	if (!dfs)
572*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
573*5113495bSYour Name 	dfs_get_rcsa_flags(dfs, is_rcsa_ie_sent, is_nol_ie_sent);
574*5113495bSYour Name 
575*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
576*5113495bSYour Name }
577*5113495bSYour Name 
utils_dfs_process_nol_ie_bitmap(struct wlan_objmgr_pdev * pdev,uint8_t nol_ie_bandwidth,uint16_t nol_ie_startfreq,uint8_t nol_ie_bitmap)578*5113495bSYour Name bool utils_dfs_process_nol_ie_bitmap(struct wlan_objmgr_pdev *pdev,
579*5113495bSYour Name 				     uint8_t nol_ie_bandwidth,
580*5113495bSYour Name 				     uint16_t nol_ie_startfreq,
581*5113495bSYour Name 				     uint8_t nol_ie_bitmap)
582*5113495bSYour Name {
583*5113495bSYour Name 	struct wlan_dfs *dfs;
584*5113495bSYour Name 
585*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
586*5113495bSYour Name 	if (!dfs)
587*5113495bSYour Name 		return  false;
588*5113495bSYour Name 	return dfs_process_nol_ie_bitmap(dfs, nol_ie_bandwidth,
589*5113495bSYour Name 					 nol_ie_startfreq,
590*5113495bSYour Name 					 nol_ie_bitmap);
591*5113495bSYour Name }
592*5113495bSYour Name 
utils_dfs_set_cac_timer_running(struct wlan_objmgr_pdev * pdev,int val)593*5113495bSYour Name QDF_STATUS utils_dfs_set_cac_timer_running(struct wlan_objmgr_pdev *pdev,
594*5113495bSYour Name 		int val)
595*5113495bSYour Name {
596*5113495bSYour Name 	struct wlan_dfs *dfs;
597*5113495bSYour Name 
598*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
599*5113495bSYour Name 	if (!dfs)
600*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
601*5113495bSYour Name 
602*5113495bSYour Name 	dfs->dfs_cac_timer_running = val;
603*5113495bSYour Name 
604*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
605*5113495bSYour Name }
606*5113495bSYour Name qdf_export_symbol(utils_dfs_set_cac_timer_running);
607*5113495bSYour Name 
utils_dfs_get_nol_chfreq_and_chwidth(struct wlan_objmgr_pdev * pdev,void * nollist,uint32_t * nol_chfreq,uint32_t * nol_chwidth,int index)608*5113495bSYour Name QDF_STATUS utils_dfs_get_nol_chfreq_and_chwidth(struct wlan_objmgr_pdev *pdev,
609*5113495bSYour Name 		void *nollist,
610*5113495bSYour Name 		uint32_t *nol_chfreq,
611*5113495bSYour Name 		uint32_t *nol_chwidth,
612*5113495bSYour Name 		int index)
613*5113495bSYour Name {
614*5113495bSYour Name 	struct wlan_dfs *dfs;
615*5113495bSYour Name 
616*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
617*5113495bSYour Name 	if (!dfs)
618*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
619*5113495bSYour Name 
620*5113495bSYour Name 	dfs_get_nol_chfreq_and_chwidth(nollist, nol_chfreq, nol_chwidth, index);
621*5113495bSYour Name 
622*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
623*5113495bSYour Name }
624*5113495bSYour Name qdf_export_symbol(utils_dfs_get_nol_chfreq_and_chwidth);
625*5113495bSYour Name 
utils_dfs_update_cur_chan_flags(struct wlan_objmgr_pdev * pdev,uint64_t flags,uint16_t flagext)626*5113495bSYour Name QDF_STATUS utils_dfs_update_cur_chan_flags(struct wlan_objmgr_pdev *pdev,
627*5113495bSYour Name 		uint64_t flags,
628*5113495bSYour Name 		uint16_t flagext)
629*5113495bSYour Name {
630*5113495bSYour Name 	struct wlan_dfs *dfs;
631*5113495bSYour Name 
632*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
633*5113495bSYour Name 	if (!dfs)
634*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
635*5113495bSYour Name 
636*5113495bSYour Name 	dfs_update_cur_chan_flags(dfs, flags, flagext);
637*5113495bSYour Name 
638*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
639*5113495bSYour Name }
640*5113495bSYour Name 
utils_dfs_get_max_phy_mode(struct wlan_objmgr_pdev * pdev,uint32_t * phy_mode)641*5113495bSYour Name static void utils_dfs_get_max_phy_mode(struct wlan_objmgr_pdev *pdev,
642*5113495bSYour Name 		uint32_t *phy_mode)
643*5113495bSYour Name {
644*5113495bSYour Name 	return;
645*5113495bSYour Name }
646*5113495bSYour Name 
utils_dfs_get_max_sup_width(struct wlan_objmgr_pdev * pdev,uint8_t * ch_width)647*5113495bSYour Name static void utils_dfs_get_max_sup_width(struct wlan_objmgr_pdev *pdev,
648*5113495bSYour Name 		uint8_t *ch_width)
649*5113495bSYour Name {
650*5113495bSYour Name 	return;
651*5113495bSYour Name }
652*5113495bSYour Name 
653*5113495bSYour Name #ifndef QCA_DFS_USE_POLICY_MANAGER
utils_dfs_get_chan_list(struct wlan_objmgr_pdev * pdev,void * clist,uint32_t * num_chan)654*5113495bSYour Name void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
655*5113495bSYour Name 			     void *clist, uint32_t *num_chan)
656*5113495bSYour Name {
657*5113495bSYour Name 	uint32_t i = 0, j = 0;
658*5113495bSYour Name 	enum channel_state state;
659*5113495bSYour Name 	struct regulatory_channel *cur_chan_list;
660*5113495bSYour Name 	struct wlan_dfs *dfs;
661*5113495bSYour Name 	struct dfs_channel *chan_list = (struct dfs_channel *)clist;
662*5113495bSYour Name 
663*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
664*5113495bSYour Name 	if (!dfs) {
665*5113495bSYour Name 		*num_chan = 0;
666*5113495bSYour Name 		return;
667*5113495bSYour Name 	}
668*5113495bSYour Name 
669*5113495bSYour Name 	cur_chan_list = qdf_mem_malloc(NUM_CHANNELS *
670*5113495bSYour Name 			sizeof(struct regulatory_channel));
671*5113495bSYour Name 	if (!cur_chan_list) {
672*5113495bSYour Name 		*num_chan = 0;
673*5113495bSYour Name 		return;
674*5113495bSYour Name 	}
675*5113495bSYour Name 
676*5113495bSYour Name 	if (wlan_reg_get_current_chan_list(
677*5113495bSYour Name 			pdev, cur_chan_list) != QDF_STATUS_SUCCESS) {
678*5113495bSYour Name 		*num_chan = 0;
679*5113495bSYour Name 		dfs_alert(dfs, WLAN_DEBUG_DFS_ALWAYS,
680*5113495bSYour Name 				"failed to get curr channel list");
681*5113495bSYour Name 		return;
682*5113495bSYour Name 	}
683*5113495bSYour Name 
684*5113495bSYour Name 	for (i = 0; i < NUM_CHANNELS; i++) {
685*5113495bSYour Name 		state = cur_chan_list[i].state;
686*5113495bSYour Name 		if (state == CHANNEL_STATE_DFS ||
687*5113495bSYour Name 				state == CHANNEL_STATE_ENABLE) {
688*5113495bSYour Name 			chan_list[j].dfs_ch_ieee = cur_chan_list[i].chan_num;
689*5113495bSYour Name 			chan_list[j].dfs_ch_freq = cur_chan_list[i].center_freq;
690*5113495bSYour Name 			if (state == CHANNEL_STATE_DFS)
691*5113495bSYour Name 				chan_list[j].dfs_ch_flagext =
692*5113495bSYour Name 					WLAN_CHAN_DFS;
693*5113495bSYour Name 
694*5113495bSYour Name 			if (cur_chan_list[i].nol_history)
695*5113495bSYour Name 				chan_list[j].dfs_ch_flagext |=
696*5113495bSYour Name 					WLAN_CHAN_HISTORY_RADAR;
697*5113495bSYour Name 			j++;
698*5113495bSYour Name 		}
699*5113495bSYour Name 	}
700*5113495bSYour Name 	*num_chan = j;
701*5113495bSYour Name 	qdf_mem_free(cur_chan_list);
702*5113495bSYour Name 
703*5113495bSYour Name 	return;
704*5113495bSYour Name }
705*5113495bSYour Name 
706*5113495bSYour Name /**
707*5113495bSYour Name  * utils_dfs_get_channel_list() - Get channel list from regdb component, based
708*5113495bSYour Name  * on current channel list.
709*5113495bSYour Name  * @pdev: Pointer to pdev structure.
710*5113495bSYour Name  * @vdev: vdev of request
711*5113495bSYour Name  * @chan_list: Pointer to channel list.
712*5113495bSYour Name  * @num_chan: number of channels.
713*5113495bSYour Name  *
714*5113495bSYour Name  * Get regdb channel list based on dfs current channel.
715*5113495bSYour Name  * Ex: When  AP is operating in 5GHz channel, filter 2.4GHz and 4.9GHZ channels
716*5113495bSYour Name  * so that the random channel function does not select either 2.4GHz or 4.9GHz
717*5113495bSYour Name  * channel.
718*5113495bSYour Name  */
719*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_dfs_get_channel_list(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_vdev * vdev,struct dfs_channel * chan_list,uint32_t * num_chan)720*5113495bSYour Name static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev,
721*5113495bSYour Name 				       struct wlan_objmgr_vdev *vdev,
722*5113495bSYour Name 				       struct dfs_channel *chan_list,
723*5113495bSYour Name 				       uint32_t *num_chan)
724*5113495bSYour Name {
725*5113495bSYour Name 	struct dfs_channel *tmp_chan_list = NULL;
726*5113495bSYour Name 	struct wlan_dfs *dfs;
727*5113495bSYour Name 	bool is_curchan_5g;
728*5113495bSYour Name 	bool is_curchan_24g;
729*5113495bSYour Name 	bool is_curchan_49g;
730*5113495bSYour Name 	bool is_inter_band_switch_allowed;
731*5113495bSYour Name 	uint8_t chan_num;
732*5113495bSYour Name 	uint16_t center_freq;
733*5113495bSYour Name 	uint16_t flagext;
734*5113495bSYour Name 	uint32_t i, j = 0;
735*5113495bSYour Name 
736*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
737*5113495bSYour Name 	if (!dfs) {
738*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs");
739*5113495bSYour Name 		return;
740*5113495bSYour Name 	}
741*5113495bSYour Name 
742*5113495bSYour Name 	tmp_chan_list = qdf_mem_malloc(*num_chan * sizeof(*tmp_chan_list));
743*5113495bSYour Name 	if (!tmp_chan_list)
744*5113495bSYour Name 		return;
745*5113495bSYour Name 
746*5113495bSYour Name 	utils_dfs_get_chan_list(pdev, (void *)tmp_chan_list, num_chan);
747*5113495bSYour Name 
748*5113495bSYour Name 	chan_num = dfs->dfs_curchan->dfs_ch_ieee;
749*5113495bSYour Name 	center_freq = dfs->dfs_curchan->dfs_ch_freq;
750*5113495bSYour Name 	is_curchan_5g = WLAN_REG_IS_5GHZ_CH_FREQ(center_freq);
751*5113495bSYour Name 	is_curchan_24g = WLAN_REG_IS_24GHZ_CH_FREQ(center_freq);
752*5113495bSYour Name 	is_curchan_49g = WLAN_REG_IS_49GHZ_FREQ(center_freq);
753*5113495bSYour Name 	is_inter_band_switch_allowed =
754*5113495bSYour Name 		dfs_mlme_is_inter_band_chan_switch_allowed(dfs->dfs_pdev_obj);
755*5113495bSYour Name 
756*5113495bSYour Name 	for (i = 0; i < *num_chan; i++) {
757*5113495bSYour Name 		chan_num = tmp_chan_list[i].dfs_ch_ieee;
758*5113495bSYour Name 		center_freq = tmp_chan_list[i].dfs_ch_freq;
759*5113495bSYour Name 		flagext = tmp_chan_list[i].dfs_ch_flagext;
760*5113495bSYour Name 		/* No change in prototype needed. Hence retaining same func */
761*5113495bSYour Name 		if (!dfs_mlme_check_allowed_prim_chanlist(pdev, center_freq))
762*5113495bSYour Name 			continue;
763*5113495bSYour Name 
764*5113495bSYour Name 		if (is_curchan_5g) {
765*5113495bSYour Name 			/*
766*5113495bSYour Name 			 * Always add 5G channels.
767*5113495bSYour Name 			 * If inter band is allowed, add 6G also.
768*5113495bSYour Name 			 */
769*5113495bSYour Name 			if (WLAN_REG_IS_5GHZ_CH_FREQ(center_freq) ||
770*5113495bSYour Name 			    (is_inter_band_switch_allowed &&
771*5113495bSYour Name 			     WLAN_REG_IS_6GHZ_CHAN_FREQ(center_freq))) {
772*5113495bSYour Name 				chan_list[j].dfs_ch_ieee = chan_num;
773*5113495bSYour Name 				chan_list[j].dfs_ch_freq = center_freq;
774*5113495bSYour Name 				chan_list[j].dfs_ch_flagext = flagext;
775*5113495bSYour Name 				j++;
776*5113495bSYour Name 			}
777*5113495bSYour Name 		} else if ((is_curchan_24g) &&
778*5113495bSYour Name 				WLAN_REG_IS_24GHZ_CH_FREQ(center_freq)) {
779*5113495bSYour Name 			chan_list[j].dfs_ch_ieee = chan_num;
780*5113495bSYour Name 			chan_list[j].dfs_ch_freq = center_freq;
781*5113495bSYour Name 			j++;
782*5113495bSYour Name 		} else if ((is_curchan_49g) &&
783*5113495bSYour Name 				WLAN_REG_IS_49GHZ_FREQ(center_freq)) {
784*5113495bSYour Name 			chan_list[j].dfs_ch_ieee = chan_num;
785*5113495bSYour Name 			chan_list[j].dfs_ch_freq = center_freq;
786*5113495bSYour Name 			j++;
787*5113495bSYour Name 		}
788*5113495bSYour Name 	}
789*5113495bSYour Name 
790*5113495bSYour Name 	*num_chan = j;
791*5113495bSYour Name 
792*5113495bSYour Name 	qdf_mem_free(tmp_chan_list);
793*5113495bSYour Name }
794*5113495bSYour Name #endif
795*5113495bSYour Name #else
utils_dfs_get_nol_history_chan_list(struct wlan_objmgr_pdev * pdev,void * clist,uint32_t * num_chan)796*5113495bSYour Name void utils_dfs_get_nol_history_chan_list(struct wlan_objmgr_pdev *pdev,
797*5113495bSYour Name 					 void *clist, uint32_t *num_chan)
798*5113495bSYour Name {
799*5113495bSYour Name 	utils_dfs_get_chan_list(pdev, clist, num_chan);
800*5113495bSYour Name }
801*5113495bSYour Name 
utils_dfs_get_channel_list(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_vdev * vdev,struct dfs_channel * chan_list,uint32_t * num_chan)802*5113495bSYour Name static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev,
803*5113495bSYour Name 				       struct wlan_objmgr_vdev *vdev,
804*5113495bSYour Name 				       struct dfs_channel *chan_list,
805*5113495bSYour Name 				       uint32_t *num_chan)
806*5113495bSYour Name {
807*5113495bSYour Name 	uint32_t pcl_ch[NUM_CHANNELS] = {0};
808*5113495bSYour Name 	uint8_t weight_list[NUM_CHANNELS] = {0};
809*5113495bSYour Name 	uint32_t len;
810*5113495bSYour Name 	uint32_t weight_len;
811*5113495bSYour Name 	uint32_t i;
812*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
813*5113495bSYour Name 	uint32_t conn_count = 0;
814*5113495bSYour Name 	enum policy_mgr_con_mode mode;
815*5113495bSYour Name 	uint8_t vdev_id = WLAN_INVALID_VDEV_ID;
816*5113495bSYour Name 	enum QDF_OPMODE op_mode;
817*5113495bSYour Name 
818*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
819*5113495bSYour Name 	if (!psoc) {
820*5113495bSYour Name 		*num_chan = 0;
821*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
822*5113495bSYour Name 		return;
823*5113495bSYour Name 	}
824*5113495bSYour Name 
825*5113495bSYour Name 	len = QDF_ARRAY_SIZE(pcl_ch);
826*5113495bSYour Name 	weight_len = QDF_ARRAY_SIZE(weight_list);
827*5113495bSYour Name 
828*5113495bSYour Name 	if (vdev) {
829*5113495bSYour Name 		vdev_id = wlan_vdev_get_id(vdev);
830*5113495bSYour Name 		op_mode = wlan_vdev_mlme_get_opmode(vdev);
831*5113495bSYour Name 		mode = policy_mgr_qdf_opmode_to_pm_con_mode(psoc, op_mode,
832*5113495bSYour Name 							    vdev_id);
833*5113495bSYour Name 	} else {
834*5113495bSYour Name 		mode = PM_SAP_MODE;
835*5113495bSYour Name 	}
836*5113495bSYour Name 	conn_count = policy_mgr_mode_specific_connection_count(
837*5113495bSYour Name 			psoc, mode, NULL);
838*5113495bSYour Name 	if (0 == conn_count)
839*5113495bSYour Name 		policy_mgr_get_pcl(psoc, mode, pcl_ch,
840*5113495bSYour Name 				   &len, weight_list, weight_len, vdev_id);
841*5113495bSYour Name 	else
842*5113495bSYour Name 		policy_mgr_get_pcl_for_existing_conn(
843*5113495bSYour Name 			psoc, mode, pcl_ch, &len, weight_list,
844*5113495bSYour Name 			weight_len, true, vdev_id);
845*5113495bSYour Name 
846*5113495bSYour Name 	if (*num_chan < len) {
847*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
848*5113495bSYour Name 				"Invalid len src=%d, dst=%d",
849*5113495bSYour Name 				*num_chan, len);
850*5113495bSYour Name 		*num_chan = 0;
851*5113495bSYour Name 		return;
852*5113495bSYour Name 	}
853*5113495bSYour Name 
854*5113495bSYour Name 	for (i = 0; i < len; i++) {
855*5113495bSYour Name 		chan_list[i].dfs_ch_ieee  =
856*5113495bSYour Name 			wlan_reg_freq_to_chan(pdev, pcl_ch[i]);
857*5113495bSYour Name 		chan_list[i].dfs_ch_freq  = pcl_ch[i];
858*5113495bSYour Name 		if (wlan_reg_is_dfs_for_freq(pdev, pcl_ch[i]))
859*5113495bSYour Name 			chan_list[i].dfs_ch_flagext |= WLAN_CHAN_DFS;
860*5113495bSYour Name 	}
861*5113495bSYour Name 	*num_chan = i;
862*5113495bSYour Name 	dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "num channels %d", i);
863*5113495bSYour Name }
864*5113495bSYour Name 
utils_dfs_get_chan_list(struct wlan_objmgr_pdev * pdev,void * clist,uint32_t * num_chan)865*5113495bSYour Name void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
866*5113495bSYour Name 			     void *clist, uint32_t *num_chan)
867*5113495bSYour Name {
868*5113495bSYour Name 	utils_dfs_get_channel_list(pdev, NULL, (struct dfs_channel *)clist,
869*5113495bSYour Name 				   num_chan);
870*5113495bSYour Name }
871*5113495bSYour Name 
utils_dfs_can_ignore_radar_event(struct wlan_objmgr_pdev * pdev)872*5113495bSYour Name bool utils_dfs_can_ignore_radar_event(struct wlan_objmgr_pdev *pdev)
873*5113495bSYour Name {
874*5113495bSYour Name 	return policy_mgr_get_can_skip_radar_event(
875*5113495bSYour Name 		wlan_pdev_get_psoc(pdev), INVALID_VDEV_ID);
876*5113495bSYour Name }
877*5113495bSYour Name #endif
878*5113495bSYour Name 
879*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_dfs_get_vdev_random_channel_for_freq(struct wlan_objmgr_pdev * pdev,struct wlan_objmgr_vdev * vdev,uint16_t flags,struct ch_params * chan_params,uint32_t * hw_mode,uint16_t * target_chan_freq,struct dfs_acs_info * acs_info)880*5113495bSYour Name QDF_STATUS utils_dfs_get_vdev_random_channel_for_freq(
881*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_vdev *vdev,
882*5113495bSYour Name 	uint16_t flags, struct ch_params *chan_params, uint32_t *hw_mode,
883*5113495bSYour Name 	uint16_t *target_chan_freq, struct dfs_acs_info *acs_info)
884*5113495bSYour Name {
885*5113495bSYour Name 	uint32_t dfs_reg;
886*5113495bSYour Name 	uint32_t num_chan = NUM_CHANNELS;
887*5113495bSYour Name 	struct wlan_dfs *dfs = NULL;
888*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
889*5113495bSYour Name 	struct dfs_channel *chan_list = NULL;
890*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
891*5113495bSYour Name 
892*5113495bSYour Name 	*target_chan_freq = 0;
893*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
894*5113495bSYour Name 	if (!psoc) {
895*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
896*5113495bSYour Name 		goto random_chan_error;
897*5113495bSYour Name 	}
898*5113495bSYour Name 
899*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
900*5113495bSYour Name 	if (!dfs) {
901*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
902*5113495bSYour Name 		goto random_chan_error;
903*5113495bSYour Name 	}
904*5113495bSYour Name 
905*5113495bSYour Name 	wlan_reg_get_dfs_region(pdev, &dfs_reg);
906*5113495bSYour Name 	chan_list = qdf_mem_malloc(num_chan * sizeof(*chan_list));
907*5113495bSYour Name 	if (!chan_list)
908*5113495bSYour Name 		goto random_chan_error;
909*5113495bSYour Name 
910*5113495bSYour Name 	utils_dfs_get_channel_list(pdev, vdev, chan_list, &num_chan);
911*5113495bSYour Name 	if (!num_chan) {
912*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "zero channels");
913*5113495bSYour Name 		goto random_chan_error;
914*5113495bSYour Name 	}
915*5113495bSYour Name 
916*5113495bSYour Name 	if (!chan_params->ch_width)
917*5113495bSYour Name 		utils_dfs_get_max_sup_width(pdev,
918*5113495bSYour Name 					    (uint8_t *)&chan_params->ch_width);
919*5113495bSYour Name 
920*5113495bSYour Name 	*target_chan_freq = dfs_prepare_random_channel_for_freq(
921*5113495bSYour Name 			dfs, chan_list, num_chan, flags, chan_params,
922*5113495bSYour Name 			(uint8_t)dfs_reg, acs_info);
923*5113495bSYour Name 
924*5113495bSYour Name 	dfs_info(dfs, WLAN_DEBUG_DFS_RANDOM_CHAN,
925*5113495bSYour Name 		 "input width=%d", chan_params->ch_width);
926*5113495bSYour Name 
927*5113495bSYour Name 	if (*target_chan_freq) {
928*5113495bSYour Name 		wlan_reg_set_channel_params_for_pwrmode(
929*5113495bSYour Name 						     pdev, *target_chan_freq, 0,
930*5113495bSYour Name 						     chan_params,
931*5113495bSYour Name 						     REG_CURRENT_PWR_MODE);
932*5113495bSYour Name 		utils_dfs_get_max_phy_mode(pdev, hw_mode);
933*5113495bSYour Name 		status = QDF_STATUS_SUCCESS;
934*5113495bSYour Name 	}
935*5113495bSYour Name 
936*5113495bSYour Name 	dfs_info(dfs, WLAN_DEBUG_DFS_RANDOM_CHAN,
937*5113495bSYour Name 		 "ch=%d, seg0=%d, seg1=%d, width=%d",
938*5113495bSYour Name 		 *target_chan_freq, chan_params->center_freq_seg0,
939*5113495bSYour Name 		 chan_params->center_freq_seg1, chan_params->ch_width);
940*5113495bSYour Name 
941*5113495bSYour Name random_chan_error:
942*5113495bSYour Name 	qdf_mem_free(chan_list);
943*5113495bSYour Name 
944*5113495bSYour Name 	return status;
945*5113495bSYour Name }
946*5113495bSYour Name 
947*5113495bSYour Name qdf_export_symbol(utils_dfs_get_vdev_random_channel_for_freq);
948*5113495bSYour Name #endif
949*5113495bSYour Name 
950*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_dfs_get_random_channel_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t flags,struct ch_params * ch_params,uint32_t * hw_mode,uint16_t * target_chan_freq,struct dfs_acs_info * acs_info)951*5113495bSYour Name QDF_STATUS utils_dfs_get_random_channel_for_freq(
952*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev,
953*5113495bSYour Name 	uint16_t flags,
954*5113495bSYour Name 	struct ch_params *ch_params,
955*5113495bSYour Name 	uint32_t *hw_mode,
956*5113495bSYour Name 	uint16_t *target_chan_freq,
957*5113495bSYour Name 	struct dfs_acs_info *acs_info)
958*5113495bSYour Name {
959*5113495bSYour Name 	return utils_dfs_get_vdev_random_channel_for_freq(pdev, NULL, flags,
960*5113495bSYour Name 							  ch_params, hw_mode,
961*5113495bSYour Name 							  target_chan_freq,
962*5113495bSYour Name 							  acs_info);
963*5113495bSYour Name }
964*5113495bSYour Name 
965*5113495bSYour Name qdf_export_symbol(utils_dfs_get_random_channel_for_freq);
966*5113495bSYour Name #endif
967*5113495bSYour Name 
968*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_dfs_bw_reduced_channel_for_freq(struct wlan_objmgr_pdev * pdev,struct ch_params * chan_params,uint32_t * hw_mode,uint16_t * target_chan_freq)969*5113495bSYour Name QDF_STATUS utils_dfs_bw_reduced_channel_for_freq(
970*5113495bSYour Name 						 struct wlan_objmgr_pdev *pdev,
971*5113495bSYour Name 						 struct ch_params *chan_params,
972*5113495bSYour Name 						 uint32_t *hw_mode,
973*5113495bSYour Name 						 uint16_t *target_chan_freq)
974*5113495bSYour Name {
975*5113495bSYour Name 	struct wlan_dfs *dfs = NULL;
976*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
977*5113495bSYour Name 	enum channel_state ch_state;
978*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
979*5113495bSYour Name 	struct dfs_channel *dfs_curchan;
980*5113495bSYour Name 
981*5113495bSYour Name 	*target_chan_freq = 0;
982*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
983*5113495bSYour Name 	if (!psoc) {
984*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
985*5113495bSYour Name 		return status;
986*5113495bSYour Name 	}
987*5113495bSYour Name 
988*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
989*5113495bSYour Name 	if (!dfs) {
990*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
991*5113495bSYour Name 		return status;
992*5113495bSYour Name 	}
993*5113495bSYour Name 	dfs_curchan = dfs->dfs_curchan;
994*5113495bSYour Name 	ch_state =
995*5113495bSYour Name 		wlan_reg_get_channel_state_for_pwrmode(pdev,
996*5113495bSYour Name 						       dfs_curchan->dfs_ch_freq,
997*5113495bSYour Name 						       REG_CURRENT_PWR_MODE);
998*5113495bSYour Name 
999*5113495bSYour Name 	if (ch_state == CHANNEL_STATE_DFS ||
1000*5113495bSYour Name 	    ch_state == CHANNEL_STATE_ENABLE) {
1001*5113495bSYour Name 		/* If the current channel is 80P80MHz and radar is detected on
1002*5113495bSYour Name 		 * the channel, the next highest bandwidth that maybe available
1003*5113495bSYour Name 		 * is 80MHz. Since the current regulatory algorithm reduces the
1004*5113495bSYour Name 		 * bandwidth from 80P80MHz to 160MHz, provide the channel
1005*5113495bSYour Name 		 * width as 80MHz if current channel is 80P80MHz.
1006*5113495bSYour Name 		 */
1007*5113495bSYour Name 		if (chan_params->ch_width == CH_WIDTH_80P80MHZ)
1008*5113495bSYour Name 			chan_params->ch_width = CH_WIDTH_80MHZ;
1009*5113495bSYour Name 
1010*5113495bSYour Name 		chan_params->mhz_freq_seg0 =
1011*5113495bSYour Name 			dfs_curchan->dfs_ch_mhz_freq_seg1;
1012*5113495bSYour Name 		chan_params->mhz_freq_seg1 =
1013*5113495bSYour Name 			dfs_curchan->dfs_ch_mhz_freq_seg2;
1014*5113495bSYour Name 		wlan_reg_set_channel_params_for_pwrmode(pdev, dfs_curchan->
1015*5113495bSYour Name 							dfs_ch_freq,
1016*5113495bSYour Name 							0, chan_params,
1017*5113495bSYour Name 							REG_CURRENT_PWR_MODE);
1018*5113495bSYour Name 
1019*5113495bSYour Name 		*target_chan_freq = dfs_curchan->dfs_ch_freq;
1020*5113495bSYour Name 		utils_dfs_get_max_phy_mode(pdev, hw_mode);
1021*5113495bSYour Name 
1022*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1023*5113495bSYour Name 	}
1024*5113495bSYour Name 
1025*5113495bSYour Name 	return status;
1026*5113495bSYour Name }
1027*5113495bSYour Name 
1028*5113495bSYour Name qdf_export_symbol(utils_dfs_bw_reduced_channel_for_freq);
1029*5113495bSYour Name #endif
1030*5113495bSYour Name 
1031*5113495bSYour Name 
1032*5113495bSYour Name #ifdef QCA_DFS_NOL_PLATFORM_DRV_SUPPORT
utils_dfs_init_nol(struct wlan_objmgr_pdev * pdev)1033*5113495bSYour Name void utils_dfs_init_nol(struct wlan_objmgr_pdev *pdev)
1034*5113495bSYour Name {
1035*5113495bSYour Name 	struct wlan_dfs *dfs;
1036*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
1037*5113495bSYour Name 	qdf_device_t qdf_dev;
1038*5113495bSYour Name 	struct dfs_nol_info *dfs_nolinfo;
1039*5113495bSYour Name 	int len;
1040*5113495bSYour Name 
1041*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1042*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
1043*5113495bSYour Name 	if (!dfs || !psoc) {
1044*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
1045*5113495bSYour Name 				"dfs %pK, psoc %pK", dfs, psoc);
1046*5113495bSYour Name 		return;
1047*5113495bSYour Name 	}
1048*5113495bSYour Name 
1049*5113495bSYour Name 	qdf_dev = psoc->soc_objmgr.qdf_dev;
1050*5113495bSYour Name 	if (!qdf_dev->dev) {
1051*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null device");
1052*5113495bSYour Name 		return;
1053*5113495bSYour Name 	}
1054*5113495bSYour Name 
1055*5113495bSYour Name 	dfs_nolinfo = qdf_mem_malloc(sizeof(*dfs_nolinfo));
1056*5113495bSYour Name 	if (!dfs_nolinfo)
1057*5113495bSYour Name 		return;
1058*5113495bSYour Name 
1059*5113495bSYour Name 	qdf_mem_zero(dfs_nolinfo, sizeof(*dfs_nolinfo));
1060*5113495bSYour Name 	len = pld_wlan_get_dfs_nol(qdf_dev->dev, (void *)dfs_nolinfo,
1061*5113495bSYour Name 				   (uint16_t)sizeof(*dfs_nolinfo));
1062*5113495bSYour Name 	if (len > 0) {
1063*5113495bSYour Name 		dfs_set_nol(dfs, dfs_nolinfo->dfs_nol, dfs_nolinfo->num_chans);
1064*5113495bSYour Name 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "nol channels in pld");
1065*5113495bSYour Name 		DFS_PRINT_NOL_LOCKED(dfs);
1066*5113495bSYour Name 	} else {
1067*5113495bSYour Name 		dfs_debug(dfs, WLAN_DEBUG_DFS_ALWAYS,  "no nol in pld");
1068*5113495bSYour Name 	}
1069*5113495bSYour Name 	qdf_mem_free(dfs_nolinfo);
1070*5113495bSYour Name }
1071*5113495bSYour Name qdf_export_symbol(utils_dfs_init_nol);
1072*5113495bSYour Name #endif
1073*5113495bSYour Name 
1074*5113495bSYour Name #ifndef QCA_DFS_NOL_PLATFORM_DRV_SUPPORT
utils_dfs_save_nol(struct wlan_objmgr_pdev * pdev)1075*5113495bSYour Name void utils_dfs_save_nol(struct wlan_objmgr_pdev *pdev)
1076*5113495bSYour Name {
1077*5113495bSYour Name }
1078*5113495bSYour Name #else
utils_dfs_save_nol(struct wlan_objmgr_pdev * pdev)1079*5113495bSYour Name void utils_dfs_save_nol(struct wlan_objmgr_pdev *pdev)
1080*5113495bSYour Name {
1081*5113495bSYour Name 	struct dfs_nol_info *dfs_nolinfo;
1082*5113495bSYour Name 	struct wlan_dfs *dfs = NULL;
1083*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
1084*5113495bSYour Name 	qdf_device_t qdf_dev;
1085*5113495bSYour Name 	int num_chans = 0;
1086*5113495bSYour Name 
1087*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1088*5113495bSYour Name 	if (!dfs) {
1089*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1090*5113495bSYour Name 		return;
1091*5113495bSYour Name 	}
1092*5113495bSYour Name 
1093*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
1094*5113495bSYour Name 	if (!psoc) {
1095*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
1096*5113495bSYour Name 		return;
1097*5113495bSYour Name 	}
1098*5113495bSYour Name 
1099*5113495bSYour Name 	qdf_dev = psoc->soc_objmgr.qdf_dev;
1100*5113495bSYour Name 	if (!qdf_dev->dev) {
1101*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null device");
1102*5113495bSYour Name 		return;
1103*5113495bSYour Name 	}
1104*5113495bSYour Name 
1105*5113495bSYour Name 	dfs_nolinfo = qdf_mem_malloc(sizeof(*dfs_nolinfo));
1106*5113495bSYour Name 	if (!dfs_nolinfo)
1107*5113495bSYour Name 		return;
1108*5113495bSYour Name 
1109*5113495bSYour Name 	qdf_mem_zero(dfs_nolinfo, sizeof(*dfs_nolinfo));
1110*5113495bSYour Name 	DFS_GET_NOL_LOCKED(dfs, dfs_nolinfo->dfs_nol, &num_chans);
1111*5113495bSYour Name 
1112*5113495bSYour Name 	if (num_chans > DFS_MAX_NOL_CHANNEL)
1113*5113495bSYour Name 		dfs_nolinfo->num_chans = DFS_MAX_NOL_CHANNEL;
1114*5113495bSYour Name 	else
1115*5113495bSYour Name 		dfs_nolinfo->num_chans = num_chans;
1116*5113495bSYour Name 
1117*5113495bSYour Name 	pld_wlan_set_dfs_nol(qdf_dev->dev, (void *)dfs_nolinfo,
1118*5113495bSYour Name 			     (uint16_t)sizeof(*dfs_nolinfo));
1119*5113495bSYour Name 	qdf_mem_free(dfs_nolinfo);
1120*5113495bSYour Name }
1121*5113495bSYour Name #endif
1122*5113495bSYour Name qdf_export_symbol(utils_dfs_save_nol);
1123*5113495bSYour Name 
utils_dfs_print_nol_channels(struct wlan_objmgr_pdev * pdev)1124*5113495bSYour Name void utils_dfs_print_nol_channels(struct wlan_objmgr_pdev *pdev)
1125*5113495bSYour Name {
1126*5113495bSYour Name 	struct wlan_dfs *dfs = NULL;
1127*5113495bSYour Name 
1128*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1129*5113495bSYour Name 	if (!dfs) {
1130*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1131*5113495bSYour Name 		return;
1132*5113495bSYour Name 	}
1133*5113495bSYour Name 
1134*5113495bSYour Name 	DFS_PRINT_NOL_LOCKED(dfs);
1135*5113495bSYour Name }
1136*5113495bSYour Name qdf_export_symbol(utils_dfs_print_nol_channels);
1137*5113495bSYour Name 
utils_dfs_clear_nol_channels(struct wlan_objmgr_pdev * pdev)1138*5113495bSYour Name void utils_dfs_clear_nol_channels(struct wlan_objmgr_pdev *pdev)
1139*5113495bSYour Name {
1140*5113495bSYour Name 	struct wlan_dfs *dfs = NULL;
1141*5113495bSYour Name 
1142*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1143*5113495bSYour Name 	if (!dfs) {
1144*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1145*5113495bSYour Name 		return;
1146*5113495bSYour Name 	}
1147*5113495bSYour Name 
1148*5113495bSYour Name 	/* First print list */
1149*5113495bSYour Name 	DFS_PRINT_NOL_LOCKED(dfs);
1150*5113495bSYour Name 
1151*5113495bSYour Name 	/* clear local cache first */
1152*5113495bSYour Name 	dfs_nol_timer_cleanup(dfs);
1153*5113495bSYour Name 	dfs_nol_update(dfs);
1154*5113495bSYour Name 
1155*5113495bSYour Name 	/*
1156*5113495bSYour Name 	 * update platform driver nol list with local cache which is zero,
1157*5113495bSYour Name 	 * cleared in above step, so this will clear list in platform driver.
1158*5113495bSYour Name 	 */
1159*5113495bSYour Name 	utils_dfs_save_nol(pdev);
1160*5113495bSYour Name }
1161*5113495bSYour Name qdf_export_symbol(utils_dfs_clear_nol_channels);
1162*5113495bSYour Name 
1163*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
utils_dfs_reg_update_nol_chan_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t * freq_list,uint8_t num_chan,bool nol_chan)1164*5113495bSYour Name void utils_dfs_reg_update_nol_chan_for_freq(struct wlan_objmgr_pdev *pdev,
1165*5113495bSYour Name 					  uint16_t *freq_list,
1166*5113495bSYour Name 					  uint8_t num_chan,
1167*5113495bSYour Name 					  bool nol_chan)
1168*5113495bSYour Name {
1169*5113495bSYour Name 	wlan_reg_update_nol_ch_for_freq(pdev, freq_list, num_chan, nol_chan);
1170*5113495bSYour Name }
1171*5113495bSYour Name 
1172*5113495bSYour Name qdf_export_symbol(utils_dfs_reg_update_nol_chan_for_freq);
1173*5113495bSYour Name #endif
1174*5113495bSYour Name 
1175*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
1176*5113495bSYour Name void
utils_dfs_reg_update_nol_history_chan_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t * freq_list,uint8_t num_chan,bool nol_history_chan)1177*5113495bSYour Name utils_dfs_reg_update_nol_history_chan_for_freq(struct wlan_objmgr_pdev *pdev,
1178*5113495bSYour Name 					       uint16_t *freq_list,
1179*5113495bSYour Name 					       uint8_t num_chan,
1180*5113495bSYour Name 					       bool nol_history_chan)
1181*5113495bSYour Name {
1182*5113495bSYour Name 	wlan_reg_update_nol_history_ch_for_freq(pdev, freq_list, num_chan,
1183*5113495bSYour Name 						nol_history_chan);
1184*5113495bSYour Name }
1185*5113495bSYour Name #endif
1186*5113495bSYour Name 
utils_dfs_freq_to_chan(uint32_t freq)1187*5113495bSYour Name uint8_t utils_dfs_freq_to_chan(uint32_t freq)
1188*5113495bSYour Name {
1189*5113495bSYour Name 	uint8_t chan;
1190*5113495bSYour Name 
1191*5113495bSYour Name 	if (freq == 0)
1192*5113495bSYour Name 		return 0;
1193*5113495bSYour Name 
1194*5113495bSYour Name 	if (freq > DFS_24_GHZ_BASE_FREQ && freq < DFS_CHAN_14_FREQ)
1195*5113495bSYour Name 		chan = ((freq - DFS_24_GHZ_BASE_FREQ) / DFS_CHAN_SPACING_5MHZ);
1196*5113495bSYour Name 	else if (freq == DFS_CHAN_14_FREQ)
1197*5113495bSYour Name 		chan = DFS_24_GHZ_CHANNEL_14;
1198*5113495bSYour Name 	else if ((freq > DFS_24_GHZ_BASE_FREQ) && (freq < DFS_5_GHZ_BASE_FREQ))
1199*5113495bSYour Name 		chan = (((freq - DFS_CHAN_15_FREQ) / DFS_CHAN_SPACING_20MHZ) +
1200*5113495bSYour Name 			DFS_24_GHZ_CHANNEL_15);
1201*5113495bSYour Name 	else
1202*5113495bSYour Name 		chan = (freq - DFS_5_GHZ_BASE_FREQ) / DFS_CHAN_SPACING_5MHZ;
1203*5113495bSYour Name 
1204*5113495bSYour Name 	return chan;
1205*5113495bSYour Name }
1206*5113495bSYour Name qdf_export_symbol(utils_dfs_freq_to_chan);
1207*5113495bSYour Name 
utils_dfs_chan_to_freq(uint8_t chan)1208*5113495bSYour Name uint32_t utils_dfs_chan_to_freq(uint8_t chan)
1209*5113495bSYour Name {
1210*5113495bSYour Name 	if (chan == 0)
1211*5113495bSYour Name 		return 0;
1212*5113495bSYour Name 
1213*5113495bSYour Name 	if (chan < DFS_24_GHZ_CHANNEL_14)
1214*5113495bSYour Name 		return DFS_24_GHZ_BASE_FREQ + (chan * DFS_CHAN_SPACING_5MHZ);
1215*5113495bSYour Name 	else if (chan == DFS_24_GHZ_CHANNEL_14)
1216*5113495bSYour Name 		return DFS_CHAN_14_FREQ;
1217*5113495bSYour Name 	else if (chan < DFS_24_GHZ_CHANNEL_27)
1218*5113495bSYour Name 		return DFS_CHAN_15_FREQ + ((chan - DFS_24_GHZ_CHANNEL_15) *
1219*5113495bSYour Name 				DFS_CHAN_SPACING_20MHZ);
1220*5113495bSYour Name 	else if (chan == DFS_5_GHZ_CHANNEL_170)
1221*5113495bSYour Name 		return DFS_CHAN_170_FREQ;
1222*5113495bSYour Name 	else
1223*5113495bSYour Name 		return DFS_5_GHZ_BASE_FREQ + (chan * DFS_CHAN_SPACING_5MHZ);
1224*5113495bSYour Name }
1225*5113495bSYour Name qdf_export_symbol(utils_dfs_chan_to_freq);
1226*5113495bSYour Name 
1227*5113495bSYour Name #ifdef MOBILE_DFS_SUPPORT
1228*5113495bSYour Name 
1229*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_chan_lst_sz,uint16_t * temp_freq_lst)1230*5113495bSYour Name QDF_STATUS utils_dfs_mark_leaking_chan_for_freq(struct wlan_objmgr_pdev *pdev,
1231*5113495bSYour Name 	enum phy_ch_width ch_width,
1232*5113495bSYour Name 	uint8_t temp_chan_lst_sz,
1233*5113495bSYour Name 	uint16_t *temp_freq_lst)
1234*5113495bSYour Name {
1235*5113495bSYour Name 	struct wlan_dfs *dfs = NULL;
1236*5113495bSYour Name 
1237*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1238*5113495bSYour Name 	if (!dfs) {
1239*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1240*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
1241*5113495bSYour Name 	}
1242*5113495bSYour Name 
1243*5113495bSYour Name 	return dfs_mark_leaking_chan_for_freq(dfs, ch_width, temp_chan_lst_sz,
1244*5113495bSYour Name 					    temp_freq_lst);
1245*5113495bSYour Name }
1246*5113495bSYour Name qdf_export_symbol(utils_dfs_mark_leaking_chan_for_freq);
1247*5113495bSYour Name #endif
1248*5113495bSYour Name #endif
1249*5113495bSYour Name 
utils_get_dfsdomain(struct wlan_objmgr_pdev * pdev)1250*5113495bSYour Name int utils_get_dfsdomain(struct wlan_objmgr_pdev *pdev)
1251*5113495bSYour Name {
1252*5113495bSYour Name 	enum dfs_reg dfsdomain;
1253*5113495bSYour Name 
1254*5113495bSYour Name 	wlan_reg_get_dfs_region(pdev, &dfsdomain);
1255*5113495bSYour Name 
1256*5113495bSYour Name 	return dfsdomain;
1257*5113495bSYour Name }
1258*5113495bSYour Name 
1259*5113495bSYour Name #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
utils_dfs_is_spoof_check_failed(struct wlan_objmgr_pdev * pdev,bool * is_spoof_check_failed)1260*5113495bSYour Name QDF_STATUS utils_dfs_is_spoof_check_failed(struct wlan_objmgr_pdev *pdev,
1261*5113495bSYour Name 					   bool *is_spoof_check_failed)
1262*5113495bSYour Name {
1263*5113495bSYour Name 	struct wlan_dfs *dfs;
1264*5113495bSYour Name 
1265*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
1266*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1267*5113495bSYour Name 
1268*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1269*5113495bSYour Name 	if (!dfs) {
1270*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is null");
1271*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
1272*5113495bSYour Name 	}
1273*5113495bSYour Name 
1274*5113495bSYour Name 	*is_spoof_check_failed = dfs->dfs_spoof_check_failed;
1275*5113495bSYour Name 
1276*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1277*5113495bSYour Name }
1278*5113495bSYour Name 
1279*5113495bSYour Name qdf_export_symbol(utils_dfs_is_spoof_check_failed);
1280*5113495bSYour Name 
utils_dfs_is_spoof_done(struct wlan_objmgr_pdev * pdev)1281*5113495bSYour Name bool utils_dfs_is_spoof_done(struct wlan_objmgr_pdev *pdev)
1282*5113495bSYour Name {
1283*5113495bSYour Name 	struct wlan_dfs *dfs;
1284*5113495bSYour Name 
1285*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1286*5113495bSYour Name 	if (!dfs)
1287*5113495bSYour Name 		return false;
1288*5113495bSYour Name 
1289*5113495bSYour Name 	if (lmac_is_host_dfs_check_support_enabled(dfs->dfs_pdev_obj) &&
1290*5113495bSYour Name 	    utils_get_dfsdomain(dfs->dfs_pdev_obj) == DFS_FCC_DOMAIN)
1291*5113495bSYour Name 		return !!dfs->dfs_spoof_test_done;
1292*5113495bSYour Name 	return true;
1293*5113495bSYour Name }
1294*5113495bSYour Name #endif
1295*5113495bSYour Name 
dfs_get_num_chans(void)1296*5113495bSYour Name int dfs_get_num_chans(void)
1297*5113495bSYour Name {
1298*5113495bSYour Name 	return NUM_CHANNELS;
1299*5113495bSYour Name }
1300*5113495bSYour Name 
1301*5113495bSYour Name #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
utils_dfs_get_disable_radar_marking(struct wlan_objmgr_pdev * pdev,bool * disable_radar_marking)1302*5113495bSYour Name QDF_STATUS utils_dfs_get_disable_radar_marking(struct wlan_objmgr_pdev *pdev,
1303*5113495bSYour Name 					       bool *disable_radar_marking)
1304*5113495bSYour Name {
1305*5113495bSYour Name 	struct wlan_dfs *dfs;
1306*5113495bSYour Name 
1307*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
1308*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
1309*5113495bSYour Name 
1310*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1311*5113495bSYour Name 	if (!dfs) {
1312*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is null");
1313*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
1314*5113495bSYour Name 	}
1315*5113495bSYour Name 
1316*5113495bSYour Name 	*disable_radar_marking = dfs_get_disable_radar_marking(dfs);
1317*5113495bSYour Name 
1318*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1319*5113495bSYour Name }
1320*5113495bSYour Name 
1321*5113495bSYour Name qdf_export_symbol(utils_dfs_get_disable_radar_marking);
1322*5113495bSYour Name #endif
1323*5113495bSYour Name 
utils_is_dfs_cfreq2_ch(struct wlan_objmgr_pdev * pdev)1324*5113495bSYour Name bool utils_is_dfs_cfreq2_ch(struct wlan_objmgr_pdev *pdev)
1325*5113495bSYour Name {
1326*5113495bSYour Name 	struct wlan_dfs *dfs;
1327*5113495bSYour Name 
1328*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1329*5113495bSYour Name 	if (!dfs)
1330*5113495bSYour Name 		return false;
1331*5113495bSYour Name 
1332*5113495bSYour Name 	return WLAN_IS_CHAN_DFS_CFREQ2(dfs->dfs_curchan);
1333*5113495bSYour Name }
1334*5113495bSYour Name 
1335*5113495bSYour Name qdf_export_symbol(utils_is_dfs_cfreq2_ch);
1336*5113495bSYour Name 
utils_dfs_deliver_event(struct wlan_objmgr_pdev * pdev,uint16_t freq,enum WLAN_DFS_EVENTS event)1337*5113495bSYour Name void utils_dfs_deliver_event(struct wlan_objmgr_pdev *pdev, uint16_t freq,
1338*5113495bSYour Name 			     enum WLAN_DFS_EVENTS event)
1339*5113495bSYour Name {
1340*5113495bSYour Name 	if (global_dfs_to_mlme.mlme_dfs_deliver_event)
1341*5113495bSYour Name 		global_dfs_to_mlme.mlme_dfs_deliver_event(pdev, freq, event);
1342*5113495bSYour Name }
1343*5113495bSYour Name 
utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev * pdev)1344*5113495bSYour Name void utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev *pdev)
1345*5113495bSYour Name {
1346*5113495bSYour Name 	struct wlan_dfs *dfs;
1347*5113495bSYour Name 
1348*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
1349*5113495bSYour Name 		return;
1350*5113495bSYour Name 
1351*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1352*5113495bSYour Name 	if (!dfs) {
1353*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is null");
1354*5113495bSYour Name 		return;
1355*5113495bSYour Name 	}
1356*5113495bSYour Name 
1357*5113495bSYour Name 	dfs_reset_dfs_prevchan(dfs);
1358*5113495bSYour Name }
1359*5113495bSYour Name 
1360*5113495bSYour Name #ifdef QCA_SUPPORT_AGILE_DFS
1361*5113495bSYour Name 
utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev * pdev,enum dfs_agile_sm_evt event)1362*5113495bSYour Name void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
1363*5113495bSYour Name 				    enum dfs_agile_sm_evt event)
1364*5113495bSYour Name {
1365*5113495bSYour Name 	struct wlan_dfs *dfs;
1366*5113495bSYour Name 	void *event_data;
1367*5113495bSYour Name 	struct dfs_soc_priv_obj *dfs_soc_obj;
1368*5113495bSYour Name 
1369*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
1370*5113495bSYour Name 		return;
1371*5113495bSYour Name 
1372*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1373*5113495bSYour Name 	if (!dfs) {
1374*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is null");
1375*5113495bSYour Name 		return;
1376*5113495bSYour Name 	}
1377*5113495bSYour Name 
1378*5113495bSYour Name 	if (!dfs_is_agile_cac_enabled(dfs))
1379*5113495bSYour Name 		return;
1380*5113495bSYour Name 
1381*5113495bSYour Name 	dfs_soc_obj = dfs->dfs_soc_obj;
1382*5113495bSYour Name 	dfs_soc_obj->dfs_priv[dfs->dfs_psoc_idx].agile_precac_active = true;
1383*5113495bSYour Name 	event_data = (void *)dfs;
1384*5113495bSYour Name 
1385*5113495bSYour Name 	dfs_agile_sm_deliver_evt(dfs->dfs_soc_obj,
1386*5113495bSYour Name 				 event,
1387*5113495bSYour Name 				 0,
1388*5113495bSYour Name 				 event_data);
1389*5113495bSYour Name }
1390*5113495bSYour Name #endif
1391*5113495bSYour Name 
1392*5113495bSYour Name #ifdef QCA_SUPPORT_ADFS_RCAC
utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev * pdev,struct ch_params * chan_params,qdf_freq_t * target_chan_freq)1393*5113495bSYour Name QDF_STATUS utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev *pdev,
1394*5113495bSYour Name 				      struct ch_params *chan_params,
1395*5113495bSYour Name 				      qdf_freq_t *target_chan_freq)
1396*5113495bSYour Name {
1397*5113495bSYour Name 	struct wlan_dfs *dfs = NULL;
1398*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
1399*5113495bSYour Name 
1400*5113495bSYour Name 	if (!target_chan_freq)
1401*5113495bSYour Name 		return status;
1402*5113495bSYour Name 
1403*5113495bSYour Name 	*target_chan_freq = 0;
1404*5113495bSYour Name 
1405*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1406*5113495bSYour Name 	if (!dfs) {
1407*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1408*5113495bSYour Name 		return status;
1409*5113495bSYour Name 	}
1410*5113495bSYour Name 
1411*5113495bSYour Name 	if (!dfs_is_agile_rcac_enabled(dfs))
1412*5113495bSYour Name 		return status;
1413*5113495bSYour Name 
1414*5113495bSYour Name 	*target_chan_freq = dfs->dfs_rcac_param.rcac_pri_freq;
1415*5113495bSYour Name 
1416*5113495bSYour Name 	/* Do not modify the input ch_params if no RCAC channel is present. */
1417*5113495bSYour Name 	if (!*target_chan_freq)
1418*5113495bSYour Name 		return status;
1419*5113495bSYour Name 
1420*5113495bSYour Name 	*chan_params = dfs->dfs_rcac_param.rcac_ch_params;
1421*5113495bSYour Name 
1422*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1423*5113495bSYour Name }
1424*5113495bSYour Name #endif
1425*5113495bSYour Name 
1426*5113495bSYour Name #ifdef ATH_SUPPORT_ZERO_CAC_DFS
1427*5113495bSYour Name enum precac_status_for_chan
utils_dfs_precac_status_for_channel(struct wlan_objmgr_pdev * pdev,struct wlan_channel * deschan)1428*5113495bSYour Name utils_dfs_precac_status_for_channel(struct wlan_objmgr_pdev *pdev,
1429*5113495bSYour Name 				    struct wlan_channel *deschan)
1430*5113495bSYour Name {
1431*5113495bSYour Name 	struct wlan_dfs *dfs;
1432*5113495bSYour Name 	struct dfs_channel chan;
1433*5113495bSYour Name 
1434*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1435*5113495bSYour Name 	if (!dfs)
1436*5113495bSYour Name 		return false;
1437*5113495bSYour Name 
1438*5113495bSYour Name 	dfs_fill_chan_info(&chan, deschan);
1439*5113495bSYour Name 
1440*5113495bSYour Name 	return dfs_precac_status_for_channel(dfs, &chan);
1441*5113495bSYour Name }
1442*5113495bSYour Name #endif
1443*5113495bSYour Name 
1444*5113495bSYour Name #if defined(WLAN_DISP_CHAN_INFO)
1445*5113495bSYour Name #define FIRST_DFS_CHAN_NUM  52
1446*5113495bSYour Name #define CHAN_NUM_SPACING     4
1447*5113495bSYour Name #define INVALID_INDEX     (-1)
1448*5113495bSYour Name 
utils_dfs_convert_freq_to_index(qdf_freq_t freq,int8_t * index)1449*5113495bSYour Name void utils_dfs_convert_freq_to_index(qdf_freq_t freq, int8_t *index)
1450*5113495bSYour Name {
1451*5113495bSYour Name 	uint16_t chan_num;
1452*5113495bSYour Name 	int8_t tmp_index;
1453*5113495bSYour Name 
1454*5113495bSYour Name 	chan_num = (freq - WLAN_5_GHZ_BASE_FREQ) / WLAN_CHAN_SPACING_5MHZ;
1455*5113495bSYour Name 	tmp_index = (chan_num - FIRST_DFS_CHAN_NUM) / CHAN_NUM_SPACING;
1456*5113495bSYour Name 	*index = ((tmp_index >= 0) && (tmp_index < NUM_DFS_CHANS)) ?
1457*5113495bSYour Name 		  tmp_index : INVALID_INDEX;
1458*5113495bSYour Name }
1459*5113495bSYour Name 
1460*5113495bSYour Name /**
1461*5113495bSYour Name  * utils_dfs_update_chan_state_array_element() - Update the per dfs channel
1462*5113495bSYour Name  * state array element indexed by the frequency with the new state.
1463*5113495bSYour Name  * @dfs: DFS context
1464*5113495bSYour Name  * @freq: Input DFS Channel frequency which will converted to channel state
1465*5113495bSYour Name  * array index.
1466*5113495bSYour Name  * @state: Input DFS state with which the value indexed by frequency will be
1467*5113495bSYour Name  * updated with.
1468*5113495bSYour Name  *
1469*5113495bSYour Name  * Return: QDF_STATUS
1470*5113495bSYour Name  */
1471*5113495bSYour Name static QDF_STATUS
utils_dfs_update_chan_state_array_element(struct wlan_dfs * dfs,qdf_freq_t freq,enum channel_dfs_state state)1472*5113495bSYour Name utils_dfs_update_chan_state_array_element(struct wlan_dfs *dfs,
1473*5113495bSYour Name 					  qdf_freq_t freq,
1474*5113495bSYour Name 					  enum channel_dfs_state state)
1475*5113495bSYour Name {
1476*5113495bSYour Name 	int8_t index;
1477*5113495bSYour Name 	enum channel_enum chan_enum;
1478*5113495bSYour Name 
1479*5113495bSYour Name 	if (state == CH_DFS_S_INVALID)
1480*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1481*5113495bSYour Name 
1482*5113495bSYour Name 	chan_enum = wlan_reg_get_chan_enum_for_freq(freq);
1483*5113495bSYour Name 	/* Do not send DFS events on invalid IEEE channels */
1484*5113495bSYour Name 	if (chan_enum == INVALID_CHANNEL)
1485*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1486*5113495bSYour Name 
1487*5113495bSYour Name 	utils_dfs_convert_freq_to_index(freq, &index);
1488*5113495bSYour Name 
1489*5113495bSYour Name 	if (index == INVALID_INDEX)
1490*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
1491*5113495bSYour Name 
1492*5113495bSYour Name 	dfs->dfs_channel_state_array[index] = state;
1493*5113495bSYour Name 
1494*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1495*5113495bSYour Name }
1496*5113495bSYour Name 
dfs_init_chan_state_array(struct wlan_objmgr_pdev * pdev)1497*5113495bSYour Name QDF_STATUS dfs_init_chan_state_array(struct wlan_objmgr_pdev *pdev)
1498*5113495bSYour Name {
1499*5113495bSYour Name 	struct regulatory_channel *cur_chan_list;
1500*5113495bSYour Name 	struct wlan_dfs *dfs;
1501*5113495bSYour Name 	int i;
1502*5113495bSYour Name 
1503*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1504*5113495bSYour Name 	if (!dfs)
1505*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1506*5113495bSYour Name 
1507*5113495bSYour Name 	cur_chan_list = qdf_mem_malloc(NUM_CHANNELS *
1508*5113495bSYour Name 			sizeof(struct regulatory_channel));
1509*5113495bSYour Name 	if (!cur_chan_list)
1510*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
1511*5113495bSYour Name 
1512*5113495bSYour Name 	if (wlan_reg_get_current_chan_list(
1513*5113495bSYour Name 				pdev, cur_chan_list) != QDF_STATUS_SUCCESS) {
1514*5113495bSYour Name 		qdf_mem_free(cur_chan_list);
1515*5113495bSYour Name 		dfs_alert(dfs, WLAN_DEBUG_DFS_ALWAYS,
1516*5113495bSYour Name 			  "failed to get curr channel list");
1517*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1518*5113495bSYour Name 	}
1519*5113495bSYour Name 
1520*5113495bSYour Name 	for (i = 0; i < NUM_CHANNELS; i++) {
1521*5113495bSYour Name 		qdf_freq_t freq = cur_chan_list[i].center_freq;
1522*5113495bSYour Name 
1523*5113495bSYour Name 		if (!IS_CHAN_DFS(cur_chan_list[i].chan_flags))
1524*5113495bSYour Name 			continue;
1525*5113495bSYour Name 
1526*5113495bSYour Name 		utils_dfs_update_chan_state_array_element(dfs,
1527*5113495bSYour Name 							  freq,
1528*5113495bSYour Name 							  CH_DFS_S_CAC_REQ);
1529*5113495bSYour Name 	}
1530*5113495bSYour Name 
1531*5113495bSYour Name 	qdf_mem_free(cur_chan_list);
1532*5113495bSYour Name 	qdf_err("channel state array initialized");
1533*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1534*5113495bSYour Name }
1535*5113495bSYour Name 
utils_dfs_get_chan_dfs_state(struct wlan_objmgr_pdev * pdev,enum channel_dfs_state * dfs_ch_s)1536*5113495bSYour Name QDF_STATUS utils_dfs_get_chan_dfs_state(struct wlan_objmgr_pdev *pdev,
1537*5113495bSYour Name 					enum channel_dfs_state *dfs_ch_s)
1538*5113495bSYour Name {
1539*5113495bSYour Name 	struct wlan_dfs *dfs;
1540*5113495bSYour Name 
1541*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1542*5113495bSYour Name 
1543*5113495bSYour Name 	if (!dfs)
1544*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1545*5113495bSYour Name 
1546*5113495bSYour Name 	qdf_mem_copy(dfs_ch_s,
1547*5113495bSYour Name 		     dfs->dfs_channel_state_array,
1548*5113495bSYour Name 		     sizeof(dfs->dfs_channel_state_array));
1549*5113495bSYour Name 
1550*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1551*5113495bSYour Name }
1552*5113495bSYour Name 
1553*5113495bSYour Name qdf_export_symbol(utils_dfs_get_chan_dfs_state);
1554*5113495bSYour Name 
1555*5113495bSYour Name /**
1556*5113495bSYour Name  * convert_event_to_state() - Converts the dfs events WLAN_DFS_EVENTS to dfs
1557*5113495bSYour Name  * states channel_dfs_state.
1558*5113495bSYour Name  * @event: Input DFS event.
1559*5113495bSYour Name  * @state: Output DFS state.
1560*5113495bSYour Name  *
1561*5113495bSYour Name  * Return: void.
1562*5113495bSYour Name  */
1563*5113495bSYour Name static
convert_event_to_state(enum WLAN_DFS_EVENTS event,enum channel_dfs_state * state)1564*5113495bSYour Name void convert_event_to_state(enum WLAN_DFS_EVENTS event,
1565*5113495bSYour Name 			    enum channel_dfs_state *state)
1566*5113495bSYour Name {
1567*5113495bSYour Name 	static const
1568*5113495bSYour Name 	enum channel_dfs_state ev_to_state[WLAN_EV_PCAC_COMPLETED + 1] = {
1569*5113495bSYour Name 	[WLAN_EV_RADAR_DETECTED] = CH_DFS_S_INVALID,
1570*5113495bSYour Name 	[WLAN_EV_CAC_RESET]      = CH_DFS_S_CAC_REQ,
1571*5113495bSYour Name 	[WLAN_EV_CAC_STARTED]    = CH_DFS_S_CAC_STARTED,
1572*5113495bSYour Name 	[WLAN_EV_CAC_COMPLETED]  = CH_DFS_S_CAC_COMPLETED,
1573*5113495bSYour Name 	[WLAN_EV_NOL_STARTED]    = CH_DFS_S_NOL,
1574*5113495bSYour Name 	[WLAN_EV_NOL_FINISHED]   = CH_DFS_S_CAC_REQ,
1575*5113495bSYour Name 	[WLAN_EV_PCAC_STARTED]   = CH_DFS_S_PRECAC_STARTED,
1576*5113495bSYour Name 	[WLAN_EV_PCAC_COMPLETED] = CH_DFS_S_PRECAC_COMPLETED,
1577*5113495bSYour Name 	};
1578*5113495bSYour Name 
1579*5113495bSYour Name 	*state = ev_to_state[event];
1580*5113495bSYour Name }
1581*5113495bSYour Name 
utils_dfs_update_chan_state_array(struct wlan_objmgr_pdev * pdev,qdf_freq_t freq,enum WLAN_DFS_EVENTS event)1582*5113495bSYour Name QDF_STATUS utils_dfs_update_chan_state_array(struct wlan_objmgr_pdev *pdev,
1583*5113495bSYour Name 					     qdf_freq_t freq,
1584*5113495bSYour Name 					     enum WLAN_DFS_EVENTS event)
1585*5113495bSYour Name {
1586*5113495bSYour Name 	enum channel_dfs_state state;
1587*5113495bSYour Name 	struct wlan_dfs *dfs;
1588*5113495bSYour Name 
1589*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1590*5113495bSYour Name 	if (!dfs)
1591*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
1592*5113495bSYour Name 
1593*5113495bSYour Name 	convert_event_to_state(event, &state);
1594*5113495bSYour Name 	return utils_dfs_update_chan_state_array_element(dfs, freq, state);
1595*5113495bSYour Name }
1596*5113495bSYour Name #endif /* WLAN_DISP_CHAN_INFO */
1597*5113495bSYour Name 
utils_dfs_radar_enable(struct wlan_objmgr_pdev * pdev)1598*5113495bSYour Name QDF_STATUS utils_dfs_radar_enable(struct wlan_objmgr_pdev *pdev)
1599*5113495bSYour Name {
1600*5113495bSYour Name 	return tgt_dfs_radar_enable(pdev, 0, 0, true);
1601*5113495bSYour Name }
1602*5113495bSYour Name 
1603*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
1604*5113495bSYour Name enum phy_ch_width
utils_dfs_convert_wlan_phymode_to_chwidth(enum wlan_phymode phymode)1605*5113495bSYour Name utils_dfs_convert_wlan_phymode_to_chwidth(enum wlan_phymode phymode)
1606*5113495bSYour Name {
1607*5113495bSYour Name 		switch (phymode) {
1608*5113495bSYour Name 		case WLAN_PHYMODE_11NA_HT20:
1609*5113495bSYour Name 		case WLAN_PHYMODE_11NG_HT20:
1610*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT20:
1611*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT20_2G:
1612*5113495bSYour Name 		case WLAN_PHYMODE_11AXA_HE20:
1613*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE20:
1614*5113495bSYour Name 		case WLAN_PHYMODE_11BEG_EHT20:
1615*5113495bSYour Name 		case WLAN_PHYMODE_11BEA_EHT20:
1616*5113495bSYour Name 			return CH_WIDTH_20MHZ;
1617*5113495bSYour Name 		case WLAN_PHYMODE_11NA_HT40:
1618*5113495bSYour Name 		case WLAN_PHYMODE_11NG_HT40PLUS:
1619*5113495bSYour Name 		case WLAN_PHYMODE_11NG_HT40MINUS:
1620*5113495bSYour Name 		case WLAN_PHYMODE_11NG_HT40:
1621*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT40:
1622*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT40PLUS_2G:
1623*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT40MINUS_2G:
1624*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT40_2G:
1625*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE40PLUS:
1626*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE40MINUS:
1627*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE40:
1628*5113495bSYour Name 		case WLAN_PHYMODE_11BEA_EHT40:
1629*5113495bSYour Name 		case WLAN_PHYMODE_11BEG_EHT40PLUS:
1630*5113495bSYour Name 		case WLAN_PHYMODE_11BEG_EHT40MINUS:
1631*5113495bSYour Name 		case WLAN_PHYMODE_11BEG_EHT40:
1632*5113495bSYour Name 			return CH_WIDTH_40MHZ;
1633*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT80:
1634*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT80_2G:
1635*5113495bSYour Name 		case WLAN_PHYMODE_11AXA_HE80:
1636*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE80:
1637*5113495bSYour Name 		case WLAN_PHYMODE_11BEA_EHT80:
1638*5113495bSYour Name 			return CH_WIDTH_80MHZ;
1639*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT160:
1640*5113495bSYour Name 		case WLAN_PHYMODE_11AXA_HE160:
1641*5113495bSYour Name 		case WLAN_PHYMODE_11BEA_EHT160:
1642*5113495bSYour Name 			return CH_WIDTH_160MHZ;
1643*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT80_80:
1644*5113495bSYour Name 		case WLAN_PHYMODE_11AXA_HE80_80:
1645*5113495bSYour Name 			return CH_WIDTH_80P80MHZ;
1646*5113495bSYour Name 		case WLAN_PHYMODE_11BEA_EHT320:
1647*5113495bSYour Name 			return CH_WIDTH_320MHZ;
1648*5113495bSYour Name 		default:
1649*5113495bSYour Name 			return CH_WIDTH_INVALID;
1650*5113495bSYour Name 		}
1651*5113495bSYour Name }
1652*5113495bSYour Name #else
1653*5113495bSYour Name enum phy_ch_width
utils_dfs_convert_wlan_phymode_to_chwidth(enum wlan_phymode phymode)1654*5113495bSYour Name utils_dfs_convert_wlan_phymode_to_chwidth(enum wlan_phymode phymode)
1655*5113495bSYour Name {
1656*5113495bSYour Name 		switch (phymode) {
1657*5113495bSYour Name 		case WLAN_PHYMODE_11NA_HT20:
1658*5113495bSYour Name 		case WLAN_PHYMODE_11NG_HT20:
1659*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT20:
1660*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT20_2G:
1661*5113495bSYour Name 		case WLAN_PHYMODE_11AXA_HE20:
1662*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE20:
1663*5113495bSYour Name 			return CH_WIDTH_20MHZ;
1664*5113495bSYour Name 		case WLAN_PHYMODE_11NA_HT40:
1665*5113495bSYour Name 		case WLAN_PHYMODE_11NG_HT40PLUS:
1666*5113495bSYour Name 		case WLAN_PHYMODE_11NG_HT40MINUS:
1667*5113495bSYour Name 		case WLAN_PHYMODE_11NG_HT40:
1668*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT40:
1669*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT40PLUS_2G:
1670*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT40MINUS_2G:
1671*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT40_2G:
1672*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE40PLUS:
1673*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE40MINUS:
1674*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE40:
1675*5113495bSYour Name 			return CH_WIDTH_40MHZ;
1676*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT80:
1677*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT80_2G:
1678*5113495bSYour Name 		case WLAN_PHYMODE_11AXA_HE80:
1679*5113495bSYour Name 		case WLAN_PHYMODE_11AXG_HE80:
1680*5113495bSYour Name 			return CH_WIDTH_80MHZ;
1681*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT160:
1682*5113495bSYour Name 		case WLAN_PHYMODE_11AXA_HE160:
1683*5113495bSYour Name 			return CH_WIDTH_160MHZ;
1684*5113495bSYour Name 		case WLAN_PHYMODE_11AC_VHT80_80:
1685*5113495bSYour Name 		case WLAN_PHYMODE_11AXA_HE80_80:
1686*5113495bSYour Name 			return CH_WIDTH_80P80MHZ;
1687*5113495bSYour Name 		default:
1688*5113495bSYour Name 			return CH_WIDTH_INVALID;
1689*5113495bSYour Name 		}
1690*5113495bSYour Name }
1691*5113495bSYour Name #endif
1692*5113495bSYour Name 
1693*5113495bSYour Name #if defined(WLAN_FEATURE_11BE) && defined(QCA_DFS_BW_EXPAND) && \
1694*5113495bSYour Name 	defined(QCA_DFS_RCSA_SUPPORT)
1695*5113495bSYour Name 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)1696*5113495bSYour Name utils_dfs_get_radar_bitmap_from_nolie(struct wlan_objmgr_pdev *pdev,
1697*5113495bSYour Name 				      enum wlan_phymode phy_mode,
1698*5113495bSYour Name 				      qdf_freq_t nol_ie_start_freq,
1699*5113495bSYour Name 				      uint8_t nol_ie_bitmap)
1700*5113495bSYour Name {
1701*5113495bSYour Name 	struct wlan_dfs *dfs;
1702*5113495bSYour Name 
1703*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
1704*5113495bSYour Name 	if (!dfs)
1705*5113495bSYour Name 		return 0;
1706*5113495bSYour Name 
1707*5113495bSYour Name 	return dfs_get_radar_bitmap_from_nolie(dfs, phy_mode, nol_ie_start_freq,
1708*5113495bSYour Name 					       nol_ie_bitmap);
1709*5113495bSYour Name }
1710*5113495bSYour Name #endif
1711