Message ID | 20241106044548.3530128-2-quic_rdevanat@quicinc.com |
---|---|
State | Superseded |
Headers | show |
Series | wifi: ath12k: Support Pager, Counter, SoC, Transmit Rate Stats | expand |
On 11/5/2024 8:45 PM, Roopni Devanathan wrote: > From: Dinesh Karthikeyan <quic_dinek@quicinc.com> > > 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> > --- > .../wireless/ath/ath12k/debugfs_htt_stats.c | 86 +++++++++++++++++++ > .../wireless/ath/ath12k/debugfs_htt_stats.h | 31 +++++++ > 2 files changed, 117 insertions(+) > > diff --git a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c > index c9980c0193d1..8a4fe3cbb8dd 100644 > --- a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c > +++ b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c > @@ -2542,6 +2542,89 @@ 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) > +{ > + u32 ts_lo; > + u32 ts_hi; > + u64 page_timestamp; > + u16 index = 0; > + > + ts_lo = le32_to_cpu(pg_info->ts_lsb); > + ts_hi = le32_to_cpu(pg_info->ts_msb); when I build with W=1 drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c: In function 'ath12k_htt_print_dlpager_entry': drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c:2582:13: warning: variable 'ts_hi' set but not used [-Wunused-but-set-variable] drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c:2581:13: warning: variable 'ts_lo' set but not used [-Wunused-but-set-variable] > + 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); > +}
Roopni Devanathan <quic_rdevanat@quicinc.com> writes: > From: Dinesh Karthikeyan <quic_dinek@quicinc.com> > > 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> [...] > +static void ath12k_htt_print_dlpager_entry(const struct ath12k_htt_pgs_info *pg_info, > + int idx, char *str_buf) > +{ > + u32 ts_lo; > + u32 ts_hi; > + u64 page_timestamp; > + u16 index = 0; Nitpicking but please strive for reverse xmas style and no need to have just one variable per line: u64 page_timestamp; u32 ts_lo, ts_hi; u16 index = 0; > +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; > + u8 *buf = stats_req->buf; > + u32 len = stats_req->buf_len; > + u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; > + u32 info0; > + u32 info1; > + u32 info2; > + u32 dword_lock; > + u32 dword_unlock; > + u8 pg_locked; > + u8 pg_unlock; > + int i; > + char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {0}; Same here. And maybe initialise buf_len separately to keep the declarations clean? > + if (tag_len < sizeof(*stat_buf)) > + return; > + > + info0 = le32_to_cpu(stat_buf->info0); > + info1 = le32_to_cpu(stat_buf->info1); > + info2 = le32_to_cpu(stat_buf->info2); > + dword_lock = u32_get_bits(info2, ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO2); > + dword_unlock = u32_get_bits(info2, ATH12K_HTT_DLPAGER_TOTAL_FREE_PAGES_INFO2); There's le32_get_bits() so you can simplify this function quite a lot. > + 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", > + u32_get_bits(info0, ATH12K_HTT_DLPAGER_ASYNC_LOCK_PG_CNT_INFO0)); > + len += scnprintf(buf + len, buf_len - len, "SYNC locked pages = %u\n", > + u32_get_bits(info0, ATH12K_HTT_DLPAGER_SYNC_LOCK_PG_CNT_INFO0)); > + len += scnprintf(buf + len, buf_len - len, "Total locked pages = %u\n", > + u32_get_bits(info1, ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO1)); > + len += scnprintf(buf + len, buf_len - len, "Total free pages = %u\n", > + u32_get_bits(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++) { Empty line before for. > + 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++) { Empty line before for. > + 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"); Empty line after '}'.
diff --git a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c index c9980c0193d1..8a4fe3cbb8dd 100644 --- a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c +++ b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.c @@ -2542,6 +2542,89 @@ 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) +{ + u32 ts_lo; + u32 ts_hi; + u64 page_timestamp; + u16 index = 0; + + ts_lo = le32_to_cpu(pg_info->ts_lsb); + ts_hi = le32_to_cpu(pg_info->ts_msb); + 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; + u8 *buf = stats_req->buf; + u32 len = stats_req->buf_len; + u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE; + u32 info0; + u32 info1; + u32 info2; + u32 dword_lock; + u32 dword_unlock; + u8 pg_locked; + u8 pg_unlock; + int i; + char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {0}; + + if (tag_len < sizeof(*stat_buf)) + return; + + info0 = le32_to_cpu(stat_buf->info0); + info1 = le32_to_cpu(stat_buf->info1); + info2 = le32_to_cpu(stat_buf->info2); + dword_lock = u32_get_bits(info2, ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO2); + dword_unlock = u32_get_bits(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", + u32_get_bits(info0, ATH12K_HTT_DLPAGER_ASYNC_LOCK_PG_CNT_INFO0)); + len += scnprintf(buf + len, buf_len - len, "SYNC locked pages = %u\n", + u32_get_bits(info0, ATH12K_HTT_DLPAGER_SYNC_LOCK_PG_CNT_INFO0)); + len += scnprintf(buf + len, buf_len - len, "Total locked pages = %u\n", + u32_get_bits(info1, ATH12K_HTT_DLPAGER_TOTAL_LOCK_PAGES_INFO1)); + len += scnprintf(buf + len, buf_len - len, "Total free pages = %u\n", + u32_get_bits(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) @@ -2869,6 +2952,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; diff --git a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h index ac86cab234ec..dfb6538585d5 100644 --- a/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h +++ b/drivers/net/wireless/ath/ath12k/debugfs_htt_stats.h @@ -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;