/* * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /** * DOC: Define the pdev data structure of UMAC * Public APIs to perform operations on Global objects */ #ifndef _WLAN_OBJMGR_PDEV_OBJ_H_ #define _WLAN_OBJMGR_PDEV_OBJ_H_ #include #include "wlan_objmgr_psoc_obj.h" #include /* STATUS: scanning */ #define WLAN_PDEV_F_SCAN 0x00000001 /* STATUS: use short slot time*/ #define WLAN_PDEV_F_SHSLOT 0x00000002 /* STATUS: channel switch event pending after DFS RADAR */ #define WLAN_PDEV_F_DFS_CHANSWITCH_PENDING 0x00000004 /* TX Power: fixed rate */ #define WLAN_PDEV_F_TXPOW_FIXED 0x00000008 /* STATUS: use short preamble */ #define WLAN_PDEV_F_SHPREAMBLE 0x00000010 /* CONF: do alignment pad */ #define WLAN_PDEV_F_DATAPAD 0x00000020 /* STATUS: protection enabled */ #define WLAN_PDEV_F_USEPROT 0x00000040 /* STATUS: use barker preamble*/ #define WLAN_PDEV_F_USEBARKER 0x00000080 /* CONF: DISABLE 2040 coexistence */ #define WLAN_PDEV_F_COEXT_DISABLE 0x00000100 /* STATE: scan pending */ #define WLAN_PDEV_F_SCAN_PENDING 0x00000200 /* CONF: send regclassids in country ie */ #define WLAN_PDEV_F_REGCLASS 0x00000400 /* CONF: block the use of DFS channels */ #define WLAN_PDEV_F_BLKDFSCHAN 0x00000800 /* STATUS: 11D in used */ #define WLAN_PDEV_F_DOT11D 0x00001000 /* STATUS: 11D channel-switch detected */ #define WLAN_PDEV_F_RADAR 0x00002000 /* CONF: A-MPDU supported */ #define WLAN_PDEV_F_AMPDU 0x00004000 /* CONF: A-MSDU supported */ #define WLAN_PDEV_F_AMSDU 0x00008000 /* CONF: HT traffic protected */ #define WLAN_PDEV_F_HTPROT 0x00010000 /* CONF: Reset once */ #define WLAN_PDEV_F_RESET 0x00020000 /* CONF: ignore 11d beacon */ #define WLAN_PDEV_F_IGNORE_11D_BEACON 0x00040000 /* HT CAP IE present */ #define WLAN_PDEV_F_HTVIE 0x00080000 /* radio in middle of CSA */ #define WLAN_PDEV_F_CSA_WAIT 0x00100000 /* wnm support flag */ #define WLAN_PDEV_F_WNM 0x00200000 #define WLAN_PDEV_F_2G_CSA 0x00400000 /* enhanced independent repeater */ #define WLAN_PDEV_F_ENH_REP_IND 0x00800000 /* Disable Tx AMSDU for station vap */ #define WLAN_PDEV_F_STA_AMPDU_DIS 0x01000000 /* do not send probe request in passive channel */ #define WLAN_PDEV_F_STRICT_PSCAN_EN 0x02000000 /* dupie (ANA,pre ANA ) */ /*#define WLAN_PDEV_F_DUPIE 0x00200000*/ /* Chan concurrency enabled */ #define WLAN_PDEV_F_CHAN_CONCURRENCY 0x08000000 /* Multivdev restart enabled */ #define WLAN_PDEV_F_MULTIVDEV_RESTART 0x10000000 /* MBSS IE enable */ #define WLAN_PDEV_F_MBSS_IE_ENABLE 0x20000000 /* VDEV Peer delete all */ #define WLAN_PDEV_F_DELETE_ALL_PEER 0x40000000 /* PDEV BEacon Protection */ #define WLAN_PDEV_F_BEACON_PROTECTION 0x80000000 /* PDEV ext flags */ /* CFR support enabled */ #define WLAN_PDEV_FEXT_CFR_EN 0x00000001 /* EMA AP support enable */ #define WLAN_PDEV_FEXT_EMA_AP_ENABLE 0x00000002 /* scan radio support */ #define WLAN_PDEV_FEXT_SCAN_RADIO 0x00000004 /* DFS disable, valid only for scan radio supported pdevs */ #define WLAN_PDEV_FEXT_SCAN_RADIO_DFS_DIS 0x00000008 /* normal Spectral scan support disable */ #define WLAN_PDEV_FEXT_NORMAL_SPECTRAL_SCAN_DIS 0x00000010 /* agile Spectral scan support disable for 20/40/80 MHz */ #define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_DIS 0x00000020 /* agile Spectral scan support disable for 160 MHz */ #define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_160_DIS 0x00000040 /* agile Spectral scan support disable for 80+80 MHz */ #define WLAN_PDEV_FEXT_AGILE_SPECTRAL_SCAN_80P80_DIS 0x00000080 /* PDEV op flags */ /* Enable htrate for wep and tkip */ #define WLAN_PDEV_OP_WEP_TKIP_HTRATE 0x00000001 /* non HT AP found flag */ #define WLAN_PDEV_OP_NON_HT_AP 0x00000002 /* block the use of DFS channels flag */ #define WLAN_PDEV_OP_BLK_DFS_CHAN 0x00000004 /* 11.h flag */ #define WLAN_PDEV_OP_DOTH 0x00000008 /* Off-channel support enabled */ #define WLAN_PDEV_OP_OFFCHAN 0x00000010 #define WLAN_PDEV_OP_HT20ADHOC 0x00000020 #define WLAN_PDEV_OP_HT40ADHOC 0x00000040 #define WLAN_PDEV_OP_HTADHOC_AGGR 0x00000080 /* disallow CC change when assoc completes */ #define WLAN_PDEV_OP_DISALLOW_AUTO_CC 0x00000100 /* Is P2P Enabled? */ #define WLAN_PDEV_OP_P2P 0x00000200 /* disallowed */ #define WLAN_PDEV_OP_IGNORE_DYNHALT 0x00000400 /* overwrite probe response IE with beacon IE */ #define WLAN_PDEV_OP_OVERRIDE_PROBERESP 0x00000800 #define WLAN_PDEV_OP_DROPSTA_QUERY 0x00001000 #define WLAN_PDEV_OP_BLK_REPORT_FLOOD 0x00002000 /* Offchan scan */ #define WLAN_PDEV_OP_OFFCHAN_SCAN 0x00004000 /*Consider OBSS non-erp to change to long slot*/ #define WLAN_PDEV_OP_OBSS_LONGSLOT 0x00008000 /* enable/disable min rssi cli block */ #define WLAN_PDEV_OP_MIN_RSSI_ENABLE 0x00010000 /* PDEV VDEV restart is in progress */ #define WLAN_PDEV_OP_RESTART_INPROGRESS 0x00020000 /* PDEV MBSSID VDEV restart trigger */ #define WLAN_PDEV_OP_MBSSID_RESTART 0x00040000 /* RADAR DETECT Defer */ #define WLAN_PDEV_OP_RADAR_DETECT_DEFER 0x00080000 struct osif_pdev_priv; /** * struct wlan_objmgr_pdev_nif - pdev object nif structure * @pdev_fw_caps: radio specific FW capabilities * @pdev_feature_caps: radio specific feature capabilities * @pdev_feature_ext_caps: radio specific feature capabilities extended * @pdev_ospriv: OS specific pointer * @macaddr[]: MAC address * @notified_ap_vdev: ap vdev */ struct wlan_objmgr_pdev_nif { uint32_t pdev_fw_caps; uint32_t pdev_feature_caps; uint32_t pdev_feature_ext_caps; struct pdev_osif_priv *pdev_ospriv; uint8_t macaddr[QDF_MAC_ADDR_SIZE]; uint8_t notified_ap_vdev; }; /** * struct wlan_objmgr_pdev_mlme - pdev object mlme structure * @pdev_op_flags: PDEV operation flags, can be used to know the * operation status (deletion progress, etc) */ struct wlan_objmgr_pdev_mlme { uint32_t pdev_op_flags; }; /** * struct wlan_objmgr_pdev_objmgr - pdev object object manager structure * @wlan_pdev_id: PDEV id * @wlan_vdev_count: VDEVs count * @max_vdev_count: Max no. of VDEVs supported by this PDEV * @print_cnt: Count to throttle Logical delete prints * @wlan_vdev_list: List maintains the VDEVs created on this PDEV * @wlan_peer_count: Peer count * @max_peer_count: Max Peer count * @temp_peer_count: Temporary peer count * @max_monitor_vdev_count: Max monitor vdev count * @wlan_psoc: back pointer to PSOC, its attached to * @ref_cnt: Ref count * @ref_id_dbg: Array to track Ref count */ struct wlan_objmgr_pdev_objmgr { uint8_t wlan_pdev_id; uint8_t wlan_vdev_count; uint8_t max_vdev_count; uint8_t print_cnt; qdf_list_t wlan_vdev_list; uint16_t wlan_peer_count; uint16_t max_peer_count; uint16_t temp_peer_count; uint8_t max_monitor_vdev_count; struct wlan_objmgr_psoc *wlan_psoc; qdf_atomic_t ref_cnt; qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX]; }; /** * struct wlan_objmgr_pdev - PDEV common object * @current_chan_list: Active/current Channel list of the radio * @pdev_nif: pdev nif structure * @pdev_objmgr: pdev object manager structure * @pdev_mlme: pdev MLME structure * @pdev_comp_priv_obj[]: component's private object array * @obj_status[]: object status of each component object * @obj_state: object state * @tgt_if_handle: Target interface handle * @pdev_lock: lock to protect object */ struct wlan_objmgr_pdev { struct wlan_chan_list *current_chan_list; struct wlan_objmgr_pdev_nif pdev_nif; struct wlan_objmgr_pdev_objmgr pdev_objmgr; struct wlan_objmgr_pdev_mlme pdev_mlme; void *pdev_comp_priv_obj[WLAN_UMAC_MAX_COMPONENTS]; QDF_STATUS obj_status[WLAN_UMAC_MAX_COMPONENTS]; WLAN_OBJ_STATE obj_state; target_pdev_info_t *tgt_if_handle; qdf_spinlock_t pdev_lock; }; /** ** APIs to Create/Delete Global object APIs */ /** * wlan_objmgr_pdev_obj_create() - pdev create * @psoc: PSOC object * @scn: os private object * * Creates PDEV object, intializes with default values * Invokes the registered notifiers to create component object * * Return: Handle to struct wlan_objmgr_psoc on successful creation, * NULL on Failure (on Mem alloc failure and Component objects * Failure) */ struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create( struct wlan_objmgr_psoc *psoc, struct pdev_osif_priv *osif_priv); /** * wlan_objmgr_pdev_obj_delete() - pdev delete * @psoc: PDEV object * * Logically deletes PDEV object, * Once all the references are released, object manager invokes the registered * notifiers to destroy component objects * * Return: SUCCESS/FAILURE */ QDF_STATUS wlan_objmgr_pdev_obj_delete(struct wlan_objmgr_pdev *pdev); /** ** APIs to attach/detach component objects */ /** * wlan_objmgr_pdev_component_obj_attach() - pdev comp object attach * @psoc: PDEV object * @id: Component id * @comp_priv_obj: component's private object pointer * @status: Component's private object creation status * * API to be used for attaching component object with PDEV common object * * Return: SUCCESS on successful storing of component's object in common object * On FAILURE (appropriate failure codes are returned) */ QDF_STATUS wlan_objmgr_pdev_component_obj_attach( struct wlan_objmgr_pdev *pdev, enum wlan_umac_comp_id id, void *comp_priv_obj, QDF_STATUS status); /** * wlan_objmgr_pdev_component_obj_detach() - pdev comp object detach * @psoc: PDEV object * @id: Component id * @comp_priv_obj: component's private object pointer * * API to be used for detaching component object with PDEV common object * * Return: SUCCESS on successful removal of component's object from common * object * On FAILURE (appropriate failure codes are returned) */ QDF_STATUS wlan_objmgr_pdev_component_obj_detach( struct wlan_objmgr_pdev *pdev, enum wlan_umac_comp_id id, void *comp_priv_obj); /** ** APIs to operations on pdev objects */ typedef void (*wlan_objmgr_pdev_op_handler)(struct wlan_objmgr_pdev *pdev, void *object, void *arg); /** * wlan_objmgr_pdev_iterate_obj_list() - operate on all objects of pdev * @pdev: PDEV object * @obj_type: VDEV_OP/PEER_OP * @handler: the handler will be called for each object of requested type * the handler should be implemented to perform required operation * @arg: agruments passed by caller * @lock_free_op: its obsolete * @dbg_id: id of the caller * * API to be used for performing the operations on all VDEV/PEER objects * of pdev * * Return: SUCCESS/FAILURE */ QDF_STATUS wlan_objmgr_pdev_iterate_obj_list( struct wlan_objmgr_pdev *pdev, enum wlan_objmgr_obj_type obj_type, wlan_objmgr_pdev_op_handler handler, void *arg, uint8_t lock_free_op, wlan_objmgr_ref_dbgid dbg_id); /** * wlan_objmgr_trigger_pdev_comp_priv_object_creation() - create * comp object of pdev * @pdev: PDEV object * @id: Component id * * API to create component private object in run time, this would be * used for features which gets enabled in run time * * Return: SUCCESS on successful creation * On FAILURE (appropriate failure codes are returned) */ QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_creation( struct wlan_objmgr_pdev *pdev, enum wlan_umac_comp_id id); /** * wlan_objmgr_trigger_pdev_comp_priv_object_deletion() - destroy * comp object of pdev * @pdev: PDEV object * @id: Component id * * API to destroy component private object in run time, this would * be used for features which gets disabled in run time * * Return: SUCCESS on successful deletion * On FAILURE (appropriate failure codes are returned) */ QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_deletion( struct wlan_objmgr_pdev *pdev, enum wlan_umac_comp_id id); /** * wlan_objmgr_get_vdev_by_id_from_pdev() - find vdev using id from pdev * @pdev: PDEV object * @vdev_id: vdev id * @dbg_id: id of the caller * * API to find vdev object pointer by vdev id from pdev's vdev list * * This API increments the ref count of the vdev object internally, the * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement * ref count * * Return: vdev pointer * NULL on FAILURE */ #ifdef WLAN_OBJMGR_REF_ID_TRACE struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_debug( struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, wlan_objmgr_ref_dbgid dbg_id, const char *func, int line); #define wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, dbgid) \ wlan_objmgr_get_vdev_by_id_from_pdev_debug(pdev, \ vdev_id, dbgid, __func__, __LINE__) #else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev( struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, wlan_objmgr_ref_dbgid dbg_id); #endif /** * wlan_objmgr_get_vdev_by_id_from_pdev_no_state() - find vdev using id * from pdev * @pdev: PDEV object * @vdev_id: vdev id * @dbg_id: id of the caller * * API to find vdev object pointer by vdev id from pdev's vdev list * * This API increments the ref count of the vdev object internally, the * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement * ref count * * Return: vdev pointer * NULL on FAILURE */ #ifdef WLAN_OBJMGR_REF_ID_TRACE struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state_debug( struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, wlan_objmgr_ref_dbgid dbg_id, const char *func, int line); #define wlan_objmgr_get_vdev_by_id_from_pdev_no_state(pdev, \ vdev_id, dbgid) \ wlan_objmgr_get_vdev_by_id_from_pdev_no_state_debug(pdev, \ vdev_id, dbgid, __func__, __LINE__) #else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state( struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, wlan_objmgr_ref_dbgid dbg_id); #endif /** * wlan_objmgr_get_vdev_by_macaddr_from_pdev() - find vdev using macaddr * @pdev: PDEV object * @macaddr: MAC address * @dbg_id: id of the caller * * API to find vdev object pointer by vdev mac addr from pdev's vdev list * * This API increments the ref count of the vdev object internally, the * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement * ref count * * Return: vdev pointer * NULL on FAILURE */ #ifdef WLAN_OBJMGR_REF_ID_TRACE struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug( struct wlan_objmgr_pdev *pdev, uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id, const char *fnc, int ln); #define wlan_objmgr_get_vdev_by_macaddr_from_pdev(pdev, macaddr, dbgid) \ wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug(pdev, macaddr, \ dbgid, __func__, __LINE__) #else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev( struct wlan_objmgr_pdev *pdev, uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id); #endif /** * wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state() - find vdev using * macaddr * @pdev: PDEV object * @macaddr: MAC address * @dbg_id: id of the caller * * API to find vdev object pointer by vdev mac addr from pdev's vdev list * * This API increments the ref count of the vdev object internally, the * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement * ref count * * Return: vdev pointer * NULL on FAILURE */ #ifdef WLAN_OBJMGR_REF_ID_TRACE struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug( struct wlan_objmgr_pdev *pdev, uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id, const char *func, int line); #define wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(pdev, macaddr, \ dbgid) \ wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug(pdev, \ macaddr, dbgid, __func__, __LINE__) #else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state( struct wlan_objmgr_pdev *pdev, uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id); #endif /** * wlan_objmgr_pdev_get_first_vdev() - Get first vdev of pdev * @pdev: PDEV object * @dbg_id: Object Manager ref debug id * * API to get reference to first vdev of pdev. * * Return: reference to first vdev */ #ifdef WLAN_OBJMGR_REF_ID_TRACE struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev_debug( struct wlan_objmgr_pdev *pdev, wlan_objmgr_ref_dbgid dbg_id, const char *func, int line); #define wlan_objmgr_pdev_get_first_vdev(pdev, dbgid) \ wlan_objmgr_pdev_get_first_vdev_debug(pdev, dbgid, \ __func__, __LINE__) #else struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev( struct wlan_objmgr_pdev *pdev, wlan_objmgr_ref_dbgid dbg_id); #endif /** * wlan_objmgr_pdev_get_comp_private_obj() - get pdev component private object * @pdev: PDEV object * @id: Component id * * API to get component private object * * Return: void *ptr on SUCCESS * NULL on Failure */ void *wlan_objmgr_pdev_get_comp_private_obj( struct wlan_objmgr_pdev *pdev, enum wlan_umac_comp_id id); /** * wlan_pdev_obj_lock() - Acquire PDEV spinlock * @pdev: PDEV object * * API to acquire PDEV lock * Parent lock should not be taken in child lock context * but child lock can be taken in parent lock context * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) * * Return: void */ static inline void wlan_pdev_obj_lock(struct wlan_objmgr_pdev *pdev) { qdf_spin_lock_bh(&pdev->pdev_lock); } /** * wlan_pdev_obj_unlock() - Release PDEV spinlock * @pdev: PDEV object * * API to Release PDEV lock * * Return: void */ static inline void wlan_pdev_obj_unlock(struct wlan_objmgr_pdev *pdev) { qdf_spin_unlock_bh(&pdev->pdev_lock); } /** * wlan_pdev_get_psoc() - get psoc * @pdev: PDEV object * * API to get the psoc object from PDEV * * Return: * @psoc: PSOC object */ static inline struct wlan_objmgr_psoc *wlan_pdev_get_psoc( struct wlan_objmgr_pdev *pdev) { return pdev->pdev_objmgr.wlan_psoc; } /** * wlan_pdev_set_psoc() - set psoc * @pdev: PDEV object * @psoc: PSOC object * * API to set the psoc object from PDEV * * Return: void */ static inline void wlan_pdev_set_psoc(struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_psoc *psoc) { pdev->pdev_objmgr.wlan_psoc = psoc; } /** * wlan_pdev_nif_fw_cap_set() - set fw caps * @pdev: PDEV object * @cap: capability flag to be set * * API to set fw caps in pdev * * Return: void */ static inline void wlan_pdev_nif_fw_cap_set(struct wlan_objmgr_pdev *pdev, uint32_t cap) { pdev->pdev_nif.pdev_fw_caps |= cap; } /** * wlan_pdev_nif_fw_cap_clear() - clear fw cap * @pdev: PDEV object * @cap: capability flag to be cleared * * API to clear fw caps in pdev * * Return: void */ static inline void wlan_pdev_nif_fw_cap_clear(struct wlan_objmgr_pdev *pdev, uint32_t cap) { pdev->pdev_nif.pdev_fw_caps &= ~cap; } /** * wlan_pdev_nif_fw_cap_get() - get fw caps * @pdev: PDEV object * @cap: capability flag to be checked * * API to know, whether particular fw caps flag is set in pdev * * Return: 1 (for set) or 0 (for not set) */ static inline uint8_t wlan_pdev_nif_fw_cap_get(struct wlan_objmgr_pdev *pdev, uint32_t cap) { return (pdev->pdev_nif.pdev_fw_caps & cap) ? 1 : 0; } /** * wlan_pdev_nif_feat_cap_set() - set feature caps * @pdev: PDEV object * @cap: capability flag to be set * * API to set feat caps in pdev * * Return: void */ static inline void wlan_pdev_nif_feat_cap_set(struct wlan_objmgr_pdev *pdev, uint32_t cap) { pdev->pdev_nif.pdev_feature_caps |= cap; } /** * wlan_pdev_nif_feat_cap_clear() - clear feature caps * @pdev: PDEV object * @cap: capability flag to be cleared * * API to clear feat caps in pdev * * Return: void */ static inline void wlan_pdev_nif_feat_cap_clear(struct wlan_objmgr_pdev *pdev, uint32_t cap) { pdev->pdev_nif.pdev_feature_caps &= ~cap; } /** * wlan_pdev_nif_feat_cap_get() - get feature caps * @pdev: PDEV object * @cap: capability flag to be checked * * API to know, whether particular feat caps flag is set in pdev * * Return: 1 (for set) or 0 (for not set) */ static inline uint8_t wlan_pdev_nif_feat_cap_get(struct wlan_objmgr_pdev *pdev, uint32_t cap) { return (pdev->pdev_nif.pdev_feature_caps & cap) ? 1 : 0; } /** * wlan_pdev_nif_feat_ext_cap_set() - set feature ext caps * @pdev: PDEV object * @cap: capability flag to be set * * API to set feat ext caps in pdev * * Return: void */ static inline void wlan_pdev_nif_feat_ext_cap_set(struct wlan_objmgr_pdev *pdev, uint32_t cap) { pdev->pdev_nif.pdev_feature_ext_caps |= cap; } /** * wlan_pdev_nif_feat_ext_cap_clear() - clear feature ext caps * @pdev: PDEV object * @cap: capability flag to be cleared * * API to clear feat ext caps in pdev * * Return: void */ static inline void wlan_pdev_nif_feat_ext_cap_clear(struct wlan_objmgr_pdev *pdev, uint32_t cap) { pdev->pdev_nif.pdev_feature_ext_caps &= ~cap; } /** * wlan_pdev_nif_feat_ext_cap_get() - get feature ext caps * @pdev: PDEV object * @cap: capability flag to be checked * * API to know, whether particular feat ext caps flag is set in pdev * * Return: 1 (for set) or 0 (for not set) */ static inline uint8_t wlan_pdev_nif_feat_ext_cap_get(struct wlan_objmgr_pdev *pdev, uint32_t cap) { return (pdev->pdev_nif.pdev_feature_ext_caps & cap) ? 1 : 0; } /** * wlan_pdev_mlme_op_set() - set operation flags * @pdev: PDEV object * @op: Operation flag to be set * * API to set operation flag in pdev * * Return: void */ static inline void wlan_pdev_mlme_op_set(struct wlan_objmgr_pdev *pdev, uint32_t op) { pdev->pdev_mlme.pdev_op_flags |= op; } /** * wlan_pdev_mlme_op_clear() - clear op flags * @pdev: PDEV object * @op: Operation flag to be cleared * * API to clear op flag in pdev * * Return: void */ static inline void wlan_pdev_mlme_op_clear(struct wlan_objmgr_pdev *pdev, uint32_t op) { pdev->pdev_mlme.pdev_op_flags &= ~op; } /** * wlan_pdev_mlme_op_get() - get op flag * @pdev: PDEV object * @op: Operation flag to be checked * * API to know, whether particular operation flag is set in pdev * * Return: 1 (for set) or 0 (for not set) */ static inline uint8_t wlan_pdev_mlme_op_get(struct wlan_objmgr_pdev *pdev, uint32_t op) { return (pdev->pdev_mlme.pdev_op_flags & op) ? 1 : 0; } /** * wlan_pdev_get_hw_macaddr() - get hw macaddr * @pdev: PDEV object * * API to get HW MAC address form PDEV * * Caller need to acquire lock with wlan_pdev_obj_lock() * * Return: @macaddr -MAC address */ static inline uint8_t *wlan_pdev_get_hw_macaddr(struct wlan_objmgr_pdev *pdev) { if (!pdev) return NULL; /* This API is invoked with lock acquired, do not add log prints */ return pdev->pdev_nif.macaddr; } /** * wlan_pdev_set_hw_macaddr() - set hw macaddr * @pdev: PDEV object * @macaddr: MAC address * * API to set HW MAC address form PDEV * * Caller need to acquire lock with wlan_pdev_obj_lock() * * Return: void */ static inline void wlan_pdev_set_hw_macaddr(struct wlan_objmgr_pdev *pdev, uint8_t *macaddr) { /* This API is invoked with lock acquired, do not add log prints */ WLAN_ADDR_COPY(pdev->pdev_nif.macaddr, macaddr); } /** * wlan_pdev_get_ospriv() - get os priv pointer * @pdev: PDEV object * * API to get OS private pointer from PDEV * * Return: ospriv - private pointer */ static inline struct pdev_osif_priv *wlan_pdev_get_ospriv( struct wlan_objmgr_pdev *pdev) { return pdev->pdev_nif.pdev_ospriv; } /** * wlan_pdev_reset_ospriv() - reset os priv pointer * @pdev: PDEV object * * API to reset OS private pointer in PDEV * * Return: void */ static inline void wlan_pdev_reset_ospriv(struct wlan_objmgr_pdev *pdev) { pdev->pdev_nif.pdev_ospriv = NULL; } /** * wlan_pdev_set_max_vdev_count() - set pdev max vdev count * @pdev: PDEV object * @vdev count: Max vdev count * * API to set Max vdev count * * Return: void */ static inline void wlan_pdev_set_max_vdev_count(struct wlan_objmgr_pdev *pdev, uint8_t max_vdev_count) { if (max_vdev_count > WLAN_UMAC_PDEV_MAX_VDEVS) QDF_BUG(0); pdev->pdev_objmgr.max_vdev_count = max_vdev_count; } /** * wlan_pdev_get_max_vdev_count() - get pdev max vdev count * @pdev: PDEV object * * API to set Max vdev count * * Return: @vdev count: Max vdev count */ static inline uint8_t wlan_pdev_get_max_vdev_count( struct wlan_objmgr_pdev *pdev) { return pdev->pdev_objmgr.max_vdev_count; } /** * DOC: Examples to use PDEV ref count APIs * * In all the scenarios, the pair of API should be followed * otherwise it lead to memory leak * * scenario 1: * * wlan_objmgr_pdev_obj_create() * ---- * wlan_objmgr_pdev_obj_delete() * * scenario 2: * * wlan_objmgr_pdev_get_ref() * ---- * the operations which are done on * pdev object * ---- * wlan_objmgr_pdev_release_ref() * * scenario 3: * * wlan_objmgr_get_pdev_by_id[_no_state]() * ---- * the operations which are done on * pdev object * ---- * wlan_objmgr_pdev_release_ref() * * scenario 4: * * wlan_objmgr_get_pdev_by_macaddr[_no_state]() * ---- * the operations which are done on * pdev object * ---- * wlan_objmgr_pdev_release_ref() */ /** * wlan_objmgr_pdev_get_ref() - increment ref count * @pdev: PDEV object * @id: Object Manager ref debug id * * API to increment ref count of pdev * * Return: void */ void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev, wlan_objmgr_ref_dbgid id); /** * wlan_objmgr_pdev_try_get_ref() - increment ref count, if allowed * @pdev: PDEV object * @id: Object Manager ref debug id * * API to increment ref count of pdev after checking valid object state * * Return: void */ QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev, wlan_objmgr_ref_dbgid id); /** * wlan_objmgr_pdev_release_ref() - decrement ref count * @pdev: PDEV object * @id: Object Manager ref debug id * * API to decrement ref count of pdev, if ref count is 1, it initiates the * PDEV deletion * * Return: void */ void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev, wlan_objmgr_ref_dbgid id); /** * wlan_objmgr_pdev_get_pdev_id() - get pdev id * @pdev: PDEV object * * API to get pdev id from pdev object * * Return: @pdev id */ static inline uint8_t wlan_objmgr_pdev_get_pdev_id(struct wlan_objmgr_pdev *pdev) { return pdev->pdev_objmgr.wlan_pdev_id; } /** * wlan_pdev_set_tgt_if_handle(): API to set target if handle in pdev object * @pdev: Pdev pointer * @tgt_if_handle: target interface handle * * API to set target interface handle in pdev object * * Caller needs to acquire lock with wlan_pdev_obj_lock() * * Return: None */ static inline void wlan_pdev_set_tgt_if_handle(struct wlan_objmgr_pdev *pdev, target_pdev_info_t *tgt_if_handle) { /* This API is invoked with lock acquired, do not add log prints */ if (!pdev) return; pdev->tgt_if_handle = tgt_if_handle; } /** * wlan_pdev_get_tgt_if_handle(): API to get target interface handle * @pdev: Pdev pointer * * API to get target interface handle from pdev object * * Return: target interface handle */ static inline target_pdev_info_t *wlan_pdev_get_tgt_if_handle(struct wlan_objmgr_pdev *pdev) { if (!pdev) return NULL; return pdev->tgt_if_handle; } /** * wlan_pdev_set_max_peer_count() - set max peer count * @vdev: PDEV object * @count: Max peer count * * API to set max peer count of PDEV * * Return: void */ static inline void wlan_pdev_set_max_peer_count(struct wlan_objmgr_pdev *pdev, uint16_t count) { pdev->pdev_objmgr.max_peer_count = count; } /** * wlan_pdev_get_max_peer_count() - get max peer count * @pdev: PDEV object * * API to get max peer count of PDEV * * Return: max peer count */ static inline uint16_t wlan_pdev_get_max_peer_count( struct wlan_objmgr_pdev *pdev) { return pdev->pdev_objmgr.max_peer_count; } /** * wlan_pdev_set_max_monitor_vdev_count() - set max monitor vdev count * @pdev: PDEV object * @count: Max monitor vdev count * * API to set max monitor vdev count of PDEV * * Return: void */ static inline void wlan_pdev_set_max_monitor_vdev_count( struct wlan_objmgr_pdev *pdev, uint16_t count) { pdev->pdev_objmgr.max_monitor_vdev_count = count; } /** * wlan_pdev_get_max_monitor_vdev_count() - get max monitor vdev count * @pdev: PDEV object * * API to get max monitor vdev count of PDEV * * Return: max monitor vdev count */ static inline uint16_t wlan_pdev_get_max_monitor_vdev_count( struct wlan_objmgr_pdev *pdev) { return pdev->pdev_objmgr.max_monitor_vdev_count; } /** * wlan_pdev_get_peer_count() - get pdev peer count * @pdev: PDEV object * * API to get peer count from PDEV * * Return: peer_count - pdev's peer count */ static inline uint16_t wlan_pdev_get_peer_count(struct wlan_objmgr_pdev *pdev) { return pdev->pdev_objmgr.wlan_peer_count; } /** * wlan_pdev_get_temp_peer_count() - get pdev temporary peer count * @pdev: PDEV object * * API to get temporary peer count from PDEV * * Return: temp_peer_count - pdev's temporary peer count */ static inline uint16_t wlan_pdev_get_temp_peer_count(struct wlan_objmgr_pdev *pdev) { return pdev->pdev_objmgr.temp_peer_count; } /** * wlan_pdev_incr_peer_count() - increment pdev peer count * @pdev: PDEV object * * API to increment peer count of PDEV by 1 * * Return: void */ static inline void wlan_pdev_incr_peer_count(struct wlan_objmgr_pdev *pdev) { pdev->pdev_objmgr.wlan_peer_count++; } /** * wlan_pdev_decr_peer_count() - decrement pdev peer count * @pdev: PDEV object * * API to decrement peer count of PDEV by 1 * * Return: void */ static inline void wlan_pdev_decr_peer_count(struct wlan_objmgr_pdev *pdev) { pdev->pdev_objmgr.wlan_peer_count--; } /** * wlan_pdev_incr_temp_peer_count() - increment temporary pdev peer count * @pdev: PDEV object * * API to increment temporary peer count of PDEV by 1 * * Return: void */ static inline void wlan_pdev_incr_temp_peer_count(struct wlan_objmgr_pdev *pdev) { pdev->pdev_objmgr.temp_peer_count++; } /** * wlan_pdev_decr_temp_peer_count() - decrement pdev temporary peer count * @pdev: PDEV object * * API to decrement temporary peer count of PDEV by 1 * * Return: void */ static inline void wlan_pdev_decr_temp_peer_count(struct wlan_objmgr_pdev *pdev) { pdev->pdev_objmgr.temp_peer_count--; } /** * wlan_pdev_get_vdev_count() - get PDEV vdev count * @pdev: PDEV object * * API to get vdev count from PDEV * * Return: vdev_count - pdev's vdev count */ static inline uint8_t wlan_pdev_get_vdev_count(struct wlan_objmgr_pdev *pdev) { return pdev->pdev_objmgr.wlan_vdev_count; } /** * wlan_print_pdev_info() - print pdev members * @pdev: pdev object pointer * * Return: void */ #ifdef WLAN_OBJMGR_DEBUG void wlan_print_pdev_info(struct wlan_objmgr_pdev *pdev); #else static inline void wlan_print_pdev_info(struct wlan_objmgr_pdev *pdev) {} #endif #endif /* _WLAN_OBJMGR_PDEV_H_*/