diff --git a/components/ipa/core/inc/wlan_ipa_main.h b/components/ipa/core/inc/wlan_ipa_main.h index 70334b77cb66..8a94c8eac1af 100644 --- a/components/ipa/core/inc/wlan_ipa_main.h +++ b/components/ipa/core/inc/wlan_ipa_main.h @@ -513,6 +513,20 @@ void ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev, */ bool ipa_is_ready(void); +/** + * ipa_init_deinit_lock() - lock ipa init deinit lock + * + * Return: None + */ +void ipa_init_deinit_lock(void); + +/** + * ipa_init_deinit_unlock() - unlock ipa init deinit lock + * + * Return: None + */ +void ipa_init_deinit_unlock(void); + #else /* Not IPA_OFFLOAD */ typedef QDF_STATUS (*wlan_ipa_softap_xmit)(qdf_nbuf_t nbuf, qdf_netdev_t dev); typedef void (*wlan_ipa_send_to_nw)(qdf_nbuf_t nbuf, qdf_netdev_t dev); diff --git a/components/ipa/core/inc/wlan_ipa_priv.h b/components/ipa/core/inc/wlan_ipa_priv.h index b383d913aeca..09856bc7c728 100644 --- a/components/ipa/core/inc/wlan_ipa_priv.h +++ b/components/ipa/core/inc/wlan_ipa_priv.h @@ -686,7 +686,6 @@ struct wlan_ipa_priv { qdf_mc_timer_t rt_debug_fill_timer; qdf_mutex_t rt_debug_lock; qdf_mutex_t ipa_lock; - qdf_mutex_t init_deinit_lock; uint8_t vdev_to_iface[WLAN_IPA_MAX_SESSION]; bool vdev_offload_enabled[WLAN_IPA_MAX_SESSION]; diff --git a/components/ipa/core/src/wlan_ipa_main.c b/components/ipa/core/src/wlan_ipa_main.c index 03bf6d772d80..d54cd9932684 100644 --- a/components/ipa/core/src/wlan_ipa_main.c +++ b/components/ipa/core/src/wlan_ipa_main.c @@ -574,7 +574,7 @@ QDF_STATUS ipa_uc_ol_deinit(struct wlan_objmgr_pdev *pdev) return QDF_STATUS_E_FAILURE; } - qdf_mutex_acquire(&ipa_obj->init_deinit_lock); + ipa_init_deinit_lock(); if (!ipa_config_is_enabled()) { ipa_debug("ipa is disabled"); @@ -591,7 +591,7 @@ QDF_STATUS ipa_uc_ol_deinit(struct wlan_objmgr_pdev *pdev) status = wlan_ipa_uc_ol_deinit(ipa_obj); out: - qdf_mutex_release(&ipa_obj->init_deinit_lock); + ipa_init_deinit_unlock(); return status; } diff --git a/components/ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c b/components/ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c index 886e805c7cdd..2478ac9313ad 100644 --- a/components/ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c +++ b/components/ipa/dispatcher/src/wlan_ipa_obj_mgmt_api.c @@ -27,6 +27,7 @@ #include "qdf_platform.h" static bool g_ipa_is_ready; +static qdf_mutex_t g_init_deinit_lock; bool ipa_is_ready(void) { return g_ipa_is_ready; @@ -38,6 +39,16 @@ void ipa_disable_register_cb(void) g_ipa_is_ready = false; } +void ipa_init_deinit_lock(void) +{ + qdf_mutex_acquire(&g_init_deinit_lock); +} + +void ipa_init_deinit_unlock(void) +{ + qdf_mutex_release(&g_init_deinit_lock); +} + /** * ipa_pdev_obj_destroy_notification() - IPA pdev object destroy notification * @pdev: pdev handle @@ -71,7 +82,6 @@ ipa_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, ipa_err("Failed to detatch ipa pdev object"); ipa_obj_cleanup(ipa_obj); - qdf_mutex_destroy(&ipa_obj->init_deinit_lock); qdf_mem_free(ipa_obj); ipa_disable_register_cb(); @@ -103,7 +113,6 @@ ipa_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, if (!ipa_obj) return QDF_STATUS_E_NOMEM; - qdf_mutex_create(&ipa_obj->init_deinit_lock); status = wlan_objmgr_pdev_component_obj_attach(pdev, WLAN_UMAC_COMP_IPA, (void *)ipa_obj, @@ -145,7 +154,8 @@ static void ipa_register_ready_cb(void *user_data) return; } - qdf_mutex_acquire(&ipa_obj->init_deinit_lock); + ipa_init_deinit_lock(); + /* * Meanwhile acquiring lock, driver stop modules can happen in parallel, * validate driver state once again to proceed with IPA init. @@ -179,7 +189,7 @@ static void ipa_register_ready_cb(void *user_data) } out: - qdf_mutex_release(&ipa_obj->init_deinit_lock); + ipa_init_deinit_unlock(); } QDF_STATUS ipa_register_is_ipa_ready(struct wlan_objmgr_pdev *pdev) @@ -238,6 +248,8 @@ QDF_STATUS ipa_init(void) goto fail_delete_pdev; } + qdf_mutex_create(&g_init_deinit_lock); + return status; fail_delete_pdev: @@ -263,6 +275,8 @@ QDF_STATUS ipa_deinit(void) return status; } + qdf_mutex_destroy(&g_init_deinit_lock); + status = wlan_objmgr_unregister_pdev_destroy_handler(WLAN_UMAC_COMP_IPA, ipa_pdev_obj_destroy_notification, NULL); if (QDF_IS_STATUS_ERROR(status))