diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index fdd7f20ed2..8b3b93025c 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -1085,10 +1085,12 @@ struct ol_if_ops { uint16_t peer_id, uint8_t vdev_id, uint8_t *peer_mac_addr); #endif int (*get_soc_nss_cfg)(struct cdp_ctrl_objmgr_psoc *ol_soc_handle); - /* TODO: Add any other control path calls required to OL_IF/WMA layer */ char *(*get_device_name)(struct cdp_ctrl_objmgr_psoc *ctrl_psoc, uint8_t pdev_id); + QDF_STATUS(*nss_stats_clr)(struct cdp_ctrl_objmgr_psoc *psoc, + uint8_t vdev_id); + /* TODO: Add any other control path calls required to OL_IF/WMA layer */ }; #ifdef DP_PEER_EXTENDED_API diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 311aea5d39..366f095bee 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -1271,6 +1271,23 @@ struct cdp_peer_stats { struct cdp_rx_stats rx; }; +/* struct cdp_peer_tid_stats - Per peer and per TID stats + * @tx_avg_jitter: tx average jitter + * @tx_avg_delay: tx average delay + * @tx_avg_err: tx average error + * @tx_total_success: tx total success + * @tx_drop: tx drop + */ +struct cdp_peer_tid_stats { +#ifdef WLAN_PEER_JITTER + uint32_t tx_avg_jitter; + uint32_t tx_avg_delay; + uint64_t tx_avg_err; + uint64_t tx_total_success; + uint64_t tx_drop; +#endif +}; + /* struct cdp_interface_peer_stats - interface structure for txrx peer stats * @peer_mac: peer mac address * @vdev_id : vdev_id for the peer diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index ec2349499d..5860ce14ed 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -7303,17 +7303,29 @@ void dp_print_napi_stats(struct dp_soc *soc) /** * dp_txrx_host_stats_clr(): Reinitialize the txrx stats * @vdev: DP_VDEV handle + * @dp_soc: DP_SOC handle * * Return: QDF_STATUS */ static inline QDF_STATUS -dp_txrx_host_stats_clr(struct dp_vdev *vdev) +dp_txrx_host_stats_clr(struct dp_vdev *vdev, struct dp_soc *soc) { struct dp_peer *peer = NULL; if (!vdev || !vdev->pdev) return QDF_STATUS_E_FAILURE; + /* + * if NSS offload is enabled, then send message + * to NSS FW to clear the stats. Once NSS FW clears the statistics + * then clear host statistics. + */ + if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) { + if (soc->cdp_soc.ol_ops->nss_stats_clr) + soc->cdp_soc.ol_ops->nss_stats_clr(soc->ctrl_psoc, + vdev->vdev_id); + } + DP_STATS_CLR(vdev->pdev); DP_STATS_CLR(vdev->pdev->soc); DP_STATS_CLR(vdev); @@ -7321,10 +7333,15 @@ dp_txrx_host_stats_clr(struct dp_vdev *vdev) hif_clear_napi_stats(vdev->pdev->soc->hif_handle); TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) { - if (!peer) - return QDF_STATUS_E_FAILURE; - DP_STATS_CLR(peer); + struct dp_rx_tid *rx_tid; + uint8_t tid; + for (tid = 0; tid < DP_MAX_TIDS; tid++) { + rx_tid = &peer->rx_tid[tid]; + DP_STATS_CLR(rx_tid); + } + + DP_STATS_CLR(peer); #if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE dp_wdi_event_handler(WDI_EVENT_UPDATE_DP_STATS, vdev->pdev->soc, &peer->stats, peer->peer_id, @@ -7424,13 +7441,15 @@ static void dp_txrx_stats_help(void) /** * dp_print_host_stats()- Function to print the stats aggregated at host * @vdev_handle: DP_VDEV handle - * @type: host stats type + * @req: host stats type + * @soc: dp soc handler * * Return: 0 on success, print error message in case of failure */ static int dp_print_host_stats(struct dp_vdev *vdev, - struct cdp_txrx_stats_req *req) + struct cdp_txrx_stats_req *req, + struct dp_soc *soc) { struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; enum cdp_host_txrx_stats type = @@ -7440,7 +7459,7 @@ dp_print_host_stats(struct dp_vdev *vdev, switch (type) { case TXRX_CLEAR_STATS: - dp_txrx_host_stats_clr(vdev); + dp_txrx_host_stats_clr(vdev, soc); break; case TXRX_RX_RATE_STATS: dp_print_rx_rates(vdev); @@ -8996,7 +9015,7 @@ QDF_STATUS dp_txrx_stats_request(struct cdp_soc_t *soc_handle, if ((host_stats != TXRX_HOST_STATS_INVALID) && (host_stats <= TXRX_HOST_STATS_MAX)) - return dp_print_host_stats(vdev, req); + return dp_print_host_stats(vdev, req, soc); else QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "Wrong Input for TxRx Stats"); diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 8495fef1ba..3f9abaa90f 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -5366,11 +5366,11 @@ static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev) "Total Success Count : %llu\n" "Total Drop : %llu\n", rx_tid->tid, - rx_tid->tx_avg_jitter, - rx_tid->tx_avg_delay, - rx_tid->tx_avg_err, - rx_tid->tx_total_success, - rx_tid->tx_drop); + rx_tid->stats.tx_avg_jitter, + rx_tid->stats.tx_avg_delay, + rx_tid->stats.tx_avg_err, + rx_tid->stats.tx_total_success, + rx_tid->stats.tx_drop); } } #else diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index fe568cc93f..7f9e29abe6 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -653,14 +653,8 @@ struct dp_rx_tid { /* Coex Override preserved windows size 1 based */ uint16_t rx_ba_win_size_override; -#ifdef WLAN_PEER_JITTER - /* Tx Jitter stats */ - uint32_t tx_avg_jitter; - uint32_t tx_avg_delay; - uint64_t tx_avg_err; - uint64_t tx_total_success; - uint64_t tx_drop; -#endif /* WLAN_PEER_JITTER */ + /* Peer TID statistics */ + struct cdp_peer_tid_stats stats; }; /**