diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 58f9ac26b8b9..4f4a22cd2ea6 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -10530,6 +10530,8 @@ dp_request_rx_hw_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) QDF_STATUS status; struct dp_req_rx_hw_stats_t *rx_hw_stats; int rx_stats_sent_cnt = 0; + uint32_t last_rx_mpdu_received; + uint32_t last_rx_mpdu_missed; if (!vdev) { dp_err("vdev is null for vdev_id: %u", vdev_id); @@ -10553,6 +10555,12 @@ dp_request_rx_hw_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) qdf_event_reset(&soc->rx_hw_stats_event); qdf_spin_lock_bh(&soc->rx_hw_stats_lock); + /* save the last soc cumulative stats and reset it to 0 */ + last_rx_mpdu_received = soc->ext_stats.rx_mpdu_received; + last_rx_mpdu_missed = soc->ext_stats.rx_mpdu_missed; + soc->ext_stats.rx_mpdu_received = 0; + soc->ext_stats.rx_mpdu_missed = 0; + rx_stats_sent_cnt = dp_peer_rxtid_stats(peer, dp_rx_hw_stats_cb, rx_hw_stats); if (!rx_stats_sent_cnt) { @@ -10576,6 +10584,12 @@ dp_request_rx_hw_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id) dp_info("rx hw stats event timeout"); if (soc->is_last_stats_ctx_init) rx_hw_stats->is_query_timeout = true; + /** + * If query timeout happened, use the last saved stats + * for this time query. + */ + soc->ext_stats.rx_mpdu_received = last_rx_mpdu_received; + soc->ext_stats.rx_mpdu_missed = last_rx_mpdu_missed; } qdf_spin_unlock_bh(&soc->rx_hw_stats_lock); dp_peer_unref_delete(peer);