1*5113495bSYour Name /*
2*5113495bSYour Name * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name *
5*5113495bSYour Name *
6*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for
7*5113495bSYour Name * any purpose with or without fee is hereby granted, provided that the
8*5113495bSYour Name * above copyright notice and this permission notice appear in all
9*5113495bSYour Name * copies.
10*5113495bSYour Name *
11*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
12*5113495bSYour Name * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
13*5113495bSYour Name * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
14*5113495bSYour Name * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
15*5113495bSYour Name * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
16*5113495bSYour Name * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
17*5113495bSYour Name * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
18*5113495bSYour Name * PERFORMANCE OF THIS SOFTWARE.
19*5113495bSYour Name */
20*5113495bSYour Name
21*5113495bSYour Name /**
22*5113495bSYour Name * DOC: Functions to call mlme functions from DFS component.
23*5113495bSYour Name */
24*5113495bSYour Name
25*5113495bSYour Name #include "wlan_dfs_mlme_api.h"
26*5113495bSYour Name #include "wlan_objmgr_vdev_obj.h"
27*5113495bSYour Name #include "wlan_objmgr_pdev_obj.h"
28*5113495bSYour Name #include "../../core/src/dfs.h"
29*5113495bSYour Name #include "scheduler_api.h"
30*5113495bSYour Name #include <wlan_reg_ucfg_api.h>
31*5113495bSYour Name #ifdef MOBILE_DFS_SUPPORT
32*5113495bSYour Name #include "wni_api.h"
33*5113495bSYour Name #endif
34*5113495bSYour Name
35*5113495bSYour Name #if defined(QCA_DFS_RCSA_SUPPORT)
dfs_mlme_start_rcsa(struct wlan_objmgr_pdev * pdev,bool * wait_for_csa)36*5113495bSYour Name void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev,
37*5113495bSYour Name bool *wait_for_csa)
38*5113495bSYour Name {
39*5113495bSYour Name if (global_dfs_to_mlme.dfs_start_rcsa)
40*5113495bSYour Name global_dfs_to_mlme.dfs_start_rcsa(pdev, wait_for_csa);
41*5113495bSYour Name }
42*5113495bSYour Name #endif
43*5113495bSYour Name
44*5113495bSYour Name #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
dfs_mlme_proc_spoof_success(struct wlan_objmgr_pdev * pdev)45*5113495bSYour Name void dfs_mlme_proc_spoof_success(struct wlan_objmgr_pdev *pdev)
46*5113495bSYour Name {
47*5113495bSYour Name if (global_dfs_to_mlme.mlme_proc_spoof_success)
48*5113495bSYour Name global_dfs_to_mlme.mlme_proc_spoof_success(pdev);
49*5113495bSYour Name }
50*5113495bSYour Name #endif
51*5113495bSYour Name
52*5113495bSYour Name #ifndef MOBILE_DFS_SUPPORT
dfs_mlme_mark_dfs(struct wlan_objmgr_pdev * pdev,uint8_t ieee,uint16_t freq,uint16_t vhtop_ch_freq_seg2,uint64_t flags,uint16_t dfs_radar_bitmap)53*5113495bSYour Name void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev,
54*5113495bSYour Name uint8_t ieee,
55*5113495bSYour Name uint16_t freq,
56*5113495bSYour Name uint16_t vhtop_ch_freq_seg2,
57*5113495bSYour Name uint64_t flags,
58*5113495bSYour Name uint16_t dfs_radar_bitmap)
59*5113495bSYour Name {
60*5113495bSYour Name if (global_dfs_to_mlme.mlme_mark_dfs)
61*5113495bSYour Name global_dfs_to_mlme.mlme_mark_dfs(pdev,
62*5113495bSYour Name ieee,
63*5113495bSYour Name freq,
64*5113495bSYour Name vhtop_ch_freq_seg2,
65*5113495bSYour Name flags,
66*5113495bSYour Name dfs_radar_bitmap);
67*5113495bSYour Name }
68*5113495bSYour Name #else /* Else of ndef MCL_DFS_SUPPORT */
dfs_send_radar_ind(struct wlan_objmgr_pdev * pdev,void * object,void * arg)69*5113495bSYour Name static void dfs_send_radar_ind(struct wlan_objmgr_pdev *pdev,
70*5113495bSYour Name void *object,
71*5113495bSYour Name void *arg)
72*5113495bSYour Name {
73*5113495bSYour Name struct scheduler_msg sme_msg = {0};
74*5113495bSYour Name uint8_t vdev_id = wlan_vdev_get_id((struct wlan_objmgr_vdev *)object);
75*5113495bSYour Name
76*5113495bSYour Name sme_msg.type = eWNI_SME_DFS_RADAR_FOUND;
77*5113495bSYour Name sme_msg.bodyptr = NULL;
78*5113495bSYour Name sme_msg.bodyval = vdev_id;
79*5113495bSYour Name scheduler_post_message(QDF_MODULE_ID_DFS,
80*5113495bSYour Name QDF_MODULE_ID_SME,
81*5113495bSYour Name QDF_MODULE_ID_SME, &sme_msg);
82*5113495bSYour Name dfs_debug(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_RADAR_FOUND pdev%d posted",
83*5113495bSYour Name vdev_id);
84*5113495bSYour Name }
85*5113495bSYour Name
dfs_mlme_mark_dfs(struct wlan_objmgr_pdev * pdev,uint8_t ieee,uint16_t freq,uint16_t vhtop_ch_freq_seg2,uint64_t flags,uint16_t dfs_radar_bitmap)86*5113495bSYour Name void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev,
87*5113495bSYour Name uint8_t ieee,
88*5113495bSYour Name uint16_t freq,
89*5113495bSYour Name uint16_t vhtop_ch_freq_seg2,
90*5113495bSYour Name uint64_t flags,
91*5113495bSYour Name uint16_t dfs_radar_bitmap)
92*5113495bSYour Name {
93*5113495bSYour Name struct wlan_objmgr_vdev *vdev;
94*5113495bSYour Name
95*5113495bSYour Name if (!pdev) {
96*5113495bSYour Name dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev");
97*5113495bSYour Name return;
98*5113495bSYour Name }
99*5113495bSYour Name
100*5113495bSYour Name vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID);
101*5113495bSYour Name
102*5113495bSYour Name if (vdev) {
103*5113495bSYour Name dfs_send_radar_ind(pdev, vdev, NULL);
104*5113495bSYour Name wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
105*5113495bSYour Name }
106*5113495bSYour Name }
107*5113495bSYour Name #endif
108*5113495bSYour Name
109*5113495bSYour Name #ifndef MOBILE_DFS_SUPPORT
110*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev * pdev,uint8_t ieee_chan,uint16_t freq,uint16_t cfreq2,uint64_t flags)111*5113495bSYour Name void dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev *pdev,
112*5113495bSYour Name uint8_t ieee_chan, uint16_t freq,
113*5113495bSYour Name uint16_t cfreq2, uint64_t flags)
114*5113495bSYour Name {
115*5113495bSYour Name if (global_dfs_to_mlme.mlme_start_csa_for_freq)
116*5113495bSYour Name global_dfs_to_mlme.mlme_start_csa_for_freq(pdev, ieee_chan,
117*5113495bSYour Name freq, cfreq2, flags);
118*5113495bSYour Name }
119*5113495bSYour Name #endif
120*5113495bSYour Name #else
121*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev * pdev,uint8_t ieee_chan,uint16_t freq,uint16_t cfreq2,uint64_t flags)122*5113495bSYour Name void dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev *pdev,
123*5113495bSYour Name uint8_t ieee_chan, uint16_t freq,
124*5113495bSYour Name uint16_t cfreq2, uint64_t flags)
125*5113495bSYour Name {
126*5113495bSYour Name struct wlan_objmgr_vdev *vdev;
127*5113495bSYour Name
128*5113495bSYour Name if (!pdev) {
129*5113495bSYour Name dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev");
130*5113495bSYour Name return;
131*5113495bSYour Name }
132*5113495bSYour Name
133*5113495bSYour Name vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID);
134*5113495bSYour Name
135*5113495bSYour Name if (vdev) {
136*5113495bSYour Name dfs_send_radar_ind(pdev, vdev, NULL);
137*5113495bSYour Name wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
138*5113495bSYour Name }
139*5113495bSYour Name }
140*5113495bSYour Name #endif
141*5113495bSYour Name #endif
142*5113495bSYour Name
143*5113495bSYour Name #ifndef MOBILE_DFS_SUPPORT
dfs_mlme_proc_cac(struct wlan_objmgr_pdev * pdev,uint32_t vdev_id)144*5113495bSYour Name void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
145*5113495bSYour Name {
146*5113495bSYour Name if (global_dfs_to_mlme.mlme_proc_cac)
147*5113495bSYour Name global_dfs_to_mlme.mlme_proc_cac(pdev);
148*5113495bSYour Name }
149*5113495bSYour Name #else
dfs_mlme_proc_cac(struct wlan_objmgr_pdev * pdev,uint32_t vdev_id)150*5113495bSYour Name void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
151*5113495bSYour Name {
152*5113495bSYour Name struct scheduler_msg sme_msg = {0};
153*5113495bSYour Name
154*5113495bSYour Name sme_msg.type = eWNI_SME_DFS_CAC_COMPLETE;
155*5113495bSYour Name sme_msg.bodyptr = NULL;
156*5113495bSYour Name sme_msg.bodyval = vdev_id;
157*5113495bSYour Name scheduler_post_message(QDF_MODULE_ID_DFS,
158*5113495bSYour Name QDF_MODULE_ID_SME,
159*5113495bSYour Name QDF_MODULE_ID_SME, &sme_msg);
160*5113495bSYour Name dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_CAC_COMPLETE vdev%d posted",
161*5113495bSYour Name vdev_id);
162*5113495bSYour Name }
163*5113495bSYour Name #endif
164*5113495bSYour Name
dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev * pdev)165*5113495bSYour Name void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev)
166*5113495bSYour Name {
167*5113495bSYour Name if (global_dfs_to_mlme.mlme_deliver_event_up_after_cac)
168*5113495bSYour Name global_dfs_to_mlme.mlme_deliver_event_up_after_cac(
169*5113495bSYour Name pdev);
170*5113495bSYour Name }
171*5113495bSYour Name
172*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
dfs_mlme_get_extchan_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_ch_freq_seg1,uint8_t * dfs_chan_vhtop_ch_freq_seg2,uint16_t * dfs_chan_mhz_freq_seg1,uint16_t * dfs_chan_mhz_freq_seg2)173*5113495bSYour Name QDF_STATUS dfs_mlme_get_extchan_for_freq(struct wlan_objmgr_pdev *pdev,
174*5113495bSYour Name uint16_t *dfs_chan_freq,
175*5113495bSYour Name uint64_t *dfs_chan_flags,
176*5113495bSYour Name uint16_t *dfs_chan_flagext,
177*5113495bSYour Name uint8_t *dfs_chan_ieee,
178*5113495bSYour Name uint8_t *dfs_chan_vhtop_ch_freq_seg1,
179*5113495bSYour Name uint8_t *dfs_chan_vhtop_ch_freq_seg2,
180*5113495bSYour Name uint16_t *dfs_chan_mhz_freq_seg1,
181*5113495bSYour Name uint16_t *dfs_chan_mhz_freq_seg2)
182*5113495bSYour Name {
183*5113495bSYour Name if (global_dfs_to_mlme.mlme_get_extchan_for_freq)
184*5113495bSYour Name return global_dfs_to_mlme.mlme_get_extchan_for_freq(pdev,
185*5113495bSYour Name dfs_chan_freq,
186*5113495bSYour Name dfs_chan_flags,
187*5113495bSYour Name dfs_chan_flagext,
188*5113495bSYour Name dfs_chan_ieee,
189*5113495bSYour Name dfs_chan_vhtop_ch_freq_seg1,
190*5113495bSYour Name dfs_chan_vhtop_ch_freq_seg2,
191*5113495bSYour Name dfs_chan_mhz_freq_seg1,
192*5113495bSYour Name dfs_chan_mhz_freq_seg2);
193*5113495bSYour Name
194*5113495bSYour Name return QDF_STATUS_E_FAILURE;
195*5113495bSYour Name }
196*5113495bSYour Name #endif
197*5113495bSYour Name
dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev * pdev,int val)198*5113495bSYour Name void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev,
199*5113495bSYour Name int val)
200*5113495bSYour Name {
201*5113495bSYour Name if (global_dfs_to_mlme.mlme_set_no_chans_available)
202*5113495bSYour Name global_dfs_to_mlme.mlme_set_no_chans_available(
203*5113495bSYour Name pdev,
204*5113495bSYour Name val);
205*5113495bSYour Name }
206*5113495bSYour Name
dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev * pdev,int ieee,uint64_t flag)207*5113495bSYour Name int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, int ieee, uint64_t flag)
208*5113495bSYour Name {
209*5113495bSYour Name int freq = 0;
210*5113495bSYour Name
211*5113495bSYour Name if (global_dfs_to_mlme.mlme_ieee2mhz)
212*5113495bSYour Name global_dfs_to_mlme.mlme_ieee2mhz(pdev,
213*5113495bSYour Name ieee,
214*5113495bSYour Name flag,
215*5113495bSYour Name &freq);
216*5113495bSYour Name
217*5113495bSYour Name return freq;
218*5113495bSYour Name }
219*5113495bSYour Name
220*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
221*5113495bSYour Name QDF_STATUS
dfs_mlme_find_dot11_chan_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t freq,uint16_t des_cfreq2,int mode,uint16_t * dfs_chan_freq,uint64_t * dfs_chan_flag,uint16_t * dfs_flagext,uint8_t * dfs_chan_ieee,uint8_t * dfs_cfreq1,uint8_t * dfs_cfreq2,uint16_t * cfreq1_mhz,uint16_t * cfreq2_mhz)222*5113495bSYour Name dfs_mlme_find_dot11_chan_for_freq(struct wlan_objmgr_pdev *pdev,
223*5113495bSYour Name uint16_t freq,
224*5113495bSYour Name uint16_t des_cfreq2,
225*5113495bSYour Name int mode,
226*5113495bSYour Name uint16_t *dfs_chan_freq,
227*5113495bSYour Name uint64_t *dfs_chan_flag,
228*5113495bSYour Name uint16_t *dfs_flagext,
229*5113495bSYour Name uint8_t *dfs_chan_ieee,
230*5113495bSYour Name uint8_t *dfs_cfreq1,
231*5113495bSYour Name uint8_t *dfs_cfreq2,
232*5113495bSYour Name uint16_t *cfreq1_mhz,
233*5113495bSYour Name uint16_t *cfreq2_mhz)
234*5113495bSYour Name {
235*5113495bSYour Name if (global_dfs_to_mlme.mlme_find_dot11_chan_for_freq)
236*5113495bSYour Name return global_dfs_to_mlme.mlme_find_dot11_chan_for_freq(pdev,
237*5113495bSYour Name freq,
238*5113495bSYour Name des_cfreq2,
239*5113495bSYour Name mode,
240*5113495bSYour Name dfs_chan_freq,
241*5113495bSYour Name dfs_chan_flag,
242*5113495bSYour Name dfs_flagext,
243*5113495bSYour Name dfs_chan_ieee,
244*5113495bSYour Name dfs_cfreq1,
245*5113495bSYour Name dfs_cfreq2,
246*5113495bSYour Name cfreq1_mhz,
247*5113495bSYour Name cfreq2_mhz);
248*5113495bSYour Name return QDF_STATUS_E_FAILURE;
249*5113495bSYour Name }
250*5113495bSYour Name #endif
251*5113495bSYour Name
252*5113495bSYour Name
dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev * pdev)253*5113495bSYour Name uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev)
254*5113495bSYour Name {
255*5113495bSYour Name uint16_t flag_ext = 0;
256*5113495bSYour Name
257*5113495bSYour Name if (global_dfs_to_mlme.mlme_dfs_ch_flags_ext)
258*5113495bSYour Name global_dfs_to_mlme.mlme_dfs_ch_flags_ext(pdev,
259*5113495bSYour Name &flag_ext);
260*5113495bSYour Name
261*5113495bSYour Name return flag_ext;
262*5113495bSYour Name }
263*5113495bSYour Name
dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev * pdev)264*5113495bSYour Name void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev)
265*5113495bSYour Name {
266*5113495bSYour Name if (global_dfs_to_mlme.mlme_channel_change_by_precac)
267*5113495bSYour Name global_dfs_to_mlme.mlme_channel_change_by_precac(
268*5113495bSYour Name pdev);
269*5113495bSYour Name }
270*5113495bSYour Name
dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev * pdev)271*5113495bSYour Name void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev)
272*5113495bSYour Name {
273*5113495bSYour Name if (global_dfs_to_mlme.mlme_nol_timeout_notification)
274*5113495bSYour Name global_dfs_to_mlme.mlme_nol_timeout_notification(
275*5113495bSYour Name pdev);
276*5113495bSYour Name }
277*5113495bSYour Name
dfs_mlme_set_tx_flag(struct wlan_objmgr_pdev * pdev,bool is_tx_allowed)278*5113495bSYour Name void dfs_mlme_set_tx_flag(struct wlan_objmgr_pdev *pdev, bool is_tx_allowed)
279*5113495bSYour Name {
280*5113495bSYour Name if (global_dfs_to_mlme.mlme_set_tx_flag)
281*5113495bSYour Name global_dfs_to_mlme.mlme_set_tx_flag(pdev, is_tx_allowed);
282*5113495bSYour Name }
283*5113495bSYour Name
dfs_mlme_clist_update(struct wlan_objmgr_pdev * pdev,void * nollist,int nentries)284*5113495bSYour Name void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev,
285*5113495bSYour Name void *nollist,
286*5113495bSYour Name int nentries)
287*5113495bSYour Name {
288*5113495bSYour Name if (global_dfs_to_mlme.mlme_clist_update)
289*5113495bSYour Name global_dfs_to_mlme.mlme_clist_update(pdev,
290*5113495bSYour Name nollist,
291*5113495bSYour Name nentries);
292*5113495bSYour Name }
293*5113495bSYour Name
294*5113495bSYour Name #ifdef CONFIG_CHAN_FREQ_API
dfs_mlme_get_cac_timeout_for_freq(struct wlan_objmgr_pdev * pdev,uint16_t dfs_chan_freq,uint16_t dfs_cfreq2,uint64_t dfs_ch_flags)295*5113495bSYour Name int dfs_mlme_get_cac_timeout_for_freq(struct wlan_objmgr_pdev *pdev,
296*5113495bSYour Name uint16_t dfs_chan_freq,
297*5113495bSYour Name uint16_t dfs_cfreq2,
298*5113495bSYour Name uint64_t dfs_ch_flags)
299*5113495bSYour Name {
300*5113495bSYour Name int cac_timeout = 0;
301*5113495bSYour Name
302*5113495bSYour Name if (global_dfs_to_mlme.mlme_get_cac_timeout_for_freq)
303*5113495bSYour Name global_dfs_to_mlme.mlme_get_cac_timeout_for_freq(pdev,
304*5113495bSYour Name dfs_chan_freq,
305*5113495bSYour Name dfs_cfreq2,
306*5113495bSYour Name dfs_ch_flags,
307*5113495bSYour Name &cac_timeout);
308*5113495bSYour Name
309*5113495bSYour Name return cac_timeout;
310*5113495bSYour Name }
311*5113495bSYour Name #endif
312*5113495bSYour Name
313*5113495bSYour Name #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
dfs_mlme_rebuild_chan_list_with_non_dfs_channels(struct wlan_objmgr_pdev * pdev)314*5113495bSYour Name int dfs_mlme_rebuild_chan_list_with_non_dfs_channels(
315*5113495bSYour Name struct wlan_objmgr_pdev *pdev)
316*5113495bSYour Name {
317*5113495bSYour Name if (!global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels)
318*5113495bSYour Name return 1;
319*5113495bSYour Name
320*5113495bSYour Name return global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels(
321*5113495bSYour Name pdev);
322*5113495bSYour Name }
323*5113495bSYour Name
dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev * pdev,int no_chans_avail)324*5113495bSYour Name void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev,
325*5113495bSYour Name int no_chans_avail)
326*5113495bSYour Name {
327*5113495bSYour Name if (!global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan)
328*5113495bSYour Name return;
329*5113495bSYour Name
330*5113495bSYour Name global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan(pdev,
331*5113495bSYour Name no_chans_avail);
332*5113495bSYour Name }
333*5113495bSYour Name #endif
334*5113495bSYour Name
335*5113495bSYour Name #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN)
dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev * pdev,uint32_t chan_freq)336*5113495bSYour Name bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev,
337*5113495bSYour Name uint32_t chan_freq)
338*5113495bSYour Name {
339*5113495bSYour Name if (!global_dfs_to_mlme.mlme_check_allowed_prim_chanlist)
340*5113495bSYour Name return true;
341*5113495bSYour Name
342*5113495bSYour Name return global_dfs_to_mlme.mlme_check_allowed_prim_chanlist(pdev,
343*5113495bSYour Name chan_freq);
344*5113495bSYour Name }
345*5113495bSYour Name
346*5113495bSYour Name #endif
347*5113495bSYour Name
348*5113495bSYour Name #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev * pdev)349*5113495bSYour Name void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev)
350*5113495bSYour Name {
351*5113495bSYour Name bool dfs_enable = 0;
352*5113495bSYour Name
353*5113495bSYour Name /*Disable all DFS channels in master channel list and ic channel list */
354*5113495bSYour Name ucfg_reg_enable_dfs_channels(pdev, dfs_enable);
355*5113495bSYour Name
356*5113495bSYour Name /* send the updated channel list to FW */
357*5113495bSYour Name global_dfs_to_mlme.mlme_update_scan_channel_list(pdev);
358*5113495bSYour Name }
359*5113495bSYour Name #endif
360*5113495bSYour Name
dfs_mlme_is_inter_band_chan_switch_allowed(struct wlan_objmgr_pdev * pdev)361*5113495bSYour Name bool dfs_mlme_is_inter_band_chan_switch_allowed(struct wlan_objmgr_pdev *pdev)
362*5113495bSYour Name {
363*5113495bSYour Name if (!global_dfs_to_mlme.mlme_is_inter_band_chan_switch_allowed)
364*5113495bSYour Name return false;
365*5113495bSYour Name
366*5113495bSYour Name return global_dfs_to_mlme.mlme_is_inter_band_chan_switch_allowed(pdev);
367*5113495bSYour Name }
368*5113495bSYour Name
dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev * pdev)369*5113495bSYour Name bool dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev *pdev)
370*5113495bSYour Name {
371*5113495bSYour Name if (!global_dfs_to_mlme.mlme_is_opmode_sta)
372*5113495bSYour Name return false;
373*5113495bSYour Name
374*5113495bSYour Name return global_dfs_to_mlme.mlme_is_opmode_sta(pdev);
375*5113495bSYour Name }
376