xref: /wlan-driver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_mlme_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-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