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