1 /* 2 * Copyright (c) 2016-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 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: Define the vdev data structure of UMAC 22 */ 23 24 #ifndef _WLAN_OBJMGR_VDEV_OBJ_H_ 25 #define _WLAN_OBJMGR_VDEV_OBJ_H_ 26 27 #include "qdf_atomic.h" 28 #include "qdf_list.h" 29 #include "qdf_lock.h" 30 #include "qdf_types.h" 31 #include "wlan_cmn.h" 32 #include "wlan_objmgr_cmn.h" 33 #include "wlan_objmgr_pdev_obj.h" 34 #include "wlan_objmgr_psoc_obj.h" 35 #include "wlan_vdev_mlme_main.h" 36 #include "include/wlan_vdev_mlme.h" 37 #include "wlan_vdev_mlme_api.h" 38 #include "wlan_mlme_dbg.h" 39 #ifdef WLAN_FEATURE_11BE_MLO 40 #include "wlan_mlo_mgr_public_structs.h" 41 #endif 42 43 /* CONF: privacy enabled */ 44 #define WLAN_VDEV_F_PRIVACY 0x00000001 45 /* CONF: 11g w/o 11b sta's */ 46 #define WLAN_VDEV_F_PUREG 0x00000002 47 /* CONF: des_bssid is set */ 48 #define WLAN_VDEV_F_DESBSSID 0x00000004 49 /* CONF: bg scan enabled */ 50 #define WLAN_VDEV_F_BGSCAN 0x00000008 51 /* CONF: sw tx retry enabled */ 52 #define WLAN_VDEV_F_SWRETRY 0x00000010 53 /* STATUS: update beacon tim */ 54 #define WLAN_VDEV_F_TIMUPDATE 0x00000020 55 /* CONF: WPA enabled */ 56 #define WLAN_VDEV_F_WPA1 0x00000040 57 /* CONF: WPA2 enabled */ 58 #define WLAN_VDEV_F_WPA2 0x00000080 59 /* CONF: WPA/WPA2 enabled */ 60 #define WLAN_VDEV_F_WPA 0x000000c0 61 /* CONF: drop unencrypted */ 62 #define WLAN_VDEV_F_DROPUNENC 0x00000100 63 /* CONF: TKIP countermeasures */ 64 #define WLAN_VDEV_F_COUNTERM 0x00000200 65 /* CONF: hide SSID in beacon */ /*TODO PDEV/PSOC */ 66 #define WLAN_VDEV_F_HIDESSID 0x00000400 67 /* CONF: disable internal bridge */ /*TODO PDEV/PSOC */ 68 #define WLAN_VDEV_F_NOBRIDGE 0x00000800 69 /* STATUS: update beacon wme */ 70 #define WLAN_VDEV_F_WMEUPDATE 0x00001000 71 /* CONF: enable U-APSD */ 72 #define WLAN_VDEV_F_UAPSD 0x00004000 73 /* STATUS: sleeping */ 74 #define WLAN_VDEV_F_SLEEP 0x00008000 75 /* drop uapsd EOSP frames for test */ 76 #define WLAN_VDEV_F_EOSPDROP 0x00010000 77 /* CONF: A-MPDU supported */ 78 #define WLAN_VDEV_F_AMPDU 0x00020000 79 /* STATE: beacon APP IE updated */ 80 #define WLAN_VDEV_F_APPIE_UPDATE 0x00040000 81 /* CONF: WDS auto Detect/DELBA */ 82 #define WLAN_VDEV_F_WDS_AUTODETECT 0x00080000 83 /* 11b only without 11g stations */ 84 #define WLAN_VDEV_F_PUREB 0x00100000 85 /* disable HT rates */ 86 #define WLAN_VDEV_F_HTRATES 0x00200000 87 /* CONF: deliver rx frames with 802.11 header */ 88 #define WLAN_VDEV_F_DELIVER_80211 0x00800000 89 /* CONF: os sends down tx frames with 802.11 header */ 90 #define WLAN_VDEV_F_SEND_80211 0x01000000 91 /* CONF: statically configured WDS */ 92 #define WLAN_VDEV_F_WDS_STATIC 0x02000000 93 /* CONF: pure 11n mode */ 94 #define WLAN_VDEV_F_PURE11N 0x04000000 95 /* CONF: pure 11ac mode */ 96 #define WLAN_VDEV_F_PURE11AC 0x08000000 97 /* Basic Rates Update */ 98 #define WLAN_VDEV_F_BR_UPDATE 0x10000000 99 /* CONF: restrict bw ont top of per 11ac/n */ 100 #define WLAN_VDEV_F_STRICT_BW 0x20000000 101 /* Wi-Fi SON mode (with APS) */ 102 #define WLAN_VDEV_F_SON 0x40000000 103 /* Wi-Fi SON mode (with APS) */ 104 #define WLAN_VDEV_F_MBO 0x80000000 105 106 /* Feature extension flags */ 107 /* CONF: MSFT safe mode */ 108 #define WLAN_VDEV_FEXT_SAFEMODE 0x00000001 109 /* if the vap can sleep*/ 110 #define WLAN_VDEV_FEXT_CANSLEEP 0x00000002 111 /* use sw bmiss timer */ 112 #define WLAN_VDEV_FEXT_SWBMISS 0x00000004 113 /* enable beacon copy */ 114 #define WLAN_VDEV_FEXT_COPY_BEACON 0x00000008 115 #define WLAN_VDEV_FEXT_WAPI 0x00000010 116 /* 802.11h enabled */ 117 #define WLAN_VDEV_FEXT_DOTH 0x00000020 118 /* if the vap has wds independence set */ 119 #define WLAN_VDEV_FEXT_VAPIND 0x00000040 120 /* QBSS load IE enabled */ 121 #define WLAN_VDEV_FEXT_BSSLOAD 0x00000080 122 /* Short Guard Interval Enable:1 Disable:0 */ 123 #define WLAN_VDEV_FEXT_SGI 0x00000100 124 /* Short Guard Interval Enable:1 Disable:0 for VHT fixed rates */ 125 #define WLAN_VDEV_FEXT_DATASGI 0x00000200 126 /* LDPC Enable Rx:1 TX: 2 ; Disable:0 */ 127 #define WLAN_VDEV_FEXT_LDPC_TX 0x00000400 128 #define WLAN_VDEV_FEXT_LDPC_RX 0x00000800 129 #define WLAN_VDEV_FEXT_LDPC 0x00000c00 130 /* wme enabled */ 131 #define WLAN_VDEV_FEXT_WME 0x00001000 132 /* WNM Capabilities */ 133 #define WLAN_VDEV_FEXT_WNM 0x00002000 134 /* RRM Capabilities */ 135 #define WLAN_VDEV_FEXT_RRM 0x00004000 136 /* WNM Proxy ARP Capabilities */ 137 #define WLAN_VDEV_FEXT_PROXYARP 0x00008000 138 /* 256 QAM support in 2.4GHz mode Enable:1 Disable:0 */ 139 #define WLAN_VDEV_FEXT_256QAM 0x00010000 140 /* 2.4NG 256 QAM Interop mode Enable:1 Disable:0 */ 141 #define WLAN_VDEV_FEXT_256QAM_INTEROP 0x00020000 142 /* static mimo ps enabled */ 143 #define WLAN_VDEV_FEXT_STATIC_MIMOPS 0x00040000 144 /* dynamic mimo ps enabled */ 145 #define WLAN_VDEV_FEXT_DYN_MIMOPS 0x00080000 146 /* Country IE enabled */ 147 #define WLAN_VDEV_FEXT_CNTRY_IE 0x00100000 148 /*does not want to trigger multi channel operation 149 instead follow master vaps channel (for AP/GO Vaps) */ 150 #define WLAN_VDEV_FEXT_NO_MULCHAN 0x00200000 151 /*non-beaconing AP VAP*/ 152 #define WLAN_VDEV_FEXT_NON_BEACON 0x00400000 153 /* SPL repeater enabled for SON*/ 154 #define WLAN_VDEV_FEXT_SON_SPL_RPT 0x00800000 155 /* SON IE update in MGMT frame */ 156 #define WLAN_VDEV_FEXT_SON_INFO_UPDATE 0x01000000 157 /* CONF: A-MSDU supported */ 158 #define WLAN_VDEV_FEXT_AMSDU 0x02000000 159 /* Fils discovery on 6G SAP*/ 160 #define WLAN_VDEV_FEXT_FILS_DISC_6G_SAP 0x80000000 161 162 /* Feature more extension flags */ 163 /* VDEV is MLO*/ 164 #define WLAN_VDEV_FEXT2_MLO 0x00000001 165 /* STA VDEV is link type */ 166 #define WLAN_VDEV_FEXT2_MLO_STA_LINK 0x00000002 167 /* VDEV is MLO mcast primary*/ 168 #define WLAN_VDEV_FEXT2_MLO_MCAST 0x00000004 169 /* 20TU BCAST PROBE RESP on 6G SAP*/ 170 #define WLAN_VDEV_FEXT2_20TU_PRB_RESP 0x00000008 171 172 /* VDEV OP flags */ 173 /* if the vap destroyed by user */ 174 #define WLAN_VDEV_OP_DELETE_PROGRESS 0x00000001 175 /* set to enable sta-fws fweature */ 176 #define WLAN_VDEV_OP_STAFWD 0x00000002 177 /* Off-channel support enabled */ 178 #define WLAN_VDEV_OP_OFFCHAN 0x00000004 179 /* if the vap has erp update set */ 180 #define WLAN_VDEV_OP_ERPUPDATE 0x00000008 181 /* this vap needs scheduler for off channel operation */ 182 #define WLAN_VDEV_OP_NEEDS_SCHED 0x00000010 183 /*STA in forced sleep set PS bit for all outgoing frames */ 184 #define WLAN_VDEV_OP_FORCED_SLEEP 0x00000020 185 /* update bssload IE in beacon */ 186 #define WLAN_VDEV_OP_BSSLOAD_UPDATE 0x00000040 187 /* Hotspot 2.0 DGAF Disable bit */ 188 #define WLAN_VDEV_OP_DGAF_DISABLE 0x00000080 189 /* STA SmartNet enabled */ 190 #define WLAN_VDEV_OP_SMARTNET_EN 0x00000100 191 /* SoftAP to reject resuming in DFS channels */ 192 #define WLAN_VDEV_OP_REJ_DFS_CHAN 0x00000200 193 /* Trigger mlme response */ 194 #define WLAN_VDEV_OP_TRIGGER_MLME_RESP 0x00000400 195 /* test flag for MFP */ 196 #define WLAN_VDEV_OP_MFP_TEST 0x00000800 197 /* flag to indicate using default ratemask */ 198 #define WLAN_VDEV_OP_DEF_RATEMASK 0x00001000 199 /*For wakeup AP VAP when wds-sta connect to the AP only use when 200 export (UMAC_REPEATER_DELAYED_BRINGUP || DBDC_REPEATER_SUPPORT)=1*/ 201 #define WLAN_VDEV_OP_KEYFLAG 0x00002000 202 /* if performed the iwlist scanning */ 203 #define WLAN_VDEV_OP_LIST_SCANNING 0x00004000 204 /*Set when VAP down*/ 205 #define WLAN_VDEV_OP_IS_DOWN 0x00008000 206 /* if vap may require acs when another vap is brought down */ 207 #define WLAN_VDEV_OP_NEEDS_UP_ACS 0x00010000 208 /* Block data traffic tx for this vap */ 209 #define WLAN_VDEV_OP_BLOCK_TX_TRAFFIC 0x00020000 210 /* for mbo functionality */ 211 #define WLAN_VDEV_OP_MBO 0x00040000 212 /* VDEV Critical update category-1 213 * Inclusion of Critical Update IES flag 214 * This includes: CSA, ECSA, Quiet 215 * Quiet channel, Max Ch Switch Time IEs. 216 */ 217 #define WLAN_VDEV_OP_CU_CAT1 0x00080000 218 /* VDEV Critical update category-2 219 * Modification of Critical Update IES flag 220 * This includes: DSSS Param, HT Operation element 221 * VHT Operation element, HE Operation element 222 * EHT Operation element, MU EDCA Param, EDCA param 223 * UORA Param, BSS Color Change Announcement element 224 * Spatial Reuse Param Set element 225 * Operating Mode Notification element 226 * Wide Bandwidth Channel Switch element 227 * Broadcast TWT element 228 */ 229 #define WLAN_VDEV_OP_CU_CAT2 0x00100000 230 231 /* CAPABILITY: IBSS available */ 232 #define WLAN_VDEV_C_IBSS 0x00000001 233 /* CAPABILITY: HOSTAP avail */ 234 #define WLAN_VDEV_C_HOSTAP 0x00000002 235 /* CAPABILITY: Old Adhoc Demo */ 236 #define WLAN_VDEV_C_AHDEMO 0x00000004 237 /* CAPABILITY: sw tx retry */ 238 #define WLAN_VDEV_C_SWRETRY 0x00000008 239 /* CAPABILITY: monitor mode */ 240 #define WLAN_VDEV_C_MONITOR 0x00000010 241 /* CAPABILITY: TKIP MIC avail */ 242 #define WLAN_VDEV_C_TKIPMIC 0x00000020 243 /* CAPABILITY: 4-addr support */ 244 #define WLAN_VDEV_C_WDS 0x00000040 245 /* CAPABILITY: TKIP MIC for QoS frame */ 246 #define WLAN_VDEV_C_WME_TKIPMIC 0x00000080 247 /* CAPABILITY: bg scanning */ 248 #define WLAN_VDEV_C_BGSCAN 0x00000100 249 /* CAPABILITY: Restrict offchannel */ 250 #define WLAN_VDEV_C_RESTRICT_OFFCHAN 0x00000200 251 /* CAPABILITY: eMLSR capability */ 252 #define WLAN_VDEV_C_EMLSR_CAP 0x00000400 253 254 /* Invalid VDEV identifier */ 255 #define WLAN_INVALID_VDEV_ID 255 256 257 /* Invalid VDEV link id*/ 258 #define WLAN_INVALID_LINK_ID 255 259 260 /** 261 * struct wlan_vdev_create_params - Create params, HDD/OSIF passes this 262 * structure While creating VDEV 263 * @opmode: Opmode of VDEV 264 * @flags: create flags 265 * @size_vdev_priv: Size of vdev private 266 * @legacy_osif: Legacy os_if private member 267 * @macaddr[]: MAC address 268 * @mataddr[]: MAT address 269 * @mldaddr[]: MLD address 270 */ 271 struct wlan_vdev_create_params { 272 enum QDF_OPMODE opmode; 273 uint32_t flags; 274 size_t size_vdev_priv; 275 void *legacy_osif; 276 uint8_t macaddr[QDF_MAC_ADDR_SIZE]; 277 uint8_t mataddr[QDF_MAC_ADDR_SIZE]; 278 uint8_t mldaddr[QDF_MAC_ADDR_SIZE]; 279 }; 280 281 /** 282 * struct wlan_channel - channel structure 283 * @ch_freq: Channel in Mhz. 284 * @ch_ieee: IEEE channel number. 285 * @ch_freq_seg1: Channel Center frequency for VHT80/160 and HE80/160. 286 * @ch_freq_seg2: Second channel Center frequency applicable for 80+80MHz mode. 287 * @ch_maxpower: Maximum tx power in dBm. 288 * @ch_flagext: Channel extension flags. 289 * @ch_flags: Channel flags. 290 * @ch_cfreq1: channel center frequency for primary 291 * @ch_cfreq2: channel center frequency for secondary 292 * @ch_width: Channel width. 293 * @ch_phymode: Channel phymode. 294 * @puncture_bitmap: Puncture bitmap per 20MHz. 295 */ 296 struct wlan_channel { 297 uint16_t ch_freq; 298 uint8_t ch_ieee; 299 uint8_t ch_freq_seg1; 300 uint8_t ch_freq_seg2; 301 int8_t ch_maxpower; 302 uint16_t ch_flagext; 303 uint64_t ch_flags; 304 uint32_t ch_cfreq1; 305 uint32_t ch_cfreq2; 306 enum phy_ch_width ch_width; 307 enum wlan_phymode ch_phymode; 308 #ifdef WLAN_FEATURE_11BE 309 uint16_t puncture_bitmap; 310 #endif 311 }; 312 313 /** 314 * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure 315 * @vdev_opmode: Opmode of VDEV 316 * @mlme_state: VDEV MLME SM state 317 * @mlme_state: VDEV MLME SM substate 318 * @bss_chan: BSS channel 319 * @des_chan: Desired channel, for STA Desired may not be used 320 * @vdev_caps: VDEV capabilities 321 * @vdev_feat_caps: VDEV feature caps 322 * @vdev_feat_ext_caps: VDEV Extended feature caps 323 * @vdev_feat_ext2_caps: More VDEV Extended feature caps 324 * @vdev_op_flags: Operation flags 325 * @mataddr[]: MAT address 326 * @macaddr[]: Contains link MAC address for ML connection and 327 * net dev address for non-ML connection 328 * @mldaddr[]: MLD address 329 * @linkaddr[]: Link MAC address 330 * @mlo_link_id: link id for mlo connection 331 * @wlan_vdev_mlo_lock: lock to protect the set/clear of 332 * WLAN_VDEV_FEXT2_MLO feature flag in vdev MLME 333 */ 334 struct wlan_objmgr_vdev_mlme { 335 enum QDF_OPMODE vdev_opmode; 336 enum wlan_vdev_state mlme_state; 337 enum wlan_vdev_state mlme_substate; 338 struct wlan_channel *bss_chan; 339 struct wlan_channel *des_chan; 340 uint32_t vdev_caps; 341 uint32_t vdev_feat_caps; 342 uint32_t vdev_feat_ext_caps; 343 uint32_t vdev_feat_ext2_caps; 344 uint32_t vdev_op_flags; 345 uint8_t mataddr[QDF_MAC_ADDR_SIZE]; 346 uint8_t macaddr[QDF_MAC_ADDR_SIZE]; 347 uint8_t mldaddr[QDF_MAC_ADDR_SIZE]; 348 uint8_t linkaddr[QDF_MAC_ADDR_SIZE]; 349 #ifdef WLAN_FEATURE_11BE_MLO 350 uint8_t mlo_link_id; 351 #ifdef WLAN_MLO_USE_SPINLOCK 352 qdf_spinlock_t wlan_vdev_mlo_lock; 353 #else 354 qdf_mutex_t wlan_vdev_mlo_lock; 355 #endif 356 #endif 357 }; 358 359 /** 360 * struct wlan_objmgr_vdev_nif - VDEV HDD specific sub structure 361 * @osdev: OS specific pointer 362 */ 363 struct wlan_objmgr_vdev_nif { 364 struct vdev_osif_priv *osdev; 365 }; 366 367 /** 368 * struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure 369 * @vdev_id: VDEV id 370 * @print_cnt: Count to throttle Logical delete prints 371 * @self_peer: Self PEER 372 * @bss_peer: BSS PEER 373 * @wlan_peer_list: PEER list 374 * @wlan_pdev: PDEV pointer 375 * @wlan_peer_count: Peer count 376 * @max_peer_count: Max Peer count 377 * @c_flags: creation specific flags 378 * @ref_cnt: Ref count 379 * @ref_id_dbg: Array to track Ref count 380 * @wlan_objmgr_trace: Trace ref and deref 381 */ 382 struct wlan_objmgr_vdev_objmgr { 383 uint8_t vdev_id; 384 uint8_t print_cnt; 385 struct wlan_objmgr_peer *self_peer; 386 struct wlan_objmgr_peer *bss_peer; 387 qdf_list_t wlan_peer_list; 388 struct wlan_objmgr_pdev *wlan_pdev; 389 uint16_t wlan_peer_count; 390 uint16_t max_peer_count; 391 uint32_t c_flags; 392 qdf_atomic_t ref_cnt; 393 qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX]; 394 #ifdef WLAN_OBJMGR_REF_ID_TRACE 395 struct wlan_objmgr_trace trace; 396 #endif 397 }; 398 399 /** 400 * struct wlan_objmgr_vdev - VDEV common object 401 * @vdev_node: qdf list of pdev's vdev list 402 * @vdev_mlme: VDEV MLME substructure 403 * @vdev_objmgr: VDEV Object Mgr substructure 404 * @vdev_nif: VDEV HDD substructure 405 * @vdev_comp_priv_obj[]:Component's private objects list 406 * @obj_status[]: Component object status 407 * @obj_state: VDEV object state 408 * @vdev_lock: VDEV lock 409 * @mlo_dev_ctx: MLO device context 410 * @twt_work: TWT work 411 */ 412 struct wlan_objmgr_vdev { 413 qdf_list_node_t vdev_node; 414 struct wlan_objmgr_vdev_mlme vdev_mlme; 415 struct wlan_objmgr_vdev_objmgr vdev_objmgr; 416 struct wlan_objmgr_vdev_nif vdev_nif; 417 void *vdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS]; 418 QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS]; 419 WLAN_OBJ_STATE obj_state; 420 qdf_spinlock_t vdev_lock; 421 #ifdef WLAN_FEATURE_11BE_MLO 422 struct wlan_mlo_dev_context *mlo_dev_ctx; 423 #endif 424 #ifdef WLAN_SUPPORT_TWT 425 qdf_work_t twt_work; 426 #endif 427 }; 428 429 /** 430 ** APIs to Create/Delete Global object APIs 431 */ 432 /** 433 * wlan_objmgr_vdev_obj_create() - vdev object create 434 * @pdev: PDEV object on which this vdev gets created 435 * @params: VDEV create params from HDD 436 * 437 * Creates vdev object, initializes with default values 438 * Attaches to psoc and pdev objects 439 * Invokes the registered notifiers to create component object 440 * 441 * Return: Handle to struct wlan_objmgr_vdev on successful creation, 442 * NULL on Failure (on Mem alloc failure and Component objects 443 * Failure) 444 */ 445 struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create( 446 struct wlan_objmgr_pdev *pdev, 447 struct wlan_vdev_create_params *params); 448 449 /** 450 * wlan_objmgr_vdev_obj_delete() - vdev object delete 451 * @vdev: vdev object 452 * 453 * Logically deletes VDEV object, 454 * Once all the references are released, object manager invokes the registered 455 * notifiers to destroy component objects 456 * 457 * Return: SUCCESS/FAILURE 458 */ 459 QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev); 460 461 /** 462 ** APIs to attach/detach component objects 463 */ 464 /** 465 * wlan_objmgr_vdev_component_obj_attach() - vdev comp object attach 466 * @vdev: VDEV object 467 * @id: Component id 468 * @comp_priv_obj: component's private object pointer 469 * @status: Component's private object creation status 470 * 471 * API to be used for attaching component object with VDEV common object 472 * 473 * Return: SUCCESS on successful storing of component's object in common object 474 * On FAILURE (appropriate failure codes are returned) 475 */ 476 QDF_STATUS wlan_objmgr_vdev_component_obj_attach( 477 struct wlan_objmgr_vdev *vdev, 478 enum wlan_umac_comp_id id, 479 void *comp_priv_obj, 480 QDF_STATUS status); 481 482 /** 483 * wlan_objmgr_vdev_component_obj_detach() - vdev comp object detach 484 * @vdev: VDEV object 485 * @id: Component id 486 * @comp_priv_obj: component's private object pointer 487 * 488 * API to be used for detaching component object with VDEV common object 489 * 490 * Return: SUCCESS on successful removal of component's object from common 491 * object 492 * On FAILURE (appropriate failure codes are returned) 493 */ 494 QDF_STATUS wlan_objmgr_vdev_component_obj_detach( 495 struct wlan_objmgr_vdev *vdev, 496 enum wlan_umac_comp_id id, 497 void *comp_priv_obj); 498 /* 499 ** APIs to operations on vdev objects 500 */ 501 502 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev, 503 void *object, 504 void *arg); 505 506 /** 507 * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list 508 * @vdev: vdev object 509 * @handler: the handler will be called for each object of requested type 510 * the handler should be implemented to perform required operation 511 * @arg: arguments passed by caller 512 * @dbg_id: id of the caller 513 * 514 * API to be used for performing the operations on all PEER objects 515 * of vdev 516 * 517 * Return: SUCCESS/FAILURE 518 */ 519 QDF_STATUS wlan_objmgr_iterate_peerobj_list( 520 struct wlan_objmgr_vdev *vdev, 521 wlan_objmgr_vdev_op_handler handler, 522 void *arg, wlan_objmgr_ref_dbgid dbg_id); 523 524 /** 525 * wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list 526 * @vdev: vdev object 527 * @dbg_id: id of the caller 528 * 529 * API to be used for populating the list of logically deleted peers from the 530 * vdev's peer list 531 * 532 * The caller of this function should free the memory allocated for the 533 * peerlist and the peer member in the list 534 * Also the peer ref release is handled by the caller 535 * 536 * Return: list of peer pointers 537 * NULL on FAILURE 538 */ 539 qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list( 540 struct wlan_objmgr_vdev *vdev, 541 wlan_objmgr_ref_dbgid dbg_id); 542 543 /** 544 * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev 545 * comp object creation 546 * @vdev: VDEV object 547 * @id: Component id 548 * 549 * API to create component private object in run time, this would 550 * be used for features which gets enabled in run time 551 * 552 * Return: SUCCESS on successful creation 553 * On FAILURE (appropriate failure codes are returned) 554 */ 555 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation( 556 struct wlan_objmgr_vdev *vdev, 557 enum wlan_umac_comp_id id); 558 559 /** 560 * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp 561 * object deletion 562 * @vdev: VDEV object 563 * @id: Component id 564 * 565 * API to destroy component private object in run time, this would 566 * be used for features which gets disabled in run time 567 * 568 * Return: SUCCESS on successful deletion 569 * On FAILURE (appropriate failure codes are returned) 570 */ 571 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion( 572 struct wlan_objmgr_vdev *vdev, 573 enum wlan_umac_comp_id id); 574 575 /** 576 * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object 577 * @vdev: VDEV object 578 * @id: Component id 579 * 580 * API to get component private object 581 * 582 * Return: void *ptr on SUCCESS 583 * NULL on Failure 584 */ 585 void *wlan_objmgr_vdev_get_comp_private_obj( 586 struct wlan_objmgr_vdev *vdev, 587 enum wlan_umac_comp_id id); 588 589 /* Util APIs */ 590 591 /** 592 * wlan_vdev_get_pdev() - get pdev 593 * @vdev: VDEV object 594 * 595 * API to get pdev object pointer from vdev 596 * 597 * Return: pdev object pointer 598 */ 599 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev( 600 struct wlan_objmgr_vdev *vdev) 601 { 602 return vdev->vdev_objmgr.wlan_pdev; 603 } 604 605 /** 606 * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list 607 * @peer_list: qdf_list_t 608 * 609 * API to get the head vdev of given vdev (of pdev's vdev list) 610 * 611 * Caller need to acquire lock with wlan_vdev_obj_lock() 612 * 613 * Return: 614 * @peer: head peer 615 */ 616 static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head( 617 qdf_list_t *vdev_list) 618 { 619 struct wlan_objmgr_vdev *vdev; 620 qdf_list_node_t *vdev_node = NULL; 621 622 /* This API is invoked with lock acquired, do not add log prints */ 623 if (qdf_list_peek_front(vdev_list, &vdev_node) != QDF_STATUS_SUCCESS) 624 return NULL; 625 626 vdev = qdf_container_of(vdev_node, struct wlan_objmgr_vdev, vdev_node); 627 return vdev; 628 } 629 630 631 /** 632 * wlan_vdev_get_next_vdev_of_pdev() - get next vdev 633 * @vdev: VDEV object 634 * 635 * API to get next vdev object pointer of vdev 636 * 637 * Caller need to acquire lock with wlan_vdev_obj_lock() 638 * 639 * Return: 640 * @vdev_next: VDEV object 641 */ 642 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev( 643 qdf_list_t *vdev_list, 644 struct wlan_objmgr_vdev *vdev) 645 { 646 struct wlan_objmgr_vdev *vdev_next; 647 qdf_list_node_t *node = &vdev->vdev_node; 648 qdf_list_node_t *next_node = NULL; 649 650 /* This API is invoked with lock acquired, do not add log prints */ 651 if (!node) 652 return NULL; 653 654 if (qdf_list_peek_next(vdev_list, node, &next_node) != 655 QDF_STATUS_SUCCESS) 656 return NULL; 657 658 vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev, 659 vdev_node); 660 return vdev_next; 661 } 662 663 664 665 /** 666 * wlan_vdev_set_pdev() - set pdev 667 * @vdev: VDEV object 668 * @pdev: PDEV object 669 * 670 * API to get pdev object pointer from vdev 671 * 672 * Caller need to acquire lock with wlan_vdev_obj_lock() 673 * 674 * Return: void 675 */ 676 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev, 677 struct wlan_objmgr_pdev *pdev) 678 { 679 /* This API is invoked with lock acquired, do not add log prints */ 680 vdev->vdev_objmgr.wlan_pdev = pdev; 681 } 682 683 /** 684 * wlan_vdev_get_psoc() - get psoc 685 * @vdev: VDEV object 686 * 687 * API to get pdev object pointer from vdev 688 * 689 * Return: psoc object pointer 690 */ 691 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc( 692 struct wlan_objmgr_vdev *vdev) 693 { 694 struct wlan_objmgr_pdev *pdev; 695 struct wlan_objmgr_psoc *psoc = NULL; 696 697 pdev = wlan_vdev_get_pdev(vdev); 698 if (!pdev) 699 return NULL; 700 701 psoc = wlan_pdev_get_psoc(pdev); 702 703 return psoc; 704 } 705 706 /** 707 * wlan_vdev_get_psoc_id() - get psoc id 708 * @vdev: VDEV object 709 * 710 * API to get VDEV's psoc id 711 * 712 * Return: @psoc_id: psoc id 713 */ 714 static inline uint8_t wlan_vdev_get_psoc_id(struct wlan_objmgr_vdev *vdev) 715 { 716 struct wlan_objmgr_psoc *psoc; 717 718 psoc = wlan_vdev_get_psoc(vdev); 719 720 return wlan_psoc_get_id(psoc); 721 } 722 723 /** 724 * wlan_vdev_mlme_set_opmode() - set vdev opmode 725 * @vdev: VDEV object 726 * @mode: VDEV op mode 727 * 728 * API to set opmode in vdev object 729 * 730 * Return: void 731 */ 732 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev, 733 enum QDF_OPMODE mode) 734 { 735 vdev->vdev_mlme.vdev_opmode = mode; 736 } 737 738 /** 739 * wlan_vdev_mlme_get_opmode() - get vdev opmode 740 * @vdev: VDEV object 741 * 742 * API to set opmode of vdev object 743 * 744 * Return: 745 * @mode: VDEV op mode 746 */ 747 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode( 748 struct wlan_objmgr_vdev *vdev) 749 { 750 return vdev->vdev_mlme.vdev_opmode; 751 } 752 753 /** 754 * wlan_vdev_mlme_set_macaddr() - set vdev macaddr 755 * @vdev: VDEV object 756 * @macaddr: MAC address 757 * 758 * API to set macaddr in vdev object 759 * 760 * Caller need to acquire lock with wlan_vdev_obj_lock() 761 * 762 * Return: void 763 */ 764 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev, 765 uint8_t *macaddr) 766 { 767 /* This API is invoked with lock acquired, do not add log prints */ 768 WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr); 769 } 770 771 /** 772 * wlan_vdev_mlme_get_macaddr() - get vdev macaddr 773 * @vdev: VDEV object 774 * 775 * API to get MAC address from vdev object 776 * 777 * Caller need to acquire lock with wlan_vdev_obj_lock() 778 * 779 * Return: 780 * @macaddr: MAC address 781 */ 782 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev) 783 { 784 /* This API is invoked with lock acquired, do not add log prints */ 785 return vdev->vdev_mlme.macaddr; 786 } 787 788 /** 789 * wlan_vdev_mlme_set_mataddr() - set vdev mataddr 790 * @vdev: VDEV object 791 * @mataddr: MAT address 792 * 793 * API to set mataddr in vdev object 794 * 795 * Caller need to acquire lock with wlan_vdev_obj_lock() 796 * 797 * Return: void 798 */ 799 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev, 800 uint8_t *mataddr) 801 { 802 /* This API is invoked with lock acquired, do not add log prints */ 803 WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr); 804 } 805 806 /** 807 * wlan_vdev_mlme_get_mldaddr() - get vdev mldaddr 808 * @vdev: VDEV object 809 * 810 * API to get MLD address from vdev object 811 * 812 * Caller need to acquire lock with wlan_vdev_obj_lock() 813 * 814 * Return: 815 * @macaddr: MAC address 816 */ 817 static inline uint8_t *wlan_vdev_mlme_get_mldaddr(struct wlan_objmgr_vdev *vdev) 818 { 819 /* This API is invoked with lock acquired, do not add log prints */ 820 return vdev->vdev_mlme.mldaddr; 821 } 822 823 /** 824 * wlan_vdev_mlme_set_mldaddr() - set vdev mldaddr 825 * @vdev: VDEV object 826 * @mldaddr: MLD address 827 * 828 * API to set MLD addr in vdev object 829 * 830 * Caller need to acquire lock with wlan_vdev_obj_lock() 831 * 832 * Return: void 833 */ 834 static inline void wlan_vdev_mlme_set_mldaddr(struct wlan_objmgr_vdev *vdev, 835 uint8_t *mldaddr) 836 { 837 /* This API is invoked with lock acquired, do not add log prints */ 838 WLAN_ADDR_COPY(vdev->vdev_mlme.mldaddr, mldaddr); 839 } 840 841 /** 842 * wlan_vdev_mlme_get_linkaddr() - get vdev linkaddr 843 * @vdev: VDEV object 844 * 845 * API to get link MAC address from vdev object 846 * 847 * Caller need to acquire lock with wlan_vdev_obj_lock() 848 * 849 * Return: 850 * @linkaddr: Link MAC address 851 */ 852 static inline 853 uint8_t *wlan_vdev_mlme_get_linkaddr(struct wlan_objmgr_vdev *vdev) 854 { 855 /* This API is invoked with lock acquired, do not add log prints */ 856 return vdev->vdev_mlme.linkaddr; 857 } 858 859 /** 860 * wlan_vdev_mlme_set_linkaddr() - set vdev linkaddr 861 * @vdev: VDEV object 862 * @linkaddr: Link address 863 * 864 * API to set link addr in vdev object 865 * 866 * Caller need to acquire lock with wlan_vdev_obj_lock() 867 * 868 * Return: void 869 */ 870 static inline void wlan_vdev_mlme_set_linkaddr(struct wlan_objmgr_vdev *vdev, 871 uint8_t *linkaddr) 872 { 873 /* This API is invoked with lock acquired, do not add log prints */ 874 qdf_copy_macaddr((struct qdf_mac_addr *)vdev->vdev_mlme.linkaddr, 875 (struct qdf_mac_addr *)linkaddr); 876 } 877 878 /** 879 * wlan_vdev_mlme_get_mataddr() - get mataddr 880 * @vdev: VDEV object 881 * 882 * API to get MAT address from vdev object 883 * 884 * Caller need to acquire lock with wlan_vdev_obj_lock() 885 * 886 * Return: 887 * @mataddr: MAT address 888 */ 889 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev) 890 { 891 /* This API is invoked with lock acquired, do not add log prints */ 892 return vdev->vdev_mlme.mataddr; 893 } 894 895 /** 896 * wlan_vdev_get_id() - get vdev id 897 * @vdev: VDEV object 898 * 899 * API to get vdev id 900 * 901 * Return: 902 * @id: vdev id 903 */ 904 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev) 905 { 906 return vdev->vdev_objmgr.vdev_id; 907 } 908 909 #ifdef WLAN_FEATURE_11BE_MLO 910 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev) 911 { 912 return vdev->vdev_mlme.mlo_link_id; 913 } 914 915 /** 916 * wlan_vdev_set_link_id() - set vdev mlo link id 917 * @vdev: VDEV object 918 * @link_id: link id 919 * 920 * API to set vdev mlo link id 921 * 922 * Return: void 923 */ 924 static inline void wlan_vdev_set_link_id(struct wlan_objmgr_vdev *vdev, 925 uint8_t link_id) 926 { 927 vdev->vdev_mlme.mlo_link_id = link_id; 928 } 929 930 #ifdef WLAN_MLO_USE_SPINLOCK 931 /** 932 * wlan_create_vdev_mlo_lock() - API to create spin lock 933 * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in 934 * vdev MLME ext2 feature caps 935 * @vdev: VDEV object 936 * 937 * Return: void 938 */ 939 static inline 940 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 941 { 942 qdf_spinlock_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 943 } 944 945 /** 946 * wlan_destroy_vdev_mlo_lock() - API to destroy spin lock 947 * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in 948 * vdev MLME ext2 feature caps 949 * @vdev: VDEV object 950 * 951 * Return: void 952 */ 953 static inline 954 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 955 { 956 qdf_spinlock_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 957 } 958 959 /** 960 * wlan_acquire_vdev_mlo_lock() - API to acquire spin lock 961 * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in 962 * vdev MLME ext2 feature caps 963 * @vdev: VDEV object 964 * 965 * Return: void 966 */ 967 static inline 968 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 969 { 970 qdf_spin_lock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 971 } 972 973 /** 974 * wlan_release_vdev_mlo_lock() - API to release spin lock 975 * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in 976 * vdev MLME ext2 feature caps 977 * @vdev: VDEV object 978 * 979 * Return: void 980 */ 981 static inline 982 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 983 { 984 qdf_spin_unlock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 985 } 986 #else 987 /** 988 * wlan_create_vdev_mlo_lock() - API to create mutex which protects the 989 * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps 990 * @vdev: VDEV object 991 * 992 * Return: void 993 */ 994 static inline 995 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 996 { 997 qdf_mutex_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 998 } 999 1000 /** 1001 * wlan_destroy_vdev_mlo_lock() - API to destroy mutex which protects the 1002 * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps 1003 * @vdev: VDEV object 1004 * 1005 * Return: void 1006 */ 1007 static inline 1008 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1009 { 1010 qdf_mutex_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 1011 } 1012 1013 /** 1014 * wlan_acquire_vdev_mlo_lock() - API to acquire mutex which protects the 1015 * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps 1016 * @vdev: VDEV object 1017 * 1018 * Return: void 1019 */ 1020 static inline 1021 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1022 { 1023 qdf_mutex_acquire(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 1024 } 1025 1026 /** 1027 * wlan_release_vdev_mlo_lock() - API to release mutex which protects the 1028 * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps 1029 * @vdev: VDEV object 1030 * 1031 * Return: void 1032 */ 1033 static inline 1034 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1035 { 1036 qdf_mutex_release(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 1037 } 1038 #endif /* WLAN_MLO_USE_SPINLOCK */ 1039 #else 1040 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev) 1041 { 1042 return WLAN_INVALID_LINK_ID; 1043 } 1044 1045 static inline 1046 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1047 { 1048 } 1049 1050 static inline 1051 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1052 { 1053 } 1054 #endif 1055 1056 /** 1057 * wlan_vdev_get_hw_macaddr() - get hw macaddr 1058 * @vdev: VDEV object 1059 * 1060 * API to retrieve the HW MAC address from PDEV 1061 * 1062 * Caller need to acquire lock with wlan_vdev_obj_lock() 1063 * 1064 * Return: 1065 * @macaddr: HW MAC address 1066 */ 1067 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev) 1068 { 1069 struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev); 1070 1071 /* This API is invoked with lock acquired, do not add log prints */ 1072 if (pdev) 1073 return wlan_pdev_get_hw_macaddr(pdev); 1074 else 1075 return NULL; 1076 } 1077 1078 /** 1079 * wlan_vdev_obj_lock() - Acquire VDEV spinlock 1080 * @vdev: VDEV object 1081 * 1082 * API to acquire VDEV lock 1083 * Parent lock should not be taken in child lock context 1084 * but child lock can be taken in parent lock context 1085 * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) 1086 * 1087 * Return: void 1088 */ 1089 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev) 1090 { 1091 qdf_spin_lock_bh(&vdev->vdev_lock); 1092 } 1093 1094 /** 1095 * wlan_vdev_obj_unlock() - Release VDEV spinlock 1096 * @vdev: VDEV object 1097 * 1098 * API to Release VDEV lock 1099 * 1100 * Return: void 1101 */ 1102 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev) 1103 { 1104 qdf_spin_unlock_bh(&vdev->vdev_lock); 1105 } 1106 1107 /** 1108 * wlan_vdev_mlme_set_bss_chan() - set bss chan 1109 * @vdev: VDEV object 1110 * @bss_chan: Channel 1111 * 1112 * API to set the BSS channel 1113 * 1114 * Return: void 1115 */ 1116 static inline void wlan_vdev_mlme_set_bss_chan( 1117 struct wlan_objmgr_vdev *vdev, 1118 struct wlan_channel *bss_chan) 1119 { 1120 vdev->vdev_mlme.bss_chan = bss_chan; 1121 } 1122 1123 /** 1124 * wlan_vdev_mlme_get_bss_chan() - get bss chan 1125 * @vdev: VDEV object 1126 * 1127 * API to get the BSS channel 1128 * 1129 * Return: 1130 * @bss_chan: Channel 1131 */ 1132 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan( 1133 struct wlan_objmgr_vdev *vdev) 1134 { 1135 return vdev->vdev_mlme.bss_chan; 1136 } 1137 1138 /** 1139 * wlan_vdev_mlme_set_des_chan() - set desired chan 1140 * @vdev: VDEV object 1141 * @des_chan: Channel configured by user 1142 * 1143 * API to set the desired channel 1144 * 1145 * Return: void 1146 */ 1147 static inline void wlan_vdev_mlme_set_des_chan( 1148 struct wlan_objmgr_vdev *vdev, 1149 struct wlan_channel *des_chan) 1150 { 1151 vdev->vdev_mlme.des_chan = des_chan; 1152 } 1153 1154 /** 1155 * wlan_vdev_mlme_get_des_chan() - get desired chan 1156 * @vdev: VDEV object 1157 * 1158 * API to get the desired channel 1159 * 1160 * Return: 1161 * @des_chan: Channel configured by user 1162 */ 1163 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan( 1164 struct wlan_objmgr_vdev *vdev) 1165 { 1166 return vdev->vdev_mlme.des_chan; 1167 } 1168 1169 /** 1170 * wlan_vdev_mlme_feat_cap_set() - set feature caps 1171 * @vdev: VDEV object 1172 * @cap: capabilities to be set 1173 * 1174 * API to set MLME feature capabilities 1175 * 1176 * Return: void 1177 */ 1178 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev, 1179 uint32_t cap) 1180 { 1181 vdev->vdev_mlme.vdev_feat_caps |= cap; 1182 } 1183 1184 /** 1185 * wlan_vdev_mlme_feat_cap_clear() - clear feature caps 1186 * @vdev: VDEV object 1187 * @cap: capabilities to be cleared 1188 * 1189 * API to clear MLME feature capabilities 1190 * 1191 * Return: void 1192 */ 1193 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev, 1194 uint32_t cap) 1195 { 1196 vdev->vdev_mlme.vdev_feat_caps &= ~cap; 1197 } 1198 1199 /** 1200 * wlan_vdev_mlme_feat_cap_get() - get feature caps 1201 * @vdev: VDEV object 1202 * @cap: capabilities to be checked 1203 * 1204 * API to know MLME feature capability is set or not 1205 * 1206 * Return: 1 -- if capabilities set 1207 * 0 -- if capabilities clear 1208 */ 1209 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev, 1210 uint32_t cap) 1211 { 1212 return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0; 1213 } 1214 1215 /** 1216 * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps 1217 * @vdev: VDEV object 1218 * @cap: capabilities to be set 1219 * 1220 * API to set the MLME extensive feature capabilities 1221 * 1222 * Return: void 1223 */ 1224 static inline void wlan_vdev_mlme_feat_ext_cap_set( 1225 struct wlan_objmgr_vdev *vdev, 1226 uint32_t cap) 1227 { 1228 vdev->vdev_mlme.vdev_feat_ext_caps |= cap; 1229 } 1230 1231 /** 1232 * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps 1233 * @vdev: VDEV object 1234 * @cap: capabilities to be cleared 1235 * 1236 * API to clear the MLME extensive feature capabilities 1237 * 1238 * Return: void 1239 */ 1240 static inline void wlan_vdev_mlme_feat_ext_cap_clear( 1241 struct wlan_objmgr_vdev *vdev, 1242 uint32_t cap) 1243 { 1244 vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap; 1245 } 1246 1247 /** 1248 * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps 1249 * @vdev: VDEV object 1250 * @cap: capabilities to be checked 1251 * 1252 * API to know MLME ext feature capability is set or not 1253 * 1254 * Return: 1 -- if capabilities set 1255 * 0 -- if capabilities clear 1256 */ 1257 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get( 1258 struct wlan_objmgr_vdev *vdev, 1259 uint32_t cap) 1260 { 1261 return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0; 1262 } 1263 1264 /** 1265 * wlan_vdev_mlme_feat_ext2_cap_set() - set ext2 feature caps 1266 * @vdev: VDEV object 1267 * @cap: capabilities to be set 1268 * 1269 * API to set the MLME more extensive feature capabilities 1270 * 1271 * Return: void 1272 */ 1273 static inline void wlan_vdev_mlme_feat_ext2_cap_set( 1274 struct wlan_objmgr_vdev *vdev, 1275 uint32_t cap) 1276 { 1277 vdev->vdev_mlme.vdev_feat_ext2_caps |= cap; 1278 } 1279 1280 /** 1281 * wlan_vdev_mlme_feat_ext2_cap_clear() - clear ext2 feature caps 1282 * @vdev: VDEV object 1283 * @cap: capabilities to be cleared 1284 * 1285 * API to clear the MLME more extensive feature capabilities 1286 * 1287 * Return: void 1288 */ 1289 static inline void wlan_vdev_mlme_feat_ext2_cap_clear( 1290 struct wlan_objmgr_vdev *vdev, 1291 uint32_t cap) 1292 { 1293 vdev->vdev_mlme.vdev_feat_ext2_caps &= ~cap; 1294 } 1295 1296 /** 1297 * wlan_vdev_mlme_feat_ext2_cap_get() - get feature ext2 caps 1298 * @vdev: VDEV object 1299 * @cap: capabilities to be checked 1300 * 1301 * API to know MLME more ext feature capability is set or not 1302 * 1303 * Return: 1 -- if capabilities set 1304 * 0 -- if capabilities clear 1305 */ 1306 static inline uint8_t wlan_vdev_mlme_feat_ext2_cap_get( 1307 struct wlan_objmgr_vdev *vdev, 1308 uint32_t cap) 1309 { 1310 return (vdev->vdev_mlme.vdev_feat_ext2_caps & cap) ? 1 : 0; 1311 } 1312 1313 /** 1314 * wlan_vdev_mlme_op_flags_set() - set vdev op flag 1315 * @vdev: VDEV object 1316 * @flag: vdev op flag to be set 1317 * 1318 * API to set the MLME VDEV OP flag 1319 * 1320 * Return: void 1321 */ 1322 static inline void wlan_vdev_mlme_op_flags_set( 1323 struct wlan_objmgr_vdev *vdev, 1324 uint32_t flag) 1325 { 1326 vdev->vdev_mlme.vdev_op_flags |= flag; 1327 } 1328 1329 /** 1330 * wlan_vdev_mlme_op_flags_clear() - clear vdev op flag 1331 * @vdev: VDEV object 1332 * @flag: vdev op flag to be cleared 1333 * 1334 * API to clear the MLME VDEV OP flag 1335 * 1336 * Return: void 1337 */ 1338 static inline void wlan_vdev_mlme_op_flags_clear( 1339 struct wlan_objmgr_vdev *vdev, 1340 uint32_t flag) 1341 { 1342 vdev->vdev_mlme.vdev_op_flags &= ~flag; 1343 } 1344 1345 /** 1346 * wlan_vdev_mlme_op_flags_get() - get vdev op flag 1347 * @vdev: VDEV object 1348 * @flag: vdev op flags to be checked 1349 * 1350 * API to know MLME VDEV OP flag is set or not 1351 * 1352 * Return: 1 -- if flag is set 1353 * 0 -- if flag is clear 1354 */ 1355 static inline uint8_t wlan_vdev_mlme_op_flags_get( 1356 struct wlan_objmgr_vdev *vdev, 1357 uint32_t flag) 1358 { 1359 return (vdev->vdev_mlme.vdev_op_flags & flag) ? 1 : 0; 1360 } 1361 1362 /** 1363 * wlan_vdev_mlme_cap_set() - mlme caps set 1364 * @vdev: VDEV object 1365 * @cap: capabilities to be set 1366 * 1367 * API to set the MLME capabilities 1368 * 1369 * Return: void 1370 */ 1371 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev, 1372 uint32_t cap) 1373 { 1374 vdev->vdev_mlme.vdev_caps |= cap; 1375 } 1376 1377 /** 1378 * wlan_vdev_mlme_cap_clear() - mlme caps clear 1379 * @vdev: VDEV object 1380 * @cap: capabilities to be cleared 1381 * 1382 * API to clear the MLME capabilities 1383 * 1384 * Return: void 1385 */ 1386 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev, 1387 uint32_t cap) 1388 { 1389 vdev->vdev_mlme.vdev_caps &= ~cap; 1390 } 1391 1392 /** 1393 * wlan_vdev_mlme_cap_get() - get mlme caps 1394 * @vdev: VDEV object 1395 * @cap: capabilities to be checked 1396 * 1397 * API to know MLME capability is set or not 1398 * 1399 * Return: 1 -- if capabilities set 1400 * 0 -- if capabilities clear 1401 */ 1402 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev, 1403 uint32_t cap) 1404 { 1405 return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0; 1406 } 1407 1408 /** 1409 * wlan_vdev_mlme_get_state() - get mlme state 1410 * @vdev: VDEV object 1411 * 1412 * API to get MLME state 1413 * 1414 * Return: state of MLME 1415 */ 1416 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state( 1417 struct wlan_objmgr_vdev *vdev) 1418 { 1419 return vdev->vdev_mlme.mlme_state; 1420 } 1421 1422 /** 1423 * wlan_vdev_mlme_get_substate() - get mlme substate 1424 * @vdev: VDEV object 1425 * 1426 * API to get VDEV MLME substate 1427 * 1428 * Return: substate of VDEV MLME 1429 */ 1430 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate( 1431 struct wlan_objmgr_vdev *vdev) 1432 { 1433 return vdev->vdev_mlme.mlme_substate; 1434 } 1435 1436 /** 1437 * wlan_vdev_set_selfpeer() - set self peer 1438 * @vdev: VDEV object 1439 * @peer: peer pointer 1440 * 1441 * API to set the self peer of VDEV 1442 * 1443 * Return: void 1444 */ 1445 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev, 1446 struct wlan_objmgr_peer *peer) 1447 { 1448 vdev->vdev_objmgr.self_peer = peer; 1449 } 1450 1451 /** 1452 * wlan_vdev_get_selfpeer() - get self peer 1453 * @vdev: VDEV object 1454 * 1455 * API to get the self peer of VDEV 1456 * 1457 * Return: 1458 * @peer: peer pointer 1459 */ 1460 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer( 1461 struct wlan_objmgr_vdev *vdev) 1462 { 1463 return vdev->vdev_objmgr.self_peer; 1464 } 1465 1466 /** 1467 * wlan_vdev_set_bsspeer() - set bss peer 1468 * @vdev: VDEV object 1469 * @peer: BSS peer pointer 1470 * 1471 * API to set the BSS peer of VDEV 1472 * 1473 * Return: void 1474 */ 1475 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev, 1476 struct wlan_objmgr_peer *peer) 1477 { 1478 vdev->vdev_objmgr.bss_peer = peer; 1479 } 1480 1481 /** 1482 * wlan_vdev_get_bsspeer() - get bss peer 1483 * @vdev: VDEV object 1484 * 1485 * API to get the BSS peer of VDEV, wlan_objmgr_vdev_try_get_bsspeer API 1486 * preferred to use outside obj manager to take and handle ref count of 1487 * bss_peer with ref debug ID. 1488 * 1489 * Return: 1490 * @peer: BSS peer pointer 1491 */ 1492 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer( 1493 struct wlan_objmgr_vdev *vdev) 1494 { 1495 return vdev->vdev_objmgr.bss_peer; 1496 } 1497 1498 /** 1499 * wlan_objmgr_vdev_find_peer_by_mac() - get a peer with given mac from vdev 1500 * @vdev: VDEV object 1501 * @peer_mac: mac address of the peer to be found 1502 * @dbg_id: dbg_id of the module 1503 * 1504 * API to get and increment ref count of BSS peer of VDEV 1505 * 1506 * Return: 1507 * @peer: peer pointer to the peer of the mac address 1508 */ 1509 struct wlan_objmgr_peer * 1510 wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev, 1511 uint8_t *peer_mac, 1512 wlan_objmgr_ref_dbgid dbg_id); 1513 1514 /** 1515 * wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer 1516 * of VDEV 1517 * @vdev: VDEV object 1518 * @id: Object Manager ref debug id 1519 * 1520 * API to get and increment ref count of BSS peer of VDEV 1521 * 1522 * Return: 1523 * @peer: BSS peer pointer if bss peer is present and valid else NULL 1524 */ 1525 struct wlan_objmgr_peer *wlan_objmgr_vdev_try_get_bsspeer( 1526 struct wlan_objmgr_vdev *vdev, 1527 wlan_objmgr_ref_dbgid id); 1528 /** 1529 * wlan_vdev_get_ospriv() - get os priv pointer 1530 * @vdev: VDEV object 1531 * 1532 * API to get OS private pointer from VDEV 1533 * 1534 * Return: ospriv - private pointer 1535 */ 1536 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv( 1537 struct wlan_objmgr_vdev *vdev) 1538 { 1539 return vdev->vdev_nif.osdev; 1540 } 1541 1542 /** 1543 * wlan_vdev_reset_ospriv() - reset os priv pointer 1544 * @vdev: VDEV object 1545 * 1546 * API to reset OS private pointer in VDEV 1547 * 1548 * Return: void 1549 */ 1550 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev) 1551 { 1552 vdev->vdev_nif.osdev = NULL; 1553 } 1554 1555 /** 1556 * wlan_vdev_get_peer_count() - get vdev peer count 1557 * @vdev: VDEV object 1558 * 1559 * API to get peer count from VDEV 1560 * 1561 * Return: peer_count - vdev's peer count 1562 */ 1563 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev) 1564 { 1565 return vdev->vdev_objmgr.wlan_peer_count; 1566 } 1567 1568 #ifdef WLAN_FEATURE_11BE_MLO 1569 /** 1570 * wlan_vdev_mlme_is_mlo_vdev() - Determine whether the given vdev is an MLO 1571 * vdev or not 1572 * @vdev: VDEV object 1573 * 1574 * Return: True if it is MLO, otherwise false. 1575 */ 1576 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev); 1577 1578 /** 1579 * wlan_vdev_mlme_is_mlo_ap() - whether it is mlo ap or not 1580 * @vdev: VDEV object 1581 * 1582 * Return: True if it is mlo ap, otherwise false. 1583 */ 1584 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev) 1585 { 1586 return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) && 1587 wlan_vdev_mlme_is_mlo_vdev(vdev); 1588 } 1589 1590 /** 1591 * wlan_vdev_mlme_set_mlo_vdev() - Set vdev as an MLO vdev 1592 * @vdev: VDEV object 1593 * 1594 * Return: void 1595 */ 1596 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev); 1597 1598 /** 1599 * wlan_vdev_mlme_clear_mlo_vdev() - Mark that the vdev is no longer an MLO vdev 1600 * @vdev: VDEV object 1601 * 1602 * Return: void 1603 */ 1604 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev); 1605 1606 /** 1607 * wlan_vdev_mlme_set_mlo_link_vdev() - Set vdev as an MLO link vdev 1608 * @vdev: VDEV object 1609 * 1610 * Return: void 1611 */ 1612 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev); 1613 1614 /** 1615 * wlan_vdev_mlme_clear_mlo_link_vdev() - Mark that the vdev is no longer an 1616 * MLO link vdev 1617 * @vdev: VDEV object 1618 * 1619 * Return: void 1620 */ 1621 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev); 1622 #ifdef WLAN_MCAST_MLO 1623 /** 1624 * wlan_vdev_mlme_is_mlo_mcast_vdev() - whether it is mlo mcast vdev or not 1625 * @vdev: VDEV object 1626 * 1627 * Return: True if it is mlo mcast vdev, otherwise false. 1628 */ 1629 static inline 1630 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev) 1631 { 1632 return wlan_vdev_mlme_feat_ext2_cap_get(vdev, 1633 WLAN_VDEV_FEXT2_MLO_MCAST); 1634 } 1635 #else 1636 static inline 1637 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev) 1638 { 1639 return false; 1640 } 1641 #endif 1642 1643 /** 1644 * wlan_vdev_mlme_is_mlo_link_vdev() - whether it is mlo sta link vdev or not 1645 * @vdev: VDEV object 1646 * 1647 * Return: True if it is mlo sta link, otherwise false. 1648 */ 1649 static inline 1650 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev) 1651 { 1652 return wlan_vdev_mlme_feat_ext2_cap_get(vdev, 1653 WLAN_VDEV_FEXT2_MLO_STA_LINK); 1654 } 1655 1656 /** 1657 * wlan_vdev_mlme_is_assoc_sta_vdev() - whether it is mlo sta assoc vdev or not 1658 * @vdev: VDEV object 1659 * 1660 * Return: True if it is mlo sta assoc vdev, otherwise false. 1661 */ 1662 static inline 1663 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev) 1664 { 1665 if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) || 1666 !wlan_vdev_mlme_is_mlo_vdev(vdev)) 1667 return false; 1668 1669 if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev)) 1670 return true; 1671 1672 return false; 1673 } 1674 1675 /** 1676 * wlan_vdev_mlme_is_link_sta_vdev() - whether it is mlo sta link vdev or not 1677 * @vdev: VDEV object 1678 * 1679 * Return: True if it is mlo sta link vdev, otherwise false. 1680 */ 1681 static inline 1682 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev) 1683 { 1684 if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) || 1685 !wlan_vdev_mlme_is_mlo_vdev(vdev)) 1686 return false; 1687 1688 if (wlan_vdev_mlme_is_mlo_link_vdev(vdev)) 1689 return true; 1690 1691 return false; 1692 } 1693 #else 1694 static inline 1695 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev) 1696 { 1697 return false; 1698 } 1699 1700 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev) 1701 { 1702 return false; 1703 } 1704 1705 static inline 1706 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev) 1707 { 1708 } 1709 1710 static inline 1711 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev) 1712 { 1713 } 1714 1715 static inline 1716 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev) 1717 { 1718 } 1719 1720 static inline 1721 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev) 1722 { 1723 } 1724 1725 static inline 1726 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev) 1727 { 1728 return false; 1729 } 1730 1731 static inline 1732 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev) 1733 { 1734 return false; 1735 } 1736 1737 static inline 1738 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev) 1739 { 1740 return false; 1741 } 1742 #endif 1743 1744 /** 1745 * DOC: Examples to use VDEV ref count APIs 1746 * 1747 * In all the scenarios, the pair of API should be followed 1748 * other it lead to memory leak 1749 * 1750 * scenario 1: 1751 * 1752 * wlan_objmgr_vdev_obj_create() 1753 * ---- 1754 * wlan_objmgr_vdev_obj_delete() 1755 * 1756 * scenario 2: 1757 * 1758 * wlan_objmgr_vdev_get_ref() 1759 * ---- 1760 * the operations which are done on 1761 * vdev object 1762 * ---- 1763 * wlan_objmgr_vdev_release_ref() 1764 * 1765 * scenario 3: 1766 * 1767 * API to retrieve vdev (xxx_get_vdev_xxx()) 1768 * ---- 1769 * the operations which are done on 1770 * vdev object 1771 * ---- 1772 * wlan_objmgr_vdev_release_ref() 1773 */ 1774 1775 /** 1776 * wlan_objmgr_vdev_get_ref() - increment ref count 1777 * @vdev: VDEV object 1778 * @id: Object Manager ref debug id 1779 * 1780 * API to increment ref count of vdev 1781 * 1782 * Return: void 1783 */ 1784 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1785 void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev, 1786 wlan_objmgr_ref_dbgid id, 1787 const char *func, int line); 1788 1789 #define wlan_objmgr_vdev_get_ref(vdev, dbgid) \ 1790 wlan_objmgr_vdev_get_ref_debug(vdev, dbgid, __func__, __LINE__) 1791 #else 1792 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, 1793 wlan_objmgr_ref_dbgid id); 1794 #endif 1795 1796 /** 1797 * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed 1798 * @vdev: VDEV object 1799 * @id: Object Manager ref debug id 1800 * 1801 * API to increment ref count of vdev after checking valid object state 1802 * 1803 * Return: void 1804 */ 1805 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1806 QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev, 1807 wlan_objmgr_ref_dbgid id, 1808 const char *func, int line); 1809 1810 #define wlan_objmgr_vdev_try_get_ref(vdev, dbgid) \ 1811 wlan_objmgr_vdev_try_get_ref_debug(vdev, dbgid, \ 1812 __func__, __LINE__) 1813 #else 1814 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev, 1815 wlan_objmgr_ref_dbgid id); 1816 #endif 1817 1818 /** 1819 * wlan_objmgr_vdev_release_ref() - decrement ref count 1820 * @vdev: VDEV object 1821 * @id: Object Manager ref debug id 1822 * 1823 * API to decrement ref count of vdev, if ref count is 1, it initiates the 1824 * VDEV deletion 1825 * 1826 * Return: void 1827 */ 1828 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1829 void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev, 1830 wlan_objmgr_ref_dbgid id, 1831 const char *func, int line); 1832 1833 #define wlan_objmgr_vdev_release_ref(vdev, dbgid)\ 1834 wlan_objmgr_vdev_release_ref_debug(vdev, dbgid, \ 1835 __func__, __LINE__) 1836 #else 1837 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev, 1838 wlan_objmgr_ref_dbgid id); 1839 #endif 1840 1841 /** 1842 * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev 1843 * @pdev: PDEV object 1844 * @vdev_list: qdf_list_t 1845 * @vdev: VDEV object 1846 * @dbg_id: id of the caller 1847 * 1848 * API to get next active vdev object pointer of vdev 1849 * 1850 * Return: 1851 * @vdev_next: VDEV object 1852 */ 1853 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1854 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug( 1855 struct wlan_objmgr_pdev *pdev, 1856 qdf_list_t *vdev_list, 1857 struct wlan_objmgr_vdev *vdev, 1858 wlan_objmgr_ref_dbgid dbg_id, 1859 const char *func, int line); 1860 1861 #define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbgid) \ 1862 wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \ 1863 vdev, dbgid, __func__, __LINE__) 1864 #else 1865 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( 1866 struct wlan_objmgr_pdev *pdev, 1867 qdf_list_t *vdev_list, 1868 struct wlan_objmgr_vdev *vdev, 1869 wlan_objmgr_ref_dbgid dbg_id); 1870 #endif 1871 1872 /** 1873 * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list 1874 * @pdev: PDEV object 1875 * @dbg_id: id of the caller 1876 * 1877 * API to get the head active vdev of given pdev (of pdev's vdev list) 1878 * 1879 * Return: 1880 */ 1881 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1882 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug( 1883 struct wlan_objmgr_pdev *pdev, 1884 wlan_objmgr_ref_dbgid dbg_id, 1885 const char *func, int line); 1886 1887 #define wlan_pdev_peek_active_first_vdev(pdev, dbgid) \ 1888 wlan_pdev_peek_active_first_vdev_debug(pdev, dbgid, \ 1889 __func__, __LINE__) 1890 #else 1891 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev( 1892 struct wlan_objmgr_pdev *pdev, 1893 wlan_objmgr_ref_dbgid dbg_id); 1894 #endif 1895 1896 /** 1897 * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list 1898 * @vdev: VDEV object 1899 * @vdev_list: qdf_list_t 1900 * @dbg_id: id of the caller 1901 * 1902 * API to get the head active vdev of given vdev (of pdev's vdev list) 1903 * 1904 * Return: 1905 * @peer: head peer 1906 */ 1907 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1908 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug( 1909 struct wlan_objmgr_pdev *pdev, 1910 qdf_list_t *vdev_list, 1911 wlan_objmgr_ref_dbgid dbg_id, 1912 const char *func, int line); 1913 1914 #define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbgid) \ 1915 wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \ 1916 dbgid, __func__, __LINE__) 1917 #else 1918 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( 1919 struct wlan_objmgr_pdev *pdev, 1920 qdf_list_t *vdev_list, 1921 wlan_objmgr_ref_dbgid dbg_id); 1922 #endif 1923 1924 /** 1925 * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed 1926 * @vdev: VDEV object 1927 * 1928 * API to invokes registered callbacks to notify about peer freed 1929 * 1930 * Return: void 1931 */ 1932 void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev); 1933 1934 /** 1935 * wlan_vdev_set_max_peer_count() - set max peer count 1936 * @vdev: VDEV object 1937 * @count: Max peer count 1938 * 1939 * API to set max peer count of VDEV 1940 * 1941 * Return: void 1942 */ 1943 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev, 1944 uint16_t count) 1945 { 1946 vdev->vdev_objmgr.max_peer_count = count; 1947 } 1948 1949 /** 1950 * wlan_vdev_get_max_peer_count() - get max peer count 1951 * @vdev: VDEV object 1952 * 1953 * API to get max peer count of VDEV 1954 * 1955 * Return: max peer count 1956 */ 1957 static inline uint16_t wlan_vdev_get_max_peer_count( 1958 struct wlan_objmgr_vdev *vdev) 1959 { 1960 return vdev->vdev_objmgr.max_peer_count; 1961 } 1962 1963 /** 1964 * wlan_print_vdev_info() - print vdev members 1965 * @vdev: vdev object pointer 1966 * 1967 * Return: void 1968 */ 1969 #ifdef WLAN_OBJMGR_DEBUG 1970 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev); 1971 #else 1972 static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {} 1973 #endif 1974 1975 /** 1976 * wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock 1977 * @vdev: vdev object pointer 1978 * 1979 * Return: void 1980 */ 1981 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1982 static inline void 1983 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev) 1984 { 1985 wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace); 1986 } 1987 #else 1988 static inline void 1989 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev) 1990 { 1991 } 1992 #endif 1993 1994 /** 1995 * wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock 1996 * @vdev: vdev object pointer 1997 * 1998 * Return: void 1999 */ 2000 #ifdef WLAN_OBJMGR_REF_ID_TRACE 2001 static inline void 2002 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev) 2003 { 2004 wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace); 2005 } 2006 #else 2007 static inline void 2008 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev) 2009 { 2010 } 2011 #endif 2012 2013 /** 2014 * wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list 2015 * @vdev: vdev object pointer 2016 * 2017 * Return: void 2018 */ 2019 #ifdef WLAN_OBJMGR_REF_ID_TRACE 2020 static inline void 2021 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev) 2022 { 2023 wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace); 2024 } 2025 #else 2026 static inline void 2027 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev) 2028 { 2029 } 2030 #endif 2031 2032 /** 2033 * wlan_vdev_get_bss_peer_mac() - to get bss peer mac address 2034 * @vdev: pointer to vdev 2035 * @bss_peer_mac: pointer to bss_peer_mac_address 2036 * 2037 * This API is used to get mac address of peer. 2038 * 2039 * Context: Any context. 2040 * 2041 * Return: QDF_STATUS based on overall success 2042 */ 2043 QDF_STATUS wlan_vdev_get_bss_peer_mac(struct wlan_objmgr_vdev *vdev, 2044 struct qdf_mac_addr *bss_peer_mac); 2045 2046 #ifdef WLAN_FEATURE_11BE_MLO 2047 /** 2048 * wlan_vdev_get_bss_peer_mld_mac() - to get bss peer mld mac address 2049 * @vdev: pointer to vdev 2050 * @mld_mac: pointer to mld mac address 2051 * 2052 * This API is used to get mld mac address of peer. 2053 * 2054 * Context: Any context. 2055 * 2056 * Return: QDF_STATUS based on overall success 2057 */ 2058 QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev, 2059 struct qdf_mac_addr *mld_mac); 2060 #endif 2061 2062 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/ 2063