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