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