xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h (revision 45a38684b07295822dc8eba39e293408f203eec8)
1 /*
2  * Copyright (c) 2016-2020 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: These APIs are used by DFS core functions to call mlme functions.
22  */
23 
24 #ifndef _WLAN_DFS_MLME_API_H_
25 #define _WLAN_DFS_MLME_API_H_
26 
27 #include "wlan_dfs_ucfg_api.h"
28 
29 extern struct dfs_to_mlme global_dfs_to_mlme;
30 
31 /**
32  * dfs_mlme_start_rcsa() - Send RCSA to RootAP.
33  * @pdev: Pointer to DFS pdev object.
34  * @wait_for_csa: Wait for CSA from RootAP.
35  */
36 #if defined(QCA_DFS_RCSA_SUPPORT)
37 void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev,
38 		bool *wait_for_csa);
39 #endif
40 
41 /**
42  * dfs_mlme_mark_dfs() - Mark the channel in the channel list.
43  * @pdev: Pointer to DFS pdev object.
44  * @ieee: Channel number.
45  * @freq: Channel frequency.
46  * @vhtop_ch_freq_seg2: VHT80 Cfreq2.
47  * @flags: channel flags.
48  */
49 #ifdef CONFIG_CHAN_NUM_API
50 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev,
51 			uint8_t ieee,
52 			uint16_t freq,
53 			uint8_t vhtop_ch_freq_seg2,
54 			uint64_t flags);
55 #endif
56 
57 /**
58  * dfs_mlme_mark_dfs_for_freq() - Mark the channel in the channel list.
59  * @pdev: Pointer to DFS pdev object.
60  * @ieee: Channel number.
61  * @freq: Channel frequency.
62  * @vhtop_ch_freq_seg2_mhz: VHT80 Cfreq2 in Mhz.
63  * @flags: channel flags.
64  */
65 #ifdef CONFIG_CHAN_FREQ_API
66 void dfs_mlme_mark_dfs_for_freq(struct wlan_objmgr_pdev *pdev,
67 				uint8_t ieee,
68 				uint16_t freq,
69 				uint16_t vhtop_ch_freq_mhz_seg2,
70 				uint64_t flags);
71 #endif
72 /**
73  * dfs_mlme_start_csa() - Sends CSA in ieeeChan
74  * @pdev: Pointer to DFS pdev object.
75  * @ieee_chan: Channel number.
76  * @freq: Channel frequency.
77  * @cfreq2: HT80 cfreq2.
78  * @flags: channel flags.
79  */
80 #ifdef CONFIG_CHAN_NUM_API
81 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev,
82 		uint8_t ieee_chan,
83 		uint16_t freq,
84 		uint8_t cfreq2,
85 		uint64_t flags);
86 #endif
87 
88 /**
89  * dfs_mlme_start_csa_for_freq() - Sends CSA in ieeeChan
90  * @pdev: Pointer to DFS pdev object.
91  * @ieee_chan: Channel number.
92  * @freq: Channel frequency.
93  * @cfreq2: HT80 cfreq2 in Mhz.
94  * @flags: channel flags.
95  */
96 #ifdef CONFIG_CHAN_FREQ_API
97 void dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev *pdev,
98 				 uint8_t ieee_chan,
99 				 uint16_t freq,
100 				 uint16_t cfreq2_mhz,
101 				 uint64_t flags);
102 #endif
103 /**
104  * dfs_mlme_proc_cac() - Process the CAC completion event.
105  * @pdev: Pointer to DFS pdev object.
106  * @vdev_id: vdev id.
107  */
108 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id);
109 
110 /**
111  * dfs_mlme_deliver_event_up_after_cac() - Send a CAC timeout, VAP up event to
112  * userspace.
113  * @pdev: Pointer to DFS pdev object.
114  */
115 void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev);
116 
117 /**
118  * dfs_mlme_get_dfs_ch_nchans() - Get number of channels in the channel list
119  * @pdev: Pointer to DFS pdev object.
120  * @nchans: Pointer to save the channel number.
121  */
122 void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev, int *nchans);
123 
124 /**
125  * dfs_mlme_get_extchan() - Get extension channel.
126  * @pdev: Pointer to DFS pdev object.
127  * @dfs_ch_freq:                Frequency in Mhz.
128  * @dfs_ch_flags:               Channel flags.
129  * @dfs_ch_flagext:             Extended channel flags.
130  * @dfs_ch_ieee:                IEEE channel number.
131  * @dfs_ch_vhtop_ch_freq_seg1:  Channel Center frequency.
132  * @dfs_ch_vhtop_ch_freq_seg2:  Channel Center frequency applicable for 80+80MHz
133  *                          mode of operation.
134  */
135 #ifdef CONFIG_CHAN_NUM_API
136 QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev,
137 		uint16_t *dfs_ch_freq,
138 		uint64_t *dfs_ch_flags,
139 		uint16_t *dfs_ch_flagext,
140 		uint8_t *dfs_ch_ieee,
141 		uint8_t *dfs_ch_vhtop_ch_freq_seg1,
142 		uint8_t *dfs_ch_vhtop_ch_freq_seg2);
143 #endif
144 
145 /**
146  * dfs_mlme_get_extchan() - Get extension channel.
147  * @pdev: Pointer to DFS pdev object.
148  * @dfs_chan_freq:                Frequency in Mhz.
149  * @dfs_chan_flags:               Channel flags.
150  * @dfs_chan_flagext:             Extended channel flags.
151  * @dfs_chan_ieee:                IEEE channel number.
152  * @dfs_chan_vhtop_ch_freq_seg1:  Channel Center IEEE.
153  * @dfs_chan_vhtop_ch_freq_seg2:  Channel Center IEEE applicable for 80+80MHz
154  *                                mode of operation.
155  * @dfs_chan_mhz_freq_seg1:       Primary channel center freq.
156  * @dfs_chan_mhz_freq_seg2:       Secondary channel center freq applicable for
157  *                                80+80 MHZ.
158  */
159 
160 #ifdef CONFIG_CHAN_FREQ_API
161 QDF_STATUS dfs_mlme_get_extchan_for_freq(struct wlan_objmgr_pdev *pdev,
162 					 uint16_t *dfs_chan_freq,
163 					 uint64_t *dfs_chan_flags,
164 					 uint16_t *dfs_chan_flagext,
165 					 uint8_t *dfs_chan_ieee,
166 					 uint8_t *dfs_chan_vhtop_ch_freq_seg1,
167 					 uint8_t *dfs_chan_vhtop_ch_freq_seg2,
168 					 uint16_t *dfs_chan_mhz_freq_seg1,
169 					 uint16_t *dfs_chan_mhz_freq_seg2);
170 #endif
171 
172 /**
173  * dfs_mlme_set_no_chans_available() - Set no_chans_available flag.
174  * @pdev: Pointer to DFS pdev object.
175  * @val: Set this value to no_chans_available flag.
176  */
177 void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev,
178 		int val);
179 
180 /**
181  * dfs_mlme_ieee2mhz() - Get the frequency from channel number.
182  * @pdev: Pointer to DFS pdev object.
183  * @ieee: Channel number.
184  * @flag: Channel flag.
185  */
186 int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev,
187 		int ieee,
188 		uint64_t flag);
189 
190 /**
191  * dfs_mlme_find_dot11_channel() - Get dot11 channel from ieee, cfreq2 and mode.
192  * @pdev: Pointer to DFS pdev object.
193  * @ieee: Channel number.
194  * @des_cfreq2: cfreq2
195  * @mode: Phymode
196  * @dfs_ch_freq:                Frequency in Mhz.
197  * @dfs_ch_flags:               Channel flags.
198  * @dfs_ch_flagext:             Extended channel flags.
199  * @dfs_ch_ieee:                IEEE channel number.
200  * @dfs_ch_vhtop_ch_freq_seg1:  Channel Center frequency.
201  * @dfs_ch_vhtop_ch_freq_seg2:  Channel Center frequency applicable for 80+80MHz
202  *                          mode of operation.
203  *
204  * Return:
205  * * QDF_STATUS_SUCCESS  : Channel found.
206  * * QDF_STATUS_E_FAILURE: Channel not found.
207  */
208 #ifdef CONFIG_CHAN_NUM_API
209 QDF_STATUS
210 dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev,
211 			    uint8_t ieee,
212 			    uint8_t des_cfreq2,
213 			    int mode,
214 			    uint16_t *dfs_ch_freq,
215 			    uint64_t *dfs_ch_flags,
216 			    uint16_t *dfs_ch_flagext,
217 			    uint8_t *dfs_ch_ieee,
218 			    uint8_t *dfs_ch_vhtop_ch_freq_seg1,
219 			    uint8_t *dfs_ch_vhtop_ch_freq_seg2);
220 #endif
221 
222 /**
223  * dfs_mlme_find_dot11_chan_for_freq() - Find a channel pointer given the mode,
224  * frequency and channel flags.
225  * @pdev: Pointer to DFS pdev object.
226  * @ch_freq: Channel frequency.
227  * @des_cfreq2_mhz: cfreq2 in MHZ.
228  * @mode: Phymode
229  * @dfs_chan_freq:                Frequency in Mhz.
230  * @dfs_chan_flags:               Channel flags.
231  * @dfs_chan_flagext:             Extended channel flags.
232  * @dfs_chan_ieee:                IEEE channel number.
233  * @dfs_chan_vhtop_ch_freq_seg1:  Channel Center IEEE for primary 80 segment.
234  * @dfs_chan_vhtop_ch_freq_seg2:  Channel Center frequency applicable for
235  *                                80+80MHz mode of operation.
236  * @dfs_chan_mhz_freq_seg1:       Channel center frequency of primary 80 segment.
237  * @dfs_chan_mhz_freq_seg2:       Channel center frequency for secondary 80
238  *                                segment applicable only for 80+80MHZ mode of
239  *                                operation.
240  *
241  * Return:
242  * * QDF_STATUS_SUCCESS  : Channel found.
243  * * QDF_STATUS_E_FAILURE: Channel not found.
244  */
245 #ifdef CONFIG_CHAN_FREQ_API
246 QDF_STATUS
247 dfs_mlme_find_dot11_chan_for_freq(struct wlan_objmgr_pdev *pdev,
248 				  uint16_t chan_freq,
249 				  uint16_t des_cfreq2_mhz,
250 				  int mode,
251 				  uint16_t *dfs_chan_freq,
252 				  uint64_t *dfs_chan_flags,
253 				  uint16_t *dfs_chan_flagext,
254 				  uint8_t *dfs_chan_ieee,
255 				  uint8_t *dfs_chan_vhtop_ch_freq_seg1,
256 				  uint8_t *dfs_chan_vhtop_ch_freq_seg2,
257 				  uint16_t *dfs_chan_mhz_freq_seg1,
258 				  uint16_t *dfs_chan_mhz_freq_seg2);
259 #endif
260 
261 /**
262  * dfs_mlme_get_dfs_ch_channels() - Get channel from channel list.
263  * @pdev: Pointer to DFS pdev object.
264  * @dfs_ch_freq:                Frequency in Mhz.
265  * @dfs_ch_flags:               Channel flags.
266  * @dfs_ch_flagext:             Extended channel flags.
267  * @dfs_ch_ieee:                IEEE channel number.
268  * @dfs_ch_vhtop_ch_freq_seg1:  Channel Center frequency.
269  * @dfs_ch_vhtop_ch_freq_seg2:  Channel Center frequency applicable for 80+80MHz
270  *                          mode of operation.
271  * @index: Index into channel list.
272  */
273 #ifdef CONFIG_CHAN_NUM_API
274 void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev,
275 				  uint16_t *dfs_ch_freq,
276 				  uint64_t *dfs_ch_flags,
277 				  uint16_t *dfs_ch_flagext,
278 				  uint8_t *dfs_ch_ieee,
279 				  uint8_t *dfs_ch_vhtop_ch_freq_seg1,
280 				  uint8_t *dfs_ch_vhtop_ch_freq_seg2,
281 				  int index);
282 #endif
283 
284 /**
285  * dfs_mlme_get_dfs_channels_for_freq() - Get DFS channel from channel list.
286  * @pdev: Pointer to DFS pdev object.
287  * @dfs_chan_freq:                Frequency in Mhz.
288  * @dfs_chan_flags:               Channel flags.
289  * @dfs_chan_flagext:             Extended channel flags.
290  * @dfs_chan_ieee:                IEEE channel number.
291  * @dfs_chan_vhtop_ch_freq_seg1:  Channel Center IEEE number.
292  * @dfs_chan_vhtop_ch_freq_seg2:  Channel Center IEEE applicable for 80+80MHz
293  *                                mode of operation.
294  * @dfs_chan_mhz_freq_seg1 :      Primary 80 Channel Center frequency.
295  * @dfs_chan_mhz_freq_seg2 :      Channel center frequency applicable only for
296  *                                80+80 mode of operation.
297  * @index: Index into channel list.
298  */
299 #ifdef CONFIG_CHAN_FREQ_API
300 void
301 dfs_mlme_get_dfs_channels_for_freq(struct wlan_objmgr_pdev *pdev,
302 				   uint16_t *dfs_chan_freq,
303 				   uint64_t *dfs_chan_flags,
304 				   uint16_t *dfs_chan_flagext,
305 				   uint8_t *dfs_chan_ieee,
306 				   uint8_t *dfs_chan_vhtop_ch_freq_seg1,
307 				   uint8_t *dfs_chan_vhtop_ch_freq_seg2,
308 				   uint16_t *dfs_chan_mhz_freq_seg1,
309 				   uint16_t *dfs_chan_mhz_freq_seg2,
310 				   int index);
311 #endif
312 
313 /**
314  * dfs_mlme_dfs_ch_flags_ext() - Get extension channel flags.
315  * @pdev: Pointer to DFS pdev object.
316  */
317 uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev);
318 
319 /**
320  * dfs_mlme_channel_change_by_precac() - Channel change by PreCAC.
321  * @pdev: Pointer to DFS pdev object.
322  */
323 void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev);
324 
325 /**
326  * dfs_mlme_nol_timeout_notification() - NOL timeout notification to userspace.
327  * @pdev: Pointer to DFS pdev object.
328  */
329 void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev);
330 
331 /**
332  * dfs_mlme_clist_update() - Mark the channel as RADAR.
333  * @pdev: Pointer to DFS pdev object.
334  * @nollist: Pointer to NOL list.
335  * @nentries: Number of channels in the NOL list.
336  */
337 void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev,
338 		void *nollist,
339 		int nentries);
340 
341 /**
342  * dfs_mlme_get_cac_timeout() - Get cac_timeout.
343  * @pdev: Pointer to DFS pdev object.
344  * @dfs_ch_freq:                Frequency in Mhz.
345  * @dfs_ch_vhtop_ch_freq_seg2:  Channel Center frequency applicable for 80+80MHz
346  *                          mode of operation.
347  * @dfs_ch_flags:               Channel flags.
348  */
349 #ifdef CONFIG_CHAN_NUM_API
350 int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev,
351 		uint16_t dfs_ch_freq,
352 		uint8_t dfs_ch_vhtop_ch_freq_seg2,
353 		uint64_t dfs_ch_flags);
354 #endif
355 
356 /**
357  * dfs_mlme_get_cac_timeout_for_freq() - Get cac_timeout.
358  * @pdev: Pointer to DFS pdev object.
359  * @dfs_chan_freq:                Frequency in Mhz.
360  * @dfs_chan_vhtop_freq_seg2:  Channel Center frequency applicable for 80+80MHz
361  *                              mode of operation.
362  * @dfs_chan_flags:               Channel flags.
363  */
364 #ifdef CONFIG_CHAN_FREQ_API
365 int dfs_mlme_get_cac_timeout_for_freq(struct wlan_objmgr_pdev *pdev,
366 				      uint16_t dfs_chan_freq,
367 				      uint16_t dfs_chan_vhtop_freq_seg2_mhz,
368 				      uint64_t dfs_chan_flags);
369 #endif
370 /**
371  * dfs_mlme_rebuild_chan_list_with_non_dfs_channels() - Rebuild the channel list
372  * with only non DFS channels.
373  * @pdev: Pointer to DFS pdev object.
374  *
375  * return: On success return 1 or 0, else failure.
376  */
377 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
378 int dfs_mlme_rebuild_chan_list_with_non_dfs_channels(
379 		struct wlan_objmgr_pdev *pdev);
380 #else
381 static inline int dfs_mlme_rebuild_chan_list_with_non_dfs_channels(
382 		struct wlan_objmgr_pdev *pdev)
383 {
384 	return 0;
385 }
386 #endif
387 
388 /**
389  * dfs_mlme_restart_vaps_with_non_dfs_chan() - Restart vaps with non DFS
390  * channels
391  * @pdev: Pointer to DFS pdev object.
392  * @no_chans_avail: Indicates if no channel is available.
393  */
394 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
395 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev,
396 					     int no_chans_avail);
397 #else
398 static inline
399 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev,
400 					     int no_chans_avail)
401 {
402 }
403 #endif
404 
405 /**
406  * dfs_mlme_check_allowed_prim_chanlist() - Check whether the given channel is
407  * present in the primary allowed channel list or not
408  * @pdev: Pointer to DFS pdev object.
409  * @chan_num: Channel number
410  */
411 #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN)
412 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev,
413 					  uint32_t chan_freq);
414 
415 #else
416 static inline
417 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev,
418 					  uint32_t chan_freq)
419 {
420 	return true;
421 }
422 #endif
423 
424 /**
425  * dfs_mlme_handle_dfs_scan_violation() - Handle scan start failure
426  * due to DFS violation (presence of NOL channel in scan channel list).
427  * @pdev: Pointer to pdev object.
428  */
429 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
430 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev);
431 #else
432 static inline
433 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev)
434 {
435 }
436 #endif
437 
438 /**
439  * dfs_mlme_is_opmode_sta() - Check if pdev opmode is STA.
440  * @pdev: Pointer to DFS pdev object.
441  *
442  * Return: true if pdev opmode is STA, else false.
443  */
444 bool dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev *pdev);
445 
446 /**
447  * dfs_mlme_acquire_radar_mode_switch_lock() - Acquire lock for radar processing
448  * over mode switch handling.
449  * @pdev: Pointer to DFS pdev object.
450  *
451  * Return: void.
452  */
453 void dfs_mlme_acquire_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev);
454 
455 /**
456  * dfs_mlme_release_radar_mode_switch_lock() - Release lock taken for radar
457  * processing over mode switch handling.
458  * @pdev: Pointer to DFS pdev object.
459  *
460  * Return: void.
461  */
462 void dfs_mlme_release_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev);
463 #endif /* _WLAN_DFS_MLME_API_H_ */
464