stats->buf_len = len;
 }
 
+static void
+ath12k_htt_print_stats_string_tlv(const void *tag_buf, u16 tag_len,
+                                 struct debug_htt_stats_req *stats_req)
+{
+       const struct ath12k_htt_stats_string_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;
+       u8 i;
+       u16 index = 0;
+       u32 datum;
+       char data[ATH12K_HTT_MAX_STRING_LEN] = {0};
+
+       tag_len = tag_len >> 2;
+
+       len += scnprintf(buf + len, buf_len - len, "HTT_STATS_STRING_TLV:\n");
+       for (i = 0; i < tag_len; i++) {
+               datum = __le32_to_cpu(htt_stats_buf->data[i]);
+               index += scnprintf(&data[index], ATH12K_HTT_MAX_STRING_LEN - index,
+                                  "%.*s", 4, (char *)&datum);
+               if (index >= ATH12K_HTT_MAX_STRING_LEN)
+                       break;
+       }
+       len += scnprintf(buf + len, buf_len - len, "data = %s\n\n", data);
+
+       stats_req->buf_len = len;
+}
+
+static void
+ath12k_htt_print_sring_stats_tlv(const void *tag_buf, u16 tag_len,
+                                struct debug_htt_stats_req *stats_req)
+{
+       const struct ath12k_htt_sring_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;
+       u32 mac_id_word;
+       u32 avail_words;
+       u32 head_tail_ptr;
+       u32 sring_stat;
+       u32 tail_ptr;
+
+       if (tag_len < sizeof(*htt_stats_buf))
+               return;
+
+       mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__ring_id__arena__ep);
+       avail_words = __le32_to_cpu(htt_stats_buf->num_avail_words__num_valid_words);
+       head_tail_ptr = __le32_to_cpu(htt_stats_buf->head_ptr__tail_ptr);
+       sring_stat = __le32_to_cpu(htt_stats_buf->consumer_empty__producer_full);
+       tail_ptr = __le32_to_cpu(htt_stats_buf->prefetch_count__internal_tail_ptr);
+
+       len += scnprintf(buf + len, buf_len - len, "HTT_SRING_STATS_TLV:\n");
+       len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",
+                        u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_MAC_ID));
+       len += scnprintf(buf + len, buf_len - len, "ring_id = %u\n",
+                        u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_RING_ID));
+       len += scnprintf(buf + len, buf_len - len, "arena = %u\n",
+                        u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_ARENA));
+       len += scnprintf(buf + len, buf_len - len, "ep = %u\n",
+                        u32_get_bits(mac_id_word, ATH12K_HTT_SRING_STATS_EP));
+       len += scnprintf(buf + len, buf_len - len, "base_addr_lsb = 0x%x\n",
+                        le32_to_cpu(htt_stats_buf->base_addr_lsb));
+       len += scnprintf(buf + len, buf_len - len, "base_addr_msb = 0x%x\n",
+                        le32_to_cpu(htt_stats_buf->base_addr_msb));
+       len += scnprintf(buf + len, buf_len - len, "ring_size = %u\n",
+                        le32_to_cpu(htt_stats_buf->ring_size));
+       len += scnprintf(buf + len, buf_len - len, "elem_size = %u\n",
+                        le32_to_cpu(htt_stats_buf->elem_size));
+       len += scnprintf(buf + len, buf_len - len, "num_avail_words = %u\n",
+                        u32_get_bits(avail_words,
+                                     ATH12K_HTT_SRING_STATS_NUM_AVAIL_WORDS));
+       len += scnprintf(buf + len, buf_len - len, "num_valid_words = %u\n",
+                        u32_get_bits(avail_words,
+                                     ATH12K_HTT_SRING_STATS_NUM_VALID_WORDS));
+       len += scnprintf(buf + len, buf_len - len, "head_ptr = %u\n",
+                        u32_get_bits(head_tail_ptr, ATH12K_HTT_SRING_STATS_HEAD_PTR));
+       len += scnprintf(buf + len, buf_len - len, "tail_ptr = %u\n",
+                        u32_get_bits(head_tail_ptr, ATH12K_HTT_SRING_STATS_TAIL_PTR));
+       len += scnprintf(buf + len, buf_len - len, "consumer_empty = %u\n",
+                        u32_get_bits(sring_stat,
+                                     ATH12K_HTT_SRING_STATS_CONSUMER_EMPTY));
+       len += scnprintf(buf + len, buf_len - len, "producer_full = %u\n",
+                        u32_get_bits(head_tail_ptr,
+                                     ATH12K_HTT_SRING_STATS_PRODUCER_FULL));
+       len += scnprintf(buf + len, buf_len - len, "prefetch_count = %u\n",
+                        u32_get_bits(tail_ptr, ATH12K_HTT_SRING_STATS_PREFETCH_COUNT));
+       len += scnprintf(buf + len, buf_len - len, "internal_tail_ptr = %u\n\n",
+                        u32_get_bits(tail_ptr,
+                                     ATH12K_HTT_SRING_STATS_INTERNAL_TAIL_PTR));
+
+       stats_req->buf_len = len;
+}
+
+static void
+ath12k_htt_print_sfm_cmn_tlv(const void *tag_buf, u16 tag_len,
+                            struct debug_htt_stats_req *stats_req)
+{
+       const struct ath12k_htt_sfm_cmn_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;
+       u32 mac_id_word;
+
+       if (tag_len < sizeof(*htt_stats_buf))
+               return;
+
+       mac_id_word = __le32_to_cpu(htt_stats_buf->mac_id__word);
+
+       len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CMN_TLV:\n");
+       len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",
+                        u32_get_bits(mac_id_word, ATH12K_HTT_STATS_MAC_ID));
+       len += scnprintf(buf + len, buf_len - len, "buf_total = %u\n",
+                        le32_to_cpu(htt_stats_buf->buf_total));
+       len += scnprintf(buf + len, buf_len - len, "mem_empty = %u\n",
+                        le32_to_cpu(htt_stats_buf->mem_empty));
+       len += scnprintf(buf + len, buf_len - len, "deallocate_bufs = %u\n",
+                        le32_to_cpu(htt_stats_buf->deallocate_bufs));
+       len += scnprintf(buf + len, buf_len - len, "num_records = %u\n\n",
+                        le32_to_cpu(htt_stats_buf->num_records));
+
+       stats_req->buf_len = len;
+}
+
+static void
+ath12k_htt_print_sfm_client_tlv(const void *tag_buf, u16 tag_len,
+                               struct debug_htt_stats_req *stats_req)
+{
+       const struct ath12k_htt_sfm_client_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;
+
+       if (tag_len < sizeof(*htt_stats_buf))
+               return;
+
+       len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_TLV:\n");
+       len += scnprintf(buf + len, buf_len - len, "client_id = %u\n",
+                        le32_to_cpu(htt_stats_buf->client_id));
+       len += scnprintf(buf + len, buf_len - len, "buf_min = %u\n",
+                        le32_to_cpu(htt_stats_buf->buf_min));
+       len += scnprintf(buf + len, buf_len - len, "buf_max = %u\n",
+                        le32_to_cpu(htt_stats_buf->buf_max));
+       len += scnprintf(buf + len, buf_len - len, "buf_busy = %u\n",
+                        le32_to_cpu(htt_stats_buf->buf_busy));
+       len += scnprintf(buf + len, buf_len - len, "buf_alloc = %u\n",
+                        le32_to_cpu(htt_stats_buf->buf_alloc));
+       len += scnprintf(buf + len, buf_len - len, "buf_avail = %u\n",
+                        le32_to_cpu(htt_stats_buf->buf_avail));
+       len += scnprintf(buf + len, buf_len - len, "num_users = %u\n\n",
+                        le32_to_cpu(htt_stats_buf->num_users));
+
+       stats_req->buf_len = len;
+}
+
+static void
+ath12k_htt_print_sfm_client_user_tlv(const void *tag_buf, u16 tag_len,
+                                    struct debug_htt_stats_req *stats_req)
+{
+       const struct ath12k_htt_sfm_client_user_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;
+       u16 num_elems = tag_len >> 2;
+
+       len += scnprintf(buf + len, buf_len - len, "HTT_SFM_CLIENT_USER_TLV:\n");
+       len += print_array_to_buf(buf, len, "dwords_used_by_user_n",
+                                 htt_stats_buf->dwords_used_by_user_n,
+                                 num_elems, "\n\n");
+
+       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)
                ath12k_htt_print_tx_selfgen_be_sched_status_stats_tlv(tag_buf, len,
                                                                      stats_req);
                break;
