diff --git a/core/cds/inc/cds_api.h b/core/cds/inc/cds_api.h index 5f5487711488..140a453a11af 100644 --- a/core/cds/inc/cds_api.h +++ b/core/cds/inc/cds_api.h @@ -206,6 +206,13 @@ QDF_STATUS cds_enable(v_CONTEXT_t cds_context); QDF_STATUS cds_disable(v_CONTEXT_t cds_context); +/** + * cds_flush_cache_rx_queue() - flush cache rx queue frame + * + * Return: None + */ +void cds_flush_cache_rx_queue(void); + QDF_STATUS cds_close(v_CONTEXT_t cds_context); QDF_STATUS cds_shutdown(v_CONTEXT_t cds_context); diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c index a493dc34c55f..bcc146f1e1d4 100644 --- a/core/cds/src/cds_api.c +++ b/core/cds/src/cds_api.c @@ -817,6 +817,22 @@ QDF_STATUS cds_close(v_CONTEXT_t cds_context) return QDF_STATUS_SUCCESS; } +void cds_flush_cache_rx_queue(void) +{ + uint8_t sta_id; + struct ol_txrx_peer_t *peer; + struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + + for (sta_id = 0; sta_id < WLAN_MAX_STA_COUNT; sta_id++) { + peer = ol_txrx_peer_find_by_local_id(pdev, sta_id); + if (!peer) + continue; + ol_txrx_flush_rx_frames(peer, 1); + } + return; +} + + /** * cds_get_context() - get context data area * diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index a93ef0422b49..809c4924bc3b 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -1448,6 +1448,9 @@ QDF_STATUS hdd_wlan_shutdown(void) hdd_cleanup_scan_queue(pHddCtx); hdd_reset_all_adapters(pHddCtx); + /* Flush cached rx frame queue */ + cds_flush_cache_rx_queue(); + /* De-register the HDD callbacks */ hdd_deregister_cb(pHddCtx); hdd_ipa_uc_ssr_deinit();