qcacmn: Add more information to object manager debug prints

Add more information to object manager debug prints
1. Print the string of the component taking object manager reference.
2. Print vdev & pdev id in case of failure in some vdev related functions.
3. Print vdev & vdev id in case of failure in peer related functions.
4. Fromat the prints for printing pending reference
   when psoc is going brought down.

Change-Id: I75b2d1a04feb688d6e397fa28c988abb56b2a11d
CRs-Fixed: 2069665
This commit is contained in:
Vivek 2017-07-28 12:49:17 +05:30 • committed by snandini
commit ea368417b0
9 changed files with 328 additions and 200 deletions

View file

@ -706,7 +706,7 @@ static inline uint8_t wlan_pdev_get_max_vdev_count(
*
* Return: void
*/
void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev,
QDF_STATUS wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev,
wlan_objmgr_ref_dbgid id);
/**
@ -731,7 +731,7 @@ QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
*
* Return: void
*/
void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
QDF_STATUS wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
wlan_objmgr_ref_dbgid id);
/**

View file

@ -374,7 +374,7 @@ static inline void wlan_peer_obj_unlock(struct wlan_objmgr_peer *peer)
*
* Return: void
*/
void wlan_objmgr_peer_get_ref(struct wlan_objmgr_peer *peer,
QDF_STATUS wlan_objmgr_peer_get_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id);
/**
@ -399,7 +399,7 @@ QDF_STATUS wlan_objmgr_peer_try_get_ref(struct wlan_objmgr_peer *peer,
*
* Return: void
*/
void wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
QDF_STATUS wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id);
/**

View file

@ -1181,7 +1181,7 @@ static inline void wlan_psoc_set_qdf_dev(
*
* Return: void
*/
void wlan_objmgr_psoc_get_ref(struct wlan_objmgr_psoc *psoc,
QDF_STATUS wlan_objmgr_psoc_get_ref(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_ref_dbgid id);
/**
@ -1206,7 +1206,7 @@ QDF_STATUS wlan_objmgr_psoc_try_get_ref(struct wlan_objmgr_psoc *psoc,
*
* Return: void
*/
void wlan_objmgr_psoc_release_ref(struct wlan_objmgr_psoc *psoc,
QDF_STATUS wlan_objmgr_psoc_release_ref(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_ref_dbgid id);
/**

View file

@ -1391,7 +1391,7 @@ static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
*
* Return: void
*/
void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
QDF_STATUS wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid id);
/**
@ -1416,7 +1416,7 @@ QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
*
* Return: void
*/
void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
QDF_STATUS wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid id);
/**

View file

@ -101,7 +101,8 @@ QDF_STATUS wlan_objmgr_register_psoc_create_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->psoc_create_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -128,7 +129,8 @@ QDF_STATUS wlan_objmgr_unregister_psoc_create_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->psoc_create_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -155,7 +157,8 @@ QDF_STATUS wlan_objmgr_register_psoc_destroy_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->psoc_destroy_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -182,7 +185,8 @@ QDF_STATUS wlan_objmgr_unregister_psoc_destroy_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->psoc_destroy_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -209,7 +213,8 @@ QDF_STATUS wlan_objmgr_register_psoc_status_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->psoc_status_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -234,7 +239,8 @@ QDF_STATUS wlan_objmgr_unregister_psoc_status_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->psoc_status_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -260,7 +266,8 @@ QDF_STATUS wlan_objmgr_register_pdev_create_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->pdev_create_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -287,7 +294,8 @@ QDF_STATUS wlan_objmgr_unregister_pdev_create_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->pdev_create_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -314,7 +322,8 @@ QDF_STATUS wlan_objmgr_register_pdev_destroy_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->pdev_destroy_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -341,7 +350,8 @@ QDF_STATUS wlan_objmgr_unregister_pdev_destroy_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->pdev_destroy_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for Component %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -368,7 +378,8 @@ QDF_STATUS wlan_objmgr_register_pdev_status_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->pdev_status_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -393,7 +404,8 @@ QDF_STATUS wlan_objmgr_unregister_pdev_status_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->pdev_status_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for Component %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -419,7 +431,8 @@ QDF_STATUS wlan_objmgr_register_vdev_create_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->vdev_create_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -445,7 +458,8 @@ QDF_STATUS wlan_objmgr_unregister_vdev_create_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->vdev_create_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -471,7 +485,8 @@ QDF_STATUS wlan_objmgr_register_vdev_destroy_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->vdev_destroy_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -497,7 +512,8 @@ QDF_STATUS wlan_objmgr_unregister_vdev_destroy_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->vdev_destroy_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -523,7 +539,8 @@ QDF_STATUS wlan_objmgr_register_vdev_status_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->vdev_status_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -548,7 +565,8 @@ QDF_STATUS wlan_objmgr_unregister_vdev_status_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->vdev_status_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for Component %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */
@ -574,7 +592,8 @@ QDF_STATUS wlan_objmgr_register_peer_create_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->peer_create_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -601,7 +620,8 @@ QDF_STATUS wlan_objmgr_unregister_peer_create_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->peer_create_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -627,7 +647,8 @@ QDF_STATUS wlan_objmgr_register_peer_destroy_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->peer_destroy_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -653,7 +674,8 @@ QDF_STATUS wlan_objmgr_unregister_peer_destroy_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->peer_destroy_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -679,7 +701,8 @@ QDF_STATUS wlan_objmgr_register_peer_status_handler(
/* If there is a valid entry, return failure */
if (g_umac_glb_obj->peer_status_handler[id] != NULL) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is already registered", id);
obj_mgr_err("Callback for comp %s is already registered",
string_from_dbgid(id));
return QDF_STATUS_E_FAILURE;
}
/* Store handler and args in Global object table */
@ -704,7 +727,8 @@ QDF_STATUS wlan_objmgr_unregister_peer_status_handler(
/* If there is an invalid entry, return failure */
if (g_umac_glb_obj->peer_status_handler[id] != handler) {
qdf_spin_unlock_bh(&g_umac_glb_obj->global_lock);
obj_mgr_err("Callback for comp %d is not registered", id);
obj_mgr_err("Callback for comp %s is not registered",
string_from_dbgid(id));
return QDF_STATUS_E_FAILURE;
}
/* Reset handlers, and args to NULL */

View file

@ -70,7 +70,7 @@ static QDF_STATUS wlan_objmgr_pdev_obj_free(struct wlan_objmgr_pdev *pdev)
uint8_t pdev_id;
if (pdev == NULL) {
obj_mgr_err("pdev obj is NULL");
obj_mgr_err("pdev is NULL");
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -80,7 +80,7 @@ static QDF_STATUS wlan_objmgr_pdev_obj_free(struct wlan_objmgr_pdev *pdev)
/* Detach PDEV from PSOC PDEV's list */
if (wlan_objmgr_psoc_pdev_detach(pdev->pdev_objmgr.wlan_psoc, pdev) ==
QDF_STATUS_E_FAILURE) {
obj_mgr_err("PSOC PDEV detach failed: pdev-id: %d", pdev_id);
obj_mgr_err("psoc detach failed for pdev[%d]", pdev_id);
return QDF_STATUS_E_FAILURE;
}
qdf_spinlock_destroy(&pdev->pdev_lock);
@ -113,7 +113,7 @@ struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create(
/* Attach PDEV with PSOC */
if (wlan_objmgr_psoc_pdev_attach(psoc, pdev)
!= QDF_STATUS_SUCCESS) {
obj_mgr_err("pdev psoc attach failed");
obj_mgr_err("psoc attach failed for pdev");
qdf_mem_free(pdev);
return NULL;
}
@ -164,7 +164,9 @@ struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create(
/* Component object failed to be created, clean up the object */
} else if (obj_status == QDF_STATUS_E_FAILURE) {
/* Clean up the psoc */
obj_mgr_err("PDEV component objects allocation failed");
obj_mgr_err(
"Component objects allocation failed for pdev[%d]",
wlan_objmgr_pdev_get_pdev_id(pdev));
wlan_objmgr_pdev_obj_delete(pdev);
return NULL;
}
@ -188,7 +190,7 @@ static QDF_STATUS wlan_objmgr_pdev_obj_destroy(struct wlan_objmgr_pdev *pdev)
pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
if (pdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
obj_mgr_err("pdev object delete is not invoked: pdev-id:%d",
obj_mgr_err("Object delete is not invoked for pdev[%d]",
pdev_id);
WLAN_OBJMGR_BUG(0);
}
@ -206,11 +208,11 @@ static QDF_STATUS wlan_objmgr_pdev_obj_destroy(struct wlan_objmgr_pdev *pdev)
obj_status = wlan_objmgr_pdev_object_status(pdev);
if (obj_status == QDF_STATUS_E_FAILURE) {
obj_mgr_err("PDEV component objects destroy failed: pdev-id:%d",
obj_mgr_err("Component objects destroy failed for pdev[%d]",
pdev_id);
/* Ideally should not happen */
/* This leads to memleak ??? how to handle */
QDF_BUG(0);
WLAN_OBJMGR_BUG(0);
return QDF_STATUS_E_FAILURE;
}
/* Deletion is in progress */
@ -235,7 +237,7 @@ QDF_STATUS wlan_objmgr_pdev_obj_delete(struct wlan_objmgr_pdev *pdev)
print_idx = qdf_get_pidx();
if (qdf_print_is_verbose_enabled(print_idx, QDF_MODULE_ID_OBJ_MGR,
QDF_TRACE_LEVEL_DEBUG)) {
obj_mgr_debug("Logically deleting the pdev(id:%d)",
obj_mgr_debug("L-Del pdev[%d]",
pdev->pdev_objmgr.wlan_pdev_id);
wlan_objmgr_print_ref_ids(pdev->pdev_objmgr.ref_id_dbg);
}
@ -269,13 +271,14 @@ QDF_STATUS wlan_objmgr_pdev_component_obj_attach(
/* component id is invalid */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
obj_mgr_err("component-id %d is not supported", id);
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
wlan_pdev_obj_lock(pdev);
/* If there is a valid entry, return failure */
if (pdev->pdev_comp_priv_obj[id] != NULL) {
obj_mgr_err("component-%d already have valid pointer", id);
obj_mgr_err("Component-%s already have valid pointer",
string_from_dbgid(id));
wlan_pdev_obj_unlock(pdev);
return QDF_STATUS_E_FAILURE;
}
@ -781,12 +784,12 @@ void *wlan_objmgr_pdev_get_comp_private_obj(
/* component id is invalid */
if (id >= WLAN_UMAC_MAX_COMPONENTS) {
QDF_BUG(0);
WLAN_OBJMGR_BUG(0);
return NULL;
}
if (pdev == NULL) {
QDF_BUG(0);
WLAN_OBJMGR_BUG(0);
return NULL;
}
@ -796,18 +799,23 @@ void *wlan_objmgr_pdev_get_comp_private_obj(
}
EXPORT_SYMBOL(wlan_objmgr_pdev_get_comp_private_obj);
void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev,
QDF_STATUS wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev,
wlan_objmgr_ref_dbgid id)
{
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (pdev == NULL) {
obj_mgr_err("pdev obj is NULL");
obj_mgr_err("pdev is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return;
return QDF_STATUS_E_FAILURE;
}
qdf_atomic_inc(&pdev->pdev_objmgr.ref_cnt);
qdf_atomic_inc(&pdev->pdev_objmgr.ref_id_dbg[id]);
return;
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(wlan_objmgr_pdev_get_ref);
@ -816,8 +824,13 @@ QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
{
uint8_t pdev_id;
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (pdev == NULL) {
obj_mgr_err("pdev obj is NULL");
obj_mgr_err("pdev is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -828,8 +841,8 @@ QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
wlan_pdev_obj_unlock(pdev);
if (pdev->pdev_objmgr.print_cnt++ <=
WLAN_OBJMGR_RATELIMIT_THRESH)
obj_mgr_err("[Ref id: %d] pdev [%d] is in L-Del state",
id, pdev_id);
obj_mgr_err("[Ref id: %s] pdev[%d] is in L-Del state",
string_from_dbgid(id), pdev_id);
return QDF_STATUS_E_RESOURCES;
}
@ -841,30 +854,35 @@ QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
}
EXPORT_SYMBOL(wlan_objmgr_pdev_try_get_ref);
void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
QDF_STATUS wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
wlan_objmgr_ref_dbgid id)
{
uint8_t pdev_id;
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (pdev == NULL) {
obj_mgr_err("pdev obj is NULL");
obj_mgr_err("pdev is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return;
return QDF_STATUS_E_FAILURE;
}
pdev_id = wlan_objmgr_pdev_get_pdev_id(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);
obj_mgr_err("pdev[%d] ref cnt was not taken by %s",
pdev_id, string_from_dbgid(id));
wlan_objmgr_print_ref_ids(pdev->pdev_objmgr.ref_id_dbg);
WLAN_OBJMGR_BUG(0);
}
if (!qdf_atomic_read(&pdev->pdev_objmgr.ref_cnt)) {
obj_mgr_err("pdev ref cnt is 0: pdev-id:%d", pdev_id);
obj_mgr_err("pdev[%d] ref cnt is 0", pdev_id);
WLAN_OBJMGR_BUG(0);
return;
return QDF_STATUS_E_FAILURE;
}
qdf_atomic_dec(&pdev->pdev_objmgr.ref_id_dbg[id]);
@ -872,6 +890,6 @@ void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
if (qdf_atomic_dec_and_test(&pdev->pdev_objmgr.ref_cnt))
wlan_objmgr_pdev_obj_destroy(pdev);
return;
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(wlan_objmgr_pdev_release_ref);

View file

@ -69,34 +69,30 @@ static QDF_STATUS wlan_objmgr_peer_obj_free(struct wlan_objmgr_peer *peer)
{
struct wlan_objmgr_psoc *psoc;
struct wlan_objmgr_vdev *vdev;
struct wlan_objmgr_pdev *pdev;
uint8_t *macaddr;
uint8_t vdev_id;
if (peer == NULL) {
obj_mgr_err("PEER is NULL");
obj_mgr_err("peer is NULL");
return QDF_STATUS_E_FAILURE;
}
wlan_peer_obj_lock(peer);
macaddr = wlan_peer_get_macaddr(peer);
wlan_peer_obj_unlock(peer);
vdev = wlan_peer_get_vdev(peer);
if (vdev == NULL) {
obj_mgr_err(
"VDEV is NULL for peer(%02x:%02x:%02x:%02x:%02x:%02x)",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
obj_mgr_err("vdev is NULL for peer(%pM)", macaddr);
return QDF_STATUS_E_FAILURE;
}
vdev_id = wlan_vdev_get_id(vdev);
/* get PSOC from VDEV, if it is NULL, return */
psoc = wlan_vdev_get_psoc(vdev);
if (psoc == NULL) {
obj_mgr_err(
"PSOC is NULL for peer(%02x:%02x:%02x:%02x:%02x:%02x)",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
"psoc is NULL for peer(%pM) for vdev[%d]",
macaddr, wlan_vdev_get_id(vdev));
return QDF_STATUS_E_FAILURE;
}
@ -108,18 +104,28 @@ static QDF_STATUS wlan_objmgr_peer_obj_free(struct wlan_objmgr_peer *peer)
/* Detach peer from VDEV's peer list */
if (wlan_objmgr_vdev_peer_detach(vdev, peer) == QDF_STATUS_E_FAILURE) {
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
obj_mgr_err("peer(%pM) pdev is NULL", macaddr);
return QDF_STATUS_E_FAILURE;
}
obj_mgr_err(
"Peer(%02x:%02x:%02x:%02x:%02x:%02x) VDEV detach fail, vdev id: %d",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5], vdev_id);
"peer(%pM) vdev detach failure for vdev[%d] pdev[%d]",
macaddr, wlan_vdev_get_id(vdev),
wlan_objmgr_pdev_get_pdev_id(pdev));
return QDF_STATUS_E_FAILURE;
}
/* Detach peer from PSOC's peer list */
if (wlan_objmgr_psoc_peer_detach(psoc, peer) == QDF_STATUS_E_FAILURE) {
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
obj_mgr_err("peer(%pM) pdev is NULL", macaddr);
return QDF_STATUS_E_FAILURE;
}
obj_mgr_err(
"Peer(%02x:%02x:%02x:%02x:%02x:%02x) PSOC detach failure",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
"peer(%pM) psoc detach failure for vdev[%d] pdev[%d]",
macaddr, wlan_vdev_get_id(vdev),
wlan_objmgr_pdev_get_pdev_id(pdev));
return QDF_STATUS_E_FAILURE;
}
qdf_spinlock_destroy(&peer->peer_lock);
@ -144,27 +150,20 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
if (vdev == NULL) {
obj_mgr_err(
"VDEV is NULL for peer (%02x:%02x:%02x:%02x:%02x:%02x)",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
"vdev is NULL for peer (%pM)", macaddr);
return NULL;
}
/* Get psoc, if psoc is NULL, return */
psoc = wlan_vdev_get_psoc(vdev);
if (psoc == NULL) {
obj_mgr_err(
"PSOC is NULL for peer (%02x:%02x:%02x:%02x:%02x:%02x)",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
"psoc is NULL for peer (%pM)", macaddr);
return NULL;
}
/* Allocate memory for peer object */
peer = qdf_mem_malloc(sizeof(*peer));
if (peer == NULL) {
obj_mgr_err(
"Peer(%02x:%02x:%02x:%02x:%02x:%02x) allocation failure",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
obj_mgr_err("peer(%pM) allocation failure", macaddr);
return NULL;
}
/* set vdev to peer */
@ -181,20 +180,14 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
/* Attach peer to psoc, psoc maintains the node table for the device */
if (wlan_objmgr_psoc_peer_attach(psoc, peer) !=
QDF_STATUS_SUCCESS) {
obj_mgr_err(
"Peer(%02x:%02x:%02x:%02x:%02x:%02x) PSOC attach failure",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
obj_mgr_err("peer(%pM) psoc attach failure", macaddr);
qdf_mem_free(peer);
return NULL;
}
/* Attach peer to vdev peer table */
if (wlan_objmgr_vdev_peer_attach(vdev, peer) !=
QDF_STATUS_SUCCESS) {
obj_mgr_err(
"Peer(%02x:%02x:%02x:%02x:%02x:%02x) VDEV attach failure",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
obj_mgr_err("peer(%pM) vdev attach failure", macaddr);
/* if attach fails, detach from psoc table before free */
wlan_objmgr_psoc_peer_detach(psoc, peer);
qdf_mem_free(peer);
@ -236,9 +229,7 @@ struct wlan_objmgr_peer *wlan_objmgr_peer_obj_create(
} else if (obj_status == QDF_STATUS_E_FAILURE) {
/* Clean up the peer */
obj_mgr_err(
"Peer(%02x:%02x:%02x:%02x:%02x:%02x) comp object alloc fail",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
"peer(%pM) component object alloc failure", macaddr);
wlan_objmgr_peer_obj_delete(peer);
return NULL;
}
@ -254,17 +245,33 @@ static QDF_STATUS wlan_objmgr_peer_obj_destroy(struct wlan_objmgr_peer *peer)
uint8_t *macaddr;
if (peer == NULL) {
obj_mgr_err("PEER is NULL");
obj_mgr_err("peer is NULL");
return QDF_STATUS_E_FAILURE;
}
wlan_peer_obj_lock(peer);
macaddr = wlan_peer_get_macaddr(peer);
wlan_peer_obj_unlock(peer);
if (peer->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
obj_mgr_err(
"peer(%02x:%02x:%02x:%02x:%02x:%02x) object del is not invoked",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
struct wlan_objmgr_vdev *vdev;
struct wlan_objmgr_pdev *pdev;
vdev = wlan_peer_get_vdev(peer);
if (vdev == NULL) {
obj_mgr_err("vdev is NULL for peer(%pM)", macaddr);
return QDF_STATUS_E_FAILURE;
}
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
obj_mgr_err("peer(%pM) pdev is NULL", macaddr);
return QDF_STATUS_E_FAILURE;
}
obj_mgr_err("peer(%pM) vdev[%d] pdev[%d] delete is not invoked",
macaddr, wlan_vdev_get_id(vdev),
wlan_objmgr_pdev_get_pdev_id(pdev));
WLAN_OBJMGR_BUG(0);
}
@ -281,8 +288,7 @@ static QDF_STATUS wlan_objmgr_peer_obj_destroy(struct wlan_objmgr_peer *peer)
obj_status = wlan_objmgr_peer_object_status(peer);
if (obj_status == QDF_STATUS_E_FAILURE) {
/* If it status is failure, memory will not be freed */
QDF_BUG(0);
return QDF_STATUS_E_FAILURE;
WLAN_OBJMGR_BUG(0);
}
/* few components deletion is in progress */
if (obj_status == QDF_STATUS_COMP_ASYNC) {
@ -300,7 +306,7 @@ QDF_STATUS wlan_objmgr_peer_obj_delete(struct wlan_objmgr_peer *peer)
uint8_t *macaddr;
if (peer == NULL) {
obj_mgr_err("PEER is NULL");
obj_mgr_err("peer is NULL");
return QDF_STATUS_E_FAILURE;
}
@ -308,14 +314,27 @@ QDF_STATUS wlan_objmgr_peer_obj_delete(struct wlan_objmgr_peer *peer)
macaddr = wlan_peer_get_macaddr(peer);
wlan_peer_obj_unlock(peer);
print_idx = qdf_get_pidx();
if (qdf_print_is_verbose_enabled(print_idx, QDF_MODULE_ID_OBJ_MGR,
QDF_TRACE_LEVEL_DEBUG)) {
obj_mgr_debug(
"Logically deleting the peer (%02x:%02x:%02x:%02x:%02x:%02x)",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
struct wlan_objmgr_vdev *vdev;
struct wlan_objmgr_pdev *pdev;
vdev = wlan_peer_get_vdev(peer);
if (!vdev) {
obj_mgr_err("vdev is NULL for peer(%pM)", macaddr);
return QDF_STATUS_E_FAILURE;
}
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
obj_mgr_err("peer(%pM) pdev is NULL", macaddr);
return QDF_STATUS_E_FAILURE;
}
obj_mgr_debug("L-Del peer (%pM) for vdev[%d] pdev[%d]",
macaddr, wlan_vdev_get_id(vdev),
wlan_objmgr_pdev_get_pdev_id(pdev));
wlan_objmgr_print_ref_ids(peer->peer_objmgr.ref_id_dbg);
}
@ -560,19 +579,24 @@ void *wlan_objmgr_peer_get_comp_private_obj(
}
EXPORT_SYMBOL(wlan_objmgr_peer_get_comp_private_obj);
void wlan_objmgr_peer_get_ref(struct wlan_objmgr_peer *peer,
QDF_STATUS wlan_objmgr_peer_get_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
{
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (peer == NULL) {
obj_mgr_err("peer obj is NULL for %d", id);
obj_mgr_err("peer is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return;
return QDF_STATUS_E_FAILURE;
}
/* Increment ref count */
qdf_atomic_inc(&peer->peer_objmgr.ref_cnt);
qdf_atomic_inc(&peer->peer_objmgr.ref_id_dbg[id]);
return;
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(wlan_objmgr_peer_get_ref);
@ -582,8 +606,13 @@ QDF_STATUS wlan_objmgr_peer_try_get_ref(struct wlan_objmgr_peer *peer,
uint8_t *macaddr;
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (peer == NULL) {
obj_mgr_err("peer obj is NULL for %d", id);
obj_mgr_err("peer is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -593,12 +622,9 @@ QDF_STATUS wlan_objmgr_peer_try_get_ref(struct wlan_objmgr_peer *peer,
if (peer->obj_state == WLAN_OBJ_STATE_LOGICALLY_DELETED) {
wlan_peer_obj_unlock(peer);
if (peer->peer_objmgr.print_cnt++ <=
WLAN_OBJMGR_RATELIMIT_THRESH)
obj_mgr_err("peer(%02x:%02x:%02x:%02x:%02x:%02x) L-Del",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
return QDF_STATUS_E_RESOURCES;
WLAN_OBJMGR_RATELIMIT_THRESH)
obj_mgr_err("peer(%pM) is in L-Del state", macaddr);
return QDF_STATUS_E_RESOURCES;
}
wlan_objmgr_peer_get_ref(peer, id);
@ -608,35 +634,37 @@ QDF_STATUS wlan_objmgr_peer_try_get_ref(struct wlan_objmgr_peer *peer,
}
EXPORT_SYMBOL(wlan_objmgr_peer_try_get_ref);
void wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
QDF_STATUS wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
wlan_objmgr_ref_dbgid id)
{
uint8_t *macaddr;
if (peer == NULL) {
obj_mgr_err("peer obj is NULL for %d", id);
QDF_ASSERT(0);
return;
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (peer == NULL) {
obj_mgr_err("peer is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
wlan_peer_obj_lock(peer);
macaddr = wlan_peer_get_macaddr(peer);
wlan_peer_obj_unlock(peer);
if (!qdf_atomic_read(&peer->peer_objmgr.ref_id_dbg[id])) {
obj_mgr_err(
"peer(%02x:%02x:%02x:%02x:%02x:%02x) ref was not taken by %d",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5], id);
obj_mgr_err("peer(%pM) ref cnt was not taken by %s",
macaddr, string_from_dbgid(id));
wlan_objmgr_print_ref_ids(peer->peer_objmgr.ref_id_dbg);
WLAN_OBJMGR_BUG(0);
}
if (!qdf_atomic_read(&peer->peer_objmgr.ref_cnt)) {
obj_mgr_err("peer(%02x:%02x:%02x:%02x:%02x:%02x) ref cnt is 0",
macaddr[0], macaddr[1], macaddr[2],
macaddr[3], macaddr[4], macaddr[5]);
obj_mgr_err("peer(%pM) ref cnt is 0", macaddr);
WLAN_OBJMGR_BUG(0);
return;
}
qdf_atomic_dec(&peer->peer_objmgr.ref_id_dbg[id]);
@ -652,6 +680,6 @@ void wlan_objmgr_peer_release_ref(struct wlan_objmgr_peer *peer,
wlan_peer_obj_unlock(peer);
}
return;
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(wlan_objmgr_peer_release_ref);

View file

@ -95,7 +95,7 @@ static QDF_STATUS wlan_objmgr_psoc_obj_free(struct wlan_objmgr_psoc *psoc)
/* Detach PSOC from global object's psoc list */
if (wlan_objmgr_psoc_object_detach(psoc) == QDF_STATUS_E_FAILURE) {
obj_mgr_err("PSOC object detach failed");
obj_mgr_err("psoc detach failed");
return QDF_STATUS_E_FAILURE;
}
wlan_objmgr_psoc_peer_list_deinit(&psoc->soc_objmgr.peer_list);
@ -120,7 +120,7 @@ struct wlan_objmgr_psoc *wlan_objmgr_psoc_obj_create(uint32_t phy_version,
psoc = qdf_mem_malloc(sizeof(*psoc));
if (psoc == NULL) {
obj_mgr_err("PSOC allocation failed");
obj_mgr_err("psoc allocation failed");
return NULL;
}
qdf_spinlock_create(&psoc->psoc_lock);
@ -168,7 +168,7 @@ struct wlan_objmgr_psoc *wlan_objmgr_psoc_obj_create(uint32_t phy_version,
psoc->obj_state = WLAN_OBJ_STATE_PARTIALLY_CREATED;
} else if (obj_status == QDF_STATUS_E_FAILURE) {
/* Component object failed to be created, clean up the object */
obj_mgr_err("PSOC component objects allocation failed");
obj_mgr_err("psoc component objects allocation failed");
/* Clean up the psoc */
wlan_objmgr_psoc_obj_delete(psoc);
return NULL;
@ -176,7 +176,7 @@ struct wlan_objmgr_psoc *wlan_objmgr_psoc_obj_create(uint32_t phy_version,
if (wlan_objmgr_psoc_object_attach(psoc) !=
QDF_STATUS_SUCCESS) {
obj_mgr_err("PSOC object attach failed");
obj_mgr_err("psoc object attach failed");
wlan_objmgr_psoc_obj_delete(psoc);
return NULL;
}
@ -215,7 +215,7 @@ static QDF_STATUS wlan_objmgr_psoc_obj_destroy(struct wlan_objmgr_psoc *psoc)
obj_status = wlan_objmgr_psoc_object_status(psoc);
if (obj_status == QDF_STATUS_E_FAILURE) {
obj_mgr_err("PSOC component object free failed");
obj_mgr_err("psoc component object free failed");
/* Ideally should not happen
* This leads to memleak, BUG_ON to find which component
* delete notification failed and fix it.
@ -247,7 +247,7 @@ QDF_STATUS wlan_objmgr_psoc_obj_delete(struct wlan_objmgr_psoc *psoc)
if (qdf_print_is_verbose_enabled(print_idx, QDF_MODULE_ID_OBJ_MGR,
QDF_TRACE_LEVEL_DEBUG)) {
obj_mgr_debug("Logically deleting the psoc");
obj_mgr_debug("L-Del psoc");
wlan_objmgr_print_ref_ids(psoc->soc_objmgr.ref_id_dbg);
}
@ -1402,7 +1402,7 @@ QDF_STATUS wlan_objmgr_psoc_peer_detach(struct wlan_objmgr_psoc *psoc,
QDF_STATUS_E_FAILURE) {
qdf_spin_unlock_bh(&peer_list->peer_list_lock);
wlan_psoc_obj_unlock(psoc);
obj_mgr_err("Failed to detach peer");
obj_mgr_err("psoc failed to detach peer");
return QDF_STATUS_E_FAILURE;
}
qdf_spin_unlock_bh(&peer_list->peer_list_lock);
@ -1669,26 +1669,35 @@ void *wlan_objmgr_psoc_get_comp_private_obj(struct wlan_objmgr_psoc *psoc,
}
EXPORT_SYMBOL(wlan_objmgr_psoc_get_comp_private_obj);
void wlan_objmgr_psoc_get_ref(struct wlan_objmgr_psoc *psoc,
QDF_STATUS wlan_objmgr_psoc_get_ref(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_ref_dbgid id)
{
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (psoc == NULL) {
obj_mgr_err("psoc obj is NULL for id:%d", id);
obj_mgr_err("psoc is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return;
return QDF_STATUS_E_FAILURE;
}
/* Increment ref count */
qdf_atomic_inc(&psoc->soc_objmgr.ref_cnt);
qdf_atomic_inc(&psoc->soc_objmgr.ref_id_dbg[id]);
return;
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(wlan_objmgr_psoc_get_ref);
QDF_STATUS wlan_objmgr_psoc_try_get_ref(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_ref_dbgid id)
{
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (psoc == NULL) {
obj_mgr_err("psoc obj is NULL for id:%d", id);
obj_mgr_err("psoc is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
@ -1698,7 +1707,8 @@ QDF_STATUS wlan_objmgr_psoc_try_get_ref(struct wlan_objmgr_psoc *psoc,
wlan_psoc_obj_unlock(psoc);
if (psoc->soc_objmgr.print_cnt++ <=
WLAN_OBJMGR_RATELIMIT_THRESH)
obj_mgr_err("[Ref id: %d] psoc is in L-Del state", id);
obj_mgr_err("[Ref id: %s] psoc is in L-Del state",
string_from_dbgid(id));
return QDF_STATUS_E_RESOURCES;
}
@ -1711,17 +1721,22 @@ QDF_STATUS wlan_objmgr_psoc_try_get_ref(struct wlan_objmgr_psoc *psoc,
}
EXPORT_SYMBOL(wlan_objmgr_psoc_try_get_ref);
void wlan_objmgr_psoc_release_ref(struct wlan_objmgr_psoc *psoc,
QDF_STATUS wlan_objmgr_psoc_release_ref(struct wlan_objmgr_psoc *psoc,
wlan_objmgr_ref_dbgid id)
{
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (psoc == NULL) {
obj_mgr_err("psoc obj is NULLi for id:%d", id);
obj_mgr_err("psoc is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return;
return QDF_STATUS_E_FAILURE;
}
if (!qdf_atomic_read(&psoc->soc_objmgr.ref_id_dbg[id])) {
obj_mgr_err("psoc ref cnt was not taken by %d", id);
obj_mgr_err("psoc ref cnt was not taken by %s",
string_from_dbgid(id));
wlan_objmgr_print_ref_ids(psoc->soc_objmgr.ref_id_dbg);
WLAN_OBJMGR_BUG(0);
}
@ -1729,7 +1744,6 @@ void wlan_objmgr_psoc_release_ref(struct wlan_objmgr_psoc *psoc,
if (!qdf_atomic_read(&psoc->soc_objmgr.ref_cnt)) {
obj_mgr_err("psoc ref cnt is 0");
WLAN_OBJMGR_BUG(0);
return;
}
qdf_atomic_dec(&psoc->soc_objmgr.ref_id_dbg[id]);
@ -1737,7 +1751,7 @@ void wlan_objmgr_psoc_release_ref(struct wlan_objmgr_psoc *psoc,
if (qdf_atomic_dec_and_test(&psoc->soc_objmgr.ref_cnt))
wlan_objmgr_psoc_obj_destroy(psoc);
return;
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(wlan_objmgr_psoc_release_ref);
@ -1792,17 +1806,21 @@ QDF_STATUS wlan_objmgr_print_ref_all_objects_per_psoc(
wlan_objmgr_iterate_obj_list_all(psoc, WLAN_PEER_OP,
wlan_objmgr_psoc_peer_ref_print, NULL, 1,
WLAN_OBJMGR_ID);
obj_mgr_info("----------------------------------");
obj_mgr_info("Ref counts of VDEV");
wlan_objmgr_iterate_obj_list_all(psoc, WLAN_VDEV_OP,
wlan_objmgr_psoc_vdev_ref_print, NULL, 1,
WLAN_OBJMGR_ID);
obj_mgr_info("----------------------------------");
obj_mgr_info("Ref counts of PDEV");
wlan_objmgr_iterate_obj_list_all(psoc, WLAN_PDEV_OP,
wlan_objmgr_psoc_pdev_ref_print, NULL, 1,
WLAN_OBJMGR_ID);
obj_mgr_info("----------------------------------");
obj_mgr_info(" Ref counts of PSOC");
obj_mgr_info("Ref counts of PSOC");
wlan_objmgr_print_ref_ids(psoc->soc_objmgr.ref_id_dbg);
obj_mgr_info("----------------------------------");
return QDF_STATUS_SUCCESS;
}

View file

@ -82,8 +82,8 @@ static QDF_STATUS wlan_objmgr_vdev_obj_free(struct wlan_objmgr_vdev *vdev)
/* if PDEV is NULL, return */
pdev = wlan_vdev_get_pdev(vdev);
if (pdev == NULL) {
obj_mgr_err("pdev is NULL for vdev-id: %d",
vdev->vdev_objmgr.vdev_id);
obj_mgr_err("pdev is NULL for vdev[%d]",
wlan_vdev_get_id(vdev));
return QDF_STATUS_E_FAILURE;
}
@ -124,8 +124,8 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
psoc = wlan_pdev_get_psoc(pdev);
/* PSOC is NULL */
if (psoc == NULL) {
obj_mgr_err("psoc is NULL for pdev-id:%d",
pdev->pdev_objmgr.wlan_pdev_id);
obj_mgr_err("psoc is NULL for pdev[%d]",
wlan_objmgr_pdev_get_pdev_id(pdev));
return NULL;
}
/* Allocate vdev object memory */
@ -137,8 +137,7 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
/* Attach VDEV to PSOC VDEV's list */
if (wlan_objmgr_psoc_vdev_attach(psoc, vdev) !=
QDF_STATUS_SUCCESS) {
obj_mgr_err("psoc vdev attach failed for vdev-id:%d",
vdev->vdev_objmgr.vdev_id);
obj_mgr_err("psoc attach failed for vdev");
qdf_mem_free(vdev);
return NULL;
}
@ -147,8 +146,8 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
/* Attach vdev to PDEV */
if (wlan_objmgr_pdev_vdev_attach(pdev, vdev) !=
QDF_STATUS_SUCCESS) {
obj_mgr_err("pdev vdev attach failed for vdev-id:%d",
vdev->vdev_objmgr.vdev_id);
obj_mgr_err("pdev attach failed for vdev[%d]",
wlan_vdev_get_id(vdev));
wlan_objmgr_psoc_vdev_detach(psoc, vdev);
qdf_mem_free(vdev);
return NULL;
@ -216,9 +215,9 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
/* Component object failed to be created, clean up the object */
} else if (obj_status == QDF_STATUS_E_FAILURE) {
/* Clean up the psoc */
obj_mgr_err("Component object creation failed for vdev[%d]",
wlan_vdev_get_id(vdev));
wlan_objmgr_vdev_obj_delete(vdev);
obj_mgr_err("VDEV comp objects creation failed for vdev-id:%d",
vdev->vdev_objmgr.vdev_id);
return NULL;
}
return vdev;
@ -231,18 +230,26 @@ static QDF_STATUS wlan_objmgr_vdev_obj_destroy(struct wlan_objmgr_vdev *vdev)
wlan_objmgr_vdev_destroy_handler handler;
QDF_STATUS obj_status;
void *arg;
uint8_t vdev_id;
if (vdev == NULL) {
obj_mgr_err("vdev is NULL");
return QDF_STATUS_E_FAILURE;
}
vdev_id = wlan_vdev_get_id(vdev);
if (vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
obj_mgr_err("vdev object delete is not invoked: vdev-id:%d",
wlan_vdev_get_id(vdev));
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
obj_mgr_err("pdev is NULL for vdev[%d]",
wlan_vdev_get_id(vdev));
return QDF_STATUS_E_FAILURE;
}
obj_mgr_err(
"Object delete is not invoked for vdev[%d] pdev[%d]",
wlan_vdev_get_id(vdev),
wlan_objmgr_pdev_get_pdev_id(pdev));
WLAN_OBJMGR_BUG(0);
}
@ -259,8 +266,18 @@ static QDF_STATUS wlan_objmgr_vdev_obj_destroy(struct wlan_objmgr_vdev *vdev)
obj_status = wlan_objmgr_vdev_object_status(vdev);
if (obj_status == QDF_STATUS_E_FAILURE) {
obj_mgr_err("VDEV object deletion failed: vdev-id: %d",
vdev_id);
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
obj_mgr_err("pdev is null for vdev[%d]",
wlan_vdev_get_id(vdev));
return QDF_STATUS_E_FAILURE;
}
obj_mgr_err("Object deletion failed for vdev[%d] pdev[%d]",
wlan_vdev_get_id(vdev),
wlan_objmgr_pdev_get_pdev_id(pdev));
/* Ideally should not happen */
/* This leads to memleak ??? how to handle */
QDF_BUG(0);
@ -289,8 +306,18 @@ QDF_STATUS wlan_objmgr_vdev_obj_delete(struct wlan_objmgr_vdev *vdev)
print_idx = qdf_get_pidx();
if (qdf_print_is_verbose_enabled(print_idx, QDF_MODULE_ID_OBJ_MGR,
QDF_TRACE_LEVEL_DEBUG)) {
obj_mgr_debug("Logically deleting the vdev(id:%d)",
vdev->vdev_objmgr.vdev_id);
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
obj_mgr_err("pdev is NULL for vdev[%d]",
wlan_vdev_get_id(vdev));
return QDF_STATUS_E_FAILURE;
}
obj_mgr_debug("L-Del vdev[%d] pdev[%d]",
wlan_vdev_get_id(vdev),
wlan_objmgr_pdev_get_pdev_id(pdev));
wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg);
}
@ -451,19 +478,25 @@ QDF_STATUS wlan_objmgr_iterate_peerobj_list(
qdf_list_t *peer_list = NULL;
struct wlan_objmgr_peer *peer = NULL;
struct wlan_objmgr_peer *peer_next = NULL;
uint8_t vdev_id;
if (vdev == NULL) {
obj_mgr_err("VDEV is NULL");
return QDF_STATUS_E_FAILURE;
}
wlan_vdev_obj_lock(vdev);
vdev_id = wlan_vdev_get_id(vdev);
if (vdev->obj_state ==
WLAN_OBJ_STATE_LOGICALLY_DELETED) {
wlan_vdev_obj_unlock(vdev);
obj_mgr_err("VDEV is in delete progress: vdev-id:%d", vdev_id);
struct wlan_objmgr_pdev *pdev;
pdev = wlan_vdev_get_pdev(vdev);
if (!pdev) {
obj_mgr_err("pdev is NULL for vdev[%d]",
wlan_vdev_get_id(vdev));
return QDF_STATUS_E_FAILURE;
}
obj_mgr_err("vdev[%d] pdev[%d] is in delete progress",
wlan_vdev_get_id(vdev),
wlan_objmgr_pdev_get_pdev_id(pdev));
return QDF_STATUS_E_FAILURE;
}
wlan_objmgr_vdev_get_ref(vdev, dbg_id);
@ -484,7 +517,6 @@ QDF_STATUS wlan_objmgr_iterate_peerobj_list(
}
}
wlan_objmgr_vdev_release_ref(vdev, dbg_id);
wlan_vdev_obj_unlock(vdev);
return QDF_STATUS_SUCCESS;
}
@ -713,77 +745,85 @@ void *wlan_objmgr_vdev_get_comp_private_obj(
}
EXPORT_SYMBOL(wlan_objmgr_vdev_get_comp_private_obj);
void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
QDF_STATUS wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid id)
{
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (vdev == NULL) {
obj_mgr_err("vdev obj is NULL for id:%d", id);
obj_mgr_err("vdev is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return;
return QDF_STATUS_E_FAILURE;
}
/* Increment ref count */
qdf_atomic_inc(&vdev->vdev_objmgr.ref_cnt);
qdf_atomic_inc(&vdev->vdev_objmgr.ref_id_dbg[id]);
return;
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(wlan_objmgr_vdev_get_ref);
QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid id)
{
uint8_t vdev_id;
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
if (vdev == NULL) {
obj_mgr_err("vdev obj is NULL for id:%d", id);
obj_mgr_err("vdev is NULL for %s", string_from_dbgid(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_LOGICALLY_DELETED) {
wlan_vdev_obj_unlock(vdev);
if (vdev->vdev_objmgr.print_cnt++ <=
WLAN_OBJMGR_RATELIMIT_THRESH)
obj_mgr_err("[Ref id: %d] vdev(%d) is in Log Del",
id, vdev_id);
obj_mgr_err("[Ref id: %s] vdev[%d] is in L-Del state",
string_from_dbgid(id), wlan_vdev_get_id(vdev));
return QDF_STATUS_E_RESOURCES;
}
/* Increment ref count */
wlan_objmgr_vdev_get_ref(vdev, id);
wlan_vdev_obj_unlock(vdev);
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(wlan_objmgr_vdev_try_get_ref);
void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
QDF_STATUS wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
wlan_objmgr_ref_dbgid id)
{
uint8_t vdev_id;
if (vdev == NULL) {
obj_mgr_err("vdev obj is NULL for id:%d", id);
QDF_ASSERT(0);
return;
if (id >= WLAN_REF_ID_MAX) {
obj_mgr_err("Component-id %d is not supported", id);
return QDF_STATUS_MAXCOMP_FAIL;
}
vdev_id = wlan_vdev_get_id(vdev);
if (vdev == NULL) {
obj_mgr_err("vdev is NULL for %s", string_from_dbgid(id));
QDF_ASSERT(0);
return QDF_STATUS_E_FAILURE;
}
if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_id_dbg[id])) {
obj_mgr_err("vdev (id:%d)ref cnt was not taken by %d",
vdev_id, id);
obj_mgr_err("vdev[%d] ref cnt was not taken by %s",
wlan_vdev_get_id(vdev),
string_from_dbgid(id));
wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg);
WLAN_OBJMGR_BUG(0);
}
if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_cnt)) {
obj_mgr_err("vdev ref cnt is 0");
obj_mgr_err("vdev[%d] ref cnt is 0", wlan_vdev_get_id(vdev));
WLAN_OBJMGR_BUG(0);
return;
}
qdf_atomic_dec(&vdev->vdev_objmgr.ref_id_dbg[id]);
@ -791,7 +831,7 @@ void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
if (qdf_atomic_dec_and_test(&vdev->vdev_objmgr.ref_cnt))
wlan_objmgr_vdev_obj_destroy(vdev);
return;
return QDF_STATUS_SUCCESS;
}
EXPORT_SYMBOL(wlan_objmgr_vdev_release_ref);