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