xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_tgt_api.c (revision 27d564647e9b50e713c60b0d7e5ea2a9b0a3ae74)
1 /*
2  * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
3  *
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: This file has the DFS dispatcher API implementation which is exposed
22  * to outside of DFS component.
23  */
24 #include <wlan_objmgr_pdev_obj.h>
25 #include "wlan_dfs_tgt_api.h"
26 #include "wlan_lmac_if_def.h"
27 #include "wlan_lmac_if_api.h"
28 #include "wlan_dfs_mlme_api.h"
29 #include "../../core/src/dfs.h"
30 #include "../../core/src/dfs_zero_cac.h"
31 #include "../../core/src/dfs_process_radar_found_ind.h"
32 #include <qdf_module.h>
33 #include "../../core/src/dfs_partial_offload_radar.h"
34 
35 struct wlan_lmac_if_dfs_tx_ops *
36 wlan_psoc_get_dfs_txops(struct wlan_objmgr_psoc *psoc)
37 {
38 	return &((psoc->soc_cb.tx_ops.dfs_tx_ops));
39 }
40 
41 bool tgt_dfs_is_pdev_5ghz(struct wlan_objmgr_pdev *pdev)
42 {
43 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
44 	struct wlan_objmgr_psoc *psoc;
45 	bool is_5ghz = false;
46 	QDF_STATUS status;
47 
48 	psoc = wlan_pdev_get_psoc(pdev);
49 	if (!psoc) {
50 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
51 		return false;
52 	}
53 
54 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
55 	if (!(dfs_tx_ops && dfs_tx_ops->dfs_is_pdev_5ghz)) {
56 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "dfs_tx_ops is null");
57 		return false;
58 	}
59 
60 	status = dfs_tx_ops->dfs_is_pdev_5ghz(pdev, &is_5ghz);
61 	if (QDF_IS_STATUS_ERROR(status)) {
62 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "Failed to get is_5ghz value");
63 		return false;
64 	}
65 
66 	return is_5ghz;
67 }
68 
69 QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev,
70 				       uint16_t dfs_ch_freq,
71 				       uint64_t dfs_ch_flags,
72 				       uint16_t dfs_ch_flagext,
73 				       uint8_t dfs_ch_ieee,
74 				       uint8_t dfs_ch_vhtop_ch_freq_seg1,
75 				       uint8_t dfs_ch_vhtop_ch_freq_seg2)
76 {
77 	struct wlan_dfs *dfs;
78 
79 	if (!tgt_dfs_is_pdev_5ghz(pdev))
80 		return QDF_STATUS_SUCCESS;
81 
82 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
83 	if (!dfs) {
84 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
85 		return  QDF_STATUS_E_FAILURE;
86 	}
87 
88 	dfs_set_current_channel(dfs,
89 				dfs_ch_freq,
90 				dfs_ch_flags,
91 				dfs_ch_flagext,
92 				dfs_ch_ieee,
93 				dfs_ch_vhtop_ch_freq_seg1,
94 				dfs_ch_vhtop_ch_freq_seg2);
95 
96 	return QDF_STATUS_SUCCESS;
97 }
98 qdf_export_symbol(tgt_dfs_set_current_channel);
99 
100 QDF_STATUS tgt_dfs_radar_enable(struct wlan_objmgr_pdev *pdev,
101 				int no_cac, uint32_t opmode)
102 {
103 	struct wlan_dfs *dfs;
104 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
105 	struct wlan_objmgr_psoc *psoc;
106 	QDF_STATUS status;
107 
108 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
109 	if (!dfs) {
110 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
111 		return  QDF_STATUS_E_FAILURE;
112 	}
113 
114 	if (!dfs->dfs_is_offload_enabled) {
115 		dfs_radar_enable(dfs, no_cac, opmode);
116 		return QDF_STATUS_SUCCESS;
117 	}
118 
119 	psoc = wlan_pdev_get_psoc(pdev);
120 	if (!psoc) {
121 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
122 		return  QDF_STATUS_E_FAILURE;
123 	}
124 
125 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
126 	if (!dfs_tx_ops) {
127 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs_tx_ops is null");
128 		return  QDF_STATUS_E_FAILURE;
129 	}
130 
131 	status = dfs_tx_ops->dfs_send_offload_enable_cmd(pdev, true);
132 	if (QDF_IS_STATUS_ERROR(status))
133 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
134 			"Failed to enable dfs offload, pdev_id: %d",
135 			wlan_objmgr_pdev_get_pdev_id(pdev));
136 
137 	return status;
138 }
139 qdf_export_symbol(tgt_dfs_radar_enable);
140 
141 void tgt_dfs_is_radar_enabled(struct wlan_objmgr_pdev *pdev, int *ignore_dfs)
142 {
143 	struct wlan_dfs *dfs;
144 
145 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
146 	if (!dfs) {
147 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
148 		return;
149 	}
150 
151 	dfs_is_radar_enabled(dfs, ignore_dfs);
152 }
153 
154 qdf_export_symbol(tgt_dfs_is_radar_enabled);
155 
156 QDF_STATUS tgt_dfs_process_phyerr(struct wlan_objmgr_pdev *pdev,
157 				  void *buf,
158 				  uint16_t datalen,
159 				  uint8_t r_rssi,
160 				  uint8_t r_ext_rssi,
161 				  uint32_t r_rs_tstamp,
162 				  uint64_t r_fulltsf)
163 {
164 	struct wlan_dfs *dfs;
165 
166 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
167 	if (!dfs) {
168 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
169 		return  QDF_STATUS_E_FAILURE;
170 	}
171 
172 	if (!dfs->dfs_is_offload_enabled)
173 		dfs_process_phyerr(dfs, buf, datalen, r_rssi,
174 				   r_ext_rssi, r_rs_tstamp, r_fulltsf);
175 	else
176 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
177 			 "Unexpect phyerror as DFS is offloaded, pdev_id: %d",
178 			 wlan_objmgr_pdev_get_pdev_id(pdev));
179 
180 	return QDF_STATUS_SUCCESS;
181 }
182 qdf_export_symbol(tgt_dfs_process_phyerr);
183 
184 #ifdef QCA_MCL_DFS_SUPPORT
185 QDF_STATUS tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev,
186 						 struct radar_event_info
187 						 *wlan_radar_event)
188 {
189 	struct wlan_dfs *dfs;
190 
191 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
192 	if (!dfs) {
193 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
194 		return  QDF_STATUS_E_FAILURE;
195 	}
196 	if (!dfs->dfs_is_offload_enabled)
197 		dfs_process_phyerr_filter_offload(dfs, wlan_radar_event);
198 	else
199 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
200 			 "Unexpect phyerror as DFS is offloaded, pdev_id: %d",
201 			 wlan_objmgr_pdev_get_pdev_id(pdev));
202 
203 	return QDF_STATUS_SUCCESS;
204 }
205 qdf_export_symbol(tgt_dfs_process_phyerr_filter_offload);
206 
207 QDF_STATUS tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc *psoc,
208 					    bool *is_phyerr_filter_offload)
209 {
210 	struct dfs_soc_priv_obj *soc_obj;
211 
212 	if (!psoc) {
213 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "psoc is null");
214 		return QDF_STATUS_E_FAILURE;
215 	}
216 
217 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
218 							WLAN_UMAC_COMP_DFS);
219 	if (!soc_obj) {
220 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
221 			"Failed to get dfs psoc component");
222 		return QDF_STATUS_E_FAILURE;
223 	}
224 
225 	*is_phyerr_filter_offload = soc_obj->dfs_is_phyerr_filter_offload;
226 
227 	return QDF_STATUS_SUCCESS;
228 }
229 qdf_export_symbol(tgt_dfs_is_phyerr_filter_offload);
230 #else
231 QDF_STATUS tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev,
232 						 struct radar_event_info
233 						 *wlan_radar_event)
234 {
235 	return QDF_STATUS_SUCCESS;
236 }
237 
238 QDF_STATUS tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc *psoc,
239 					    bool *is_phyerr_filter_offload)
240 {
241 	return QDF_STATUS_SUCCESS;
242 }
243 #endif
244 
245 QDF_STATUS tgt_dfs_is_precac_timer_running(struct wlan_objmgr_pdev *pdev,
246 					   bool *is_precac_timer_running)
247 {
248 	struct wlan_dfs *dfs;
249 
250 	if (!tgt_dfs_is_pdev_5ghz(pdev))
251 		return QDF_STATUS_SUCCESS;
252 
253 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
254 	if (!dfs) {
255 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
256 		return  QDF_STATUS_E_FAILURE;
257 	}
258 
259 	*is_precac_timer_running = dfs_is_precac_timer_running(dfs);
260 
261 	return QDF_STATUS_SUCCESS;
262 }
263 qdf_export_symbol(tgt_dfs_is_precac_timer_running);
264 
265 QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev)
266 {
267 	struct wlan_dfs *dfs;
268 
269 	if (!tgt_dfs_is_pdev_5ghz(pdev))
270 		return QDF_STATUS_SUCCESS;
271 
272 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
273 	if (!dfs) {
274 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
275 		return  QDF_STATUS_E_FAILURE;
276 	}
277 
278 	if (!dfs->dfs_is_offload_enabled)
279 		dfs_get_radars(dfs);
280 
281 	return QDF_STATUS_SUCCESS;
282 }
283 qdf_export_symbol(tgt_dfs_get_radars);
284 
285 QDF_STATUS tgt_dfs_destroy_object(struct wlan_objmgr_pdev *pdev)
286 {
287 	struct wlan_dfs *dfs;
288 
289 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
290 	if (!dfs) {
291 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
292 		return  QDF_STATUS_E_FAILURE;
293 	}
294 
295 	dfs_destroy_object(dfs);
296 
297 	return QDF_STATUS_SUCCESS;
298 }
299 qdf_export_symbol(tgt_dfs_destroy_object);
300 
301 #ifdef QCA_MCL_DFS_SUPPORT
302 QDF_STATUS tgt_dfs_set_tx_leakage_threshold(struct wlan_objmgr_pdev *pdev,
303 		uint16_t tx_leakage_threshold)
304 {
305 	struct wlan_dfs *dfs;
306 
307 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
308 	if (!dfs) {
309 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is NULL");
310 		return  QDF_STATUS_E_FAILURE;
311 	}
312 
313 	dfs->tx_leakage_threshold = tx_leakage_threshold;
314 
315 	return QDF_STATUS_SUCCESS;
316 }
317 qdf_export_symbol(tgt_dfs_set_tx_leakage_threshold);
318 #endif
319 
320 QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev,
321 			   u_int id,
322 			   void *indata,
323 			   uint32_t insize,
324 			   void *outdata,
325 			   uint32_t *outsize,
326 			   int *error)
327 {
328 	struct wlan_dfs *dfs;
329 
330 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
331 	if (!dfs) {
332 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
333 		return  QDF_STATUS_E_FAILURE;
334 	}
335 
336 	*error = dfs_control(dfs, id, indata, insize, outdata, outsize);
337 
338 	return  QDF_STATUS_SUCCESS;
339 }
340 qdf_export_symbol(tgt_dfs_control);
341 
342 QDF_STATUS tgt_dfs_find_vht80_chan_for_precac(struct wlan_objmgr_pdev *pdev,
343 					      uint32_t chan_mode,
344 					      uint8_t ch_freq_seg1,
345 					      uint32_t *cfreq1,
346 					      uint32_t *cfreq2,
347 					      uint32_t *phy_mode,
348 					      bool *dfs_set_cfreq2,
349 					      bool *set_agile)
350 {
351 	struct wlan_dfs *dfs;
352 
353 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
354 	if (!dfs) {
355 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
356 		return  QDF_STATUS_E_FAILURE;
357 	}
358 
359 	dfs_find_vht80_chan_for_precac(dfs,
360 				       chan_mode,
361 				       ch_freq_seg1,
362 				       cfreq1,
363 				       cfreq2,
364 				       phy_mode,
365 				       dfs_set_cfreq2,
366 				       set_agile);
367 
368 	return  QDF_STATUS_SUCCESS;
369 }
370 qdf_export_symbol(tgt_dfs_find_vht80_chan_for_precac);
371 
372 QDF_STATUS tgt_dfs_process_radar_ind(struct wlan_objmgr_pdev *pdev,
373 				     struct radar_found_info *radar_found)
374 {
375 	struct wlan_dfs *dfs;
376 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
377 
378 	if (!pdev) {
379 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev");
380 		return status;
381 	}
382 
383 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
384 	if (!dfs) {
385 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is null");
386 		return status;
387 	}
388 
389 	dfs->dfs_radar_found_for_fo = 1;
390 	status = dfs_process_radar_ind(dfs, radar_found);
391 	dfs->dfs_radar_found_for_fo = 0;
392 
393 	return status;
394 }
395 qdf_export_symbol(tgt_dfs_process_radar_ind);
396 
397 #ifndef QCA_MCL_DFS_SUPPORT
398 QDF_STATUS tgt_dfs_cac_complete(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
399 {
400 	return QDF_STATUS_SUCCESS;
401 }
402 #else
403 QDF_STATUS tgt_dfs_cac_complete(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
404 {
405 	dfs_mlme_proc_cac(pdev, vdev_id);
406 
407 	return QDF_STATUS_SUCCESS;
408 }
409 #endif
410 qdf_export_symbol(tgt_dfs_cac_complete);
411 
412 QDF_STATUS tgt_dfs_reg_ev_handler(struct wlan_objmgr_psoc *psoc)
413 {
414 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
415 
416 	if (!psoc) {
417 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null psoc");
418 		return QDF_STATUS_E_FAILURE;
419 	}
420 
421 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
422 	if (!dfs_tx_ops) {
423 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null dfs_tx_ops");
424 		return QDF_STATUS_E_FAILURE;
425 	}
426 
427 	if (dfs_tx_ops->dfs_reg_ev_handler)
428 		return dfs_tx_ops->dfs_reg_ev_handler(psoc);
429 
430 	return QDF_STATUS_E_FAILURE;
431 }
432 qdf_export_symbol(tgt_dfs_reg_ev_handler);
433 
434 QDF_STATUS tgt_dfs_stop(struct wlan_objmgr_pdev *pdev)
435 {
436 	struct wlan_dfs *dfs;
437 
438 	if (!tgt_dfs_is_pdev_5ghz(pdev))
439 		return QDF_STATUS_SUCCESS;
440 
441 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
442 	if (!dfs) {
443 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
444 		return  QDF_STATUS_E_FAILURE;
445 	}
446 
447 	dfs_stop(dfs);
448 
449 	return QDF_STATUS_SUCCESS;
450 }
451 qdf_export_symbol(tgt_dfs_stop);
452 
453 QDF_STATUS tgt_dfs_process_emulate_bang_radar_cmd(struct wlan_objmgr_pdev *pdev,
454 		struct dfs_emulate_bang_radar_test_cmd *dfs_unit_test)
455 {
456 	struct wlan_objmgr_psoc *psoc;
457 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
458 
459 	psoc = wlan_pdev_get_psoc(pdev);
460 	if (!psoc) {
461 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
462 		return QDF_STATUS_E_FAILURE;
463 	}
464 
465 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
466 	if (dfs_tx_ops && dfs_tx_ops->dfs_process_emulate_bang_radar_cmd)
467 		return dfs_tx_ops->dfs_process_emulate_bang_radar_cmd(pdev,
468 				dfs_unit_test);
469 	else
470 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
471 			"dfs_tx_ops=%pK", dfs_tx_ops);
472 
473 	return QDF_STATUS_E_FAILURE;
474 }
475 qdf_export_symbol(tgt_dfs_process_emulate_bang_radar_cmd);
476 
477 #ifdef QCA_MCL_DFS_SUPPORT
478 QDF_STATUS tgt_dfs_set_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev)
479 {
480 	struct wlan_objmgr_psoc *psoc;
481 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
482 	struct dfs_soc_priv_obj *soc_obj;
483 
484 	psoc = wlan_pdev_get_psoc(pdev);
485 	if (!psoc) {
486 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
487 		return QDF_STATUS_E_FAILURE;
488 	}
489 
490 	soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
491 							WLAN_UMAC_COMP_DFS);
492 	if (!soc_obj) {
493 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
494 			"Failed to get dfs psoc component");
495 		return QDF_STATUS_E_FAILURE;
496 	}
497 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
498 	if (dfs_tx_ops && dfs_tx_ops->dfs_set_phyerr_filter_offload)
499 		return dfs_tx_ops->dfs_set_phyerr_filter_offload(pdev,
500 				soc_obj->dfs_is_phyerr_filter_offload);
501 	else
502 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
503 			"dfs_tx_ops=%pK", dfs_tx_ops);
504 
505 	return QDF_STATUS_E_FAILURE;
506 }
507 qdf_export_symbol(tgt_dfs_set_phyerr_filter_offload);
508 #endif
509 
510 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
511 QDF_STATUS
512 tgt_dfs_send_avg_params_to_fw(struct wlan_objmgr_pdev *pdev,
513 			      struct dfs_radar_found_params *params)
514 {
515 	struct wlan_objmgr_psoc *psoc;
516 	struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops;
517 	struct wlan_dfs *dfs;
518 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
519 
520 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
521 	if (!dfs) {
522 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
523 		return  status;
524 	}
525 
526 	psoc = wlan_pdev_get_psoc(pdev);
527 	if (!psoc) {
528 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null");
529 		return status;
530 	}
531 
532 	dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc);
533 	if (dfs_tx_ops && dfs_tx_ops->dfs_send_avg_radar_params_to_fw)
534 		status = dfs_tx_ops->dfs_send_avg_radar_params_to_fw(pdev,
535 			params);
536 
537 	if (QDF_IS_STATUS_SUCCESS(status)) {
538 		dfs->dfs_average_params_sent = 1;
539 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS,
540 			 "Average radar parameters sent %d",
541 			 dfs->dfs_average_params_sent);
542 	}
543 
544 	return status;
545 }
546 
547 qdf_export_symbol(tgt_dfs_send_avg_params_to_fw);
548 
549 QDF_STATUS tgt_dfs_action_on_status_from_fw(struct wlan_objmgr_pdev *pdev,
550 					    uint32_t *status)
551 {
552 	struct wlan_dfs *dfs;
553 
554 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
555 	if (!dfs) {
556 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
557 		return  QDF_STATUS_E_FAILURE;
558 	}
559 
560 	dfs_action_on_fw_radar_status_check(dfs, status);
561 
562 	return QDF_STATUS_SUCCESS;
563 }
564 
565 qdf_export_symbol(tgt_dfs_action_on_status_from_fw);
566 
567 QDF_STATUS tgt_dfs_reset_spoof_test(struct wlan_objmgr_pdev *pdev)
568 {
569 	struct wlan_dfs *dfs;
570 
571 	if (!tgt_dfs_is_pdev_5ghz(pdev))
572 		return QDF_STATUS_SUCCESS;
573 
574 	dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev);
575 	if (!dfs) {
576 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL");
577 		return  QDF_STATUS_E_FAILURE;
578 	}
579 
580 	dfs_reset_spoof_test(dfs);
581 
582 	return QDF_STATUS_SUCCESS;
583 }
584 
585 qdf_export_symbol(tgt_dfs_reset_spoof_test);
586 #endif
587