xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c (revision a175314c51a4ce5cec2835cc8a8c7dc0c1810915)
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: Functions to call mlme functions from DFS component.
22  */
23 
24 #include "wlan_dfs_mlme_api.h"
25 #include "wlan_objmgr_vdev_obj.h"
26 #include "wlan_objmgr_pdev_obj.h"
27 #include "../../core/src/dfs.h"
28 #include "scheduler_api.h"
29 #ifdef QCA_MCL_DFS_SUPPORT
30 #include "wni_api.h"
31 #endif
32 
33 void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev,
34 		bool *wait_for_csa)
35 {
36 	if (global_dfs_to_mlme.dfs_start_rcsa != NULL)
37 		global_dfs_to_mlme.dfs_start_rcsa(pdev, wait_for_csa);
38 }
39 
40 #ifndef QCA_MCL_DFS_SUPPORT
41 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev,
42 		uint8_t ieee,
43 		uint16_t freq,
44 		uint8_t vhtop_ch_freq_seg2,
45 		uint64_t flags)
46 {
47 	if (global_dfs_to_mlme.mlme_mark_dfs != NULL)
48 		global_dfs_to_mlme.mlme_mark_dfs(pdev,
49 				ieee,
50 				freq,
51 				vhtop_ch_freq_seg2,
52 				flags);
53 }
54 #else
55 static void dfs_send_radar_ind(struct wlan_objmgr_pdev *pdev,
56 		void *object,
57 		void *arg)
58 {
59 	struct scheduler_msg sme_msg = {0};
60 	uint8_t vdev_id = wlan_vdev_get_id((struct wlan_objmgr_vdev *)object);
61 
62 	sme_msg.type = eWNI_SME_DFS_RADAR_FOUND;
63 	sme_msg.bodyptr = NULL;
64 	sme_msg.bodyval = vdev_id;
65 	scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
66 	dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_RADAR_FOUND pdev%d posted",
67 		    vdev_id);
68 }
69 
70 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev,
71 		uint8_t ieee,
72 		uint16_t freq,
73 		uint8_t vhtop_ch_freq_seg2,
74 		uint64_t flags)
75 {
76 	if (!pdev) {
77 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null pdev");
78 		return;
79 	}
80 
81 	wlan_objmgr_pdev_iterate_obj_list(pdev,
82 				WLAN_VDEV_OP,
83 				dfs_send_radar_ind,
84 				NULL, 0, WLAN_DFS_ID);
85 }
86 #endif
87 
88 #ifndef QCA_MCL_DFS_SUPPORT
89 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev,
90 		uint8_t ieee_chan, uint16_t freq,
91 		uint8_t cfreq2, uint64_t flags)
92 {
93 	if (global_dfs_to_mlme.mlme_start_csa != NULL)
94 		global_dfs_to_mlme.mlme_start_csa(pdev, ieee_chan, freq, cfreq2,
95 				flags);
96 }
97 #else
98 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev,
99 			uint8_t ieee_chan, uint16_t freq,
100 			uint8_t cfreq2, uint64_t flags)
101 {
102 	if (!pdev) {
103 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null pdev");
104 		return;
105 	}
106 
107 	wlan_objmgr_pdev_iterate_obj_list(pdev,
108 				WLAN_VDEV_OP,
109 				dfs_send_radar_ind,
110 				NULL, 0, WLAN_DFS_ID);
111 }
112 #endif
113 
114 #ifndef QCA_MCL_DFS_SUPPORT
115 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
116 {
117 	if (global_dfs_to_mlme.mlme_proc_cac != NULL)
118 		global_dfs_to_mlme.mlme_proc_cac(pdev);
119 }
120 #else
121 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
122 {
123 	struct scheduler_msg sme_msg = {0};
124 
125 	sme_msg.type = eWNI_SME_DFS_CAC_COMPLETE;
126 	sme_msg.bodyptr = NULL;
127 	sme_msg.bodyval = vdev_id;
128 	scheduler_post_msg(QDF_MODULE_ID_SME, &sme_msg);
129 	dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_CAC_COMPLETE vdev%d posted",
130 		    vdev_id);
131 }
132 #endif
133 
134 void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev)
135 {
136 	if (global_dfs_to_mlme.mlme_deliver_event_up_after_cac)
137 		global_dfs_to_mlme.mlme_deliver_event_up_after_cac(
138 				pdev);
139 }
140 
141 void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev,
142 		int *nchans)
143 {
144 	if (global_dfs_to_mlme.mlme_get_dfs_ch_nchans != NULL)
145 		global_dfs_to_mlme.mlme_get_dfs_ch_nchans(pdev,
146 				nchans);
147 }
148 
149 QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev,
150 		uint16_t *dfs_ch_freq,
151 		uint64_t *dfs_ch_flags,
152 		uint16_t *dfs_ch_flagext,
153 		uint8_t *dfs_ch_ieee,
154 		uint8_t *dfs_ch_vhtop_ch_freq_seg1,
155 		uint8_t *dfs_ch_vhtop_ch_freq_seg2)
156 {
157 	if (global_dfs_to_mlme.mlme_get_extchan != NULL)
158 		return global_dfs_to_mlme.mlme_get_extchan(pdev,
159 				dfs_ch_freq,
160 				dfs_ch_flags,
161 				dfs_ch_flagext,
162 				dfs_ch_ieee,
163 				dfs_ch_vhtop_ch_freq_seg1,
164 				dfs_ch_vhtop_ch_freq_seg2);
165 
166 	return QDF_STATUS_E_FAILURE;
167 }
168 
169 void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev,
170 		int val)
171 {
172 	if (global_dfs_to_mlme.mlme_set_no_chans_available != NULL)
173 		global_dfs_to_mlme.mlme_set_no_chans_available(
174 				pdev,
175 				val);
176 }
177 
178 int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, int ieee, uint64_t flag)
179 {
180 	int freq = 0;
181 
182 	if (global_dfs_to_mlme.mlme_ieee2mhz != NULL)
183 		global_dfs_to_mlme.mlme_ieee2mhz(pdev,
184 				ieee,
185 				flag,
186 				&freq);
187 
188 	return freq;
189 }
190 
191 QDF_STATUS
192 dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev,
193 			    uint8_t ieee,
194 			    uint8_t des_cfreq2,
195 			    int mode,
196 			    uint16_t *dfs_ch_freq,
197 			    uint64_t *dfs_ch_flags,
198 			    uint16_t *dfs_ch_flagext,
199 			    uint8_t *dfs_ch_ieee,
200 			    uint8_t *dfs_ch_vhtop_ch_freq_seg1,
201 			    uint8_t *dfs_ch_vhtop_ch_freq_seg2)
202 {
203 	if (global_dfs_to_mlme.mlme_find_dot11_channel != NULL)
204 		return global_dfs_to_mlme.mlme_find_dot11_channel(pdev,
205 								  ieee,
206 								  des_cfreq2,
207 								  mode,
208 								  dfs_ch_freq,
209 								  dfs_ch_flags,
210 								  dfs_ch_flagext,
211 								  dfs_ch_ieee,
212 								  dfs_ch_vhtop_ch_freq_seg1,
213 								  dfs_ch_vhtop_ch_freq_seg2);
214 	return QDF_STATUS_E_FAILURE;
215 }
216 
217 void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev,
218 		uint16_t *dfs_ch_freq,
219 		uint64_t *dfs_ch_flags,
220 		uint16_t *dfs_ch_flagext,
221 		uint8_t *dfs_ch_ieee,
222 		uint8_t *dfs_ch_vhtop_ch_freq_seg1,
223 		uint8_t *dfs_ch_vhtop_ch_freq_seg2,
224 		int index)
225 {
226 	if (global_dfs_to_mlme.mlme_get_dfs_ch_channels != NULL)
227 		global_dfs_to_mlme.mlme_get_dfs_ch_channels(pdev,
228 				dfs_ch_freq,
229 				dfs_ch_flags,
230 				dfs_ch_flagext,
231 				dfs_ch_ieee,
232 				dfs_ch_vhtop_ch_freq_seg1,
233 				dfs_ch_vhtop_ch_freq_seg2,
234 				index);
235 }
236 
237 uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev)
238 {
239 	uint16_t flag_ext = 0;
240 
241 	if (global_dfs_to_mlme.mlme_dfs_ch_flags_ext != NULL)
242 		global_dfs_to_mlme.mlme_dfs_ch_flags_ext(pdev,
243 				&flag_ext);
244 
245 	return flag_ext;
246 }
247 
248 void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev)
249 {
250 	if (global_dfs_to_mlme.mlme_channel_change_by_precac != NULL)
251 		global_dfs_to_mlme.mlme_channel_change_by_precac(
252 				pdev);
253 }
254 
255 void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev)
256 {
257 	if (global_dfs_to_mlme.mlme_nol_timeout_notification != NULL)
258 		global_dfs_to_mlme.mlme_nol_timeout_notification(
259 				pdev);
260 }
261 
262 void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev,
263 		void *nollist,
264 		int nentries)
265 {
266 	if (global_dfs_to_mlme.mlme_clist_update != NULL)
267 		global_dfs_to_mlme.mlme_clist_update(pdev,
268 				nollist,
269 				nentries);
270 }
271 
272 int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev,
273 		uint16_t dfs_ch_freq,
274 		uint8_t dfs_ch_vhtop_ch_freq_seg2,
275 		uint64_t dfs_ch_flags)
276 {
277 	int cac_timeout = 0;
278 
279 	if (global_dfs_to_mlme.mlme_get_cac_timeout != NULL)
280 		global_dfs_to_mlme.mlme_get_cac_timeout(pdev,
281 				dfs_ch_freq,
282 				dfs_ch_vhtop_ch_freq_seg2,
283 				dfs_ch_flags,
284 				&cac_timeout);
285 
286 	return cac_timeout;
287 }
288 
289 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
290 int dfs_mlme_rebuild_chan_list_with_non_dfs_channels(
291 		struct wlan_objmgr_pdev *pdev)
292 {
293 	if (!global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels)
294 		return 1;
295 
296 	return global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels(
297 			pdev);
298 }
299 
300 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev,
301 					     int no_chans_avail)
302 {
303 	if (!global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan)
304 		return;
305 
306 	global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan(pdev,
307 							       no_chans_avail);
308 }
309 #endif
310 
311 #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN)
312 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev,
313 					  uint32_t chan_num)
314 {
315 	if (!global_dfs_to_mlme.mlme_check_allowed_prim_chanlist)
316 		return true;
317 
318 	return global_dfs_to_mlme.mlme_check_allowed_prim_chanlist(pdev,
319 								   chan_num);
320 }
321 #endif
322