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