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