diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h index 878a2d4dc2d4..74685e888cc7 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h @@ -354,13 +354,24 @@ QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_deletion( * 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 + * 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 @@ -374,9 +385,21 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev( * 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 @@ -393,9 +416,20 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state( * 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 @@ -413,9 +447,46 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev( * 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 @@ -795,19 +866,6 @@ QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev, void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev, wlan_objmgr_ref_dbgid id); -/** - * 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 - */ -struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev( - struct wlan_objmgr_pdev *pdev, - wlan_objmgr_ref_dbgid dbg_id); - /** * wlan_objmgr_pdev_get_pdev_id() - get pdev id * @pdev: PDEV object diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h index e11fdb3c53bb..73404d9b946c 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h @@ -896,10 +896,22 @@ struct wlan_objmgr_pdev *wlan_objmgr_get_pdev_by_macaddr_no_state( * Return: vdev pointer * NULL on FAILURE */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc_debug( + struct wlan_objmgr_psoc *psoc, + enum QDF_OPMODE opmode, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line); + +#define wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, opmode, dbgid) \ + wlan_objmgr_get_vdev_by_opmode_from_psoc_debug(psoc, opmode, \ + dbgid, __func__, __LINE__) +#else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc( struct wlan_objmgr_psoc *psoc, enum QDF_OPMODE opmode, wlan_objmgr_ref_dbgid dbg_id); +#endif /** * wlan_objmgr_get_vdev_by_id_from_psoc() - retrieve vdev by id @@ -916,9 +928,20 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc( * Return: vdev pointer * NULL on FAILURE */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_debug( + struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line); + +#define wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, dbgid) \ + wlan_objmgr_get_vdev_by_id_from_psoc_debug(psoc, vdev_id, \ + dbgid, __func__, __LINE__) +#else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc( struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, wlan_objmgr_ref_dbgid dbg_id); +#endif /** * wlan_objmgr_get_vdev_by_id_from_psoc_no_state() - retrieve vdev by id @@ -936,9 +959,20 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc( * Return: vdev pointer * NULL on FAILURE */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug( + struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line); + +#define wlan_objmgr_get_vdev_by_id_from_psoc_no_state(psoc, vdev_id, dbgid) \ + wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug(psoc, \ + vdev_id, dbgid, __func__, __LINE__) +#else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state( struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, wlan_objmgr_ref_dbgid dbg_id); +#endif /** * wlan_objmgr_get_vdev_by_macaddr_from_psoc() - retrieve vdev by macaddr @@ -956,9 +990,21 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state( * Return: vdev pointer * NULL on FAILURE */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug( + struct wlan_objmgr_psoc *psoc, uint8_t pdev_id, + uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line); + +#define wlan_objmgr_get_vdev_by_macaddr_from_psoc(psoc, pdev_id, macaddr, \ + dbgid) \ + wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug(psoc, pdev_id, \ + macaddr, dbgid, __func__, __LINE__) +#else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc( struct wlan_objmgr_psoc *psoc, uint8_t pdev_id, uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id); +#endif /** * wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state() - retrieve vdev by @@ -978,9 +1024,22 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc( * Return: vdev pointer * NULL on FAILURE */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev + *wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug( + struct wlan_objmgr_psoc *psoc, uint8_t pdev_id, + uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line); + +#define wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state(psoc, pdev_id, \ + macaddr, dbgid) \ + wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug(psoc, \ + pdev_id, macaddr, dbgid, __func__, __LINE__) +#else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state( struct wlan_objmgr_psoc *psoc, uint8_t pdev_id, uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id); +#endif /** * wlan_psoc_obj_lock() - Acquire PSOC spinlock diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h index d65c4d269186..e3db4e953edf 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h @@ -232,7 +232,6 @@ /* Invalid VDEV identifier */ #define WLAN_INVALID_VDEV_ID 255 - /** * struct wlan_vdev_create_params - Create params, HDD/OSIF passes this * structure While creating VDEV @@ -576,34 +575,6 @@ static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head( return vdev; } -/** - * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list - * @pdev: PDEV object - * @dbg_id: id of the caller - * - * API to get the head active vdev of given pdev (of pdev's vdev list) - * - * Return: - */ -struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev( - struct wlan_objmgr_pdev *pdev, - wlan_objmgr_ref_dbgid dbg_id); - -/** - * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list - * @vdev: VDEV object - * @vdev_list: qdf_list_t - * @dbg_id: id of the caller - * - * API to get the head active vdev of given vdev (of pdev's vdev list) - * - * Return: - * @peer: head peer - */ -struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( - struct wlan_objmgr_pdev *pdev, - qdf_list_t *vdev_list, - wlan_objmgr_ref_dbgid dbg_id); /** * wlan_vdev_get_next_vdev_of_pdev() - get next vdev @@ -637,23 +608,6 @@ static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev( return vdev_next; } -/** - * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev - * @pdev: PDEV object - * @vdev_list: qdf_list_t - * @vdev: VDEV object - * @dbg_id: id of the caller - * - * API to get next active vdev object pointer of vdev - * - * Return: - * @vdev_next: VDEV object - */ -struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( - struct wlan_objmgr_pdev *pdev, - qdf_list_t *vdev_list, - struct wlan_objmgr_vdev *vdev, - wlan_objmgr_ref_dbgid dbg_id); /** @@ -1265,8 +1219,17 @@ static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev) * * Return: void */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id, + const char *func, int line); + +#define wlan_objmgr_vdev_get_ref(vdev, dbgid) \ + wlan_objmgr_vdev_get_ref_debug(vdev, dbgid, __func__, __LINE__) +#else void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, wlan_objmgr_ref_dbgid id); +#endif /** * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed @@ -1277,8 +1240,18 @@ void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, * * Return: void */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id, + const char *func, int line); + +#define wlan_objmgr_vdev_try_get_ref(vdev, dbgid) \ + wlan_objmgr_vdev_try_get_ref_debug(vdev, dbgid, \ + __func__, __LINE__) +#else QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev, wlan_objmgr_ref_dbgid id); +#endif /** * wlan_objmgr_vdev_release_ref() - decrement ref count @@ -1290,8 +1263,101 @@ QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev, * * Return: void */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id, + const char *func, int line); + +#define wlan_objmgr_vdev_release_ref(vdev, dbgid)\ + wlan_objmgr_vdev_release_ref_debug(vdev, dbgid, \ + __func__, __LINE__) +#else void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev, wlan_objmgr_ref_dbgid id); +#endif + +/** + * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev + * @pdev: PDEV object + * @vdev_list: qdf_list_t + * @vdev: VDEV object + * @dbg_id: id of the caller + * + * API to get next active vdev object pointer of vdev + * + * Return: + * @vdev_next: VDEV object + */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug( + struct wlan_objmgr_pdev *pdev, + qdf_list_t *vdev_list, + struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line); + +#define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbgid) \ + wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \ + vdev, dbgid, __func__, __LINE__) +#else +struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( + struct wlan_objmgr_pdev *pdev, + qdf_list_t *vdev_list, + struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid dbg_id); +#endif + +/** + * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list + * @pdev: PDEV object + * @dbg_id: id of the caller + * + * API to get the head active vdev of given pdev (of pdev's vdev list) + * + * Return: + */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug( + struct wlan_objmgr_pdev *pdev, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line); + +#define wlan_pdev_peek_active_first_vdev(pdev, dbgid) \ + wlan_pdev_peek_active_first_vdev_debug(pdev, dbgid, \ + __func__, __LINE__) +#else +struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev( + struct wlan_objmgr_pdev *pdev, + wlan_objmgr_ref_dbgid dbg_id); +#endif + +/** + * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list + * @vdev: VDEV object + * @vdev_list: qdf_list_t + * @dbg_id: id of the caller + * + * API to get the head active vdev of given vdev (of pdev's vdev list) + * + * Return: + * @peer: head peer + */ +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug( + struct wlan_objmgr_pdev *pdev, + qdf_list_t *vdev_list, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line); + +#define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbgid) \ + wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \ + dbgid, __func__, __LINE__) +#else +struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( + struct wlan_objmgr_pdev *pdev, + qdf_list_t *vdev_list, + wlan_objmgr_ref_dbgid dbg_id); +#endif /** * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c index 5a4569d7d0fa..86eb33f76ef9 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c +++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c @@ -623,144 +623,6 @@ QDF_STATUS wlan_objmgr_pdev_vdev_detach(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_SUCCESS; } -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) -{ - struct wlan_objmgr_vdev *vdev; - struct wlan_objmgr_vdev *vdev_next; - struct wlan_objmgr_pdev_objmgr *objmgr; - qdf_list_t *vdev_list; - - wlan_pdev_obj_lock(pdev); - - objmgr = &pdev->pdev_objmgr; - vdev_list = &objmgr->wlan_vdev_list; - /* Get first vdev */ - vdev = wlan_pdev_vdev_list_peek_head(vdev_list); - /* Iterate through pdev's vdev list, till vdev id matches with - entry of vdev list */ - while (vdev) { - if (wlan_vdev_get_id(vdev) == vdev_id) { - if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) != - QDF_STATUS_SUCCESS) - vdev = NULL; - - wlan_pdev_obj_unlock(pdev); - return vdev; - } - /* get next vdev */ - vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); - vdev = vdev_next; - } - wlan_pdev_obj_unlock(pdev); - return NULL; -} -qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev); - -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) -{ - struct wlan_objmgr_vdev *vdev; - struct wlan_objmgr_vdev *vdev_next; - struct wlan_objmgr_pdev_objmgr *objmgr; - qdf_list_t *vdev_list; - - wlan_pdev_obj_lock(pdev); - - objmgr = &pdev->pdev_objmgr; - vdev_list = &objmgr->wlan_vdev_list; - /* Get first vdev */ - vdev = wlan_pdev_vdev_list_peek_head(vdev_list); - /** - * Iterate through pdev's vdev list, till vdev id matches with - * entry of vdev list - */ - while (vdev) { - if (wlan_vdev_get_id(vdev) == vdev_id) { - wlan_objmgr_vdev_get_ref(vdev, dbg_id); - wlan_pdev_obj_unlock(pdev); - - return vdev; - } - /* get next vdev */ - vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); - vdev = vdev_next; - } - wlan_pdev_obj_unlock(pdev); - - return NULL; -} -qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev_no_state); - -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) -{ - struct wlan_objmgr_vdev *vdev; - struct wlan_objmgr_vdev *vdev_next; - struct wlan_objmgr_pdev_objmgr *objmgr; - qdf_list_t *vdev_list; - - wlan_pdev_obj_lock(pdev); - objmgr = &pdev->pdev_objmgr; - vdev_list = &objmgr->wlan_vdev_list; - /* Get first vdev */ - vdev = wlan_pdev_vdev_list_peek_head(vdev_list); - /* Iterate through pdev's vdev list, till vdev macaddr matches with - entry of vdev list */ - while (vdev) { - if (QDF_IS_STATUS_SUCCESS( - WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr))) { - if (QDF_IS_STATUS_SUCCESS( - wlan_objmgr_vdev_try_get_ref(vdev, dbg_id))) { - wlan_pdev_obj_unlock(pdev); - return vdev; - } - } - /* get next vdev */ - vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); - vdev = vdev_next; - } - wlan_pdev_obj_unlock(pdev); - - return NULL; -} - -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) -{ - struct wlan_objmgr_vdev *vdev; - struct wlan_objmgr_vdev *vdev_next; - struct wlan_objmgr_pdev_objmgr *objmgr; - qdf_list_t *vdev_list; - - wlan_pdev_obj_lock(pdev); - objmgr = &pdev->pdev_objmgr; - vdev_list = &objmgr->wlan_vdev_list; - /* Get first vdev */ - vdev = wlan_pdev_vdev_list_peek_head(vdev_list); - /* Iterate through pdev's vdev list, till vdev macaddr matches with - entry of vdev list */ - while (vdev) { - if (WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr) - == QDF_STATUS_SUCCESS) { - wlan_objmgr_vdev_get_ref(vdev, dbg_id); - wlan_pdev_obj_unlock(pdev); - - return vdev; - } - /* get next vdev */ - vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); - vdev = vdev_next; - } - wlan_pdev_obj_unlock(pdev); - - return NULL; -} - void *wlan_objmgr_pdev_get_comp_private_obj( struct wlan_objmgr_pdev *pdev, enum wlan_umac_comp_id id) @@ -782,10 +644,11 @@ void *wlan_objmgr_pdev_get_comp_private_obj( return comp_priv_obj; } + qdf_export_symbol(wlan_objmgr_pdev_get_comp_private_obj); void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev, - wlan_objmgr_ref_dbgid id) + wlan_objmgr_ref_dbgid id) { if (!pdev) { obj_mgr_err("pdev obj is NULL"); @@ -794,13 +657,12 @@ void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev, } qdf_atomic_inc(&pdev->pdev_objmgr.ref_cnt); qdf_atomic_inc(&pdev->pdev_objmgr.ref_id_dbg[id]); - - return; } + qdf_export_symbol(wlan_objmgr_pdev_get_ref); QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev, - wlan_objmgr_ref_dbgid id) + wlan_objmgr_ref_dbgid id) { uint8_t pdev_id; @@ -827,10 +689,11 @@ QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev, return QDF_STATUS_SUCCESS; } + qdf_export_symbol(wlan_objmgr_pdev_try_get_ref); void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev, - wlan_objmgr_ref_dbgid id) + wlan_objmgr_ref_dbgid id) { uint8_t pdev_id; @@ -844,7 +707,7 @@ void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev, if (!qdf_atomic_read(&pdev->pdev_objmgr.ref_id_dbg[id])) { obj_mgr_err("pdev (id:%d)ref cnt was not taken by %d", - pdev_id, id); + pdev_id, id); wlan_objmgr_print_ref_ids(pdev->pdev_objmgr.ref_id_dbg, QDF_TRACE_LEVEL_FATAL); WLAN_OBJMGR_BUG(0); @@ -861,11 +724,52 @@ void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev, /* Decrement ref count, free pdev, if ref count == 0 */ if (qdf_atomic_dec_and_test(&pdev->pdev_objmgr.ref_cnt)) wlan_objmgr_pdev_obj_destroy(pdev); - - return; } + qdf_export_symbol(wlan_objmgr_pdev_release_ref); +#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) +{ + struct wlan_objmgr_pdev_objmgr *objmgr = &pdev->pdev_objmgr; + qdf_list_t *vdev_list = NULL; + struct wlan_objmgr_vdev *vdev; + qdf_list_node_t *node = NULL; + qdf_list_node_t *prev_node = NULL; + + wlan_pdev_obj_lock(pdev); + + /* VDEV list */ + vdev_list = &objmgr->wlan_vdev_list; + if (qdf_list_peek_front(vdev_list, &node) != QDF_STATUS_SUCCESS) { + wlan_pdev_obj_unlock(pdev); + return NULL; + } + + do { + vdev = qdf_container_of(node, struct wlan_objmgr_vdev, + vdev_node); + if (wlan_objmgr_vdev_try_get_ref_debug(vdev, + dbg_id, func, line) == + QDF_STATUS_SUCCESS) { + wlan_pdev_obj_unlock(pdev); + return vdev; + } + + prev_node = node; + } while (qdf_list_peek_next(vdev_list, prev_node, &node) == + QDF_STATUS_SUCCESS); + + wlan_pdev_obj_unlock(pdev); + + return NULL; +} + +qdf_export_symbol(wlan_objmgr_pdev_get_first_vdev_debug); +#else struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev( struct wlan_objmgr_pdev *pdev, wlan_objmgr_ref_dbgid dbg_id) @@ -904,6 +808,316 @@ struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev( } qdf_export_symbol(wlan_objmgr_pdev_get_first_vdev); +#endif + +#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) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_vdev *vdev_next; + struct wlan_objmgr_pdev_objmgr *objmgr; + qdf_list_t *vdev_list; + + wlan_pdev_obj_lock(pdev); + + objmgr = &pdev->pdev_objmgr; + vdev_list = &objmgr->wlan_vdev_list; + /* Get first vdev */ + vdev = wlan_pdev_vdev_list_peek_head(vdev_list); + /** + * Iterate through pdev's vdev list, till vdev id matches with + * entry of vdev list + */ + while (vdev) { + if (wlan_vdev_get_id(vdev) == vdev_id) { + if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id, + func, line) != + QDF_STATUS_SUCCESS) + vdev = NULL; + + wlan_pdev_obj_unlock(pdev); + return vdev; + } + /* get next vdev */ + vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); + vdev = vdev_next; + } + wlan_pdev_obj_unlock(pdev); + return NULL; +} + +qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev_debug); +#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) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_vdev *vdev_next; + struct wlan_objmgr_pdev_objmgr *objmgr; + qdf_list_t *vdev_list; + + wlan_pdev_obj_lock(pdev); + + objmgr = &pdev->pdev_objmgr; + vdev_list = &objmgr->wlan_vdev_list; + /* Get first vdev */ + vdev = wlan_pdev_vdev_list_peek_head(vdev_list); + /** + * Iterate through pdev's vdev list, till vdev id matches with + * entry of vdev list + */ + while (vdev) { + if (wlan_vdev_get_id(vdev) == vdev_id) { + if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) != + QDF_STATUS_SUCCESS) + vdev = NULL; + + wlan_pdev_obj_unlock(pdev); + return vdev; + } + /* get next vdev */ + vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); + vdev = vdev_next; + } + wlan_pdev_obj_unlock(pdev); + return NULL; +} + +qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev); +#endif + +#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) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_vdev *vdev_next; + struct wlan_objmgr_pdev_objmgr *objmgr; + qdf_list_t *vdev_list; + + wlan_pdev_obj_lock(pdev); + + objmgr = &pdev->pdev_objmgr; + vdev_list = &objmgr->wlan_vdev_list; + /* Get first vdev */ + vdev = wlan_pdev_vdev_list_peek_head(vdev_list); + /** + * Iterate through pdev's vdev list, till vdev id matches with + * entry of vdev list + */ + while (vdev) { + if (wlan_vdev_get_id(vdev) == vdev_id) { + wlan_objmgr_vdev_get_ref_debug(vdev, dbg_id, + func, line); + wlan_pdev_obj_unlock(pdev); + + return vdev; + } + /* get next vdev */ + vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); + vdev = vdev_next; + } + wlan_pdev_obj_unlock(pdev); + + return NULL; +} + +qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev_no_state_debug); +#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) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_vdev *vdev_next; + struct wlan_objmgr_pdev_objmgr *objmgr; + qdf_list_t *vdev_list; + + wlan_pdev_obj_lock(pdev); + + objmgr = &pdev->pdev_objmgr; + vdev_list = &objmgr->wlan_vdev_list; + /* Get first vdev */ + vdev = wlan_pdev_vdev_list_peek_head(vdev_list); + /** + * Iterate through pdev's vdev list, till vdev id matches with + * entry of vdev list + */ + while (vdev) { + if (wlan_vdev_get_id(vdev) == vdev_id) { + wlan_objmgr_vdev_get_ref(vdev, dbg_id); + wlan_pdev_obj_unlock(pdev); + + return vdev; + } + /* get next vdev */ + vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); + vdev = vdev_next; + } + wlan_pdev_obj_unlock(pdev); + + return NULL; +} + +qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev_no_state); +#endif + +#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) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_vdev *vdev_next; + struct wlan_objmgr_pdev_objmgr *objmgr; + qdf_list_t *vdev_list; + + wlan_pdev_obj_lock(pdev); + objmgr = &pdev->pdev_objmgr; + vdev_list = &objmgr->wlan_vdev_list; + /* Get first vdev */ + vdev = wlan_pdev_vdev_list_peek_head(vdev_list); + /** + * Iterate through pdev's vdev list, till vdev macaddr matches with + * entry of vdev list + */ + while (vdev) { + if (QDF_IS_STATUS_SUCCESS( + WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr))) { + if (QDF_IS_STATUS_SUCCESS( + wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id, + fnc, ln))) { + wlan_pdev_obj_unlock(pdev); + return vdev; + } + } + /* get next vdev */ + vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); + vdev = vdev_next; + } + wlan_pdev_obj_unlock(pdev); + + return NULL; +} +#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) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_vdev *vdev_next; + struct wlan_objmgr_pdev_objmgr *objmgr; + qdf_list_t *vdev_list; + + wlan_pdev_obj_lock(pdev); + objmgr = &pdev->pdev_objmgr; + vdev_list = &objmgr->wlan_vdev_list; + /* Get first vdev */ + vdev = wlan_pdev_vdev_list_peek_head(vdev_list); + /** + * Iterate through pdev's vdev list, till vdev macaddr matches with + * entry of vdev list + */ + while (vdev) { + if (QDF_IS_STATUS_SUCCESS( + WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr))) { + if (QDF_IS_STATUS_SUCCESS( + wlan_objmgr_vdev_try_get_ref(vdev, dbg_id))) { + wlan_pdev_obj_unlock(pdev); + return vdev; + } + } + /* get next vdev */ + vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); + vdev = vdev_next; + } + wlan_pdev_obj_unlock(pdev); + + return NULL; +} +#endif + +#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) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_vdev *vdev_next; + struct wlan_objmgr_pdev_objmgr *objmgr; + qdf_list_t *vdev_list; + + wlan_pdev_obj_lock(pdev); + objmgr = &pdev->pdev_objmgr; + vdev_list = &objmgr->wlan_vdev_list; + /* Get first vdev */ + vdev = wlan_pdev_vdev_list_peek_head(vdev_list); + /** + * Iterate through pdev's vdev list, till vdev macaddr matches with + * entry of vdev list + */ + while (vdev) { + if (WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr) + == QDF_STATUS_SUCCESS) { + wlan_objmgr_vdev_get_ref_debug(vdev, dbg_id, + func, line); + wlan_pdev_obj_unlock(pdev); + + return vdev; + } + /* get next vdev */ + vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); + vdev = vdev_next; + } + wlan_pdev_obj_unlock(pdev); + + return NULL; +} +#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) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_vdev *vdev_next; + struct wlan_objmgr_pdev_objmgr *objmgr; + qdf_list_t *vdev_list; + + wlan_pdev_obj_lock(pdev); + objmgr = &pdev->pdev_objmgr; + vdev_list = &objmgr->wlan_vdev_list; + /* Get first vdev */ + vdev = wlan_pdev_vdev_list_peek_head(vdev_list); + /** + * Iterate through pdev's vdev list, till vdev macaddr matches with + * entry of vdev list + */ + while (vdev) { + if (WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr) + == QDF_STATUS_SUCCESS) { + wlan_objmgr_vdev_get_ref(vdev, dbg_id); + wlan_pdev_obj_unlock(pdev); + + return vdev; + } + /* get next vdev */ + vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev); + vdev = vdev_next; + } + wlan_pdev_obj_unlock(pdev); + + return NULL; +} +#endif #ifdef WLAN_OBJMGR_DEBUG void wlan_print_pdev_info(struct wlan_objmgr_pdev *pdev) diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c index 9a2d643ac3e7..b4c655021eeb 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c +++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c @@ -942,6 +942,163 @@ QDF_STATUS wlan_objmgr_psoc_vdev_detach(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_debug( + struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line) +{ + struct wlan_objmgr_vdev *vdev; + + /* if PSOC is NULL, return */ + if (!psoc) + return NULL; + /* vdev id is invalid */ + if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc)) + return NULL; + + wlan_psoc_obj_lock(psoc); + /* retrieve vdev pointer from vdev list */ + vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id]; + if (vdev) { + if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id, + func, line) != + QDF_STATUS_SUCCESS) + vdev = NULL; + } + wlan_psoc_obj_unlock(psoc); + + return vdev; +} + +qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_debug); +#else +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc( + struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + wlan_objmgr_ref_dbgid dbg_id) +{ + struct wlan_objmgr_vdev *vdev; + + /* if PSOC is NULL, return */ + if (!psoc) + return NULL; + /* vdev id is invalid */ + if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc)) + return NULL; + + wlan_psoc_obj_lock(psoc); + /* retrieve vdev pointer from vdev list */ + vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id]; + if (vdev) { + if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) != + QDF_STATUS_SUCCESS) + vdev = NULL; + } + wlan_psoc_obj_unlock(psoc); + + return vdev; +} + +qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc); +#endif + +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug( + struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line) +{ + struct wlan_objmgr_vdev *vdev; + + /* if PSOC is NULL, return */ + if (!psoc) + return NULL; + /* vdev id is invalid */ + if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc)) + return NULL; + + wlan_psoc_obj_lock(psoc); + /* retrieve vdev pointer from vdev list */ + vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id]; + if (vdev) + wlan_objmgr_vdev_get_ref_debug(vdev, dbg_id, func, line); + + wlan_psoc_obj_unlock(psoc); + + return vdev; +} + +qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug); +#else +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state( + struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, + wlan_objmgr_ref_dbgid dbg_id) +{ + struct wlan_objmgr_vdev *vdev; + + /* if PSOC is NULL, return */ + if (!psoc) + return NULL; + /* vdev id is invalid */ + if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc)) + return NULL; + + wlan_psoc_obj_lock(psoc); + /* retrieve vdev pointer from vdev list */ + vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id]; + if (vdev) + wlan_objmgr_vdev_get_ref(vdev, dbg_id); + + wlan_psoc_obj_unlock(psoc); + + return vdev; +} + +qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_no_state); +#endif + +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc_debug( + struct wlan_objmgr_psoc *psoc, + enum QDF_OPMODE opmode, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line) +{ + struct wlan_objmgr_vdev *vdev = NULL; + int vdev_cnt = 0; + uint16_t max_vdev_cnt; + + /* if PSOC is NULL, return */ + if (!psoc) + return NULL; + + wlan_psoc_obj_lock(psoc); + + max_vdev_cnt = wlan_psoc_get_max_vdev_count(psoc); + /* retrieve vdev pointer from vdev list */ + while (vdev_cnt < max_vdev_cnt) { + vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_cnt]; + vdev_cnt++; + if (!vdev) + continue; + wlan_vdev_obj_lock(vdev); + if (vdev->vdev_mlme.vdev_opmode == opmode) { + wlan_vdev_obj_unlock(vdev); + if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id, + func, line) != + QDF_STATUS_SUCCESS) { + vdev = NULL; + continue; + } + break; + } + wlan_vdev_obj_unlock(vdev); + } + wlan_psoc_obj_unlock(psoc); + + return vdev; +} +#else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc( struct wlan_objmgr_psoc *psoc, enum QDF_OPMODE opmode, @@ -980,59 +1137,39 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc( return vdev; } +#endif -struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc( - struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - wlan_objmgr_ref_dbgid dbg_id) +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug( + struct wlan_objmgr_psoc *psoc, uint8_t pdev_id, + uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line) { struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_pdev *pdev; /* if PSOC is NULL, return */ if (!psoc) return NULL; - /* vdev id is invalid */ - if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc)) + + if (!macaddr) return NULL; - wlan_psoc_obj_lock(psoc); - /* retrieve vdev pointer from vdev list */ - vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id]; - if (vdev) { - if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) != - QDF_STATUS_SUCCESS) - vdev = NULL; + pdev = wlan_objmgr_get_pdev_by_id(psoc, pdev_id, dbg_id); + if (!pdev) { + obj_mgr_err("pdev is null"); + return NULL; } - wlan_psoc_obj_unlock(psoc); + vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug(pdev, macaddr, + dbg_id, + func, line); + wlan_objmgr_pdev_release_ref(pdev, dbg_id); return vdev; } -qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc); - -struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state( - struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, - wlan_objmgr_ref_dbgid dbg_id) -{ - struct wlan_objmgr_vdev *vdev; - - /* if PSOC is NULL, return */ - if (!psoc) - return NULL; - /* vdev id is invalid */ - if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc)) - return NULL; - - wlan_psoc_obj_lock(psoc); - /* retrieve vdev pointer from vdev list */ - vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id]; - if (vdev) - wlan_objmgr_vdev_get_ref(vdev, dbg_id); - - wlan_psoc_obj_unlock(psoc); - - return vdev; -} -qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_no_state); +qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug); +#else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc( struct wlan_objmgr_psoc *psoc, uint8_t pdev_id, uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id) @@ -1057,8 +1194,44 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc( return vdev; } -qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc); +qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc); +#endif + +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev + *wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug( + struct wlan_objmgr_psoc *psoc, uint8_t pdev_id, + uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line) +{ + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_pdev *pdev; + + /* if PSOC is NULL, return */ + if (!psoc) + return NULL; + + if (!macaddr) + return NULL; + + pdev = wlan_objmgr_get_pdev_by_id(psoc, pdev_id, dbg_id); + if (!pdev) { + obj_mgr_err("pdev is null"); + return NULL; + } + vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug(pdev, + macaddr, + dbg_id, + func, + line); + wlan_objmgr_pdev_release_ref(pdev, dbg_id); + + return vdev; +} + +qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug); +#else struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state( struct wlan_objmgr_psoc *psoc, uint8_t pdev_id, uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id) @@ -1083,7 +1256,9 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state( return vdev; } + qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state); +#endif static void wlan_obj_psoc_peerlist_add_tail(qdf_list_t *obj_list, struct wlan_objmgr_peer *obj) diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c index 7a33e3c2d4c1..9b29b6862845 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c +++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c @@ -279,7 +279,6 @@ static QDF_STATUS wlan_objmgr_vdev_obj_destroy(struct wlan_objmgr_vdev *vdev) vdev_id = wlan_vdev_get_id(vdev); - wlan_print_vdev_info(vdev); obj_mgr_debug("Physically deleting vdev %d", vdev_id); if (vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) { @@ -970,8 +969,26 @@ void *wlan_objmgr_vdev_get_comp_private_obj( } qdf_export_symbol(wlan_objmgr_vdev_get_comp_private_obj); -void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, - wlan_objmgr_ref_dbgid id) +#ifdef WLAN_OBJMGR_REF_ID_TRACE +static inline void +wlan_objmgr_vdev_ref_trace(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id, + const char *func, int line) +{ +} + +static inline void +wlan_objmgr_vdev_deref_trace(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id, + const char *func, int line) +{ +} +#endif + +#ifdef WLAN_OBJMGR_REF_ID_TRACE +void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id, + const char *func, int line) { if (!vdev) { obj_mgr_err("vdev obj is NULL for id:%d", id); @@ -982,12 +999,65 @@ void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, qdf_atomic_inc(&vdev->vdev_objmgr.ref_cnt); qdf_atomic_inc(&vdev->vdev_objmgr.ref_id_dbg[id]); + wlan_objmgr_vdev_ref_trace(vdev, id, func, line); return; } -qdf_export_symbol(wlan_objmgr_vdev_get_ref); +qdf_export_symbol(wlan_objmgr_vdev_get_ref_debug); +#else +void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id) +{ + if (!vdev) { + obj_mgr_err("vdev obj is NULL for id:%d", id); + QDF_ASSERT(0); + return; + } + /* Increment ref count */ + qdf_atomic_inc(&vdev->vdev_objmgr.ref_cnt); + qdf_atomic_inc(&vdev->vdev_objmgr.ref_id_dbg[id]); +} + +qdf_export_symbol(wlan_objmgr_vdev_get_ref); +#endif + +#ifdef WLAN_OBJMGR_REF_ID_TRACE +QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id, + const char *func, int line) +{ + uint8_t vdev_id; + + if (!vdev) { + obj_mgr_err("vdev obj is NULL for id:%d", id); + QDF_ASSERT(0); + return QDF_STATUS_E_FAILURE; + } + + wlan_vdev_obj_lock(vdev); + vdev_id = wlan_vdev_get_id(vdev); + if (vdev->obj_state != WLAN_OBJ_STATE_CREATED) { + wlan_vdev_obj_unlock(vdev); + if (vdev->vdev_objmgr.print_cnt++ <= + WLAN_OBJMGR_RATELIMIT_THRESH) + obj_mgr_err( + "[Ref id: %d] vdev(%d) is not in Created state(%d)", + id, vdev_id, vdev->obj_state); + + return QDF_STATUS_E_RESOURCES; + } + + /* Increment ref count */ + wlan_objmgr_vdev_get_ref_debug(vdev, id, func, line); + wlan_vdev_obj_unlock(vdev); + + return QDF_STATUS_SUCCESS; +} + +qdf_export_symbol(wlan_objmgr_vdev_try_get_ref_debug); +#else QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev, - wlan_objmgr_ref_dbgid id) + wlan_objmgr_ref_dbgid id) { uint8_t vdev_id; @@ -1016,45 +1086,114 @@ QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_SUCCESS; } + qdf_export_symbol(wlan_objmgr_vdev_try_get_ref); +#endif -void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev, - wlan_objmgr_ref_dbgid id) +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug( + struct wlan_objmgr_pdev *pdev, + qdf_list_t *vdev_list, + struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line) { - uint8_t vdev_id; + struct wlan_objmgr_vdev *vdev_next; + qdf_list_node_t *node = &vdev->vdev_node; + qdf_list_node_t *prev_node = NULL; - if (!vdev) { - obj_mgr_err("vdev obj is NULL for id:%d", id); - QDF_ASSERT(0); - return; + if (!node) + return NULL; + + wlan_pdev_obj_lock(pdev); + prev_node = node; + while (qdf_list_peek_next(vdev_list, prev_node, &node) == + QDF_STATUS_SUCCESS) { + vdev_next = qdf_container_of(node, struct wlan_objmgr_vdev, + vdev_node); + if (wlan_objmgr_vdev_try_get_ref_debug(vdev_next, dbg_id, + func, line) == + QDF_STATUS_SUCCESS) { + wlan_pdev_obj_unlock(pdev); + return vdev_next; + } + + prev_node = node; } + wlan_pdev_obj_unlock(pdev); - vdev_id = wlan_vdev_get_id(vdev); - - if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_id_dbg[id])) { - obj_mgr_alert("vdev (id:%d)ref cnt was not taken by %d", - vdev_id, id); - wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg, - QDF_TRACE_LEVEL_FATAL); - WLAN_OBJMGR_BUG(0); - return; - } - - if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_cnt)) { - obj_mgr_alert("vdev ref cnt is 0"); - WLAN_OBJMGR_BUG(0); - return; - } - qdf_atomic_dec(&vdev->vdev_objmgr.ref_id_dbg[id]); - - /* Decrement ref count, free vdev, if ref count == 0 */ - if (qdf_atomic_dec_and_test(&vdev->vdev_objmgr.ref_cnt)) - wlan_objmgr_vdev_obj_destroy(vdev); - - return; + return NULL; } -qdf_export_symbol(wlan_objmgr_vdev_release_ref); +#else +struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( + struct wlan_objmgr_pdev *pdev, + qdf_list_t *vdev_list, + struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid dbg_id) +{ + struct wlan_objmgr_vdev *vdev_next; + qdf_list_node_t *node = &vdev->vdev_node; + qdf_list_node_t *prev_node = NULL; + if (!node) + return NULL; + + wlan_pdev_obj_lock(pdev); + prev_node = node; + while (qdf_list_peek_next(vdev_list, prev_node, &node) == + QDF_STATUS_SUCCESS) { + vdev_next = qdf_container_of(node, struct wlan_objmgr_vdev, + vdev_node); + if (wlan_objmgr_vdev_try_get_ref(vdev_next, dbg_id) == + QDF_STATUS_SUCCESS) { + wlan_pdev_obj_unlock(pdev); + return vdev_next; + } + + prev_node = node; + } + wlan_pdev_obj_unlock(pdev); + + return NULL; +} +#endif + +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug( + struct wlan_objmgr_pdev *pdev, + qdf_list_t *vdev_list, wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line) +{ + struct wlan_objmgr_vdev *vdev; + qdf_list_node_t *node = NULL; + qdf_list_node_t *prev_node = NULL; + + wlan_pdev_obj_lock(pdev); + + if (qdf_list_peek_front(vdev_list, &node) != QDF_STATUS_SUCCESS) { + wlan_pdev_obj_unlock(pdev); + return NULL; + } + + do { + vdev = qdf_container_of(node, struct wlan_objmgr_vdev, + vdev_node); + if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id, + func, line) == + QDF_STATUS_SUCCESS) { + wlan_pdev_obj_unlock(pdev); + return vdev; + } + + prev_node = node; + } while (qdf_list_peek_next(vdev_list, prev_node, &node) == + QDF_STATUS_SUCCESS); + + wlan_pdev_obj_unlock(pdev); + + return NULL; +} +#else struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( struct wlan_objmgr_pdev *pdev, qdf_list_t *vdev_list, wlan_objmgr_ref_dbgid dbg_id) @@ -1087,7 +1226,24 @@ struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head( return NULL; } +#endif +#ifdef WLAN_OBJMGR_REF_ID_TRACE +struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug( + struct wlan_objmgr_pdev *pdev, + wlan_objmgr_ref_dbgid dbg_id, + const char *func, int line) +{ + struct wlan_objmgr_pdev_objmgr *objmgr = &pdev->pdev_objmgr; + qdf_list_t *vdev_list; + + /* VDEV list */ + vdev_list = &objmgr->wlan_vdev_list; + + return wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, + dbg_id, func, line); +} +#else struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev( struct wlan_objmgr_pdev *pdev, wlan_objmgr_ref_dbgid dbg_id) @@ -1101,39 +1257,84 @@ struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev( return wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbg_id); } +#endif -struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev( - struct wlan_objmgr_pdev *pdev, - qdf_list_t *vdev_list, - struct wlan_objmgr_vdev *vdev, - wlan_objmgr_ref_dbgid dbg_id) +#ifdef WLAN_OBJMGR_REF_ID_TRACE +void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id, + const char *func, int line) { - struct wlan_objmgr_vdev *vdev_next; - qdf_list_node_t *node = &vdev->vdev_node; - qdf_list_node_t *prev_node = NULL; + uint8_t vdev_id; - if (!node) - return NULL; - - wlan_pdev_obj_lock(pdev); - prev_node = node; - while (qdf_list_peek_next(vdev_list, prev_node, &node) == - QDF_STATUS_SUCCESS) { - vdev_next = qdf_container_of(node, struct wlan_objmgr_vdev, - vdev_node); - if (wlan_objmgr_vdev_try_get_ref(vdev_next, dbg_id) == - QDF_STATUS_SUCCESS) { - wlan_pdev_obj_unlock(pdev); - return vdev_next; - } - - prev_node = node; + if (!vdev) { + obj_mgr_err("vdev obj is NULL for id:%d", id); + QDF_ASSERT(0); + return; } - wlan_pdev_obj_unlock(pdev); - return NULL; + vdev_id = wlan_vdev_get_id(vdev); + + if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_id_dbg[id])) { + obj_mgr_alert("vdev (id:%d)ref cnt was not taken by %d", + vdev_id, id); + wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg, + QDF_TRACE_LEVEL_FATAL); + WLAN_OBJMGR_BUG(0); + return; + } + + if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_cnt)) { + obj_mgr_alert("vdev ref cnt is 0"); + WLAN_OBJMGR_BUG(0); + return; + } + qdf_atomic_dec(&vdev->vdev_objmgr.ref_id_dbg[id]); + wlan_objmgr_vdev_deref_trace(vdev, id, func, line); + + /* Decrement ref count, free vdev, if ref count == 0 */ + if (qdf_atomic_dec_and_test(&vdev->vdev_objmgr.ref_cnt)) + wlan_objmgr_vdev_obj_destroy(vdev); } +qdf_export_symbol(wlan_objmgr_vdev_release_ref_debug); +#else +void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev, + wlan_objmgr_ref_dbgid id) +{ + uint8_t vdev_id; + + if (!vdev) { + obj_mgr_err("vdev obj is NULL for id:%d", id); + QDF_ASSERT(0); + return; + } + + vdev_id = wlan_vdev_get_id(vdev); + + if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_id_dbg[id])) { + obj_mgr_alert("vdev (id:%d)ref cnt was not taken by %d", + vdev_id, id); + wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg, + QDF_TRACE_LEVEL_FATAL); + WLAN_OBJMGR_BUG(0); + return; + } + + if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_cnt)) { + obj_mgr_alert("vdev ref cnt is 0"); + WLAN_OBJMGR_BUG(0); + return; + } + qdf_atomic_dec(&vdev->vdev_objmgr.ref_id_dbg[id]); + + /* Decrement ref count, free vdev, if ref count == 0 */ + if (qdf_atomic_dec_and_test(&vdev->vdev_objmgr.ref_cnt)) + wlan_objmgr_vdev_obj_destroy(vdev); +} + +qdf_export_symbol(wlan_objmgr_vdev_release_ref); +#endif + #ifdef WLAN_OBJMGR_DEBUG void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev) {