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