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