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