+       case HTT_STATS_STRING_TAG:
+               ath12k_htt_print_stats_string_tlv(tag_buf, len, stats_req);
+               break;
+       case HTT_STATS_SRING_STATS_TAG:
+               ath12k_htt_print_sring_stats_tlv(tag_buf, len, stats_req);
+               break;
+       case HTT_STATS_SFM_CMN_TAG:
+               ath12k_htt_print_sfm_cmn_tlv(tag_buf, len, stats_req);
+               break;
+       case HTT_STATS_SFM_CLIENT_TAG:
+               ath12k_htt_print_sfm_client_tlv(tag_buf, len, stats_req);
+               break;
+       case HTT_STATS_SFM_CLIENT_USER_TAG:
+               ath12k_htt_print_sfm_client_user_tlv(tag_buf, len, stats_req);
+               break;
        default:
                break;
        }
 
        ATH12K_DBG_HTT_EXT_STATS_PDEV_TQM               = 6,
        ATH12K_DBG_HTT_EXT_STATS_TX_DE_INFO             = 8,
        ATH12K_DBG_HTT_EXT_STATS_TX_SELFGEN_INFO        = 12,
+       ATH12K_DBG_HTT_EXT_STATS_SRNG_INFO              = 15,
+       ATH12K_DBG_HTT_EXT_STATS_SFM_INFO               = 16,
 
        /* keep this last */
        ATH12K_DBG_HTT_NUM_EXT_STATS,
        HTT_STATS_TX_PDEV_UNDERRUN_TAG                  = 1,
        HTT_STATS_TX_PDEV_SIFS_TAG                      = 2,
        HTT_STATS_TX_PDEV_FLUSH_TAG                     = 3,
