xref: /wlan-driver/qca-wifi-host-cmn/umac/mlo_mgr/inc/wlan_mlo_mgr_cmn.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name /*
19*5113495bSYour Name  * DOC: contains MLO manager public file containing common functionality
20*5113495bSYour Name  */
21*5113495bSYour Name #ifndef _WLAN_MLO_MGR_CMN_H_
22*5113495bSYour Name #define _WLAN_MLO_MGR_CMN_H_
23*5113495bSYour Name 
24*5113495bSYour Name #include <qdf_types.h>
25*5113495bSYour Name #include <qdf_trace.h>
26*5113495bSYour Name #include "wlan_mlo_mgr_public_structs.h"
27*5113495bSYour Name #include <wlan_mlo_mgr_main.h>
28*5113495bSYour Name 
29*5113495bSYour Name #define mlo_alert(format, args...) \
30*5113495bSYour Name 		QDF_TRACE_FATAL(QDF_MODULE_ID_MLO, format, ## args)
31*5113495bSYour Name 
32*5113495bSYour Name #define mlo_err(format, args...) \
33*5113495bSYour Name 		QDF_TRACE_ERROR(QDF_MODULE_ID_MLO, format, ## args)
34*5113495bSYour Name 
35*5113495bSYour Name #define mlo_warn(format, args...) \
36*5113495bSYour Name 		QDF_TRACE_WARN(QDF_MODULE_ID_MLO, format, ## args)
37*5113495bSYour Name 
38*5113495bSYour Name #define mlo_info(format, args...) \
39*5113495bSYour Name 		QDF_TRACE_INFO(QDF_MODULE_ID_MLO, format, ## args)
40*5113495bSYour Name 
41*5113495bSYour Name #define mlo_debug(format, args...) \
42*5113495bSYour Name 		QDF_TRACE_DEBUG(QDF_MODULE_ID_MLO, format, ## args)
43*5113495bSYour Name 
44*5113495bSYour Name #define mlo_nofl_alert(format, args...) \
45*5113495bSYour Name 		QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
46*5113495bSYour Name 
47*5113495bSYour Name #define mlo_nofl_err(format, args...) \
48*5113495bSYour Name 		QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
49*5113495bSYour Name 
50*5113495bSYour Name #define mlo_nofl_warn(format, args...) \
51*5113495bSYour Name 		QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
52*5113495bSYour Name 
53*5113495bSYour Name #define mlo_nofl_info(format, args...) \
54*5113495bSYour Name 		QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
55*5113495bSYour Name 
56*5113495bSYour Name #define mlo_nofl_debug(format, args...) \
57*5113495bSYour Name 		QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
58*5113495bSYour Name 
59*5113495bSYour Name #define mlo_alert_rl(format, args...) \
60*5113495bSYour Name 		QDF_TRACE_FATAL_RL(QDF_MODULE_ID_MLO, format, ## args)
61*5113495bSYour Name 
62*5113495bSYour Name #define mlo_err_rl(format, args...) \
63*5113495bSYour Name 		QDF_TRACE_ERROR_RL(QDF_MODULE_ID_MLO, format, ## args)
64*5113495bSYour Name 
65*5113495bSYour Name #define mlo_warn_rl(format, args...) \
66*5113495bSYour Name 		QDF_TRACE_WARN_RL(QDF_MODULE_ID_MLO, format, ## args)
67*5113495bSYour Name 
68*5113495bSYour Name #define mlo_info_rl(format, args...) \
69*5113495bSYour Name 		QDF_TRACE_INFO_RL(QDF_MODULE_ID_MLO, format, ## args)
70*5113495bSYour Name 
71*5113495bSYour Name #define mlo_debug_rl(format, args...) \
72*5113495bSYour Name 		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_MLO, format, ## args)
73*5113495bSYour Name 
74*5113495bSYour Name #define mlo_nofl_alert_rl(format, args...) \
75*5113495bSYour Name 		QDF_TRACE_FATAL_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
76*5113495bSYour Name 
77*5113495bSYour Name #define mlo_nofl_err_rl(format, args...) \
78*5113495bSYour Name 		QDF_TRACE_ERROR_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
79*5113495bSYour Name 
80*5113495bSYour Name #define mlo_nofl_warn_rl(format, args...) \
81*5113495bSYour Name 		QDF_TRACE_WARN_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
82*5113495bSYour Name 
83*5113495bSYour Name #define mlo_nofl_info_rl(format, args...) \
84*5113495bSYour Name 		QDF_TRACE_INFO_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
85*5113495bSYour Name 
86*5113495bSYour Name #define mlo_nofl_debug_rl(format, args...) \
87*5113495bSYour Name 		QDF_TRACE_DEBUG_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
88*5113495bSYour Name 
89*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO_ENABLE_ENHANCED_TRACE)
90*5113495bSYour Name #define mlo_etrace_debug(format, args...) \
91*5113495bSYour Name 		QDF_TRACE_DEBUG(QDF_MODULE_ID_MLO, format, ## args)
92*5113495bSYour Name #define mlo_etrace_err_rl(format, args...) \
93*5113495bSYour Name 		QDF_TRACE_ERROR_RL(QDF_MODULE_ID_MLO, format, ## args)
94*5113495bSYour Name #else
95*5113495bSYour Name #define mlo_etrace_debug(format, args...)
96*5113495bSYour Name #define mlo_etrace_err_rl(format, args...)
97*5113495bSYour Name #endif
98*5113495bSYour Name 
99*5113495bSYour Name #define MLO_INVALID_LINK_IDX 0xFF
100*5113495bSYour Name /**
101*5113495bSYour Name  * mlo_get_link_information() - get partner link information
102*5113495bSYour Name  * @mld_addr : MLD address
103*5113495bSYour Name  * @info: partner link information
104*5113495bSYour Name  *
105*5113495bSYour Name  * Return: QDF_STATUS
106*5113495bSYour Name  */
107*5113495bSYour Name void mlo_get_link_information(struct qdf_mac_addr *mld_addr,
108*5113495bSYour Name 			      struct mlo_link_info *info);
109*5113495bSYour Name /**
110*5113495bSYour Name  * is_mlo_all_links_up() - check all the link status in a MLO device
111*5113495bSYour Name  * @ml_dev: ML device context
112*5113495bSYour Name  *
113*5113495bSYour Name  * Return: QDF_STATUS
114*5113495bSYour Name  */
115*5113495bSYour Name void is_mlo_all_links_up(struct wlan_mlo_dev_context *ml_dev);
116*5113495bSYour Name 
117*5113495bSYour Name /**
118*5113495bSYour Name  * mlo_get_vdev_by_link_id() - get vdev by link id
119*5113495bSYour Name  * @vdev: vdev pointer
120*5113495bSYour Name  * @link_id: link id
121*5113495bSYour Name  * @id: debug id
122*5113495bSYour Name  *
123*5113495bSYour Name  * Return: vdev object pointer to link id
124*5113495bSYour Name  */
125*5113495bSYour Name struct wlan_objmgr_vdev *mlo_get_vdev_by_link_id(
126*5113495bSYour Name 			struct wlan_objmgr_vdev *vdev,
127*5113495bSYour Name 			uint8_t link_id, wlan_objmgr_ref_dbgid id);
128*5113495bSYour Name 
129*5113495bSYour Name /**
130*5113495bSYour Name  * mlo_release_vdev_ref() - release vdev reference
131*5113495bSYour Name  * @vdev: vdev pointer
132*5113495bSYour Name  *
133*5113495bSYour Name  * Return: void
134*5113495bSYour Name  */
135*5113495bSYour Name void mlo_release_vdev_ref(struct wlan_objmgr_vdev *vdev);
136*5113495bSYour Name 
137*5113495bSYour Name /**
138*5113495bSYour Name  * mlo_reg_mlme_ext_cb() - Function to register mlme extended callbacks
139*5113495bSYour Name  * @ctx: Pointer to mlo manager global context
140*5113495bSYour Name  * @ops: Pointer to the struct containing the callbacks
141*5113495bSYour Name  *
142*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on successful registration else failure
143*5113495bSYour Name  */
144*5113495bSYour Name QDF_STATUS mlo_reg_mlme_ext_cb(struct mlo_mgr_context *ctx,
145*5113495bSYour Name 			       struct mlo_mlme_ext_ops *ops);
146*5113495bSYour Name 
147*5113495bSYour Name /**
148*5113495bSYour Name  * mlo_unreg_mlme_ext_cb() - Function to unregister mlme extended callbacks
149*5113495bSYour Name  * @ctx: Pointer to mlo manager global context
150*5113495bSYour Name  *
151*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success else failure
152*5113495bSYour Name  */
153*5113495bSYour Name QDF_STATUS mlo_unreg_mlme_ext_cb(struct mlo_mgr_context *ctx);
154*5113495bSYour Name 
155*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE
156*5113495bSYour Name /**
157*5113495bSYour Name  * wlan_mlo_mgr_register_osif_ext_ops() - Function to register OSIF callbacks
158*5113495bSYour Name  * @mlo_ctx: Global MLO manager pointer
159*5113495bSYour Name  * @ops: Pointer to the struct containing OSIF callbacks.
160*5113495bSYour Name  *
161*5113495bSYour Name  * Return: QDF_STATUS
162*5113495bSYour Name  */
163*5113495bSYour Name QDF_STATUS wlan_mlo_mgr_register_osif_ext_ops(struct mlo_mgr_context *mlo_ctx,
164*5113495bSYour Name 					      struct mlo_osif_ext_ops *ops);
165*5113495bSYour Name 
166*5113495bSYour Name /**
167*5113495bSYour Name  * wlan_mlo_mgr_unregister_osif_ext_ops() - Function to unregister OSIF
168*5113495bSYour Name  * callbacks
169*5113495bSYour Name  * @mlo_ctx: Global MLO manager pointer
170*5113495bSYour Name  *
171*5113495bSYour Name  * Return: QDF_STATUS
172*5113495bSYour Name  */
173*5113495bSYour Name QDF_STATUS
174*5113495bSYour Name wlan_mlo_mgr_unregister_osif_ext_ops(struct mlo_mgr_context *mlo_ctx);
175*5113495bSYour Name #else
176*5113495bSYour Name static inline QDF_STATUS
wlan_mlo_mgr_register_osif_ext_ops(struct mlo_mgr_context * mlo_ctx,struct mlo_osif_ext_ops * ops)177*5113495bSYour Name wlan_mlo_mgr_register_osif_ext_ops(struct mlo_mgr_context *mlo_ctx,
178*5113495bSYour Name 				   struct mlo_osif_ext_ops *ops)
179*5113495bSYour Name {
180*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
181*5113495bSYour Name }
182*5113495bSYour Name 
183*5113495bSYour Name static inline QDF_STATUS
wlan_mlo_mgr_unregister_osif_ext_ops(struct mlo_mgr_context * mlo_ctx)184*5113495bSYour Name wlan_mlo_mgr_unregister_osif_ext_ops(struct mlo_mgr_context *mlo_ctx)
185*5113495bSYour Name {
186*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
187*5113495bSYour Name }
188*5113495bSYour Name #endif
189*5113495bSYour Name 
190*5113495bSYour Name /**
191*5113495bSYour Name  * mlo_mlme_clone_sta_security() - Clone Security params in partner vdevs
192*5113495bSYour Name  * @vdev: Object manager vdev
193*5113495bSYour Name  * @req: wlan_cm_connect_req data object to be passed to callback
194*5113495bSYour Name  *
195*5113495bSYour Name  * Return: QDF_STATUS
196*5113495bSYour Name  */
197*5113495bSYour Name QDF_STATUS mlo_mlme_clone_sta_security(struct wlan_objmgr_vdev *vdev,
198*5113495bSYour Name 				       struct wlan_cm_connect_req *req);
199*5113495bSYour Name 
200*5113495bSYour Name /**
201*5113495bSYour Name  * mlo_mlme_sta_op_class() - Update partner link op-class from ML-IE
202*5113495bSYour Name  * @vdev: Object manager vdev
203*5113495bSYour Name  * @ml_ie: buffer having the ML-IE from supplicant
204*5113495bSYour Name  *
205*5113495bSYour Name  * Return: QDF_STATUS
206*5113495bSYour Name  */
207*5113495bSYour Name QDF_STATUS mlo_mlme_sta_op_class(struct wlan_objmgr_vdev *vdev,
208*5113495bSYour Name 				 uint8_t *ml_ie);
209*5113495bSYour Name 
210*5113495bSYour Name /**
211*5113495bSYour Name  * mlo_mlme_validate_conn_req() - Validate connect request
212*5113495bSYour Name  * @vdev: Object manager vdev
213*5113495bSYour Name  * @ext_data: Data object to be passed to callback
214*5113495bSYour Name  *
215*5113495bSYour Name  * Return: QDF_STATUS
216*5113495bSYour Name  */
217*5113495bSYour Name QDF_STATUS mlo_mlme_validate_conn_req(struct wlan_objmgr_vdev *vdev,
218*5113495bSYour Name 				      void *ext_data);
219*5113495bSYour Name 
220*5113495bSYour Name /**
221*5113495bSYour Name  * mlo_mlme_create_link_vdev() - Create link vdev for ML STA
222*5113495bSYour Name  * @vdev: Object manager vdev
223*5113495bSYour Name  * @ext_data: Data object to be passed to callback
224*5113495bSYour Name  *
225*5113495bSYour Name  * Return: QDF_STATUS
226*5113495bSYour Name  */
227*5113495bSYour Name QDF_STATUS mlo_mlme_create_link_vdev(struct wlan_objmgr_vdev *vdev,
228*5113495bSYour Name 				     void *ext_data);
229*5113495bSYour Name 
230*5113495bSYour Name /**
231*5113495bSYour Name  * mlo_mlme_peer_create() - Create mlo peer
232*5113495bSYour Name  * @vdev: Object manager vdev
233*5113495bSYour Name  * @ml_peer: MLO peer context
234*5113495bSYour Name  * @addr: Peer addr
235*5113495bSYour Name  * @frm_buf: Frame buffer for IE processing
236*5113495bSYour Name  *
237*5113495bSYour Name  * Return: void
238*5113495bSYour Name  */
239*5113495bSYour Name void mlo_mlme_peer_create(struct wlan_objmgr_vdev *vdev,
240*5113495bSYour Name 			  struct wlan_mlo_peer_context *ml_peer,
241*5113495bSYour Name 			  struct qdf_mac_addr *addr,
242*5113495bSYour Name 			  qdf_nbuf_t frm_buf);
243*5113495bSYour Name 
244*5113495bSYour Name /**
245*5113495bSYour Name  * mlo_mlme_bridge_peer_create() - Create mlo bridge peer
246*5113495bSYour Name  * @vdev: Object manager vdev
247*5113495bSYour Name  * @ml_peer: MLO peer context
248*5113495bSYour Name  * @addr: Peer addr
249*5113495bSYour Name  * @frm_buf: Frame buffer for IE processing
250*5113495bSYour Name  *
251*5113495bSYour Name  * Return: void
252*5113495bSYour Name  */
253*5113495bSYour Name void mlo_mlme_bridge_peer_create(struct wlan_objmgr_vdev *vdev,
254*5113495bSYour Name 				 struct wlan_mlo_peer_context *ml_peer,
255*5113495bSYour Name 				 struct qdf_mac_addr *addr,
256*5113495bSYour Name 				 qdf_nbuf_t frm_buf);
257*5113495bSYour Name 
258*5113495bSYour Name /**
259*5113495bSYour Name  * mlo_mlme_peer_assoc() - Send ML Peer assoc
260*5113495bSYour Name  * @peer: Object manager peer
261*5113495bSYour Name  *
262*5113495bSYour Name  * Return: void
263*5113495bSYour Name  */
264*5113495bSYour Name void mlo_mlme_peer_assoc(struct wlan_objmgr_peer *peer);
265*5113495bSYour Name 
266*5113495bSYour Name /**
267*5113495bSYour Name  * mlo_mlme_peer_assoc_fail() - Send ML Peer assoc fail
268*5113495bSYour Name  * @peer: Object manager peer
269*5113495bSYour Name  *
270*5113495bSYour Name  * Return: void
271*5113495bSYour Name  */
272*5113495bSYour Name void mlo_mlme_peer_assoc_fail(struct wlan_objmgr_peer *peer);
273*5113495bSYour Name 
274*5113495bSYour Name /**
275*5113495bSYour Name  * mlo_mlme_peer_delete() - Send ML Peer delete
276*5113495bSYour Name  * @peer: Object manager peer
277*5113495bSYour Name  *
278*5113495bSYour Name  * Return: void
279*5113495bSYour Name  */
280*5113495bSYour Name void mlo_mlme_peer_delete(struct wlan_objmgr_peer *peer);
281*5113495bSYour Name 
282*5113495bSYour Name /**
283*5113495bSYour Name  * mlo_mlme_peer_assoc_resp() - Initiate sending of Assoc response
284*5113495bSYour Name  * @peer: Object manager peer
285*5113495bSYour Name  *
286*5113495bSYour Name  * Return: void
287*5113495bSYour Name  */
288*5113495bSYour Name void mlo_mlme_peer_assoc_resp(struct wlan_objmgr_peer *peer);
289*5113495bSYour Name 
290*5113495bSYour Name /**
291*5113495bSYour Name  * mlo_mlme_get_link_assoc_req() - API to get link assoc req buffer
292*5113495bSYour Name  * @peer: Object manager peer
293*5113495bSYour Name  * @link_ix: link id of vdev
294*5113495bSYour Name  *
295*5113495bSYour Name  * Return: assoc req buffer
296*5113495bSYour Name  */
297*5113495bSYour Name qdf_nbuf_t mlo_mlme_get_link_assoc_req(struct wlan_objmgr_peer *peer,
298*5113495bSYour Name 				       uint8_t link_ix);
299*5113495bSYour Name 
300*5113495bSYour Name /**
301*5113495bSYour Name  * mlo_mlme_peer_deauth() - Initiate deauth on link peer
302*5113495bSYour Name  * @peer: Object manager peer
303*5113495bSYour Name  * @is_disassoc: disassoc frame needs to be sent
304*5113495bSYour Name  *
305*5113495bSYour Name  * Return: void
306*5113495bSYour Name  */
307*5113495bSYour Name void mlo_mlme_peer_deauth(struct wlan_objmgr_peer *peer, uint8_t is_disassoc);
308*5113495bSYour Name 
309*5113495bSYour Name #ifdef UMAC_MLO_AUTH_DEFER
310*5113495bSYour Name /**
311*5113495bSYour Name  * mlo_mlme_peer_process_auth() - Process deferred auth request
312*5113495bSYour Name  * @auth_param: deferred auth params
313*5113495bSYour Name  *
314*5113495bSYour Name  * Return: void
315*5113495bSYour Name  */
316*5113495bSYour Name void mlo_mlme_peer_process_auth(struct mlpeer_auth_params *auth_param);
317*5113495bSYour Name #else
318*5113495bSYour Name static inline void
mlo_mlme_peer_process_auth(struct mlpeer_auth_params * auth_param)319*5113495bSYour Name mlo_mlme_peer_process_auth(struct mlpeer_auth_params *auth_param)
320*5113495bSYour Name {
321*5113495bSYour Name }
322*5113495bSYour Name #endif
323*5113495bSYour Name 
324*5113495bSYour Name /**
325*5113495bSYour Name  * mlo_mlme_peer_reassoc() - Reassoc mlo peer
326*5113495bSYour Name  * @vdev: Object manager vdev
327*5113495bSYour Name  * @ml_peer: MLO peer context
328*5113495bSYour Name  * @addr: Peer addr
329*5113495bSYour Name  * @frm_buf: Frame buffer for IE processing
330*5113495bSYour Name  *
331*5113495bSYour Name  * Return: void
332*5113495bSYour Name  */
333*5113495bSYour Name void mlo_mlme_peer_reassoc(struct wlan_objmgr_vdev *vdev,
334*5113495bSYour Name 			   struct wlan_mlo_peer_context *ml_peer,
335*5113495bSYour Name 			   struct qdf_mac_addr *addr,
336*5113495bSYour Name 			   qdf_nbuf_t frm_buf);
337*5113495bSYour Name 
338*5113495bSYour Name /**
339*5113495bSYour Name  * mlo_get_link_vdev_ix() - Get index of link VDEV in MLD
340*5113495bSYour Name  * @mldev: ML device context
341*5113495bSYour Name  * @vdev: VDEV object
342*5113495bSYour Name  *
343*5113495bSYour Name  * Return: link index
344*5113495bSYour Name  */
345*5113495bSYour Name 
346*5113495bSYour Name uint8_t mlo_get_link_vdev_ix(struct wlan_mlo_dev_context *mldev,
347*5113495bSYour Name 			     struct wlan_objmgr_vdev *vdev);
348*5113495bSYour Name 
349*5113495bSYour Name /**
350*5113495bSYour Name  * mlo_get_ml_vdev_list() - get mlo vdev list
351*5113495bSYour Name  * @vdev: vdev pointer
352*5113495bSYour Name  * @vdev_count: vdev count
353*5113495bSYour Name  * @wlan_vdev_list: vdev list
354*5113495bSYour Name  *
355*5113495bSYour Name  * Caller should release ref of the vdevs in wlan_vdev_list
356*5113495bSYour Name  * Return: None
357*5113495bSYour Name  */
358*5113495bSYour Name void mlo_get_ml_vdev_list(struct wlan_objmgr_vdev *vdev,
359*5113495bSYour Name 			  uint16_t *vdev_count,
360*5113495bSYour Name 			  struct wlan_objmgr_vdev **wlan_vdev_list);
361*5113495bSYour Name 
362*5113495bSYour Name /**
363*5113495bSYour Name  * mlo_mlme_handle_sta_csa_param() - process saved mlo sta csa param
364*5113495bSYour Name  * @vdev: vdev pointer
365*5113495bSYour Name  * @csa_param: saved csa_param
366*5113495bSYour Name  *
367*5113495bSYour Name  * Return: None
368*5113495bSYour Name  */
369*5113495bSYour Name void mlo_mlme_handle_sta_csa_param(struct wlan_objmgr_vdev *vdev,
370*5113495bSYour Name 				   struct csa_offload_params *csa_param);
371*5113495bSYour Name 
372*5113495bSYour Name #define INVALID_HW_LINK_ID 0xFFFF
373*5113495bSYour Name #define WLAN_MLO_INVALID_NUM_LINKS             (-1)
374*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
375*5113495bSYour Name #define WLAN_MLO_GROUP_INVALID                 0xFF
376*5113495bSYour Name #define WLAN_MLO_CHIP_ID_INVALID               0xFF
377*5113495bSYour Name /**
378*5113495bSYour Name  * wlan_mlo_get_max_num_links() - Get the maximum number of MLO links
379*5113495bSYour Name  * possible in the system
380*5113495bSYour Name  * @grp_id: Id of the required MLO Group
381*5113495bSYour Name  *
382*5113495bSYour Name  * Return: Maximum number of MLO links in the system
383*5113495bSYour Name  */
384*5113495bSYour Name int8_t wlan_mlo_get_max_num_links(uint8_t grp_id);
385*5113495bSYour Name 
386*5113495bSYour Name /**
387*5113495bSYour Name  * wlan_mlo_get_num_active_links() - Get the number of active MLO links
388*5113495bSYour Name  * in the system
389*5113495bSYour Name  * @grp_id: Id of the required MLO Group
390*5113495bSYour Name  *
391*5113495bSYour Name  * Return: Number of active MLO links in the system
392*5113495bSYour Name  */
393*5113495bSYour Name int8_t wlan_mlo_get_num_active_links(uint8_t grp_id);
394*5113495bSYour Name 
395*5113495bSYour Name /**
396*5113495bSYour Name  * wlan_mlo_get_valid_link_bitmap() - Get the bitmap indicating the valid
397*5113495bSYour Name  * MLO links in the system. If bit position i is set, link with id i is
398*5113495bSYour Name  * valid.
399*5113495bSYour Name  * @grp_id: Id of the required MLO Group
400*5113495bSYour Name  *
401*5113495bSYour Name  * Return: Valid link bitmap
402*5113495bSYour Name  */
403*5113495bSYour Name uint16_t wlan_mlo_get_valid_link_bitmap(uint8_t grp_id);
404*5113495bSYour Name 
405*5113495bSYour Name /**
406*5113495bSYour Name  * wlan_mlo_get_pdev_hw_link_id() - Get hw_link_id of pdev
407*5113495bSYour Name  * @pdev: pdev object
408*5113495bSYour Name  *
409*5113495bSYour Name  * Return: hw_link_id of the pdev.
410*5113495bSYour Name  */
411*5113495bSYour Name uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev);
412*5113495bSYour Name 
413*5113495bSYour Name /**
414*5113495bSYour Name  * wlan_mlo_get_psoc_group_id() - Get MLO group id of psoc
415*5113495bSYour Name  * @psoc: psoc object
416*5113495bSYour Name  *
417*5113495bSYour Name  * Return: MLO group id of the psoc
418*5113495bSYour Name  */
419*5113495bSYour Name uint8_t wlan_mlo_get_psoc_group_id(struct wlan_objmgr_psoc *psoc);
420*5113495bSYour Name 
421*5113495bSYour Name /**
422*5113495bSYour Name  * wlan_mlo_get_psoc_mlo_chip_id() - Get MLO chip id of psoc
423*5113495bSYour Name  * @psoc: psoc object
424*5113495bSYour Name  *
425*5113495bSYour Name  * Return: MLO group id of the psoc
426*5113495bSYour Name  */
427*5113495bSYour Name uint8_t wlan_mlo_get_psoc_mlo_chip_id(struct wlan_objmgr_psoc *psoc);
428*5113495bSYour Name 
429*5113495bSYour Name /**
430*5113495bSYour Name  * wlan_mlo_get_psoc_capable() - Get if MLO capable psoc
431*5113495bSYour Name  * @psoc: Pointer to psoc object
432*5113495bSYour Name  *
433*5113495bSYour Name  * Return: True if MLO capable else false
434*5113495bSYour Name  */
435*5113495bSYour Name bool wlan_mlo_get_psoc_capable(struct wlan_objmgr_psoc *psoc);
436*5113495bSYour Name 
437*5113495bSYour Name /**
438*5113495bSYour Name  * struct hw_link_id_iterator: Argument passed in psoc/pdev iterator to
439*5113495bSYour Name  *                             find pdev from hw_link_id
440*5113495bSYour Name  * @hw_link_id: HW link id of pdev to find
441*5113495bSYour Name  * @mlo_grp_id: MLO Group id which it belongs to
442*5113495bSYour Name  * @dbgid: Module ref id used in iterator
443*5113495bSYour Name  * @pdev: Pointer to pdev. This will be set inside itertor callback
444*5113495bSYour Name  *        if hw_link_id match is found.
445*5113495bSYour Name  */
446*5113495bSYour Name struct hw_link_id_iterator {
447*5113495bSYour Name 	uint16_t hw_link_id;
448*5113495bSYour Name 	uint8_t mlo_grp_id;
449*5113495bSYour Name 	wlan_objmgr_ref_dbgid dbgid;
450*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev;
451*5113495bSYour Name };
452*5113495bSYour Name 
453*5113495bSYour Name /**
454*5113495bSYour Name  * wlan_mlo_get_pdev_by_hw_link_id() - Get pdev object from hw_link_id
455*5113495bSYour Name  * @hw_link_id: HW link id of the pdev
456*5113495bSYour Name  * @ml_grp_id: MLO Group id which it belongs to
457*5113495bSYour Name  * @refdbgid: dbgid of module used for taking reference to pdev object
458*5113495bSYour Name  *
459*5113495bSYour Name  * Return: Pointer to pdev object if hw_link_id is valid. Else, NULL
460*5113495bSYour Name  *         Reference will be held with refdgid if return is non-NULL.
461*5113495bSYour Name  *         Caller should free this reference.
462*5113495bSYour Name  */
463*5113495bSYour Name struct wlan_objmgr_pdev *
464*5113495bSYour Name wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id, uint8_t ml_grp_id,
465*5113495bSYour Name 				wlan_objmgr_ref_dbgid refdbgid);
466*5113495bSYour Name 
467*5113495bSYour Name #else
468*5113495bSYour Name static inline int8_t
wlan_mlo_get_max_num_links(uint8_t grp_id)469*5113495bSYour Name wlan_mlo_get_max_num_links(uint8_t grp_id)
470*5113495bSYour Name {
471*5113495bSYour Name 	return WLAN_MLO_INVALID_NUM_LINKS;
472*5113495bSYour Name }
473*5113495bSYour Name 
474*5113495bSYour Name static inline int8_t
wlan_mlo_get_num_active_links(uint8_t grp_id)475*5113495bSYour Name wlan_mlo_get_num_active_links(uint8_t grp_id)
476*5113495bSYour Name {
477*5113495bSYour Name 	return WLAN_MLO_INVALID_NUM_LINKS;
478*5113495bSYour Name }
479*5113495bSYour Name 
480*5113495bSYour Name static inline uint16_t
wlan_mlo_get_valid_link_bitmap(uint8_t grp_id)481*5113495bSYour Name wlan_mlo_get_valid_link_bitmap(uint8_t grp_id)
482*5113495bSYour Name {
483*5113495bSYour Name 	return 0;
484*5113495bSYour Name }
485*5113495bSYour Name 
486*5113495bSYour Name static inline struct wlan_objmgr_pdev *
wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id,uint8_t ml_grp_id,wlan_objmgr_ref_dbgid refdbgid)487*5113495bSYour Name wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id, uint8_t ml_grp_id,
488*5113495bSYour Name 				wlan_objmgr_ref_dbgid refdbgid)
489*5113495bSYour Name {
490*5113495bSYour Name 	return NULL;
491*5113495bSYour Name }
492*5113495bSYour Name 
493*5113495bSYour Name static inline
wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev * pdev)494*5113495bSYour Name uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev)
495*5113495bSYour Name {
496*5113495bSYour Name 	return INVALID_HW_LINK_ID;
497*5113495bSYour Name }
498*5113495bSYour Name 
499*5113495bSYour Name static inline
wlan_mlo_get_psoc_group_id(struct wlan_objmgr_psoc * psoc)500*5113495bSYour Name uint8_t wlan_mlo_get_psoc_group_id(struct wlan_objmgr_psoc *psoc)
501*5113495bSYour Name {
502*5113495bSYour Name 	return -EINVAL;
503*5113495bSYour Name }
504*5113495bSYour Name 
505*5113495bSYour Name static inline
wlan_mlo_get_psoc_capable(struct wlan_objmgr_psoc * psoc)506*5113495bSYour Name bool wlan_mlo_get_psoc_capable(struct wlan_objmgr_psoc *psoc)
507*5113495bSYour Name {
508*5113495bSYour Name 	return false;
509*5113495bSYour Name }
510*5113495bSYour Name #endif/*WLAN_MLO_MULTI_CHIP*/
511*5113495bSYour Name 
512*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
513*5113495bSYour Name /**
514*5113495bSYour Name  * mlo_process_link_set_active_resp() - handler for mlo link set active response
515*5113495bSYour Name  * @psoc: psoc pointer
516*5113495bSYour Name  * @event: pointer to mlo link set active response
517*5113495bSYour Name  *
518*5113495bSYour Name  * Return: QDF_STATUS
519*5113495bSYour Name  */
520*5113495bSYour Name QDF_STATUS
521*5113495bSYour Name mlo_process_link_set_active_resp(struct wlan_objmgr_psoc *psoc,
522*5113495bSYour Name 				 struct mlo_link_set_active_resp *event);
523*5113495bSYour Name 
524*5113495bSYour Name /**
525*5113495bSYour Name  * mlo_ser_set_link_req() - add mlo link set active cmd to serialization
526*5113495bSYour Name  * @req: mlo link set active request
527*5113495bSYour Name  *
528*5113495bSYour Name  * Return: QDF_STATUS
529*5113495bSYour Name  */
530*5113495bSYour Name QDF_STATUS mlo_ser_set_link_req(struct mlo_link_set_active_req *req);
531*5113495bSYour Name 
532*5113495bSYour Name /**
533*5113495bSYour Name  * typedef mlo_vdev_ops_handler() - API to have operation on ml vdevs
534*5113495bSYour Name  * @vdev: vdev object
535*5113495bSYour Name  * @arg: operation-specific argument
536*5113495bSYour Name  */
537*5113495bSYour Name typedef void (*mlo_vdev_ops_handler)(struct wlan_objmgr_vdev *vdev,
538*5113495bSYour Name 				     void *arg);
539*5113495bSYour Name 
540*5113495bSYour Name /**
541*5113495bSYour Name  * mlo_iterate_ml_vdev_list() - Iterate on ML vdevs of MLD
542*5113495bSYour Name  * @vdev: vdev object
543*5113495bSYour Name  * @handler: the handler will be called for each object in ML list
544*5113495bSYour Name  * @arg: argument to be passed to handler
545*5113495bSYour Name  * @lock: Need to acquire lock or not
546*5113495bSYour Name  *
547*5113495bSYour Name  * Return: none
548*5113495bSYour Name  */
549*5113495bSYour Name static inline
mlo_iterate_ml_vdev_list(struct wlan_objmgr_vdev * vdev,mlo_vdev_ops_handler handler,void * arg,bool lock)550*5113495bSYour Name void mlo_iterate_ml_vdev_list(struct wlan_objmgr_vdev *vdev,
551*5113495bSYour Name 			      mlo_vdev_ops_handler handler,
552*5113495bSYour Name 			      void *arg, bool lock)
553*5113495bSYour Name {
554*5113495bSYour Name 	struct wlan_mlo_dev_context *mlo_dev_ctx = NULL;
555*5113495bSYour Name 	uint8_t i = 0;
556*5113495bSYour Name 	QDF_STATUS status;
557*5113495bSYour Name 
558*5113495bSYour Name 	if (!vdev)
559*5113495bSYour Name 		return;
560*5113495bSYour Name 
561*5113495bSYour Name 	mlo_dev_ctx = vdev->mlo_dev_ctx;
562*5113495bSYour Name 	if (!mlo_dev_ctx || !(wlan_vdev_mlme_is_mlo_vdev(vdev)))
563*5113495bSYour Name 		return;
564*5113495bSYour Name 
565*5113495bSYour Name 	if (lock)
566*5113495bSYour Name 		mlo_dev_lock_acquire(mlo_dev_ctx);
567*5113495bSYour Name 
568*5113495bSYour Name 	for (i =  0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
569*5113495bSYour Name 		if (!mlo_dev_ctx->wlan_vdev_list[i])
570*5113495bSYour Name 			continue;
571*5113495bSYour Name 
572*5113495bSYour Name 		status = wlan_objmgr_vdev_try_get_ref(
573*5113495bSYour Name 					mlo_dev_ctx->wlan_vdev_list[i],
574*5113495bSYour Name 					WLAN_MLO_MGR_ID);
575*5113495bSYour Name 		if (QDF_IS_STATUS_ERROR(status))
576*5113495bSYour Name 			continue;
577*5113495bSYour Name 
578*5113495bSYour Name 		if (handler)
579*5113495bSYour Name 			handler(mlo_dev_ctx->wlan_vdev_list[i], arg);
580*5113495bSYour Name 
581*5113495bSYour Name 		mlo_release_vdev_ref(mlo_dev_ctx->wlan_vdev_list[i]);
582*5113495bSYour Name 	}
583*5113495bSYour Name 
584*5113495bSYour Name 	if (lock)
585*5113495bSYour Name 		mlo_dev_lock_release(mlo_dev_ctx);
586*5113495bSYour Name }
587*5113495bSYour Name 
588*5113495bSYour Name /**
589*5113495bSYour Name  * struct mlo_stats_vdev_params - vdev params for MLO stats request
590*5113495bSYour Name  * @ml_vdev_count: Num of connected mlo vdevs
591*5113495bSYour Name  * @ml_vdev_id: vdev_ids of ml vdevs
592*5113495bSYour Name  */
593*5113495bSYour Name struct mlo_stats_vdev_params {
594*5113495bSYour Name 	uint8_t ml_vdev_count;
595*5113495bSYour Name 	uint8_t ml_vdev_id[WLAN_UMAC_MLO_MAX_VDEVS];
596*5113495bSYour Name };
597*5113495bSYour Name 
598*5113495bSYour Name /**
599*5113495bSYour Name  * mlo_get_mlstats_vdev_params() - Get vdev params for MLO stats
600*5113495bSYour Name  * @psoc: psoc object
601*5113495bSYour Name  * @vdev_id: vdev id
602*5113495bSYour Name  * @ml_vdev_info: pointer to mlo_stats_vdev_params
603*5113495bSYour Name  *
604*5113495bSYour Name  * Return: QDF_STATUS
605*5113495bSYour Name  */
606*5113495bSYour Name QDF_STATUS
607*5113495bSYour Name mlo_get_mlstats_vdev_params(struct wlan_objmgr_psoc *psoc,
608*5113495bSYour Name 			    struct mlo_stats_vdev_params *ml_vdev_info,
609*5113495bSYour Name 			    uint8_t vdev_id);
610*5113495bSYour Name 
611*5113495bSYour Name /**
612*5113495bSYour Name  * typedef get_ml_link_state_cb() - api to handle link state callback
613*5113495bSYour Name  * @ev: pointer to event parameter of structure
614*5113495bSYour Name  * @cookie: a cookie for request context
615*5113495bSYour Name  */
616*5113495bSYour Name typedef void (*get_ml_link_state_cb)(struct ml_link_state_info_event *ev,
617*5113495bSYour Name 				     void *cookie);
618*5113495bSYour Name /**
619*5113495bSYour Name  * wlan_handle_ml_link_state_info_event() - Event handler for ml link state
620*5113495bSYour Name  * @psoc: psoc handler
621*5113495bSYour Name  * @event: pointer to event parameter of structure
622*5113495bSYour Name  */
623*5113495bSYour Name QDF_STATUS
624*5113495bSYour Name wlan_handle_ml_link_state_info_event(struct wlan_objmgr_psoc *psoc,
625*5113495bSYour Name 				     struct ml_link_state_info_event *event);
626*5113495bSYour Name /**
627*5113495bSYour Name  * mlo_get_link_state_register_resp_cb() - Register link state callback
628*5113495bSYour Name  * @vdev: vdev handler
629*5113495bSYour Name  * @req: pointer to request parameter of structure
630*5113495bSYour Name  */
631*5113495bSYour Name QDF_STATUS
632*5113495bSYour Name mlo_get_link_state_register_resp_cb(struct wlan_objmgr_vdev *vdev,
633*5113495bSYour Name 				    struct ml_link_state_cmd_info *req);
634*5113495bSYour Name /**
635*5113495bSYour Name  * ml_post_get_link_state_msg() - Post get link state msg
636*5113495bSYour Name  * @vdev: vdev handler
637*5113495bSYour Name  */
638*5113495bSYour Name QDF_STATUS ml_post_get_link_state_msg(struct wlan_objmgr_vdev *vdev);
639*5113495bSYour Name 
640*5113495bSYour Name #endif
641*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
642*5113495bSYour Name /**
643*5113495bSYour Name  * util_add_bw_ind() - Adding bandwidth indiacation element
644*5113495bSYour Name  * @bw_ind: pointer to bandwidth indication element
645*5113495bSYour Name  * @ccfs0: EHT Channel Centre Frequency Segment0 information
646*5113495bSYour Name  * @ccfs1: EHT Channel Centre Frequency Segment1 information
647*5113495bSYour Name  * @ch_width: channel width
648*5113495bSYour Name  * @puncture_bitmap: puncturing information
649*5113495bSYour Name  * @bw_ind_len: pointer to length of bandwidth indication element
650*5113495bSYour Name  */
651*5113495bSYour Name QDF_STATUS
652*5113495bSYour Name util_add_bw_ind(struct wlan_ie_bw_ind *bw_ind, uint8_t ccfs0,
653*5113495bSYour Name 		uint8_t ccfs1, enum phy_ch_width ch_width,
654*5113495bSYour Name 		uint16_t puncture_bitmap, int *bw_ind_len);
655*5113495bSYour Name 
656*5113495bSYour Name /**
657*5113495bSYour Name  * util_parse_bw_ind() - Parsing of bandwidth indiacation element
658*5113495bSYour Name  * @bw_ind: pointer to bandwidth indication element
659*5113495bSYour Name  * @ccfs0: EHT Channel Centre Frequency Segment0 information
660*5113495bSYour Name  * @ccfs1: EHT Channel Centre Frequency Segment1 information
661*5113495bSYour Name  * @ch_width: channel width
662*5113495bSYour Name  * @puncture_bitmap: puncturing information
663*5113495bSYour Name  */
664*5113495bSYour Name 
665*5113495bSYour Name QDF_STATUS
666*5113495bSYour Name util_parse_bw_ind(struct wlan_ie_bw_ind *bw_ind, uint8_t *ccfs0,
667*5113495bSYour Name 		  uint8_t *ccfs1, enum phy_ch_width *ch_width,
668*5113495bSYour Name 		  uint16_t *puncture_bitmap);
669*5113495bSYour Name #endif
670*5113495bSYour Name 
671*5113495bSYour Name #ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE
672*5113495bSYour Name /**
673*5113495bSYour Name  * mlo_mlme_ptqm_migrate_timer_cb() - Timer callback for ptqm migration
674*5113495bSYour Name  * @arg: timer function argument
675*5113495bSYour Name  *
676*5113495bSYour Name  * Return: None
677*5113495bSYour Name  */
678*5113495bSYour Name void mlo_mlme_ptqm_migrate_timer_cb(void *arg);
679*5113495bSYour Name 
680*5113495bSYour Name /*
681*5113495bSYour Name  * wlan_mlo_set_ptqm_migration() - API to trigger ptqm migration.
682*5113495bSYour Name  * @vdev: vdev object
683*5113495bSYour Name  * @ml_peer: ml peer object
684*5113495bSYour Name  * @link_migration: flag to indicate if all peers of vdev need migration
685*5113495bSYour Name  * or individual peer migration
686*5113495bSYour Name  * @link_id: link id for new ptqm
687*5113495bSYour Name  * @force_mig: allow migration to vdevs which are disabled to be pumac
688*5113495bSYour Name  * using primary_umac_skip ini
689*5113495bSYour Name  *
690*5113495bSYour Name  * Return: Success if migration is triggered, else failure
691*5113495bSYour Name  */
692*5113495bSYour Name QDF_STATUS wlan_mlo_set_ptqm_migration(struct wlan_objmgr_vdev *vdev,
693*5113495bSYour Name 				       struct wlan_mlo_peer_context *ml_peer,
694*5113495bSYour Name 				       bool link_migration,
695*5113495bSYour Name 				       uint32_t link_id,
696*5113495bSYour Name 				       bool force_mig);
697*5113495bSYour Name #endif
698*5113495bSYour Name 
699*5113495bSYour Name /*
700*5113495bSYour Name  * wlan_mlo_is_csa_allow() - API to check if CSA allowed for MLO vdev
701*5113495bSYour Name  * @vdev: vdev object
702*5113495bSYour Name  * @csa_freq: CSA target freq
703*5113495bSYour Name  *
704*5113495bSYour Name  * Return: true if CSA allowed
705*5113495bSYour Name  */
706*5113495bSYour Name bool
707*5113495bSYour Name wlan_mlo_is_csa_allow(struct wlan_objmgr_vdev *vdev, uint16_t csa_freq);
708*5113495bSYour Name #endif
709