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 * @osifp: OS structure 243 * @macaddr[]: MAC address 244 * @mataddr[]: MAT address 245 */ 246 struct wlan_vdev_create_params { 247 enum QDF_OPMODE opmode; 248 uint32_t flags; 249 struct vdev_osif_priv *osifp; 250 uint8_t macaddr[QDF_MAC_ADDR_SIZE]; 251 uint8_t mataddr[QDF_MAC_ADDR_SIZE]; 252 }; 253 254 /** 255 * struct wlan_channel - channel structure 256 * @ch_freq: Channel in Mhz. 257 * @ch_ieee: IEEE channel number. 258 * @ch_freq_seg1: Channel Center frequeny for VHT80/160 and HE80/160. 259 * @ch_freq_seg2: Second channel Center frequency applicable for 80+80MHz mode. 260 * @ch_maxpower: Maximum tx power in dBm. 261 * @ch_flagext: Channel extension flags. 262 * @ch_flags: Channel flags. 263 * @ch_cfreq1: channel center frequency for primary 264 * @ch_cfreq2: channel center frequency for secondary 265 * @ch_width: Channel width. 266 * @ch_phymode: Channel phymode. 267 */ 268 struct wlan_channel { 269 uint16_t ch_freq; 270 uint8_t ch_ieee; 271 uint8_t ch_freq_seg1; 272 uint8_t ch_freq_seg2; 273 int8_t ch_maxpower; 274 uint16_t ch_flagext; 275 uint64_t ch_flags; 276 uint32_t ch_cfreq1; 277 uint32_t ch_cfreq2; 278 enum phy_ch_width ch_width; 279 enum wlan_phymode ch_phymode; 280 }; 281 282 /** 283 * struct wlan_objmgr_vdev_mlme - VDEV MLME specific sub structure 284 * @vdev_opmode: Opmode of VDEV 285 * @mlme_state: VDEV MLME SM state 286 * @mlme_state: VDEV MLME SM substate 287 * @bss_chan: BSS channel 288 * @des_chan: Desired channel, for STA Desired may not be used 289 * @vdev_caps: VDEV capabilities 290 * @vdev_feat_caps: VDEV feature caps 291 * @vdev_feat_ext_caps: VDEV Extended feature caps 292 * @vdev_op_flags: Operation flags 293 * @mataddr[]: MAT address 294 * @macaddr[]: VDEV self MAC address 295 * @ssid[]: SSID 296 * @ssid_len: SSID length 297 * @nss: Num. Spatial streams 298 * @tx_chainmask: Tx Chainmask 299 * @rx_chainmask: Rx Chainmask 300 * @tx_power: Tx power 301 * @max_rate: MAX rate 302 * @tx_mgmt_rate: TX Mgmt. Rate 303 * @per_band_mgmt_rate: Per-band TX Mgmt. Rate 304 */ 305 struct wlan_objmgr_vdev_mlme { 306 enum QDF_OPMODE vdev_opmode; 307 enum wlan_vdev_state mlme_state; 308 enum wlan_vdev_state mlme_substate; 309 struct wlan_channel *bss_chan; 310 struct wlan_channel *des_chan; 311 uint32_t vdev_caps; 312 uint32_t vdev_feat_caps; 313 uint32_t vdev_feat_ext_caps; 314 uint32_t vdev_op_flags; 315 uint8_t mataddr[QDF_MAC_ADDR_SIZE]; 316 uint8_t macaddr[QDF_MAC_ADDR_SIZE]; 317 }; 318 319 /** 320 * struct wlan_objmgr_vdev_nif - VDEV HDD specific sub structure 321 * @osdev: OS specific pointer 322 */ 323 struct wlan_objmgr_vdev_nif { 324 struct vdev_osif_priv *osdev; 325 }; 326 327 /** 328 * struct wlan_objmgr_vdev_objmgr - vdev object manager sub structure 329 * @vdev_id: VDEV id 330 * @print_cnt: Count to throttle Logical delete prints 331 * @self_peer: Self PEER 332 * @bss_peer: BSS PEER 333 * @wlan_peer_list: PEER list 334 * @wlan_pdev: PDEV pointer 335 * @wlan_peer_count: Peer count 336 * @max_peer_count: Max Peer count 337 * @c_flags: creation specific flags 338 * @ref_cnt: Ref count 339 * @ref_id_dbg: Array to track Ref count 340 * @wlan_objmgr_trace: Trace ref and deref 341 */ 342 struct wlan_objmgr_vdev_objmgr { 343 uint8_t vdev_id; 344 uint8_t print_cnt; 345 struct wlan_objmgr_peer *self_peer; 346 struct wlan_objmgr_peer *bss_peer; 347 qdf_list_t wlan_peer_list; 348 struct wlan_objmgr_pdev *wlan_pdev; 349 uint16_t wlan_peer_count; 350 uint16_t max_peer_count; 351 uint32_t c_flags; 352 qdf_atomic_t ref_cnt; 353 qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX]; 354 #ifdef WLAN_OBJMGR_REF_ID_TRACE 355 struct wlan_objmgr_trace trace; 356 #endif 357 }; 358 359 /** 360 * struct wlan_objmgr_vdev - VDEV common object 361 * @vdev_node: qdf list of pdev's vdev list 362 * @vdev_mlme: VDEV MLME substructure 363 * @vdev_objmgr: VDEV Object Mgr substructure 364 * @vdev_nif: VDEV HDD substructure 365 * @vdev_comp_priv_obj[]:Component's private objects list 366 * @obj_status[]: Component object status 367 * @obj_state: VDEV object state 368 * @vdev_lock: VDEV lock 369 */ 370 struct wlan_objmgr_vdev { 371 qdf_list_node_t vdev_node; 372 struct wlan_objmgr_vdev_mlme vdev_mlme; 373 struct wlan_objmgr_vdev_objmgr vdev_objmgr; 374 struct wlan_objmgr_vdev_nif vdev_nif; 375 void *vdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS]; 376 QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS]; 377 WLAN_OBJ_STATE obj_state; 378 qdf_spinlock_t vdev_lock; 379 }; 380 381 /** 382 ** APIs to Create/Delete Global object APIs 383 */ 384 /** 385 * wlan_objmgr_vdev_obj_create() - vdev object create 386 * @pdev: PDEV object on which this vdev gets created 387 * @params: VDEV create params from HDD 388 * 389 * Creates vdev object, intializes with default values 390 * Attaches to psoc and pdev objects 391 * Invokes the registered notifiers to create component object 392 * 393 * Return: Handle to struct wlan_objmgr_vdev on successful creation, 394 * NULL on Failure (on Mem alloc failure and Component objects 395 * Failure) 396 */ 397 struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create( 398 struct wlan_objmgr_pdev *pdev, 399 struct wlan_vdev_create_params *params); 400 401 /** 402 * wlan_objmgr_vdev_obj_delete() - vdev object delete 403 * @vdev: vdev object 404 * 405 * Logically deletes VDEV object, 406 * Once all the references are released, object manager invokes the registered 407 * notifiers to destroy component objects 408 * 409 * Return: SUCCESS/FAILURE 410 */ 411 QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev); 412 413 /** 414 ** APIs to attach/detach component objects 415 */ 416 /** 417 * wlan_objmgr_vdev_component_obj_attach() - vdev comp object attach 418 * @vdev: VDEV object 419 * @id: Component id 420 * @comp_priv_obj: component's private object pointer 421 * @status: Component's private object creation status 422 * 423 * API to be used for attaching component object with VDEV common object 424 * 425 * Return: SUCCESS on successful storing of component's object in common object 426 * On FAILURE (appropriate failure codes are returned) 427 */ 428 QDF_STATUS wlan_objmgr_vdev_component_obj_attach( 429 struct wlan_objmgr_vdev *vdev, 430 enum wlan_umac_comp_id id, 431 void *comp_priv_obj, 432 QDF_STATUS status); 433 434 /** 435 * wlan_objmgr_vdev_component_obj_detach() - vdev comp object detach 436 * @vdev: VDEV object 437 * @id: Component id 438 * @comp_priv_obj: component's private object pointer 439 * 440 * API to be used for detaching component object with VDEV common object 441 * 442 * Return: SUCCESS on successful removal of component's object from common 443 * object 444 * On FAILURE (appropriate failure codes are returned) 445 */ 446 QDF_STATUS wlan_objmgr_vdev_component_obj_detach( 447 struct wlan_objmgr_vdev *vdev, 448 enum wlan_umac_comp_id id, 449 void *comp_priv_obj); 450 /* 451 ** APIs to operations on vdev objects 452 */ 453 454 typedef void (*wlan_objmgr_vdev_op_handler)(struct wlan_objmgr_vdev *vdev, 455 void *object, 456 void *arg); 457 458 /** 459 * wlan_objmgr_iterate_peerobj_list() - iterate vdev's peer list 460 * @vdev: vdev object 461 * @handler: the handler will be called for each object of requested type 462 * the handler should be implemented to perform required operation 463 * @arg: agruments passed by caller 464 * @dbg_id: id of the caller 465 * 466 * API to be used for performing the operations on all PEER objects 467 * of vdev 468 * 469 * Return: SUCCESS/FAILURE 470 */ 471 QDF_STATUS wlan_objmgr_iterate_peerobj_list( 472 struct wlan_objmgr_vdev *vdev, 473 wlan_objmgr_vdev_op_handler handler, 474 void *arg, wlan_objmgr_ref_dbgid dbg_id); 475 476 /** 477 * wlan_objmgr_vdev_get_log_del_peer_list() - vdev logically deleted peer list 478 * @vdev: vdev object 479 * @dbg_id: id of the caller 480 * 481 * API to be used for populating the list of logically deleted peers from the 482 * vdev's peer list 483 * 484 * The caller of this function should free the memory allocated for the 485 * peerlist and the peer member in the list 486 * Also the peer ref release is handled by the caller 487 * 488 * Return: list of peer pointers 489 * NULL on FAILURE 490 */ 491 qdf_list_t *wlan_objmgr_vdev_get_log_del_peer_list( 492 struct wlan_objmgr_vdev *vdev, 493 wlan_objmgr_ref_dbgid dbg_id); 494 495 /** 496 * wlan_objmgr_trigger_vdev_comp_priv_object_creation() - vdev 497 * comp object creation 498 * @vdev: VDEV object 499 * @id: Component id 500 * 501 * API to create component private object in run time, this would 502 * be used for features which gets enabled in run time 503 * 504 * Return: SUCCESS on successful creation 505 * On FAILURE (appropriate failure codes are returned) 506 */ 507 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_creation( 508 struct wlan_objmgr_vdev *vdev, 509 enum wlan_umac_comp_id id); 510 511 /** 512 * wlan_objmgr_trigger_vdev_comp_priv_object_deletion() - vdev comp 513 * object deletion 514 * @vdev: VDEV object 515 * @id: Component id 516 * 517 * API to destroy component private object in run time, this would 518 * be used for features which gets disabled in run time 519 * 520 * Return: SUCCESS on successful deletion 521 * On FAILURE (appropriate failure codes are returned) 522 */ 523 QDF_STATUS wlan_objmgr_trigger_vdev_comp_priv_object_deletion( 524 struct wlan_objmgr_vdev *vdev, 525 enum wlan_umac_comp_id id); 526 527 /** 528 * wlan_objmgr_vdev_get_comp_private_obj() - get vdev component private object 529 * @vdev: VDEV object 530 * @id: Component id 531 * 532 * API to get component private object 533 * 534 * Return: void *ptr on SUCCESS 535 * NULL on Failure 536 */ 537 void *wlan_objmgr_vdev_get_comp_private_obj( 538 struct wlan_objmgr_vdev *vdev, 539 enum wlan_umac_comp_id id); 540 541 /* Util APIs */ 542 543 /** 544 * wlan_vdev_get_pdev() - get pdev 545 * @vdev: VDEV object 546 * 547 * API to get pdev object pointer from vdev 548 * 549 * Return: pdev object pointer 550 */ 551 static inline struct wlan_objmgr_pdev *wlan_vdev_get_pdev( 552 struct wlan_objmgr_vdev *vdev) 553 { 554 return vdev->vdev_objmgr.wlan_pdev; 555 } 556 557 /** 558 * wlan_pdev_vdev_list_peek_head() - get first vdev from pdev list 559 * @peer_list: qdf_list_t 560 * 561 * API to get the head vdev of given vdev (of pdev's vdev list) 562 * 563 * Caller need to acquire lock with wlan_vdev_obj_lock() 564 * 565 * Return: 566 * @peer: head peer 567 */ 568 static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head( 569 qdf_list_t *vdev_list) 570 { 571 struct wlan_objmgr_vdev *vdev; 572 qdf_list_node_t *vdev_node = NULL; 573 574 /* This API is invoked with lock acquired, do not add log prints */ 575 if (qdf_list_peek_front(vdev_list, &vdev_node) != QDF_STATUS_SUCCESS) 576 return NULL; 577 578 vdev = qdf_container_of(vdev_node, struct wlan_objmgr_vdev, vdev_node); 579 return vdev; 580 } 581 582 583 /** 584 * wlan_vdev_get_next_vdev_of_pdev() - get next vdev 585 * @vdev: VDEV object 586 * 587 * API to get next vdev object pointer of vdev 588 * 589 * Caller need to acquire lock with wlan_vdev_obj_lock() 590 * 591 * Return: 592 * @vdev_next: VDEV object 593 */ 594 static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev( 595 qdf_list_t *vdev_list, 596 struct wlan_objmgr_vdev *vdev) 597 { 598 struct wlan_objmgr_vdev *vdev_next; 599 qdf_list_node_t *node = &vdev->vdev_node; 600 qdf_list_node_t *next_node = NULL; 601 602 /* This API is invoked with lock acquired, do not add log prints */ 603 if (!node) 604 return NULL; 605 606 if (qdf_list_peek_next(vdev_list, node, &next_node) != 607 QDF_STATUS_SUCCESS) 608 return NULL; 609 610 vdev_next = qdf_container_of(next_node, struct wlan_objmgr_vdev, 611 vdev_node); 612 return vdev_next; 613 } 614 615 616 617 /** 618 * wlan_vdev_set_pdev() - set pdev 619 * @vdev: VDEV object 620 * @pdev: PDEV object 621 * 622 * API to get pdev object pointer from vdev 623 * 624 * Caller need to acquire lock with wlan_vdev_obj_lock() 625 * 626 * Return: void 627 */ 628 static inline void wlan_vdev_set_pdev(struct wlan_objmgr_vdev *vdev, 629 struct wlan_objmgr_pdev *pdev) 630 { 631 /* This API is invoked with lock acquired, do not add log prints */ 632 vdev->vdev_objmgr.wlan_pdev = pdev; 633 } 634 635 /** 636 * wlan_vdev_get_psoc() - get psoc 637 * @vdev: VDEV object 638 * 639 * API to get pdev object pointer from vdev 640 * 641 * Return: psoc object pointer 642 */ 643 static inline struct wlan_objmgr_psoc *wlan_vdev_get_psoc( 644 struct wlan_objmgr_vdev *vdev) 645 { 646 struct wlan_objmgr_pdev *pdev; 647 struct wlan_objmgr_psoc *psoc = NULL; 648 649 pdev = wlan_vdev_get_pdev(vdev); 650 if (!pdev) 651 return NULL; 652 653 psoc = wlan_pdev_get_psoc(pdev); 654 655 return psoc; 656 } 657 658 /** 659 * wlan_vdev_mlme_set_opmode() - set vdev opmode 660 * @vdev: VDEV object 661 * @mode: VDEV op mode 662 * 663 * API to set opmode in vdev object 664 * 665 * Return: void 666 */ 667 static inline void wlan_vdev_mlme_set_opmode(struct wlan_objmgr_vdev *vdev, 668 enum QDF_OPMODE mode) 669 { 670 vdev->vdev_mlme.vdev_opmode = mode; 671 } 672 673 /** 674 * wlan_vdev_mlme_get_opmode() - get vdev opmode 675 * @vdev: VDEV object 676 * 677 * API to set opmode of vdev object 678 * 679 * Return: 680 * @mode: VDEV op mode 681 */ 682 static inline enum QDF_OPMODE wlan_vdev_mlme_get_opmode( 683 struct wlan_objmgr_vdev *vdev) 684 { 685 return vdev->vdev_mlme.vdev_opmode; 686 } 687 688 /** 689 * wlan_vdev_mlme_set_macaddr() - set vdev macaddr 690 * @vdev: VDEV object 691 * @macaddr: MAC address 692 * 693 * API to set macaddr in vdev object 694 * 695 * Caller need to acquire lock with wlan_vdev_obj_lock() 696 * 697 * Return: void 698 */ 699 static inline void wlan_vdev_mlme_set_macaddr(struct wlan_objmgr_vdev *vdev, 700 uint8_t *macaddr) 701 { 702 /* This API is invoked with lock acquired, do not add log prints */ 703 WLAN_ADDR_COPY(vdev->vdev_mlme.macaddr, macaddr); 704 } 705 706 /** 707 * wlan_vdev_mlme_get_macaddr() - get vdev macaddr 708 * @vdev: VDEV object 709 * 710 * API to get MAC address from vdev object 711 * 712 * Caller need to acquire lock with wlan_vdev_obj_lock() 713 * 714 * Return: 715 * @macaddr: MAC address 716 */ 717 static inline uint8_t *wlan_vdev_mlme_get_macaddr(struct wlan_objmgr_vdev *vdev) 718 { 719 /* This API is invoked with lock acquired, do not add log prints */ 720 return vdev->vdev_mlme.macaddr; 721 } 722 723 /** 724 * wlan_vdev_mlme_set_mataddr() - set vdev mataddr 725 * @vdev: VDEV object 726 * @mataddr: MAT address 727 * 728 * API to set mataddr in vdev object 729 * 730 * Caller need to acquire lock with wlan_vdev_obj_lock() 731 * 732 * Return: void 733 */ 734 static inline void wlan_vdev_mlme_set_mataddr(struct wlan_objmgr_vdev *vdev, 735 uint8_t *mataddr) 736 { 737 /* This API is invoked with lock acquired, do not add log prints */ 738 WLAN_ADDR_COPY(vdev->vdev_mlme.mataddr, mataddr); 739 } 740 741 /** 742 * wlan_vdev_mlme_get_mataddr() - get mataddr 743 * @vdev: VDEV object 744 * 745 * API to get MAT address from vdev object 746 * 747 * Caller need to acquire lock with wlan_vdev_obj_lock() 748 * 749 * Return: 750 * @mataddr: MAT address 751 */ 752 static inline uint8_t *wlan_vdev_mlme_get_mataddr(struct wlan_objmgr_vdev *vdev) 753 { 754 /* This API is invoked with lock acquired, do not add log prints */ 755 return vdev->vdev_mlme.mataddr; 756 } 757 758 /** 759 * wlan_vdev_get_id() - get vdev id 760 * @vdev: VDEV object 761 * 762 * API to get vdev id 763 * 764 * Return: 765 * @id: vdev id 766 */ 767 static inline uint8_t wlan_vdev_get_id(struct wlan_objmgr_vdev *vdev) 768 { 769 return vdev->vdev_objmgr.vdev_id; 770 } 771 772 /** 773 * wlan_vdev_get_hw_macaddr() - get hw macaddr 774 * @vdev: VDEV object 775 * 776 * API to retrieve the HW MAC address from PDEV 777 * 778 * Caller need to acquire lock with wlan_vdev_obj_lock() 779 * 780 * Return: 781 * @macaddr: HW MAC address 782 */ 783 static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev) 784 { 785 struct wlan_objmgr_pdev *pdev = wlan_vdev_get_pdev(vdev); 786 787 /* This API is invoked with lock acquired, do not add log prints */ 788 if (pdev) 789 return wlan_pdev_get_hw_macaddr(pdev); 790 else 791 return NULL; 792 } 793 794 /** 795 * wlan_vdev_obj_lock() - Acquire VDEV spinlock 796 * @vdev: VDEV object 797 * 798 * API to acquire VDEV lock 799 * Parent lock should not be taken in child lock context 800 * but child lock can be taken in parent lock context 801 * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) 802 * 803 * Return: void 804 */ 805 static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev) 806 { 807 qdf_spin_lock_bh(&vdev->vdev_lock); 808 } 809 810 /** 811 * wlan_vdev_obj_unlock() - Release VDEV spinlock 812 * @vdev: VDEV object 813 * 814 * API to Release VDEV lock 815 * 816 * Return: void 817 */ 818 static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev) 819 { 820 qdf_spin_unlock_bh(&vdev->vdev_lock); 821 } 822 823 /** 824 * wlan_vdev_mlme_set_bss_chan() - set bss chan 825 * @vdev: VDEV object 826 * @bss_chan: Channel 827 * 828 * API to set the BSS channel 829 * 830 * Return: void 831 */ 832 static inline void wlan_vdev_mlme_set_bss_chan( 833 struct wlan_objmgr_vdev *vdev, 834 struct wlan_channel *bss_chan) 835 { 836 vdev->vdev_mlme.bss_chan = bss_chan; 837 } 838 839 /** 840 * wlan_vdev_mlme_get_bss_chan() - get bss chan 841 * @vdev: VDEV object 842 * 843 * API to get the BSS channel 844 * 845 * Return: 846 * @bss_chan: Channel 847 */ 848 static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan( 849 struct wlan_objmgr_vdev *vdev) 850 { 851 return vdev->vdev_mlme.bss_chan; 852 } 853 854 /** 855 * wlan_vdev_mlme_set_des_chan() - set desired chan 856 * @vdev: VDEV object 857 * @des_chan: Channel configured by user 858 * 859 * API to set the desired channel 860 * 861 * Return: void 862 */ 863 static inline void wlan_vdev_mlme_set_des_chan( 864 struct wlan_objmgr_vdev *vdev, 865 struct wlan_channel *des_chan) 866 { 867 vdev->vdev_mlme.des_chan = des_chan; 868 } 869 870 /** 871 * wlan_vdev_mlme_get_des_chan() - get desired chan 872 * @vdev: VDEV object 873 * 874 * API to get the desired channel 875 * 876 * Return: 877 * @des_chan: Channel configured by user 878 */ 879 static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan( 880 struct wlan_objmgr_vdev *vdev) 881 { 882 return vdev->vdev_mlme.des_chan; 883 } 884 885 /** 886 * wlan_vdev_mlme_feat_cap_set() - set feature caps 887 * @vdev: VDEV object 888 * @cap: capabilities to be set 889 * 890 * API to set MLME feature capabilities 891 * 892 * Return: void 893 */ 894 static inline void wlan_vdev_mlme_feat_cap_set(struct wlan_objmgr_vdev *vdev, 895 uint32_t cap) 896 { 897 vdev->vdev_mlme.vdev_feat_caps |= cap; 898 } 899 900 /** 901 * wlan_vdev_mlme_feat_cap_clear() - clear feature caps 902 * @vdev: VDEV object 903 * @cap: capabilities to be cleared 904 * 905 * API to clear MLME feature capabilities 906 * 907 * Return: void 908 */ 909 static inline void wlan_vdev_mlme_feat_cap_clear(struct wlan_objmgr_vdev *vdev, 910 uint32_t cap) 911 { 912 vdev->vdev_mlme.vdev_feat_caps &= ~cap; 913 } 914 915 /** 916 * wlan_vdev_mlme_feat_cap_get() - get feature caps 917 * @vdev: VDEV object 918 * @cap: capabilities to be checked 919 * 920 * API to know MLME feature capability is set or not 921 * 922 * Return: 1 -- if capabilities set 923 * 0 -- if capabilities clear 924 */ 925 static inline uint8_t wlan_vdev_mlme_feat_cap_get(struct wlan_objmgr_vdev *vdev, 926 uint32_t cap) 927 { 928 return (vdev->vdev_mlme.vdev_feat_caps & cap) ? 1 : 0; 929 } 930 931 /** 932 * wlan_vdev_mlme_feat_ext_cap_set() - set ext feature caps 933 * @vdev: VDEV object 934 * @cap: capabilities to be set 935 * 936 * API to set the MLME extensive feature capabilities 937 * 938 * Return: void 939 */ 940 static inline void wlan_vdev_mlme_feat_ext_cap_set( 941 struct wlan_objmgr_vdev *vdev, 942 uint32_t cap) 943 { 944 vdev->vdev_mlme.vdev_feat_ext_caps |= cap; 945 } 946 947 /** 948 * wlan_vdev_mlme_feat_ext_cap_clear() - clear ext feature caps 949 * @vdev: VDEV object 950 * @cap: capabilities to be cleared 951 * 952 * API to clear the MLME extensive feature capabilities 953 * 954 * Return: void 955 */ 956 static inline void wlan_vdev_mlme_feat_ext_cap_clear( 957 struct wlan_objmgr_vdev *vdev, 958 uint32_t cap) 959 { 960 vdev->vdev_mlme.vdev_feat_ext_caps &= ~cap; 961 } 962 963 /** 964 * wlan_vdev_mlme_feat_ext_cap_get() - get feature ext caps 965 * @vdev: VDEV object 966 * @cap: capabilities to be checked 967 * 968 * API to know MLME ext feature capability is set or not 969 * 970 * Return: 1 -- if capabilities set 971 * 0 -- if capabilities clear 972 */ 973 static inline uint8_t wlan_vdev_mlme_feat_ext_cap_get( 974 struct wlan_objmgr_vdev *vdev, 975 uint32_t cap) 976 { 977 return (vdev->vdev_mlme.vdev_feat_ext_caps & cap) ? 1 : 0; 978 } 979 980 /** 981 * wlan_vdev_mlme_cap_set() - mlme caps set 982 * @vdev: VDEV object 983 * @cap: capabilities to be set 984 * 985 * API to set the MLME capabilities 986 * 987 * Return: void 988 */ 989 static inline void wlan_vdev_mlme_cap_set(struct wlan_objmgr_vdev *vdev, 990 uint32_t cap) 991 { 992 vdev->vdev_mlme.vdev_caps |= cap; 993 } 994 995 /** 996 * wlan_vdev_mlme_cap_clear() - mlme caps clear 997 * @vdev: VDEV object 998 * @cap: capabilities to be cleared 999 * 1000 * API to clear the MLME capabilities 1001 * 1002 * Return: void 1003 */ 1004 static inline void wlan_vdev_mlme_cap_clear(struct wlan_objmgr_vdev *vdev, 1005 uint32_t cap) 1006 { 1007 vdev->vdev_mlme.vdev_caps &= ~cap; 1008 } 1009 1010 /** 1011 * wlan_vdev_mlme_cap_get() - get mlme caps 1012 * @vdev: VDEV object 1013 * @cap: capabilities to be checked 1014 * 1015 * API to know MLME capability is set or not 1016 * 1017 * Return: 1 -- if capabilities set 1018 * 0 -- if capabilities clear 1019 */ 1020 static inline uint8_t wlan_vdev_mlme_cap_get(struct wlan_objmgr_vdev *vdev, 1021 uint32_t cap) 1022 { 1023 return (vdev->vdev_mlme.vdev_caps & cap) ? 1 : 0; 1024 } 1025 1026 /** 1027 * wlan_vdev_mlme_get_state() - get mlme state 1028 * @vdev: VDEV object 1029 * 1030 * API to get MLME state 1031 * 1032 * Return: state of MLME 1033 */ 1034 static inline enum wlan_vdev_state wlan_vdev_mlme_get_state( 1035 struct wlan_objmgr_vdev *vdev) 1036 { 1037 return vdev->vdev_mlme.mlme_state; 1038 } 1039 1040 /** 1041 * wlan_vdev_mlme_get_substate() - get mlme substate 1042 * @vdev: VDEV object 1043 * 1044 * API to get VDEV MLME substate 1045 * 1046 * Return: substate of VDEV MLME 1047 */ 1048 static inline enum wlan_vdev_state wlan_vdev_mlme_get_substate( 1049 struct wlan_objmgr_vdev *vdev) 1050 { 1051 return vdev->vdev_mlme.mlme_substate; 1052 } 1053 1054 /** 1055 * wlan_vdev_set_selfpeer() - set self peer 1056 * @vdev: VDEV object 1057 * @peer: peer pointer 1058 * 1059 * API to set the self peer of VDEV 1060 * 1061 * Return: void 1062 */ 1063 static inline void wlan_vdev_set_selfpeer(struct wlan_objmgr_vdev *vdev, 1064 struct wlan_objmgr_peer *peer) 1065 { 1066 vdev->vdev_objmgr.self_peer = peer; 1067 } 1068 1069 /** 1070 * wlan_vdev_get_selfpeer() - get self peer 1071 * @vdev: VDEV object 1072 * 1073 * API to get the self peer of VDEV 1074 * 1075 * Return: 1076 * @peer: peer pointer 1077 */ 1078 static inline struct wlan_objmgr_peer *wlan_vdev_get_selfpeer( 1079 struct wlan_objmgr_vdev *vdev) 1080 { 1081 return vdev->vdev_objmgr.self_peer; 1082 } 1083 1084 /** 1085 * wlan_vdev_set_bsspeer() - set bss peer 1086 * @vdev: VDEV object 1087 * @peer: BSS peer pointer 1088 * 1089 * API to set the BSS peer of VDEV 1090 * 1091 * Return: void 1092 */ 1093 static inline void wlan_vdev_set_bsspeer(struct wlan_objmgr_vdev *vdev, 1094 struct wlan_objmgr_peer *peer) 1095 { 1096 vdev->vdev_objmgr.bss_peer = peer; 1097 } 1098 1099 /** 1100 * wlan_vdev_get_bsspeer() - get bss peer 1101 * @vdev: VDEV object 1102 * 1103 * API to get the BSS peer of VDEV, wlan_objmgr_vdev_try_get_bsspeer API 1104 * preferred to use outside obj manager to take and handle ref count of 1105 * bss_peer with ref debug ID. 1106 * 1107 * Return: 1108 * @peer: BSS peer pointer 1109 */ 1110 static inline struct wlan_objmgr_peer *wlan_vdev_get_bsspeer( 1111 struct wlan_objmgr_vdev *vdev) 1112 { 1113 return vdev->vdev_objmgr.bss_peer; 1114 } 1115 1116 /** 1117 * wlan_objmgr_vdev_find_peer_by_mac() - get a peer with given mac from vdev 1118 * @vdev: VDEV object 1119 * @peer_mac: mac address of the peer to be found 1120 * @dbg_id: dbg_id of the module 1121 * 1122 * API to get and increment ref count of BSS peer of VDEV 1123 * 1124 * Return: 1125 * @peer: peer pointer to the peer of the mac address 1126 */ 1127 struct wlan_objmgr_peer * 1128 wlan_objmgr_vdev_find_peer_by_mac(struct wlan_objmgr_vdev *vdev, 1129 uint8_t *peer_mac, 1130 wlan_objmgr_ref_dbgid dbg_id); 1131 1132 /** 1133 * wlan_objmgr_vdev_try_get_bsspeer() - get and increment ref count of BSS peer 1134 * of VDEV 1135 * @vdev: VDEV object 1136 * @id: Object Manager ref debug id 1137 * 1138 * API to get and increment ref count of BSS peer of VDEV 1139 * 1140 * Return: 1141 * @peer: BSS peer pointer if bss peer is present and valid else NULL 1142 */ 1143 struct wlan_objmgr_peer *wlan_objmgr_vdev_try_get_bsspeer( 1144 struct wlan_objmgr_vdev *vdev, 1145 wlan_objmgr_ref_dbgid id); 1146 /** 1147 * wlan_vdev_get_ospriv() - get os priv pointer 1148 * @vdev: VDEV object 1149 * 1150 * API to get OS private pointer from VDEV 1151 * 1152 * Return: ospriv - private pointer 1153 */ 1154 static inline struct vdev_osif_priv *wlan_vdev_get_ospriv( 1155 struct wlan_objmgr_vdev *vdev) 1156 { 1157 return vdev->vdev_nif.osdev; 1158 } 1159 1160 /** 1161 * wlan_vdev_reset_ospriv() - reset os priv pointer 1162 * @vdev: VDEV object 1163 * 1164 * API to reset OS private pointer in VDEV 1165 * 1166 * Return: void 1167 */ 1168 static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev) 1169 { 1170 vdev->vdev_nif.osdev = NULL; 1171 } 1172 1173 /** 1174 * wlan_vdev_get_peer_count() - get vdev peer count 1175 * @vdev: VDEV object 1176 * 1177 * API to get peer count from VDEV 1178 * 1179 * Return: peer_count - vdev's peer count 1180 */ 1181 static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev) 1182 { 1183 return vdev->vdev_objmgr.wlan_peer_count; 1184 } 1185 1186 /** 1187 * DOC: Examples to use VDEV ref count APIs 1188 * 1189 * In all the scenarios, the pair of API should be followed 1190 * other it lead to memory leak 1191 * 1192 * scenario 1: 1193 * 1194 * wlan_objmgr_vdev_obj_create() 1195 * ---- 1196 * wlan_objmgr_vdev_obj_delete() 1197 * 1198 * scenario 2: 1199 * 1200 * wlan_objmgr_vdev_get_ref() 1201 * ---- 1202 * the operations which are done on 1203 * vdev object 1204 * ---- 1205 * wlan_objmgr_vdev_release_ref() 1206 * 1207 * scenario 3: 1208 * 1209 * API to retrieve vdev (xxx_get_vdev_xxx()) 1210 * ---- 1211 * the operations which are done on 1212 * vdev object 1213 * ---- 1214 * wlan_objmgr_vdev_release_ref() 1215 */ 1216 1217 /** 1218 * wlan_objmgr_vdev_get_ref() - increment ref count 1219 * @vdev: VDEV object 1220 * @id: Object Manager ref debug id 1221 * 1222 * API to increment ref count of vdev 1223 * 1224 * Return: void 1225 */ 1226 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1227 void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev, 1228 wlan_objmgr_ref_dbgid id, 1229 const char *func, int line); 1230 1231 #define wlan_objmgr_vdev_get_ref(vdev, dbgid) \ 1232 wlan_objmgr_vdev_get_ref_debug(vdev, dbgid, __func__, __LINE__) 1233 #else 1234 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, 1235 wlan_objmgr_ref_dbgid id); 1236 #endif 1237 1238 /** 1239 * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed 1240 * @vdev: VDEV object 1241 * @id: Object Manager ref debug id 1242 * 1243 * API to increment ref count of vdev after checking valid object state 1244 * 1245 * Return: void 1246 */ 1247 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1248 QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev, 1249 wlan_objmgr_ref_dbgid id, 1250 const char *func, int line); 1251 1252 #define wlan_objmgr_vdev_try_get_ref(vdev, dbgid) \ 1253 wlan_objmgr_vdev_try_get_ref_debug(vdev, dbgid, \ 1254 __func__, __LINE__) 1255 #else 1256 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev, 1257 wlan_objmgr_ref_dbgid id); 1258 #endif 1259 1260 /** 1261 * wlan_objmgr_vdev_release_ref() - decrement ref count 1262 * @vdev: VDEV object 1263 * @id: Object Manager ref debug id 1264 * 1265 * API to decrement ref count of vdev, if ref count is 1, it initiates the 1266 * VDEV deletion 1267 * 1268 * Return: void 1269 */ 1270 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1271 void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev, 1272 wlan_objmgr_ref_dbgid id, 1273 const char *func, int line); 1274 1275 #define wlan_objmgr_vdev_release_ref(vdev, dbgid)\ 1276 wlan_objmgr_vdev_release_ref_debug(vdev, dbgid, \ 1277 __func__, __LINE__) 1278 #else 1279 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev, 1280 wlan_objmgr_ref_dbgid id); 1281 #endif 1282 1283 /** 1284 * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev 1285 * @pdev: PDEV object 1286 * @vdev_list: qdf_list_t 1287 * @vdev: VDEV object 1288 * @dbg_id: id of the caller 1289 * 1290 * API to get next active vdev object pointer of vdev 1291 * 1292 * Return: 1293 * @vdev_next: VDEV object 1294 */ 1295 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1296 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug( 1297 struct wlan_objmgr_pdev *pdev, 1298 qdf_list_t *vdev_list, 1299 struct wlan_objmgr_vdev *vdev, 1300 wlan_objmgr_ref_dbgid dbg_id, 1301 const char *func, int line); 1302 1303 #define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbgid) \ 1304 wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \ 1305 vdev, dbgid, __func__, __LINE__) 1306 #else 1307 struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( 1308 struct wlan_objmgr_pdev *pdev, 1309 qdf_list_t *vdev_list, 1310 struct wlan_objmgr_vdev *vdev, 1311 wlan_objmgr_ref_dbgid dbg_id); 1312 #endif 1313 1314 /** 1315 * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list 1316 * @pdev: PDEV object 1317 * @dbg_id: id of the caller 1318 * 1319 * API to get the head active vdev of given pdev (of pdev's vdev list) 1320 * 1321 * Return: 1322 */ 1323 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1324 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug( 1325 struct wlan_objmgr_pdev *pdev, 1326 wlan_objmgr_ref_dbgid dbg_id, 1327 const char *func, int line); 1328 1329 #define wlan_pdev_peek_active_first_vdev(pdev, dbgid) \ 1330 wlan_pdev_peek_active_first_vdev_debug(pdev, dbgid, \ 1331 __func__, __LINE__) 1332 #else 1333 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev( 1334 struct wlan_objmgr_pdev *pdev, 1335 wlan_objmgr_ref_dbgid dbg_id); 1336 #endif 1337 1338 /** 1339 * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list 1340 * @vdev: VDEV object 1341 * @vdev_list: qdf_list_t 1342 * @dbg_id: id of the caller 1343 * 1344 * API to get the head active vdev of given vdev (of pdev's vdev list) 1345 * 1346 * Return: 1347 * @peer: head peer 1348 */ 1349 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1350 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug( 1351 struct wlan_objmgr_pdev *pdev, 1352 qdf_list_t *vdev_list, 1353 wlan_objmgr_ref_dbgid dbg_id, 1354 const char *func, int line); 1355 1356 #define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbgid) \ 1357 wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \ 1358 dbgid, __func__, __LINE__) 1359 #else 1360 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( 1361 struct wlan_objmgr_pdev *pdev, 1362 qdf_list_t *vdev_list, 1363 wlan_objmgr_ref_dbgid dbg_id); 1364 #endif 1365 1366 /** 1367 * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed 1368 * @vdev: VDEV object 1369 * 1370 * API to invokes registered callbacks to notify about peer freed 1371 * 1372 * Return: void 1373 */ 1374 void wlan_objmgr_vdev_peer_freed_notify(struct wlan_objmgr_vdev *vdev); 1375 1376 /** 1377 * wlan_vdev_set_max_peer_count() - set max peer count 1378 * @vdev: VDEV object 1379 * @count: Max peer count 1380 * 1381 * API to set max peer count of VDEV 1382 * 1383 * Return: void 1384 */ 1385 static inline void wlan_vdev_set_max_peer_count(struct wlan_objmgr_vdev *vdev, 1386 uint16_t count) 1387 { 1388 vdev->vdev_objmgr.max_peer_count = count; 1389 } 1390 1391 /** 1392 * wlan_vdev_get_max_peer_count() - get max peer count 1393 * @vdev: VDEV object 1394 * 1395 * API to get max peer count of VDEV 1396 * 1397 * Return: max peer count 1398 */ 1399 static inline uint16_t wlan_vdev_get_max_peer_count( 1400 struct wlan_objmgr_vdev *vdev) 1401 { 1402 return vdev->vdev_objmgr.max_peer_count; 1403 } 1404 1405 /** 1406 * wlan_print_vdev_info() - print vdev members 1407 * @vdev: vdev object pointer 1408 * 1409 * Return: void 1410 */ 1411 #ifdef WLAN_OBJMGR_DEBUG 1412 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev); 1413 #else 1414 static inline void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {} 1415 #endif 1416 1417 /** 1418 * wlan_objmgr_vdev_trace_init_lock() - Initialize trace lock 1419 * @vdev: vdev object pointer 1420 * 1421 * Return: void 1422 */ 1423 #ifdef WLAN_OBJMGR_TRACE 1424 static inline void 1425 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev) 1426 { 1427 wlan_objmgr_trace_init_lock(&vdev->vdev_objmgr.trace); 1428 } 1429 #else 1430 static inline void 1431 wlan_objmgr_vdev_trace_init_lock(struct wlan_objmgr_vdev *vdev) 1432 { 1433 } 1434 #endif 1435 1436 /** 1437 * wlan_objmgr_vdev_trace_deinit_lock() - Deinitialize trace lock 1438 * @vdev: vdev object pointer 1439 * 1440 * Return: void 1441 */ 1442 #ifdef WLAN_OBJMGR_TRACE 1443 static inline void 1444 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev) 1445 { 1446 wlan_objmgr_trace_deinit_lock(&vdev->vdev_objmgr.trace); 1447 } 1448 #else 1449 static inline void 1450 wlan_objmgr_vdev_trace_deinit_lock(struct wlan_objmgr_vdev *vdev) 1451 { 1452 } 1453 #endif 1454 1455 /** 1456 * wlan_objmgr_vdev_trace_del_ref_list() - Delete trace ref list 1457 * @vdev: vdev object pointer 1458 * 1459 * Return: void 1460 */ 1461 #ifdef WLAN_OBJMGR_REF_ID_TRACE 1462 static inline void 1463 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev) 1464 { 1465 wlan_objmgr_trace_del_ref_list(&vdev->vdev_objmgr.trace); 1466 } 1467 #else 1468 static inline void 1469 wlan_objmgr_vdev_trace_del_ref_list(struct wlan_objmgr_vdev *vdev) 1470 { 1471 } 1472 #endif 1473 1474 #endif /* _WLAN_OBJMGR_VDEV_OBJ_H_*/ 1475