diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 7e90823e4a40..b0afaf1fba5f 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -33,6 +33,7 @@ #include "htc_api.h" #include "qdf_types.h" #include "qdf_nbuf.h" +#include "qdf_atomic.h" #ifndef CONFIG_WIN #include #endif /* CONFIG_WIN */ @@ -836,6 +837,8 @@ struct cdp_rx_stats { uint32_t non_amsdu_cnt; /* Number of MSDUs part of AMSDU*/ uint32_t amsdu_cnt; + /* Number of bar received */ + uint32_t bar_recv_cnt; }; /* Tx ingress Stats */ @@ -1003,6 +1006,7 @@ struct cdp_pdev_stats { struct cdp_hist_tx_comp tx_comp_histogram; /* Number of Rx ring descriptors reaped per interrupt */ struct cdp_hist_rx_ind rx_ind_histogram; + qdf_atomic_t cmd_complete; }; /** diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 2bb53c71d042..1b01380b9b24 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -287,6 +287,10 @@ extern QDF_STATUS dp_reo_send_cmd(struct dp_soc *soc, extern void dp_reo_cmdlist_destroy(struct dp_soc *soc); extern void dp_reo_status_ring_handler(struct dp_soc *soc); void dp_aggregate_vdev_stats(struct dp_vdev *vdev); +void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt, + union hal_reo_status *reo_status); +void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt, + union hal_reo_status *reo_status); uint16_t dp_tx_me_send_convert_ucast(struct cdp_vdev *vdev_handle, qdf_nbuf_t nbuf, uint8_t newmac[][DP_MAC_ADDR_LEN], uint8_t new_mac_cnt); @@ -298,7 +302,8 @@ QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev, uint32_t config_param_1, uint32_t config_param_2, uint32_t config_param_3); void dp_htt_stats_print_tag(uint8_t tag_type, uint32_t *tag_buf); -int dp_peer_rxtid_stats(struct dp_peer *peer); +void dp_peer_rxtid_stats(struct dp_peer *peer, void (*callback_fn), + void *cb_ctxt); void dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle, struct cdp_peer *peer_handle, enum cdp_sec_type sec_type, uint32_t *rx_pn); diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 61f6717fbf17..3ca1cca35931 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -3745,6 +3745,69 @@ void dp_peer_set_mesh_rx_filter(struct cdp_vdev *vdev_hdl, uint32_t val) } #endif +/* + * dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats + * Current scope is bar recieved count + * + * @pdev_handle: DP_PDEV handle + * + * Return: void + */ +#define STATS_PROC_TIMEOUT (HZ/10) + +static void +dp_aggregate_pdev_ctrl_frames_stats(struct dp_pdev *pdev) +{ + struct dp_vdev *vdev; + struct dp_peer *peer; + uint32_t waitcnt; + + TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) { + TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) { + if (!peer) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + FL("DP Invalid Peer refernce")); + return; + } + waitcnt = 0; + dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev); + while (!(qdf_atomic_read(&(pdev->stats.cmd_complete))) + && waitcnt < 10) { + schedule_timeout_interruptible( + STATS_PROC_TIMEOUT); + waitcnt++; + } + qdf_atomic_set(&(pdev->stats.cmd_complete), 0); + } + } +} + +/** + * dp_rx_bar_stats_cb(): BAR received stats callback + * @soc: SOC handle + * @cb_ctxt: Call back context + * @reo_status: Reo status + * + * return: void + */ +void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt, + union hal_reo_status *reo_status) +{ + struct dp_pdev *pdev = (struct dp_pdev *)cb_ctxt; + struct hal_reo_queue_status *queue_status = &(reo_status->queue_status); + + if (queue_status->header.status != HAL_REO_CMD_SUCCESS) { + DP_TRACE_STATS(FATAL, "REO stats failure %d \n", + queue_status->header.status); + qdf_atomic_set(&(pdev->stats.cmd_complete), 1); + return; + } + + pdev->stats.rx.bar_recv_cnt += queue_status->bar_rcvd_cnt; + qdf_atomic_set(&(pdev->stats.cmd_complete), 1); + +} + /** * dp_aggregate_vdev_stats(): Consolidate stats at VDEV level * @vdev: DP VDEV handle @@ -4104,6 +4167,12 @@ dp_print_pdev_rx_stats(struct dp_pdev *pdev) pdev->stats.replenish.rxdma_err); DP_PRINT_STATS(" Desc Alloc Failed: = %d", pdev->stats.err.desc_alloc_fail); + + /* Get bar_recv_cnt */ + dp_aggregate_pdev_ctrl_frames_stats(pdev); + DP_PRINT_STATS("BAR Received Count: = %d", + pdev->stats.rx.bar_recv_cnt); + } /** @@ -4690,7 +4759,7 @@ dp_get_host_peer_stats(struct cdp_pdev *pdev_handle, char *mac_addr) } dp_print_peer_stats(peer); - dp_peer_rxtid_stats(peer); + dp_peer_rxtid_stats(peer, dp_rx_tid_stats_cb, NULL); return; } diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 4347e27dde0f..7358b6de661f 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -625,7 +625,7 @@ int dp_peer_find_attach(struct dp_soc *soc) return 0; /* success */ } -static void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt, +void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt, union hal_reo_status *reo_status) { struct dp_rx_tid *rx_tid = (struct dp_rx_tid *)cb_ctxt; @@ -1991,15 +1991,21 @@ uint8_t dp_get_peer_mac_addr_frm_id(struct cdp_soc_t *soc_handle, /** * dp_peer_rxtid_stats: Retried Rx TID (REO queue) stats from HW * @peer: DP peer handle + * @dp_stats_cmd_cb: REO command callback function + * @cb_ctxt: Callback context * - * Return: 0 on success, error code on failure + * Return: none */ -int dp_peer_rxtid_stats(struct dp_peer *peer) +void dp_peer_rxtid_stats(struct dp_peer *peer, void (*dp_stats_cmd_cb), + void *cb_ctxt) { struct dp_soc *soc = peer->vdev->pdev->soc; struct hal_reo_cmd_params params; int i; + if (!dp_stats_cmd_cb) + return; + qdf_mem_zero(¶ms, sizeof(params)); for (i = 0; i < DP_MAX_TIDS; i++) { struct dp_rx_tid *rx_tid = &peer->rx_tid[i]; @@ -2009,8 +2015,14 @@ int dp_peer_rxtid_stats(struct dp_peer *peer) rx_tid->hw_qdesc_paddr & 0xffffffff; params.std.addr_hi = (uint64_t)(rx_tid->hw_qdesc_paddr) >> 32; - dp_reo_send_cmd(soc, CMD_GET_QUEUE_STATS, ¶ms, - dp_rx_tid_stats_cb, rx_tid); + + if (cb_ctxt) { + dp_reo_send_cmd(soc, CMD_GET_QUEUE_STATS, + ¶ms, dp_stats_cmd_cb, cb_ctxt); + } else { + dp_reo_send_cmd(soc, CMD_GET_QUEUE_STATS, + ¶ms, dp_stats_cmd_cb, rx_tid); + } /* Flush REO descriptor from HW cache to update stats * in descriptor memory. This is to help debugging */ @@ -2024,5 +2036,4 @@ int dp_peer_rxtid_stats(struct dp_peer *peer) NULL); } } - return 0; }