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