+       HTT_STATS_STRING_TAG                            = 5,
        HTT_STATS_TX_TQM_GEN_MPDU_TAG                   = 11,
        HTT_STATS_TX_TQM_LIST_MPDU_TAG                  = 12,
        HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG              = 13,
        HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG             = 21,
        HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG             = 22,
        HTT_STATS_TX_DE_CMN_TAG                         = 23,
+       HTT_STATS_SFM_CMN_TAG                           = 26,
+       HTT_STATS_SRING_STATS_TAG                       = 27,
        HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG       = 36,
        HTT_STATS_TX_SCHED_CMN_TAG                      = 37,
        HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG              = 39,
+       HTT_STATS_SFM_CLIENT_USER_TAG                   = 41,
+       HTT_STATS_SFM_CLIENT_TAG                        = 42,
        HTT_STATS_TX_TQM_ERROR_STATS_TAG                = 43,
        HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG              = 44,
        HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG           = 46,
        __le32 be_ulmumimo_trig_sch_flag_err[ATH12K_HTT_TX_SELFGEN_SCH_TSFLAG_ERR_STATS];
 } __packed;
 
+struct ath12k_htt_stats_string_tlv {
+       DECLARE_FLEX_ARRAY(__le32, data);
+} __packed;
+
+#define ATH12K_HTT_SRING_STATS_MAC_ID                  GENMASK(7, 0)
+#define ATH12K_HTT_SRING_STATS_RING_ID                 GENMASK(15, 8)
+#define ATH12K_HTT_SRING_STATS_ARENA                   GENMASK(23, 16)
+#define ATH12K_HTT_SRING_STATS_EP                      BIT(24)
+#define ATH12K_HTT_SRING_STATS_NUM_AVAIL_WORDS         GENMASK(15, 0)
+#define ATH12K_HTT_SRING_STATS_NUM_VALID_WORDS         GENMASK(31, 16)
+#define ATH12K_HTT_SRING_STATS_HEAD_PTR                GENMASK(15, 0)
+#define ATH12K_HTT_SRING_STATS_TAIL_PTR                GENMASK(31, 16)
+#define ATH12K_HTT_SRING_STATS_CONSUMER_EMPTY          GENMASK(15, 0)
+#define ATH12K_HTT_SRING_STATS_PRODUCER_FULL           GENMASK(31, 16)
+#define ATH12K_HTT_SRING_STATS_PREFETCH_COUNT          GENMASK(15, 0)
+#define ATH12K_HTT_SRING_STATS_INTERNAL_TAIL_PTR       GENMASK(31, 16)
+
+struct ath12k_htt_sring_stats_tlv {
+       __le32 mac_id__ring_id__arena__ep;
+       __le32 base_addr_lsb;
+       __le32 base_addr_msb;
+       __le32 ring_size;
+       __le32 elem_size;
+       __le32 num_avail_words__num_valid_words;
+       __le32 head_ptr__tail_ptr;
+       __le32 consumer_empty__producer_full;
+       __le32 prefetch_count__internal_tail_ptr;
+} __packed;
+
+struct ath12k_htt_sfm_cmn_tlv {
+       __le32 mac_id__word;
+       __le32 buf_total;
+       __le32 mem_empty;
+       __le32 deallocate_bufs;
+       __le32 num_records;
+} __packed;
+
+struct ath12k_htt_sfm_client_tlv {
+       __le32 client_id;
+       __le32 buf_min;
+       __le32 buf_max;
+       __le32 buf_busy;
+       __le32 buf_alloc;
+       __le32 buf_avail;
+       __le32 num_users;
+} __packed;
+
+struct ath12k_htt_sfm_client_user_tlv {
+       DECLARE_FLEX_ARRAY(__le32, dwords_used_by_user_n);
+} __packed;
+
 #endif