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