footer);
 }
 
+static u32
+print_array_to_buf_s8(u8 *buf, u32 offset, const char *header, u32 stats_index,
+                     const s8 *array, u32 array_len, const char *footer)
+{
+       u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
+       int index = 0;
+       u8 i;
+
+       if (header)
+               index += scnprintf(buf + offset, buf_len - offset, "%s = ", header);
+
+       for (i = 0; i < array_len; i++) {
+               index += scnprintf(buf + offset + index, (buf_len - offset) - index,
+                                  " %u:%d,", stats_index++, array[i]);
+       }
+
+       index--;
+       if ((offset + index) < buf_len)
+               buf[offset + index] = '\0';
+
+       if (footer) {
+               index += scnprintf(buf + offset + index, (buf_len - offset) - index,
+                                  "%s", footer);
+       }
+
+       return index;
+}
+
 static const char *ath12k_htt_ax_tx_rx_ru_size_to_str(u8 ru_size)
 {
        switch (ru_size) {
        stats_req->buf_len = len;
 }
 
+static void
+ath12k_htt_print_ul_mumimo_trig_stats(const void *tag_buf, u16 tag_len,
+                                     struct debug_htt_stats_req *stats_req)
+{
+       const struct ath12k_htt_rx_ul_mumimo_trig_stats_tlv *htt_stats_buf = tag_buf;
+       char str_buf[ATH12K_HTT_MAX_STRING_LEN] = {0};
+       u32 buf_len = ATH12K_HTT_STATS_BUF_SIZE;
+       u32 len = stats_req->buf_len;
+       u8 *buf = stats_req->buf;
+       u32 mac_id;
+       u16 index;
+       u8 i, j;
+
+       if (tag_len < sizeof(*htt_stats_buf))
+               return;
+
+       mac_id = __le32_to_cpu(htt_stats_buf->mac_id__word);
+
+       len += scnprintf(buf + len, buf_len - len,
+                        "HTT_RX_PDEV_UL_MUMIMO_TRIG_STATS_TLV:\n");
+       len += scnprintf(buf + len, buf_len - len, "mac_id = %u\n",
+                        u32_get_bits(mac_id, ATH12K_HTT_STATS_MAC_ID));
+       len += scnprintf(buf + len, buf_len - len, "rx_11ax_ul_mumimo = %u\n",
+                        le32_to_cpu(htt_stats_buf->rx_11ax_ul_mumimo));
+       index = 0;
+       memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
+       for (i = 0; i < ATH12K_HTT_RX_NUM_MCS_CNTRS; i++)
+               index += scnprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,
+                                 " %u:%u,", i,
+                                 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_mcs[i]));
+
+       for (i = 0; i < ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS; i++)
+               index += scnprintf(&str_buf[index], ATH12K_HTT_MAX_STRING_LEN - index,
+                                 " %u:%u,", i + ATH12K_HTT_RX_NUM_MCS_CNTRS,
+                                 le32_to_cpu(htt_stats_buf->ul_mumimo_rx_mcs_ext[i]));
+       str_buf[--index] = '\0';
+       len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_mcs = %s\n", str_buf);
+
+       for (j = 0; j < ATH12K_HTT_RX_NUM_GI_CNTRS; j++) {
+               index = 0;
+               memset(&str_buf[index], 0x0, ATH12K_HTT_MAX_STRING_LEN);
+               for (i = 0; i < ATH12K_HTT_RX_NUM_MCS_CNTRS; i++)
+                       index += scnprintf(&str_buf[index],
+                                         ATH12K_HTT_MAX_STRING_LEN - index,
+                                         " %u:%u,", i,
+                                         le32_to_cpu(htt_stats_buf->ul_rx_gi[j][i]));
+
+               for (i = 0; i < ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS; i++)
+                       index += scnprintf(&str_buf[index],
+                                         ATH12K_HTT_MAX_STRING_LEN - index,
+                                         " %u:%u,", i + ATH12K_HTT_RX_NUM_MCS_CNTRS,
+                                         le32_to_cpu(htt_stats_buf->ul_gi_ext[j][i]));
+               str_buf[--index] = '\0';
+               len += scnprintf(buf + len, buf_len - len,
+                                "ul_mumimo_rx_gi_%u = %s\n", j, str_buf);
+       }
+
+       index = 0;
+       memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
+       len += print_array_to_buf_index(buf, len, "ul_mumimo_rx_nss", 1,
+                                       htt_stats_buf->ul_mumimo_rx_nss,
+                                       ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n");
+
+       len += print_array_to_buf(buf, len, "ul_mumimo_rx_bw",
+                                 htt_stats_buf->ul_mumimo_rx_bw,
+                                 ATH12K_HTT_RX_NUM_BW_CNTRS, "\n");
+       for (i = 0; i < ATH12K_HTT_RX_NUM_REDUCED_CHAN_TYPES; i++) {
+               index = 0;
+               memset(str_buf, 0x0, ATH12K_HTT_MAX_STRING_LEN);
+               for (j = 0; j < ATH12K_HTT_RX_NUM_BW_CNTRS; j++)
+                       index += scnprintf(&str_buf[index],
+                                         ATH12K_HTT_MAX_STRING_LEN - index,
+                                         " %u:%u,", j,
+                                         le32_to_cpu(htt_stats_buf->red_bw[i][j]));
+               str_buf[--index] = '\0';
+               len += scnprintf(buf + len, buf_len - len, "%s = %s\n",
+                                i == 0 ? "half_ul_mumimo_rx_bw" :
+                                "quarter_ul_mumimo_rx_bw", str_buf);
+       }
+
+       len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_stbc = %u\n",
+                        le32_to_cpu(htt_stats_buf->ul_mumimo_rx_stbc));
+       len += scnprintf(buf + len, buf_len - len, "ul_mumimo_rx_ldpc = %u\n",
+                        le32_to_cpu(htt_stats_buf->ul_mumimo_rx_ldpc));
+
+       for (j = 0; j < ATH12K_HTT_RX_NUM_SPATIAL_STREAMS; j++) {
+               len += scnprintf(buf + len, buf_len - len,
+                                "rx_ul_mumimo_rssi_in_dbm: chain%u ", j);
+               len += print_array_to_buf_s8(buf, len, "", 0,
+                                            htt_stats_buf->ul_rssi[j],
+                                            ATH12K_HTT_RX_NUM_BW_CNTRS, "\n");
+       }
+
+       for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) {
+               len += scnprintf(buf + len, buf_len - len,
+                                "rx_ul_mumimo_target_rssi: user_%u ", j);
+               len += print_array_to_buf_s8(buf, len, "", 0,
+                                            htt_stats_buf->tgt_rssi[j],
+                                            ATH12K_HTT_RX_NUM_BW_CNTRS, "\n");
+       }
+
+       for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) {
+               len += scnprintf(buf + len, buf_len - len,
+                                "rx_ul_mumimo_fd_rssi: user_%u ", j);
+               len += print_array_to_buf_s8(buf, len, "", 0,
+                                            htt_stats_buf->fd[j],
+                                            ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n");
+       }
+
+       for (j = 0; j < ATH12K_HTT_TX_UL_MUMIMO_USER_STATS; j++) {
+               len += scnprintf(buf + len, buf_len - len,
+                                "rx_ulmumimo_pilot_evm_db_mean: user_%u ", j);
+               len += print_array_to_buf_s8(buf, len, "", 0,
+                                            htt_stats_buf->db[j],
+                                            ATH12K_HTT_RX_NUM_SPATIAL_STREAMS, "\n");
+       }
+
+       len += scnprintf(buf + len, buf_len - len,
+                        "ul_mumimo_basic_trigger_rx_qos_null_only = %u\n\n",
+                        le32_to_cpu(htt_stats_buf->mumimo_bsc_trig_rx_qos_null_only));
+
+       stats_req->buf_len = len;
+}
+
 static void
 ath12k_htt_print_pdev_tx_rate_txbf_stats_tlv(const void *tag_buf, u16 tag_len,
                                             struct debug_htt_stats_req *stats_req)
        case HTT_STATS_RX_PDEV_UL_OFDMA_USER_STATS_TAG:
                ath12k_htt_print_ul_ofdma_user_stats(tag_buf, len, stats_req);
                break;
