1 /* 2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /** 19 * DOC: Define the pdev data structure of UMAC 20 * Public APIs to perform operations on Global objects 21 */ 22 23 #ifndef _WLAN_OBJMGR_PDEV_OBJ_H_ 24 #define _WLAN_OBJMGR_PDEV_OBJ_H_ 25 26 #include <wlan_objmgr_cmn.h> 27 #include "wlan_objmgr_psoc_obj.h" 28 #include <target_if_pub.h> 29 #include <qdf_defer.h> 30 31 /* STATUS: scanning */ 32 #define WLAN_PDEV_F_SCAN 0x00000001 33 /* STATUS: use short slot time*/ 34 #define WLAN_PDEV_F_SHSLOT 0x00000002 35 /* STATUS: channel switch event pending after DFS RADAR */ 36 #define WLAN_PDEV_F_DFS_CHANSWITCH_PENDING 0x00000004 37 /* TX Power: fixed rate */ 38 #define WLAN_PDEV_F_TXPOW_FIXED 0x00000008 39 /* STATUS: use short preamble */ 40 #define WLAN_PDEV_F_SHPREAMBLE 0x00000010 41 /* CONF: do alignment pad */ 42 #define WLAN_PDEV_F_DATAPAD 0x00000020 43 /* STATUS: protection enabled */ 44 #define WLAN_PDEV_F_USEPROT 0x00000040 45 /* STATUS: use barker preamble*/ 46 #define WLAN_PDEV_F_USEBARKER 0x00000080 47 /* CONF: DISABLE 2040 coexistence */ 48 #define WLAN_PDEV_F_COEXT_DISABLE 0x00000100 49 /* STATE: scan pending */ 50 #define WLAN_PDEV_F_SCAN_PENDING 0x00000200 51 /* CONF: send regclassids in country ie */ 52 #define WLAN_PDEV_F_REGCLASS 0x00000400 53 /* CONF: block the use of DFS channels */ 54 #define WLAN_PDEV_F_BLKDFSCHAN 0x00000800 55 /* STATUS: 11D in used */ 56 #define WLAN_PDEV_F_DOT11D 0x00001000 57 /* STATUS: 11D channel-switch detected */ 58 #define WLAN_PDEV_F_RADAR 0x00002000 59 /* CONF: A-MPDU supported */ 60 #define WLAN_PDEV_F_AMPDU 0x00004000 61 /* CONF: A-MSDU supported */ 62 #define WLAN_PDEV_F_AMSDU 0x00008000 63 /* CONF: HT traffic protected */ 64 #define WLAN_PDEV_F_HTPROT 0x00010000 65 /* CONF: Reset once */ 66 #define WLAN_PDEV_F_RESET 0x00020000 67 /* CONF: ignore 11d beacon */ 68 #define WLAN_PDEV_F_IGNORE_11D_BEACON 0x00040000 69 /* HT CAP IE present */ 70 #define WLAN_PDEV_F_HTVIE 0x00080000 71 /* radio in middle of CSA */ 72 #define WLAN_PDEV_F_CSA_WAIT 0x00100000 73 /* wnm support flag */ 74 #define WLAN_PDEV_F_WNM 0x00200000 75 #define WLAN_PDEV_F_2G_CSA 0x00400000 76 /* enhanced independent repeater */ 77 #define WLAN_PDEV_F_ENH_REP_IND 0x00800000 78 /* Disable Tx AMSDU for station vap */ 79 #define WLAN_PDEV_F_STA_AMPDU_DIS 0x01000000 80 /* do not send probe request in passive channel */ 81 #define WLAN_PDEV_F_STRICT_PSCAN_EN 0x02000000 82 /* Multivdev restart enabled with Bitmap */ 83 #define WLAN_PDEV_F_MULTIVDEV_RESTART_BMAP 0x04000000 84 /* Chan concurrency enabled */ 85 #define WLAN_PDEV_F_CHAN_CONCURRENCY 0x08000000 86 /* Multivdev restart enabled */ 87 #define WLAN_PDEV_F_MULTIVDEV_RESTART 0x10000000 88 /* MBSS IE enable */ 89 #define WLAN_PDEV_F_MBSS_IE_ENABLE 0x20000000 90 /* VDEV Peer delete all */ 91 #define WLAN_PDEV_F_DELETE_ALL_PEER 0x40000000 92 /* PDEV BEacon Protection */ 93 #define WLAN_PDEV_F_BEACON_PROTECTION 0x80000000 94 95 /* PDEV ext flags */ 96 /* CFR support enabled */ 97 #define WLAN_PDEV_FEXT_CFR_EN 0x00000001 98 /* EMA AP support enable */ 99 #define WLAN_PDEV_FEXT_EMA_AP_ENABLE 0x00000002 100 /* scan radio support */ 101 #define WLAN_PDEV_FEXT_SCAN_RADIO 0x00000004 102 /* DFS disable, valid only for scan radio supported pdevs */ 103 #define WLAN_PDEV_FEXT_SCAN_RADIO_DFS_DIS 0x00000008 104 /* normal Spectral scan support disable */ 105 #define WLAN_PDEV_FEXT_NORMAL_SPECTRAL_SCAN_DIS 0x00000010 106 /* agile Spectral scan support disable for 20/40/80 MHz */ 107 #define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_DIS 0x00000020 108 /* agile Spectral scan support disable for 160 MHz */ 109 #define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_160_DIS 0x00000040 110 /* agile Spectral scan support disable for 80+80 MHz */ 111 #define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_80P80_DIS 0x00000080 112 /* agile Spectral scan support disable for 320 MHz */ 113 #define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_320_DIS 0x00000100 114 /* WiFi Radar support enabled */ 115 #define WLAN_PDEV_FEXT_WIFI_RADAR_ENABLE 0x00000200 116 /* Scan blanking support enabled.valid only for scan radio supported pdevs */ 117 #define WLAN_PDEV_FEXT_SCAN_BLANKING_EN 0x00000400 118 /* Overlapping frequency support */ 119 #define WLAN_PDEV_FEXT_OVERLAPPING_FREQ 0x00000800 120 121 /* PDEV op flags */ 122 /* Enable htrate for wep and tkip */ 123 #define WLAN_PDEV_OP_WEP_TKIP_HTRATE 0x00000001 124 /* non HT AP found flag */ 125 #define WLAN_PDEV_OP_NON_HT_AP 0x00000002 126 /* block the use of DFS channels flag */ 127 #define WLAN_PDEV_OP_BLK_DFS_CHAN 0x00000004 128 /* 11.h flag */ 129 #define WLAN_PDEV_OP_DOTH 0x00000008 130 /* Off-channel support enabled */ 131 #define WLAN_PDEV_OP_OFFCHAN 0x00000010 132 #define WLAN_PDEV_OP_HT20ADHOC 0x00000020 133 #define WLAN_PDEV_OP_HT40ADHOC 0x00000040 134 #define WLAN_PDEV_OP_HTADHOC_AGGR 0x00000080 135 /* disallow CC change when assoc completes */ 136 #define WLAN_PDEV_OP_DISALLOW_AUTO_CC 0x00000100 137 /* Is P2P Enabled? */ 138 #define WLAN_PDEV_OP_P2P 0x00000200 139 /* disallowed */ 140 #define WLAN_PDEV_OP_IGNORE_DYNHALT 0x00000400 141 /* overwrite probe response IE with beacon IE */ 142 #define WLAN_PDEV_OP_OVERRIDE_PROBERESP 0x00000800 143 #define WLAN_PDEV_OP_DROPSTA_QUERY 0x00001000 144 #define WLAN_PDEV_OP_BLK_REPORT_FLOOD 0x00002000 145 /* Offchan scan */ 146 #define WLAN_PDEV_OP_OFFCHAN_SCAN 0x00004000 147 /*Consider OBSS non-erp to change to long slot*/ 148 #define WLAN_PDEV_OP_OBSS_LONGSLOT 0x00008000 149 /* enable/disable min rssi cli block */ 150 #define WLAN_PDEV_OP_MIN_RSSI_ENABLE 0x00010000 151 /* PDEV VDEV restart is in progress */ 152 #define WLAN_PDEV_OP_RESTART_INPROGRESS 0x00020000 153 /* PDEV MBSSID VDEV restart trigger */ 154 #define WLAN_PDEV_OP_MBSSID_RESTART 0x00040000 155 /* RADAR DETECT Defer */ 156 #define WLAN_PDEV_OP_RADAR_DETECT_DEFER 0x00080000 157 158 159 struct osif_pdev_priv; 160 161 /** 162 * struct wlan_objmgr_pdev_nif - pdev object nif structure 163 * @pdev_fw_caps: radio specific FW capabilities 164 * @pdev_feature_caps: radio specific feature capabilities 165 * @pdev_feature_ext_caps: radio specific feature capabilities extended 166 * @pdev_ospriv: OS specific pointer 167 * @macaddr: MAC address 168 * @notified_ap_vdev: ap vdev 169 */ 170 struct wlan_objmgr_pdev_nif { 171 uint32_t pdev_fw_caps; 172 uint32_t pdev_feature_caps; 173 uint32_t pdev_feature_ext_caps; 174 struct pdev_osif_priv *pdev_ospriv; 175 uint8_t macaddr[QDF_MAC_ADDR_SIZE]; 176 uint8_t notified_ap_vdev; 177 }; 178 179 /** 180 * struct wlan_objmgr_pdev_mlme - pdev object mlme structure 181 * @pdev_op_flags: PDEV operation flags, can be used to know the 182 * operation status (deletion progress, etc) 183 */ 184 struct wlan_objmgr_pdev_mlme { 185 uint32_t pdev_op_flags; 186 }; 187 188 /** 189 * struct wlan_beacon_process - wlan beacon structure 190 * @bcn_rate_limit: To indicate if beacon ratelimiting is enabled or not 191 * @wlan_beacon_count: Per pdev beacon count received 192 * @max_beacon_count: Per vdev max beacon count, defaults to 100 193 * @max_beacon_limit: Limit of beacons to be processed 194 * @dropped_beacon: Dropped beacons 195 */ 196 struct wlan_beacon_process { 197 bool bcn_rate_limit; 198 uint64_t wlan_beacon_count; 199 uint64_t max_beacon_count; 200 uint8_t max_beacon_limit; 201 uint64_t dropped_beacon; 202 }; 203 204 /** 205 * struct wlan_objmgr_pdev_objmgr - pdev object object manager structure 206 * @wlan_pdev_id: PDEV id 207 * @wlan_vdev_count: VDEVs count 208 * @max_vdev_count: Max no. of VDEVs supported by this PDEV 209 * @print_cnt: Count to throttle Logical delete prints 210 * @wlan_vdev_list: List maintains the VDEVs created on this PDEV 211 * @wlan_peer_count: Peer count 212 * @max_peer_count: Max Peer count 213 * @temp_peer_count: Temporary peer count 214 * @max_monitor_vdev_count: Max monitor vdev count 215 * @max_bridge_vdev_count: Max bridge vdev count 216 * @wlan_psoc: back pointer to PSOC, its attached to 217 * @ref_cnt: Ref count 218 * @ref_id_dbg: Array to track Ref count 219 * @wlan_mlo_vdev_count: MLO VDEVs count 220 * @wlan_mlo_bridge_vdev_count: MLO bridge VDEVs count 221 * @bcn: Struct to keep track of beacon count 222 */ 223 struct wlan_objmgr_pdev_objmgr { 224 uint8_t wlan_pdev_id; 225 uint8_t wlan_vdev_count; 226 uint8_t max_vdev_count; 227 uint8_t print_cnt; 228 qdf_list_t wlan_vdev_list; 229 uint16_t wlan_peer_count; 230 uint16_t max_peer_count; 231 uint16_t temp_peer_count; 232 uint8_t max_monitor_vdev_count; 233 uint8_t max_bridge_vdev_count; 234 struct wlan_objmgr_psoc *wlan_psoc; 235 qdf_atomic_t ref_cnt; 236 qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX]; 237 #ifdef WLAN_FEATURE_11BE_MLO 238 qdf_atomic_t wlan_mlo_vdev_count; 239 qdf_atomic_t wlan_mlo_bridge_vdev_count; 240 #endif 241 struct wlan_beacon_process bcn; 242 }; 243 244 /** 245 * struct wlan_objmgr_pdev - PDEV common object 246 * @current_chan_list: Active/current Channel list of the radio 247 * @pdev_nif: pdev nif structure 248 * @pdev_objmgr: pdev object manager structure 249 * @pdev_mlme: pdev MLME structure 250 * @pdev_comp_priv_obj: component's private object array 251 * @obj_status: object status of each component object 252 * @obj_state: object state 253 * @tgt_if_handle: Target interface handle 254 * @pdev_lock: lock to protect object 255 * @peer_free_lock: lock to protect peer object free 256 * @peer_free_list: list to hold freed peer 257 * @peer_obj_free_work:delayed work to be queued into workqueue 258 * @active_work_cnt: active work counts 259 * @standby_active: Pdev in standby mode while power down 260 */ 261 struct wlan_objmgr_pdev { 262 struct wlan_chan_list *current_chan_list; 263 struct wlan_objmgr_pdev_nif pdev_nif; 264 struct wlan_objmgr_pdev_objmgr pdev_objmgr; 265 struct wlan_objmgr_pdev_mlme pdev_mlme; 266 void *pdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS]; 267 QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS]; 268 WLAN_OBJ_STATE obj_state; 269 target_pdev_info_t *tgt_if_handle; 270 qdf_spinlock_t pdev_lock; 271 #ifdef FEATURE_DELAYED_PEER_OBJ_DESTROY 272 qdf_spinlock_t peer_free_lock; 273 qdf_list_t peer_free_list; 274 qdf_work_t peer_obj_free_work; 275 uint32_t active_work_cnt; 276 #endif 277 bool standby_active; 278 }; 279 280 /* 281 * APIs to Create/Delete Global object APIs 282 */ 283 /** 284 * wlan_objmgr_pdev_obj_create() - pdev create 285 * @psoc: PSOC object 286 * @osif_priv: os private object 287 * 288 * Creates PDEV object, initializes with default values 289 * Invokes the registered notifiers to create component object 290 * 291 * Return: Handle to struct wlan_objmgr_psoc on successful creation, 292 * NULL on Failure (on Mem alloc failure and Component objects 293 * Failure) 294 */ 295 struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create( 296 struct wlan_objmgr_psoc *psoc, struct pdev_osif_priv *osif_priv); 297 298 /** 299 * wlan_objmgr_pdev_obj_delete() - pdev delete 300 * @pdev: PDEV object 301 * 302 * Logically deletes PDEV object, 303 * Once all the references are released, object manager invokes the registered 304 * notifiers to destroy component objects 305 * 306 * Return: SUCCESS/FAILURE 307 */ 308 QDF_STATUS wlan_objmgr_pdev_obj_delete(struct wlan_objmgr_pdev *pdev); 309 310 /* 311 * APIs to attach/detach component objects 312 */ 313 /** 314 * wlan_objmgr_pdev_component_obj_attach() - pdev comp object attach 315 * @pdev: PDEV object 316 * @id: Component id 317 * @comp_priv_obj: component's private object pointer 318 * @status: Component's private object creation status 319 * 320 * API to be used for attaching component object with PDEV common object 321 * 322 * Return: SUCCESS on successful storing of component's object in common object 323 * On FAILURE (appropriate failure codes are returned) 324 */ 325 QDF_STATUS wlan_objmgr_pdev_component_obj_attach( 326 struct wlan_objmgr_pdev *pdev, 327 enum wlan_umac_comp_id id, 328 void *comp_priv_obj, 329 QDF_STATUS status); 330 331 /** 332 * wlan_objmgr_pdev_component_obj_detach() - pdev comp object detach 333 * @pdev: PDEV object 334 * @id: Component id 335 * @comp_priv_obj: component's private object pointer 336 * 337 * API to be used for detaching component object with PDEV common object 338 * 339 * Return: SUCCESS on successful removal of component's object from common 340 * object 341 * On FAILURE (appropriate failure codes are returned) 342 */ 343 QDF_STATUS wlan_objmgr_pdev_component_obj_detach( 344 struct wlan_objmgr_pdev *pdev, 345 enum wlan_umac_comp_id id, 346 void *comp_priv_obj); 347 348 /* 349 * APIs to operations on pdev objects 350 */ 351 352 typedef void (*wlan_objmgr_pdev_op_handler)(struct wlan_objmgr_pdev *pdev, 353 void *object, 354 void *arg); 355 356 /** 357 * wlan_objmgr_pdev_iterate_obj_list() - operate on all objects of pdev 358 * @pdev: PDEV object 359 * @obj_type: VDEV_OP/PEER_OP 360 * @handler: the handler will be called for each object of requested type 361 * the handler should be implemented to perform required operation 362 * @arg: arguments passed by caller 363 * @lock_free_op: its obsolete 364 * @dbg_id: id of the caller 365 * 366 * API to be used for performing the operations on all VDEV/PEER objects 367 * of pdev 368 * 369 * Return: SUCCESS/FAILURE 370 */ 371 QDF_STATUS wlan_objmgr_pdev_iterate_obj_list( 372 struct wlan_objmgr_pdev *pdev, 373 enum wlan_objmgr_obj_type obj_type, 374 wlan_objmgr_pdev_op_handler handler, 375 void *arg, uint8_t lock_free_op, 376 wlan_objmgr_ref_dbgid dbg_id); 377 378 /** 379 * wlan_objmgr_trigger_pdev_comp_priv_object_creation() - create 380 * comp object of pdev 381 * @pdev: PDEV object 382 * @id: Component id 383 * 384 * API to create component private object in run time, this would be 385 * used for features which gets enabled in run time 386 * 387 * Return: SUCCESS on successful creation 388 * On FAILURE (appropriate failure codes are returned) 389 */ 390 QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_creation( 391 struct wlan_objmgr_pdev *pdev, 392 enum wlan_umac_comp_id id); 393 394 /** 395 * wlan_objmgr_trigger_pdev_comp_priv_object_deletion() - destroy 396 * comp object of pdev 397 * @pdev: PDEV object 398 * @id: Component id 399 * 400 * API to destroy component private object in run time, this would 401 * be used for features which gets disabled in run time 402 * 403 * Return: SUCCESS on successful deletion 404 * On FAILURE (appropriate failure codes are returned) 405 */ 406 QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_deletion( 407 struct wlan_objmgr_pdev *pdev, 408 enum wlan_umac_comp_id id); 409 410 /** 411 * wlan_objmgr_get_vdev_by_id_from_pdev() - find vdev using id from pdev 412 * @pdev: PDEV object 413 * @vdev_id: vdev id 414 * @dbg_id: id of the caller 415 * 416 * API to find vdev object pointer by vdev id from pdev's vdev list 417 * 418 * This API increments the ref count of the vdev object internally, the 419 * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement 420 * ref count 421 * 422 * Return: vdev pointer 423 * NULL on FAILURE 424 */ 425 #ifdef WLAN_OBJMGR_REF_ID_TRACE 426 #define wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, dbg_id) \ 427 wlan_objmgr_get_vdev_by_id_from_pdev_debug(pdev, \ 428 vdev_id, dbg_id, __func__, __LINE__) 429 430 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_debug( 431 struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 432 wlan_objmgr_ref_dbgid dbg_id, 433 const char *func, int line); 434 #else 435 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev( 436 struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 437 wlan_objmgr_ref_dbgid dbg_id); 438 #endif 439 440 /** 441 * wlan_objmgr_get_vdev_by_id_from_pdev_no_state() - find vdev using id 442 * from pdev 443 * @pdev: PDEV object 444 * @vdev_id: vdev id 445 * @dbg_id: id of the caller 446 * 447 * API to find vdev object pointer by vdev id from pdev's vdev list 448 * 449 * This API increments the ref count of the vdev object internally, the 450 * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement 451 * ref count 452 * 453 * Return: vdev pointer 454 * NULL on FAILURE 455 */ 456 #ifdef WLAN_OBJMGR_REF_ID_TRACE 457 #define wlan_objmgr_get_vdev_by_id_from_pdev_no_state(pdev, \ 458 vdev_id, dbg_id) \ 459 wlan_objmgr_get_vdev_by_id_from_pdev_no_state_debug(pdev, \ 460 vdev_id, dbg_id, __func__, __LINE__) 461 462 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state_debug( 463 struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 464 wlan_objmgr_ref_dbgid dbg_id, 465 const char *func, int line); 466 #else 467 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state( 468 struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 469 wlan_objmgr_ref_dbgid dbg_id); 470 #endif 471 472 /** 473 * wlan_objmgr_get_vdev_by_macaddr_from_pdev() - find vdev using macaddr 474 * @pdev: PDEV object 475 * @macaddr: MAC address 476 * @dbg_id: id of the caller 477 * 478 * API to find vdev object pointer by vdev mac addr from pdev's vdev list 479 * 480 * This API increments the ref count of the vdev object internally, the 481 * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement 482 * ref count 483 * 484 * Return: vdev pointer 485 * NULL on FAILURE 486 */ 487 #ifdef WLAN_OBJMGR_REF_ID_TRACE 488 #define wlan_objmgr_get_vdev_by_macaddr_from_pdev(pdev, macaddr, dbg_id) \ 489 wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug(pdev, macaddr, \ 490 dbg_id, __func__, __LINE__) 491 492 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug( 493 struct wlan_objmgr_pdev *pdev, const uint8_t *macaddr, 494 wlan_objmgr_ref_dbgid dbg_id, 495 const char *fnc, int ln); 496 #else 497 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev( 498 struct wlan_objmgr_pdev *pdev, const uint8_t *macaddr, 499 wlan_objmgr_ref_dbgid dbg_id); 500 #endif 501 502 /** 503 * wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state() - find vdev using 504 * macaddr 505 * @pdev: PDEV object 506 * @macaddr: MAC address 507 * @dbg_id: id of the caller 508 * 509 * API to find vdev object pointer by vdev mac addr from pdev's vdev list 510 * 511 * This API increments the ref count of the vdev object internally, the 512 * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement 513 * ref count 514 * 515 * Return: vdev pointer 516 * NULL on FAILURE 517 */ 518 #ifdef WLAN_OBJMGR_REF_ID_TRACE 519 #define wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(pdev, macaddr, \ 520 dbg_id) \ 521 wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug(pdev, \ 522 macaddr, dbg_id, __func__, __LINE__) 523 524 struct wlan_objmgr_vdev 525 *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug( 526 struct wlan_objmgr_pdev *pdev, const uint8_t *macaddr, 527 wlan_objmgr_ref_dbgid dbg_id, 528 const char *func, int line); 529 #else 530 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state( 531 struct wlan_objmgr_pdev *pdev, const uint8_t *macaddr, 532 wlan_objmgr_ref_dbgid dbg_id); 533 #endif 534 535 /** 536 * wlan_objmgr_pdev_get_first_vdev() - Get first vdev of pdev 537 * @pdev: PDEV object 538 * @dbg_id: Object Manager ref debug id 539 * 540 * API to get reference to first vdev of pdev. 541 * 542 * Return: reference to first vdev 543 */ 544 #ifdef WLAN_OBJMGR_REF_ID_TRACE 545 #define wlan_objmgr_pdev_get_first_vdev(pdev, dbg_id) \ 546 wlan_objmgr_pdev_get_first_vdev_debug(pdev, dbg_id, \ 547 __func__, __LINE__) 548 549 struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev_debug( 550 struct wlan_objmgr_pdev *pdev, 551 wlan_objmgr_ref_dbgid dbg_id, 552 const char *func, int line); 553 #else 554 struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev( 555 struct wlan_objmgr_pdev *pdev, 556 wlan_objmgr_ref_dbgid dbg_id); 557 #endif 558 559 /** 560 * wlan_objmgr_pdev_get_roam_vdev() - Get roam vdev of pdev 561 * @pdev: PDEV object 562 * @dbg_id: Object Manager ref debug id 563 * 564 * API to get reference to vdev which is in roaming from pdev. 565 * 566 * Return: reference to roam vdev 567 */ 568 struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_roam_vdev( 569 struct wlan_objmgr_pdev *pdev, 570 wlan_objmgr_ref_dbgid dbg_id); 571 572 /** 573 * wlan_objmgr_pdev_get_comp_private_obj() - get pdev component private object 574 * @pdev: PDEV object 575 * @id: Component id 576 * 577 * API to get component private object 578 * 579 * Return: void *ptr on SUCCESS 580 * NULL on Failure 581 */ 582 void *wlan_objmgr_pdev_get_comp_private_obj( 583 struct wlan_objmgr_pdev *pdev, 584 enum wlan_umac_comp_id id); 585 586 /** 587 * wlan_pdev_obj_lock() - Acquire PDEV spinlock 588 * @pdev: PDEV object 589 * 590 * API to acquire PDEV lock 591 * Parent lock should not be taken in child lock context 592 * but child lock can be taken in parent lock context 593 * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) 594 * 595 * Return: void 596 */ 597 static inline void wlan_pdev_obj_lock(struct wlan_objmgr_pdev *pdev) 598 { 599 qdf_spin_lock_bh(&pdev->pdev_lock); 600 } 601 602 /** 603 * wlan_pdev_obj_unlock() - Release PDEV spinlock 604 * @pdev: PDEV object 605 * 606 * API to Release PDEV lock 607 * 608 * Return: void 609 */ 610 static inline void wlan_pdev_obj_unlock(struct wlan_objmgr_pdev *pdev) 611 { 612 qdf_spin_unlock_bh(&pdev->pdev_lock); 613 } 614 615 /** 616 * wlan_pdev_get_psoc() - get psoc 617 * @pdev: PDEV object 618 * 619 * API to get the psoc object from PDEV 620 * 621 * Return: PSOC object 622 */ 623 static inline struct wlan_objmgr_psoc *wlan_pdev_get_psoc( 624 struct wlan_objmgr_pdev *pdev) 625 { 626 return pdev->pdev_objmgr.wlan_psoc; 627 } 628 629 /** 630 * wlan_pdev_set_psoc() - set psoc 631 * @pdev: PDEV object 632 * @psoc: PSOC object 633 * 634 * API to set the psoc object from PDEV 635 * 636 * Return: void 637 */ 638 static inline void wlan_pdev_set_psoc(struct wlan_objmgr_pdev *pdev, 639 struct wlan_objmgr_psoc *psoc) 640 { 641 pdev->pdev_objmgr.wlan_psoc = psoc; 642 } 643 644 /** 645 * wlan_pdev_nif_fw_cap_set() - set fw caps 646 * @pdev: PDEV object 647 * @cap: capability flag to be set 648 * 649 * API to set fw caps in pdev 650 * 651 * Return: void 652 */ 653 static inline void wlan_pdev_nif_fw_cap_set(struct wlan_objmgr_pdev *pdev, 654 uint32_t cap) 655 { 656 pdev->pdev_nif.pdev_fw_caps |= cap; 657 } 658 659 /** 660 * wlan_pdev_nif_fw_cap_clear() - clear fw cap 661 * @pdev: PDEV object 662 * @cap: capability flag to be cleared 663 * 664 * API to clear fw caps in pdev 665 * 666 * Return: void 667 */ 668 static inline void wlan_pdev_nif_fw_cap_clear(struct wlan_objmgr_pdev *pdev, 669 uint32_t cap) 670 { 671 pdev->pdev_nif.pdev_fw_caps &= ~cap; 672 } 673 674 /** 675 * wlan_pdev_nif_fw_cap_get() - get fw caps 676 * @pdev: PDEV object 677 * @cap: capability flag to be checked 678 * 679 * API to know, whether particular fw caps flag is set in pdev 680 * 681 * Return: 1 (for set) or 0 (for not set) 682 */ 683 static inline uint8_t wlan_pdev_nif_fw_cap_get(struct wlan_objmgr_pdev *pdev, 684 uint32_t cap) 685 { 686 return (pdev->pdev_nif.pdev_fw_caps & cap) ? 1 : 0; 687 } 688 689 /** 690 * wlan_pdev_nif_feat_cap_set() - set feature caps 691 * @pdev: PDEV object 692 * @cap: capability flag to be set 693 * 694 * API to set feat caps in pdev 695 * 696 * Return: void 697 */ 698 static inline void wlan_pdev_nif_feat_cap_set(struct wlan_objmgr_pdev *pdev, 699 uint32_t cap) 700 { 701 pdev->pdev_nif.pdev_feature_caps |= cap; 702 } 703 704 /** 705 * wlan_pdev_nif_feat_cap_clear() - clear feature caps 706 * @pdev: PDEV object 707 * @cap: capability flag to be cleared 708 * 709 * API to clear feat caps in pdev 710 * 711 * Return: void 712 */ 713 static inline void wlan_pdev_nif_feat_cap_clear(struct wlan_objmgr_pdev *pdev, 714 uint32_t cap) 715 { 716 pdev->pdev_nif.pdev_feature_caps &= ~cap; 717 } 718 719 /** 720 * wlan_pdev_nif_feat_cap_get() - get feature caps 721 * @pdev: PDEV object 722 * @cap: capability flag to be checked 723 * 724 * API to know, whether particular feat caps flag is set in pdev 725 * 726 * Return: 1 (for set) or 0 (for not set) 727 */ 728 static inline uint8_t wlan_pdev_nif_feat_cap_get(struct wlan_objmgr_pdev *pdev, 729 uint32_t cap) 730 { 731 return (pdev->pdev_nif.pdev_feature_caps & cap) ? 1 : 0; 732 } 733 734 /** 735 * wlan_pdev_nif_feat_ext_cap_set() - set feature ext caps 736 * @pdev: PDEV object 737 * @cap: capability flag to be set 738 * 739 * API to set feat ext caps in pdev 740 * 741 * Return: void 742 */ 743 static inline 744 void wlan_pdev_nif_feat_ext_cap_set(struct wlan_objmgr_pdev *pdev, 745 uint32_t cap) 746 { 747 pdev->pdev_nif.pdev_feature_ext_caps |= cap; 748 } 749 750 /** 751 * wlan_pdev_nif_feat_ext_cap_clear() - clear feature ext caps 752 * @pdev: PDEV object 753 * @cap: capability flag to be cleared 754 * 755 * API to clear feat ext caps in pdev 756 * 757 * Return: void 758 */ 759 static inline 760 void wlan_pdev_nif_feat_ext_cap_clear(struct wlan_objmgr_pdev *pdev, 761 uint32_t cap) 762 { 763 pdev->pdev_nif.pdev_feature_ext_caps &= ~cap; 764 } 765 766 /** 767 * wlan_pdev_nif_feat_ext_cap_get() - get feature ext caps 768 * @pdev: PDEV object 769 * @cap: capability flag to be checked 770 * 771 * API to know, whether particular feat ext caps flag is set in pdev 772 * 773 * Return: 1 (for set) or 0 (for not set) 774 */ 775 static inline 776 uint8_t wlan_pdev_nif_feat_ext_cap_get(struct wlan_objmgr_pdev *pdev, 777 uint32_t cap) 778 { 779 return (pdev->pdev_nif.pdev_feature_ext_caps & cap) ? 1 : 0; 780 } 781 782 /** 783 * wlan_pdev_mlme_op_set() - set operation flags 784 * @pdev: PDEV object 785 * @op: Operation flag to be set 786 * 787 * API to set operation flag in pdev 788 * 789 * Return: void 790 */ 791 static inline void wlan_pdev_mlme_op_set(struct wlan_objmgr_pdev *pdev, 792 uint32_t op) 793 { 794 pdev->pdev_mlme.pdev_op_flags |= op; 795 } 796 797 /** 798 * wlan_pdev_mlme_op_clear() - clear op flags 799 * @pdev: PDEV object 800 * @op: Operation flag to be cleared 801 * 802 * API to clear op flag in pdev 803 * 804 * Return: void 805 */ 806 static inline void wlan_pdev_mlme_op_clear(struct wlan_objmgr_pdev *pdev, 807 uint32_t op) 808 { 809 pdev->pdev_mlme.pdev_op_flags &= ~op; 810 } 811 812 /** 813 * wlan_pdev_mlme_op_get() - get op flag 814 * @pdev: PDEV object 815 * @op: Operation flag to be checked 816 * 817 * API to know, whether particular operation flag is set in pdev 818 * 819 * Return: 1 (for set) or 0 (for not set) 820 */ 821 static inline uint8_t wlan_pdev_mlme_op_get(struct wlan_objmgr_pdev *pdev, 822 uint32_t op) 823 { 824 return (pdev->pdev_mlme.pdev_op_flags & op) ? 1 : 0; 825 } 826 827 /** 828 * wlan_pdev_get_hw_macaddr() - get hw macaddr 829 * @pdev: PDEV object 830 * 831 * API to get HW MAC address form PDEV 832 * 833 * Caller need to acquire lock with wlan_pdev_obj_lock() 834 * 835 * Return: @macaddr -MAC address 836 */ 837 static inline uint8_t *wlan_pdev_get_hw_macaddr(struct wlan_objmgr_pdev *pdev) 838 { 839 if (!pdev) 840 return NULL; 841 842 /* This API is invoked with lock acquired, do not add log prints */ 843 return pdev->pdev_nif.macaddr; 844 } 845 846 /** 847 * wlan_pdev_set_hw_macaddr() - set hw macaddr 848 * @pdev: PDEV object 849 * @macaddr: MAC address 850 * 851 * API to set HW MAC address form PDEV 852 * 853 * Caller need to acquire lock with wlan_pdev_obj_lock() 854 * 855 * Return: void 856 */ 857 static inline void wlan_pdev_set_hw_macaddr(struct wlan_objmgr_pdev *pdev, 858 uint8_t *macaddr) 859 { 860 /* This API is invoked with lock acquired, do not add log prints */ 861 WLAN_ADDR_COPY(pdev->pdev_nif.macaddr, macaddr); 862 } 863 864 /** 865 * wlan_pdev_get_ospriv() - get os priv pointer 866 * @pdev: PDEV object 867 * 868 * API to get OS private pointer from PDEV 869 * 870 * Return: ospriv - private pointer 871 */ 872 static inline struct pdev_osif_priv *wlan_pdev_get_ospriv( 873 struct wlan_objmgr_pdev *pdev) 874 { 875 return pdev->pdev_nif.pdev_ospriv; 876 } 877 878 /** 879 * wlan_pdev_reset_ospriv() - reset os priv pointer 880 * @pdev: PDEV object 881 * 882 * API to reset OS private pointer in PDEV 883 * 884 * Return: void 885 */ 886 static inline void wlan_pdev_reset_ospriv(struct wlan_objmgr_pdev *pdev) 887 { 888 pdev->pdev_nif.pdev_ospriv = NULL; 889 } 890 891 /** 892 * wlan_pdev_set_max_vdev_count() - set pdev max vdev count 893 * @pdev: PDEV object 894 * @max_vdev_count: Max vdev count 895 * 896 * API to set Max vdev count 897 * 898 * Return: void 899 */ 900 static inline void wlan_pdev_set_max_vdev_count(struct wlan_objmgr_pdev *pdev, 901 uint8_t max_vdev_count) 902 { 903 if (max_vdev_count > WLAN_UMAC_PDEV_MAX_VDEVS) 904 QDF_BUG(0); 905 906 pdev->pdev_objmgr.max_vdev_count = max_vdev_count; 907 } 908 909 /** 910 * wlan_pdev_get_max_vdev_count() - get pdev max vdev count 911 * @pdev: PDEV object 912 * 913 * API to set Max vdev count 914 * 915 * Return: @vdev count: Max vdev count 916 */ 917 static inline uint8_t wlan_pdev_get_max_vdev_count( 918 struct wlan_objmgr_pdev *pdev) 919 { 920 return pdev->pdev_objmgr.max_vdev_count; 921 } 922 923 /** 924 * DOC: Examples to use PDEV ref count APIs 925 * 926 * In all the scenarios, the pair of API should be followed 927 * otherwise it lead to memory leak 928 * 929 * scenario 1: 930 * 931 * wlan_objmgr_pdev_obj_create() 932 * ---- 933 * wlan_objmgr_pdev_obj_delete() 934 * 935 * scenario 2: 936 * 937 * wlan_objmgr_pdev_get_ref() 938 * ---- 939 * the operations which are done on 940 * pdev object 941 * ---- 942 * wlan_objmgr_pdev_release_ref() 943 * 944 * scenario 3: 945 * 946 * wlan_objmgr_get_pdev_by_id[_no_state]() 947 * ---- 948 * the operations which are done on 949 * pdev object 950 * ---- 951 * wlan_objmgr_pdev_release_ref() 952 * 953 * scenario 4: 954 * 955 * wlan_objmgr_get_pdev_by_macaddr[_no_state]() 956 * ---- 957 * the operations which are done on 958 * pdev object 959 * ---- 960 * wlan_objmgr_pdev_release_ref() 961 */ 962 963 /** 964 * wlan_objmgr_pdev_get_ref() - increment ref count 965 * @pdev: PDEV object 966 * @id: Object Manager ref debug id 967 * 968 * API to increment ref count of pdev 969 * 970 * Return: void 971 */ 972 void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev, 973 wlan_objmgr_ref_dbgid id); 974 975 /** 976 * wlan_objmgr_pdev_try_get_ref() - increment ref count, if allowed 977 * @pdev: PDEV object 978 * @id: Object Manager ref debug id 979 * 980 * API to increment ref count of pdev after checking valid object state 981 * 982 * Return: void 983 */ 984 QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev, 985 wlan_objmgr_ref_dbgid id); 986 987 /** 988 * wlan_objmgr_pdev_release_ref() - decrement ref count 989 * @pdev: PDEV object 990 * @id: Object Manager ref debug id 991 * 992 * API to decrement ref count of pdev, if ref count is 1, it initiates the 993 * PDEV deletion 994 * 995 * Return: void 996 */ 997 void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev, 998 wlan_objmgr_ref_dbgid id); 999 1000 /** 1001 * wlan_objmgr_pdev_get_pdev_id() - get pdev id 1002 * @pdev: PDEV object 1003 * 1004 * API to get pdev id from pdev object 1005 * 1006 * Return: @pdev id 1007 */ 1008 static inline 1009 uint8_t wlan_objmgr_pdev_get_pdev_id(struct wlan_objmgr_pdev *pdev) 1010 { 1011 return pdev->pdev_objmgr.wlan_pdev_id; 1012 } 1013 1014 /** 1015 * wlan_pdev_set_tgt_if_handle(): API to set target if handle in pdev object 1016 * @pdev: Pdev pointer 1017 * @tgt_if_handle: target interface handle 1018 * 1019 * API to set target interface handle in pdev object 1020 * 1021 * Caller needs to acquire lock with wlan_pdev_obj_lock() 1022 * 1023 * Return: None 1024 */ 1025 static inline 1026 void wlan_pdev_set_tgt_if_handle(struct wlan_objmgr_pdev *pdev, 1027 target_pdev_info_t *tgt_if_handle) 1028 { 1029 /* This API is invoked with lock acquired, do not add log prints */ 1030 if (!pdev) 1031 return; 1032 1033 pdev->tgt_if_handle = tgt_if_handle; 1034 } 1035 1036 /** 1037 * wlan_pdev_get_tgt_if_handle(): API to get target interface handle 1038 * @pdev: Pdev pointer 1039 * 1040 * API to get target interface handle from pdev object 1041 * 1042 * Return: target interface handle 1043 */ 1044 static inline 1045 target_pdev_info_t *wlan_pdev_get_tgt_if_handle(struct wlan_objmgr_pdev *pdev) 1046 { 1047 if (!pdev) 1048 return NULL; 1049 1050 return pdev->tgt_if_handle; 1051 } 1052 1053 /** 1054 * wlan_pdev_set_max_peer_count() - set max peer count 1055 * @pdev: PDEV object 1056 * @count: Max peer count 1057 * 1058 * API to set max peer count of PDEV 1059 * 1060 * Return: void 1061 */ 1062 static inline void wlan_pdev_set_max_peer_count(struct wlan_objmgr_pdev *pdev, 1063 uint16_t count) 1064 { 1065 pdev->pdev_objmgr.max_peer_count = count; 1066 } 1067 1068 /** 1069 * wlan_pdev_get_max_peer_count() - get max peer count 1070 * @pdev: PDEV object 1071 * 1072 * API to get max peer count of PDEV 1073 * 1074 * Return: max peer count 1075 */ 1076 static inline uint16_t wlan_pdev_get_max_peer_count( 1077 struct wlan_objmgr_pdev *pdev) 1078 { 1079 return pdev->pdev_objmgr.max_peer_count; 1080 } 1081 1082 /** 1083 * wlan_pdev_set_max_beacon_count() - set max beacon count 1084 * @pdev: pdev object 1085 * @count: Max beacon count 1086 * 1087 * API to set max beacon count of pdev 1088 * 1089 * Return: void 1090 */ 1091 static inline void wlan_pdev_set_max_beacon_count( 1092 struct wlan_objmgr_pdev *pdev, 1093 uint64_t count) 1094 { 1095 pdev->pdev_objmgr.bcn.max_beacon_count = count; 1096 } 1097 1098 /** 1099 * wlan_pdev_get_max_beacon_count() - get max beacon count 1100 * @pdev: pdev object 1101 * 1102 * API to get max beacon count of pdev 1103 * 1104 * Return: max beacon count 1105 */ 1106 static inline uint64_t wlan_pdev_get_max_beacon_count( 1107 struct wlan_objmgr_pdev *pdev) 1108 { 1109 return pdev->pdev_objmgr.bcn.max_beacon_count; 1110 } 1111 1112 /** 1113 * wlan_pdev_incr_wlan_beacon_count() - incr beacon count for rx beacon frames 1114 * @pdev: pdev object 1115 * 1116 * API to incr beacon count of pdev 1117 * 1118 * Return: void 1119 */ 1120 static inline void wlan_pdev_incr_wlan_beacon_count( 1121 struct wlan_objmgr_pdev *pdev) 1122 { 1123 pdev->pdev_objmgr.bcn.wlan_beacon_count++; 1124 } 1125 1126 /** 1127 * wlan_pdev_set_wlan_beacon_count() - set wlan beacon count 1128 * @pdev: pdev object 1129 * @count: count to reset beacon count 1130 * 1131 * API to get wlan beacon count of pdev 1132 * 1133 */ 1134 static inline void wlan_pdev_set_wlan_beacon_count( 1135 struct wlan_objmgr_pdev *pdev, 1136 uint64_t count) 1137 { 1138 pdev->pdev_objmgr.bcn.wlan_beacon_count = count; 1139 } 1140 1141 /** 1142 * wlan_pdev_get_wlan_beacon_count() - get wlan beacon count 1143 * @pdev: pdev object 1144 * 1145 * API to get wlan beacon count of pdev 1146 * 1147 * Return: beacon count 1148 */ 1149 static inline uint64_t wlan_pdev_get_wlan_beacon_count( 1150 struct wlan_objmgr_pdev *pdev) 1151 { 1152 return pdev->pdev_objmgr.bcn.wlan_beacon_count; 1153 } 1154 1155 /** 1156 * wlan_pdev_set_max_beacon_limit() - set max beacon limit 1157 * @pdev: pdev object 1158 * @limit: limit for thresholding 1159 * 1160 * API to set wlan beacon limit of pdev 1161 * 1162 */ 1163 static inline void wlan_pdev_set_max_beacon_limit( 1164 struct wlan_objmgr_pdev *pdev, 1165 uint64_t limit) 1166 { 1167 pdev->pdev_objmgr.bcn.max_beacon_limit = limit; 1168 } 1169 1170 /** 1171 * wlan_pdev_get_max_beacon_limit() - get max beacon limit 1172 * @pdev: pdev object 1173 * 1174 * API to get wlan beacon limit of pdev 1175 * 1176 * Return: beacon limit 1177 */ 1178 static inline uint64_t wlan_pdev_get_max_beacon_limit( 1179 struct wlan_objmgr_pdev *pdev) 1180 { 1181 return pdev->pdev_objmgr.bcn.max_beacon_limit; 1182 } 1183 1184 /** 1185 * wlan_pdev_incr_dropped_beacon_count() - increment dropped bcn cnt 1186 * @pdev: pdev object 1187 * 1188 * API to increment dropped beacon count 1189 * 1190 * Return: beacon limit 1191 */ 1192 static inline void wlan_pdev_incr_dropped_beacon_count( 1193 struct wlan_objmgr_pdev *pdev) 1194 { 1195 pdev->pdev_objmgr.bcn.dropped_beacon++; 1196 } 1197 1198 /** 1199 * wlan_pdev_set_dropped_beacon_count() - reset dropped beacon count 1200 * @pdev: pdev object 1201 * @count: count value 1202 * 1203 * API to set beacon drop count 1204 * 1205 */ 1206 static inline void wlan_pdev_set_dropped_beacon_count( 1207 struct wlan_objmgr_pdev *pdev, 1208 uint64_t count) 1209 { 1210 pdev->pdev_objmgr.bcn.dropped_beacon = count; 1211 } 1212 1213 /** 1214 * wlan_pdev_get_dropped_beacon_count() - get drop beacon count 1215 * @pdev: pdev object 1216 * 1217 * API to get dropped beacon count 1218 * 1219 * Return: beacon limit 1220 */ 1221 static inline uint64_t wlan_pdev_get_dropped_beacon_count( 1222 struct wlan_objmgr_pdev *pdev) 1223 { 1224 return pdev->pdev_objmgr.bcn.dropped_beacon; 1225 } 1226 1227 /** 1228 * wlan_pdev_set_max_monitor_vdev_count() - set max monitor vdev count 1229 * @pdev: PDEV object 1230 * @count: Max monitor vdev count 1231 * 1232 * API to set max monitor vdev count of PDEV 1233 * 1234 * Return: void 1235 */ 1236 static inline void wlan_pdev_set_max_monitor_vdev_count( 1237 struct wlan_objmgr_pdev *pdev, 1238 uint16_t count) 1239 { 1240 pdev->pdev_objmgr.max_monitor_vdev_count = count; 1241 } 1242 1243 /** 1244 * wlan_pdev_get_max_monitor_vdev_count() - get max monitor vdev count 1245 * @pdev: PDEV object 1246 * 1247 * API to get max monitor vdev count of PDEV 1248 * 1249 * Return: max monitor vdev count 1250 */ 1251 static inline uint16_t wlan_pdev_get_max_monitor_vdev_count( 1252 struct wlan_objmgr_pdev *pdev) 1253 { 1254 return pdev->pdev_objmgr.max_monitor_vdev_count; 1255 } 1256 1257 /** 1258 * wlan_pdev_set_max_bridge_vdev_count() - set max bridge vdev count 1259 * @pdev: PDEV object 1260 * @count: Max bridge vdev count 1261 * 1262 * API to set max bridge vdev count of PDEV 1263 * 1264 * Return: void 1265 */ 1266 static inline void wlan_pdev_set_max_bridge_vdev_count( 1267 struct wlan_objmgr_pdev *pdev, 1268 uint16_t count) 1269 { 1270 pdev->pdev_objmgr.max_bridge_vdev_count = count; 1271 } 1272 1273 /** 1274 * wlan_pdev_get_max_bridge_vdev_count() - get max bridge vdev count 1275 * @pdev: PDEV object 1276 * 1277 * API to get max bridge vdev count of PDEV 1278 * 1279 * Return: max bridge vdev count 1280 */ 1281 static inline uint16_t wlan_pdev_get_max_bridge_vdev_count( 1282 struct wlan_objmgr_pdev *pdev) 1283 { 1284 return pdev->pdev_objmgr.max_bridge_vdev_count; 1285 } 1286 1287 /** 1288 * wlan_pdev_get_peer_count() - get pdev peer count 1289 * @pdev: PDEV object 1290 * 1291 * API to get peer count from PDEV 1292 * 1293 * Return: peer_count - pdev's peer count 1294 */ 1295 static inline uint16_t wlan_pdev_get_peer_count(struct wlan_objmgr_pdev *pdev) 1296 { 1297 return pdev->pdev_objmgr.wlan_peer_count; 1298 } 1299 1300 /** 1301 * wlan_pdev_get_temp_peer_count() - get pdev temporary peer count 1302 * @pdev: PDEV object 1303 * 1304 * API to get temporary peer count from PDEV 1305 * 1306 * Return: temp_peer_count - pdev's temporary peer count 1307 */ 1308 static inline uint16_t wlan_pdev_get_temp_peer_count(struct wlan_objmgr_pdev *pdev) 1309 { 1310 return pdev->pdev_objmgr.temp_peer_count; 1311 } 1312 1313 1314 /** 1315 * wlan_pdev_incr_peer_count() - increment pdev peer count 1316 * @pdev: PDEV object 1317 * 1318 * API to increment peer count of PDEV by 1 1319 * 1320 * Return: void 1321 */ 1322 static inline void wlan_pdev_incr_peer_count(struct wlan_objmgr_pdev *pdev) 1323 { 1324 pdev->pdev_objmgr.wlan_peer_count++; 1325 } 1326 1327 /** 1328 * wlan_pdev_decr_peer_count() - decrement pdev peer count 1329 * @pdev: PDEV object 1330 * 1331 * API to decrement peer count of PDEV by 1 1332 * 1333 * Return: void 1334 */ 1335 static inline void wlan_pdev_decr_peer_count(struct wlan_objmgr_pdev *pdev) 1336 { 1337 pdev->pdev_objmgr.wlan_peer_count--; 1338 } 1339 1340 /** 1341 * wlan_pdev_incr_temp_peer_count() - increment temporary pdev peer count 1342 * @pdev: PDEV object 1343 * 1344 * API to increment temporary peer count of PDEV by 1 1345 * 1346 * Return: void 1347 */ 1348 static inline void wlan_pdev_incr_temp_peer_count(struct wlan_objmgr_pdev *pdev) 1349 { 1350 pdev->pdev_objmgr.temp_peer_count++; 1351 } 1352 1353 /** 1354 * wlan_pdev_decr_temp_peer_count() - decrement pdev temporary peer count 1355 * @pdev: PDEV object 1356 * 1357 * API to decrement temporary peer count of PDEV by 1 1358 * 1359 * Return: void 1360 */ 1361 static inline void wlan_pdev_decr_temp_peer_count(struct wlan_objmgr_pdev *pdev) 1362 { 1363 pdev->pdev_objmgr.temp_peer_count--; 1364 } 1365 1366 /** 1367 * wlan_pdev_get_vdev_count() - get PDEV vdev count 1368 * @pdev: PDEV object 1369 * 1370 * API to get vdev count from PDEV 1371 * 1372 * Return: vdev_count - pdev's vdev count 1373 */ 1374 static inline uint8_t wlan_pdev_get_vdev_count(struct wlan_objmgr_pdev *pdev) 1375 { 1376 return pdev->pdev_objmgr.wlan_vdev_count; 1377 } 1378 1379 #ifdef WLAN_FEATURE_11BE_MLO 1380 /** 1381 * wlan_pdev_init_mlo_vdev_count() - Initialize PDEV MLO vdev count 1382 * @pdev: PDEV object 1383 * 1384 * API to initialize MLO vdev count from PDEV 1385 * 1386 * Return: void 1387 */ 1388 static inline 1389 void wlan_pdev_init_mlo_vdev_count(struct wlan_objmgr_pdev *pdev) 1390 { 1391 qdf_atomic_init(&pdev->pdev_objmgr.wlan_mlo_vdev_count); 1392 } 1393 1394 /** 1395 * wlan_pdev_get_mlo_vdev_count() - get PDEV MLO vdev count 1396 * @pdev: PDEV object 1397 * 1398 * API to get MLO vdev count from PDEV 1399 * 1400 * Return: MLO vdev_count - pdev's MLO vdev count 1401 */ 1402 static inline 1403 uint32_t wlan_pdev_get_mlo_vdev_count(struct wlan_objmgr_pdev *pdev) 1404 { 1405 return qdf_atomic_read(&pdev->pdev_objmgr.wlan_mlo_vdev_count); 1406 } 1407 1408 /** 1409 * wlan_pdev_inc_mlo_vdev_count() - Increment PDEV MLO vdev count 1410 * @pdev: PDEV object 1411 * 1412 * API to increment MLO vdev count from PDEV 1413 * 1414 * Return: void 1415 */ 1416 static inline 1417 void wlan_pdev_inc_mlo_vdev_count(struct wlan_objmgr_pdev *pdev) 1418 { 1419 qdf_atomic_inc(&pdev->pdev_objmgr.wlan_mlo_vdev_count); 1420 } 1421 1422 /** 1423 * wlan_pdev_dec_mlo_vdev_count() - Decrement PDEV MLO vdev count 1424 * @pdev: PDEV object 1425 * 1426 * API to decrement MLO vdev count from PDEV 1427 * 1428 * Return: void 1429 */ 1430 static inline 1431 void wlan_pdev_dec_mlo_vdev_count(struct wlan_objmgr_pdev *pdev) 1432 { 1433 qdf_assert_always 1434 (qdf_atomic_read(&pdev->pdev_objmgr.wlan_mlo_vdev_count)); 1435 1436 qdf_atomic_dec(&pdev->pdev_objmgr.wlan_mlo_vdev_count); 1437 } 1438 1439 /** 1440 * wlan_pdev_init_mlo_bridge_vdev_count() - Initialize PDEV MLO bridge 1441 * vdev count 1442 * @pdev: PDEV object 1443 * 1444 * API to initialize MLO bridge vdev count from PDEV 1445 * 1446 * Return: void 1447 */ 1448 static inline 1449 void wlan_pdev_init_mlo_bridge_vdev_count(struct wlan_objmgr_pdev *pdev) 1450 { 1451 qdf_atomic_init(&pdev->pdev_objmgr.wlan_mlo_bridge_vdev_count); 1452 } 1453 1454 /** 1455 * wlan_pdev_get_mlo_bridge_vdev_count() - get PDEV MLO bridge vdev count 1456 * @pdev: PDEV object 1457 * 1458 * API to get MLO bridge vdev count from PDEV 1459 * 1460 * Return: MLO vdev_count - pdev's MLO bridge vdev count 1461 */ 1462 static inline 1463 uint32_t wlan_pdev_get_mlo_bridge_vdev_count(struct wlan_objmgr_pdev *pdev) 1464 { 1465 return qdf_atomic_read(&pdev->pdev_objmgr.wlan_mlo_bridge_vdev_count); 1466 } 1467 1468 /** 1469 * wlan_pdev_inc_mlo_bridge_vdev_count() - Increment PDEV MLO bridge vdev count 1470 * @pdev: PDEV object 1471 * 1472 * API to increment MLO bridge vdev count from PDEV 1473 * 1474 * Return: void 1475 */ 1476 static inline 1477 void wlan_pdev_inc_mlo_bridge_vdev_count(struct wlan_objmgr_pdev *pdev) 1478 { 1479 qdf_atomic_inc(&pdev->pdev_objmgr.wlan_mlo_bridge_vdev_count); 1480 } 1481 1482 /** 1483 * wlan_pdev_dec_mlo_bridge_vdev_count() - Decrement PDEV MLO bridge vdev count 1484 * @pdev: PDEV object 1485 * 1486 * API to decrement MLO bridge vdev count from PDEV 1487 * 1488 * Return: void 1489 */ 1490 static inline 1491 void wlan_pdev_dec_mlo_bridge_vdev_count(struct wlan_objmgr_pdev *pdev) 1492 { 1493 qdf_assert_always 1494 (qdf_atomic_read(&pdev->pdev_objmgr.wlan_mlo_bridge_vdev_count)); 1495 1496 qdf_atomic_dec(&pdev->pdev_objmgr.wlan_mlo_bridge_vdev_count); 1497 } 1498 #else 1499 static inline 1500 void wlan_pdev_init_mlo_vdev_count(struct wlan_objmgr_pdev *pdev) 1501 { 1502 } 1503 1504 static inline 1505 uint32_t wlan_pdev_get_mlo_vdev_count(struct wlan_objmgr_pdev *pdev) 1506 { 1507 return 0; 1508 } 1509 1510 static inline 1511 void wlan_pdev_inc_mlo_vdev_count(struct wlan_objmgr_pdev *pdev) 1512 { 1513 } 1514 1515 static inline 1516 void wlan_pdev_dec_mlo_vdev_count(struct wlan_objmgr_pdev *pdev) 1517 { 1518 } 1519 1520 static inline 1521 void wlan_pdev_init_mlo_bridge_vdev_count(struct wlan_objmgr_pdev *pdev) 1522 { 1523 } 1524 1525 static inline 1526 uint32_t wlan_pdev_get_mlo_bridge_vdev_count(struct wlan_objmgr_pdev *pdev) 1527 { 1528 return 0; 1529 } 1530 1531 static inline 1532 void wlan_pdev_inc_mlo_bridge_vdev_count(struct wlan_objmgr_pdev *pdev) 1533 { 1534 } 1535 1536 static inline 1537 void wlan_pdev_dec_mlo_bridge_vdev_count(struct wlan_objmgr_pdev *pdev) 1538 { 1539 } 1540 #endif /* WLAN_FEATURE_11BE_MLO */ 1541 1542 /** 1543 * wlan_print_pdev_info() - print pdev members 1544 * @pdev: pdev object pointer 1545 * 1546 * Return: void 1547 */ 1548 #ifdef WLAN_OBJMGR_DEBUG 1549 void wlan_print_pdev_info(struct wlan_objmgr_pdev *pdev); 1550 #else 1551 static inline void wlan_print_pdev_info(struct wlan_objmgr_pdev *pdev) {} 1552 #endif 1553 1554 #endif /* _WLAN_OBJMGR_PDEV_H_*/ 1555