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