+       case HTT_STATS_RX_PDEV_UL_MUMIMO_TRIG_STATS_TAG:
+               ath12k_htt_print_ul_mumimo_trig_stats(tag_buf, len, stats_req);
+               break;
        case HTT_STATS_PDEV_TX_RATE_TXBF_STATS_TAG:
                ath12k_htt_print_pdev_tx_rate_txbf_stats_tlv(tag_buf, len, stats_req);
                break;
 
 
 /* htt_dbg_ext_stats_type */
 enum ath12k_dbg_htt_ext_stats_type {
-       ATH12K_DBG_HTT_EXT_STATS_RESET                  = 0,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX                = 1,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_SCHED          = 4,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_ERROR             = 5,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_TQM               = 6,
-       ATH12K_DBG_HTT_EXT_STATS_TX_DE_INFO             = 8,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_RATE           = 9,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_RX_RATE           = 10,
-       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,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_MU             = 17,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_CCA_STATS         = 19,
-       ATH12K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO       = 22,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_OBSS_PD_STATS     = 23,
-       ATH12K_DBG_HTT_EXT_STATS_LATENCY_PROF_STATS     = 25,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_UL_TRIG_STATS     = 26,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_RX_RATE_EXT       = 30,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_RATE_TXBF      = 31,
-       ATH12K_DBG_HTT_EXT_STATS_TXBF_OFDMA             = 32,
-       ATH12K_DBG_HTT_EXT_STATS_DLPAGER_STATS          = 36,
-       ATH12K_DBG_HTT_EXT_PHY_COUNTERS_AND_PHY_STATS   = 37,
-       ATH12K_DBG_HTT_EXT_VDEVS_TXRX_STATS             = 38,
-       ATH12K_DBG_HTT_EXT_PDEV_PER_STATS               = 40,
-       ATH12K_DBG_HTT_EXT_AST_ENTRIES                  = 41,
-       ATH12K_DBG_HTT_EXT_STATS_SOC_ERROR              = 45,
-       ATH12K_DBG_HTT_DBG_PDEV_PUNCTURE_STATS          = 46,
-       ATH12K_DBG_HTT_EXT_STATS_PDEV_SCHED_ALGO        = 49,
-       ATH12K_DBG_HTT_EXT_STATS_MANDATORY_MUOFDMA      = 51,
-       ATH12K_DGB_HTT_EXT_STATS_PDEV_MBSSID_CTRL_FRAME = 54,
+       ATH12K_DBG_HTT_EXT_STATS_RESET                          = 0,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX                        = 1,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_SCHED                  = 4,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_ERROR                     = 5,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_TQM                       = 6,
+       ATH12K_DBG_HTT_EXT_STATS_TX_DE_INFO                     = 8,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_RATE                   = 9,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_RX_RATE                   = 10,
+       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,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_MU                     = 17,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_CCA_STATS                 = 19,
+       ATH12K_DBG_HTT_EXT_STATS_TX_SOUNDING_INFO               = 22,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_OBSS_PD_STATS             = 23,
+       ATH12K_DBG_HTT_EXT_STATS_LATENCY_PROF_STATS             = 25,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_UL_TRIG_STATS             = 26,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_UL_MUMIMO_TRIG_STATS      = 27,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_RX_RATE_EXT               = 30,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_TX_RATE_TXBF              = 31,
+       ATH12K_DBG_HTT_EXT_STATS_TXBF_OFDMA                     = 32,
+       ATH12K_DBG_HTT_EXT_STATS_DLPAGER_STATS                  = 36,
+       ATH12K_DBG_HTT_EXT_PHY_COUNTERS_AND_PHY_STATS           = 37,
+       ATH12K_DBG_HTT_EXT_VDEVS_TXRX_STATS                     = 38,
+       ATH12K_DBG_HTT_EXT_PDEV_PER_STATS                       = 40,
+       ATH12K_DBG_HTT_EXT_AST_ENTRIES                          = 41,
+       ATH12K_DBG_HTT_EXT_STATS_SOC_ERROR                      = 45,
+       ATH12K_DBG_HTT_DBG_PDEV_PUNCTURE_STATS                  = 46,
+       ATH12K_DBG_HTT_EXT_STATS_PDEV_SCHED_ALGO                = 49,
+       ATH12K_DBG_HTT_EXT_STATS_MANDATORY_MUOFDMA              = 51,
+       ATH12K_DGB_HTT_EXT_STATS_PDEV_MBSSID_CTRL_FRAME         = 54,
 
        /* keep this last */
        ATH12K_DBG_HTT_NUM_EXT_STATS,
        HTT_STATS_LATENCY_CNT_TAG                       = 93,
        HTT_STATS_RX_PDEV_UL_TRIG_STATS_TAG             = 94,
        HTT_STATS_RX_PDEV_UL_OFDMA_USER_STATS_TAG       = 95,
+       HTT_STATS_RX_PDEV_UL_MUMIMO_TRIG_STATS_TAG      = 97,
        HTT_STATS_SCHED_TXQ_SUPERCYCLE_TRIGGER_TAG      = 100,
        HTT_STATS_PDEV_CTRL_PATH_TX_STATS_TAG           = 102,
        HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG            = 103,
 #define ATH12K_HTT_RX_NUM_RU_SIZE_160MHZ_CNTRS 7
 #define ATH12K_HTT_RX_UL_MAX_UPLINK_RSSI_TRACK 5
 #define ATH12K_HTT_RX_NUM_REDUCED_CHAN_TYPES   2
+#define ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS      2
 
 enum ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE {
        ATH12K_HTT_TX_RX_PDEV_STATS_AX_RU_SIZE_26,
        __le32 ul_ofdma_bsc_trig_rx_qos_null_only;
 } __packed;
 
+#define ATH12K_HTT_TX_UL_MUMIMO_USER_STATS     8
+
+struct ath12k_htt_rx_ul_mumimo_trig_stats_tlv {
+       __le32 mac_id__word;
+       __le32 rx_11ax_ul_mumimo;
+       __le32 ul_mumimo_rx_mcs[ATH12K_HTT_RX_NUM_MCS_CNTRS];
+       __le32 ul_rx_gi[ATH12K_HTT_RX_NUM_GI_CNTRS][ATH12K_HTT_RX_NUM_MCS_CNTRS];
+       __le32 ul_mumimo_rx_nss[ATH12K_HTT_RX_NUM_SPATIAL_STREAMS];
+       __le32 ul_mumimo_rx_bw[ATH12K_HTT_RX_NUM_BW_CNTRS];
+       __le32 ul_mumimo_rx_stbc;
+       __le32 ul_mumimo_rx_ldpc;
+       __le32 ul_mumimo_rx_mcs_ext[ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS];
+       __le32 ul_gi_ext[ATH12K_HTT_RX_NUM_GI_CNTRS][ATH12K_HTT_RX_NUM_EXTRA_MCS_CNTRS];
+       s8 ul_rssi[ATH12K_HTT_RX_NUM_SPATIAL_STREAMS][ATH12K_HTT_RX_NUM_BW_CNTRS];
+       s8 tgt_rssi[ATH12K_HTT_TX_UL_MUMIMO_USER_STATS][ATH12K_HTT_RX_NUM_BW_CNTRS];
+       s8 fd[ATH12K_HTT_TX_UL_MUMIMO_USER_STATS][ATH12K_HTT_RX_NUM_SPATIAL_STREAMS];
+       s8 db[ATH12K_HTT_TX_UL_MUMIMO_USER_STATS][ATH12K_HTT_RX_NUM_SPATIAL_STREAMS];
+       __le32 red_bw[ATH12K_HTT_RX_NUM_REDUCED_CHAN_TYPES][ATH12K_HTT_RX_NUM_BW_CNTRS];
+       __le32 mumimo_bsc_trig_rx_qos_null_only;
+} __packed;
+
 #define ATH12K_HTT_TX_BF_RATE_STATS_NUM_MCS_COUNTERS           14
 #define ATH12K_HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS         8
 #define ATH12K_HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS           8