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