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_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 * @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_params: 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 * @ml_dev: 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_objmgr_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 * API to have operation on ml vdevs 454 */ 455 typedef void (*mlo_vdev_ops_handler)(struct wlan_objmgr_vdev *vdev, 456 void *arg); 457 458 /** 459 * mlo_iterate_ml_vdev_list() - Iterate on ML vdevs of MLD 460 * @vdev: vdev object 461 * @handler: the handler will be called for each object in ML list 462 * @arg: argument to be passed to handler 463 * @lock: Need to acquire lock or not 464 * 465 * Return: none 466 */ 467 static inline 468 void mlo_iterate_ml_vdev_list(struct wlan_objmgr_vdev *vdev, 469 mlo_vdev_ops_handler handler, 470 void *arg, bool lock) 471 { 472 struct wlan_mlo_dev_context *mlo_dev_ctx = NULL; 473 uint8_t i = 0; 474 QDF_STATUS status; 475 476 if (!vdev) 477 return; 478 479 mlo_dev_ctx = vdev->mlo_dev_ctx; 480 if (!mlo_dev_ctx || !(wlan_vdev_mlme_is_mlo_vdev(vdev))) 481 return; 482 483 if (lock) 484 mlo_dev_lock_acquire(mlo_dev_ctx); 485 486 for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) { 487 if (!mlo_dev_ctx->wlan_vdev_list[i]) 488 continue; 489 490 status = wlan_objmgr_vdev_try_get_ref( 491 mlo_dev_ctx->wlan_vdev_list[i], 492 WLAN_MLO_MGR_ID); 493 if (QDF_IS_STATUS_ERROR(status)) 494 continue; 495 496 if (handler) 497 handler(mlo_dev_ctx->wlan_vdev_list[i], arg); 498 499 mlo_release_vdev_ref(mlo_dev_ctx->wlan_vdev_list[i]); 500 } 501 502 if (lock) 503 mlo_dev_lock_release(mlo_dev_ctx); 504 } 505 506 /** 507 * struct mlo_stats_vdev_params - vdev params for MLO stats request 508 * @ml_vdev_count: Num of connected mlo vdevs 509 * @ml_vdev_id: vdev_ids of ml vdevs 510 */ 511 struct mlo_stats_vdev_params { 512 uint8_t ml_vdev_count; 513 uint8_t ml_vdev_id[WLAN_UMAC_MLO_MAX_VDEVS]; 514 }; 515 516 /** 517 * mlo_get_mlstats_vdev_params() - Get vdev params for MLO stats 518 * @psoc: psoc object 519 * @vdev_id: vdev id 520 * @ml_vdev_info: pointer to mlo_stats_vdev_params 521 * 522 * Return: QDF_STATUS 523 */ 524 QDF_STATUS 525 mlo_get_mlstats_vdev_params(struct wlan_objmgr_psoc *psoc, 526 struct mlo_stats_vdev_params *ml_vdev_info, 527 uint8_t vdev_id); 528 #endif 529 #endif 530