]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath12k: Support Downlink Pager Stats
authorDinesh Karthikeyan <quic_dinek@quicinc.com>
Fri, 15 Nov 2024 06:28:51 +0000 (11:58 +0530)
committerJeff Johnson <quic_jjohnson@quicinc.com>
Wed, 20 Nov 2024 15:34:44 +0000 (07:34 -0800)
Add support to request downlink pager stats from firmware through HTT
stats type 36. These stats give paging information like number of pages,
their timestamp, number of locked and free pages, synchronous and
asynchronous locked pages.

Note: MCC firmware version -
WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4 responds to
the event requesting stats, but it does not give any data.

Sample output:
-------------
echo 36 > /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_DLPAGER_STATS_TLV:
ASYNC locked pages = 2
SYNC locked pages = 0
Total locked pages = 2
Total free pages = 127

LOCKED PAGES HISTORY
last_locked_page_idx = 0
Index - 0 ; Page Number - 8495 ; Num of pages - 1 ; Timestamp - 4031009360us
Index - 1 ; Page Number - 7219 ; Num of pages - 2 ; Timestamp - 885379515us
Index - 2 ; Page Number - 0 ; Num of pages - 0 ; Timestamp - 0us
Index - 3 ; Page Number - 0 ; Num of pages - 0 ; Timestamp - 0us
.....
UNLOCKED PAGES HISTORY
last_unlocked_page_idx = 0
Index - 0 ; Page Number - 7144 ; Num of pages - 2 ; Timestamp - 4032070008us
Index - 1 ; Page Number - 7214 ; Num of pages - 2 ; Timestamp - 885379512us
Index - 2 ; Page Number - 0 ; Num of pages - 0 ; Timestamp - 0us
Index - 3 ; Page Number - 0 ; Num of pages - 0 ; Timestamp - 0us
.....

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1

Signed-off-by: Dinesh Karthikeyan <quic_dinek@quicinc.com>
Signed-off-by: Roopni Devanathan <quic_rdevanat@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Link: https://patch.msgid.link/20241115062854.1919672-2-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 43ea87e981f421bba389c8682b8b8dad75b7ec65..ba06aed3d880bb5534fb0e8ab5e51f30d6413325 100644 (file)
@@ -2543,6 +2543,88 @@ ath12k_htt_print_pdev_obss_pd_stats_tlv(const void *tag_buf, u16 tag_len,
        stats_req->buf_len = len;
 }
 
+static void ath12k_htt_print_dlpager_entry(const struct ath12k_htt_pgs_info *pg_info,
+                                          int idx, char *str_buf)
+{
+       u64 page_timestamp;
+       u16 index = 0;
+
+       page_timestamp = ath12k_le32hilo_to_u64(pg_info->ts_msb, pg_info->ts_lsb);
+
+       index += snprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,
+                         "Index - %u ; Page Number - %u ; ",
+                         idx, le32_to_cpu(pg_info->page_num));
+       index += snprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,
+                         "Num of pages - %u ; Timestamp - %lluus\n",
+                         le32_to_cpu(pg_info->num_pgs), page_timestamp);
+}
+
+static void
+ath12k_htt_print_dlpager_stats_tlv(const void *tag_buf, u16 tag_len,
+                                  struct debug_htt_stats_req *stats_req)
+{
+       const struct ath12k_htt_dl_pager_stats_tlv *stat_buf = tag_buf;
+       u32 len = stats_req->buf_len;
+       u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
+       u32 dword_lock, dword_unlock;
+       int i;
+       u8 *buf = stats_req->buf;
+       u8 pg_locked;
+       u8 pg_unlock;
+       char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {0};
+
+       if (tag_len < sizeof(*stat_buf))
+               return;
+
+       dword_lock = le32_get_bits(stat_buf->info2,
+                                  ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO2);
+       dword_unlock = le32_get_bits(stat_buf->info2,
+                                    ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO2);
+
+       pg_locked = ATH12K_HTT_STATS_PAGE_LOCKED;
+       pg_unlock = ATH12K_HTT_STATS_PAGE_UNLOCKED;
+
+       len += scnprintf(buf + len, buf_len - len, "HTT_DLPAGER_STATS_TLV:\n");
+       len += scnprintf(buf + len, buf_len - len, "ASYNC locked pages = %u\n",
+                        le32_get_bits(stat_buf->info0,
+                                      ATH12K_HTT_DLPAGER_ASYNC_LOCK_PG_CNT_INFO0));
+       len += scnprintf(buf + len, buf_len - len, "SYNC locked pages = %u\n",
+                        le32_get_bits(stat_buf->info0,
+                                      ATH12K_HTT_DLPAGER_SYNC_LOCK_PG_CNT_INFO0));
+       len += scnprintf(buf + len, buf_len - len, "Total locked pages = %u\n",
+                        le32_get_bits(stat_buf->info1,
+                                      ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO1));
+       len += scnprintf(buf + len, buf_len - len, "Total free pages = %u\n",
+                        le32_get_bits(stat_buf->info1,
+                                      ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO1));
+
+       len += scnprintf(buf + len, buf_len - len, "\nLOCKED PAGES HISTORY\n");
+       len += scnprintf(buf + len, buf_len - len, "last_locked_page_idx = %u\n",
+                        dword_lock ? dword_lock - 1 : (ATH12K_PAGER_MAX - 1));
+
+       for (i = 0; i < ATH12K_PAGER_MAX; i++) {
+               memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
+               ath12k_htt_print_dlpager_entry(&stat_buf->pgs_info[pg_locked][i],
+                                              i, str_buf);
+               len += scnprintf(buf + len, buf_len - len, "%s", str_buf);
+       }
+
+       len += scnprintf(buf + len, buf_len - len, "\nUNLOCKED PAGES HISTORY\n");
+       len += scnprintf(buf + len, buf_len - len, "last_unlocked_page_idx = %u\n",
+                        dword_unlock ? dword_unlock - 1 : ATH12K_PAGER_MAX - 1);
+
+       for (i = 0; i < ATH12K_PAGER_MAX; i++) {
+               memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
+               ath12k_htt_print_dlpager_entry(&stat_buf->pgs_info[pg_unlock][i],
+                                              i, str_buf);
+               len += scnprintf(buf + len, buf_len - len, "%s", str_buf);
+       }
+
+       len += scnprintf(buf + len, buf_len - len, "\n");
+
+       stats_req->buf_len = len;
+}
+
 static void
 ath12k_htt_print_dmac_reset_stats_tlv(const void *tag_buf, u16 tag_len,
                                      struct debug_htt_stats_req *stats_req)
