1 /* 2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 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_substate: 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 * @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 /* 509 * APIs to operations on vdev objects 510 */ 511 512 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev, 513 void *object, 514 void *arg); 515 516 /** 517 * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list 518 * @vdev: vdev object 519 * @handler: the handler will be called for each object of requested type 520 * the handler should be implemented to perform required operation 521 * @arg: arguments passed by caller 522 * @dbg_id: id of the caller 523 * 524 * API to be used for performing the operations on all PEER objects 525 * of vdev 526 * 527 * Return: SUCCESS/FAILURE 528 */ 529 QDF_STATUS wlan_objmgr_iterate_peerobj_list( 530 struct wlan_objmgr_vdev *vdev, 531 wlan_objmgr_vdev_op_handler handler, 532 void *arg, wlan_objmgr_ref_dbgid dbg_id); 533 534 /** 535 * wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list 536 * @vdev: vdev object 537 * @dbg_id: id of the caller 538 * 539 * API to be used for populating the list of logically deleted peers from the 540 * vdev's peer list 541 * 542 * The caller of this function should free the memory allocated for the 543 * peerlist and the peer member in the list 544 * Also the peer ref release is handled by the caller 545 * 546 * Return: list of peer pointers 547 * NULL on FAILURE 548 */ 549 qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list( 550 struct wlan_objmgr_vdev *vdev, 551 wlan_objmgr_ref_dbgid dbg_id); 552 553 /** 554 * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev 555 * comp object creation 556 * @vdev: VDEV object 557 * @id: Component id 558 * 559 * API to create component private object in run time, this would 560 * be used for features which gets enabled in run time 561 * 562 * Return: SUCCESS on successful creation 563 * On FAILURE (appropriate failure codes are returned) 564 */ 565 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation( 566 struct wlan_objmgr_vdev *vdev, 567 enum wlan_umac_comp_id id); 568 569 /** 570 * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp 571 * object deletion 572 * @vdev: VDEV object 573 * @id: Component id 574 * 575 * API to destroy component private object in run time, this would 576 * be used for features which gets disabled in run time 577 * 578 * Return: SUCCESS on successful deletion 579 * On FAILURE (appropriate failure codes are returned) 580 */ 581 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion( 582 struct wlan_objmgr_vdev *vdev, 583 enum wlan_umac_comp_id id); 584 585 /** 586 * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object 587 * @vdev: VDEV object 588 * @id: Component id 589 * 590 * API to get component private object 591 * 592 * Return: void *ptr on SUCCESS 593 * NULL on Failure 594 */ 595 void *wlan_objmgr_vdev_get_comp_private_obj( 596 struct wlan_objmgr_vdev *vdev, 597 enum wlan_umac_comp_id id); 598 599 /* Util APIs */ 600 601 /** 602 * wlan_vdev_get_pdev() - get pdev 603 * @vdev: VDEV object 604 * 605 * API to get pdev object pointer from vdev 606 * 607 * Return: pdev object pointer 608 */ 609 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev( 610 struct wlan_objmgr_vdev *vdev) 611 { 612 return vdev->vdev_objmgr.wlan_pdev; 613 } 614 615 /** 616 * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list 617 * @vdev_list: qdf_list_t 618 * 619 * API to get the head vdev of given vdev (of pdev's vdev list) 620 * 621 * Caller need to acquire lock with wlan_vdev_obj_lock() 622 * 623 * Return: 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_list: qdf_list_t 643 * @vdev: VDEV object 644 * 645 * API to get next vdev object pointer of vdev 646 * 647 * Caller need to acquire lock with wlan_vdev_obj_lock() 648 * 649 * Return: 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 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: VDEV op mode 754 */ 755 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode( 756 struct wlan_objmgr_vdev *vdev) 757 { 758 return vdev->vdev_mlme.vdev_opmode; 759 } 760 761 /** 762 * wlan_vdev_mlme_set_macaddr() - set vdev macaddr 763 * @vdev: VDEV object 764 * @macaddr: MAC address 765 * 766 * API to set macaddr in vdev object 767 * 768 * Caller need to acquire lock with wlan_vdev_obj_lock() 769 * 770 * Return: void 771 */ 772 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev, 773 uint8_t *macaddr) 774 { 775 /* This API is invoked with lock acquired, do not add log prints */ 776 WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr); 777 } 778 779 /** 780 * wlan_vdev_mlme_get_macaddr() - get vdev macaddr 781 * @vdev: VDEV object 782 * 783 * API to get MAC address from vdev object 784 * 785 * Caller need to acquire lock with wlan_vdev_obj_lock() 786 * 787 * Return: MAC address 788 */ 789 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev) 790 { 791 /* This API is invoked with lock acquired, do not add log prints */ 792 return vdev->vdev_mlme.macaddr; 793 } 794 795 /** 796 * wlan_vdev_mlme_set_mataddr() - set vdev mataddr 797 * @vdev: VDEV object 798 * @mataddr: MAT address 799 * 800 * API to set mataddr in vdev object 801 * 802 * Caller need to acquire lock with wlan_vdev_obj_lock() 803 * 804 * Return: void 805 */ 806 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev, 807 uint8_t *mataddr) 808 { 809 /* This API is invoked with lock acquired, do not add log prints */ 810 WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr); 811 } 812 813 /** 814 * wlan_vdev_mlme_get_mldaddr() - get vdev mldaddr 815 * @vdev: VDEV object 816 * 817 * API to get MLD address from vdev object 818 * 819 * Caller need to acquire lock with wlan_vdev_obj_lock() 820 * 821 * Return: MAC address 822 */ 823 static inline uint8_t *wlan_vdev_mlme_get_mldaddr(struct wlan_objmgr_vdev *vdev) 824 { 825 /* This API is invoked with lock acquired, do not add log prints */ 826 return vdev->vdev_mlme.mldaddr; 827 } 828 829 /** 830 * wlan_vdev_mlme_set_mldaddr() - set vdev mldaddr 831 * @vdev: VDEV object 832 * @mldaddr: MLD address 833 * 834 * API to set MLD addr in vdev object 835 * 836 * Caller need to acquire lock with wlan_vdev_obj_lock() 837 * 838 * Return: void 839 */ 840 static inline void wlan_vdev_mlme_set_mldaddr(struct wlan_objmgr_vdev *vdev, 841 uint8_t *mldaddr) 842 { 843 /* This API is invoked with lock acquired, do not add log prints */ 844 WLAN_ADDR_COPY(vdev->vdev_mlme.mldaddr, mldaddr); 845 } 846 847 /** 848 * wlan_vdev_mlme_get_linkaddr() - get vdev linkaddr 849 * @vdev: VDEV object 850 * 851 * API to get link MAC address from vdev object 852 * 853 * Caller need to acquire lock with wlan_vdev_obj_lock() 854 * 855 * Return: Link MAC address 856 */ 857 static inline 858 uint8_t *wlan_vdev_mlme_get_linkaddr(struct wlan_objmgr_vdev *vdev) 859 { 860 /* This API is invoked with lock acquired, do not add log prints */ 861 return vdev->vdev_mlme.linkaddr; 862 } 863 864 /** 865 * wlan_vdev_mlme_set_linkaddr() - set vdev linkaddr 866 * @vdev: VDEV object 867 * @linkaddr: Link address 868 * 869 * API to set link addr in vdev object 870 * 871 * Caller need to acquire lock with wlan_vdev_obj_lock() 872 * 873 * Return: void 874 */ 875 static inline void wlan_vdev_mlme_set_linkaddr(struct wlan_objmgr_vdev *vdev, 876 uint8_t *linkaddr) 877 { 878 /* This API is invoked with lock acquired, do not add log prints */ 879 qdf_copy_macaddr((struct qdf_mac_addr *)vdev->vdev_mlme.linkaddr, 880 (struct qdf_mac_addr *)linkaddr); 881 } 882 883 /** 884 * wlan_vdev_mlme_get_mataddr() - get mataddr 885 * @vdev: VDEV object 886 * 887 * API to get MAT address from vdev object 888 * 889 * Caller need to acquire lock with wlan_vdev_obj_lock() 890 * 891 * Return: MAT address 892 */ 893 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev) 894 { 895 /* This API is invoked with lock acquired, do not add log prints */ 896 return vdev->vdev_mlme.mataddr; 897 } 898 899 /** 900 * wlan_vdev_get_id() - get vdev id 901 * @vdev: VDEV object 902 * 903 * API to get vdev id 904 * 905 * Return: vdev id 906 */ 907 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev) 908 { 909 return vdev->vdev_objmgr.vdev_id; 910 } 911 912 #ifdef WLAN_FEATURE_11BE_MLO 913 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev) 914 { 915 return vdev->vdev_mlme.mlo_link_id; 916 } 917 918 /** 919 * wlan_vdev_set_link_id() - set vdev mlo link id 920 * @vdev: VDEV object 921 * @link_id: link id 922 * 923 * API to set vdev mlo link id 924 * 925 * Return: void 926 */ 927 static inline void wlan_vdev_set_link_id(struct wlan_objmgr_vdev *vdev, 928 uint8_t link_id) 929 { 930 vdev->vdev_mlme.mlo_link_id = link_id; 931 } 932 933 #ifdef WLAN_MLO_USE_SPINLOCK 934 /** 935 * wlan_create_vdev_mlo_lock() - API to create spin lock 936 * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in 937 * vdev MLME ext2 feature caps 938 * @vdev: VDEV object 939 * 940 * Return: void 941 */ 942 static inline 943 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 944 { 945 qdf_spinlock_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 946 } 947 948 /** 949 * wlan_destroy_vdev_mlo_lock() - API to destroy spin lock 950 * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in 951 * vdev MLME ext2 feature caps 952 * @vdev: VDEV object 953 * 954 * Return: void 955 */ 956 static inline 957 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 958 { 959 qdf_spinlock_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 960 } 961 962 /** 963 * wlan_acquire_vdev_mlo_lock() - API to acquire spin lock 964 * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in 965 * vdev MLME ext2 feature caps 966 * @vdev: VDEV object 967 * 968 * Return: void 969 */ 970 static inline 971 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 972 { 973 qdf_spin_lock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 974 } 975 976 /** 977 * wlan_release_vdev_mlo_lock() - API to release spin lock 978 * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in 979 * vdev MLME ext2 feature caps 980 * @vdev: VDEV object 981 * 982 * Return: void 983 */ 984 static inline 985 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 986 { 987 qdf_spin_unlock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 988 } 989 #else 990 /** 991 * wlan_create_vdev_mlo_lock() - API to create mutex which protects the 992 * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps 993 * @vdev: VDEV object 994 * 995 * Return: void 996 */ 997 static inline 998 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 999 { 1000 qdf_mutex_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 1001 } 1002 1003 /** 1004 * wlan_destroy_vdev_mlo_lock() - API to destroy mutex which protects the 1005 * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps 1006 * @vdev: VDEV object 1007 * 1008 * Return: void 1009 */ 1010 static inline 1011 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1012 { 1013 qdf_mutex_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 1014 } 1015 1016 /** 1017 * wlan_acquire_vdev_mlo_lock() - API to acquire mutex which protects the 1018 * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps 1019 * @vdev: VDEV object 1020 * 1021 * Return: void 1022 */ 1023 static inline 1024 void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1025 { 1026 qdf_mutex_acquire(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 1027 } 1028 1029 /** 1030 * wlan_release_vdev_mlo_lock() - API to release mutex which protects the 1031 * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps 1032 * @vdev: VDEV object 1033 * 1034 * Return: void 1035 */ 1036 static inline 1037 void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1038 { 1039 qdf_mutex_release(&vdev->vdev_mlme.wlan_vdev_mlo_lock); 1040 } 1041 #endif /* WLAN_MLO_USE_SPINLOCK */ 1042 #else 1043 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev) 1044 { 1045 return WLAN_INVALID_LINK_ID; 1046 } 1047 1048 static inline 1049 void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1050 { 1051 } 1052 1053 static inline 1054 void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev) 1055 { 1056 } 1057 #endif 1058 1059 /** 1060 * wlan_vdev_get_hw_macaddr() - get hw macaddr 1061 * @vdev: VDEV object 1062 * 1063 * API to retrieve the HW MAC address from PDEV 1064 * 1065 * Caller need to acquire lock with wlan_vdev_obj_lock() 1066 * 1067 * Return: HW MAC address 1068 */ 1069 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev) 1070 { 1071 struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev); 1072 1073 /* This API is invoked with lock acquired, do not add log prints */ 1074 if (pdev) 1075 return wlan_pdev_get_hw_macaddr(pdev); 1076 else 1077 return NULL; 1078 } 1079 1080 /** 1081 * wlan_vdev_obj_lock() - Acquire VDEV spinlock 1082 * @vdev: VDEV object 1083 * 1084 * API to acquire VDEV lock 1085 * Parent lock should not be taken in child lock context 1086 * but child lock can be taken in parent lock context 1087 * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) 1088 * 1089 * Return: void 1090 */ 1091 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev) 1092 { 1093 qdf_spin_lock_bh(&vdev->vdev_lock); 1094 } 1095 1096 /** 1097 * wlan_vdev_obj_unlock() - Release VDEV spinlock 1098 * @vdev: VDEV object 1099 * 1100 * API to Release VDEV lock 1101 * 1102 * Return: void 1103 */ 1104 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev) 1105 { 1106 qdf_spin_unlock_bh(&vdev->vdev_lock); 1107 } 1108 1109 /** 1110 * wlan_vdev_mlme_set_bss_chan() - set bss chan 1111 * @vdev: VDEV object 1112 * @bss_chan: Channel 1113 * 1114 * API to set the BSS channel 1115 * 1116 * Return: void 1117 */ 1118 static inline void wlan_vdev_mlme_set_bss_chan( 1119 struct wlan_objmgr_vdev *vdev, 1120 struct wlan_channel *bss_chan) 1121 { 1122 vdev->vdev_mlme.bss_chan = bss_chan; 1123 } 1124 1125 /** 1126 * wlan_vdev_mlme_get_bss_chan() - get bss chan 1127 * @vdev: VDEV object 1128 * 1129 * API to get the BSS channel 1130 * 1131 * Return: Channel 1132 */ 1133 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan( 1134 struct wlan_objmgr_vdev *vdev) 1135 { 1136 return vdev->vdev_mlme.bss_chan; 1137 } 1138 1139 /** 1140 * wlan_vdev_mlme_set_des_chan() - set desired chan 1141 * @vdev: VDEV object 1142 * @des_chan: Channel configured by user 1143 * 1144 * API to set the desired channel 1145 * 1146 * Return: void 1147 */ 1148 static inline void wlan_vdev_mlme_set_des_chan( 1149 struct wlan_objmgr_vdev *vdev, 1150 struct wlan_channel *des_chan) 1151 { 1152 vdev->vdev_mlme.des_chan = des_chan; 1153 } 1154 1155 /** 1156 * wlan_vdev_mlme_get_des_chan() - get desired chan 1157 * @vdev: VDEV object 1158 * 1159 * API to get the desired channel 1160 * 1161 * Return: Channel configured by user 1162 */ 1163 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan( 1164 struct wlan_objmgr_vdev *vdev) 1165 { 1166 return vdev->vdev_mlme.des_chan; 1167 } 1168 1169 /** 1170 * wlan_vdev_mlme_feat_cap_set() - set feature caps 1171 * @vdev: VDEV object 1172 * @cap: capabilities to be set 1173 * 1174 * API to set MLME feature capabilities 1175 * 1176 * Return: void 1177 */ 1178 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev, 1179 uint32_t cap) 1180 { 1181 vdev->vdev_mlme.vdev_feat_caps |= cap; 1182 } 1183 1184 /** 1185 * wlan_vdev_mlme_feat_cap_clear() - clear feature caps 1186 * @vdev: VDEV object 1187 * @cap: capabilities to be cleared 1188 * 1189 * API to clear MLME feature capabilities 1190 * 1191 * Return: void 1192 */ 1193 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev, 1194 uint32_t cap) 1195 { 1196 vdev->vdev_mlme.vdev_feat_caps &= ~cap; 1197 } 1198 1199 /** 1200 * wlan_vdev_mlme_feat_cap_get() - get feature caps 1201 * @vdev: VDEV object 1202 * @cap: capabilities to be checked 1203 * 1204 * API to know MLME feature capability is set or not 1205 * 1206 * Return: 1 -- if capabilities set 1207 * 0 -- if capabilities clear 1208 */ 1209 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev, 1210 uint32_t cap) 1211 { 1212 return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0; 1213 } 1214 1215 /** 1216 * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps 1217 * @vdev: VDEV object 1218 * @cap: capabilities to be set 1219 * 1220 * API to set the MLME extensive feature capabilities 1221 * 1222 * Return: void 1223 */ 1224 static inline void wlan_vdev_mlme_feat_ext_cap_set( 1225 struct wlan_objmgr_vdev *vdev, 1226 uint32_t cap) 1227 { 1228 vdev->vdev_mlme.vdev_feat_ext_caps |= cap; 1229 } 1230 1231 /** 1232 * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps 1233 * @vdev: VDEV object 1234 * @cap: capabilities to be cleared 1235 * 1236 * API to clear the MLME extensive feature capabilities 1237 * 1238 * Return: void 1239 */ 1240 static inline void wlan_vdev_mlme_feat_ext_cap_clear( 1241 struct wlan_objmgr_vdev *vdev, 1242 uint32_t cap) 1243 { 1244 vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap; 1245 } 1246 1247 /** 1248 * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps 1249 * @vdev: VDEV object 1250 * @cap: capabilities to be checked 1251 * 1252 * API to know MLME ext feature capability is set or not 1253 * 1254 * Return: 1 -- if capabilities set 1255 * 0 -- if capabilities clear 1256 */ 1257 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get( 1258 struct wlan_objmgr_vdev *vdev, 1259 uint32_t cap) 1260 { 1261 return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0; 1262 } 1263 1264 /** 1265 * wlan_vdev_mlme_feat_ext2_cap_set() - set ext2 feature caps 1266 * @vdev: VDEV object 1267 * @cap: capabilities to be set 1268 * 1269 * API to set the MLME more extensive feature capabilities 1270 * 1271 * Return: void 1272 */ 1273 static inline void wlan_vdev_mlme_feat_ext2_cap_set( 1274 struct wlan_objmgr_vdev *vdev, 1275 uint32_t cap) 1276 { 1277 vdev->vdev_mlme.vdev_feat_ext2_caps |= cap; 1278 } 1279 1280 /** 1281 * wlan_vdev_mlme_feat_ext2_cap_clear() - clear ext2 feature caps 1282 * @vdev: VDEV object 1283 * @cap: capabilities to be cleared 1284 * 1285 * API to clear the MLME more extensive feature capabilities 1286 * 1287 * Return: void 1288 */ 1289 static inline void wlan_vdev_mlme_feat_ext2_cap_clear( 1290 struct wlan_objmgr_vdev *vdev, 1291 uint32_t cap) 1292 { 1293 vdev->vdev_mlme.vdev_feat_ext2_caps &= ~cap; 1294 } 1295 1296 /** 1297 * wlan_vdev_mlme_feat_ext2_cap_get() - get feature ext2 caps 1298 * @vdev: VDEV object 1299 * @cap: capabilities to be checked 1300 * 1301 * API to know MLME more ext feature capability is set or not 1302 * 1303 * Return: 1 -- if capabilities set 1304 * 0 -- if capabilities clear 1305 */ 1306 static inline uint8_t wlan_vdev_mlme_feat_ext2_cap_get( 1307 struct wlan_objmgr_vdev *vdev, 1308 uint32_t cap) 1309 { 1310 return (vdev->vdev_mlme.vdev_feat_ext2_caps & cap) ? 1 : 0; 1311 } 1312 1313 /** 1314 * wlan_vdev_mlme_op_flags_set() - set vdev op flag 1315 * @vdev: VDEV object 1316 * @flag: vdev op flag to be set 1317 * 1318 * API to set the MLME VDEV OP flag 1319 * 1320 * Return: void 1321 */ 1322 static inline void wlan_vdev_mlme_op_flags_set( 1323 struct wlan_objmgr_vdev *vdev, 1324 uint32_t flag) 1325 { 1326 vdev->vdev_mlme.vdev_op_flags |= flag; 1327 } 1328 1329 /** 1330 * wlan_vdev_mlme_op_flags_clear() - clear vdev op flag 1331 * @vdev: VDEV object 1332 * @flag: vdev op flag to be cleared 1333 * 1334 * API to clear the MLME VDEV OP flag 1335 * 1336 * Return: void 1337 */ 1338 static inline void wlan_vdev_mlme_op_flags_clear( 1339 struct wlan_objmgr_vdev *vdev, 1340 uint32_t flag) 1341 { 1342 vdev->vdev_mlme.vdev_op_flags &= ~flag; 1343 } 1344 1345 /** 1346 * wlan_vdev_mlme_op_flags_get() - get vdev op flag 1347 * @vdev: VDEV object 1348 * @flag: vdev op flags to be checked 1349 * 1350 * API to know MLME VDEV OP flag is set or not 1351 * 1352 * Return: 1 -- if flag is set 1353 * 0 -- if flag is clear 1354 */ 1355 static inline uint8_t wlan_vdev_mlme_op_flags_get( 1356 struct wlan_objmgr_vdev *vdev, 1357 uint32_t flag) 1358 { 1359 return (vdev->vdev_mlme.vdev_op_flags & flag) ? 1 : 0; 1360 } 1361 1362 /** 1363 * wlan_vdev_mlme_cap_set() - mlme caps set 1364 * @vdev: VDEV object 1365 * @cap: capabilities to be set 1366 * 1367 * API to set the MLME capabilities 1368 * 1369 * Return: void 1370 */ 1371 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev, 1372 uint32_t cap) 1373 { 1374 vdev->vdev_mlme.vdev_caps |= cap; 1375 } 1376 1377 /** 1378 * wlan_vdev_mlme_cap_clear() - mlme caps clear 1379 * @vdev: VDEV object 1380 * @cap: capabilities to be cleared 1381 * 1382 * API to clear the MLME capabilities 1383 * 1384 * Return: void 1385 */ 1386 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev, 1387 uint32_t cap) 1388 { 1389 vdev->vdev_mlme.vdev_caps &= ~cap; 1390 } 1391 1392 /** 1393 * wlan_vdev_mlme_cap_get() - get mlme caps 1394 * @vdev: VDEV object 1395 * @cap: capabilities to be checked 1396 * 1397 * API to know MLME capability is set or not 1398 * 1399 * Return: 1 -- if capabilities set 1400 * 0 -- if capabilities clear 1401 */ 1402 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev, 1403 uint32_t cap) 1404 { 1405 return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0; 1406 } 1407 1408 /** 1409 * wlan_vdev_mlme_get_state() - get mlme state 1410 * @vdev: VDEV object 1411 * 1412 * API to get MLME state 1413 * 1414 * Return: state of MLME 1415 */ 1416 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state( 1417 struct wlan_objmgr_vdev *vdev) 1418 { 1419 return vdev->vdev_mlme.mlme_state; 1420 } 1421 1422 /** 1423 * wlan_vdev_mlme_get_substate() - get mlme substate 1424 * @vdev: VDEV object 1425 * 1426 * API to get VDEV MLME substate 1427 * 1428 * Return: substate of VDEV MLME 1429 */ 1430 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate( 1431 struct wlan_objmgr_vdev *vdev) 1432 { 1433 return vdev->vdev_mlme.mlme_substate; 1434 } 1435 1436 /** 1437 * wlan_vdev_set_selfpeer() - set self peer 1438 * @vdev: VDEV object 1439 * @peer: peer pointer 1440 * 1441 * API to set the self peer of VDEV 1442 * 1443 * Return: void 1444 */ 1445 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev, 1446 struct wlan_objmgr_peer *peer) 1447 { 1448 vdev->vdev_objmgr.self_peer = peer; 1449 } 1450 1451 /** 1452 * wlan_vdev_get_selfpeer() - get self peer 1453 * @vdev: VDEV object 1454 * 1455 * API to get the self peer of VDEV 1456 * 1457 * Return: peer pointer 1458 */ 1459 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer( 1460 struct wlan_objmgr_vdev *vdev) 1461 { 1462 return vdev->vdev_objmgr.self_peer; 1463 } 1464 1465 /** 1466 * wlan_vdev_set_bsspeer() - set bss peer 1467 * @vdev: VDEV object 1468 * @peer: BSS peer pointer 1469 * 1470 * API to set the BSS peer of VDEV 1471 * 1472 * Return: void 1473 */ 1474 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev, 1475 struct wlan_objmgr_peer *peer) 1476 { 1477 vdev->vdev_objmgr.bss_peer = peer; 1478 } 1479 1480 /** 1481 * wlan_vdev_get_bsspeer() - get bss peer 1482 * @vdev: VDEV object 1483 * 1484 * API to get the BSS peer of VDEV, wlan_objmgr_vdev_try_get_bsspeer API 1485 * preferred to use outside obj manager to take and handle ref count of 1486 * bss_peer with ref debug ID. 1487 * 1488 * Return: 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: peer pointer to the peer of the mac address 1505 */ 1506 struct wlan_objmgr_peer * 1507 wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev, 1508 uint8_t *peer_mac, 1509 wlan_objmgr_ref_dbgid dbg_id); 1510 1511 /** 1512 * wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer 1513 * of VDEV 1514 * @vdev: VDEV object 1515 * @id: Object Manager ref debug id 1516 * 1517 * API to get and increment ref count of BSS peer of VDEV 1518 * 1519 * Return: BSS peer pointer if bss peer is present and valid else NULL 1520 */ 1521 struct wlan_objmgr_peer *wlan_objmgr_vdev_try_get_bsspeer( 1522 struct wlan_objmgr_vdev *vdev, 1523 wlan_objmgr_ref_dbgid id); 1524 /** 1525 * wlan_vdev_get_ospriv() - get os priv pointer 1526 * @vdev: VDEV object 1527 * 1528 * API to get OS private pointer from VDEV 1529 * 1530 * Return: ospriv - private pointer 1531 */ 1532 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv( 1533 struct wlan_objmgr_vdev *vdev) 1534 { 1535 return vdev->vdev_nif.osdev; 1536 } 1537 1538 /** 1539 * wlan_vdev_reset_ospriv() - reset os priv pointer 1540 * @vdev: VDEV object 1541 * 1542 * API to reset OS private pointer in VDEV 1543 * 1544 * Return: void 1545 */ 1546 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev) 1547 { 1548 vdev->vdev_nif.osdev = NULL; 1549 } 1550 1551 /** 1552 * wlan_vdev_get_peer_count() - get vdev peer count 1553 * @vdev: VDEV object 1554 * 1555 * API to get peer count from VDEV 1556 * 1557 * Return: peer_count - vdev's peer count 1558 */ 1559 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev) 1560 { 1561 return vdev->vdev_objmgr.wlan_peer_count; 1562 } 1563 1564 /** 1565 * wlan_vdev_mlme_is_ap() - Check whether @vdev is an AP or not 1566 * @vdev: VDEV object 1567 * 1568 * Return: True if @vdev is ap, otherwise false. 1569 */ 1570 static inline bool wlan_vdev_mlme_is_ap(struct wlan_objmgr_vdev *vdev) 1571 { 1572 return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE); 1573 } 1574 1575 #ifdef WLAN_FEATURE_11BE_MLO 1576 /** 1577 * wlan_vdev_mlme_is_mlo_vdev() - Determine whether the given vdev is an MLO 1578 * vdev or not 1579 * @vdev: VDEV object 1580 * 1581 * Return: True if it is MLO, otherwise false. 1582 */ 1583 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev); 1584 1585 /** 1586 * wlan_vdev_mlme_is_mlo_ap() - whether it is mlo ap or not 1587 * @vdev: VDEV object 1588 * 1589 * Return: True if it is mlo ap, otherwise false. 1590 */ 1591 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev) 1592 { 1593 return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) && 1594 wlan_vdev_mlme_is_mlo_vdev(vdev); 1595 } 1596 1597 /** 1598 * wlan_vdev_mlme_set_mlo_vdev() - Set vdev as an MLO vdev 1599 * @vdev: VDEV object 1600 * 1601 * Return: void 1602 */ 1603 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev); 1604 1605 /** 1606 * wlan_vdev_mlme_clear_mlo_vdev() - Mark that the vdev is no longer an MLO vdev 1607 * @vdev: VDEV object 1608 * 1609 * Return: void 1610 */ 1611 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev); 1612 1613 /** 1614 * wlan_vdev_mlme_set_mlo_link_vdev() - Set vdev as an MLO link vdev 1615 * @vdev: VDEV object 1616 * 1617 * Return: void 1618 */ 1619 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev); 1620 1621 /** 1622 * wlan_vdev_mlme_clear_mlo_link_vdev() - Mark that the vdev is no longer an 1623 * MLO link vdev 1624 * @vdev: VDEV object 1625 * 1626 * Return: void 1627 */ 1628 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev); 1629 #ifdef WLAN_MCAST_MLO 1630 /** 1631 * wlan_vdev_mlme_is_mlo_mcast_vdev() - whether it is mlo mcast vdev or not 1632 * @vdev: VDEV object 1633 * 1634 * Return: True if it is mlo mcast vdev, otherwise false. 1635 */ 1636 static inline 1637 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev) 1638 { 1639 return wlan_vdev_mlme_feat_ext2_cap_get(vdev, 1640 WLAN_VDEV_FEXT2_MLO_MCAST); 1641 } 1642 #else 1643 static inline 1644 bool wlan_vdev_mlme_is_mlo_mcast_vdev(struct wlan_objmgr_vdev *vdev) 1645 { 1646 return false; 1647 } 1648 #endif 1649 1650 /** 1651 * wlan_vdev_mlme_is_mlo_link_vdev() - whether it is mlo sta link vdev or not 1652 * @vdev: VDEV object 1653 * 1654 * Return: True if it is mlo sta link, otherwise false. 1655 */ 1656 static inline 1657 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev) 1658 { 1659 return wlan_vdev_mlme_feat_ext2_cap_get(vdev, 1660 WLAN_VDEV_FEXT2_MLO_STA_LINK); 1661 } 1662 1663 /** 1664 * wlan_vdev_mlme_is_assoc_sta_vdev() - whether it is mlo sta assoc vdev or not 1665 * @vdev: VDEV object 1666 * 1667 * Return: True if it is mlo sta assoc vdev, otherwise false. 1668 */ 1669 static inline 1670 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev) 1671 { 1672 if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) || 1673 !wlan_vdev_mlme_is_mlo_vdev(vdev)) 1674 return false; 1675 1676 if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev)) 1677 return true; 1678 1679 return false; 1680 } 1681 1682 /** 1683 * wlan_vdev_mlme_is_link_sta_vdev() - whether it is mlo sta link vdev or not 1684 * @vdev: VDEV object 1685 * 1686 * Return: True if it is mlo sta link vdev, otherwise false. 1687 */ 1688 static inline 1689 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev) 1690 { 1691 if (!(wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) || 1692 !wlan_vdev_mlme_is_mlo_vdev(vdev)) 1693 return false; 1694 1695 if (wlan_vdev_mlme_is_mlo_link_vdev(vdev)) 1696 return true; 1697 1698 return false; 1699 } 1700 #else 1701 static inline 1702 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev) 1703 { 1704 return false; 1705 } 1706 1707 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev) 1708 { 1709 return false; 1710 } 1711 1712 static inline 1713 void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev) 1714 { 1715 } 1716 1717 static inline 1718 void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev) 1719 { 1720 } 1721 1722 static inline 1723 void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev) 1724 { 1725 } 1726 1727 static inline 1728 void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev) 1729 { 1730 } 1731 1732 static inline 1733 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev) 1734 { 1735 return false; 1736 } 1737 1738 static inline 1739 bool wlan_vdev_mlme_is_assoc_sta_vdev(struct wlan_objmgr_vdev *vdev) 1740 { 1741 return false; 1742 } 1743 1744 static inline 1745 bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev) 1746 { 1747 return false; 1748 } 1749 #endif 1750 1751 /** 1752 * DOC: Examples to use VDEV ref count APIs 1753 * 1754 * In all the scenarios, the pair of API should be followed 1755 * other it lead to memory leak 1756 * 1757 * scenario 1: 1758 * 1759 * wlan_objmgr_vdev_obj_create() 1760 * ---- 1761 * wlan_objmgr_vdev_obj_delete() 1762 * 1763 * scenario 2: 1764 * 1765 * wlan_objmgr_vdev_get_ref() 1766 * ---- 1767 * the operations which are done on 1768 * vdev object 1769 * ---- 1770 * wlan_objmgr_vdev_release_ref() 1771 * 1772 * scenario 3: 1773 * 1774 * API to retrieve vdev (xxx_get_vdev_xxx()) 1775 * ---- 1776 * the operations which are done on 1777 * vdev object 1778 * ---- 1779 * wlan_objmgr_vdev_release_ref() 1780 */ 1781 1782 /** 1783 * wlan_objmgr_vdev_get_ref() - increment ref count 1784 * @vdev: VDEV object 1785 * @id: Object Manager ref debug id 1786 * 1787 * API to increment ref count of vdev 1788 * 1789 * Return: void 1790 */ 1791 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1792 #define wlan_objmgr_vdev_get_ref(vdev, id) \ 1793 wlan_objmgr_vdev_get_ref_debug(vdev, id, __func__, __LINE__) 1794 1795 void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev, 1796 wlan_objmgr_ref_dbgid id, 1797 const char *func, int line); 1798 #else 1799 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, 1800 wlan_objmgr_ref_dbgid id); 1801 #endif 1802 1803 /** 1804 * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed 1805 * @vdev: VDEV object 1806 * @id: Object Manager ref debug id 1807 * 1808 * API to increment ref count of vdev after checking valid object state 1809 * 1810 * Return: void 1811 */ 1812 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1813 #define wlan_objmgr_vdev_try_get_ref(vdev, id) \ 1814 wlan_objmgr_vdev_try_get_ref_debug(vdev, id, \ 1815 __func__, __LINE__) 1816 1817 QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev, 1818 wlan_objmgr_ref_dbgid id, 1819 const char *func, int line); 1820 #else 1821 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev, 1822 wlan_objmgr_ref_dbgid id); 1823 #endif 1824 1825 /** 1826 * wlan_objmgr_vdev_release_ref() - decrement ref count 1827 * @vdev: VDEV object 1828 * @id: Object Manager ref debug id 1829 * 1830 * API to decrement ref count of vdev, if ref count is 1, it initiates the 1831 * VDEV deletion 1832 * 1833 * Return: void 1834 */ 1835 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1836 #define wlan_objmgr_vdev_release_ref(vdev, id)\ 1837 wlan_objmgr_vdev_release_ref_debug(vdev, id, \ 1838 __func__, __LINE__) 1839 1840 void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev, 1841 wlan_objmgr_ref_dbgid id, 1842 const char *func, int line); 1843 #else 1844 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev, 1845 wlan_objmgr_ref_dbgid id); 1846 #endif 1847 1848 /** 1849 * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev 1850 * @pdev: PDEV object 1851 * @vdev_list: qdf_list_t 1852 * @vdev: VDEV object 1853 * @dbg_id: id of the caller 1854 * 1855 * API to get next active vdev object pointer of vdev 1856 * 1857 * Return: VDEV object 1858 */ 1859 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1860 #define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbg_id) \ 1861 wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \ 1862 vdev, dbg_id, __func__, __LINE__) 1863 1864 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug( 1865 struct wlan_objmgr_pdev *pdev, 1866 qdf_list_t *vdev_list, 1867 struct wlan_objmgr_vdev *vdev, 1868 wlan_objmgr_ref_dbgid dbg_id, 1869 const char *func, int line); 1870 #else 1871 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( 1872 struct wlan_objmgr_pdev *pdev, 1873 qdf_list_t *vdev_list, 1874 struct wlan_objmgr_vdev *vdev, 1875 wlan_objmgr_ref_dbgid dbg_id); 1876 #endif 1877 1878 /** 1879 * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list 1880 * @pdev: PDEV object 1881 * @dbg_id: id of the caller 1882 * 1883 * API to get the head active vdev of given pdev (of pdev's vdev list) 1884 * 1885 * Return: 1886 */ 1887 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1888 #define wlan_pdev_peek_active_first_vdev(pdev, dbg_id) \ 1889 wlan_pdev_peek_active_first_vdev_debug(pdev, dbg_id, \ 1890 __func__, __LINE__) 1891 1892 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug( 1893 struct wlan_objmgr_pdev *pdev, 1894 wlan_objmgr_ref_dbgid dbg_id, 1895 const char *func, int line); 1896 #else 1897 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev( 1898 struct wlan_objmgr_pdev *pdev, 1899 wlan_objmgr_ref_dbgid dbg_id); 1900 #endif 1901 1902 /** 1903 * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list 1904 * @pdev: PDEV object 1905 * @vdev_list: qdf_list_t 1906 * @dbg_id: id of the caller 1907 * 1908 * API to get the head active vdev of given vdev (of pdev's vdev list) 1909 * 1910 * Return: head peer 1911 */ 1912 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1913 #define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbg_id) \ 1914 wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \ 1915 dbg_id, __func__, __LINE__) 1916 1917 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug( 1918 struct wlan_objmgr_pdev *pdev, 1919 qdf_list_t *vdev_list, 1920 wlan_objmgr_ref_dbgid dbg_id, 1921 const char *func, int line); 1922 #else 1923 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( 1924 struct wlan_objmgr_pdev *pdev, 1925 qdf_list_t *vdev_list, 1926 wlan_objmgr_ref_dbgid dbg_id); 1927 #endif 1928 1929 /** 1930 * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed 1931 * @vdev: VDEV object 1932 * 1933 * API to invokes registered callbacks to notify about peer freed 1934 * 1935 * Return: void 1936 */ 1937 void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev); 1938 1939 /** 1940 * wlan_vdev_set_max_peer_count() - set max peer count 1941 * @vdev: VDEV object 1942 * @count: Max peer count 1943 * 1944 * API to set max peer count of VDEV 1945 * 1946 * Return: void 1947 */ 1948 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev, 1949 uint16_t count) 1950 { 1951 vdev->vdev_objmgr.max_peer_count = count; 1952 } 1953 1954 /** 1955 * wlan_vdev_get_max_peer_count() - get max peer count 1956 * @vdev: VDEV object 1957 * 1958 * API to get max peer count of VDEV 1959 * 1960 * Return: max peer count 1961 */ 1962 static inline uint16_t wlan_vdev_get_max_peer_count( 1963 struct wlan_objmgr_vdev *vdev) 1964 { 1965 return vdev->vdev_objmgr.max_peer_count; 1966 } 1967 1968 /** 1969 * wlan_print_vdev_info() - print vdev members 1970 * @vdev: vdev object pointer 1971 * 1972 * Return: void 1973 */ 1974 #ifdef WLAN_OBJMGR_DEBUG 1975 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev); 1976 #else 1977 static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {} 1978 #endif 1979 1980 /** 1981 * wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock 1982 * @vdev: vdev object pointer 1983 * 1984 * Return: void 1985 */ 1986 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1987 static inline void 1988 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev) 1989 { 1990 wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace); 1991 } 1992 #else 1993 static inline void 1994 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev) 1995 { 1996 } 1997 #endif 1998 1999 /** 2000 * wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock 2001 * @vdev: vdev object pointer 2002 * 2003 * Return: void 2004 */ 2005 #ifdef WLAN_OBJMGR_REF_ID_TRACE 2006 static inline void 2007 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev) 2008 { 2009 wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace); 2010 } 2011 #else 2012 static inline void 2013 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev) 2014 { 2015 } 2016 #endif 2017 2018 /** 2019 * wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list 2020 * @vdev: vdev object pointer 2021 * 2022 * Return: void 2023 */ 2024 #ifdef WLAN_OBJMGR_REF_ID_TRACE 2025 static inline void 2026 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev) 2027 { 2028 wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace); 2029 } 2030 #else 2031 static inline void 2032 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev) 2033 { 2034 } 2035 #endif 2036 2037 /** 2038 * wlan_vdev_get_bss_peer_mac() - to get bss peer mac address 2039 * @vdev: pointer to vdev 2040 * @bss_peer_mac: pointer to bss_peer_mac_address 2041 * 2042 * This API is used to get mac address of peer. 2043 * 2044 * Context: Any context. 2045 * 2046 * Return: QDF_STATUS based on overall success 2047 */ 2048 QDF_STATUS wlan_vdev_get_bss_peer_mac(struct wlan_objmgr_vdev *vdev, 2049 struct qdf_mac_addr *bss_peer_mac); 2050 2051 #ifdef WLAN_FEATURE_11BE_MLO 2052 /** 2053 * wlan_vdev_get_bss_peer_mld_mac() - to get bss peer mld mac address 2054 * @vdev: pointer to vdev 2055 * @mld_mac: pointer to mld mac address 2056 * 2057 * This API is used to get mld 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_mld_mac(struct wlan_objmgr_vdev *vdev, 2064 struct qdf_mac_addr *mld_mac); 2065 #endif 2066 2067 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/ 2068