diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index df2bb066dd..bf49f39cfd 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -318,6 +318,17 @@ const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { }; #endif +#if defined(HW_TX_DELAY_STATS_ENABLE) +const char *fw_to_hw_delay_bkt_str[CDP_DELAY_BUCKET_MAX + 1] = { + "0-2ms", "2-4", + "4-6", "6-8", + "8-10", "10-20", + "20-30", "30-40", + "40-50", "50-100", + "100-250", "250-500", "500+ ms" +}; +#endif + #ifdef QCA_ENH_V3_STATS_SUPPORT #ifndef WLAN_CONFIG_TX_DELAY const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { @@ -4964,6 +4975,22 @@ static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index) return fw_to_hw_delay_bucket[index]; } +#if defined(HW_TX_DELAY_STATS_ENABLE) +/** + * dp_str_fw_to_hw_delay_bkt() - Return string for concise logging of delay + * @index: Index of delay + * + * Return: char const pointer + */ +static inline const char *dp_str_fw_to_hw_delay_bkt(uint8_t index) +{ + if (index > CDP_DELAY_BUCKET_MAX) + return "Invalid"; + + return fw_to_hw_delay_bkt_str[index]; +} +#endif + /** * dp_accumulate_delay_stats() - Update delay stats members * @total: Update stats total structure @@ -5401,19 +5428,39 @@ QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, #endif #ifdef HW_TX_DELAY_STATS_ENABLE +#define DP_TX_DELAY_STATS_STR_LEN 512 +#define DP_SHORT_DELAY_BKT_COUNT 5 static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev) { struct cdp_delay_stats delay_stats; struct cdp_tid_tx_stats *per_ring; uint8_t tid, index; - uint64_t count = 0; + uint32_t count = 0; uint8_t ring_id; + char *buf; + size_t pos, buf_len; + char hw_tx_delay_str[DP_TX_DELAY_STATS_STR_LEN] = {"\0"}; + buf_len = DP_TX_DELAY_STATS_STR_LEN; if (!vdev) return; - DP_PRINT_STATS("vdev_id: %d Per TID Delay Non-Zero Stats:\n", - vdev->vdev_id); + dp_info("vdev_id: %d Per TID HW Tx completion latency Stats:", + vdev->vdev_id); + buf = hw_tx_delay_str; + dp_info(" Tid%32sPkts_per_delay_bucket%60s | Min | Max | Avg |", + "", ""); + pos = 0; + pos += qdf_scnprintf(buf + pos, buf_len - pos, "%6s", ""); + for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { + if (index < DP_SHORT_DELAY_BKT_COUNT) + pos += qdf_scnprintf(buf + pos, buf_len - pos, "%7s", + dp_str_fw_to_hw_delay_bkt(index)); + else + pos += qdf_scnprintf(buf + pos, buf_len - pos, "%9s", + dp_str_fw_to_hw_delay_bkt(index)); + } + dp_info("%s", hw_tx_delay_str); for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { qdf_mem_zero(&delay_stats, sizeof(delay_stats)); for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { @@ -5421,21 +5468,21 @@ static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev) dp_accumulate_delay_stats(&delay_stats, &per_ring->hwtx_delay); } - - DP_PRINT_STATS("Hardware Tx completion latency stats TID: %d", - tid); + pos = 0; + pos += qdf_scnprintf(buf + pos, buf_len - pos, "%4u ", tid); for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { count = delay_stats.delay_bucket[index]; - if (count) { - DP_PRINT_STATS("%s: Packets = %llu", - dp_vow_str_fw_to_hw_delay(index), - count); - } + if (index < DP_SHORT_DELAY_BKT_COUNT) + pos += qdf_scnprintf(buf + pos, buf_len - pos, + "%6u|", count); + else + pos += qdf_scnprintf(buf + pos, buf_len - pos, + "%8u|", count); } - - DP_PRINT_STATS("Min = %u", delay_stats.min_delay); - DP_PRINT_STATS("Max = %u", delay_stats.max_delay); - DP_PRINT_STATS("Avg = %u\n", delay_stats.avg_delay); + pos += qdf_scnprintf(buf + pos, buf_len - pos, + "%10u | %3u | %3u|", delay_stats.min_delay, + delay_stats.max_delay, delay_stats.avg_delay); + dp_info("%s", hw_tx_delay_str); } } @@ -5469,7 +5516,8 @@ void dp_pdev_print_tx_delay_stats(struct dp_soc *soc) for (index = 0; index < num_vdev; index++) { vdev = vdev_array[index]; - dp_vdev_print_tx_delay_stats(vdev); + if (qdf_unlikely(dp_is_vdev_tx_delay_stats_enabled(vdev))) + dp_vdev_print_tx_delay_stats(vdev); dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); } qdf_mem_free(vdev_array);