@@ -2562,7 +2644,6 @@ ath12k_htt_print_dmac_reset_stats_tlv(const void *tag_buf, u16 tag_len,
        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);
@@ -2870,6 +2951,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_DLPAGER_STATS_TAG:
+               ath12k_htt_print_dlpager_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;
index ac86cab234ecb70e149507cd81aa599abd0f0e05..dfb6538585d515ae7d7fb95f5d95970e4b52beeb 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_DLPAGER_STATS          = 36,
        ATH12K_DBG_HTT_EXT_STATS_SOC_ERROR              = 45,
        ATH12K_DBG_HTT_EXT_STATS_PDEV_SCHED_ALGO        = 49,
        ATH12K_DBG_HTT_EXT_STATS_MANDATORY_MUOFDMA      = 51,
@@ -194,6 +195,7 @@ enum ath12k_dbg_htt_tlv_tag {
        HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG           = 102,
        HTT_STATS_TX_SELFGEN_AC_SCHED_STATUS_STATS_TAG  = 111,
        HTT_STATS_TX_SELFGEN_AX_SCHED_STATUS_STATS_TAG  = 112,
+       HTT_STATS_DLPAGER_STATS_TAG                     = 120,
        HTT_STATS_MU_PPDU_DIST_TAG                      = 129,
        HTT_STATS_TX_PDEV_MUMIMO_GRP_STATS_TAG          = 130,
        HTT_STATS_TX_PDEV_RATE_STATS_BE_OFDMA_TAG       = 135,
@@ -1054,6 +1056,35 @@ struct ath12k_htt_pdev_obss_pd_stats_tlv {
        __le32 num_sr_ppdu_abort_flush_cnt;
 } __packed;
 
+enum ath12k_htt_stats_page_lock_state {
+       ATH12K_HTT_STATS_PAGE_LOCKED    = 0,
+       ATH12K_HTT_STATS_PAGE_UNLOCKED  = 1,
+       ATH12K_NUM_PG_LOCK_STATE
+};
+
+#define ATH12K_PAGER_MAX       10
+
+#define ATH12K_HTT_DLPAGER_ASYNC_LOCK_PG_CNT_INFO0     GENMASK(7, 0)
+#define ATH12K_HTT_DLPAGER_SYNC_LOCK_PG_CNT_INFO0      GENMASK(15, 8)
+#define ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO1      GENMASK(15, 0)
+#define ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO1      GENMASK(31, 16)
+#define ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO2      GENMASK(15, 0)
+#define ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO2      GENMASK(31, 16)
+
+struct ath12k_htt_pgs_info {
+       __le32 page_num;
+       __le32 num_pgs;
+       __le32 ts_lsb;
+       __le32 ts_msb;
+} __packed;
+
+struct ath12k_htt_dl_pager_stats_tlv {
+       __le32 info0;
+       __le32 info1;
+       __le32 info2;
+       struct ath12k_htt_pgs_info pgs_info[ATH12K_NUM_PG_LOCK_STATE][ATH12K_PAGER_MAX];
+} __packed;
+
 struct ath12k_htt_dmac_reset_stats_tlv {
        __le32 reset_count;
        __le32 reset_time_lo_ms;