xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlo_mgr/inc/wlan_mlo_mgr_cmn.h (revision 901120c066e139c7f8a2c8e4820561fdd83c67ef)
1 /*
2  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 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: contains MLO manager public file containing common functionality
20  */
21 #ifndef _WLAN_MLO_MGR_CMN_H_
22 #define _WLAN_MLO_MGR_CMN_H_
23 
24 #include <qdf_types.h>
25 #include <qdf_trace.h>
26 #include "wlan_mlo_mgr_public_structs.h"
27 #include <wlan_mlo_mgr_main.h>
28 
29 #define mlo_alert(format, args...) \
30 		QDF_TRACE_FATAL(QDF_MODULE_ID_MLO, format, ## args)
31 
32 #define mlo_err(format, args...) \
33 		QDF_TRACE_ERROR(QDF_MODULE_ID_MLO, format, ## args)
34 
35 #define mlo_warn(format, args...) \
36 		QDF_TRACE_WARN(QDF_MODULE_ID_MLO, format, ## args)
37 
38 #define mlo_info(format, args...) \
39 		QDF_TRACE_INFO(QDF_MODULE_ID_MLO, format, ## args)
40 
41 #define mlo_debug(format, args...) \
42 		QDF_TRACE_DEBUG(QDF_MODULE_ID_MLO, format, ## args)
43 
44 #define mlo_nofl_alert(format, args...) \
45 		QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
46 
47 #define mlo_nofl_err(format, args...) \
48 		QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
49 
50 #define mlo_nofl_warn(format, args...) \
51 		QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
52 
53 #define mlo_nofl_info(format, args...) \
54 		QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
55 
56 #define mlo_nofl_debug(format, args...) \
57 		QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
58 
59 #define mlo_alert_rl(format, args...) \
60 		QDF_TRACE_FATAL_RL(QDF_MODULE_ID_MLO, format, ## args)
61 
62 #define mlo_err_rl(format, args...) \
63 		QDF_TRACE_ERROR_RL(QDF_MODULE_ID_MLO, format, ## args)
64 
65 #define mlo_warn_rl(format, args...) \
66 		QDF_TRACE_WARN_RL(QDF_MODULE_ID_MLO, format, ## args)
67 
68 #define mlo_info_rl(format, args...) \
69 		QDF_TRACE_INFO_RL(QDF_MODULE_ID_MLO, format, ## args)
70 
71 #define mlo_debug_rl(format, args...) \
72 		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_MLO, format, ## args)
73 
74 #define mlo_nofl_alert_rl(format, args...) \
75 		QDF_TRACE_FATAL_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
76 
77 #define mlo_nofl_err_rl(format, args...) \
78 		QDF_TRACE_ERROR_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
79 
80 #define mlo_nofl_warn_rl(format, args...) \
81 		QDF_TRACE_WARN_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
82 
83 #define mlo_nofl_info_rl(format, args...) \
84 		QDF_TRACE_INFO_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
85 
86 #define mlo_nofl_debug_rl(format, args...) \
87 		QDF_TRACE_DEBUG_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
88 
89 #define MLO_INVALID_LINK_IDX 0xFF
90 /**
91  * mlo_get_link_information() - get partner link information
92  * @mld_addr : MLD address
93  * @info: partner link information
94  *
95  * Return: QDF_STATUS
96  */
97 void mlo_get_link_information(struct qdf_mac_addr *mld_addr,
98 			      struct mlo_link_info *info);
99 /**
100  * is_mlo_all_links_up() - check all the link status in a MLO device
101  * @ml_dev: ML device context
102  *
103  * Return: QDF_STATUS
104  */
105 void is_mlo_all_links_up(struct wlan_mlo_dev_context *ml_dev);
106 
107 /**
108  * mlo_get_vdev_by_link_id() - get vdev by link id
109  * @vdev: vdev pointer
110  * @link_id: link id
111  *
112  * Caller should make sure to release the reference of thus obtained vdev
113  * by calling mlo_release_vdev_ref() after usage of vdev.
114  *
115  * Return: vdev object pointer to link id
116  */
117 struct wlan_objmgr_vdev *mlo_get_vdev_by_link_id(
118 			struct wlan_objmgr_vdev *vdev,
119 			uint8_t link_id);
120 
121 /**
122  * mlo_release_vdev_ref() - release vdev reference
123  * @vdev: vdev pointer
124  *
125  * Return: void
126  */
127 void mlo_release_vdev_ref(struct wlan_objmgr_vdev *vdev);
128 
129 /**
130  * mlo_reg_mlme_ext_cb() - Function to register mlme extended callbacks
131  * @ctx: Pointer to mlo manager global context
132  * @ops: Pointer to the struct containing the callbacks
133  *
134  * Return: QDF_STATUS_SUCCESS on successful registration else failure
135  */
136 QDF_STATUS mlo_reg_mlme_ext_cb(struct mlo_mgr_context *ctx,
137 			       struct mlo_mlme_ext_ops *ops);
138 
139 /**
140  * mlo_unreg_mlme_ext_cb() - Function to unregister mlme extended callbacks
141  * @ctx: Pointer to mlo manager global context
142  *
143  * Return: QDF_STATUS_SUCCESS on success else failure
144  */
145 QDF_STATUS mlo_unreg_mlme_ext_cb(struct mlo_mgr_context *ctx);
146 
147 /**
148  * mlo_mlme_clone_sta_security() - Clone Security params in partner vdevs
149  * @vdev: Object manager vdev
150  * @req: wlan_cm_connect_req data object to be passed to callback
151  *
152  * Return: QDF_STATUS
153  */
154 QDF_STATUS mlo_mlme_clone_sta_security(struct wlan_objmgr_vdev *vdev,
155 				       struct wlan_cm_connect_req *req);
156 
157 /**
158  * mlo_mlme_sta_op_class() - Update partner link op-class from ML-IE
159  * @vdev: Object manager vdev
160  * @ml_ie: buffer having the ML-IE from supplicant
161  *
162  * Return: QDF_STATUS
163  */
164 QDF_STATUS mlo_mlme_sta_op_class(struct wlan_objmgr_vdev *vdev,
165 				 uint8_t *ml_ie);
166 
167 /**
168  * mlo_mlme_validate_conn_req() - Validate connect request
169  * @vdev: Object manager vdev
170  * @ext_data: Data object to be passed to callback
171  *
172  * Return: QDF_STATUS
173  */
174 QDF_STATUS mlo_mlme_validate_conn_req(struct wlan_objmgr_vdev *vdev,
175 				      void *ext_data);
176 
177 /**
178  * mlo_mlme_ext_create_link_vdev() - Create link vdev for ML STA
179  * @vdev: Object manager vdev
180  * @ext_data: Data object to be passed to callback
181  *
182  * Return: QDF_STATUS
183  */
184 QDF_STATUS mlo_mlme_create_link_vdev(struct wlan_objmgr_vdev *vdev,
185 				     void *ext_data);
186 
187 /**
188  * mlo_mlme_peer_create() - Create mlo peer
189  * @vdev: Object manager vdev
190  * @ml_peer: MLO peer context
191  * @addr: Peer addr
192  * @frm_buf: Frame buffer for IE processing
193  *
194  * Return: void
195  */
196 void mlo_mlme_peer_create(struct wlan_objmgr_vdev *vdev,
197 			  struct wlan_mlo_peer_context *ml_peer,
198 			  struct qdf_mac_addr *addr,
199 			  qdf_nbuf_t frm_buf);
200 
201 /**
202  * mlo_mlme_peer_assoc() - Send ML Peer assoc
203  * @peer: Object manager peer
204  *
205  * Return: void
206  */
207 void mlo_mlme_peer_assoc(struct wlan_objmgr_peer *peer);
208 
209 /**
210  * mlo_mlme_peer_assoc_fail() - Send ML Peer assoc fail
211  * @peer: Object manager peer
212  *
213  * Return: void
214  */
215 void mlo_mlme_peer_assoc_fail(struct wlan_objmgr_peer *peer);
216 
217 /**
218  * mlo_mlme_peer_delete() - Send ML Peer delete
219  * @peer: Object manager peer
220  *
221  * Return: void
222  */
223 void mlo_mlme_peer_delete(struct wlan_objmgr_peer *peer);
224 
225 /**
226  * mlo_mlme_peer_assoc_resp() - Initiate sending of Assoc response
227  * @peer: Object manager peer
228  *
229  * Return: void
230  */
231 void mlo_mlme_peer_assoc_resp(struct wlan_objmgr_peer *peer);
232 
233 /**
234  * mlo_mlme_get_link_assoc_req() - API to get link assoc req buffer
235  * @peer: Object manager peer
236  * @link_ix: link id of vdev
237  *
238  * Return: assoc req buffer
239  */
240 qdf_nbuf_t mlo_mlme_get_link_assoc_req(struct wlan_objmgr_peer *peer,
241 				       uint8_t link_ix);
242 
243 /**
244  * mlo_mlme_peer_deauth() - Initiate deauth on link peer
245  * @peer: Object manager peer
246  *
247  * Return: void
248  */
249 void mlo_mlme_peer_deauth(struct wlan_objmgr_peer *peer);
250 
251 #ifdef UMAC_MLO_AUTH_DEFER
252 /**
253  * mlo_mlme_peer_process_auth() - Process deferred auth request
254  * @auth_params: deferred auth params
255  *
256  * Return: void
257  */
258 void mlo_mlme_peer_process_auth(struct mlpeer_auth_params *auth_param);
259 #else
260 static inline void
261 mlo_mlme_peer_process_auth(struct mlpeer_auth_params *auth_param)
262 {
263 }
264 #endif
265 
266 /**
267  * mlo_get_link_vdev_ix() - Get index of link VDEV in MLD
268  * @ml_dev: ML device context
269  * @vdev: VDEV object
270  *
271  * Return: link index
272  */
273 
274 uint8_t mlo_get_link_vdev_ix(struct wlan_mlo_dev_context *mldev,
275 			     struct wlan_objmgr_vdev *vdev);
276 
277 /**
278  * mlo_get_ml_vdev_list() - get mlo vdev list
279  * @vdev: vdev pointer
280  * @vdev_count: vdev count
281  * @wlan_vdev_list: vdev list
282  *
283  * Caller should release ref of the vdevs in wlan_vdev_list
284  * Return: None
285  */
286 void mlo_get_ml_vdev_list(struct wlan_objmgr_vdev *vdev,
287 			  uint16_t *vdev_count,
288 			  struct wlan_objmgr_vdev **wlan_vdev_list);
289 
290 /**
291  * mlo_mlme_handle_sta_csa_param() - process saved mlo sta csa param
292  * @vdev: vdev pointer
293  * @csa_param: saved csa_param
294  *
295  * Return: None
296  */
297 void mlo_mlme_handle_sta_csa_param(struct wlan_objmgr_vdev *vdev,
298 				   struct csa_offload_params *csa_param);
299 
300 #define INVALID_HW_LINK_ID 0xFFFF
301 #define WLAN_MLO_INVALID_NUM_LINKS             (-1)
302 #ifdef WLAN_MLO_MULTI_CHIP
303 /**
304  * wlan_mlo_get_max_num_links() - Get the maximum number of MLO links
305  * possible in the system
306  *
307  * Return: Maximum number of MLO links in the system
308  */
309 int8_t wlan_mlo_get_max_num_links(void);
310 
311 /**
312  * wlan_mlo_get_num_active_links() - Get the number of active MLO links
313  * in the system
314  *
315  * Return: Number of active MLO links in the system
316  */
317 int8_t wlan_mlo_get_num_active_links(void);
318 
319 /**
320  * wlan_mlo_get_valid_link_bitmap() - Get the bitmap indicating the valid
321  * MLO links in the system. If bit position i is set, link with id i is
322  * valid.
323  *
324  * Return: Valid link bitmap
325  */
326 uint16_t wlan_mlo_get_valid_link_bitmap(void);
327 
328 /**
329  * wlan_mlo_get_pdev_hw_link_id() - Get hw_link_id of pdev
330  * @pdev: pdev object
331  *
332  * Return: hw_link_id of the pdev.
333  */
334 uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev);
335 
336 /**
337  * struct hw_link_id_iterator: Argument passed in psoc/pdev iterator to
338  *                             find pdev from hw_link_id
339  * @hw_link_id: HW link id of pdev to find
340  * @dbgid: Module ref id used in iterator
341  * @pdev: Pointer to pdev. This will be set inside itertor callback
342  *        if hw_link_id match is found.
343  */
344 struct hw_link_id_iterator {
345 	uint16_t hw_link_id;
346 	wlan_objmgr_ref_dbgid dbgid;
347 	struct wlan_objmgr_pdev *pdev;
348 };
349 
350 /**
351  * wlan_objmgr_get_pdev_by_hw_link_id() - Get pdev object from hw_link_id
352  * @hw_link_id: HW link id of the pdev
353  * @refdbgid: dbgid of module used for taking reference to pdev object
354  *
355  * Return: Pointer to pdev object if hw_link_id is valid. Else, NULL
356  *         Reference will be held with refdgid if return is non-NULL.
357  *         Caller should free this reference.
358  */
359 struct wlan_objmgr_pdev *
360 wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id,
361 				wlan_objmgr_ref_dbgid refdbgid);
362 
363 #else
364 static inline int8_t
365 wlan_mlo_get_max_num_links(void)
366 {
367 	return WLAN_MLO_INVALID_NUM_LINKS;
368 }
369 
370 static inline int8_t
371 wlan_mlo_get_num_active_links(void)
372 {
373 	return WLAN_MLO_INVALID_NUM_LINKS;
374 }
375 
376 static inline uint16_t
377 wlan_mlo_get_valid_link_bitmap(void)
378 {
379 	return 0;
380 }
381 
382 static inline struct wlan_objmgr_pdev *
383 wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id,
384 				wlan_objmgr_ref_dbgid refdbgid)
385 {
386 	return NULL;
387 }
388 
389 static inline
390 uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev)
391 {
392 	return INVALID_HW_LINK_ID;
393 }
394 #endif/*WLAN_MLO_MULTI_CHIP*/
395 
396 #ifdef WLAN_FEATURE_11BE_MLO
397 /**
398  * mlo_process_link_set_active_resp() - handler for mlo link set active response
399  * @psoc: psoc pointer
400  * @event: pointer to mlo link set active response
401  *
402  * Return: QDF_STATUS
403  */
404 QDF_STATUS
405 mlo_process_link_set_active_resp(struct wlan_objmgr_psoc *psoc,
406 				 struct mlo_link_set_active_resp *event);
407 
408 /**
409  * mlo_ser_set_link_req() - add mlo link set active cmd to serialization
410  * @req: mlo link set active request
411  *
412  * Return: QDF_STATUS
413  */
414 QDF_STATUS mlo_ser_set_link_req(struct mlo_link_set_active_req *req);
415 
416 /*
417  * API to have operation on ml vdevs
418  */
419 typedef void (*mlo_vdev_ops_handler)(struct wlan_objmgr_vdev *vdev,
420 				     void *arg);
421 
422 /**
423  * mlo_iterate_ml_vdev_list() - Iterate on ML vdevs of MLD
424  * @vdev: vdev object
425  * @handler: the handler will be called for each object in ML list
426  * @arg: argument to be passed to handler
427  * @lock: Need to acquire lock or not
428  *
429  * Return: none
430  */
431 static inline
432 void mlo_iterate_ml_vdev_list(struct wlan_objmgr_vdev *vdev,
433 			      mlo_vdev_ops_handler handler,
434 			      void *arg, bool lock)
435 {
436 	struct wlan_mlo_dev_context *mlo_dev_ctx = NULL;
437 	uint8_t i = 0;
438 	QDF_STATUS status;
439 
440 	if (!vdev)
441 		return;
442 
443 	mlo_dev_ctx = vdev->mlo_dev_ctx;
444 	if (!mlo_dev_ctx || !(wlan_vdev_mlme_is_mlo_vdev(vdev)))
445 		return;
446 
447 	if (lock)
448 		mlo_dev_lock_acquire(mlo_dev_ctx);
449 
450 	for (i =  0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
451 		if (!mlo_dev_ctx->wlan_vdev_list[i])
452 			continue;
453 
454 		status = wlan_objmgr_vdev_try_get_ref(
455 					mlo_dev_ctx->wlan_vdev_list[i],
456 					WLAN_MLO_MGR_ID);
457 		if (QDF_IS_STATUS_ERROR(status))
458 			continue;
459 
460 		if (handler)
461 			handler(mlo_dev_ctx->wlan_vdev_list[i], arg);
462 
463 		mlo_release_vdev_ref(mlo_dev_ctx->wlan_vdev_list[i]);
464 	}
465 
466 	if (lock)
467 		mlo_dev_lock_release(mlo_dev_ctx);
468 }
469 
470 /**
471  * struct mlo_stats_vdev_params - vdev params for MLO stats request
472  * @ml_vdev_count: Num of connected mlo vdevs
473  * @ml_vdev_id: vdev_ids of ml vdevs
474  */
475 struct mlo_stats_vdev_params {
476 	uint8_t ml_vdev_count;
477 	uint8_t ml_vdev_id[WLAN_UMAC_MLO_MAX_VDEVS];
478 };
479 
480 /**
481  * mlo_get_mlstats_vdev_params() - Get vdev params for MLO stats
482  * @psoc: psoc object
483  * @vdev_id: vdev id
484  * @ml_vdev_info: pointer to mlo_stats_vdev_params
485  *
486  * Return: QDF_STATUS
487  */
488 QDF_STATUS
489 mlo_get_mlstats_vdev_params(struct wlan_objmgr_psoc *psoc,
490 			    struct mlo_stats_vdev_params *ml_vdev_info,
491 			    uint8_t vdev_id);
492 #endif
493 #endif
494