xref: /wlan-driver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_tgt_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 #include <wlan_objmgr_pdev_obj.h>
26*5113495bSYour Name #include "wlan_dfs_tgt_api.h"
27*5113495bSYour Name #include "wlan_dfs_utils_api.h"
28*5113495bSYour Name #include "wlan_dfs_init_deinit_api.h"
29*5113495bSYour Name #include "wlan_lmac_if_def.h"
30*5113495bSYour Name #include "wlan_lmac_if_api.h"
31*5113495bSYour Name #include "wlan_dfs_mlme_api.h"
32*5113495bSYour Name #include "../../core/src/dfs.h"
33*5113495bSYour Name #include "../../core/src/dfs_zero_cac.h"
34*5113495bSYour Name #include "../../core/src/dfs_process_radar_found_ind.h"
35*5113495bSYour Name #include <qdf_module.h>
36*5113495bSYour Name #include "../../core/src/dfs_partial_offload_radar.h"
37*5113495bSYour Name #ifdef MOBILE_DFS_SUPPORT
38*5113495bSYour Name #include "wlan_mlme_ucfg_api.h"
39*5113495bSYour Name #endif
40*5113495bSYour Name 
41*5113495bSYour Name struct wlan_lmac_if_dfs_tx_ops *
wlan_psoc_get_dfs_txops(struct wlan_objmgr_psoc * psoc)42*5113495bSYour Name wlan_psoc_get_dfs_txops(struct wlan_objmgr_psoc *psoc)
43*5113495bSYour Name {
44*5113495bSYour Name 	struct wlan_lmac_if_tx_ops *tx_ops;
45*5113495bSYour Name 
46*5113495bSYour Name 	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
47*5113495bSYour Name 	if (!tx_ops) {
48*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "tx_ops is null");
49*5113495bSYour Name 		return NULL;
50*5113495bSYour Name 	}
51*5113495bSYour Name 
52*5113495bSYour Name 	return &tx_ops->dfs_tx_ops;
53*5113495bSYour Name }
54*5113495bSYour Name 
55*5113495bSYour Name qdf_export_symbol(wlan_psoc_get_dfs_txops);
56*5113495bSYour Name 
tgt_dfs_is_5ghz_supported_in_pdev(struct wlan_objmgr_pdev * pdev)57*5113495bSYour Name bool tgt_dfs_is_5ghz_supported_in_pdev(struct wlan_objmgr_pdev *pdev)
58*5113495bSYour Name {
59*5113495bSYour Name 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
60*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
61*5113495bSYour Name 	bool is_5ghz = false;
62*5113495bSYour Name 	QDF_STATUS status;
63*5113495bSYour Name 	bool is_6ghz_only_pdev;
64*5113495bSYour Name 	qdf_freq_t low_5g = 0;
65*5113495bSYour Name 	qdf_freq_t high_5g = 0;
66*5113495bSYour Name 
67*5113495bSYour Name 	wlan_reg_get_freq_range(pdev, NULL, NULL, &low_5g, &high_5g);
68*5113495bSYour Name 	is_6ghz_only_pdev = wlan_reg_is_range_only6g(low_5g, high_5g);
69*5113495bSYour Name 
70*5113495bSYour Name 	if (is_6ghz_only_pdev)
71*5113495bSYour Name 		return false;
72*5113495bSYour Name 
73*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
74*5113495bSYour Name 	if (!psoc) {
75*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
76*5113495bSYour Name 		return false;
77*5113495bSYour Name 	}
78*5113495bSYour Name 
79*5113495bSYour Name 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
80*5113495bSYour Name 	if (!(dfs_tx_ops && dfs_tx_ops->dfs_is_pdev_5ghz)) {
81*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "dfs_tx_ops is null");
82*5113495bSYour Name 		return false;
83*5113495bSYour Name 	}
84*5113495bSYour Name 
85*5113495bSYour Name 	status = dfs_tx_ops->dfs_is_pdev_5ghz(pdev, &is_5ghz);
86*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
87*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "Failed to get is_5ghz value");
88*5113495bSYour Name 		return false;
89*5113495bSYour Name 	}
90*5113495bSYour Name 
91*5113495bSYour Name 	return is_5ghz;
92*5113495bSYour Name }
93*5113495bSYour Name 
94*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
95*5113495bSYour Name QDF_STATUS
tgt_dfs_set_current_channel_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t dfs_chan_freq,uint64_t dfs_chan_flags,uint16_t dfs_chan_flagext,uint8_t dfs_chan_ieee,uint8_t dfs_chan_vhtop_freq_seg1,uint8_t dfs_chan_vhtop_freq_seg2,uint16_t dfs_chan_mhz_freq_seg1,uint16_t dfs_chan_mhz_freq_seg2,uint16_t dfs_chan_punc_pattern,bool * is_channel_updated)96*5113495bSYour Name tgt_dfs_set_current_channel_for_freq(struct wlan_objmgr_pdev *pdev,
97*5113495bSYour Name 				     uint16_t dfs_chan_freq,
98*5113495bSYour Name 				     uint64_t dfs_chan_flags,
99*5113495bSYour Name 				     uint16_t dfs_chan_flagext,
100*5113495bSYour Name 				     uint8_t dfs_chan_ieee,
101*5113495bSYour Name 				     uint8_t dfs_chan_vhtop_freq_seg1,
102*5113495bSYour Name 				     uint8_t dfs_chan_vhtop_freq_seg2,
103*5113495bSYour Name 				     uint16_t dfs_chan_mhz_freq_seg1,
104*5113495bSYour Name 				     uint16_t dfs_chan_mhz_freq_seg2,
105*5113495bSYour Name 				     uint16_t dfs_chan_punc_pattern,
106*5113495bSYour Name 				     bool *is_channel_updated)
107*5113495bSYour Name {
108*5113495bSYour Name 	struct wlan_dfs *dfs;
109*5113495bSYour Name 
110*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
111*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
112*5113495bSYour Name 
113*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
114*5113495bSYour Name 	if (!dfs) {
115*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
116*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
117*5113495bSYour Name 	}
118*5113495bSYour Name 
119*5113495bSYour Name 	dfs_set_current_channel_for_freq(dfs,
120*5113495bSYour Name 					 dfs_chan_freq,
121*5113495bSYour Name 					 dfs_chan_flags,
122*5113495bSYour Name 					 dfs_chan_flagext,
123*5113495bSYour Name 					 dfs_chan_ieee,
124*5113495bSYour Name 					 dfs_chan_vhtop_freq_seg1,
125*5113495bSYour Name 					 dfs_chan_vhtop_freq_seg2,
126*5113495bSYour Name 					 dfs_chan_mhz_freq_seg1,
127*5113495bSYour Name 					 dfs_chan_mhz_freq_seg2,
128*5113495bSYour Name 					 dfs_chan_punc_pattern,
129*5113495bSYour Name 					 is_channel_updated);
130*5113495bSYour Name 
131*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
132*5113495bSYour Name }
133*5113495bSYour Name 
134*5113495bSYour Name qdf_export_symbol(tgt_dfs_set_current_channel_for_freq);
135*5113495bSYour Name #endif
136*5113495bSYour Name 
tgt_dfs_radar_enable(struct wlan_objmgr_pdev * pdev,int no_cac,uint32_t opmode,bool enable)137*5113495bSYour Name QDF_STATUS tgt_dfs_radar_enable(struct wlan_objmgr_pdev *pdev,
138*5113495bSYour Name 				int no_cac, uint32_t opmode, bool enable)
139*5113495bSYour Name {
140*5113495bSYour Name 	struct wlan_dfs *dfs;
141*5113495bSYour Name 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
142*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
143*5113495bSYour Name 	QDF_STATUS status;
144*5113495bSYour Name 
145*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
146*5113495bSYour Name 	if (!dfs) {
147*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
148*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
149*5113495bSYour Name 	}
150*5113495bSYour Name 
151*5113495bSYour Name 	if (!dfs->dfs_is_offload_enabled) {
152*5113495bSYour Name 		if (enable) {
153*5113495bSYour Name 			dfs_radar_enable(dfs, no_cac, opmode);
154*5113495bSYour Name 			return QDF_STATUS_SUCCESS;
155*5113495bSYour Name 		} else {
156*5113495bSYour Name 			dfs_debug(dfs, WLAN_DEBUG_DFS_ALWAYS,
157*5113495bSYour Name 				  "Disabling dfs not allowed for non-offload chips");
158*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
159*5113495bSYour Name 		}
160*5113495bSYour Name 	}
161*5113495bSYour Name 
162*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
163*5113495bSYour Name 	if (!psoc) {
164*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
165*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
166*5113495bSYour Name 	}
167*5113495bSYour Name 
168*5113495bSYour Name 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
169*5113495bSYour Name 	if (!dfs_tx_ops) {
170*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs_tx_ops is null");
171*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
172*5113495bSYour Name 	}
173*5113495bSYour Name 
174*5113495bSYour Name 	status = dfs_tx_ops->dfs_send_offload_enable_cmd(pdev, enable);
175*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status))
176*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
177*5113495bSYour Name 			"Failed to enable dfs offload, pdev_id: %d",
178*5113495bSYour Name 			wlan_objmgr_pdev_get_pdev_id(pdev));
179*5113495bSYour Name 
180*5113495bSYour Name 	return status;
181*5113495bSYour Name }
182*5113495bSYour Name qdf_export_symbol(tgt_dfs_radar_enable);
183*5113495bSYour Name 
tgt_dfs_is_radar_enabled(struct wlan_objmgr_pdev * pdev,int * ignore_dfs)184*5113495bSYour Name void tgt_dfs_is_radar_enabled(struct wlan_objmgr_pdev *pdev, int *ignore_dfs)
185*5113495bSYour Name {
186*5113495bSYour Name 	struct wlan_dfs *dfs;
187*5113495bSYour Name 
188*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
189*5113495bSYour Name 	if (!dfs) {
190*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
191*5113495bSYour Name 		return;
192*5113495bSYour Name 	}
193*5113495bSYour Name 
194*5113495bSYour Name 	dfs_is_radar_enabled(dfs, ignore_dfs);
195*5113495bSYour Name }
196*5113495bSYour Name 
197*5113495bSYour Name qdf_export_symbol(tgt_dfs_is_radar_enabled);
198*5113495bSYour Name 
199*5113495bSYour Name #ifdef WLAN_DFS_PARTIAL_OFFLOAD
tgt_dfs_process_phyerr(struct wlan_objmgr_pdev * pdev,void * buf,uint16_t datalen,uint8_t r_rssi,uint8_t r_ext_rssi,uint32_t r_rs_tstamp,uint64_t r_fulltsf)200*5113495bSYour Name QDF_STATUS tgt_dfs_process_phyerr(struct wlan_objmgr_pdev *pdev,
201*5113495bSYour Name 				  void *buf,
202*5113495bSYour Name 				  uint16_t datalen,
203*5113495bSYour Name 				  uint8_t r_rssi,
204*5113495bSYour Name 				  uint8_t r_ext_rssi,
205*5113495bSYour Name 				  uint32_t r_rs_tstamp,
206*5113495bSYour Name 				  uint64_t r_fulltsf)
207*5113495bSYour Name {
208*5113495bSYour Name 	struct wlan_dfs *dfs;
209*5113495bSYour Name 
210*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
211*5113495bSYour Name 	if (!dfs) {
212*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
213*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
214*5113495bSYour Name 	}
215*5113495bSYour Name 
216*5113495bSYour Name 	if (!dfs->dfs_is_offload_enabled)
217*5113495bSYour Name 		dfs_process_phyerr(dfs, buf, datalen, r_rssi,
218*5113495bSYour Name 				   r_ext_rssi, r_rs_tstamp, r_fulltsf);
219*5113495bSYour Name 	else
220*5113495bSYour Name 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
221*5113495bSYour Name 			 "Unexpected phyerror as DFS is offloaded, pdev_id: %d",
222*5113495bSYour Name 			 wlan_objmgr_pdev_get_pdev_id(pdev));
223*5113495bSYour Name 
224*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
225*5113495bSYour Name }
226*5113495bSYour Name qdf_export_symbol(tgt_dfs_process_phyerr);
227*5113495bSYour Name #endif
228*5113495bSYour Name 
229*5113495bSYour Name #ifdef MOBILE_DFS_SUPPORT
tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev * pdev,struct radar_event_info * wlan_radar_event)230*5113495bSYour Name QDF_STATUS tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev,
231*5113495bSYour Name 						 struct radar_event_info
232*5113495bSYour Name 						 *wlan_radar_event)
233*5113495bSYour Name {
234*5113495bSYour Name 	struct wlan_dfs *dfs;
235*5113495bSYour Name 
236*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
237*5113495bSYour Name 	if (!dfs) {
238*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
239*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
240*5113495bSYour Name 	}
241*5113495bSYour Name 	if (!dfs->dfs_is_offload_enabled)
242*5113495bSYour Name 		dfs_process_phyerr_filter_offload(dfs, wlan_radar_event);
243*5113495bSYour Name 	else
244*5113495bSYour Name 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
245*5113495bSYour Name 			 "Unexpected phyerror as DFS is offloaded, pdev_id: %d",
246*5113495bSYour Name 			 wlan_objmgr_pdev_get_pdev_id(pdev));
247*5113495bSYour Name 
248*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
249*5113495bSYour Name }
250*5113495bSYour Name qdf_export_symbol(tgt_dfs_process_phyerr_filter_offload);
251*5113495bSYour Name 
tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc * psoc,bool * is_phyerr_filter_offload)252*5113495bSYour Name QDF_STATUS tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc *psoc,
253*5113495bSYour Name 					    bool *is_phyerr_filter_offload)
254*5113495bSYour Name {
255*5113495bSYour Name 	struct dfs_soc_priv_obj *soc_obj;
256*5113495bSYour Name 
257*5113495bSYour Name 	if (!psoc) {
258*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "psoc is null");
259*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
260*5113495bSYour Name 	}
261*5113495bSYour Name 
262*5113495bSYour Name 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
263*5113495bSYour Name 							WLAN_UMAC_COMP_DFS);
264*5113495bSYour Name 	if (!soc_obj) {
265*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
266*5113495bSYour Name 			"Failed to get dfs psoc component");
267*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
268*5113495bSYour Name 	}
269*5113495bSYour Name 
270*5113495bSYour Name 	*is_phyerr_filter_offload = soc_obj->dfs_is_phyerr_filter_offload;
271*5113495bSYour Name 
272*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
273*5113495bSYour Name }
274*5113495bSYour Name qdf_export_symbol(tgt_dfs_is_phyerr_filter_offload);
275*5113495bSYour Name #else
tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev * pdev,struct radar_event_info * wlan_radar_event)276*5113495bSYour Name QDF_STATUS tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev,
277*5113495bSYour Name 						 struct radar_event_info
278*5113495bSYour Name 						 *wlan_radar_event)
279*5113495bSYour Name {
280*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
281*5113495bSYour Name }
282*5113495bSYour Name 
tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc * psoc,bool * is_phyerr_filter_offload)283*5113495bSYour Name QDF_STATUS tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc *psoc,
284*5113495bSYour Name 					    bool *is_phyerr_filter_offload)
285*5113495bSYour Name {
286*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
287*5113495bSYour Name }
288*5113495bSYour Name #endif
289*5113495bSYour Name 
tgt_dfs_is_precac_timer_running(struct wlan_objmgr_pdev * pdev,bool * is_precac_timer_running)290*5113495bSYour Name QDF_STATUS tgt_dfs_is_precac_timer_running(struct wlan_objmgr_pdev *pdev,
291*5113495bSYour Name 					   bool *is_precac_timer_running)
292*5113495bSYour Name {
293*5113495bSYour Name 	struct wlan_dfs *dfs;
294*5113495bSYour Name 
295*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
296*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
297*5113495bSYour Name 
298*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
299*5113495bSYour Name 	if (!dfs) {
300*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
301*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
302*5113495bSYour Name 	}
303*5113495bSYour Name 
304*5113495bSYour Name 	*is_precac_timer_running = dfs_is_precac_timer_running(dfs);
305*5113495bSYour Name 
306*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
307*5113495bSYour Name }
308*5113495bSYour Name qdf_export_symbol(tgt_dfs_is_precac_timer_running);
309*5113495bSYour Name 
tgt_dfs_get_radars(struct wlan_objmgr_pdev * pdev)310*5113495bSYour Name QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev)
311*5113495bSYour Name {
312*5113495bSYour Name 	struct wlan_dfs *dfs;
313*5113495bSYour Name 
314*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
315*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
316*5113495bSYour Name 
317*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
318*5113495bSYour Name 	if (!dfs) {
319*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
320*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
321*5113495bSYour Name 	}
322*5113495bSYour Name 
323*5113495bSYour Name 	if (!dfs->dfs_is_offload_enabled)
324*5113495bSYour Name 		dfs_get_radars(dfs);
325*5113495bSYour Name 
326*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
327*5113495bSYour Name }
328*5113495bSYour Name qdf_export_symbol(tgt_dfs_get_radars);
329*5113495bSYour Name 
tgt_dfs_destroy_object(struct wlan_objmgr_pdev * pdev)330*5113495bSYour Name QDF_STATUS tgt_dfs_destroy_object(struct wlan_objmgr_pdev *pdev)
331*5113495bSYour Name {
332*5113495bSYour Name 	struct wlan_dfs *dfs;
333*5113495bSYour Name 
334*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
335*5113495bSYour Name 	if (!dfs) {
336*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
337*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
338*5113495bSYour Name 	}
339*5113495bSYour Name 
340*5113495bSYour Name 	dfs_destroy_object(dfs);
341*5113495bSYour Name 
342*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
343*5113495bSYour Name }
344*5113495bSYour Name qdf_export_symbol(tgt_dfs_destroy_object);
345*5113495bSYour Name 
346*5113495bSYour Name #ifdef MOBILE_DFS_SUPPORT
tgt_dfs_set_tx_leakage_threshold(struct wlan_objmgr_pdev * pdev)347*5113495bSYour Name QDF_STATUS tgt_dfs_set_tx_leakage_threshold(struct wlan_objmgr_pdev *pdev)
348*5113495bSYour Name {
349*5113495bSYour Name 	struct wlan_dfs *dfs;
350*5113495bSYour Name 	uint32_t tx_leakage_threshold = 0;
351*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
352*5113495bSYour Name 
353*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
354*5113495bSYour Name 	if (!psoc) {
355*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
356*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
357*5113495bSYour Name 	}
358*5113495bSYour Name 
359*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
360*5113495bSYour Name 	if (!dfs) {
361*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is NULL");
362*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
363*5113495bSYour Name 	}
364*5113495bSYour Name 	ucfg_mlme_get_sap_tx_leakage_threshold(psoc,
365*5113495bSYour Name 					       &tx_leakage_threshold);
366*5113495bSYour Name 
367*5113495bSYour Name 	dfs->tx_leakage_threshold = tx_leakage_threshold;
368*5113495bSYour Name 	dfs_debug(dfs, WLAN_DEBUG_DFS_ALWAYS,
369*5113495bSYour Name 		  "dfs tx_leakage_threshold = %d", dfs->tx_leakage_threshold);
370*5113495bSYour Name 
371*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
372*5113495bSYour Name }
373*5113495bSYour Name qdf_export_symbol(tgt_dfs_set_tx_leakage_threshold);
374*5113495bSYour Name #endif
375*5113495bSYour Name 
tgt_dfs_control(struct wlan_objmgr_pdev * pdev,u_int id,void * indata,uint32_t insize,void * outdata,uint32_t * outsize,int * error)376*5113495bSYour Name QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev,
377*5113495bSYour Name 			   u_int id,
378*5113495bSYour Name 			   void *indata,
379*5113495bSYour Name 			   uint32_t insize,
380*5113495bSYour Name 			   void *outdata,
381*5113495bSYour Name 			   uint32_t *outsize,
382*5113495bSYour Name 			   int *error)
383*5113495bSYour Name {
384*5113495bSYour Name 	struct wlan_dfs *dfs;
385*5113495bSYour Name 
386*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
387*5113495bSYour Name 	if (!dfs) {
388*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
389*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
390*5113495bSYour Name 	}
391*5113495bSYour Name 
392*5113495bSYour Name 	*error = dfs_control(dfs, id, indata, insize, outdata, outsize);
393*5113495bSYour Name 
394*5113495bSYour Name 	return  QDF_STATUS_SUCCESS;
395*5113495bSYour Name }
396*5113495bSYour Name qdf_export_symbol(tgt_dfs_control);
397*5113495bSYour Name 
398*5113495bSYour Name #ifdef QCA_SUPPORT_AGILE_DFS
tgt_dfs_agile_precac_start(struct wlan_objmgr_pdev * pdev)399*5113495bSYour Name QDF_STATUS tgt_dfs_agile_precac_start(struct wlan_objmgr_pdev *pdev)
400*5113495bSYour Name {
401*5113495bSYour Name 	struct wlan_dfs *dfs;
402*5113495bSYour Name 
403*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
404*5113495bSYour Name 	if (!dfs) {
405*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
406*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
407*5113495bSYour Name 	}
408*5113495bSYour Name 
409*5113495bSYour Name 	dfs_agile_precac_start(dfs);
410*5113495bSYour Name 
411*5113495bSYour Name 	return  QDF_STATUS_SUCCESS;
412*5113495bSYour Name }
413*5113495bSYour Name #else
tgt_dfs_agile_precac_start(struct wlan_objmgr_pdev * pdev)414*5113495bSYour Name QDF_STATUS tgt_dfs_agile_precac_start(struct wlan_objmgr_pdev *pdev)
415*5113495bSYour Name {
416*5113495bSYour Name 	return  QDF_STATUS_SUCCESS;
417*5113495bSYour Name }
418*5113495bSYour Name #endif
419*5113495bSYour Name qdf_export_symbol(tgt_dfs_agile_precac_start);
420*5113495bSYour Name 
421*5113495bSYour Name #ifdef QCA_SUPPORT_AGILE_DFS
422*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev * pdev,int agile_precac_state)423*5113495bSYour Name QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
424*5113495bSYour Name 					  int agile_precac_state)
425*5113495bSYour Name {
426*5113495bSYour Name 	struct wlan_dfs *dfs;
427*5113495bSYour Name 	struct dfs_soc_priv_obj *dfs_soc;
428*5113495bSYour Name 	bool is_precac_running_on_given_pdev = false;
429*5113495bSYour Name 	int i;
430*5113495bSYour Name 
431*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
432*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
433*5113495bSYour Name 
434*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
435*5113495bSYour Name 	if (!dfs) {
436*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
437*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
438*5113495bSYour Name 	}
439*5113495bSYour Name 
440*5113495bSYour Name 	dfs_soc = dfs->dfs_soc_obj;
441*5113495bSYour Name 	for (i = 0; i < dfs_soc->num_dfs_privs; i++) {
442*5113495bSYour Name 		if (dfs_soc->dfs_priv[i].dfs == dfs) {
443*5113495bSYour Name 			/* Set the pdev state to given value. */
444*5113495bSYour Name 			dfs_soc->dfs_priv[i].agile_precac_active =
445*5113495bSYour Name 				agile_precac_state;
446*5113495bSYour Name 			/* If the pdev state is changed to inactive,
447*5113495bSYour Name 			 * reset the agile channel.
448*5113495bSYour Name 			 */
449*5113495bSYour Name 			if (!agile_precac_state)
450*5113495bSYour Name 				dfs->dfs_agile_precac_freq_mhz = 0;
451*5113495bSYour Name 			if (dfs_soc->cur_agile_dfs_index == i)
452*5113495bSYour Name 				is_precac_running_on_given_pdev = true;
453*5113495bSYour Name 		}
454*5113495bSYour Name 	}
455*5113495bSYour Name 
456*5113495bSYour Name 	/* If preCAC is running on this pdev and the agile_precac_state
457*5113495bSYour Name 	 * is set to false, set the global state in dfs_soc_obj to false.
458*5113495bSYour Name 	 * If this global state is not set to false, then preCAC will not be
459*5113495bSYour Name 	 * started the next time this pdev becomes active.
460*5113495bSYour Name 	 */
461*5113495bSYour Name 	if (is_precac_running_on_given_pdev && !agile_precac_state)
462*5113495bSYour Name 		dfs_soc->precac_state_started = PRECAC_NOT_STARTED;
463*5113495bSYour Name 
464*5113495bSYour Name 	return  QDF_STATUS_SUCCESS;
465*5113495bSYour Name }
466*5113495bSYour Name #else
467*5113495bSYour Name #endif
468*5113495bSYour Name 
469*5113495bSYour Name #else
tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev * pdev,int agile_precac_state)470*5113495bSYour Name QDF_STATUS tgt_dfs_set_agile_precac_state(struct wlan_objmgr_pdev *pdev,
471*5113495bSYour Name 					  int agile_precac_state)
472*5113495bSYour Name {
473*5113495bSYour Name 	return  QDF_STATUS_SUCCESS;
474*5113495bSYour Name }
475*5113495bSYour Name #endif
476*5113495bSYour Name qdf_export_symbol(tgt_dfs_set_agile_precac_state);
477*5113495bSYour Name 
478*5113495bSYour Name #ifdef QCA_SUPPORT_AGILE_DFS
tgt_dfs_ocac_complete(struct wlan_objmgr_pdev * pdev,struct vdev_adfs_complete_status * adfs_status)479*5113495bSYour Name QDF_STATUS tgt_dfs_ocac_complete(struct wlan_objmgr_pdev *pdev,
480*5113495bSYour Name 				 struct vdev_adfs_complete_status *adfs_status)
481*5113495bSYour Name {
482*5113495bSYour Name 	struct wlan_dfs *dfs;
483*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
484*5113495bSYour Name 
485*5113495bSYour Name 	if (!pdev) {
486*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev");
487*5113495bSYour Name 		return status;
488*5113495bSYour Name 	}
489*5113495bSYour Name 
490*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
491*5113495bSYour Name 	if (!dfs) {
492*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "dfs is null");
493*5113495bSYour Name 		return status;
494*5113495bSYour Name 	}
495*5113495bSYour Name 
496*5113495bSYour Name 	dfs_process_ocac_complete(pdev, adfs_status->ocac_status,
497*5113495bSYour Name 				  adfs_status->center_freq1,
498*5113495bSYour Name 				  adfs_status->center_freq2,
499*5113495bSYour Name 				  adfs_status->chan_width);
500*5113495bSYour Name 
501*5113495bSYour Name 	return  QDF_STATUS_SUCCESS;
502*5113495bSYour Name }
503*5113495bSYour Name #else
tgt_dfs_ocac_complete(struct wlan_objmgr_pdev * pdev,struct vdev_adfs_complete_status * adfs_status)504*5113495bSYour Name QDF_STATUS tgt_dfs_ocac_complete(struct wlan_objmgr_pdev *pdev,
505*5113495bSYour Name 				 struct vdev_adfs_complete_status *adfs_status)
506*5113495bSYour Name {
507*5113495bSYour Name 	return  QDF_STATUS_SUCCESS;
508*5113495bSYour Name }
509*5113495bSYour Name #endif
510*5113495bSYour Name qdf_export_symbol(tgt_dfs_ocac_complete);
511*5113495bSYour Name 
tgt_dfs_process_radar_ind(struct wlan_objmgr_pdev * pdev,struct radar_found_info * radar_found)512*5113495bSYour Name QDF_STATUS tgt_dfs_process_radar_ind(struct wlan_objmgr_pdev *pdev,
513*5113495bSYour Name 				     struct radar_found_info *radar_found)
514*5113495bSYour Name {
515*5113495bSYour Name 	struct wlan_dfs *dfs;
516*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
517*5113495bSYour Name 
518*5113495bSYour Name 	if (!pdev) {
519*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev");
520*5113495bSYour Name 		return status;
521*5113495bSYour Name 	}
522*5113495bSYour Name 
523*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
524*5113495bSYour Name 	if (!dfs) {
525*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is null");
526*5113495bSYour Name 		return status;
527*5113495bSYour Name 	}
528*5113495bSYour Name 
529*5113495bSYour Name 	dfs_translate_radar_params(dfs, radar_found);
530*5113495bSYour Name 	status = dfs_process_radar_ind(dfs, radar_found);
531*5113495bSYour Name 	dfs_inc_num_radar(dfs);
532*5113495bSYour Name 
533*5113495bSYour Name 	return status;
534*5113495bSYour Name }
535*5113495bSYour Name qdf_export_symbol(tgt_dfs_process_radar_ind);
536*5113495bSYour Name 
537*5113495bSYour Name #ifndef MOBILE_DFS_SUPPORT
tgt_dfs_cac_complete(struct wlan_objmgr_pdev * pdev,uint32_t vdev_id)538*5113495bSYour Name QDF_STATUS tgt_dfs_cac_complete(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
539*5113495bSYour Name {
540*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
541*5113495bSYour Name }
542*5113495bSYour Name #else
tgt_dfs_cac_complete(struct wlan_objmgr_pdev * pdev,uint32_t vdev_id)543*5113495bSYour Name QDF_STATUS tgt_dfs_cac_complete(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
544*5113495bSYour Name {
545*5113495bSYour Name 	dfs_mlme_proc_cac(pdev, vdev_id);
546*5113495bSYour Name 
547*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
548*5113495bSYour Name }
549*5113495bSYour Name #endif
550*5113495bSYour Name qdf_export_symbol(tgt_dfs_cac_complete);
551*5113495bSYour Name 
tgt_dfs_reg_ev_handler(struct wlan_objmgr_psoc * psoc)552*5113495bSYour Name QDF_STATUS tgt_dfs_reg_ev_handler(struct wlan_objmgr_psoc *psoc)
553*5113495bSYour Name {
554*5113495bSYour Name 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
555*5113495bSYour Name 
556*5113495bSYour Name 	if (!psoc) {
557*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null psoc");
558*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
559*5113495bSYour Name 	}
560*5113495bSYour Name 
561*5113495bSYour Name 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
562*5113495bSYour Name 	if (!dfs_tx_ops) {
563*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null dfs_tx_ops");
564*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
565*5113495bSYour Name 	}
566*5113495bSYour Name 
567*5113495bSYour Name 	if (dfs_tx_ops->dfs_reg_ev_handler)
568*5113495bSYour Name 		return dfs_tx_ops->dfs_reg_ev_handler(psoc);
569*5113495bSYour Name 
570*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
571*5113495bSYour Name }
572*5113495bSYour Name qdf_export_symbol(tgt_dfs_reg_ev_handler);
573*5113495bSYour Name 
tgt_dfs_stop(struct wlan_objmgr_pdev * pdev)574*5113495bSYour Name QDF_STATUS tgt_dfs_stop(struct wlan_objmgr_pdev *pdev)
575*5113495bSYour Name {
576*5113495bSYour Name 	struct wlan_dfs *dfs;
577*5113495bSYour Name 
578*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
579*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
580*5113495bSYour Name 
581*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
582*5113495bSYour Name 	if (!dfs) {
583*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
584*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
585*5113495bSYour Name 	}
586*5113495bSYour Name 
587*5113495bSYour Name 	dfs_stop(dfs);
588*5113495bSYour Name 
589*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
590*5113495bSYour Name }
591*5113495bSYour Name qdf_export_symbol(tgt_dfs_stop);
592*5113495bSYour Name 
tgt_dfs_process_emulate_bang_radar_cmd(struct wlan_objmgr_pdev * pdev,struct dfs_emulate_bang_radar_test_cmd * dfs_unit_test)593*5113495bSYour Name QDF_STATUS tgt_dfs_process_emulate_bang_radar_cmd(struct wlan_objmgr_pdev *pdev,
594*5113495bSYour Name 		struct dfs_emulate_bang_radar_test_cmd *dfs_unit_test)
595*5113495bSYour Name {
596*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
597*5113495bSYour Name 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
598*5113495bSYour Name 
599*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
600*5113495bSYour Name 	if (!psoc) {
601*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
602*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
603*5113495bSYour Name 	}
604*5113495bSYour Name 
605*5113495bSYour Name 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
606*5113495bSYour Name 	if (dfs_tx_ops && dfs_tx_ops->dfs_process_emulate_bang_radar_cmd)
607*5113495bSYour Name 		return dfs_tx_ops->dfs_process_emulate_bang_radar_cmd(pdev,
608*5113495bSYour Name 				dfs_unit_test);
609*5113495bSYour Name 	else
610*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
611*5113495bSYour Name 			"dfs_tx_ops=%pK", dfs_tx_ops);
612*5113495bSYour Name 
613*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
614*5113495bSYour Name }
615*5113495bSYour Name qdf_export_symbol(tgt_dfs_process_emulate_bang_radar_cmd);
616*5113495bSYour Name 
617*5113495bSYour Name #ifdef MOBILE_DFS_SUPPORT
tgt_dfs_set_phyerr_filter_offload(struct wlan_objmgr_pdev * pdev)618*5113495bSYour Name QDF_STATUS tgt_dfs_set_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev)
619*5113495bSYour Name {
620*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
621*5113495bSYour Name 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
622*5113495bSYour Name 	struct dfs_soc_priv_obj *soc_obj;
623*5113495bSYour Name 
624*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
625*5113495bSYour Name 	if (!psoc) {
626*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
627*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
628*5113495bSYour Name 	}
629*5113495bSYour Name 
630*5113495bSYour Name 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
631*5113495bSYour Name 							WLAN_UMAC_COMP_DFS);
632*5113495bSYour Name 	if (!soc_obj) {
633*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
634*5113495bSYour Name 			"Failed to get dfs psoc component");
635*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
636*5113495bSYour Name 	}
637*5113495bSYour Name 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
638*5113495bSYour Name 	if (dfs_tx_ops && dfs_tx_ops->dfs_set_phyerr_filter_offload)
639*5113495bSYour Name 		return dfs_tx_ops->dfs_set_phyerr_filter_offload(pdev,
640*5113495bSYour Name 				soc_obj->dfs_is_phyerr_filter_offload);
641*5113495bSYour Name 	else
642*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
643*5113495bSYour Name 			"dfs_tx_ops=%pK", dfs_tx_ops);
644*5113495bSYour Name 
645*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
646*5113495bSYour Name }
647*5113495bSYour Name qdf_export_symbol(tgt_dfs_set_phyerr_filter_offload);
648*5113495bSYour Name #endif
649*5113495bSYour Name 
650*5113495bSYour Name #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
651*5113495bSYour Name QDF_STATUS
tgt_dfs_send_avg_params_to_fw(struct wlan_objmgr_pdev * pdev,struct dfs_radar_found_params * params)652*5113495bSYour Name tgt_dfs_send_avg_params_to_fw(struct wlan_objmgr_pdev *pdev,
653*5113495bSYour Name 			      struct dfs_radar_found_params *params)
654*5113495bSYour Name {
655*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
656*5113495bSYour Name 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
657*5113495bSYour Name 	struct wlan_dfs *dfs;
658*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
659*5113495bSYour Name 
660*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
661*5113495bSYour Name 	if (!dfs) {
662*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
663*5113495bSYour Name 		return  status;
664*5113495bSYour Name 	}
665*5113495bSYour Name 
666*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
667*5113495bSYour Name 	if (!psoc) {
668*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
669*5113495bSYour Name 		return status;
670*5113495bSYour Name 	}
671*5113495bSYour Name 
672*5113495bSYour Name 	dfs_debug(dfs, WLAN_DEBUG_DFS_ALWAYS,
673*5113495bSYour Name 		  "params->pri_min = %d; params->pri_max = %d; params->duration_min = %d; params->duration_max = %d; params->sidx_min = %d; params->sidx_max = %d",
674*5113495bSYour Name 		  params->pri_min, params->pri_max,
675*5113495bSYour Name 		  params->duration_min, params->duration_max,
676*5113495bSYour Name 		  params->sidx_min, params->sidx_max);
677*5113495bSYour Name 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
678*5113495bSYour Name 	if (dfs_tx_ops && dfs_tx_ops->dfs_send_avg_radar_params_to_fw)
679*5113495bSYour Name 		status = dfs_tx_ops->dfs_send_avg_radar_params_to_fw(pdev,
680*5113495bSYour Name 			params);
681*5113495bSYour Name 
682*5113495bSYour Name 	if (QDF_IS_STATUS_SUCCESS(status)) {
683*5113495bSYour Name 		dfs->dfs_average_params_sent = 1;
684*5113495bSYour Name 		dfs_debug(dfs, WLAN_DEBUG_DFS_ALWAYS, "Average radar parameters sent %d",
685*5113495bSYour Name 			  dfs->dfs_average_params_sent);
686*5113495bSYour Name 	}
687*5113495bSYour Name 
688*5113495bSYour Name 	return status;
689*5113495bSYour Name }
690*5113495bSYour Name 
691*5113495bSYour Name qdf_export_symbol(tgt_dfs_send_avg_params_to_fw);
692*5113495bSYour Name 
tgt_dfs_action_on_status_from_fw(struct wlan_objmgr_pdev * pdev,uint32_t * status)693*5113495bSYour Name QDF_STATUS tgt_dfs_action_on_status_from_fw(struct wlan_objmgr_pdev *pdev,
694*5113495bSYour Name 					    uint32_t *status)
695*5113495bSYour Name {
696*5113495bSYour Name 	struct wlan_dfs *dfs;
697*5113495bSYour Name 
698*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
699*5113495bSYour Name 	if (!dfs) {
700*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
701*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
702*5113495bSYour Name 	}
703*5113495bSYour Name 
704*5113495bSYour Name 	dfs_action_on_fw_radar_status_check(dfs, status);
705*5113495bSYour Name 
706*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
707*5113495bSYour Name }
708*5113495bSYour Name 
709*5113495bSYour Name qdf_export_symbol(tgt_dfs_action_on_status_from_fw);
710*5113495bSYour Name 
tgt_dfs_reset_spoof_test(struct wlan_objmgr_pdev * pdev)711*5113495bSYour Name QDF_STATUS tgt_dfs_reset_spoof_test(struct wlan_objmgr_pdev *pdev)
712*5113495bSYour Name {
713*5113495bSYour Name 	struct wlan_dfs *dfs;
714*5113495bSYour Name 
715*5113495bSYour Name 	if (!tgt_dfs_is_5ghz_supported_in_pdev(pdev))
716*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
717*5113495bSYour Name 
718*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
719*5113495bSYour Name 	if (!dfs) {
720*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
721*5113495bSYour Name 		return  QDF_STATUS_E_FAILURE;
722*5113495bSYour Name 	}
723*5113495bSYour Name 
724*5113495bSYour Name 	dfs_reset_spoof_test(dfs);
725*5113495bSYour Name 
726*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
727*5113495bSYour Name }
728*5113495bSYour Name 
729*5113495bSYour Name qdf_export_symbol(tgt_dfs_reset_spoof_test);
730*5113495bSYour Name #endif
731*5113495bSYour Name 
732*5113495bSYour Name #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
tgt_dfs_send_usenol_pdev_param(struct wlan_objmgr_pdev * pdev,bool usenol)733*5113495bSYour Name QDF_STATUS tgt_dfs_send_usenol_pdev_param(struct wlan_objmgr_pdev *pdev,
734*5113495bSYour Name 					  bool usenol)
735*5113495bSYour Name {
736*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
737*5113495bSYour Name 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
738*5113495bSYour Name 
739*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
740*5113495bSYour Name 	if (!psoc) {
741*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
742*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
743*5113495bSYour Name 	}
744*5113495bSYour Name 
745*5113495bSYour Name 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
746*5113495bSYour Name 	if (dfs_tx_ops && dfs_tx_ops->dfs_send_usenol_pdev_param)
747*5113495bSYour Name 		return dfs_tx_ops->dfs_send_usenol_pdev_param(pdev, usenol);
748*5113495bSYour Name 
749*5113495bSYour Name 	dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
750*5113495bSYour Name 		"dfs_tx_ops=%pK", dfs_tx_ops);
751*5113495bSYour Name 
752*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
753*5113495bSYour Name }
754*5113495bSYour Name 
755*5113495bSYour Name qdf_export_symbol(tgt_dfs_send_usenol_pdev_param);
756*5113495bSYour Name 
tgt_dfs_send_subchan_marking(struct wlan_objmgr_pdev * pdev,bool subchanmark)757*5113495bSYour Name QDF_STATUS tgt_dfs_send_subchan_marking(struct wlan_objmgr_pdev *pdev,
758*5113495bSYour Name 					bool subchanmark)
759*5113495bSYour Name {
760*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
761*5113495bSYour Name 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
762*5113495bSYour Name 
763*5113495bSYour Name 	psoc = wlan_pdev_get_psoc(pdev);
764*5113495bSYour Name 	if (!psoc) {
765*5113495bSYour Name 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
766*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
767*5113495bSYour Name 	}
768*5113495bSYour Name 
769*5113495bSYour Name 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
770*5113495bSYour Name 	if (!dfs_tx_ops) {
771*5113495bSYour Name 		dfs_debug(NULL, WLAN_DEBUG_DFS_ALWAYS,
772*5113495bSYour Name 			  "dfs_tx_ops=%pK", dfs_tx_ops);
773*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
774*5113495bSYour Name 	}
775*5113495bSYour Name 
776*5113495bSYour Name 	if (dfs_tx_ops->dfs_send_subchan_marking_pdev_param)
777*5113495bSYour Name 		return dfs_tx_ops->dfs_send_subchan_marking_pdev_param(
778*5113495bSYour Name 				pdev, subchanmark);
779*5113495bSYour Name 
780*5113495bSYour Name 	dfs_debug(NULL, WLAN_DEBUG_DFS_ALWAYS,
781*5113495bSYour Name 		  "dfs_send_subchan_marking_pdev_param is null");
782*5113495bSYour Name 
783*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
784*5113495bSYour Name }
785*5113495bSYour Name 
786*5113495bSYour Name qdf_export_symbol(tgt_dfs_send_subchan_marking);
787*5113495bSYour Name #endif
788*5113495bSYour Name 
789*5113495bSYour Name #ifdef QCA_SUPPORT_AGILE_DFS
tgt_dfs_set_fw_adfs_support(struct wlan_objmgr_pdev * pdev,bool fw_adfs_support_160,bool fw_adfs_support_non_160,bool fw_adfs_support_320)790*5113495bSYour Name void tgt_dfs_set_fw_adfs_support(struct wlan_objmgr_pdev *pdev,
791*5113495bSYour Name 				 bool fw_adfs_support_160,
792*5113495bSYour Name 				 bool fw_adfs_support_non_160,
793*5113495bSYour Name 				 bool fw_adfs_support_320)
794*5113495bSYour Name {
795*5113495bSYour Name 	struct wlan_dfs *dfs;
796*5113495bSYour Name 
797*5113495bSYour Name 	dfs = wlan_pdev_get_dfs_obj(pdev);
798*5113495bSYour Name 	if (!dfs) {
799*5113495bSYour Name 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
800*5113495bSYour Name 		return;
801*5113495bSYour Name 	}
802*5113495bSYour Name 
803*5113495bSYour Name 	dfs_set_fw_adfs_support(dfs,
804*5113495bSYour Name 				fw_adfs_support_160,
805*5113495bSYour Name 				fw_adfs_support_non_160,
806*5113495bSYour Name 				fw_adfs_support_320);
807*5113495bSYour Name }
808*5113495bSYour Name 
809*5113495bSYour Name qdf_export_symbol(tgt_dfs_set_fw_adfs_support);
810*5113495bSYour Name #endif
811