diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index e042cbcbaddf..358dbd0fcef1 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -145,6 +145,7 @@ enum htt_cmn_dbg_stats_type { * @TXRX_TX_HOST_STATS: Print Tx stats * @TXRX_RX_HOST_STATS: Print host Rx stats * @TXRX_CLEAR_STATS: clear all host stats + * @TXRX_SRNG_PTR_STATS: Print SRNG pointer stats */ enum cdp_host_txrx_stats { TXRX_HOST_STATS_INVALID = -1, @@ -154,6 +155,7 @@ enum cdp_host_txrx_stats { TXRX_TX_HOST_STATS = 3, TXRX_RX_HOST_STATS = 4, TXRX_AST_STATS = 5, + TXRX_SRNG_PTR_STATS = 6, TXRX_HOST_STATS_MAX, }; diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 53840693f22f..0c81a74e6937 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -74,6 +74,7 @@ cdp_dump_flow_pool_info(struct cdp_soc_t *soc) bool rx_hash = 1; qdf_declare_param(rx_hash, bool); +#define STR_MAXLEN 64 /** * default_dscp_tid_map - Default DSCP-TID mapping * @@ -260,6 +261,7 @@ const int dp_stats_mapping_table[][STATS_TYPE_MAX] = { {TXRX_FW_STATS_INVALID, TXRX_TX_HOST_STATS}, {TXRX_FW_STATS_INVALID, TXRX_RX_HOST_STATS}, {TXRX_FW_STATS_INVALID, TXRX_AST_STATS}, + {TXRX_FW_STATS_INVALID, TXRX_SRNG_PTR_STATS}, }; /** @@ -4082,6 +4084,116 @@ dp_print_soc_rx_stats(struct dp_soc *soc) reo_error); } + +/** + * dp_print_ring_stat_from_hal(): Print hal level ring stats + * @soc: DP_SOC handle + * @srng: DP_SRNG handle + * @ring_name: SRNG name + * + * Return: void + */ +static inline void +dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng, + char *ring_name) +{ + uint32_t tailp; + uint32_t headp; + + if (srng->hal_srng != NULL) { + hal_api_get_tphp(soc->hal_soc, srng->hal_srng, &tailp, &headp); + DP_PRINT_STATS("%s : Head pointer = %d Tail Pointer = %d\n", + ring_name, headp, tailp); + } +} + +/** + * dp_print_ring_stats(): Print tail and head pointer + * @pdev: DP_PDEV handle + * + * Return:void + */ +static inline void +dp_print_ring_stats(struct dp_pdev *pdev) +{ + uint32_t i; + char ring_name[STR_MAXLEN + 1]; + + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->reo_exception_ring, + "Reo Exception Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->reo_reinject_ring, + "Reo Inject Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->reo_cmd_ring, + "Reo Command Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->reo_status_ring, + "Reo Status Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->rx_rel_ring, + "Rx Release ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->tcl_cmd_ring, + "Tcl command Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->tcl_status_ring, + "Tcl Status Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->wbm_desc_rel_ring, + "Wbm Desc Rel Ring"); + for (i = 0; i < MAX_REO_DEST_RINGS; i++) { + snprintf(ring_name, STR_MAXLEN, "Reo Dest Ring %d", i); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->reo_dest_ring[i], + ring_name); + } + for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) { + snprintf(ring_name, STR_MAXLEN, "Tcl Data Ring %d", i); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->tcl_data_ring[i], + ring_name); + } + for (i = 0; i < MAX_TCL_DATA_RINGS; i++) { + snprintf(ring_name, STR_MAXLEN, "Tx Comp Ring %d", i); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->soc->tx_comp_ring[i], + ring_name); + } + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->rx_refill_buf_ring, + "Rx Refill Buf Ring"); + + #ifdef IPA_OFFLOAD + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->ipa_rx_refill_buf_ring, + "IPA Rx Refill Buf Ring"); + #endif + + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->rxdma_mon_buf_ring, + "Rxdma Mon Buf Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->rxdma_mon_dst_ring, + "Rxdma Mon Dst Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->rxdma_mon_status_ring, + "Rxdma Mon Status Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->rxdma_mon_desc_ring, + "Rxdma mon desc Ring"); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->rxdma_err_dst_ring, + "Rxdma err dst ring"); + for (i = 0; i < MAX_RX_MAC_RINGS; i++) { + snprintf(ring_name, STR_MAXLEN, "Rx mac buf ring %d", i); + dp_print_ring_stat_from_hal(pdev->soc, + &pdev->rx_mac_buf_ring[i], + ring_name); + } +} + /** * dp_txrx_host_stats_clr(): Reinitialize the txrx stats * @vdev: DP_VDEV handle @@ -4418,6 +4530,7 @@ static inline void dp_print_peer_stats(struct dp_peer *peer) * TXRX_TX_HOST_STATS: Print Tx Stats * TXRX_RX_HOST_STATS: Print Rx Stats * TXRX_AST_STATS: Print AST Stats + * TXRX_SRNG_PTR_STATS: Print SRNG ring pointer stats * * Return: 0 on success, print error message in case of failure */ @@ -4450,6 +4563,9 @@ dp_print_host_stats(struct cdp_vdev *vdev_handle, enum cdp_host_txrx_stats type) case TXRX_AST_STATS: dp_print_ast_stats(pdev->soc); break; + case TXRX_SRNG_PTR_STATS: + dp_print_ring_stats(pdev); + break; default: DP_TRACE(FATAL, "Wrong Input For TxRx Host Stats"); break; diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h index 02f5a36fb51f..827a3c05c65a 100644 --- a/hal/wifi3.0/hal_api.h +++ b/hal/wifi3.0/hal_api.h @@ -570,6 +570,30 @@ static inline uint32_t hal_srng_src_done_val(void *hal_soc, void *hal_ring) return ((srng->ring_size - next_reap_hp) + srng->u.src_ring.cached_tp) / srng->entry_size; } + +/** + * hal_api_get_tphp - Get head and tail pointer location for any ring + * @hal_soc: Opaque HAL SOC handle + * @hal_ring: Source ring pointer + * @tailp: Tail Pointer + * @headp: Head Pointer + * + * Return: Update tail pointer and head pointer in arguments. + */ +static inline void hal_api_get_tphp(void *hal_soc, void *hal_ring, + uint32_t *tailp, uint32_t *headp) +{ + struct hal_srng *srng = (struct hal_srng *)hal_ring; + + if (srng->ring_dir == HAL_SRNG_SRC_RING) { + *headp = srng->u.src_ring.hp / srng->entry_size; + *tailp = *(srng->u.src_ring.tp_addr) / srng->entry_size; + } else { + *tailp = srng->u.dst_ring.tp / srng->entry_size; + *headp = *(srng->u.dst_ring.hp_addr) / srng->entry_size; + } +} + /** * hal_srng_src_get_next - Get next entry from a source ring and move cached tail pointer *