diff --git a/components/ipa/core/inc/wlan_ipa_core.h b/components/ipa/core/inc/wlan_ipa_core.h index de2ad4d49ca2..40ed3f96890f 100644 --- a/components/ipa/core/inc/wlan_ipa_core.h +++ b/components/ipa/core/inc/wlan_ipa_core.h @@ -750,5 +750,16 @@ void wlan_ipa_uc_ssr_cleanup(struct wlan_ipa_priv *ipa_ctx); */ void wlan_ipa_fw_rejuvenate_send_msg(struct wlan_ipa_priv *ipa_ctx); +/** + * wlan_ipa_flush_pending_vdev_events() - flush pending vdev ipa events + * @ipa_ctx: IPA context + * vdev_id: vdev id + * + * This function is to flush vdev wlan ipa pending events + * + * Return: None + */ +void wlan_ipa_flush_pending_vdev_events(struct wlan_ipa_priv *ipa_ctx, + uint8_t vdev_id); #endif /* IPA_OFFLOAD */ #endif /* _WLAN_IPA_CORE_H_ */ diff --git a/components/ipa/core/inc/wlan_ipa_main.h b/components/ipa/core/inc/wlan_ipa_main.h index 60c51e204b33..469bdb17ffe0 100644 --- a/components/ipa/core/inc/wlan_ipa_main.h +++ b/components/ipa/core/inc/wlan_ipa_main.h @@ -455,11 +455,25 @@ uint32_t ipa_get_tx_buf_count(void); /** * ipa_update_tx_stats() - Update embedded tx traffic in bytes to IPA + * @pdev: pdev obj + * @sta_tx: tx in bytes on sta vdev + * @ap_tx: tx in bytes on sap vdev * - * Return: IPA config tx buffer count + * Return: None */ void ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx, uint64_t ap_tx); + +/** + * ipa_flush_pending_vdev_events() - flush pending vdev wlan ipa events + * @pdev: pdev obj + * @vdev_id: vdev id + * + * Return: None + */ +void ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id); + #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 5a43dc2c507c..04549a578eb8 100644 --- a/components/ipa/core/inc/wlan_ipa_priv.h +++ b/components/ipa/core/inc/wlan_ipa_priv.h @@ -716,7 +716,7 @@ struct wlan_ipa_priv { #define BW_GET_DIFF(_x, _y) (unsigned long)((ULONG_MAX - (_y)) + (_x) + 1) -#define IPA_RESOURCE_COMP_WAIT_TIME 100 +#define IPA_RESOURCE_COMP_WAIT_TIME 500 #ifdef FEATURE_METERING #define IPA_UC_SHARING_STATES_WAIT_TIME 500 diff --git a/components/ipa/core/src/wlan_ipa_core.c b/components/ipa/core/src/wlan_ipa_core.c index f10f16a05a9f..41668b24d63f 100644 --- a/components/ipa/core/src/wlan_ipa_core.c +++ b/components/ipa/core/src/wlan_ipa_core.c @@ -3749,3 +3749,23 @@ void wlan_ipa_fw_rejuvenate_send_msg(struct wlan_ipa_priv *ipa_ctx) } ipa_ctx->stats.num_send_msg++; } + +void wlan_ipa_flush_pending_vdev_events(struct wlan_ipa_priv *ipa_ctx, + uint8_t vdev_id) +{ + struct wlan_ipa_uc_pending_event *event; + struct wlan_ipa_uc_pending_event *next_event; + + qdf_mutex_acquire(&ipa_ctx->ipa_lock); + + qdf_list_for_each_del(&ipa_ctx->pending_event, event, next_event, + node) { + if (event->session_id == vdev_id) { + qdf_list_remove_node(&ipa_ctx->pending_event, + &event->node); + qdf_mem_free(event); + } + } + + qdf_mutex_release(&ipa_ctx->ipa_lock); +} diff --git a/components/ipa/core/src/wlan_ipa_main.c b/components/ipa/core/src/wlan_ipa_main.c index f7f1d40696e7..0f86743fe535 100644 --- a/components/ipa/core/src/wlan_ipa_main.c +++ b/components/ipa/core/src/wlan_ipa_main.c @@ -675,3 +675,20 @@ void ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx, wlan_ipa_update_tx_stats(ipa_obj, sta_tx, ap_tx); } + +void ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id) +{ + struct wlan_ipa_priv *ipa_obj; + + if (!ipa_config_is_enabled()) + return; + + ipa_obj = ipa_pdev_get_priv_obj(pdev); + if (!ipa_obj) { + ipa_err("IPA object is NULL"); + return; + } + + wlan_ipa_flush_pending_vdev_events(ipa_obj, vdev_id); +} diff --git a/components/ipa/dispatcher/inc/wlan_ipa_ucfg_api.h b/components/ipa/dispatcher/inc/wlan_ipa_ucfg_api.h index 87848203a0b1..b72790f3ae37 100644 --- a/components/ipa/dispatcher/inc/wlan_ipa_ucfg_api.h +++ b/components/ipa/dispatcher/inc/wlan_ipa_ucfg_api.h @@ -374,7 +374,15 @@ uint32_t ucfg_ipa_get_tx_buf_count(void); */ void ucfg_ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx, uint64_t ap_tx); - +/** + * ucfg_ipa_flush_pending_vdev_events() - flush pending vdev wlan ipa events + * @pdev: pdev obj + * @vdev_id: vdev id + * + * Return: None + */ +void ucfg_ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id); #else static inline bool ucfg_ipa_is_present(void) @@ -591,5 +599,11 @@ void ucfg_ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx, uint64_t ap_tx) { } + +static inline +void ucfg_ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id) +{ +} #endif /* IPA_OFFLOAD */ #endif /* _WLAN_IPA_UCFG_API_H_ */ diff --git a/components/ipa/dispatcher/src/wlan_ipa_ucfg_api.c b/components/ipa/dispatcher/src/wlan_ipa_ucfg_api.c index e419d53bb0df..d3fc67335f49 100644 --- a/components/ipa/dispatcher/src/wlan_ipa_ucfg_api.c +++ b/components/ipa/dispatcher/src/wlan_ipa_ucfg_api.c @@ -223,3 +223,9 @@ void ucfg_ipa_update_tx_stats(struct wlan_objmgr_pdev *pdev, uint64_t sta_tx, { ipa_update_tx_stats(pdev, sta_tx, ap_tx); } + +void ucfg_ipa_flush_pending_vdev_events(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id) +{ + ipa_flush_pending_vdev_events(pdev, vdev_id); +} diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 96e614827ac8..2d9cd3997619 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -6446,6 +6446,9 @@ QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx, wlan_cfg80211_sched_scan_stop(vdev); hdd_objmgr_put_vdev(vdev); } + + ucfg_ipa_flush_pending_vdev_events(hdd_ctx->pdev, + adapter->vdev_id); } hdd_vdev_destroy(adapter); @@ -6598,6 +6601,12 @@ QDF_STATUS hdd_stop_adapter(struct hdd_context *hdd_ctx, #endif #endif sap_release_vdev_ref(WLAN_HDD_GET_SAP_CTX_PTR(adapter)); + + if (adapter->device_mode == QDF_SAP_MODE) { + ucfg_ipa_flush_pending_vdev_events(hdd_ctx->pdev, + adapter->vdev_id); + } + hdd_vdev_destroy(adapter); mutex_unlock(&hdd_ctx->sap_lock);