xref: /wlan-dirver/qca-wifi-host-cmn/umac/mlo_mgr/inc/wlan_mlo_mgr_cmn.h (revision 2f4b444fb7e689b83a4ab0e7b3b38f0bf4def8e0)
1 /*
2  * Copyright (c) 2021, The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 /*
18  * DOC: contains MLO manager public file containing common functionality
19  */
20 #ifndef _WLAN_MLO_MGR_CMN_H_
21 #define _WLAN_MLO_MGR_CMN_H_
22 
23 #include <qdf_types.h>
24 #include <qdf_trace.h>
25 #include "wlan_mlo_mgr_public_structs.h"
26 
27 #define mlo_alert(format, args...) \
28 		QDF_TRACE_FATAL(QDF_MODULE_ID_MLO, format, ## args)
29 
30 #define mlo_err(format, args...) \
31 		QDF_TRACE_ERROR(QDF_MODULE_ID_MLO, format, ## args)
32 
33 #define mlo_warn(format, args...) \
34 		QDF_TRACE_WARN(QDF_MODULE_ID_MLO, format, ## args)
35 
36 #define mlo_info(format, args...) \
37 		QDF_TRACE_INFO(QDF_MODULE_ID_MLO, format, ## args)
38 
39 #define mlo_debug(format, args...) \
40 		QDF_TRACE_DEBUG(QDF_MODULE_ID_MLO, format, ## args)
41 
42 #define mlo_nofl_alert(format, args...) \
43 		QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
44 
45 #define mlo_nofl_err(format, args...) \
46 		QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
47 
48 #define mlo_nofl_warn(format, args...) \
49 		QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
50 
51 #define mlo_nofl_info(format, args...) \
52 		QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
53 
54 #define mlo_nofl_debug(format, args...) \
55 		QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
56 
57 #define mlo_alert_rl(format, args...) \
58 		QDF_TRACE_FATAL_RL(QDF_MODULE_ID_MLO, format, ## args)
59 
60 #define mlo_err_rl(format, args...) \
61 		QDF_TRACE_ERROR_RL(QDF_MODULE_ID_MLO, format, ## args)
62 
63 #define mlo_warn_rl(format, args...) \
64 		QDF_TRACE_WARN_RL(QDF_MODULE_ID_MLO, format, ## args)
65 
66 #define mlo_info_rl(format, args...) \
67 		QDF_TRACE_INFO_RL(QDF_MODULE_ID_MLO, format, ## args)
68 
69 #define mlo_debug_rl(format, args...) \
70 		QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_MLO, format, ## args)
71 
72 #define mlo_nofl_alert_rl(format, args...) \
73 		QDF_TRACE_FATAL_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
74 
75 #define mlo_nofl_err_rl(format, args...) \
76 		QDF_TRACE_ERROR_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
77 
78 #define mlo_nofl_warn_rl(format, args...) \
79 		QDF_TRACE_WARN_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
80 
81 #define mlo_nofl_info_rl(format, args...) \
82 		QDF_TRACE_INFO_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
83 
84 #define mlo_nofl_debug_rl(format, args...) \
85 		QDF_TRACE_DEBUG_RL_NO_FL(QDF_MODULE_ID_MLO, format, ## args)
86 
87 #define MLO_INVALID_LINK_IDX 0xFF
88 /**
89  * mlo_get_link_information() - get partner link information
90  * @mld_addr : MLD address
91  * @info: partner link information
92  *
93  * Return: QDF_STATUS
94  */
95 void mlo_get_link_information(struct qdf_mac_addr *mld_addr,
96 			      struct mlo_link_info *info);
97 /**
98  * is_mlo_all_links_up() - check all the link status in a MLO device
99  * @ml_dev: ML device context
100  *
101  * Return: QDF_STATUS
102  */
103 void is_mlo_all_links_up(struct wlan_mlo_dev_context *ml_dev);
104 
105 /**
106  * mlo_get_vdev_by_link_id() - get vdev by link id
107  * @vdev: vdev pointer
108  * @link_id: link id
109  *
110  * Caller should make sure to release the reference of thus obtained vdev
111  * by calling mlo_release_vdev_ref() after usage of vdev.
112  *
113  * Return: vdev object pointer to link id
114  */
115 struct wlan_objmgr_vdev *mlo_get_vdev_by_link_id(
116 			struct wlan_objmgr_vdev *vdev,
117 			uint8_t link_id);
118 
119 /**
120  * mlo_release_vdev_ref() - release vdev reference
121  * @vdev: vdev pointer
122  *
123  * Return: void
124  */
125 void mlo_release_vdev_ref(struct wlan_objmgr_vdev *vdev);
126 
127 /**
128  * mlo_reg_mlme_ext_cb() - Function to register mlme extended callbacks
129  * @ctx: Pointer to mlo manager global context
130  * @ops: Pointer to the struct containing the callbacks
131  *
132  * Return: QDF_STATUS_SUCCESS on successful registration else failure
133  */
134 QDF_STATUS mlo_reg_mlme_ext_cb(struct mlo_mgr_context *ctx,
135 			       struct mlo_mlme_ext_ops *ops);
136 
137 /**
138  * mlo_unreg_mlme_ext_cb() - Function to unregister mlme extended callbacks
139  * @ctx: Pointer to mlo manager global context
140  *
141  * Return: QDF_STATUS_SUCCESS on success else failure
142  */
143 QDF_STATUS mlo_unreg_mlme_ext_cb(struct mlo_mgr_context *ctx);
144 
145 /**
146  * mlo_mlme_validate_conn_req() - Validate connect request
147  * @vdev: Object manager vdev
148  * @ext_data: Data object to be passed to callback
149  *
150  * Return: QDF_STATUS
151  */
152 QDF_STATUS mlo_mlme_validate_conn_req(struct wlan_objmgr_vdev *vdev,
153 				      void *ext_data);
154 
155 /**
156  * mlo_mlme_ext_create_link_vdev() - Create link vdev for ML STA
157  * @vdev: Object manager vdev
158  * @ext_data: Data object to be passed to callback
159  *
160  * Return: QDF_STATUS
161  */
162 QDF_STATUS mlo_mlme_create_link_vdev(struct wlan_objmgr_vdev *vdev,
163 				     void *ext_data);
164 
165 /**
166  * mlo_mlme_peer_create() - Create mlo peer
167  * @vdev: Object manager vdev
168  * @ml_peer: MLO peer context
169  * @addr: Peer addr
170  * @frm_buf: Frame buffer for IE processing
171  *
172  * Return: void
173  */
174 void mlo_mlme_peer_create(struct wlan_objmgr_vdev *vdev,
175 			  struct wlan_mlo_peer_context *ml_peer,
176 			  struct qdf_mac_addr *addr,
177 			  qdf_nbuf_t frm_buf);
178 
179 /**
180  * mlo_mlme_peer_assoc() - Send ML Peer assoc
181  * @peer: Object manager peer
182  *
183  * Return: void
184  */
185 void mlo_mlme_peer_assoc(struct wlan_objmgr_peer *peer);
186 
187 /**
188  * mlo_mlme_peer_assoc_fail() - Send ML Peer assoc fail
189  * @peer: Object manager peer
190  *
191  * Return: void
192  */
193 void mlo_mlme_peer_assoc_fail(struct wlan_objmgr_peer *peer);
194 
195 /**
196  * mlo_mlme_peer_delete() - Send ML Peer delete
197  * @peer: Object manager peer
198  *
199  * Return: void
200  */
201 void mlo_mlme_peer_delete(struct wlan_objmgr_peer *peer);
202 
203 /**
204  * mlo_mlme_peer_assoc_resp() - Initiate sending of Assoc response
205  * @peer: Object manager peer
206  *
207  * Return: void
208  */
209 void mlo_mlme_peer_assoc_resp(struct wlan_objmgr_peer *peer);
210 
211 /**
212  * mlo_get_link_vdev_ix() - Get index of link VDEV in MLD
213  * @ml_dev: ML device context
214  * @vdev: VDEV object
215  *
216  * Return: link index
217  */
218 
219 uint8_t mlo_get_link_vdev_ix(struct wlan_mlo_dev_context *mldev,
220 			     struct wlan_objmgr_vdev *vdev);
221 
222 /**
223  * mlo_get_ml_vdev_list() - get mlo vdev list
224  * @vdev: vdev pointer
225  * @vdev_count: vdev count
226  * @wlan_vdev_list: vdev list
227  *
228  * Caller should release ref of the vdevs in wlan_vdev_list
229  * Return: None
230  */
231 void mlo_get_ml_vdev_list(struct wlan_objmgr_vdev *vdev,
232 			  uint16_t *vdev_count,
233 			  struct wlan_objmgr_vdev **wlan_vdev_list);
234 
235 #define INVALID_HW_LINK_ID 0xFFFF
236 #ifdef WLAN_MLO_MULTI_CHIP
237 /**
238  * wlan_mlo_get_pdev_hw_link_id() - Get hw_link_id of pdev
239  * @pdev: pdev object
240  *
241  * Return: hw_link_id of the pdev.
242  */
243 uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev);
244 
245 /**
246  * struct hw_link_id_iterator: Argument passed in psoc/pdev iterator to
247  *                             find pdev from hw_link_id
248  * @hw_link_id: HW link id of pdev to find
249  * @dbgid: Module ref id used in iterator
250  * @pdev: Pointer to pdev. This will be set inside itertor callback
251  *        if hw_link_id match is found.
252  */
253 struct hw_link_id_iterator {
254 	uint16_t hw_link_id;
255 	wlan_objmgr_ref_dbgid dbgid;
256 	struct wlan_objmgr_pdev *pdev;
257 };
258 
259 /**
260  * wlan_objmgr_get_pdev_by_hw_link_id() - Get pdev object from hw_link_id
261  * @hw_link_id: HW link id of the pdev
262  * @refdbgid: dbgid of module used for taking reference to pdev object
263  *
264  * Return: Pointer to pdev object if hw_link_id is valid. Else, NULL
265  *         Reference will be held with refdgid if return is non-NULL.
266  *         Caller should free this reference.
267  */
268 struct wlan_objmgr_pdev *
269 wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id,
270 				wlan_objmgr_ref_dbgid refdbgid);
271 #else
272 static inline struct wlan_objmgr_pdev *
273 wlan_mlo_get_pdev_by_hw_link_id(uint16_t hw_link_id,
274 				wlan_objmgr_ref_dbgid refdbgid)
275 {
276 	return NULL;
277 }
278 
279 static inline
280 uint16_t wlan_mlo_get_pdev_hw_link_id(struct wlan_objmgr_pdev *pdev)
281 {
282 	return INVALID_HW_LINK_ID;
283 }
284 #endif/*WLAN_MLO_MULTI_CHIP*/
285 
286 #endif
287