xref: /wlan-driver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_ucfg_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) 2022 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 
26*5113495bSYour Name #include "wlan_dfs_ucfg_api.h"
27*5113495bSYour Name #include "wlan_dfs_init_deinit_api.h"
28*5113495bSYour Name #include "../../core/src/dfs.h"
29*5113495bSYour Name #include "../../core/src/dfs_zero_cac.h"
30*5113495bSYour Name #include "../../core/src/dfs_partial_offload_radar.h"
31*5113495bSYour Name #include "../../core/src/dfs_process_radar_found_ind.h"
32*5113495bSYour Name #include <qdf_module.h>
33*5113495bSYour Name 
ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev * pdev,int * is_ap_cac_timer_running)34*5113495bSYour Name QDF_STATUS ucfg_dfs_is_ap_cac_timer_running(struct wlan_objmgr_pdev *pdev,
35*5113495bSYour Name 		int *is_ap_cac_timer_running)
36*5113495bSYour Name {
37*5113495bSYour Name 	struct wlan_dfs *dfs;
38*5113495bSYour Name 
39*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
40*5113495bSYour Name 	if (!dfs)
41*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
42*5113495bSYour Name 
43*5113495bSYour Name 	*is_ap_cac_timer_running = dfs_is_ap_cac_timer_running(dfs);
44*5113495bSYour Name 
45*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
46*5113495bSYour Name }
47*5113495bSYour Name qdf_export_symbol(ucfg_dfs_is_ap_cac_timer_running);
48*5113495bSYour Name 
ucfg_dfs_getnol(struct wlan_objmgr_pdev * pdev,void * dfs_nolinfo)49*5113495bSYour Name QDF_STATUS ucfg_dfs_getnol(struct wlan_objmgr_pdev *pdev,
50*5113495bSYour Name 		void *dfs_nolinfo)
51*5113495bSYour Name {
52*5113495bSYour Name 	struct wlan_dfs *dfs;
53*5113495bSYour Name 
54*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
55*5113495bSYour Name 	if (!dfs)
56*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
57*5113495bSYour Name 
58*5113495bSYour Name 	dfs_getnol(dfs, dfs_nolinfo);
59*5113495bSYour Name 
60*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
61*5113495bSYour Name }
62*5113495bSYour Name qdf_export_symbol(ucfg_dfs_getnol);
63*5113495bSYour Name 
ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev * pdev,int cac_timeout,int * status)64*5113495bSYour Name QDF_STATUS ucfg_dfs_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
65*5113495bSYour Name 		int cac_timeout,
66*5113495bSYour Name 		int *status)
67*5113495bSYour Name {
68*5113495bSYour Name 	struct wlan_dfs *dfs;
69*5113495bSYour Name 
70*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
71*5113495bSYour Name 	if (!dfs)
72*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
73*5113495bSYour Name 
74*5113495bSYour Name 	*status = dfs_override_cac_timeout(dfs, cac_timeout);
75*5113495bSYour Name 
76*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
77*5113495bSYour Name }
78*5113495bSYour Name qdf_export_symbol(ucfg_dfs_override_cac_timeout);
79*5113495bSYour Name 
ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev * pdev,int * cac_timeout,int * status)80*5113495bSYour Name QDF_STATUS ucfg_dfs_get_override_cac_timeout(struct wlan_objmgr_pdev *pdev,
81*5113495bSYour Name 		int *cac_timeout,
82*5113495bSYour Name 		int *status)
83*5113495bSYour Name {
84*5113495bSYour Name 	struct wlan_dfs *dfs;
85*5113495bSYour Name 
86*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
87*5113495bSYour Name 	if (!dfs)
88*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
89*5113495bSYour Name 
90*5113495bSYour Name 	*status = dfs_get_override_cac_timeout(dfs, cac_timeout);
91*5113495bSYour Name 
92*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
93*5113495bSYour Name }
94*5113495bSYour Name qdf_export_symbol(ucfg_dfs_get_override_cac_timeout);
95*5113495bSYour Name 
ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev * pdev,int * precac_timeout)96*5113495bSYour Name QDF_STATUS ucfg_dfs_get_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
97*5113495bSYour Name 		int *precac_timeout)
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_get_override_precac_timeout(dfs, precac_timeout);
106*5113495bSYour Name 
107*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
108*5113495bSYour Name }
109*5113495bSYour Name qdf_export_symbol(ucfg_dfs_get_override_precac_timeout);
110*5113495bSYour Name 
ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev * pdev,int precac_timeout)111*5113495bSYour Name QDF_STATUS ucfg_dfs_override_precac_timeout(struct wlan_objmgr_pdev *pdev,
112*5113495bSYour Name 		int precac_timeout)
113*5113495bSYour Name {
114*5113495bSYour Name 	struct wlan_dfs *dfs;
115*5113495bSYour Name 
116*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
117*5113495bSYour Name 	if (!dfs)
118*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
119*5113495bSYour Name 
120*5113495bSYour Name 	dfs_override_precac_timeout(dfs, precac_timeout);
121*5113495bSYour Name 
122*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
123*5113495bSYour Name }
124*5113495bSYour Name qdf_export_symbol(ucfg_dfs_override_precac_timeout);
125*5113495bSYour Name 
ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev * pdev,uint32_t value)126*5113495bSYour Name QDF_STATUS ucfg_dfs_set_precac_enable(struct wlan_objmgr_pdev *pdev,
127*5113495bSYour Name 		uint32_t value)
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 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
134*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
135*5113495bSYour Name 	}
136*5113495bSYour Name 
137*5113495bSYour Name 	dfs_set_precac_enable(dfs, value);
138*5113495bSYour Name 
139*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
140*5113495bSYour Name }
141*5113495bSYour Name qdf_export_symbol(ucfg_dfs_set_precac_enable);
142*5113495bSYour Name 
ucfg_dfs_get_agile_precac_enable(struct wlan_objmgr_pdev * pdev,bool * buff)143*5113495bSYour Name QDF_STATUS ucfg_dfs_get_agile_precac_enable(struct wlan_objmgr_pdev *pdev,
144*5113495bSYour Name 					    bool *buff)
145*5113495bSYour Name {
146*5113495bSYour Name 	struct wlan_dfs *dfs;
147*5113495bSYour Name 
148*5113495bSYour Name 	if (!pdev || !buff)
149*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
150*5113495bSYour Name 
151*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev)) {
152*5113495bSYour Name 		*buff = false;
153*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
154*5113495bSYour Name 	}
155*5113495bSYour Name 
156*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
157*5113495bSYour Name 	if (!dfs) {
158*5113495bSYour Name 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs");
159*5113495bSYour Name 		*buff = false;
160*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
161*5113495bSYour Name 	}
162*5113495bSYour Name 
163*5113495bSYour Name 	*buff = dfs_is_agile_precac_enabled(dfs);
164*5113495bSYour Name 
165*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
166*5113495bSYour Name }
167*5113495bSYour Name 
168*5113495bSYour Name qdf_export_symbol(ucfg_dfs_get_agile_precac_enable);
169*5113495bSYour Name 
170*5113495bSYour Name QDF_STATUS
ucfg_dfs_set_nol_subchannel_marking(struct wlan_objmgr_pdev * pdev,bool nol_subchannel_marking)171*5113495bSYour Name ucfg_dfs_set_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
172*5113495bSYour Name 				    bool nol_subchannel_marking)
173*5113495bSYour Name {
174*5113495bSYour Name 	struct wlan_dfs *dfs;
175*5113495bSYour Name 
176*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
177*5113495bSYour Name 	if (!dfs)
178*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
179*5113495bSYour Name 
180*5113495bSYour Name 	dfs_set_nol_subchannel_marking(dfs, nol_subchannel_marking);
181*5113495bSYour Name 
182*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
183*5113495bSYour Name }
184*5113495bSYour Name qdf_export_symbol(ucfg_dfs_set_nol_subchannel_marking);
185*5113495bSYour Name 
ucfg_dfs_get_nol_subchannel_marking(struct wlan_objmgr_pdev * pdev,bool * nol_subchannel_marking)186*5113495bSYour Name QDF_STATUS ucfg_dfs_get_nol_subchannel_marking(struct wlan_objmgr_pdev *pdev,
187*5113495bSYour Name 					       bool *nol_subchannel_marking)
188*5113495bSYour Name {
189*5113495bSYour Name 	struct wlan_dfs *dfs;
190*5113495bSYour Name 
191*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
192*5113495bSYour Name 	if (!dfs)
193*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
194*5113495bSYour Name 
195*5113495bSYour Name 	dfs_get_nol_subchannel_marking(dfs, nol_subchannel_marking);
196*5113495bSYour Name 
197*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
198*5113495bSYour Name }
199*5113495bSYour Name qdf_export_symbol(ucfg_dfs_get_nol_subchannel_marking);
200*5113495bSYour Name #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev * pdev,uint32_t value)201*5113495bSYour Name QDF_STATUS ucfg_dfs_set_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
202*5113495bSYour Name 						 uint32_t value)
203*5113495bSYour Name {
204*5113495bSYour Name 	struct wlan_dfs *dfs;
205*5113495bSYour Name 
206*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
207*5113495bSYour Name 	if (!dfs) {
208*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
209*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
210*5113495bSYour Name 	}
211*5113495bSYour Name 
212*5113495bSYour Name 	dfs_set_precac_intermediate_chan(dfs, value);
213*5113495bSYour Name 
214*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
215*5113495bSYour Name }
216*5113495bSYour Name 
ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev * pdev,int * buff)217*5113495bSYour Name QDF_STATUS ucfg_dfs_get_precac_intermediate_chan(struct wlan_objmgr_pdev *pdev,
218*5113495bSYour Name 						 int *buff)
219*5113495bSYour Name {
220*5113495bSYour Name 	struct wlan_dfs *dfs;
221*5113495bSYour Name 
222*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
223*5113495bSYour Name 	if (!dfs) {
224*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
225*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
226*5113495bSYour Name 	}
227*5113495bSYour Name 
228*5113495bSYour Name 	*buff = dfs_get_precac_intermediate_chan(dfs);
229*5113495bSYour Name 
230*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
231*5113495bSYour Name }
232*5113495bSYour Name 
233*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
234*5113495bSYour Name enum precac_chan_state
ucfg_dfs_get_precac_chan_state_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t precac_chan_freq)235*5113495bSYour Name ucfg_dfs_get_precac_chan_state_for_freq(struct wlan_objmgr_pdev *pdev,
236*5113495bSYour Name 					uint16_t precac_chan_freq)
237*5113495bSYour Name {
238*5113495bSYour Name 	struct wlan_dfs *dfs;
239*5113495bSYour Name 	enum precac_chan_state retval = PRECAC_ERR;
240*5113495bSYour Name 
241*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
242*5113495bSYour Name 	if (!dfs) {
243*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
244*5113495bSYour Name 		return PRECAC_ERR;
245*5113495bSYour Name 	}
246*5113495bSYour Name 
247*5113495bSYour Name 	retval = dfs_get_precac_chan_state_for_freq(dfs, precac_chan_freq);
248*5113495bSYour Name 	if (retval == PRECAC_ERR) {
249*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
250*5113495bSYour Name 			"Could not find precac channel state");
251*5113495bSYour Name 	}
252*5113495bSYour Name 
253*5113495bSYour Name 	return retval;
254*5113495bSYour Name }
255*5113495bSYour Name #endif
256*5113495bSYour Name #endif
257*5113495bSYour Name 
258*5113495bSYour Name #ifdef MOBILE_DFS_SUPPORT
ucfg_dfs_update_config(struct wlan_objmgr_psoc * psoc,struct dfs_user_config * req)259*5113495bSYour Name QDF_STATUS ucfg_dfs_update_config(struct wlan_objmgr_psoc *psoc,
260*5113495bSYour Name 		struct dfs_user_config *req)
261*5113495bSYour Name {
262*5113495bSYour Name 	struct dfs_soc_priv_obj *soc_obj;
263*5113495bSYour Name 
264*5113495bSYour Name 	if (!psoc || !req) {
265*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
266*5113495bSYour Name 			"psoc: 0x%pK, req: 0x%pK", psoc, req);
267*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
268*5113495bSYour Name 	}
269*5113495bSYour Name 
270*5113495bSYour Name 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
271*5113495bSYour Name 							WLAN_UMAC_COMP_DFS);
272*5113495bSYour Name 	if (!soc_obj) {
273*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
274*5113495bSYour Name 			"Failed to get dfs psoc component");
275*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
276*5113495bSYour Name 	}
277*5113495bSYour Name 
278*5113495bSYour Name 	soc_obj->dfs_is_phyerr_filter_offload =
279*5113495bSYour Name 			req->dfs_is_phyerr_filter_offload;
280*5113495bSYour Name 
281*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
282*5113495bSYour Name }
283*5113495bSYour Name qdf_export_symbol(ucfg_dfs_update_config);
284*5113495bSYour Name #endif
285*5113495bSYour Name 
286*5113495bSYour Name #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev * pdev,int status_timeout)287*5113495bSYour Name QDF_STATUS ucfg_dfs_set_override_status_timeout(struct wlan_objmgr_pdev *pdev,
288*5113495bSYour Name 					    int status_timeout)
289*5113495bSYour Name {
290*5113495bSYour Name 	struct wlan_dfs *dfs;
291*5113495bSYour Name 
292*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
293*5113495bSYour Name 	if (!dfs) {
294*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
295*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
296*5113495bSYour Name 	}
297*5113495bSYour Name 
298*5113495bSYour Name 	dfs_set_override_status_timeout(dfs, status_timeout);
299*5113495bSYour Name 
300*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
301*5113495bSYour Name }
302*5113495bSYour Name 
303*5113495bSYour Name qdf_export_symbol(ucfg_dfs_set_override_status_timeout);
304*5113495bSYour Name 
ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev * pdev,int * status_timeout)305*5113495bSYour Name QDF_STATUS ucfg_dfs_get_override_status_timeout(struct wlan_objmgr_pdev *pdev,
306*5113495bSYour Name 						int *status_timeout)
307*5113495bSYour Name {
308*5113495bSYour Name 	struct wlan_dfs *dfs;
309*5113495bSYour Name 
310*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
311*5113495bSYour Name 	if (!dfs) {
312*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
313*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
314*5113495bSYour Name 	}
315*5113495bSYour Name 
316*5113495bSYour Name 	dfs_get_override_status_timeout(dfs, status_timeout);
317*5113495bSYour Name 
318*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
319*5113495bSYour Name }
320*5113495bSYour Name 
321*5113495bSYour Name qdf_export_symbol(ucfg_dfs_get_override_status_timeout);
322*5113495bSYour Name #endif
323*5113495bSYour Name 
324*5113495bSYour Name #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(WLAN_DFS_SYNTHETIC_RADAR)
ucfg_dfs_allow_hw_pulses(struct wlan_objmgr_pdev * pdev,bool allow_hw_pulses)325*5113495bSYour Name void ucfg_dfs_allow_hw_pulses(struct wlan_objmgr_pdev *pdev,
326*5113495bSYour Name 			      bool allow_hw_pulses)
327*5113495bSYour Name {
328*5113495bSYour Name 	struct wlan_dfs *dfs;
329*5113495bSYour Name 
330*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
331*5113495bSYour Name 		return;
332*5113495bSYour Name 
333*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
334*5113495bSYour Name 	if (!dfs) {
335*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
336*5113495bSYour Name 		return;
337*5113495bSYour Name 	}
338*5113495bSYour Name 
339*5113495bSYour Name 	dfs_allow_hw_pulses(dfs, allow_hw_pulses);
340*5113495bSYour Name }
341*5113495bSYour Name 
342*5113495bSYour Name qdf_export_symbol(ucfg_dfs_allow_hw_pulses);
343*5113495bSYour Name 
ucfg_dfs_is_hw_pulses_allowed(struct wlan_objmgr_pdev * pdev)344*5113495bSYour Name bool ucfg_dfs_is_hw_pulses_allowed(struct wlan_objmgr_pdev *pdev)
345*5113495bSYour Name {
346*5113495bSYour Name 	struct wlan_dfs *dfs;
347*5113495bSYour Name 
348*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
349*5113495bSYour Name 		return false;
350*5113495bSYour Name 
351*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
352*5113495bSYour Name 	if (!dfs) {
353*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
354*5113495bSYour Name 		return false;
355*5113495bSYour Name 	}
356*5113495bSYour Name 
357*5113495bSYour Name 	return dfs_is_hw_pulses_allowed(dfs);
358*5113495bSYour Name }
359*5113495bSYour Name 
360*5113495bSYour Name qdf_export_symbol(ucfg_dfs_is_hw_pulses_allowed);
361*5113495bSYour Name #endif
362*5113495bSYour Name 
363*5113495bSYour Name #ifdef QCA_SUPPORT_AGILE_DFS
ucfg_dfs_reset_agile_config(struct wlan_objmgr_psoc * psoc)364*5113495bSYour Name QDF_STATUS ucfg_dfs_reset_agile_config(struct wlan_objmgr_psoc *psoc)
365*5113495bSYour Name {
366*5113495bSYour Name 	struct dfs_soc_priv_obj *soc_obj;
367*5113495bSYour Name 
368*5113495bSYour Name 	if (!psoc) {
369*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "psoc is null");
370*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
371*5113495bSYour Name 	}
372*5113495bSYour Name 
373*5113495bSYour Name 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
374*5113495bSYour Name 							WLAN_UMAC_COMP_DFS);
375*5113495bSYour Name 	if (!soc_obj) {
376*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
377*5113495bSYour Name 			"Failed to get dfs psoc component");
378*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
379*5113495bSYour Name 	}
380*5113495bSYour Name 
381*5113495bSYour Name 	dfs_reset_agile_config(soc_obj);
382*5113495bSYour Name 
383*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
384*5113495bSYour Name }
385*5113495bSYour Name 
386*5113495bSYour Name qdf_export_symbol(ucfg_dfs_reset_agile_config);
387*5113495bSYour Name #endif
388*5113495bSYour Name 
ucfg_dfs_reinit_timers(struct wlan_objmgr_pdev * pdev)389*5113495bSYour Name QDF_STATUS ucfg_dfs_reinit_timers(struct wlan_objmgr_pdev *pdev)
390*5113495bSYour Name {
391*5113495bSYour Name 	struct wlan_dfs *dfs;
392*5113495bSYour Name 
393*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
394*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
395*5113495bSYour Name 
396*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
397*5113495bSYour Name 	if (!dfs) {
398*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
399*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
400*5113495bSYour Name 	}
401*5113495bSYour Name 
402*5113495bSYour Name 	dfs_reinit_timers(dfs);
403*5113495bSYour Name 
404*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
405*5113495bSYour Name }
406*5113495bSYour Name 
407*5113495bSYour Name qdf_export_symbol(ucfg_dfs_reinit_timers);
408*5113495bSYour Name 
409*5113495bSYour Name #ifdef QCA_SUPPORT_ADFS_RCAC
ucfg_dfs_set_rcac_enable(struct wlan_objmgr_pdev * pdev,bool rcac_en)410*5113495bSYour Name QDF_STATUS ucfg_dfs_set_rcac_enable(struct wlan_objmgr_pdev *pdev,
411*5113495bSYour Name 				    bool rcac_en)
412*5113495bSYour Name {
413*5113495bSYour Name 	struct wlan_dfs *dfs;
414*5113495bSYour Name 
415*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
416*5113495bSYour Name 	if (!dfs) {
417*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs");
418*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
419*5113495bSYour Name 	}
420*5113495bSYour Name 
421*5113495bSYour Name 	dfs_set_rcac_enable(dfs, rcac_en);
422*5113495bSYour Name 
423*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
424*5113495bSYour Name }
425*5113495bSYour Name 
426*5113495bSYour Name qdf_export_symbol(ucfg_dfs_set_rcac_enable);
427*5113495bSYour Name 
ucfg_dfs_get_rcac_enable(struct wlan_objmgr_pdev * pdev,bool * rcac_en)428*5113495bSYour Name QDF_STATUS ucfg_dfs_get_rcac_enable(struct wlan_objmgr_pdev *pdev,
429*5113495bSYour Name 				    bool *rcac_en)
430*5113495bSYour Name {
431*5113495bSYour Name 	struct wlan_dfs *dfs;
432*5113495bSYour Name 
433*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev)) {
434*5113495bSYour Name 		*rcac_en = false;
435*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
436*5113495bSYour Name 	}
437*5113495bSYour Name 
438*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
439*5113495bSYour Name 	if (!dfs) {
440*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs");
441*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
442*5113495bSYour Name 	}
443*5113495bSYour Name 
444*5113495bSYour Name 	dfs_get_rcac_enable(dfs, rcac_en);
445*5113495bSYour Name 
446*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
447*5113495bSYour Name }
448*5113495bSYour Name 
449*5113495bSYour Name qdf_export_symbol(ucfg_dfs_get_rcac_enable);
450*5113495bSYour Name 
ucfg_dfs_set_rcac_freq(struct wlan_objmgr_pdev * pdev,qdf_freq_t rcac_freq)451*5113495bSYour Name QDF_STATUS ucfg_dfs_set_rcac_freq(struct wlan_objmgr_pdev *pdev,
452*5113495bSYour Name 				  qdf_freq_t rcac_freq)
453*5113495bSYour Name {
454*5113495bSYour Name 	struct wlan_dfs *dfs;
455*5113495bSYour Name 
456*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
457*5113495bSYour Name 	if (!dfs) {
458*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs");
459*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
460*5113495bSYour Name 	}
461*5113495bSYour Name 
462*5113495bSYour Name 	dfs_set_rcac_freq(dfs, rcac_freq);
463*5113495bSYour Name 
464*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
465*5113495bSYour Name }
466*5113495bSYour Name 
467*5113495bSYour Name qdf_export_symbol(ucfg_dfs_set_rcac_freq);
468*5113495bSYour Name 
ucfg_dfs_get_rcac_freq(struct wlan_objmgr_pdev * pdev,qdf_freq_t * rcac_freq)469*5113495bSYour Name QDF_STATUS ucfg_dfs_get_rcac_freq(struct wlan_objmgr_pdev *pdev,
470*5113495bSYour Name 				  qdf_freq_t *rcac_freq)
471*5113495bSYour Name {
472*5113495bSYour Name 	struct wlan_dfs *dfs;
473*5113495bSYour Name 
474*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
475*5113495bSYour Name 	if (!dfs) {
476*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs");
477*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
478*5113495bSYour Name 	}
479*5113495bSYour Name 
480*5113495bSYour Name 	dfs_get_rcac_freq(dfs, rcac_freq);
481*5113495bSYour Name 
482*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
483*5113495bSYour Name }
484*5113495bSYour Name 
485*5113495bSYour Name qdf_export_symbol(ucfg_dfs_get_rcac_freq);
486*5113495bSYour Name 
ucfg_dfs_is_agile_rcac_enabled(struct wlan_objmgr_pdev * pdev)487*5113495bSYour Name bool ucfg_dfs_is_agile_rcac_enabled(struct wlan_objmgr_pdev *pdev)
488*5113495bSYour Name {
489*5113495bSYour Name 	struct wlan_dfs *dfs;
490*5113495bSYour Name 
491*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
492*5113495bSYour Name 	if (!dfs) {
493*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs");
494*5113495bSYour Name 		return false;
495*5113495bSYour Name 	}
496*5113495bSYour Name 
497*5113495bSYour Name 	return dfs_is_agile_rcac_enabled(dfs);
498*5113495bSYour Name }
499*5113495bSYour Name 
500*5113495bSYour Name qdf_export_symbol(ucfg_dfs_is_agile_rcac_enabled);
501*5113495bSYour Name #endif
502*5113495bSYour Name 
503