xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/inc/wlan_dfs_mlme_api.h (revision 1397a33f48ea6455be40871470b286e535820eb8)
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: 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 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev,
48 			uint8_t ieee,
49 			uint16_t freq,
50 			uint8_t vhtop_ch_freq_seg2,
51 			uint64_t flags);
52 
53 /**
54  * dfs_mlme_start_csa() - Sends CSA in ieeeChan
55  * @pdev: Pointer to DFS pdev object.
56  * @ieee_chan: Channel number.
57  * @freq: Channel frequency.
58  * @cfreq2: HT80 cfreq2.
59  * @flags: channel flags.
60  */
61 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev,
62 		uint8_t ieee_chan,
63 		uint16_t freq,
64 		uint8_t cfreq2,
65 		uint64_t flags);
66 
67 /**
68  * dfs_mlme_proc_cac() - Process the CAC completion event.
69  * @pdev: Pointer to DFS pdev object.
70  * @vdev_id: vdev id.
71  */
72 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id);
73 
74 /**
75  * dfs_mlme_deliver_event_up_after_cac() - Send a CAC timeout, VAP up event to
76  * userspace.
77  * @pdev: Pointer to DFS pdev object.
78  */
79 void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev);
80 
81 /**
82  * dfs_mlme_get_dfs_ch_nchans() - Get number of channels in the channel list
83  * @pdev: Pointer to DFS pdev object.
84  * @nchans: Pointer to save the channel number.
85  */
86 void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev, int *nchans);
87 
88 /**
89  * dfs_mlme_get_extchan() - Get extension channel.
90  * @pdev: Pointer to DFS pdev object.
91  * @dfs_ch_freq:                Frequency in Mhz.
92  * @dfs_ch_flags:               Channel flags.
93  * @dfs_ch_flagext:             Extended channel flags.
94  * @dfs_ch_ieee:                IEEE channel number.
95  * @dfs_ch_vhtop_ch_freq_seg1:  Channel Center frequency.
96  * @dfs_ch_vhtop_ch_freq_seg2:  Channel Center frequency applicable for 80+80MHz
97  *                          mode of operation.
98  */
99 QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev,
100 		uint16_t *dfs_ch_freq,
101 		uint64_t *dfs_ch_flags,
102 		uint16_t *dfs_ch_flagext,
103 		uint8_t *dfs_ch_ieee,
104 		uint8_t *dfs_ch_vhtop_ch_freq_seg1,
105 		uint8_t *dfs_ch_vhtop_ch_freq_seg2);
106 
107 /**
108  * dfs_mlme_set_no_chans_available() - Set no_chans_available flag.
109  * @pdev: Pointer to DFS pdev object.
110  * @val: Set this value to no_chans_available flag.
111  */
112 void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev,
113 		int val);
114 
115 /**
116  * dfs_mlme_ieee2mhz() - Get the frequency from channel number.
117  * @pdev: Pointer to DFS pdev object.
118  * @ieee: Channel number.
119  * @flag: Channel flag.
120  */
121 int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev,
122 		int ieee,
123 		uint64_t flag);
124 
125 /**
126  * dfs_mlme_find_dot11_channel() - Get dot11 channel from ieee, cfreq2 and mode.
127  * @pdev: Pointer to DFS pdev object.
128  * @ieee: Channel number.
129  * @des_cfreq2: cfreq2
130  * @mode: Phymode
131  * @dfs_ch_freq:                Frequency in Mhz.
132  * @dfs_ch_flags:               Channel flags.
133  * @dfs_ch_flagext:             Extended channel flags.
134  * @dfs_ch_ieee:                IEEE channel number.
135  * @dfs_ch_vhtop_ch_freq_seg1:  Channel Center frequency.
136  * @dfs_ch_vhtop_ch_freq_seg2:  Channel Center frequency applicable for 80+80MHz
137  *                          mode of operation.
138  *
139  * Return:
140  * * QDF_STATUS_SUCCESS  : Channel found.
141  * * QDF_STATUS_E_FAILURE: Channel not found.
142  */
143 QDF_STATUS
144 dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev,
145 			    uint8_t ieee,
146 			    uint8_t des_cfreq2,
147 			    int mode,
148 			    uint16_t *dfs_ch_freq,
149 			    uint64_t *dfs_ch_flags,
150 			    uint16_t *dfs_ch_flagext,
151 			    uint8_t *dfs_ch_ieee,
152 			    uint8_t *dfs_ch_vhtop_ch_freq_seg1,
153 			    uint8_t *dfs_ch_vhtop_ch_freq_seg2);
154 
155 /**
156  * dfs_mlme_get_dfs_ch_channels() - Get channel from channel list.
157  * @pdev: Pointer to DFS pdev object.
158  * @dfs_ch_freq:                Frequency in Mhz.
159  * @dfs_ch_flags:               Channel flags.
160  * @dfs_ch_flagext:             Extended channel flags.
161  * @dfs_ch_ieee:                IEEE channel number.
162  * @dfs_ch_vhtop_ch_freq_seg1:  Channel Center frequency.
163  * @dfs_ch_vhtop_ch_freq_seg2:  Channel Center frequency applicable for 80+80MHz
164  *                          mode of operation.
165  * @index: Index into channel list.
166  */
167 void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev,
168 				  uint16_t *dfs_ch_freq,
169 				  uint64_t *dfs_ch_flags,
170 				  uint16_t *dfs_ch_flagext,
171 				  uint8_t *dfs_ch_ieee,
172 				  uint8_t *dfs_ch_vhtop_ch_freq_seg1,
173 				  uint8_t *dfs_ch_vhtop_ch_freq_seg2,
174 				  int index);
175 
176 /**
177  * dfs_mlme_dfs_ch_flags_ext() - Get extension channel flags.
178  * @pdev: Pointer to DFS pdev object.
179  */
180 uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev);
181 
182 /**
183  * dfs_mlme_channel_change_by_precac() - Channel change by PreCAC.
184  * @pdev: Pointer to DFS pdev object.
185  */
186 void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev);
187 
188 /**
189  * dfs_mlme_nol_timeout_notification() - NOL timeout notification to userspace.
190  * @pdev: Pointer to DFS pdev object.
191  */
192 void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev);
193 
194 /**
195  * dfs_mlme_clist_update() - Mark the channel as RADAR.
196  * @pdev: Pointer to DFS pdev object.
197  * @nollist: Pointer to NOL list.
198  * @nentries: Number of channels in the NOL list.
199  */
200 void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev,
201 		void *nollist,
202 		int nentries);
203 
204 /**
205  * dfs_mlme_get_cac_timeout() - Get cac_timeout.
206  * @pdev: Pointer to DFS pdev object.
207  * @dfs_ch_freq:                Frequency in Mhz.
208  * @dfs_ch_vhtop_ch_freq_seg2:  Channel Center frequency applicable for 80+80MHz
209  *                          mode of operation.
210  * @dfs_ch_flags:               Channel flags.
211  */
212 int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev,
213 		uint16_t dfs_ch_freq,
214 		uint8_t dfs_ch_vhtop_ch_freq_seg2,
215 		uint64_t dfs_ch_flags);
216 
217 /**
218  * dfs_mlme_rebuild_chan_list_with_non_dfs_channels() - Rebuild the channel list
219  * with only non DFS channels.
220  * @pdev: Pointer to DFS pdev object.
221  *
222  * return: On success return 1 or 0, else failure.
223  */
224 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
225 int dfs_mlme_rebuild_chan_list_with_non_dfs_channels(
226 		struct wlan_objmgr_pdev *pdev);
227 #else
228 static inline int dfs_mlme_rebuild_chan_list_with_non_dfs_channels(
229 		struct wlan_objmgr_pdev *pdev)
230 {
231 	return 0;
232 }
233 #endif
234 
235 /**
236  * dfs_mlme_restart_vaps_with_non_dfs_chan() - Restart vaps with non DFS
237  * channels
238  * @pdev: Pointer to DFS pdev object.
239  * @no_chans_avail: Indicates if no channel is available.
240  */
241 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
242 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev,
243 					     int no_chans_avail);
244 #else
245 static inline
246 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev,
247 					     int no_chans_avail)
248 {
249 }
250 #endif
251 
252 /**
253  * dfs_mlme_check_allowed_prim_chanlist() - Check whether the given channel is
254  * present in the primary allowed channel list or not
255  * @pdev: Pointer to DFS pdev object.
256  * @chan_num: Channel number
257  */
258 #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN)
259 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev,
260 					  uint32_t chan_num);
261 
262 #else
263 static inline
264 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev,
265 					  uint32_t chan_num)
266 {
267 	return true;
268 }
269 #endif
270 
271 /**
272  * dfs_mlme_handle_dfs_scan_violation() - Handle scan start failure
273  * due to DFS violation (presence of NOL channel in scan channel list).
274  * @pdev: Pointer to pdev object.
275  */
276 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
277 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev);
278 #else
279 static inline
280 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev)
281 {
282 }
283 #endif
284 
285 /**
286  * dfs_mlme_is_opmode_sta() - Check if pdev opmode is STA.
287  * @pdev: Pointer to DFS pdev object.
288  *
289  * Return: true if pdev opmode is STA, else false.
290  */
291 bool dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev *pdev);
292 #endif /* _WLAN_DFS_MLME_API_H_ */
293