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