1 /*
2 * Copyright (c) 2018-2019, 2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 /**
19 * DOC: Define VDEV MLME public APIs
20 */
21
22 #ifndef _WLAN_VDEV_MLME_API_H_
23 #define _WLAN_VDEV_MLME_API_H_
24
25 #include <wlan_ext_mlme_obj_types.h>
26
27 #define WLAN_INVALID_VDEV_ID 255
28 #define WILDCARD_PDEV_ID 0x0
29
30 #ifdef WLAN_FEATURE_SR
31 #define PSR_DISALLOWED 1
32 #define NON_SRG_SPR_ENABLE_SIZE 1
33 #define SR_PARAM_VAL_DBM_UNIT 1
34 #define SR_PARAM_VAL_DBM_POS 29
35 #define NON_SRG_PARAM_VAL_DBM_SIZE 1
36 #define NON_SRG_MAX_PD_OFFSET_POS 0
37 #define NON_SRG_MAX_PD_OFFSET_SIZE 8
38 #define SR_PD_THRESHOLD_MIN -82
39 #define SR_PD_THRESHOLD_MAX -62
40 #define SRG_SPR_ENABLE_POS 30
41 #define SRG_THRESHOLD_MAX_PD_POS 8
42 #define NON_SRG_PD_SR_DISALLOWED 0x02
43 #define HE_SIG_VAL_15_ALLOWED 0x10
44 #define NON_SRG_OFFSET_PRESENT 0x04
45 #define NON_SRG_MAX_PD_OFFSET 20
46 #define SRG_INFO_PRESENT 0x08
47 #define NON_SRG_SPR_ENABLE_POS 31
48 #define NON_SRG_SPR_ENABLE 0x80
49 #define NON_SR_PD_THRESHOLD_DISABLED 0x80
50 #define SR_PADDING_BYTE 8
51 #endif
52
53
54 /**
55 * enum wlan_mlme_peer_param_id - peer param id in mlme layer
56 * @WLAN_MLME_PEER_BW_PUNCTURE: update puncture 20 MHz bitmap
57 * @WLAN_MLME_PEER_MAX: max enumeration
58 */
59 enum wlan_mlme_peer_param_id {
60 WLAN_MLME_PEER_BW_PUNCTURE,
61 WLAN_MLME_PEER_MAX
62 };
63
64 /**
65 * wlan_vdev_mlme_get_cmpt_obj - Retrieves MLME component object
66 * from VDEV object
67 * @vdev: pointer to vdev object
68 *
69 * Retrieves MLME component object from VDEV object
70 *
71 * Return: comp handle on SUCCESS
72 * NULL, if it fails to retrieve
73 */
74 struct vdev_mlme_obj *wlan_vdev_mlme_get_cmpt_obj(
75 struct wlan_objmgr_vdev *vdev);
76 /**
77 * wlan_vdev_mlme_set_ext_hdl - Sets legacy handle
78 * @vdev: pointer to vdev object
79 * @ext_hdl: pointer to legacy handle
80 *
81 * Sets Legacy handle to MLME component object
82 *
83 * Return:
84 */
85 void wlan_vdev_mlme_set_ext_hdl(struct wlan_objmgr_vdev *vdev,
86 mlme_vdev_ext_t *ext_hdl);
87
88 /**
89 * wlan_vdev_mlme_get_ext_hdl - Returns legacy handle
90 * @vdev: pointer to vdev object
91 *
92 * Retrieves legacy handle from vdev mlme component object
93 *
94 * Return: legacy handle on SUCCESS
95 * NULL, if it fails to retrieve
96 */
97 mlme_vdev_ext_t *wlan_vdev_mlme_get_ext_hdl(struct wlan_objmgr_vdev *vdev);
98
99 /**
100 * wlan_vdev_mlme_sm_deliver_evt() - Delivers event to VDEV MLME SM
101 * @vdev: Object manager VDEV object
102 * @event: MLME event
103 * @event_data_len: data size
104 * @event_data: event data
105 *
106 * API to dispatch event to VDEV MLME SM with lock acquired
107 *
108 * Return: SUCCESS: on handling event
109 * FAILURE: on ignoring the event
110 */
111 QDF_STATUS wlan_vdev_mlme_sm_deliver_evt(struct wlan_objmgr_vdev *vdev,
112 enum wlan_vdev_sm_evt event,
113 uint16_t event_data_len,
114 void *event_data);
115
116 /**
117 * wlan_vdev_mlme_sm_deliver_evt_sync() - Delivers event to VDEV MLME SM sync
118 * @vdev: Object manager VDEV object
119 * @event: MLME event
120 * @event_data_len: data size
121 * @event_data: event data
122 *
123 * API to dispatch event to VDEV MLME SM with lock acquired
124 *
125 * Return: SUCCESS: on handling event
126 * FAILURE: on ignoring the event
127 */
128 QDF_STATUS wlan_vdev_mlme_sm_deliver_evt_sync(struct wlan_objmgr_vdev *vdev,
129 enum wlan_vdev_sm_evt event,
130 uint16_t event_data_len,
131 void *event_data);
132
133 #ifdef SM_ENG_HIST_ENABLE
134 /**
135 * wlan_vdev_mlme_sm_history_print() - Prints SM history
136 * @vdev: Object manager VDEV object
137 *
138 * API to print SM history
139 *
140 * Return: void
141 */
142 void wlan_vdev_mlme_sm_history_print(struct wlan_objmgr_vdev *vdev);
143
144 #endif
145
146 /**
147 * wlan_vdev_allow_connect_n_tx() - Checks whether VDEV is in operational state
148 * @vdev: Object manager VDEV object
149 *
150 * API to checks the VDEV MLME SM state to allow tx or connections
151 *
152 * Return: SUCCESS: to allow tx or connection
153 * FAILURE: otherwise failure
154 */
155 QDF_STATUS wlan_vdev_allow_connect_n_tx(struct wlan_objmgr_vdev *vdev);
156
157 /**
158 * wlan_vdev_mlme_is_active() - Checks whether VDEV is in active state
159 * @vdev: Object manager VDEV object
160 *
161 * API to checks the VDEV MLME SM state to check channel is configured in FW
162 *
163 * Return: SUCCESS: valid channel is configured
164 * FAILURE: otherwise failure
165 */
166 QDF_STATUS wlan_vdev_mlme_is_active(struct wlan_objmgr_vdev *vdev);
167
168 /**
169 * wlan_vdev_chan_config_valid() - Checks whether VDEV chan config valid
170 * @vdev: Object manager VDEV object
171 *
172 * API to checks the VDEV MLME SM state to check channel is configured in Host
173 *
174 * Return: SUCCESS: valid channel is configured
175 * FAILURE: otherwise failure
176 */
177 QDF_STATUS wlan_vdev_chan_config_valid(struct wlan_objmgr_vdev *vdev);
178
179 /**
180 * wlan_vdev_mlme_is_csa_restart() - Checks whether VDEV MLME SM is in CSA
181 * @vdev: Object manager VDEV object
182 *
183 * API to checks the VDEV MLME SM state for CSA_RESTART substate
184 *
185 * Return: SUCCESS: if it is in CSA_RESTART sub state
186 * FAILURE: otherwise failure
187 */
188 QDF_STATUS wlan_vdev_mlme_is_csa_restart(struct wlan_objmgr_vdev *vdev);
189
190 /**
191 * wlan_vdev_is_going_down() - Checks whether VDEV is being brought down
192 * @vdev: Object manager VDEV object
193 *
194 * API to checks the VDEV MLME SM state to check VDEV is being brought down
195 *
196 * Return: SUCCESS: valid channel is configured
197 * FAILURE: otherwise failure
198 */
199 QDF_STATUS wlan_vdev_is_going_down(struct wlan_objmgr_vdev *vdev);
200
201 /**
202 * wlan_vdev_is_mlo_peer_create_allowed() - Checks whether PEER can be created
203 * @vdev: Object manager VDEV object
204 *
205 * API to check the VDEV MLME SM state to allow PEER association in MLD
206 *
207 * Return: SUCCESS: if peer create can be allowed
208 * FAILURE: otherwise failure
209 */
210 QDF_STATUS wlan_vdev_is_mlo_peer_create_allowed(struct wlan_objmgr_vdev *vdev);
211
212 /**
213 * wlan_vdev_is_restart_progress() - Checks VDEV restart is in progress
214 * @vdev: Object manager VDEV object
215 *
216 * API to check whether restarts is in progress
217 *
218 * Return: SUCCESS: if restart is in progress
219 * FAILURE: otherwise failure
220 */
221 QDF_STATUS wlan_vdev_is_restart_progress(struct wlan_objmgr_vdev *vdev);
222
223 /**
224 * wlan_vdev_is_dfs_cac_wait() - Checks VDEV is in cac wait state
225 * @vdev: Object manager VDEV object
226 *
227 * API to check whether state is cac wait state
228 *
229 * Return: SUCCESS: if state is cac wait state
230 * FAILURE: otherwise failure
231 */
232 QDF_STATUS wlan_vdev_is_dfs_cac_wait(struct wlan_objmgr_vdev *vdev);
233
234 /**
235 * wlan_vdev_mlme_cmd_lock - Acquire lock for command queuing atomicity
236 * @vdev: Object manager VDEV object
237 *
238 * API to take VDEV MLME command lock
239 *
240 * Return: void
241 */
242 void wlan_vdev_mlme_cmd_lock(struct wlan_objmgr_vdev *vdev);
243
244 /**
245 * wlan_vdev_mlme_cmd_unlock - Release lock for command queuing atomicity
246 * @vdev: Object manager VDEV object
247 *
248 * API to release VDEV MLME command lock
249 *
250 * Return: void
251 */
252 void wlan_vdev_mlme_cmd_unlock(struct wlan_objmgr_vdev *vdev);
253
254 /**
255 * wlan_vdev_mlme_is_scan_allowed() - Checks whether scan is allowed
256 * @vdev: Object manager VDEV object
257 *
258 * API to checks the VDEV MLME SM state to check scan is allowed
259 *
260 * Return: SUCCESS: if scan is allowed
261 * FAILURE: otherwise failure
262 */
263 QDF_STATUS wlan_vdev_mlme_is_scan_allowed(struct wlan_objmgr_vdev *vdev);
264
265 /**
266 * wlan_vdev_mlme_is_init_state() - Checks whether vdev is in init state
267 * @vdev: Object manager VDEV object
268 *
269 * API to checks the VDEV MLME SM state is in init state or not
270 *
271 * Return: SUCCESS: if vdev is in init state
272 * FAILURE: otherwise failure
273 */
274 QDF_STATUS wlan_vdev_mlme_is_init_state(struct wlan_objmgr_vdev *vdev);
275
276 /**
277 * wlan_vdev_is_up_active_state() - Checks whether vdev is in up active state
278 * @vdev: Object manager VDEV object
279 *
280 * API to checks the VDEV MLME SM state is in UP ACTIVE state
281 *
282 * Return: SUCCESS: if vdev is in UP ACTIVE state
283 * FAILURE: otherwise failure
284 */
285 QDF_STATUS wlan_vdev_is_up_active_state(struct wlan_objmgr_vdev *vdev);
286
287 #ifdef WLAN_FEATURE_11BE_MLO
288 /**
289 * wlan_vdev_mlme_get_is_mlo_link() - check if its mlo link vdev
290 * @psoc: PSOC object
291 * @vdev_id: VDEV Id
292 *
293 * Return: True if it is mlo link, otherwise false.
294 */
295 bool
296 wlan_vdev_mlme_get_is_mlo_link(struct wlan_objmgr_psoc *psoc,
297 uint8_t vdev_id);
298
299 /**
300 * wlan_vdev_mlme_get_is_mlo_vdev() - check if its mlo assoc vdev
301 * @psoc: PSOC object
302 * @vdev_id: VDEV Id
303 *
304 * Return: True if it is mlo link, otherwise false.
305 */
306 bool
307 wlan_vdev_mlme_get_is_mlo_vdev(struct wlan_objmgr_psoc *psoc,
308 uint8_t vdev_id);
309 #else
310 static inline bool
wlan_vdev_mlme_get_is_mlo_link(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)311 wlan_vdev_mlme_get_is_mlo_link(struct wlan_objmgr_psoc *psoc,
312 uint8_t vdev_id)
313 {
314 return false;
315 }
316
317 static inline bool
wlan_vdev_mlme_get_is_mlo_vdev(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)318 wlan_vdev_mlme_get_is_mlo_vdev(struct wlan_objmgr_psoc *psoc,
319 uint8_t vdev_id)
320 {
321 return false;
322 }
323 #endif
324 #ifdef WLAN_FEATURE_SR
325 /**
326 * wlan_mlme_update_sr_data() - Updates SR values
327 * @vdev: Object manager VDEV object
328 * @val: SR value
329 * @srg_pd_threshold: SRG PD threshold sent by userspace
330 * @non_srg_pd_threshold: NON SRG PD threshold sent by userspace
331 * @is_sr_enable: SR enable/disable from userspace
332 *
333 * API to Update SR value based on AP advertisement and provided by userspace
334 *
335 * Return: true/flase
336 */
337 void
338 wlan_mlme_update_sr_data(struct wlan_objmgr_vdev *vdev, int *val,
339 int32_t srg_pd_threshold, int32_t non_srg_pd_threshold,
340 bool is_sr_enable);
341 #else
342 static inline void
wlan_mlme_update_sr_data(struct wlan_objmgr_vdev * vdev,int * val,int32_t srg_pd_threshold,int32_t non_srg_pd_threshold,bool is_sr_enable)343 wlan_mlme_update_sr_data(struct wlan_objmgr_vdev *vdev, int *val,
344 int32_t srg_pd_threshold, int32_t non_srg_pd_threshold,
345 bool is_sr_enable)
346 {}
347 #endif
348
349 /**
350 * wlan_mlme_disable_fd_in_6ghz_band() - Set fd disabled flag in vdev
351 * @vdev: vdev object
352 * @disable_fd: Disable the 6 GHz FD.
353 *
354 * Return: void
355 */
356 void wlan_mlme_disable_fd_in_6ghz_band(struct wlan_objmgr_vdev *vdev,
357 bool disable_fd);
358
359 /**
360 * wlan_mlme_is_fd_disabled_in_6ghz_band() - Get fd disabled flag fom vdev
361 * @vdev: vdev obj
362 *
363 * Return: true/false
364 */
365 bool wlan_mlme_is_fd_disabled_in_6ghz_band(struct wlan_objmgr_vdev *vdev);
366 #endif
367