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