xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlo_mgr/inc/wlan_mlo_mgr_cmn.h (revision 8cfe6b10058a04cafb17eed051f2ddf11bee8931)
1 /*
2  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 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_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  * @is_disassoc: disassoc frame needs to be sent
247  *
248  * Return: void
249  */
250 void mlo_mlme_peer_deauth(struct wlan_objmgr_peer *peer, uint8_t is_disassoc);
251 
252 #ifdef UMAC_MLO_AUTH_DEFER
253 /**
254  * mlo_mlme_peer_process_auth() - Process deferred auth request
255  * @auth_param: deferred auth params
256  *
257  * Return: void
258  */
259 void mlo_mlme_peer_process_auth(struct mlpeer_auth_params *auth_param);
260 #else
261 static inline void
262 mlo_mlme_peer_process_auth(struct mlpeer_auth_params *auth_param)
263 {
264 }
265 #endif
266 
267 /**
268  * mlo_get_link_vdev_ix() - Get index of link VDEV in MLD
269  * @mldev: ML device context
270  * @vdev: VDEV object
271  *
272  * Return: link index
273  */
274 
275 uint8_t mlo_get_link_vdev_ix(struct wlan_mlo_dev_context *mldev,
276 			     struct wlan_objmgr_vdev *vdev);
277 
278 /**
279  * mlo_get_ml_vdev_list() - get mlo vdev list
280  * @vdev: vdev pointer
281  * @vdev_count: vdev count
282  * @wlan_vdev_list: vdev list
283  *
284  * Caller should release ref of the vdevs in wlan_vdev_list
285  * Return: None
286  */
287 void mlo_get_ml_vdev_list(struct wlan_objmgr_vdev *vdev,
288 			  uint16_t *vdev_count,
289 			  struct wlan_objmgr_vdev **wlan_vdev_list);
290 
291 /**
292  * mlo_mlme_handle_sta_csa_param() - process saved mlo sta csa param
293  * @vdev: vdev pointer
294  * @csa_param: saved csa_param
295  *
296  * Return: None
297  */
298 void mlo_mlme_handle_sta_csa_param(struct wlan_objmgr_vdev *vdev,
299 				   struct csa_offload_params *csa_param);
300 
301 #define INVALID_HW_LINK_ID 0xFFFF
302 #define WLAN_MLO_INVALID_NUM_LINKS             (-1)
303 #ifdef WLAN_MLO_MULTI_CHIP
304 #define WLAN_MLO_GROUP_INVALID                 (-1)
305 /**
306  * wlan_mlo_get_max_num_links() - Get the maximum number of MLO links
307  * possible in the system
308  * @grp_id: Id of the required MLO Group
309  *
310  * Return: Maximum number of MLO links in the system
311  */
312 int8_t wlan_mlo_get_max_num_links(uint8_t grp_id);
313 
314 /**
315  * wlan_mlo_get_num_active_links() - Get the number of active MLO links
316  * in the system
317  * @grp_id: Id of the required MLO Group
318  *
319  * Return: Number of active MLO links in the system
320  */
321 int8_t wlan_mlo_get_num_active_links(uint8_t grp_id);
322 
323 /**
324  * wlan_mlo_get_valid_link_bitmap() - Get the bitmap indicating the valid
325  * MLO links in the system. If bit position i is set, link with id i is
326  * valid.
327  * @grp_id: Id of the required MLO Group
328  *
329  * Return: Valid link bitmap
330  */
331 uint16_t wlan_mlo_get_valid_link_bitmap(uint8_t grp_id);
332 
333 /**
334  * wlan_mlo_get_pdev_hw_link_id() - Get hw_link_id of pdev
335  * @pdev: pdev object
336  *
337  * Return: hw_link_id of the pdev.
338  */
339 uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev);
340 
341 /**
342  * wlan_mlo_get_psoc_group_id() - Get MLO group id of psoc
343  * @psoc: psoc object
344  *
345  * Return: MLO group id of the psoc
346  */
347 uint8_t wlan_mlo_get_psoc_group_id(struct wlan_objmgr_psoc *psoc);
348 
349 /**
350  * wlan_mlo_get_psoc_capable() - Get if MLO capable psoc
351  * @psoc: Pointer to psoc object
352  *
353  * Return: True if MLO capable else false
354  */
355 bool wlan_mlo_get_psoc_capable(struct wlan_objmgr_psoc *psoc);
356 
357 /**
358  * struct hw_link_id_iterator: Argument passed in psoc/pdev iterator to
359  *                             find pdev from hw_link_id
360  * @hw_link_id: HW link id of pdev to find
361  * @mlo_grp_id: MLO Group id which it belongs to
362  * @dbgid: Module ref id used in iterator
363  * @pdev: Pointer to pdev. This will be set inside itertor callback
364  *        if hw_link_id match is found.
365  */
366 struct hw_link_id_iterator {
367 	uint16_t hw_link_id;
368 	uint8_t mlo_grp_id;
369 	wlan_objmgr_ref_dbgid dbgid;
370 	struct wlan_objmgr_pdev *pdev;
371 };
372 
373 /**
374  * wlan_mlo_get_pdev_by_hw_link_id() - Get pdev object from hw_link_id
375  * @hw_link_id: HW link id of the pdev
376  * @ml_grp_id: MLO Group id which it belongs to
377  * @refdbgid: dbgid of module used for taking reference to pdev object
378  *
379  * Return: Pointer to pdev object if hw_link_id is valid. Else, NULL
380  *         Reference will be held with refdgid if return is non-NULL.
381  *         Caller should free this reference.
382  */
383 struct wlan_objmgr_pdev *
384 wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id, uint8_t ml_grp_id,
385 				wlan_objmgr_ref_dbgid refdbgid);
386 
387 #else
388 static inline int8_t
389 wlan_mlo_get_max_num_links(uint8_t grp_id)
390 {
391 	return WLAN_MLO_INVALID_NUM_LINKS;
392 }
393 
394 static inline int8_t
395 wlan_mlo_get_num_active_links(uint8_t grp_id)
396 {
397 	return WLAN_MLO_INVALID_NUM_LINKS;
398 }
399 
400 static inline uint16_t
401 wlan_mlo_get_valid_link_bitmap(uint8_t grp_id)
402 {
403 	return 0;
404 }
405 
406 static inline struct wlan_objmgr_pdev *
407 wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id, uint8_t ml_grp_id,
408 				wlan_objmgr_ref_dbgid refdbgid)
409 {
410 	return NULL;
411 }
412 
413 static inline
414 uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev)
415 {
416 	return INVALID_HW_LINK_ID;
417 }
418 
419 static inline
420 uint8_t wlan_mlo_get_psoc_group_id(struct wlan_objmgr_psoc *psoc)
421 {
422 	return -EINVAL;
423 }
424 
425 static inline
426 bool wlan_mlo_get_psoc_capable(struct wlan_objmgr_psoc *psoc)
427 {
428 	return false;
429 }
430 #endif/*WLAN_MLO_MULTI_CHIP*/
431 
432 #ifdef WLAN_FEATURE_11BE_MLO
433 /**
434  * mlo_process_link_set_active_resp() - handler for mlo link set active response
435  * @psoc: psoc pointer
436  * @event: pointer to mlo link set active response
437  *
438  * Return: QDF_STATUS
439  */
440 QDF_STATUS
441 mlo_process_link_set_active_resp(struct wlan_objmgr_psoc *psoc,
442 				 struct mlo_link_set_active_resp *event);
443 
444 /**
445  * mlo_ser_set_link_req() - add mlo link set active cmd to serialization
446  * @req: mlo link set active request
447  *
448  * Return: QDF_STATUS
449  */
450 QDF_STATUS mlo_ser_set_link_req(struct mlo_link_set_active_req *req);
451 
452 /**
453  * typedef mlo_vdev_ops_handler() - API to have operation on ml vdevs
454  * @vdev: vdev object
455  * @arg: operation-specific argument
456  */
457 typedef void (*mlo_vdev_ops_handler)(struct wlan_objmgr_vdev *vdev,
458 				     void *arg);
459 
460 /**
461  * mlo_iterate_ml_vdev_list() - Iterate on ML vdevs of MLD
462  * @vdev: vdev object
463  * @handler: the handler will be called for each object in ML list
464  * @arg: argument to be passed to handler
465  * @lock: Need to acquire lock or not
466  *
467  * Return: none
468  */
469 static inline
470 void mlo_iterate_ml_vdev_list(struct wlan_objmgr_vdev *vdev,
471 			      mlo_vdev_ops_handler handler,
472 			      void *arg, bool lock)
473 {
474 	struct wlan_mlo_dev_context *mlo_dev_ctx = NULL;
475 	uint8_t i = 0;
476 	QDF_STATUS status;
477 
478 	if (!vdev)
479 		return;
480 
481 	mlo_dev_ctx = vdev->mlo_dev_ctx;
482 	if (!mlo_dev_ctx || !(wlan_vdev_mlme_is_mlo_vdev(vdev)))
483 		return;
484 
485 	if (lock)
486 		mlo_dev_lock_acquire(mlo_dev_ctx);
487 
488 	for (i =  0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
489 		if (!mlo_dev_ctx->wlan_vdev_list[i])
490 			continue;
491 
492 		status = wlan_objmgr_vdev_try_get_ref(
493 					mlo_dev_ctx->wlan_vdev_list[i],
494 					WLAN_MLO_MGR_ID);
495 		if (QDF_IS_STATUS_ERROR(status))
496 			continue;
497 
498 		if (handler)
499 			handler(mlo_dev_ctx->wlan_vdev_list[i], arg);
500 
501 		mlo_release_vdev_ref(mlo_dev_ctx->wlan_vdev_list[i]);
502 	}
503 
504 	if (lock)
505 		mlo_dev_lock_release(mlo_dev_ctx);
506 }
507 
508 /**
509  * struct mlo_stats_vdev_params - vdev params for MLO stats request
510  * @ml_vdev_count: Num of connected mlo vdevs
511  * @ml_vdev_id: vdev_ids of ml vdevs
512  */
513 struct mlo_stats_vdev_params {
514 	uint8_t ml_vdev_count;
515 	uint8_t ml_vdev_id[WLAN_UMAC_MLO_MAX_VDEVS];
516 };
517 
518 /**
519  * mlo_get_mlstats_vdev_params() - Get vdev params for MLO stats
520  * @psoc: psoc object
521  * @vdev_id: vdev id
522  * @ml_vdev_info: pointer to mlo_stats_vdev_params
523  *
524  * Return: QDF_STATUS
525  */
526 QDF_STATUS
527 mlo_get_mlstats_vdev_params(struct wlan_objmgr_psoc *psoc,
528 			    struct mlo_stats_vdev_params *ml_vdev_info,
529 			    uint8_t vdev_id);
530 #endif
531 #endif
532