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