wifi: ath12k: Support DMAC Reset Stats
authorRajat Soni <quic_rajson@quicinc.com>
Mon, 14 Oct 2024 06:52:59 +0000 (12:22 +0530)
committerJeff Johnson <quic_jjohnson@quicinc.com>
Wed, 16 Oct 2024 14:43:07 +0000 (07:43 -0700)
Add support to request DMAC reset stats from firmware through HTT stats
type 45. These stats give debug SoC error stats such as reset count, reset
time, engage time and count, disengage time and count and destination
ring mask.

Sample output:
-------------
echo 45 > /sys/kernel/debug/ath12k/pci-0000\:06\:00.0/mac0/htt_stats_type
cat /sys/kernel/debug/ath12k/pci-0000\:06\:00.0/mac0/htt_stats
HTT_DMAC_RESET_STATS_TLV:
reset_count = 1
reset_time_ms = 3013430342
disengage_time_ms = 3013430342
engage_time_ms = 3013430342
disengage_count = 1
engage_count = 1
drain_dest_ring_mask = 0x0

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.1.1-00214-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4

Signed-off-by: Rajat Soni <quic_rajson@quicinc.com>
Signed-off-by: Roopni Devanathan <quic_rdevanat@quicinc.com>
Link: https://patch.msgid.link/20241014065259.3968727-1-quic_rdevanat@quicinc.com
Signed-off-by: Jeff Johnson <quic_jjohnson@quicinc.com>
drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c
drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h

index b2be7dade79f95c744936a9ba783cbbe84f28d0f..8e43e05422c24591f4f35046bffc4673f7adc373 100644 (file)
@@ -2502,6 +2502,52 @@ ath12k_htt_print_pdev_obss_pd_stats_tlv(const void *tag_buf, u16 tag_len,
        stats_req->buf_len = len;
 }
 
+static u64 ath12k_le32hilo_to_u64(__le32 hi, __le32 lo)
+{
+       u64 hi64 = le32_to_cpu(hi);
+       u64 lo64 = le32_to_cpu(lo);
+
+       return (hi64 << 32) | lo64;
+}
+
+static void
+ath12k_htt_print_dmac_reset_stats_tlv(const void *tag_buf, u16 tag_len,
+                                     struct debug_htt_stats_req *stats_req)
+{
+       const struct ath12k_htt_dmac_reset_stats_tlv *htt_stats_buf = tag_buf;
+       u8 *buf = stats_req->buf;
+       u32 len = stats_req->buf_len;
+       u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
+       u64 time;
+
+       if (tag_len < sizeof(*htt_stats_buf))
+               return;
+
+       len += scnprintf(buf + len, buf_len - len, "HTT_DMAC_RESET_STATS_TLV:\n");
+       len += scnprintf(buf + len, buf_len - len, "reset_count = %u\n",
+                        le32_to_cpu(htt_stats_buf->reset_count));
+       time = ath12k_le32hilo_to_u64(htt_stats_buf->reset_time_hi_ms,
+                                     htt_stats_buf->reset_time_lo_ms);
+       len += scnprintf(buf + len, buf_len - len, "reset_time_ms = %llu\n", time);
+
+       time = ath12k_le32hilo_to_u64(htt_stats_buf->disengage_time_hi_ms,
+                                     htt_stats_buf->disengage_time_lo_ms);
+       len += scnprintf(buf + len, buf_len - len, "disengage_time_ms = %llu\n", time);
+
+       time = ath12k_le32hilo_to_u64(htt_stats_buf->engage_time_hi_ms,
+                                     htt_stats_buf->engage_time_lo_ms);
+       len += scnprintf(buf + len, buf_len - len, "engage_time_ms = %llu\n", time);
+
+       len += scnprintf(buf + len, buf_len - len, "disengage_count = %u\n",
+                        le32_to_cpu(htt_stats_buf->disengage_count));
+       len += scnprintf(buf + len, buf_len - len, "engage_count = %u\n",
+                        le32_to_cpu(htt_stats_buf->engage_count));
+       len += scnprintf(buf + len, buf_len - len, "drain_dest_ring_mask = 0x%x\n\n",
+                        le32_to_cpu(htt_stats_buf->drain_dest_ring_mask));
+
+       stats_req->buf_len = len;
+}
+
 static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
                                          u16 tag, u16 len, const void *tag_buf,
                                          void *user_data)
@@ -2675,6 +2721,9 @@ static int ath12k_dbg_htt_ext_stats_parse(struct ath12k_base *ab,
        case HTT_STATS_PDEV_OBSS_PD_TAG:
                ath12k_htt_print_pdev_obss_pd_stats_tlv(tag_buf, len, stats_req);
                break;
+       case HTT_STATS_DMAC_RESET_STATS_TAG:
+               ath12k_htt_print_dmac_reset_stats_tlv(tag_buf, len, stats_req);
+               break;
        default:
                break;
        }
index 597334830d02857ea490b42358f46192ae3308db..120615fbe85309b29307a0ad169d04e18d831270 100644 (file)
@@ -135,6 +135,7 @@ enum ath12k_dbg_htt_ext_stats_type {
        ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_MU             = 17,
        ATH12K_DBG_HTT_EXT_STATS_PDEV_CCA_STATS         = 19,
        ATH12K_DBG_HTT_EXT_STATS_PDEV_OBSS_PD_STATS     = 23,
+       ATH12K_DBG_HTT_EXT_STATS_SOC_ERROR              = 45,
 
        /* keep this last */
        ATH12K_DBG_HTT_NUM_EXT_STATS,
@@ -196,6 +197,7 @@ enum ath12k_dbg_htt_tlv_tag {
        HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG           = 137,
        HTT_STATS_TX_SELFGEN_BE_STATS_TAG               = 138,
        HTT_STATS_TX_SELFGEN_BE_SCHED_STATUS_STATS_TAG  = 139,
+       HTT_STATS_DMAC_RESET_STATS_TAG                  = 155,
 
        HTT_STATS_MAX_TAG,
 };
@@ -1048,4 +1050,17 @@ struct ath12k_htt_pdev_obss_pd_stats_tlv {
        __le32 num_sr_ppdu_abort_flush_cnt;
 } __packed;
 
+struct ath12k_htt_dmac_reset_stats_tlv {
+       __le32 reset_count;
+       __le32 reset_time_lo_ms;
+       __le32 reset_time_hi_ms;
+       __le32 disengage_time_lo_ms;
+       __le32 disengage_time_hi_ms;
+       __le32 engage_time_lo_ms;
+       __le32 engage_time_hi_ms;
+       __le32 disengage_count;
+       __le32 engage_count;
+       __le32 drain_dest_ring_mask;
+} __packed;
+
 #endif