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