1 /* 2 * Copyright (c) 2016-2020 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 39 /* CONF: privacy enabled */ 40 #define WLAN_VDEV_F_PRIVACY 0x00000001 41 /* CONF: 11g w/o 11b sta's */ 42 #define WLAN_VDEV_F_PUREG 0x00000002 43 /* CONF: des_bssid is set */ 44 #define WLAN_VDEV_F_DESBSSID 0x00000004 45 /* CONF: bg scan enabled */ 46 #define WLAN_VDEV_F_BGSCAN 0x00000008 47 /* CONF: sw tx retry enabled */ 48 #define WLAN_VDEV_F_SWRETRY 0x00000010 49 /* STATUS: update beacon tim */ 50 #define WLAN_VDEV_F_TIMUPDATE 0x00000020 51 /* CONF: WPA enabled */ 52 #define WLAN_VDEV_F_WPA1 0x00000040 53 /* CONF: WPA2 enabled */ 54 #define WLAN_VDEV_F_WPA2 0x00000080 55 /* CONF: WPA/WPA2 enabled */ 56 #define WLAN_VDEV_F_WPA 0x000000c0 57 /* CONF: drop unencrypted */ 58 #define WLAN_VDEV_F_DROPUNENC 0x00000100 59 /* CONF: TKIP countermeasures */ 60 #define WLAN_VDEV_F_COUNTERM 0x00000200 61 /* CONF: hide SSID in beacon */ /*TODO PDEV/PSOC */ 62 #define WLAN_VDEV_F_HIDESSID 0x00000400 63 /* CONF: disable internal bridge */ /*TODO PDEV/PSOC */ 64 #define WLAN_VDEV_F_NOBRIDGE 0x00000800 65 /* STATUS: update beacon wme */ 66 #define WLAN_VDEV_F_WMEUPDATE 0x00001000 67 /* CONF: 4 addr allowed */ 68 #define WLAN_VDEV_F_WDS 0x00002000 69 /* CONF: enable U-APSD */ 70 #define WLAN_VDEV_F_UAPSD 0x00004000 71 /* STATUS: sleeping */ 72 #define WLAN_VDEV_F_SLEEP 0x00008000 73 /* drop uapsd EOSP frames for test */ 74 #define WLAN_VDEV_F_EOSPDROP 0x00010000 75 /* CONF: A-MPDU supported */ 76 #define WLAN_VDEV_F_AMPDU 0x00020000 77 /* STATE: beacon APP IE updated */ 78 #define WLAN_VDEV_F_APPIE_UPDATE 0x00040000 79 /* CONF: WDS auto Detect/DELBA */ 80 #define WLAN_VDEV_F_WDS_AUTODETECT 0x00080000 81 /* 11b only without 11g stations */ 82 #define WLAN_VDEV_F_PUREB 0x00100000 83 /* disable HT rates */ 84 #define WLAN_VDEV_F_HTRATES 0x00200000 85 /* Extender AP */ 86 #define WLAN_VDEV_F_AP 0x00400000 87 /* CONF: deliver rx frames with 802.11 header */ 88 #define WLAN_VDEV_F_DELIVER_80211 0x00800000 89 /* CONF: os sends down tx frames with 802.11 header */ 90 #define WLAN_VDEV_F_SEND_80211 0x01000000 91 /* CONF: statically configured WDS */ 92 #define WLAN_VDEV_F_WDS_STATIC 0x02000000 93 /* CONF: pure 11n mode */ 94 #define WLAN_VDEV_F_PURE11N 0x04000000 95 /* CONF: pure 11ac mode */ 96 #define WLAN_VDEV_F_PURE11AC 0x08000000 97 /* Basic Rates Update */ 98 #define WLAN_VDEV_F_BR_UPDATE 0x10000000 99 /* CONF: restrict bw ont top of per 11ac/n */ 100 #define WLAN_VDEV_F_STRICT_BW 0x20000000 101 /* Wi-Fi SON mode (with APS) */ 102 #define WLAN_VDEV_F_SON 0x40000000 103 /* Wi-Fi SON mode (with APS) */ 104 #define WLAN_VDEV_F_MBO 0x80000000 105 106 /* Feature extension flags */ 107 /* CONF: MSFT safe mode */ 108 #define WLAN_VDEV_FEXT_SAFEMODE 0x00000001 109 /* if the vap can sleep*/ 110 #define WLAN_VDEV_FEXT_CANSLEEP 0x00000002 111 /* use sw bmiss timer */ 112 #define WLAN_VDEV_FEXT_SWBMISS 0x00000004 113 /* enable beacon copy */ 114 #define WLAN_VDEV_FEXT_COPY_BEACON 0x00000008 115 #define WLAN_VDEV_FEXT_WAPI 0x00000010 116 /* 802.11h enabled */ 117 #define WLAN_VDEV_FEXT_DOTH 0x00000020 118 /* if the vap has wds independance set */ 119 #define WLAN_VDEV_FEXT_VAPIND 0x00000040 120 /* QBSS load IE enabled */ 121 #define WLAN_VDEV_FEXT_BSSLOAD 0x00000080 122 /* Short Guard Interval Enable:1 Disable:0 */ 123 #define WLAN_VDEV_FEXT_SGI 0x00000100 124 /* Short Guard Interval Enable:1 Disable:0 for VHT fixed rates */ 125 #define WLAN_VDEV_FEXT_DATASGI 0x00000200 126 /* LDPC Enable Rx:1 TX: 2 ; Disable:0 */ 127 #define WLAN_VDEV_FEXT_LDPC_TX 0x00000400 128 #define WLAN_VDEV_FEXT_LDPC_RX 0x00000800 129 #define WLAN_VDEV_FEXT_LDPC 0x00000c00 130 /* wme enabled */ 131 #define WLAN_VDEV_FEXT_WME 0x00001000 132 /* WNM Capabilities */ 133 #define WLAN_VDEV_FEXT_WNM 0x00002000 134 /* RRM Capabilities */ 135 #define WLAN_VDEV_FEXT_RRM 0x00004000 136 /* WNM Proxy ARP Capabilities */ 137 #define WLAN_VDEV_FEXT_PROXYARP 0x00008000 138 /* 256 QAM support in 2.4GHz mode Enable:1 Disable:0 */ 139 #define WLAN_VDEV_FEXT_256QAM 0x00010000 140 /* 2.4NG 256 QAM Interop mode Enable:1 Disable:0 */ 141 #define WLAN_VDEV_FEXT_256QAM_INTEROP 0x00020000 142 /* static mimo ps enabled */ 143 #define WLAN_VDEV_FEXT_STATIC_MIMOPS 0x00040000 144 /* dynamic mimo ps enabled */ 145 #define WLAN_VDEV_FEXT_DYN_MIMOPS 0x00080000 146 /* Country IE enabled */ 147 #define WLAN_VDEV_FEXT_CNTRY_IE 0x00100000 148 /*does not want to trigger multi channel operation 149 instead follow master vaps channel (for AP/GO Vaps) */ 150 #define WLAN_VDEV_FEXT_NO_MULCHAN 0x00200000 151 /*non-beaconing AP VAP*/ 152 #define WLAN_VDEV_FEXT_NON_BEACON 0x00400000 153 /* SPL repeater enabled for SON*/ 154 #define WLAN_VDEV_FEXT_SON_SPL_RPT 0x00800000 155 /* SON IE update in MGMT frame */ 156 #define WLAN_VDEV_FEXT_SON_INFO_UPDATE 0x01000000 157 /* CONF: A-MSDU supported */ 158 #define WLAN_VDEV_FEXT_AMSDU 0x02000000 159 /* VDEV is PSTA*/ 160 #define WLAN_VDEV_FEXT_PSTA 0x04000000 161 /* VDEV is MPSTA*/ 162 #define WLAN_VDEV_FEXT_MPSTA 0x08000000 163 /* VDEV is WRAP*/ 164 #define WLAN_VDEV_FEXT_WRAP 0x10000000 165 /* VDEV has MAT enabled*/ 166 #define WLAN_VDEV_FEXT_MAT 0x20000000 167 /* VDEV is wired PSTA*/ 168 #define WLAN_VDEV_FEXT_WIRED_PSTA 0x40000000 169 /* Fils discovery on 6G SAP*/ 170 #define WLAN_VDEV_FEXT_FILS_DISC_6G_SAP 0x80000000 171 172 /* VDEV OP flags */ 173 /* if the vap destroyed by user */ 174 #define WLAN_VDEV_OP_DELETE_PROGRESS 0x00000001 175 /* set to enable sta-fws fweature */ 176 #define WLAN_VDEV_OP_STAFWD 0x00000002 177 /* Off-channel support enabled */ 178 #define WLAN_VDEV_OP_OFFCHAN 0x00000004 179 /* if the vap has erp update set */ 180 #define WLAN_VDEV_OP_ERPUPDATE 0x00000008 181 /* this vap needs scheduler for off channel operation */ 182 #define WLAN_VDEV_OP_NEEDS_SCHED 0x00000010 183 /*STA in forced sleep set PS bit for all outgoing frames */ 184 #define WLAN_VDEV_OP_FORCED_SLEEP 0x00000020 185 /* update bssload IE in beacon */ 186 #define WLAN_VDEV_OP_BSSLOAD_UPDATE 0x00000040 187 /* Hotspot 2.0 DGAF Disable bit */ 188 #define WLAN_VDEV_OP_DGAF_DISABLE 0x00000080 189 /* STA SmartNet enabled */ 190 #define WLAN_VDEV_OP_SMARTNET_EN 0x00000100 191 /* SoftAP to reject resuming in DFS channels */ 192 #define WLAN_VDEV_OP_REJ_DFS_CHAN 0x00000200 193 /* Trigger mlme response */ 194 #define WLAN_VDEV_OP_TRIGGER_MLME_RESP 0x00000400 195 /* test flag for MFP */ 196 #define WLAN_VDEV_OP_MFP_TEST 0x00000800 197 /* flag to indicate using default ratemask */ 198 #define WLAN_VDEV_OP_DEF_RATEMASK 0x00001000 199 /*For wakeup AP VAP when wds-sta connect to the AP only use when 200 export (UMAC_REPEATER_DELAYED_BRINGUP || DBDC_REPEATER_SUPPORT)=1*/ 201 #define WLAN_VDEV_OP_KEYFLAG 0x00002000 202 /* if performe the iwlist scanning */ 203 #define WLAN_VDEV_OP_LIST_SCANNING 0x00004000 204 /*Set when VAP down*/ 205 #define WLAN_VDEV_OP_IS_DOWN 0x00008000 206 /* if vap may require acs when another vap is brought down */ 207 #define WLAN_VDEV_OP_NEEDS_UP_ACS 0x00010000 208 /* Block data traffic tx for this vap */ 209 #define WLAN_VDEV_OP_BLOCK_TX_TRAFFIC 0x00020000 210 /* for mbo functionality */ 211 #define WLAN_VDEV_OP_MBO 0x00040000 212 213 /* CAPABILITY: IBSS available */ 214 #define WLAN_VDEV_C_IBSS 0x00000001 215 /* CAPABILITY: HOSTAP avail */ 216 #define WLAN_VDEV_C_HOSTAP 0x00000002 217 /* CAPABILITY: Old Adhoc Demo */ 218 #define WLAN_VDEV_C_AHDEMO 0x00000004 219 /* CAPABILITY: sw tx retry */ 220 #define WLAN_VDEV_C_SWRETRY 0x00000008 221 /* CAPABILITY: monitor mode */ 222 #define WLAN_VDEV_C_MONITOR 0x00000010 223 /* CAPABILITY: TKIP MIC avail */ 224 #define WLAN_VDEV_C_TKIPMIC 0x00000020 225 /* CAPABILITY: 4-addr support */ 226 #define WLAN_VDEV_C_WDS 0x00000040 227 /* CAPABILITY: TKIP MIC for QoS frame */ 228 #define WLAN_VDEV_C_WME_TKIPMIC 0x00000080 229 /* CAPABILITY: bg scanning */ 230 #define WLAN_VDEV_C_BGSCAN 0x00000100 231 /* CAPABILITY: Restrict offchannel */ 232 #define WLAN_VDEV_C_RESTRICT_OFFCHAN 0x00000200 233 234 /* Invalid VDEV identifier */ 235 #define WLAN_INVALID_VDEV_ID 255 236 237 /** 238 * struct wlan_vdev_create_params - Create params, HDD/OSIF passes this 239 * structure While creating VDEV 240 * @opmode: Opmode of VDEV 241 * @flags: create flags 242 * @size_vdev_priv: Size of vdev private 243 * @legacy_osif: Legacy os_if private member 244 * @macaddr[]: MAC address 245 * @mataddr[]: MAT address 246 */ 247 struct wlan_vdev_create_params { 248 enum QDF_OPMODE opmode; 249 uint32_t flags; 250 size_t size_vdev_priv; 251 void *legacy_osif; 252 uint8_t macaddr[QDF_MAC_ADDR_SIZE]; 253 uint8_t mataddr[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 */ 270 struct wlan_channel { 271 uint16_t ch_freq; 272 uint8_t ch_ieee; 273 uint8_t ch_freq_seg1; 274 uint8_t ch_freq_seg2; 275 int8_t ch_maxpower; 276 uint16_t ch_flagext; 277 uint64_t ch_flags; 278 uint32_t ch_cfreq1; 279 uint32_t ch_cfreq2; 280 enum phy_ch_width ch_width; 281 enum wlan_phymode ch_phymode; 282 }; 283 284 /** 285 * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure 286 * @vdev_opmode: Opmode of VDEV 287 * @mlme_state: VDEV MLME SM state 288 * @mlme_state: VDEV MLME SM substate 289 * @bss_chan: BSS channel 290 * @des_chan: Desired channel, for STA Desired may not be used 291 * @vdev_caps: VDEV capabilities 292 * @vdev_feat_caps: VDEV feature caps 293 * @vdev_feat_ext_caps: VDEV Extended feature caps 294 * @vdev_op_flags: Operation flags 295 * @mataddr[]: MAT address 296 * @macaddr[]: VDEV self MAC address 297 * @ssid[]: SSID 298 * @ssid_len: SSID length 299 * @nss: Num. Spatial streams 300 * @tx_chainmask: Tx Chainmask 301 * @rx_chainmask: Rx Chainmask 302 * @tx_power: Tx power 303 * @max_rate: MAX rate 304 * @tx_mgmt_rate: TX Mgmt. Rate 305 * @per_band_mgmt_rate: Per-band TX Mgmt. Rate 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_op_flags; 317 uint8_t mataddr[QDF_MAC_ADDR_SIZE]; 318 uint8_t macaddr[QDF_MAC_ADDR_SIZE]; 319 }; 320 321 /** 322 * struct wlan_objmgr_vdev_nif - VDEV HDD specific sub structure 323 * @osdev: OS specific pointer 324 */ 325 struct wlan_objmgr_vdev_nif { 326 struct vdev_osif_priv *osdev; 327 }; 328 329 /** 330 * struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure 331 * @vdev_id: VDEV id 332 * @print_cnt: Count to throttle Logical delete prints 333 * @self_peer: Self PEER 334 * @bss_peer: BSS PEER 335 * @wlan_peer_list: PEER list 336 * @wlan_pdev: PDEV pointer 337 * @wlan_peer_count: Peer count 338 * @max_peer_count: Max Peer count 339 * @c_flags: creation specific flags 340 * @ref_cnt: Ref count 341 * @ref_id_dbg: Array to track Ref count 342 * @wlan_objmgr_trace: Trace ref and deref 343 */ 344 struct wlan_objmgr_vdev_objmgr { 345 uint8_t vdev_id; 346 uint8_t print_cnt; 347 struct wlan_objmgr_peer *self_peer; 348 struct wlan_objmgr_peer *bss_peer; 349 qdf_list_t wlan_peer_list; 350 struct wlan_objmgr_pdev *wlan_pdev; 351 uint16_t wlan_peer_count; 352 uint16_t max_peer_count; 353 uint32_t c_flags; 354 qdf_atomic_t ref_cnt; 355 qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX]; 356 #ifdef WLAN_OBJMGR_REF_ID_TRACE 357 struct wlan_objmgr_trace trace; 358 #endif 359 }; 360 361 /** 362 * struct wlan_objmgr_vdev - VDEV common object 363 * @vdev_node: qdf list of pdev's vdev list 364 * @vdev_mlme: VDEV MLME substructure 365 * @vdev_objmgr: VDEV Object Mgr substructure 366 * @vdev_nif: VDEV HDD substructure 367 * @vdev_comp_priv_obj[]:Component's private objects list 368 * @obj_status[]: Component object status 369 * @obj_state: VDEV object state 370 * @vdev_lock: VDEV lock 371 */ 372 struct wlan_objmgr_vdev { 373 qdf_list_node_t vdev_node; 374 struct wlan_objmgr_vdev_mlme vdev_mlme; 375 struct wlan_objmgr_vdev_objmgr vdev_objmgr; 376 struct wlan_objmgr_vdev_nif vdev_nif; 377 void *vdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS]; 378 QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS]; 379 WLAN_OBJ_STATE obj_state; 380 qdf_spinlock_t vdev_lock; 381 }; 382 383 /** 384 ** APIs to Create/Delete Global object APIs 385 */ 386 /** 387 * wlan_objmgr_vdev_obj_create() - vdev object create 388 * @pdev: PDEV object on which this vdev gets created 389 * @params: VDEV create params from HDD 390 * 391 * Creates vdev object, intializes with default values 392 * Attaches to psoc and pdev objects 393 * Invokes the registered notifiers to create component object 394 * 395 * Return: Handle to struct wlan_objmgr_vdev on successful creation, 396 * NULL on Failure (on Mem alloc failure and Component objects 397 * Failure) 398 */ 399 struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create( 400 struct wlan_objmgr_pdev *pdev, 401 struct wlan_vdev_create_params *params); 402 403 /** 404 * wlan_objmgr_vdev_obj_delete() - vdev object delete 405 * @vdev: vdev object 406 * 407 * Logically deletes VDEV object, 408 * Once all the references are released, object manager invokes the registered 409 * notifiers to destroy component objects 410 * 411 * Return: SUCCESS/FAILURE 412 */ 413 QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev); 414 415 /** 416 ** APIs to attach/detach component objects 417 */ 418 /** 419 * wlan_objmgr_vdev_component_obj_attach() - vdev comp object attach 420 * @vdev: VDEV object 421 * @id: Component id 422 * @comp_priv_obj: component's private object pointer 423 * @status: Component's private object creation status 424 * 425 * API to be used for attaching component object with VDEV common object 426 * 427 * Return: SUCCESS on successful storing of component's object in common object 428 * On FAILURE (appropriate failure codes are returned) 429 */ 430 QDF_STATUS wlan_objmgr_vdev_component_obj_attach( 431 struct wlan_objmgr_vdev *vdev, 432 enum wlan_umac_comp_id id, 433 void *comp_priv_obj, 434 QDF_STATUS status); 435 436 /** 437 * wlan_objmgr_vdev_component_obj_detach() - vdev comp object detach 438 * @vdev: VDEV object 439 * @id: Component id 440 * @comp_priv_obj: component's private object pointer 441 * 442 * API to be used for detaching component object with VDEV common object 443 * 444 * Return: SUCCESS on successful removal of component's object from common 445 * object 446 * On FAILURE (appropriate failure codes are returned) 447 */ 448 QDF_STATUS wlan_objmgr_vdev_component_obj_detach( 449 struct wlan_objmgr_vdev *vdev, 450 enum wlan_umac_comp_id id, 451 void *comp_priv_obj); 452 /* 453 ** APIs to operations on vdev objects 454 */ 455 456 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev, 457 void *object, 458 void *arg); 459 460 /** 461 * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list 462 * @vdev: vdev object 463 * @handler: the handler will be called for each object of requested type 464 * the handler should be implemented to perform required operation 465 * @arg: agruments passed by caller 466 * @dbg_id: id of the caller 467 * 468 * API to be used for performing the operations on all PEER objects 469 * of vdev 470 * 471 * Return: SUCCESS/FAILURE 472 */ 473 QDF_STATUS wlan_objmgr_iterate_peerobj_list( 474 struct wlan_objmgr_vdev *vdev, 475 wlan_objmgr_vdev_op_handler handler, 476 void *arg, wlan_objmgr_ref_dbgid dbg_id); 477 478 /** 479 * wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list 480 * @vdev: vdev object 481 * @dbg_id: id of the caller 482 * 483 * API to be used for populating the list of logically deleted peers from the 484 * vdev's peer list 485 * 486 * The caller of this function should free the memory allocated for the 487 * peerlist and the peer member in the list 488 * Also the peer ref release is handled by the caller 489 * 490 * Return: list of peer pointers 491 * NULL on FAILURE 492 */ 493 qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list( 494 struct wlan_objmgr_vdev *vdev, 495 wlan_objmgr_ref_dbgid dbg_id); 496 497 /** 498 * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev 499 * comp object creation 500 * @vdev: VDEV object 501 * @id: Component id 502 * 503 * API to create component private object in run time, this would 504 * be used for features which gets enabled in run time 505 * 506 * Return: SUCCESS on successful creation 507 * On FAILURE (appropriate failure codes are returned) 508 */ 509 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation( 510 struct wlan_objmgr_vdev *vdev, 511 enum wlan_umac_comp_id id); 512 513 /** 514 * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp 515 * object deletion 516 * @vdev: VDEV object 517 * @id: Component id 518 * 519 * API to destroy component private object in run time, this would 520 * be used for features which gets disabled in run time 521 * 522 * Return: SUCCESS on successful deletion 523 * On FAILURE (appropriate failure codes are returned) 524 */ 525 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion( 526 struct wlan_objmgr_vdev *vdev, 527 enum wlan_umac_comp_id id); 528 529 /** 530 * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object 531 * @vdev: VDEV object 532 * @id: Component id 533 * 534 * API to get component private object 535 * 536 * Return: void *ptr on SUCCESS 537 * NULL on Failure 538 */ 539 void *wlan_objmgr_vdev_get_comp_private_obj( 540 struct wlan_objmgr_vdev *vdev, 541 enum wlan_umac_comp_id id); 542 543 /* Util APIs */ 544 545 /** 546 * wlan_vdev_get_pdev() - get pdev 547 * @vdev: VDEV object 548 * 549 * API to get pdev object pointer from vdev 550 * 551 * Return: pdev object pointer 552 */ 553 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev( 554 struct wlan_objmgr_vdev *vdev) 555 { 556 return vdev->vdev_objmgr.wlan_pdev; 557 } 558 559 /** 560 * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list 561 * @peer_list: qdf_list_t 562 * 563 * API to get the head vdev of given vdev (of pdev's vdev list) 564 * 565 * Caller need to acquire lock with wlan_vdev_obj_lock() 566 * 567 * Return: 568 * @peer: head peer 569 */ 570 static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head( 571 qdf_list_t *vdev_list) 572 { 573 struct wlan_objmgr_vdev *vdev; 574 qdf_list_node_t *vdev_node = NULL; 575 576 /* This API is invoked with lock acquired, do not add log prints */ 577 if (qdf_list_peek_front(vdev_list, &vdev_node) != QDF_STATUS_SUCCESS) 578 return NULL; 579 580 vdev = qdf_container_of(vdev_node, struct wlan_objmgr_vdev, vdev_node); 581 return vdev; 582 } 583 584 585 /** 586 * wlan_vdev_get_next_vdev_of_pdev() - get next vdev 587 * @vdev: VDEV object 588 * 589 * API to get next vdev object pointer of vdev 590 * 591 * Caller need to acquire lock with wlan_vdev_obj_lock() 592 * 593 * Return: 594 * @vdev_next: VDEV object 595 */ 596 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev( 597 qdf_list_t *vdev_list, 598 struct wlan_objmgr_vdev *vdev) 599 { 600 struct wlan_objmgr_vdev *vdev_next; 601 qdf_list_node_t *node = &vdev->vdev_node; 602 qdf_list_node_t *next_node = NULL; 603 604 /* This API is invoked with lock acquired, do not add log prints */ 605 if (!node) 606 return NULL; 607 608 if (qdf_list_peek_next(vdev_list, node, &next_node) != 609 QDF_STATUS_SUCCESS) 610 return NULL; 611 612 vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev, 613 vdev_node); 614 return vdev_next; 615 } 616 617 618 619 /** 620 * wlan_vdev_set_pdev() - set pdev 621 * @vdev: VDEV object 622 * @pdev: PDEV object 623 * 624 * API to get pdev object pointer from vdev 625 * 626 * Caller need to acquire lock with wlan_vdev_obj_lock() 627 * 628 * Return: void 629 */ 630 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev, 631 struct wlan_objmgr_pdev *pdev) 632 { 633 /* This API is invoked with lock acquired, do not add log prints */ 634 vdev->vdev_objmgr.wlan_pdev = pdev; 635 } 636 637 /** 638 * wlan_vdev_get_psoc() - get psoc 639 * @vdev: VDEV object 640 * 641 * API to get pdev object pointer from vdev 642 * 643 * Return: psoc object pointer 644 */ 645 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc( 646 struct wlan_objmgr_vdev *vdev) 647 { 648 struct wlan_objmgr_pdev *pdev; 649 struct wlan_objmgr_psoc *psoc = NULL; 650 651 pdev = wlan_vdev_get_pdev(vdev); 652 if (!pdev) 653 return NULL; 654 655 psoc = wlan_pdev_get_psoc(pdev); 656 657 return psoc; 658 } 659 660 /** 661 * wlan_vdev_mlme_set_opmode() - set vdev opmode 662 * @vdev: VDEV object 663 * @mode: VDEV op mode 664 * 665 * API to set opmode in vdev object 666 * 667 * Return: void 668 */ 669 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev, 670 enum QDF_OPMODE mode) 671 { 672 vdev->vdev_mlme.vdev_opmode = mode; 673 } 674 675 /** 676 * wlan_vdev_mlme_get_opmode() - get vdev opmode 677 * @vdev: VDEV object 678 * 679 * API to set opmode of vdev object 680 * 681 * Return: 682 * @mode: VDEV op mode 683 */ 684 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode( 685 struct wlan_objmgr_vdev *vdev) 686 { 687 return vdev->vdev_mlme.vdev_opmode; 688 } 689 690 /** 691 * wlan_vdev_mlme_set_macaddr() - set vdev macaddr 692 * @vdev: VDEV object 693 * @macaddr: MAC address 694 * 695 * API to set macaddr in vdev object 696 * 697 * Caller need to acquire lock with wlan_vdev_obj_lock() 698 * 699 * Return: void 700 */ 701 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev, 702 uint8_t *macaddr) 703 { 704 /* This API is invoked with lock acquired, do not add log prints */ 705 WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr); 706 } 707 708 /** 709 * wlan_vdev_mlme_get_macaddr() - get vdev macaddr 710 * @vdev: VDEV object 711 * 712 * API to get MAC address from vdev object 713 * 714 * Caller need to acquire lock with wlan_vdev_obj_lock() 715 * 716 * Return: 717 * @macaddr: MAC address 718 */ 719 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev) 720 { 721 /* This API is invoked with lock acquired, do not add log prints */ 722 return vdev->vdev_mlme.macaddr; 723 } 724 725 /** 726 * wlan_vdev_mlme_set_mataddr() - set vdev mataddr 727 * @vdev: VDEV object 728 * @mataddr: MAT address 729 * 730 * API to set mataddr in vdev object 731 * 732 * Caller need to acquire lock with wlan_vdev_obj_lock() 733 * 734 * Return: void 735 */ 736 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev, 737 uint8_t *mataddr) 738 { 739 /* This API is invoked with lock acquired, do not add log prints */ 740 WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr); 741 } 742 743 /** 744 * wlan_vdev_mlme_get_mataddr() - get mataddr 745 * @vdev: VDEV object 746 * 747 * API to get MAT address from vdev object 748 * 749 * Caller need to acquire lock with wlan_vdev_obj_lock() 750 * 751 * Return: 752 * @mataddr: MAT address 753 */ 754 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev) 755 { 756 /* This API is invoked with lock acquired, do not add log prints */ 757 return vdev->vdev_mlme.mataddr; 758 } 759 760 /** 761 * wlan_vdev_get_id() - get vdev id 762 * @vdev: VDEV object 763 * 764 * API to get vdev id 765 * 766 * Return: 767 * @id: vdev id 768 */ 769 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev) 770 { 771 return vdev->vdev_objmgr.vdev_id; 772 } 773 774 /** 775 * wlan_vdev_get_hw_macaddr() - get hw macaddr 776 * @vdev: VDEV object 777 * 778 * API to retrieve the HW MAC address from PDEV 779 * 780 * Caller need to acquire lock with wlan_vdev_obj_lock() 781 * 782 * Return: 783 * @macaddr: HW MAC address 784 */ 785 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev) 786 { 787 struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev); 788 789 /* This API is invoked with lock acquired, do not add log prints */ 790 if (pdev) 791 return wlan_pdev_get_hw_macaddr(pdev); 792 else 793 return NULL; 794 } 795 796 /** 797 * wlan_vdev_obj_lock() - Acquire VDEV spinlock 798 * @vdev: VDEV object 799 * 800 * API to acquire VDEV lock 801 * Parent lock should not be taken in child lock context 802 * but child lock can be taken in parent lock context 803 * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) 804 * 805 * Return: void 806 */ 807 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev) 808 { 809 qdf_spin_lock_bh(&vdev->vdev_lock); 810 } 811 812 /** 813 * wlan_vdev_obj_unlock() - Release VDEV spinlock 814 * @vdev: VDEV object 815 * 816 * API to Release VDEV lock 817 * 818 * Return: void 819 */ 820 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev) 821 { 822 qdf_spin_unlock_bh(&vdev->vdev_lock); 823 } 824 825 /** 826 * wlan_vdev_mlme_set_bss_chan() - set bss chan 827 * @vdev: VDEV object 828 * @bss_chan: Channel 829 * 830 * API to set the BSS channel 831 * 832 * Return: void 833 */ 834 static inline void wlan_vdev_mlme_set_bss_chan( 835 struct wlan_objmgr_vdev *vdev, 836 struct wlan_channel *bss_chan) 837 { 838 vdev->vdev_mlme.bss_chan = bss_chan; 839 } 840 841 /** 842 * wlan_vdev_mlme_get_bss_chan() - get bss chan 843 * @vdev: VDEV object 844 * 845 * API to get the BSS channel 846 * 847 * Return: 848 * @bss_chan: Channel 849 */ 850 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan( 851 struct wlan_objmgr_vdev *vdev) 852 { 853 return vdev->vdev_mlme.bss_chan; 854 } 855 856 /** 857 * wlan_vdev_mlme_set_des_chan() - set desired chan 858 * @vdev: VDEV object 859 * @des_chan: Channel configured by user 860 * 861 * API to set the desired channel 862 * 863 * Return: void 864 */ 865 static inline void wlan_vdev_mlme_set_des_chan( 866 struct wlan_objmgr_vdev *vdev, 867 struct wlan_channel *des_chan) 868 { 869 vdev->vdev_mlme.des_chan = des_chan; 870 } 871 872 /** 873 * wlan_vdev_mlme_get_des_chan() - get desired chan 874 * @vdev: VDEV object 875 * 876 * API to get the desired channel 877 * 878 * Return: 879 * @des_chan: Channel configured by user 880 */ 881 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan( 882 struct wlan_objmgr_vdev *vdev) 883 { 884 return vdev->vdev_mlme.des_chan; 885 } 886 887 /** 888 * wlan_vdev_mlme_feat_cap_set() - set feature caps 889 * @vdev: VDEV object 890 * @cap: capabilities to be set 891 * 892 * API to set MLME feature capabilities 893 * 894 * Return: void 895 */ 896 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev, 897 uint32_t cap) 898 { 899 vdev->vdev_mlme.vdev_feat_caps |= cap; 900 } 901 902 /** 903 * wlan_vdev_mlme_feat_cap_clear() - clear feature caps 904 * @vdev: VDEV object 905 * @cap: capabilities to be cleared 906 * 907 * API to clear MLME feature capabilities 908 * 909 * Return: void 910 */ 911 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev, 912 uint32_t cap) 913 { 914 vdev->vdev_mlme.vdev_feat_caps &= ~cap; 915 } 916 917 /** 918 * wlan_vdev_mlme_feat_cap_get() - get feature caps 919 * @vdev: VDEV object 920 * @cap: capabilities to be checked 921 * 922 * API to know MLME feature capability is set or not 923 * 924 * Return: 1 -- if capabilities set 925 * 0 -- if capabilities clear 926 */ 927 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev, 928 uint32_t cap) 929 { 930 return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0; 931 } 932 933 /** 934 * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps 935 * @vdev: VDEV object 936 * @cap: capabilities to be set 937 * 938 * API to set the MLME extensive feature capabilities 939 * 940 * Return: void 941 */ 942 static inline void wlan_vdev_mlme_feat_ext_cap_set( 943 struct wlan_objmgr_vdev *vdev, 944 uint32_t cap) 945 { 946 vdev->vdev_mlme.vdev_feat_ext_caps |= cap; 947 } 948 949 /** 950 * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps 951 * @vdev: VDEV object 952 * @cap: capabilities to be cleared 953 * 954 * API to clear the MLME extensive feature capabilities 955 * 956 * Return: void 957 */ 958 static inline void wlan_vdev_mlme_feat_ext_cap_clear( 959 struct wlan_objmgr_vdev *vdev, 960 uint32_t cap) 961 { 962 vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap; 963 } 964 965 /** 966 * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps 967 * @vdev: VDEV object 968 * @cap: capabilities to be checked 969 * 970 * API to know MLME ext feature capability is set or not 971 * 972 * Return: 1 -- if capabilities set 973 * 0 -- if capabilities clear 974 */ 975 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get( 976 struct wlan_objmgr_vdev *vdev, 977 uint32_t cap) 978 { 979 return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0; 980 } 981 982 /** 983 * wlan_vdev_mlme_cap_set() - mlme caps set 984 * @vdev: VDEV object 985 * @cap: capabilities to be set 986 * 987 * API to set the MLME capabilities 988 * 989 * Return: void 990 */ 991 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev, 992 uint32_t cap) 993 { 994 vdev->vdev_mlme.vdev_caps |= cap; 995 } 996 997 /** 998 * wlan_vdev_mlme_cap_clear() - mlme caps clear 999 * @vdev: VDEV object 1000 * @cap: capabilities to be cleared 1001 * 1002 * API to clear the MLME capabilities 1003 * 1004 * Return: void 1005 */ 1006 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev, 1007 uint32_t cap) 1008 { 1009 vdev->vdev_mlme.vdev_caps &= ~cap; 1010 } 1011 1012 /** 1013 * wlan_vdev_mlme_cap_get() - get mlme caps 1014 * @vdev: VDEV object 1015 * @cap: capabilities to be checked 1016 * 1017 * API to know MLME capability is set or not 1018 * 1019 * Return: 1 -- if capabilities set 1020 * 0 -- if capabilities clear 1021 */ 1022 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev, 1023 uint32_t cap) 1024 { 1025 return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0; 1026 } 1027 1028 /** 1029 * wlan_vdev_mlme_get_state() - get mlme state 1030 * @vdev: VDEV object 1031 * 1032 * API to get MLME state 1033 * 1034 * Return: state of MLME 1035 */ 1036 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state( 1037 struct wlan_objmgr_vdev *vdev) 1038 { 1039 return vdev->vdev_mlme.mlme_state; 1040 } 1041 1042 /** 1043 * wlan_vdev_mlme_get_substate() - get mlme substate 1044 * @vdev: VDEV object 1045 * 1046 * API to get VDEV MLME substate 1047 * 1048 * Return: substate of VDEV MLME 1049 */ 1050 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate( 1051 struct wlan_objmgr_vdev *vdev) 1052 { 1053 return vdev->vdev_mlme.mlme_substate; 1054 } 1055 1056 /** 1057 * wlan_vdev_set_selfpeer() - set self peer 1058 * @vdev: VDEV object 1059 * @peer: peer pointer 1060 * 1061 * API to set the self peer of VDEV 1062 * 1063 * Return: void 1064 */ 1065 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev, 1066 struct wlan_objmgr_peer *peer) 1067 { 1068 vdev->vdev_objmgr.self_peer = peer; 1069 } 1070 1071 /** 1072 * wlan_vdev_get_selfpeer() - get self peer 1073 * @vdev: VDEV object 1074 * 1075 * API to get the self peer of VDEV 1076 * 1077 * Return: 1078 * @peer: peer pointer 1079 */ 1080 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer( 1081 struct wlan_objmgr_vdev *vdev) 1082 { 1083 return vdev->vdev_objmgr.self_peer; 1084 } 1085 1086 /** 1087 * wlan_vdev_set_bsspeer() - set bss peer 1088 * @vdev: VDEV object 1089 * @peer: BSS peer pointer 1090 * 1091 * API to set the BSS peer of VDEV 1092 * 1093 * Return: void 1094 */ 1095 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev, 1096 struct wlan_objmgr_peer *peer) 1097 { 1098 vdev->vdev_objmgr.bss_peer = peer; 1099 } 1100 1101 /** 1102 * wlan_vdev_get_bsspeer() - get bss peer 1103 * @vdev: VDEV object 1104 * 1105 * API to get the BSS peer of VDEV, wlan_objmgr_vdev_try_get_bsspeer API 1106 * preferred to use outside obj manager to take and handle ref count of 1107 * bss_peer with ref debug ID. 1108 * 1109 * Return: 1110 * @peer: BSS peer pointer 1111 */ 1112 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer( 1113 struct wlan_objmgr_vdev *vdev) 1114 { 1115 return vdev->vdev_objmgr.bss_peer; 1116 } 1117 1118 /** 1119 * wlan_objmgr_vdev_find_peer_by_mac() - get a peer with given mac from vdev 1120 * @vdev: VDEV object 1121 * @peer_mac: mac address of the peer to be found 1122 * @dbg_id: dbg_id of the module 1123 * 1124 * API to get and increment ref count of BSS peer of VDEV 1125 * 1126 * Return: 1127 * @peer: peer pointer to the peer of the mac address 1128 */ 1129 struct wlan_objmgr_peer * 1130 wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev, 1131 uint8_t *peer_mac, 1132 wlan_objmgr_ref_dbgid dbg_id); 1133 1134 /** 1135 * wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer 1136 * of VDEV 1137 * @vdev: VDEV object 1138 * @id: Object Manager ref debug id 1139 * 1140 * API to get and increment ref count of BSS peer of VDEV 1141 * 1142 * Return: 1143 * @peer: BSS peer pointer if bss peer is present and valid else NULL 1144 */ 1145 struct wlan_objmgr_peer *wlan_objmgr_vdev_try_get_bsspeer( 1146 struct wlan_objmgr_vdev *vdev, 1147 wlan_objmgr_ref_dbgid id); 1148 /** 1149 * wlan_vdev_get_ospriv() - get os priv pointer 1150 * @vdev: VDEV object 1151 * 1152 * API to get OS private pointer from VDEV 1153 * 1154 * Return: ospriv - private pointer 1155 */ 1156 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv( 1157 struct wlan_objmgr_vdev *vdev) 1158 { 1159 return vdev->vdev_nif.osdev; 1160 } 1161 1162 /** 1163 * wlan_vdev_reset_ospriv() - reset os priv pointer 1164 * @vdev: VDEV object 1165 * 1166 * API to reset OS private pointer in VDEV 1167 * 1168 * Return: void 1169 */ 1170 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev) 1171 { 1172 vdev->vdev_nif.osdev = NULL; 1173 } 1174 1175 /** 1176 * wlan_vdev_get_peer_count() - get vdev peer count 1177 * @vdev: VDEV object 1178 * 1179 * API to get peer count from VDEV 1180 * 1181 * Return: peer_count - vdev's peer count 1182 */ 1183 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev) 1184 { 1185 return vdev->vdev_objmgr.wlan_peer_count; 1186 } 1187 1188 /** 1189 * DOC: Examples to use VDEV ref count APIs 1190 * 1191 * In all the scenarios, the pair of API should be followed 1192 * other it lead to memory leak 1193 * 1194 * scenario 1: 1195 * 1196 * wlan_objmgr_vdev_obj_create() 1197 * ---- 1198 * wlan_objmgr_vdev_obj_delete() 1199 * 1200 * scenario 2: 1201 * 1202 * wlan_objmgr_vdev_get_ref() 1203 * ---- 1204 * the operations which are done on 1205 * vdev object 1206 * ---- 1207 * wlan_objmgr_vdev_release_ref() 1208 * 1209 * scenario 3: 1210 * 1211 * API to retrieve vdev (xxx_get_vdev_xxx()) 1212 * ---- 1213 * the operations which are done on 1214 * vdev object 1215 * ---- 1216 * wlan_objmgr_vdev_release_ref() 1217 */ 1218 1219 /** 1220 * wlan_objmgr_vdev_get_ref() - increment ref count 1221 * @vdev: VDEV object 1222 * @id: Object Manager ref debug id 1223 * 1224 * API to increment ref count of vdev 1225 * 1226 * Return: void 1227 */ 1228 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1229 void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev, 1230 wlan_objmgr_ref_dbgid id, 1231 const char *func, int line); 1232 1233 #define wlan_objmgr_vdev_get_ref(vdev, dbgid) \ 1234 wlan_objmgr_vdev_get_ref_debug(vdev, dbgid, __func__, __LINE__) 1235 #else 1236 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, 1237 wlan_objmgr_ref_dbgid id); 1238 #endif 1239 1240 /** 1241 * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed 1242 * @vdev: VDEV object 1243 * @id: Object Manager ref debug id 1244 * 1245 * API to increment ref count of vdev after checking valid object state 1246 * 1247 * Return: void 1248 */ 1249 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1250 QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev, 1251 wlan_objmgr_ref_dbgid id, 1252 const char *func, int line); 1253 1254 #define wlan_objmgr_vdev_try_get_ref(vdev, dbgid) \ 1255 wlan_objmgr_vdev_try_get_ref_debug(vdev, dbgid, \ 1256 __func__, __LINE__) 1257 #else 1258 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev, 1259 wlan_objmgr_ref_dbgid id); 1260 #endif 1261 1262 /** 1263 * wlan_objmgr_vdev_release_ref() - decrement ref count 1264 * @vdev: VDEV object 1265 * @id: Object Manager ref debug id 1266 * 1267 * API to decrement ref count of vdev, if ref count is 1, it initiates the 1268 * VDEV deletion 1269 * 1270 * Return: void 1271 */ 1272 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1273 void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev, 1274 wlan_objmgr_ref_dbgid id, 1275 const char *func, int line); 1276 1277 #define wlan_objmgr_vdev_release_ref(vdev, dbgid)\ 1278 wlan_objmgr_vdev_release_ref_debug(vdev, dbgid, \ 1279 __func__, __LINE__) 1280 #else 1281 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev, 1282 wlan_objmgr_ref_dbgid id); 1283 #endif 1284 1285 /** 1286 * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev 1287 * @pdev: PDEV object 1288 * @vdev_list: qdf_list_t 1289 * @vdev: VDEV object 1290 * @dbg_id: id of the caller 1291 * 1292 * API to get next active vdev object pointer of vdev 1293 * 1294 * Return: 1295 * @vdev_next: VDEV object 1296 */ 1297 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1298 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug( 1299 struct wlan_objmgr_pdev *pdev, 1300 qdf_list_t *vdev_list, 1301 struct wlan_objmgr_vdev *vdev, 1302 wlan_objmgr_ref_dbgid dbg_id, 1303 const char *func, int line); 1304 1305 #define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbgid) \ 1306 wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \ 1307 vdev, dbgid, __func__, __LINE__) 1308 #else 1309 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( 1310 struct wlan_objmgr_pdev *pdev, 1311 qdf_list_t *vdev_list, 1312 struct wlan_objmgr_vdev *vdev, 1313 wlan_objmgr_ref_dbgid dbg_id); 1314 #endif 1315 1316 /** 1317 * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list 1318 * @pdev: PDEV object 1319 * @dbg_id: id of the caller 1320 * 1321 * API to get the head active vdev of given pdev (of pdev's vdev list) 1322 * 1323 * Return: 1324 */ 1325 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1326 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug( 1327 struct wlan_objmgr_pdev *pdev, 1328 wlan_objmgr_ref_dbgid dbg_id, 1329 const char *func, int line); 1330 1331 #define wlan_pdev_peek_active_first_vdev(pdev, dbgid) \ 1332 wlan_pdev_peek_active_first_vdev_debug(pdev, dbgid, \ 1333 __func__, __LINE__) 1334 #else 1335 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev( 1336 struct wlan_objmgr_pdev *pdev, 1337 wlan_objmgr_ref_dbgid dbg_id); 1338 #endif 1339 1340 /** 1341 * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list 1342 * @vdev: VDEV object 1343 * @vdev_list: qdf_list_t 1344 * @dbg_id: id of the caller 1345 * 1346 * API to get the head active vdev of given vdev (of pdev's vdev list) 1347 * 1348 * Return: 1349 * @peer: head peer 1350 */ 1351 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1352 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug( 1353 struct wlan_objmgr_pdev *pdev, 1354 qdf_list_t *vdev_list, 1355 wlan_objmgr_ref_dbgid dbg_id, 1356 const char *func, int line); 1357 1358 #define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbgid) \ 1359 wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \ 1360 dbgid, __func__, __LINE__) 1361 #else 1362 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( 1363 struct wlan_objmgr_pdev *pdev, 1364 qdf_list_t *vdev_list, 1365 wlan_objmgr_ref_dbgid dbg_id); 1366 #endif 1367 1368 /** 1369 * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed 1370 * @vdev: VDEV object 1371 * 1372 * API to invokes registered callbacks to notify about peer freed 1373 * 1374 * Return: void 1375 */ 1376 void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev); 1377 1378 /** 1379 * wlan_vdev_set_max_peer_count() - set max peer count 1380 * @vdev: VDEV object 1381 * @count: Max peer count 1382 * 1383 * API to set max peer count of VDEV 1384 * 1385 * Return: void 1386 */ 1387 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev, 1388 uint16_t count) 1389 { 1390 vdev->vdev_objmgr.max_peer_count = count; 1391 } 1392 1393 /** 1394 * wlan_vdev_get_max_peer_count() - get max peer count 1395 * @vdev: VDEV object 1396 * 1397 * API to get max peer count of VDEV 1398 * 1399 * Return: max peer count 1400 */ 1401 static inline uint16_t wlan_vdev_get_max_peer_count( 1402 struct wlan_objmgr_vdev *vdev) 1403 { 1404 return vdev->vdev_objmgr.max_peer_count; 1405 } 1406 1407 /** 1408 * wlan_print_vdev_info() - print vdev members 1409 * @vdev: vdev object pointer 1410 * 1411 * Return: void 1412 */ 1413 #ifdef WLAN_OBJMGR_DEBUG 1414 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev); 1415 #else 1416 static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {} 1417 #endif 1418 1419 /** 1420 * wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock 1421 * @vdev: vdev object pointer 1422 * 1423 * Return: void 1424 */ 1425 #ifdef WLAN_OBJMGR_TRACE 1426 static inline void 1427 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev) 1428 { 1429 wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace); 1430 } 1431 #else 1432 static inline void 1433 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev) 1434 { 1435 } 1436 #endif 1437 1438 /** 1439 * wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock 1440 * @vdev: vdev object pointer 1441 * 1442 * Return: void 1443 */ 1444 #ifdef WLAN_OBJMGR_TRACE 1445 static inline void 1446 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev) 1447 { 1448 wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace); 1449 } 1450 #else 1451 static inline void 1452 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev) 1453 { 1454 } 1455 #endif 1456 1457 /** 1458 * wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list 1459 * @vdev: vdev object pointer 1460 * 1461 * Return: void 1462 */ 1463 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1464 static inline void 1465 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev) 1466 { 1467 wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace); 1468 } 1469 #else 1470 static inline void 1471 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev) 1472 { 1473 } 1474 #endif 1475 1476 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/ 1477