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 any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 /** 18 * DOC: Define the pdev data structure of UMAC 19 * Public APIs to perform operations on Global objects 20 */ 21 22 #ifndef _WLAN_OBJMGR_PDEV_OBJ_H_ 23 #define _WLAN_OBJMGR_PDEV_OBJ_H_ 24 25 #include <wlan_objmgr_cmn.h> 26 #include "wlan_objmgr_psoc_obj.h" 27 28 /* STATUS: scanning */ 29 #define WLAN_PDEV_F_SCAN 0x00000001 30 /* STATUS: use short slot time*/ 31 #define WLAN_PDEV_F_SHSLOT 0x00000002 32 /* STATUS: channel switch event pending after DFS RADAR */ 33 #define WLAN_PDEV_F_DFS_CHANSWITCH_PENDING 0x00000004 34 /* TX Power: fixed rate */ 35 #define WLAN_PDEV_F_TXPOW_FIXED 0x00000008 36 /* STATUS: use short preamble */ 37 #define WLAN_PDEV_F_SHPREAMBLE 0x00000010 38 /* CONF: do alignment pad */ 39 #define WLAN_PDEV_F_DATAPAD 0x00000020 40 /* STATUS: protection enabled */ 41 #define WLAN_PDEV_F_USEPROT 0x00000040 42 /* STATUS: use barker preamble*/ 43 #define WLAN_PDEV_F_USEBARKER 0x00000080 44 /* CONF: DISABLE 2040 coexistence */ 45 #define WLAN_PDEV_F_COEXT_DISABLE 0x00000100 46 /* STATE: scan pending */ 47 #define WLAN_PDEV_F_SCAN_PENDING 0x00000200 48 /* CONF: send regclassids in country ie */ 49 #define WLAN_PDEV_F_REGCLASS 0x00000400 50 /* CONF: block the use of DFS channels */ 51 #define WLAN_PDEV_F_BLKDFSCHAN 0x00000800 52 /* STATUS: 11D in used */ 53 #define WLAN_PDEV_F_DOT11D 0x00001000 54 /* STATUS: 11D channel-switch detected */ 55 #define WLAN_PDEV_F_RADAR 0x00002000 56 /* CONF: A-MPDU supported */ 57 #define WLAN_PDEV_F_AMPDU 0x00004000 58 /* CONF: A-MSDU supported */ 59 #define WLAN_PDEV_F_AMSDU 0x00008000 60 /* CONF: HT traffic protected */ 61 #define WLAN_PDEV_F_HTPROT 0x00010000 62 /* CONF: Reset once */ 63 #define WLAN_PDEV_F_RESET 0x00020000 64 /* CONF: ignore 11d beacon */ 65 #define WLAN_PDEV_F_IGNORE_11D_BEACON 0x00040000 66 /* HT CAP IE present */ 67 #define WLAN_PDEV_F_HTVIE 0x00080000 68 /* radio in middle of CSA */ 69 #define WLAN_PDEV_F_CSA_WAIT 0x00100000 70 /* wnm support flag */ 71 #define WLAN_PDEV_F_WNM 0x00200000 72 #define WLAN_PDEV_F_2G_CSA 0x00400000 73 /* enhanced independent repeater */ 74 #define WLAN_PDEV_F_ENH_REP_IND 0x00800000 75 /* Disable Tx AMSDU for station vap */ 76 #define WLAN_PDEV_F_STA_AMPDU_DIS 0x01000000 77 /* do not send probe request in passive channel */ 78 #define WLAN_PDEV_F_STRICT_PSCAN_EN 0x02000000 79 /* dupie (ANA,pre ANA ) */ 80 /*#define WLAN_PDEV_F_DUPIE 0x00200000*/ 81 /* QWRAP enable flag */ 82 #define WLAN_PDEV_F_WRAP_EN 0x04000000 83 /* Chan concurrency enabled */ 84 #define WLAN_PDEV_F_CHAN_CONCURRENCY 0x08000000 85 /* Multivdev restart enabled */ 86 #define WLAN_PDEV_F_MULTIVDEV_RESTART 0x10000000 87 88 /* PDEV op flags */ 89 /* Enable htrate for wep and tkip */ 90 #define WLAN_PDEV_OP_WEP_TKIP_HTRATE 0x00000001 91 /* non HT AP found flag */ 92 #define WLAN_PDEV_OP_NON_HT_AP 0x00000002 93 /* block the use of DFS channels flag */ 94 #define WLAN_PDEV_OP_BLK_DFS_CHAN 0x00000004 95 /* 11.h flag */ 96 #define WLAN_PDEV_OP_DOTH 0x00000008 97 /* Off-channel support enabled */ 98 #define WLAN_PDEV_OP_OFFCHAN 0x00000010 99 #define WLAN_PDEV_OP_HT20ADHOC 0x00000020 100 #define WLAN_PDEV_OP_HT40ADHOC 0x00000040 101 #define WLAN_PDEV_OP_HTADHOC_AGGR 0x00000080 102 /* disallow CC change when assoc completes */ 103 #define WLAN_PDEV_OP_DISALLOW_AUTO_CC 0x00000100 104 /* Is P2P Enabled? */ 105 #define WLAN_PDEV_OP_P2P 0x00000200 106 /* disallowed */ 107 #define WLAN_PDEV_OP_IGNORE_DYNHALT 0x00000400 108 /* overwrite probe response IE with beacon IE */ 109 #define WLAN_PDEV_OP_OVERRIDE_PROBERESP 0x00000800 110 #define WLAN_PDEV_OP_DROPSTA_QUERY 0x00001000 111 #define WLAN_PDEV_OP_BLK_REPORT_FLOOD 0x00002000 112 /* Offchan scan */ 113 #define WLAN_PDEV_OP_OFFCHAN_SCAN 0x00004000 114 /*Consider OBSS non-erp to change to long slot*/ 115 #define WLAN_PDEV_OP_OBSS_LONGSLOT 0x00008000 116 /* enable/disable min rssi cli block */ 117 #define WLAN_PDEV_OP_MIN_RSSI_ENABLE 0x00010000 118 /* PDEV VDEV restart is in progress */ 119 #define WLAN_PDEV_OP_RESTART_INPROGRESS 0x00020000 120 121 122 struct osif_pdev_priv; 123 124 /** 125 * struct wlan_objmgr_pdev_nif - pdev object nif structure 126 * @pdev_fw_caps: radio specific FW capabilities 127 * @pdev_feature_caps: radio specific feature capabilities 128 * @pdev_ospriv: OS specific pointer 129 * @macaddr[]: MAC address 130 * @notified_ap_vdev: ap vdev 131 */ 132 struct wlan_objmgr_pdev_nif { 133 uint32_t pdev_fw_caps; 134 uint32_t pdev_feature_caps; 135 struct pdev_osif_priv *pdev_ospriv; 136 uint8_t macaddr[QDF_MAC_ADDR_SIZE]; 137 uint8_t notified_ap_vdev; 138 }; 139 140 /** 141 * struct wlan_objmgr_pdev_mlme - pdev object mlme structure 142 * @pdev_op_flags: PDEV operation flags, can be used to know the 143 * operation status (deletion progress, etc) 144 */ 145 struct wlan_objmgr_pdev_mlme { 146 uint32_t pdev_op_flags; 147 }; 148 149 /** 150 * struct wlan_objmgr_pdev_objmgr - pdev object object manager structure 151 * @wlan_pdev_id: PDEV id 152 * @wlan_vdev_count: VDEVs count 153 * @max_vdev_count: Max no. of VDEVs supported by this PDEV 154 * @print_cnt: Count to throttle Logical delete prints 155 * @wlan_vdev_list: List maintains the VDEVs created on this PDEV 156 * @wlan_peer_count: Peer count 157 * @max_peer_count: Max Peer count 158 * @temp_peer_count: Temporary peer count 159 * @wlan_psoc: back pointer to PSOC, its attached to 160 * @ref_cnt: Ref count 161 * @ref_id_dbg: Array to track Ref count 162 */ 163 struct wlan_objmgr_pdev_objmgr { 164 uint8_t wlan_pdev_id; 165 uint8_t wlan_vdev_count; 166 uint8_t max_vdev_count; 167 uint8_t print_cnt; 168 qdf_list_t wlan_vdev_list; 169 uint16_t wlan_peer_count; 170 uint16_t max_peer_count; 171 uint16_t temp_peer_count; 172 struct wlan_objmgr_psoc *wlan_psoc; 173 qdf_atomic_t ref_cnt; 174 qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX]; 175 }; 176 177 /** 178 * struct wlan_objmgr_pdev - PDEV common object 179 * @current_chan_list: Active/current Channel list of the radio 180 * @pdev_nif: pdev nif structure 181 * @pdev_objmgr: pdev object manager structure 182 * @pdev_mlme: pdev MLME structure 183 * @pdev_comp_priv_obj[]: component's private object array 184 * @obj_status[]: object status of each component object 185 * @obj_state: object state 186 * @tgt_if_handle: Target interface handle 187 * @dp_handle: DP module handle 188 * @pdev_lock: lock to protect object 189 */ 190 struct wlan_objmgr_pdev { 191 struct wlan_chan_list *current_chan_list; 192 struct wlan_objmgr_pdev_nif pdev_nif; 193 struct wlan_objmgr_pdev_objmgr pdev_objmgr; 194 struct wlan_objmgr_pdev_mlme pdev_mlme; 195 void *pdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS]; 196 QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS]; 197 WLAN_OBJ_STATE obj_state; 198 void *tgt_if_handle; 199 void *dp_handle; 200 qdf_spinlock_t pdev_lock; 201 }; 202 203 /** 204 ** APIs to Create/Delete Global object APIs 205 */ 206 /** 207 * wlan_objmgr_pdev_obj_create() - pdev create 208 * @psoc: PSOC object 209 * @scn: os private object 210 * 211 * Creates PDEV object, intializes with default values 212 * Invokes the registered notifiers to create component object 213 * 214 * Return: Handle to struct wlan_objmgr_psoc on successful creation, 215 * NULL on Failure (on Mem alloc failure and Component objects 216 * Failure) 217 */ 218 struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create( 219 struct wlan_objmgr_psoc *psoc, struct pdev_osif_priv *osif_priv); 220 221 /** 222 * wlan_objmgr_pdev_obj_delete() - pdev delete 223 * @psoc: PDEV object 224 * 225 * Logically deletes PDEV object, 226 * Once all the references are released, object manager invokes the registered 227 * notifiers to destroy component objects 228 * 229 * Return: SUCCESS/FAILURE 230 */ 231 QDF_STATUS wlan_objmgr_pdev_obj_delete(struct wlan_objmgr_pdev *pdev); 232 233 /** 234 ** APIs to attach/detach component objects 235 */ 236 /** 237 * wlan_objmgr_pdev_component_obj_attach() - pdev comp object attach 238 * @psoc: PDEV object 239 * @id: Component id 240 * @comp_priv_obj: component's private object pointer 241 * @status: Component's private object creation status 242 * 243 * API to be used for attaching component object with PDEV common object 244 * 245 * Return: SUCCESS on successful storing of component's object in common object 246 * On FAILURE (appropriate failure codes are returned) 247 */ 248 QDF_STATUS wlan_objmgr_pdev_component_obj_attach( 249 struct wlan_objmgr_pdev *pdev, 250 enum wlan_umac_comp_id id, 251 void *comp_priv_obj, 252 QDF_STATUS status); 253 254 /** 255 * wlan_objmgr_pdev_component_obj_detach() - pdev comp object detach 256 * @psoc: PDEV object 257 * @id: Component id 258 * @comp_priv_obj: component's private object pointer 259 * 260 * API to be used for detaching component object with PDEV common object 261 * 262 * Return: SUCCESS on successful removal of component's object from common 263 * object 264 * On FAILURE (appropriate failure codes are returned) 265 */ 266 QDF_STATUS wlan_objmgr_pdev_component_obj_detach( 267 struct wlan_objmgr_pdev *pdev, 268 enum wlan_umac_comp_id id, 269 void *comp_priv_obj); 270 271 /** 272 ** APIs to operations on pdev objects 273 */ 274 275 typedef void (*wlan_objmgr_pdev_op_handler)(struct wlan_objmgr_pdev *pdev, 276 void *object, 277 void *arg); 278 279 /** 280 * wlan_objmgr_pdev_iterate_obj_list() - operate on all objects of pdev 281 * @pdev: PDEV object 282 * @obj_type: VDEV_OP/PEER_OP 283 * @handler: the handler will be called for each object of requested type 284 * the handler should be implemented to perform required operation 285 * @arg: agruments passed by caller 286 * @lock_free_op: its obsolete 287 * @dbg_id: id of the caller 288 * 289 * API to be used for performing the operations on all VDEV/PEER objects 290 * of pdev 291 * 292 * Return: SUCCESS/FAILURE 293 */ 294 QDF_STATUS wlan_objmgr_pdev_iterate_obj_list( 295 struct wlan_objmgr_pdev *pdev, 296 enum wlan_objmgr_obj_type obj_type, 297 wlan_objmgr_pdev_op_handler handler, 298 void *arg, uint8_t lock_free_op, 299 wlan_objmgr_ref_dbgid dbg_id); 300 301 /** 302 * wlan_objmgr_trigger_pdev_comp_priv_object_creation() - create 303 * comp object of pdev 304 * @pdev: PDEV object 305 * @id: Component id 306 * 307 * API to create component private object in run time, this would be 308 * used for features which gets enabled in run time 309 * 310 * Return: SUCCESS on successful creation 311 * On FAILURE (appropriate failure codes are returned) 312 */ 313 QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_creation( 314 struct wlan_objmgr_pdev *pdev, 315 enum wlan_umac_comp_id id); 316 317 /** 318 * wlan_objmgr_trigger_pdev_comp_priv_object_deletion() - destroy 319 * comp object of pdev 320 * @pdev: PDEV object 321 * @id: Component id 322 * 323 * API to destroy component private object in run time, this would 324 * be used for features which gets disabled in run time 325 * 326 * Return: SUCCESS on successful deletion 327 * On FAILURE (appropriate failure codes are returned) 328 */ 329 QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_deletion( 330 struct wlan_objmgr_pdev *pdev, 331 enum wlan_umac_comp_id id); 332 333 /** 334 * wlan_objmgr_get_vdev_by_id_from_pdev() - find vdev using id from pdev 335 * @pdev: PDEV object 336 * @vdev_id: vdev id 337 * @dbg_id: id of the caller 338 * 339 * API to find vdev object pointer by vdev id from pdev's vdev list 340 * 341 * This API increments the ref count of the vdev object internally, the 342 * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement 343 * ref count 344 * 345 * Return: vdev pointer 346 * NULL on FAILURE 347 */ 348 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev( 349 struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 350 wlan_objmgr_ref_dbgid dbg_id); 351 352 /** 353 * wlan_objmgr_get_vdev_by_id_from_pdev_no_state() - find vdev using id from 354 * pdev 355 * @pdev: PDEV object 356 * @vdev_id: vdev id 357 * @dbg_id: id of the caller 358 * 359 * API to find vdev object pointer by vdev id from pdev's vdev list 360 * 361 * This API increments the ref count of the vdev object internally, the 362 * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement 363 * ref count 364 * 365 * Return: vdev pointer 366 * NULL on FAILURE 367 */ 368 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state( 369 struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, 370 wlan_objmgr_ref_dbgid dbg_id); 371 372 /** 373 * wlan_objmgr_get_vdev_by_macaddr_from_pdev() - find vdev using macaddr 374 * @pdev: PDEV object 375 * @macaddr: MAC address 376 * @dbg_id: id of the caller 377 * 378 * API to find vdev object pointer by vdev mac addr from pdev's vdev list 379 * 380 * This API increments the ref count of the vdev object internally, the 381 * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement 382 * ref count 383 * 384 * Return: vdev pointer 385 * NULL on FAILURE 386 */ 387 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev( 388 struct wlan_objmgr_pdev *pdev, uint8_t *macaddr, 389 wlan_objmgr_ref_dbgid dbg_id); 390 391 /** 392 * wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state() - find vdev using 393 * macaddr 394 * @pdev: PDEV object 395 * @macaddr: MAC address 396 * @dbg_id: id of the caller 397 * 398 * API to find vdev object pointer by vdev mac addr from pdev's vdev list 399 * 400 * This API increments the ref count of the vdev object internally, the 401 * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement 402 * ref count 403 * 404 * Return: vdev pointer 405 * NULL on FAILURE 406 */ 407 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state( 408 struct wlan_objmgr_pdev *pdev, uint8_t *macaddr, 409 wlan_objmgr_ref_dbgid dbg_id); 410 411 /** 412 * wlan_objmgr_pdev_get_comp_private_obj() - get pdev component private object 413 * @pdev: PDEV object 414 * @id: Component id 415 * 416 * API to get component private object 417 * 418 * Return: void *ptr on SUCCESS 419 * NULL on Failure 420 */ 421 void *wlan_objmgr_pdev_get_comp_private_obj( 422 struct wlan_objmgr_pdev *pdev, 423 enum wlan_umac_comp_id id); 424 425 /** 426 * wlan_pdev_obj_lock() - Acquire PDEV spinlock 427 * @pdev: PDEV object 428 * 429 * API to acquire PDEV lock 430 * Parent lock should not be taken in child lock context 431 * but child lock can be taken in parent lock context 432 * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) 433 * 434 * Return: void 435 */ 436 static inline void wlan_pdev_obj_lock(struct wlan_objmgr_pdev *pdev) 437 { 438 qdf_spin_lock_bh(&pdev->pdev_lock); 439 } 440 441 /** 442 * wlan_pdev_obj_unlock() - Release PDEV spinlock 443 * @pdev: PDEV object 444 * 445 * API to Release PDEV lock 446 * 447 * Return: void 448 */ 449 static inline void wlan_pdev_obj_unlock(struct wlan_objmgr_pdev *pdev) 450 { 451 qdf_spin_unlock_bh(&pdev->pdev_lock); 452 } 453 454 /** 455 * wlan_pdev_get_psoc() - get psoc 456 * @pdev: PDEV object 457 * 458 * API to get the psoc object from PDEV 459 * 460 * Return: 461 * @psoc: PSOC object 462 */ 463 static inline struct wlan_objmgr_psoc *wlan_pdev_get_psoc( 464 struct wlan_objmgr_pdev *pdev) 465 { 466 return pdev->pdev_objmgr.wlan_psoc; 467 } 468 469 /** 470 * wlan_pdev_set_psoc() - set psoc 471 * @pdev: PDEV object 472 * @psoc: PSOC object 473 * 474 * API to set the psoc object from PDEV 475 * 476 * Return: void 477 */ 478 static inline void wlan_pdev_set_psoc(struct wlan_objmgr_pdev *pdev, 479 struct wlan_objmgr_psoc *psoc) 480 { 481 pdev->pdev_objmgr.wlan_psoc = psoc; 482 } 483 484 /** 485 * wlan_pdev_nif_fw_cap_set() - set fw caps 486 * @pdev: PDEV object 487 * @cap: capability flag to be set 488 * 489 * API to set fw caps in pdev 490 * 491 * Return: void 492 */ 493 static inline void wlan_pdev_nif_fw_cap_set(struct wlan_objmgr_pdev *pdev, 494 uint32_t cap) 495 { 496 pdev->pdev_nif.pdev_fw_caps |= cap; 497 } 498 499 /** 500 * wlan_pdev_nif_fw_cap_clear() - clear fw cap 501 * @pdev: PDEV object 502 * @cap: capability flag to be cleared 503 * 504 * API to clear fw caps in pdev 505 * 506 * Return: void 507 */ 508 static inline void wlan_pdev_nif_fw_cap_clear(struct wlan_objmgr_pdev *pdev, 509 uint32_t cap) 510 { 511 pdev->pdev_nif.pdev_fw_caps &= ~cap; 512 } 513 514 /** 515 * wlan_pdev_nif_fw_cap_get() - get fw caps 516 * @pdev: PDEV object 517 * @cap: capability flag to be checked 518 * 519 * API to know, whether particular fw caps flag is set in pdev 520 * 521 * Return: 1 (for set) or 0 (for not set) 522 */ 523 static inline uint8_t wlan_pdev_nif_fw_cap_get(struct wlan_objmgr_pdev *pdev, 524 uint32_t cap) 525 { 526 return (pdev->pdev_nif.pdev_fw_caps & cap) ? 1 : 0; 527 } 528 529 /** 530 * wlan_pdev_nif_feat_cap_set() - set feature caps 531 * @pdev: PDEV object 532 * @cap: capability flag to be set 533 * 534 * API to set feat caps in pdev 535 * 536 * Return: void 537 */ 538 static inline void wlan_pdev_nif_feat_cap_set(struct wlan_objmgr_pdev *pdev, 539 uint32_t cap) 540 { 541 pdev->pdev_nif.pdev_feature_caps |= cap; 542 } 543 544 /** 545 * wlan_pdev_nif_feat_cap_clear() - clear feature caps 546 * @pdev: PDEV object 547 * @cap: capability flag to be cleared 548 * 549 * API to clear feat caps in pdev 550 * 551 * Return: void 552 */ 553 static inline void wlan_pdev_nif_feat_cap_clear(struct wlan_objmgr_pdev *pdev, 554 uint32_t cap) 555 { 556 pdev->pdev_nif.pdev_feature_caps &= ~cap; 557 } 558 559 /** 560 * wlan_pdev_nif_feat_cap_get() - get feature caps 561 * @pdev: PDEV object 562 * @cap: capability flag to be checked 563 * 564 * API to know, whether particular feat caps flag is set in pdev 565 * 566 * Return: 1 (for set) or 0 (for not set) 567 */ 568 static inline uint8_t wlan_pdev_nif_feat_cap_get(struct wlan_objmgr_pdev *pdev, 569 uint32_t cap) 570 { 571 return (pdev->pdev_nif.pdev_feature_caps & cap) ? 1 : 0; 572 } 573 574 /** 575 * wlan_pdev_mlme_op_set() - set operation flags 576 * @pdev: PDEV object 577 * @op: Operation flag to be set 578 * 579 * API to set operation flag in pdev 580 * 581 * Return: void 582 */ 583 static inline void wlan_pdev_mlme_op_set(struct wlan_objmgr_pdev *pdev, 584 uint32_t op) 585 { 586 pdev->pdev_mlme.pdev_op_flags |= op; 587 } 588 589 /** 590 * wlan_pdev_mlme_op_clear() - clear op flags 591 * @pdev: PDEV object 592 * @op: Operation flag to be cleared 593 * 594 * API to clear op flag in pdev 595 * 596 * Return: void 597 */ 598 static inline void wlan_pdev_mlme_op_clear(struct wlan_objmgr_pdev *pdev, 599 uint32_t op) 600 { 601 pdev->pdev_mlme.pdev_op_flags &= ~op; 602 } 603 604 /** 605 * wlan_pdev_mlme_op_get() - get op flag 606 * @pdev: PDEV object 607 * @op: Operation flag to be checked 608 * 609 * API to know, whether particular operation flag is set in pdev 610 * 611 * Return: 1 (for set) or 0 (for not set) 612 */ 613 static inline uint8_t wlan_pdev_mlme_op_get(struct wlan_objmgr_pdev *pdev, 614 uint32_t op) 615 { 616 return (pdev->pdev_mlme.pdev_op_flags & op) ? 1 : 0; 617 } 618 619 /** 620 * wlan_pdev_get_hw_macaddr() - get hw macaddr 621 * @pdev: PDEV object 622 * 623 * API to get HW MAC address form PDEV 624 * 625 * Caller need to acquire lock with wlan_pdev_obj_lock() 626 * 627 * Return: @macaddr -MAC address 628 */ 629 static inline uint8_t *wlan_pdev_get_hw_macaddr(struct wlan_objmgr_pdev *pdev) 630 { 631 if (!pdev) 632 return NULL; 633 634 /* This API is invoked with lock acquired, do not add log prints */ 635 return pdev->pdev_nif.macaddr; 636 } 637 638 /** 639 * wlan_pdev_set_hw_macaddr() - set hw macaddr 640 * @pdev: PDEV object 641 * @macaddr: MAC address 642 * 643 * API to set HW MAC address form PDEV 644 * 645 * Caller need to acquire lock with wlan_pdev_obj_lock() 646 * 647 * Return: void 648 */ 649 static inline void wlan_pdev_set_hw_macaddr(struct wlan_objmgr_pdev *pdev, 650 uint8_t *macaddr) 651 { 652 /* This API is invoked with lock acquired, do not add log prints */ 653 WLAN_ADDR_COPY(pdev->pdev_nif.macaddr, macaddr); 654 } 655 656 /** 657 * wlan_pdev_get_ospriv() - get os priv pointer 658 * @pdev: PDEV object 659 * 660 * API to get OS private pointer from PDEV 661 * 662 * Return: ospriv - private pointer 663 */ 664 static inline struct pdev_osif_priv *wlan_pdev_get_ospriv( 665 struct wlan_objmgr_pdev *pdev) 666 { 667 return pdev->pdev_nif.pdev_ospriv; 668 } 669 670 /** 671 * wlan_pdev_reset_ospriv() - reset os priv pointer 672 * @pdev: PDEV object 673 * 674 * API to reset OS private pointer in PDEV 675 * 676 * Return: void 677 */ 678 static inline void wlan_pdev_reset_ospriv(struct wlan_objmgr_pdev *pdev) 679 { 680 pdev->pdev_nif.pdev_ospriv = NULL; 681 } 682 683 /** 684 * wlan_pdev_set_max_vdev_count() - set pdev max vdev count 685 * @pdev: PDEV object 686 * @vdev count: Max vdev count 687 * 688 * API to set Max vdev count 689 * 690 * Return: void 691 */ 692 static inline void wlan_pdev_set_max_vdev_count(struct wlan_objmgr_pdev *pdev, 693 uint8_t max_vdev_count) 694 { 695 pdev->pdev_objmgr.max_vdev_count = max_vdev_count; 696 } 697 698 /** 699 * wlan_pdev_get_max_vdev_count() - get pdev max vdev count 700 * @pdev: PDEV object 701 * 702 * API to set Max vdev count 703 * 704 * Return: @vdev count: Max vdev count 705 */ 706 static inline uint8_t wlan_pdev_get_max_vdev_count( 707 struct wlan_objmgr_pdev *pdev) 708 { 709 return pdev->pdev_objmgr.max_vdev_count; 710 } 711 712 /** 713 * DOC: Examples to use PDEV ref count APIs 714 * 715 * In all the scenarios, the pair of API should be followed 716 * otherwise it lead to memory leak 717 * 718 * scenario 1: 719 * 720 * wlan_objmgr_pdev_obj_create() 721 * ---- 722 * wlan_objmgr_pdev_obj_delete() 723 * 724 * scenario 2: 725 * 726 * wlan_objmgr_pdev_get_ref() 727 * ---- 728 * the operations which are done on 729 * pdev object 730 * ---- 731 * wlan_objmgr_pdev_release_ref() 732 * 733 * scenario 3: 734 * 735 * wlan_objmgr_get_pdev_by_id[_no_state]() 736 * ---- 737 * the operations which are done on 738 * pdev object 739 * ---- 740 * wlan_objmgr_pdev_release_ref() 741 * 742 * scenario 4: 743 * 744 * wlan_objmgr_get_pdev_by_macaddr[_no_state]() 745 * ---- 746 * the operations which are done on 747 * pdev object 748 * ---- 749 * wlan_objmgr_pdev_release_ref() 750 */ 751 752 /** 753 * wlan_objmgr_pdev_get_ref() - increment ref count 754 * @pdev: PDEV object 755 * @id: Object Manager ref debug id 756 * 757 * API to increment ref count of pdev 758 * 759 * Return: void 760 */ 761 void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev, 762 wlan_objmgr_ref_dbgid id); 763 764 /** 765 * wlan_objmgr_pdev_try_get_ref() - increment ref count, if allowed 766 * @pdev: PDEV object 767 * @id: Object Manager ref debug id 768 * 769 * API to increment ref count of pdev after checking valid object state 770 * 771 * Return: void 772 */ 773 QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev, 774 wlan_objmgr_ref_dbgid id); 775 776 /** 777 * wlan_objmgr_pdev_release_ref() - decrement ref count 778 * @pdev: PDEV object 779 * @id: Object Manager ref debug id 780 * 781 * API to decrement ref count of pdev, if ref count is 1, it initiates the 782 * PDEV deletion 783 * 784 * Return: void 785 */ 786 void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev, 787 wlan_objmgr_ref_dbgid id); 788 789 /** 790 * wlan_objmgr_pdev_get_first_vdev() - Get first vdev of pdev 791 * @pdev: PDEV object 792 * @dbg_id: Object Manager ref debug id 793 * 794 * API to get reference to first vdev of pdev. 795 * 796 * Return: reference to first vdev 797 */ 798 struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev( 799 struct wlan_objmgr_pdev *pdev, 800 wlan_objmgr_ref_dbgid dbg_id); 801 802 /** 803 * wlan_objmgr_pdev_get_pdev_id() - get pdev id 804 * @pdev: PDEV object 805 * 806 * API to get pdev id from pdev object 807 * 808 * Return: @pdev id 809 */ 810 static inline 811 uint8_t wlan_objmgr_pdev_get_pdev_id(struct wlan_objmgr_pdev *pdev) 812 { 813 return pdev->pdev_objmgr.wlan_pdev_id; 814 } 815 816 /** 817 * wlan_pdev_set_tgt_if_handle(): API to set target if handle in pdev object 818 * @pdev: Pdev pointer 819 * @tgt_if_handle: target interface handle 820 * 821 * API to set target interface handle in pdev object 822 * 823 * Caller needs to acquire lock with wlan_pdev_obj_lock() 824 * 825 * Return: None 826 */ 827 static inline void wlan_pdev_set_tgt_if_handle(struct wlan_objmgr_pdev *pdev, 828 void *tgt_if_handle) 829 { 830 /* This API is invoked with lock acquired, do not add log prints */ 831 if (pdev == NULL) 832 return; 833 834 pdev->tgt_if_handle = tgt_if_handle; 835 } 836 837 /** 838 * wlan_pdev_get_tgt_if_handle(): API to get target interface handle 839 * @pdev: Pdev pointer 840 * 841 * API to get target interface handle from pdev object 842 * 843 * Return: target interface handle 844 */ 845 static inline void *wlan_pdev_get_tgt_if_handle(struct wlan_objmgr_pdev *pdev) 846 { 847 if (pdev == NULL) 848 return NULL; 849 850 return pdev->tgt_if_handle; 851 } 852 853 /** 854 * wlan_pdev_set_max_peer_count() - set max peer count 855 * @vdev: PDEV object 856 * @count: Max peer count 857 * 858 * API to set max peer count of PDEV 859 * 860 * Return: void 861 */ 862 static inline void wlan_pdev_set_max_peer_count(struct wlan_objmgr_pdev *pdev, 863 uint16_t count) 864 { 865 pdev->pdev_objmgr.max_peer_count = count; 866 } 867 868 /** 869 * wlan_pdev_get_max_peer_count() - get max peer count 870 * @pdev: PDEV object 871 * 872 * API to get max peer count of PDEV 873 * 874 * Return: max peer count 875 */ 876 static inline uint16_t wlan_pdev_get_max_peer_count( 877 struct wlan_objmgr_pdev *pdev) 878 { 879 return pdev->pdev_objmgr.max_peer_count; 880 } 881 882 /** 883 * wlan_pdev_get_peer_count() - get pdev peer count 884 * @pdev: PDEV object 885 * 886 * API to get peer count from PDEV 887 * 888 * Return: peer_count - pdev's peer count 889 */ 890 static inline uint16_t wlan_pdev_get_peer_count(struct wlan_objmgr_pdev *pdev) 891 { 892 return pdev->pdev_objmgr.wlan_peer_count; 893 } 894 895 /** 896 * wlan_pdev_get_temp_peer_count() - get pdev temporary peer count 897 * @pdev: PDEV object 898 * 899 * API to get temporary peer count from PDEV 900 * 901 * Return: temp_peer_count - pdev's temporary peer count 902 */ 903 static inline uint16_t wlan_pdev_get_temp_peer_count(struct wlan_objmgr_pdev *pdev) 904 { 905 return pdev->pdev_objmgr.temp_peer_count; 906 } 907 908 909 /** 910 * wlan_pdev_incr_peer_count() - increment pdev peer count 911 * @pdev: PDEV object 912 * 913 * API to increment peer count of PDEV by 1 914 * 915 * Return: void 916 */ 917 static inline void wlan_pdev_incr_peer_count(struct wlan_objmgr_pdev *pdev) 918 { 919 pdev->pdev_objmgr.wlan_peer_count++; 920 } 921 922 /** 923 * wlan_pdev_decr_peer_count() - decrement pdev peer count 924 * @pdev: PDEV object 925 * 926 * API to decrement peer count of PDEV by 1 927 * 928 * Return: void 929 */ 930 static inline void wlan_pdev_decr_peer_count(struct wlan_objmgr_pdev *pdev) 931 { 932 pdev->pdev_objmgr.wlan_peer_count--; 933 } 934 935 /** 936 * wlan_pdev_incr_temp_peer_count() - increment temporary pdev peer count 937 * @pdev: PDEV object 938 * 939 * API to increment temporary peer count of PDEV by 1 940 * 941 * Return: void 942 */ 943 static inline void wlan_pdev_incr_temp_peer_count(struct wlan_objmgr_pdev *pdev) 944 { 945 pdev->pdev_objmgr.temp_peer_count++; 946 } 947 948 /** 949 * wlan_pdev_decr_temp_peer_count() - decrement pdev temporary peer count 950 * @pdev: PDEV object 951 * 952 * API to decrement temporary peer count of PDEV by 1 953 * 954 * Return: void 955 */ 956 static inline void wlan_pdev_decr_temp_peer_count(struct wlan_objmgr_pdev *pdev) 957 { 958 pdev->pdev_objmgr.temp_peer_count--; 959 } 960 961 /** 962 * wlan_pdev_get_vdev_count() - get PDEV vdev count 963 * @pdev: PDEV object 964 * 965 * API to get vdev count from PDEV 966 * 967 * Return: vdev_count - pdev's vdev count 968 */ 969 static inline uint8_t wlan_pdev_get_vdev_count(struct wlan_objmgr_pdev *pdev) 970 { 971 return pdev->pdev_objmgr.wlan_vdev_count; 972 } 973 974 /** 975 * wlan_pdev_set_dp_handle() - set dp handle 976 * @pdev: pdev object pointer 977 * @dp_handle: Data path module handle 978 * 979 * Return: void 980 */ 981 static inline void wlan_pdev_set_dp_handle(struct wlan_objmgr_pdev *pdev, 982 void *dp_handle) 983 { 984 if (qdf_unlikely(!pdev)) { 985 QDF_BUG(0); 986 return; 987 } 988 989 pdev->dp_handle = dp_handle; 990 } 991 992 /** 993 * wlan_pdev_get_dp_handle() - get dp handle 994 * @pdev: pdev object pointer 995 * 996 * Return: dp handle 997 */ 998 static inline void *wlan_pdev_get_dp_handle(struct wlan_objmgr_pdev *pdev) 999 { 1000 if (qdf_unlikely(!pdev)) { 1001 QDF_BUG(0); 1002 return NULL; 1003 } 1004 1005 return pdev->dp_handle; 1006 } 1007 1008 #endif /* _WLAN_OBJMGR_PDEV_H_*/ 1009