1 /* 2 * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 #include "qdf_types.h" 20 #include "dp_peer.h" 21 #include "dp_types.h" 22 #include "dp_internal.h" 23 #include "htt_stats.h" 24 #include "htt_ppdu_stats.h" 25 #ifdef QCA_PEER_EXT_STATS 26 #include <cdp_txrx_hist_struct.h> 27 #include "dp_hist.h" 28 #endif 29 #ifdef WIFI_MONITOR_SUPPORT 30 #include "dp_htt.h" 31 #include <dp_mon.h> 32 #endif 33 34 #define DP_MAX_STRING_LEN 500 35 #define DP_HTT_TX_RX_EXPECTED_TLVS (((uint64_t)1 << HTT_STATS_TX_PDEV_CMN_TAG) |\ 36 ((uint64_t)1 << HTT_STATS_TX_PDEV_UNDERRUN_TAG) |\ 37 ((uint64_t)1 << HTT_STATS_TX_PDEV_SIFS_TAG) |\ 38 ((uint64_t)1 << HTT_STATS_TX_PDEV_FLUSH_TAG) |\ 39 ((uint64_t)1 << HTT_STATS_RX_PDEV_FW_STATS_TAG) |\ 40 ((uint64_t)1 << HTT_STATS_RX_SOC_FW_STATS_TAG) |\ 41 ((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG) |\ 42 ((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG) |\ 43 ((uint64_t)1 << HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG) |\ 44 ((uint64_t)1 << HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG)) 45 46 #define DP_HTT_HW_INTR_NAME_LEN HTT_STATS_MAX_HW_INTR_NAME_LEN 47 #define DP_HTT_HW_MODULE_NAME_LEN HTT_STATS_MAX_HW_MODULE_NAME_LEN 48 #define DP_HTT_COUNTER_NAME_LEN HTT_MAX_COUNTER_NAME 49 #define DP_HTT_LOW_WM_HIT_COUNT_LEN HTT_STATS_LOW_WM_BINS 50 #define DP_HTT_HIGH_WM_HIT_COUNT_LEN HTT_STATS_HIGH_WM_BINS 51 #define DP_HTT_TX_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS 52 #define DP_HTT_TX_MCS_EXT_LEN HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS 53 #define DP_HTT_TX_MCS_EXT2_LEN HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS 54 #define DP_HTT_TX_SU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS 55 #define DP_HTT_TX_SU_MCS_EXT_LEN HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS 56 #define DP_HTT_TX_MU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS 57 #define DP_HTT_TX_MU_MCS_EXT_LEN HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS 58 #define DP_HTT_TX_NSS_LEN HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS 59 #define DP_HTT_TX_BW_LEN HTT_TX_PDEV_STATS_NUM_BW_COUNTERS 60 #define DP_HTT_TX_PREAM_LEN HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES 61 #define DP_HTT_TX_PDEV_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS 62 #define DP_HTT_TX_DCM_LEN HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS 63 #define DP_HTT_RX_MCS_LEN HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS 64 #define DP_HTT_RX_MCS_EXT_LEN HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS 65 #define DP_HTT_RX_PDEV_MCS_LEN_EXT HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT 66 #define DP_HTT_RX_PDEV_MCS_LEN_EXT2 HTT_RX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS 67 #define DP_HTT_RX_NSS_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS 68 #define DP_HTT_RX_DCM_LEN HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS 69 #define DP_HTT_RX_BW_LEN HTT_RX_PDEV_STATS_NUM_BW_COUNTERS 70 #define DP_HTT_RX_PREAM_LEN HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES 71 #define DP_HTT_RSSI_CHAIN_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS 72 #define DP_HTT_RX_GI_LEN HTT_RX_PDEV_STATS_NUM_GI_COUNTERS 73 #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX 74 #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX 75 #define DP_HTT_FW_RING_MPDU_ERR_LEN HTT_RX_STATS_RXDMA_MAX_ERR 76 #define DP_HTT_TID_NAME_LEN MAX_HTT_TID_NAME 77 #define DP_HTT_PEER_NUM_SS HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS 78 #define DP_HTT_PDEV_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS 79 80 #define DP_MAX_INT_CONTEXTS_STRING_LENGTH (6 * WLAN_CFG_INT_NUM_CONTEXTS) 81 #define DP_NSS_LENGTH (6 * SS_COUNT) 82 #define DP_MU_GROUP_LENGTH (6 * DP_MU_GROUP_SHOW) 83 #define DP_MU_GROUP_SHOW 16 84 #define DP_RXDMA_ERR_LENGTH (6 * HAL_RXDMA_ERR_MAX) 85 #define DP_REO_ERR_LENGTH (6 * HAL_REO_ERR_MAX) 86 #define STATS_PROC_TIMEOUT (HZ / 1000) 87 88 #define dp_stats_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_STATS, params) 89 #define dp_stats_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_STATS, params) 90 #define dp_stats_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_STATS, params) 91 #define dp_stats_info(params...) \ 92 __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_STATS, ## params) 93 #define dp_stats_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_STATS, params) 94 95 #ifdef WLAN_FEATURE_11BE 96 static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = { 97 { 98 {"HE MCS 0 (BPSK 1/2) ", MCS_VALID}, 99 {"HE MCS 1 (QPSK 1/2) ", MCS_VALID}, 100 {"HE MCS 2 (QPSK 3/4) ", MCS_VALID}, 101 {"HE MCS 3 (16-QAM 1/2) ", MCS_VALID}, 102 {"HE MCS 4 (16-QAM 3/4) ", MCS_VALID}, 103 {"HE MCS 5 (64-QAM 2/3) ", MCS_VALID}, 104 {"HE MCS 6 (64-QAM 3/4) ", MCS_VALID}, 105 {"HE MCS 7 (64-QAM 5/6) ", MCS_VALID}, 106 {"HE MCS 8 (256-QAM 3/4) ", MCS_VALID}, 107 {"HE MCS 9 (256-QAM 5/6) ", MCS_VALID}, 108 {"HE MCS 10 (1024-QAM 3/4)", MCS_VALID}, 109 {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID}, 110 {"HE MCS 12 (4096-QAM 3/4)", MCS_VALID}, 111 {"HE MCS 13 (4096-QAM 5/6)", MCS_VALID}, 112 {"INVALID ", MCS_INVALID}, 113 {"INVALID ", MCS_INVALID}, 114 {"INVALID ", MCS_INVALID}, 115 }, 116 { 117 {"EHT MCS 0 (BPSK 1/2) ", MCS_VALID}, 118 {"EHT MCS 1 (QPSK 1/2) ", MCS_VALID}, 119 {"EHT MCS 2 (QPSK 3/4) ", MCS_VALID}, 120 {"EHT MCS 3 (16-QAM 1/2) ", MCS_VALID}, 121 {"EHT MCS 4 (16-QAM 3/4) ", MCS_VALID}, 122 {"EHT MCS 5 (64-QAM 2/3) ", MCS_VALID}, 123 {"EHT MCS 6 (64-QAM 3/4) ", MCS_VALID}, 124 {"EHT MCS 7 (64-QAM 5/6) ", MCS_VALID}, 125 {"EHT MCS 8 (256-QAM 3/4) ", MCS_VALID}, 126 {"EHT MCS 9 (256-QAM 5/6) ", MCS_VALID}, 127 {"EHT MCS 10 (1024-QAM 3/4)", MCS_VALID}, 128 {"EHT MCS 11 (1024-QAM 5/6)", MCS_VALID}, 129 {"EHT MCS 12 (4096-QAM 3/4)", MCS_VALID}, 130 {"EHT MCS 13 (4096-QAM 5/6)", MCS_VALID}, 131 {"EHT MCS 14 (BPSK-DCM 1/2)", MCS_VALID}, 132 {"EHT MCS 15 (BPSK-DCM 1/2)", MCS_VALID}, 133 {"INVALID ", MCS_INVALID}, 134 } 135 }; 136 #else 137 static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = { 138 { 139 {"HE MCS 0 (BPSK 1/2) ", MCS_VALID}, 140 {"HE MCS 1 (QPSK 1/2) ", MCS_VALID}, 141 {"HE MCS 2 (QPSK 3/4) ", MCS_VALID}, 142 {"HE MCS 3 (16-QAM 1/2) ", MCS_VALID}, 143 {"HE MCS 4 (16-QAM 3/4) ", MCS_VALID}, 144 {"HE MCS 5 (64-QAM 2/3) ", MCS_VALID}, 145 {"HE MCS 6 (64-QAM 3/4) ", MCS_VALID}, 146 {"HE MCS 7 (64-QAM 5/6) ", MCS_VALID}, 147 {"HE MCS 8 (256-QAM 3/4) ", MCS_VALID}, 148 {"HE MCS 9 (256-QAM 5/6) ", MCS_VALID}, 149 {"HE MCS 10 (1024-QAM 3/4)", MCS_VALID}, 150 {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID}, 151 {"HE MCS 12 (4096-QAM 3/4)", MCS_VALID}, 152 {"HE MCS 13 (4096-QAM 5/6)", MCS_VALID}, 153 {"INVALID ", MCS_INVALID}, 154 } 155 }; 156 #endif 157 158 #ifdef WLAN_FEATURE_11BE 159 static const struct cdp_rate_debug 160 dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { 161 { 162 {"HE MU-MIMO MCS 0 (BPSK 1/2) ", MCS_VALID}, 163 {"HE MU-MIMO MCS 1 (QPSK 1/2) ", MCS_VALID}, 164 {"HE MU-MIMO MCS 2 (QPSK 3/4) ", MCS_VALID}, 165 {"HE MU-MIMO MCS 3 (16-QAM 1/2) ", MCS_VALID}, 166 {"HE MU-MIMO MCS 4 (16-QAM 3/4) ", MCS_VALID}, 167 {"HE MU-MIMO MCS 5 (64-QAM 2/3) ", MCS_VALID}, 168 {"HE MU-MIMO MCS 6 (64-QAM 3/4) ", MCS_VALID}, 169 {"HE MU-MIMO MCS 7 (64-QAM 5/6) ", MCS_VALID}, 170 {"HE MU-MIMO MCS 8 (256-QAM 3/4) ", MCS_VALID}, 171 {"HE MU-MIMO MCS 9 (256-QAM 5/6) ", MCS_VALID}, 172 {"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID}, 173 {"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID}, 174 {"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID}, 175 {"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID}, 176 {"INVALID ", MCS_INVALID}, 177 {"INVALID ", MCS_INVALID}, 178 {"INVALID ", MCS_INVALID}, 179 }, 180 { 181 {"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID}, 182 {"HE OFDMA MCS 1 (QPSK 1/2) ", MCS_VALID}, 183 {"HE OFDMA MCS 2 (QPSK 3/4) ", MCS_VALID}, 184 {"HE OFDMA MCS 3 (16-QAM 1/2) ", MCS_VALID}, 185 {"HE OFDMA MCS 4 (16-QAM 3/4) ", MCS_VALID}, 186 {"HE OFDMA MCS 5 (64-QAM 2/3) ", MCS_VALID}, 187 {"HE OFDMA MCS 6 (64-QAM 3/4) ", MCS_VALID}, 188 {"HE OFDMA MCS 7 (64-QAM 5/6) ", MCS_VALID}, 189 {"HE OFDMA MCS 8 (256-QAM 3/4) ", MCS_VALID}, 190 {"HE OFDMA MCS 9 (256-QAM 5/6) ", MCS_VALID}, 191 {"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID}, 192 {"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID}, 193 {"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID}, 194 {"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID}, 195 {"INVALID ", MCS_INVALID}, 196 {"INVALID ", MCS_INVALID}, 197 {"INVALID ", MCS_INVALID}, 198 } 199 }; 200 201 static const struct cdp_rate_debug 202 dp_mu_be_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { 203 { 204 {"EHT MU-MIMO MCS 0 (BPSK 1/2) ", MCS_VALID}, 205 {"EHT MU-MIMO MCS 1 (QPSK 1/2) ", MCS_VALID}, 206 {"EHT MU-MIMO MCS 2 (QPSK 3/4) ", MCS_VALID}, 207 {"EHT MU-MIMO MCS 3 (16-QAM 1/2) ", MCS_VALID}, 208 {"EHT MU-MIMO MCS 4 (16-QAM 3/4) ", MCS_VALID}, 209 {"EHT MU-MIMO MCS 5 (64-QAM 2/3) ", MCS_VALID}, 210 {"EHT MU-MIMO MCS 6 (64-QAM 3/4) ", MCS_VALID}, 211 {"EHT MU-MIMO MCS 7 (64-QAM 5/6) ", MCS_VALID}, 212 {"EHT MU-MIMO MCS 8 (256-QAM 3/4) ", MCS_VALID}, 213 {"EHT MU-MIMO MCS 9 (256-QAM 5/6) ", MCS_VALID}, 214 {"EHT MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID}, 215 {"EHT MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID}, 216 {"EHT MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID}, 217 {"EHT MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID}, 218 {"EHT MU-MIMO MCS 14 (BPSK-DCM 1/2)", MCS_VALID}, 219 {"EHT MU-MIMO MCS 15 (BPSK-DCM 1/2)", MCS_VALID}, 220 {"INVALID ", MCS_INVALID}, 221 }, 222 { 223 {"EHT OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID}, 224 {"EHT OFDMA MCS 1 (QPSK 1/2) ", MCS_VALID}, 225 {"EHT OFDMA MCS 2 (QPSK 3/4) ", MCS_VALID}, 226 {"EHT OFDMA MCS 3 (16-QAM 1/2) ", MCS_VALID}, 227 {"EHT OFDMA MCS 4 (16-QAM 3/4) ", MCS_VALID}, 228 {"EHT OFDMA MCS 5 (64-QAM 2/3) ", MCS_VALID}, 229 {"EHT OFDMA MCS 6 (64-QAM 3/4) ", MCS_VALID}, 230 {"EHT OFDMA MCS 7 (64-QAM 5/6) ", MCS_VALID}, 231 {"EHT OFDMA MCS 8 (256-QAM 3/4) ", MCS_VALID}, 232 {"EHT OFDMA MCS 9 (256-QAM 5/6) ", MCS_VALID}, 233 {"EHT OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID}, 234 {"EHT OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID}, 235 {"EHT OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID}, 236 {"EHT OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID}, 237 {"EHT OFDMA MCS 14 (BPSK-DCM 1/2)", MCS_VALID}, 238 {"EHT OFDMA MCS 15 (BPSK-DCM 1/2)", MCS_VALID}, 239 {"INVALID ", MCS_INVALID}, 240 } 241 }; 242 #else 243 static const struct cdp_rate_debug 244 dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = { 245 { 246 {"HE MU-MIMO MCS 0 (BPSK 1/2) ", MCS_VALID}, 247 {"HE MU-MIMO MCS 1 (QPSK 1/2) ", MCS_VALID}, 248 {"HE MU-MIMO MCS 2 (QPSK 3/4) ", MCS_VALID}, 249 {"HE MU-MIMO MCS 3 (16-QAM 1/2) ", MCS_VALID}, 250 {"HE MU-MIMO MCS 4 (16-QAM 3/4) ", MCS_VALID}, 251 {"HE MU-MIMO MCS 5 (64-QAM 2/3) ", MCS_VALID}, 252 {"HE MU-MIMO MCS 6 (64-QAM 3/4) ", MCS_VALID}, 253 {"HE MU-MIMO MCS 7 (64-QAM 5/6) ", MCS_VALID}, 254 {"HE MU-MIMO MCS 8 (256-QAM 3/4) ", MCS_VALID}, 255 {"HE MU-MIMO MCS 9 (256-QAM 5/6) ", MCS_VALID}, 256 {"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID}, 257 {"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID}, 258 {"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID}, 259 {"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID}, 260 {"INVALID ", MCS_INVALID}, 261 }, 262 { 263 {"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID}, 264 {"HE OFDMA MCS 1 (QPSK 1/2) ", MCS_VALID}, 265 {"HE OFDMA MCS 2 (QPSK 3/4) ", MCS_VALID}, 266 {"HE OFDMA MCS 3 (16-QAM 1/2) ", MCS_VALID}, 267 {"HE OFDMA MCS 4 (16-QAM 3/4) ", MCS_VALID}, 268 {"HE OFDMA MCS 5 (64-QAM 2/3) ", MCS_VALID}, 269 {"HE OFDMA MCS 6 (64-QAM 3/4) ", MCS_VALID}, 270 {"HE OFDMA MCS 7 (64-QAM 5/6) ", MCS_VALID}, 271 {"HE OFDMA MCS 8 (256-QAM 3/4) ", MCS_VALID}, 272 {"HE OFDMA MCS 9 (256-QAM 5/6) ", MCS_VALID}, 273 {"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID}, 274 {"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID}, 275 {"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID}, 276 {"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID}, 277 {"INVALID ", MCS_INVALID}, 278 } 279 }; 280 #endif 281 282 const char *mu_reception_mode[TXRX_TYPE_MU_MAX] = { 283 "MU MIMO", "MU OFDMA" 284 }; 285 286 #ifdef QCA_ENH_V3_STATS_SUPPORT 287 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 288 "0 to 9 ms", "10 to 19 ms", 289 "20 to 29 ms", "30 to 39 ms", 290 "40 to 49 ms", "50 to 59 ms", 291 "60 to 69 ms", "70 to 79 ms", 292 "80 to 89 ms", "90 to 99 ms", 293 "101 to 249 ms", "250 to 499 ms", "500+ ms" 294 }; 295 #elif defined(HW_TX_DELAY_STATS_ENABLE) 296 const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 297 "0 to 2 ms", "2 to 4 ms", 298 "4 to 6 ms", "6 to 8 ms", 299 "8 to 10 ms", "10 to 20 ms", 300 "20 to 30 ms", "30 to 40 ms", 301 "40 to 50 ms", "50 to 100 ms", 302 "100 to 250 ms", "250 to 500 ms", "500+ ms" 303 }; 304 #endif 305 306 #ifdef QCA_ENH_V3_STATS_SUPPORT 307 const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 308 "0 to 1 ms", "1 to 2 ms", 309 "2 to 3 ms", "3 to 4 ms", 310 "4 to 5 ms", "5 to 6 ms", 311 "6 to 7 ms", "7 to 8 ms", 312 "8 to 9 ms", "9 to 10 ms", 313 "10 to 11 ms", "11 to 12 ms", "12+ ms" 314 }; 315 316 const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { 317 "0 to 4 ms", "5 to 9 ms", 318 "10 to 14 ms", "15 to 19 ms", 319 "20 to 24 ms", "25 to 29 ms", 320 "30 to 34 ms", "35 to 39 ms", 321 "40 to 44 ms", "45 to 49 ms", 322 "50 to 54 ms", "55 to 59 ms", "60+ ms" 323 }; 324 #endif 325 326 #define TID_COUNTER_STATS 1 /* Success/drop stats type */ 327 #define TID_DELAY_STATS 2 /* Delay stats type */ 328 #define TID_RX_ERROR_STATS 3 /* Rx Error stats type */ 329 330 #ifdef WLAN_SYSFS_DP_STATS 331 void DP_PRINT_STATS(const char *fmt, ...) 332 { 333 void *soc_void = NULL; 334 va_list val; 335 uint16_t buf_written = 0; 336 uint16_t curr_len = 0; 337 uint16_t max_len = 0; 338 struct dp_soc *soc = NULL; 339 340 soc_void = cds_get_context(QDF_MODULE_ID_SOC); 341 if (!soc_void) 342 return; 343 344 soc = cdp_soc_t_to_dp_soc(soc_void); 345 346 va_start(val, fmt); 347 QDF_VTRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, (char *)fmt, val); 348 /* writing to the buffer */ 349 if (soc->sysfs_config && soc->sysfs_config->printing_mode == PRINTING_MODE_ENABLED) { 350 if (soc->sysfs_config->process_id == qdf_get_current_pid()) { 351 curr_len = soc->sysfs_config->curr_buffer_length; 352 max_len = soc->sysfs_config->max_buffer_length; 353 if ((max_len - curr_len) <= 1) 354 return; 355 356 qdf_spinlock_acquire(&soc->sysfs_config->sysfs_write_user_buffer); 357 if (soc->sysfs_config->buf) { 358 buf_written = vscnprintf(soc->sysfs_config->buf + curr_len, 359 max_len - curr_len, fmt, val); 360 curr_len += buf_written; 361 if ((max_len - curr_len) <= 1) 362 return; 363 364 buf_written += scnprintf(soc->sysfs_config->buf + curr_len, 365 max_len - curr_len, "\n"); 366 soc->sysfs_config->curr_buffer_length += buf_written; 367 } 368 qdf_spinlock_release(&soc->sysfs_config->sysfs_write_user_buffer); 369 } 370 } 371 va_end(val); 372 } 373 #endif /* WLAN_SYSFS_DP_STATS */ 374 /* 375 * dp_print_stats_string_tlv: display htt_stats_string_tlv 376 * @tag_buf: buffer containing the tlv htt_stats_string_tlv 377 * 378 * return:void 379 */ 380 static void dp_print_stats_string_tlv(uint32_t *tag_buf) 381 { 382 htt_stats_string_tlv *dp_stats_buf = 383 (htt_stats_string_tlv *)tag_buf; 384 uint8_t i; 385 uint16_t index = 0; 386 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 387 char *data = qdf_mem_malloc(DP_MAX_STRING_LEN); 388 389 if (!data) { 390 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 391 FL("Output buffer not allocated")); 392 return; 393 } 394 395 DP_PRINT_STATS("HTT_STATS_STRING_TLV:"); 396 for (i = 0; i < tag_len; i++) { 397 index += qdf_snprint(&data[index], 398 DP_MAX_STRING_LEN - index, 399 " %u:%u,", i, dp_stats_buf->data[i]); 400 } 401 DP_PRINT_STATS("data = %s\n", data); 402 qdf_mem_free(data); 403 } 404 405 /* 406 * dp_print_tx_pdev_stats_cmn_tlv: display htt_tx_pdev_stats_cmn_tlv 407 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_cmn_tlv 408 * 409 * return:void 410 */ 411 static void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf) 412 { 413 htt_tx_pdev_stats_cmn_tlv *dp_stats_buf = 414 (htt_tx_pdev_stats_cmn_tlv *)tag_buf; 415 416 DP_PRINT_STATS("HTT_TX_PDEV_STATS_CMN_TLV:"); 417 DP_PRINT_STATS("mac_id__word = %u", 418 dp_stats_buf->mac_id__word); 419 DP_PRINT_STATS("hw_queued = %u", 420 dp_stats_buf->hw_queued); 421 DP_PRINT_STATS("hw_reaped = %u", 422 dp_stats_buf->hw_reaped); 423 DP_PRINT_STATS("underrun = %u", 424 dp_stats_buf->underrun); 425 DP_PRINT_STATS("hw_paused = %u", 426 dp_stats_buf->hw_paused); 427 DP_PRINT_STATS("hw_flush = %u", 428 dp_stats_buf->hw_flush); 429 DP_PRINT_STATS("hw_filt = %u", 430 dp_stats_buf->hw_filt); 431 DP_PRINT_STATS("tx_abort = %u", 432 dp_stats_buf->tx_abort); 433 DP_PRINT_STATS("mpdu_requeued = %u", 434 dp_stats_buf->mpdu_requed); 435 DP_PRINT_STATS("tx_xretry = %u", 436 dp_stats_buf->tx_xretry); 437 DP_PRINT_STATS("data_rc = %u", 438 dp_stats_buf->data_rc); 439 DP_PRINT_STATS("mpdu_dropped_xretry = %u", 440 dp_stats_buf->mpdu_dropped_xretry); 441 DP_PRINT_STATS("illegal_rate_phy_err = %u", 442 dp_stats_buf->illgl_rate_phy_err); 443 DP_PRINT_STATS("cont_xretry = %u", 444 dp_stats_buf->cont_xretry); 445 DP_PRINT_STATS("tx_timeout = %u", 446 dp_stats_buf->tx_timeout); 447 DP_PRINT_STATS("pdev_resets = %u", 448 dp_stats_buf->pdev_resets); 449 DP_PRINT_STATS("phy_underrun = %u", 450 dp_stats_buf->phy_underrun); 451 DP_PRINT_STATS("txop_ovf = %u", 452 dp_stats_buf->txop_ovf); 453 DP_PRINT_STATS("seq_posted = %u", 454 dp_stats_buf->seq_posted); 455 DP_PRINT_STATS("seq_failed_queueing = %u", 456 dp_stats_buf->seq_failed_queueing); 457 DP_PRINT_STATS("seq_completed = %u", 458 dp_stats_buf->seq_completed); 459 DP_PRINT_STATS("seq_restarted = %u", 460 dp_stats_buf->seq_restarted); 461 DP_PRINT_STATS("mu_seq_posted = %u", 462 dp_stats_buf->mu_seq_posted); 463 DP_PRINT_STATS("seq_switch_hw_paused = %u", 464 dp_stats_buf->seq_switch_hw_paused); 465 DP_PRINT_STATS("next_seq_posted_dsr = %u", 466 dp_stats_buf->next_seq_posted_dsr); 467 DP_PRINT_STATS("seq_posted_isr = %u", 468 dp_stats_buf->seq_posted_isr); 469 DP_PRINT_STATS("seq_ctrl_cached = %u", 470 dp_stats_buf->seq_ctrl_cached); 471 DP_PRINT_STATS("mpdu_count_tqm = %u", 472 dp_stats_buf->mpdu_count_tqm); 473 DP_PRINT_STATS("msdu_count_tqm = %u", 474 dp_stats_buf->msdu_count_tqm); 475 DP_PRINT_STATS("mpdu_removed_tqm = %u", 476 dp_stats_buf->mpdu_removed_tqm); 477 DP_PRINT_STATS("msdu_removed_tqm = %u", 478 dp_stats_buf->msdu_removed_tqm); 479 DP_PRINT_STATS("mpdus_sw_flush = %u", 480 dp_stats_buf->mpdus_sw_flush); 481 DP_PRINT_STATS("mpdus_hw_filter = %u", 482 dp_stats_buf->mpdus_hw_filter); 483 DP_PRINT_STATS("mpdus_truncated = %u", 484 dp_stats_buf->mpdus_truncated); 485 DP_PRINT_STATS("mpdus_ack_failed = %u", 486 dp_stats_buf->mpdus_ack_failed); 487 DP_PRINT_STATS("mpdus_expired = %u", 488 dp_stats_buf->mpdus_expired); 489 DP_PRINT_STATS("mpdus_seq_hw_retry = %u", 490 dp_stats_buf->mpdus_seq_hw_retry); 491 DP_PRINT_STATS("ack_tlv_proc = %u", 492 dp_stats_buf->ack_tlv_proc); 493 DP_PRINT_STATS("coex_abort_mpdu_cnt_valid = %u", 494 dp_stats_buf->coex_abort_mpdu_cnt_valid); 495 DP_PRINT_STATS("coex_abort_mpdu_cnt = %u\n", 496 dp_stats_buf->coex_abort_mpdu_cnt); 497 } 498 499 /* 500 * dp_print_tx_pdev_stats_urrn_tlv_v: display htt_tx_pdev_stats_urrn_tlv_v 501 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_urrn_tlv_v 502 * 503 * return:void 504 */ 505 static void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf) 506 { 507 htt_tx_pdev_stats_urrn_tlv_v *dp_stats_buf = 508 (htt_tx_pdev_stats_urrn_tlv_v *)tag_buf; 509 uint8_t i; 510 uint16_t index = 0; 511 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 512 char *urrn_stats = qdf_mem_malloc(DP_MAX_STRING_LEN); 513 514 if (!urrn_stats) { 515 dp_stats_err("Output buffer not allocated"); 516 return; 517 } 518 519 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS); 520 DP_PRINT_STATS("HTT_TX_PDEV_STATS_URRN_TLV_V:"); 521 for (i = 0; i < tag_len; i++) { 522 index += qdf_snprint(&urrn_stats[index], 523 DP_MAX_STRING_LEN - index, 524 " %u:%u,", i, dp_stats_buf->urrn_stats[i]); 525 } 526 DP_PRINT_STATS("urrn_stats = %s\n", urrn_stats); 527 qdf_mem_free(urrn_stats); 528 } 529 530 /* 531 * dp_print_tx_pdev_stats_flush_tlv_v: display htt_tx_pdev_stats_flush_tlv_v 532 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_flush_tlv_v 533 * 534 * return:void 535 */ 536 static void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf) 537 { 538 htt_tx_pdev_stats_flush_tlv_v *dp_stats_buf = 539 (htt_tx_pdev_stats_flush_tlv_v *)tag_buf; 540 uint8_t i; 541 uint16_t index = 0; 542 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 543 char *flush_errs = qdf_mem_malloc(DP_MAX_STRING_LEN); 544 545 if (!flush_errs) { 546 dp_stats_err("Output buffer not allocated"); 547 return; 548 } 549 550 tag_len = qdf_min(tag_len, 551 (uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS); 552 553 DP_PRINT_STATS("HTT_TX_PDEV_STATS_FLUSH_TLV_V:"); 554 for (i = 0; i < tag_len; i++) { 555 index += qdf_snprint(&flush_errs[index], 556 DP_MAX_STRING_LEN - index, 557 " %u:%u,", i, dp_stats_buf->flush_errs[i]); 558 } 559 DP_PRINT_STATS("flush_errs = %s\n", flush_errs); 560 qdf_mem_free(flush_errs); 561 } 562 563 /* 564 * dp_print_tx_pdev_stats_sifs_tlv_v: display htt_tx_pdev_stats_sifs_tlv_v 565 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sifs_tlv_v 566 * 567 * return:void 568 */ 569 static void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf) 570 { 571 htt_tx_pdev_stats_sifs_tlv_v *dp_stats_buf = 572 (htt_tx_pdev_stats_sifs_tlv_v *)tag_buf; 573 uint8_t i; 574 uint16_t index = 0; 575 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 576 char *sifs_status = qdf_mem_malloc(DP_MAX_STRING_LEN); 577 578 if (!sifs_status) { 579 dp_stats_err("Output buffer not allocated"); 580 return; 581 } 582 583 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS); 584 585 DP_PRINT_STATS("HTT_TX_PDEV_STATS_SIFS_TLV_V:"); 586 for (i = 0; i < tag_len; i++) { 587 index += qdf_snprint(&sifs_status[index], 588 DP_MAX_STRING_LEN - index, 589 " %u:%u,", i, dp_stats_buf->sifs_status[i]); 590 } 591 DP_PRINT_STATS("sifs_status = %s\n", sifs_status); 592 qdf_mem_free(sifs_status); 593 } 594 595 /* 596 * dp_print_tx_pdev_stats_phy_err_tlv_v: display htt_tx_pdev_stats_phy_err_tlv_v 597 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_phy_err_tlv_v 598 * 599 * return:void 600 */ 601 static void dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t *tag_buf) 602 { 603 htt_tx_pdev_stats_phy_err_tlv_v *dp_stats_buf = 604 (htt_tx_pdev_stats_phy_err_tlv_v *)tag_buf; 605 uint8_t i; 606 uint16_t index = 0; 607 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 608 char *phy_errs = qdf_mem_malloc(DP_MAX_STRING_LEN); 609 610 if (!phy_errs) { 611 dp_stats_err("Output buffer not allocated"); 612 return; 613 } 614 615 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_PHY_ERR_STATS); 616 617 DP_PRINT_STATS("HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:"); 618 for (i = 0; i < tag_len; i++) { 619 index += qdf_snprint(&phy_errs[index], 620 DP_MAX_STRING_LEN - index, 621 " %u:%u,", i, dp_stats_buf->phy_errs[i]); 622 } 623 DP_PRINT_STATS("phy_errs = %s\n", phy_errs); 624 qdf_mem_free(phy_errs); 625 } 626 627 /* 628 * dp_print_hw_stats_intr_misc_tlv: display htt_hw_stats_intr_misc_tlv 629 * @tag_buf: buffer containing the tlv htt_hw_stats_intr_misc_tlv 630 * 631 * return:void 632 */ 633 static void dp_print_hw_stats_intr_misc_tlv(uint32_t *tag_buf) 634 { 635 htt_hw_stats_intr_misc_tlv *dp_stats_buf = 636 (htt_hw_stats_intr_misc_tlv *)tag_buf; 637 uint8_t i; 638 uint16_t index = 0; 639 char *hw_intr_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 640 641 if (!hw_intr_name) { 642 dp_stats_err("Output buffer not allocated"); 643 return; 644 } 645 646 DP_PRINT_STATS("HTT_HW_STATS_INTR_MISC_TLV:"); 647 for (i = 0; i < DP_HTT_HW_INTR_NAME_LEN; i++) { 648 index += qdf_snprint(&hw_intr_name[index], 649 DP_MAX_STRING_LEN - index, 650 " %u:%u,", i, dp_stats_buf->hw_intr_name[i]); 651 } 652 DP_PRINT_STATS("hw_intr_name = %s ", hw_intr_name); 653 DP_PRINT_STATS("mask = %u", 654 dp_stats_buf->mask); 655 DP_PRINT_STATS("count = %u\n", 656 dp_stats_buf->count); 657 qdf_mem_free(hw_intr_name); 658 } 659 660 /* 661 * dp_print_hw_stats_wd_timeout_tlv: display htt_hw_stats_wd_timeout_tlv 662 * @tag_buf: buffer containing the tlv htt_hw_stats_wd_timeout_tlv 663 * 664 * return:void 665 */ 666 static void dp_print_hw_stats_wd_timeout_tlv(uint32_t *tag_buf) 667 { 668 htt_hw_stats_wd_timeout_tlv *dp_stats_buf = 669 (htt_hw_stats_wd_timeout_tlv *)tag_buf; 670 uint8_t i; 671 uint16_t index = 0; 672 char *hw_module_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 673 674 if (!hw_module_name) { 675 dp_stats_err("Output buffer not allocated"); 676 return; 677 } 678 679 DP_PRINT_STATS("HTT_HW_STATS_WD_TIMEOUT_TLV:"); 680 for (i = 0; i < DP_HTT_HW_MODULE_NAME_LEN; i++) { 681 index += qdf_snprint(&hw_module_name[index], 682 DP_MAX_STRING_LEN - index, 683 " %u:%u,", i, dp_stats_buf->hw_module_name[i]); 684 } 685 DP_PRINT_STATS("hw_module_name = %s ", hw_module_name); 686 DP_PRINT_STATS("count = %u", 687 dp_stats_buf->count); 688 qdf_mem_free(hw_module_name); 689 } 690 691 /* 692 * dp_print_hw_stats_pdev_errs_tlv: display htt_hw_stats_pdev_errs_tlv 693 * @tag_buf: buffer containing the tlv htt_hw_stats_pdev_errs_tlv 694 * 695 * return:void 696 */ 697 static void dp_print_hw_stats_pdev_errs_tlv(uint32_t *tag_buf) 698 { 699 htt_hw_stats_pdev_errs_tlv *dp_stats_buf = 700 (htt_hw_stats_pdev_errs_tlv *)tag_buf; 701 702 DP_PRINT_STATS("HTT_HW_STATS_PDEV_ERRS_TLV:"); 703 DP_PRINT_STATS("mac_id__word = %u", 704 dp_stats_buf->mac_id__word); 705 DP_PRINT_STATS("tx_abort = %u", 706 dp_stats_buf->tx_abort); 707 DP_PRINT_STATS("tx_abort_fail_count = %u", 708 dp_stats_buf->tx_abort_fail_count); 709 DP_PRINT_STATS("rx_abort = %u", 710 dp_stats_buf->rx_abort); 711 DP_PRINT_STATS("rx_abort_fail_count = %u", 712 dp_stats_buf->rx_abort_fail_count); 713 DP_PRINT_STATS("warm_reset = %u", 714 dp_stats_buf->warm_reset); 715 DP_PRINT_STATS("cold_reset = %u", 716 dp_stats_buf->cold_reset); 717 DP_PRINT_STATS("tx_flush = %u", 718 dp_stats_buf->tx_flush); 719 DP_PRINT_STATS("tx_glb_reset = %u", 720 dp_stats_buf->tx_glb_reset); 721 DP_PRINT_STATS("tx_txq_reset = %u", 722 dp_stats_buf->tx_txq_reset); 723 DP_PRINT_STATS("rx_timeout_reset = %u\n", 724 dp_stats_buf->rx_timeout_reset); 725 } 726 727 /* 728 * dp_print_msdu_flow_stats_tlv: display htt_msdu_flow_stats_tlv 729 * @tag_buf: buffer containing the tlv htt_msdu_flow_stats_tlv 730 * 731 * return:void 732 */ 733 static void dp_print_msdu_flow_stats_tlv(uint32_t *tag_buf) 734 { 735 htt_msdu_flow_stats_tlv *dp_stats_buf = 736 (htt_msdu_flow_stats_tlv *)tag_buf; 737 738 DP_PRINT_STATS("HTT_MSDU_FLOW_STATS_TLV:"); 739 DP_PRINT_STATS("last_update_timestamp = %u", 740 dp_stats_buf->last_update_timestamp); 741 DP_PRINT_STATS("last_add_timestamp = %u", 742 dp_stats_buf->last_add_timestamp); 743 DP_PRINT_STATS("last_remove_timestamp = %u", 744 dp_stats_buf->last_remove_timestamp); 745 DP_PRINT_STATS("total_processed_msdu_count = %u", 746 dp_stats_buf->total_processed_msdu_count); 747 DP_PRINT_STATS("cur_msdu_count_in_flowq = %u", 748 dp_stats_buf->cur_msdu_count_in_flowq); 749 DP_PRINT_STATS("sw_peer_id = %u", 750 dp_stats_buf->sw_peer_id); 751 DP_PRINT_STATS("tx_flow_no__tid_num__drop_rule = %u\n", 752 dp_stats_buf->tx_flow_no__tid_num__drop_rule); 753 } 754 755 /* 756 * dp_print_tx_tid_stats_tlv: display htt_tx_tid_stats_tlv 757 * @tag_buf: buffer containing the tlv htt_tx_tid_stats_tlv 758 * 759 * return:void 760 */ 761 static void dp_print_tx_tid_stats_tlv(uint32_t *tag_buf) 762 { 763 htt_tx_tid_stats_tlv *dp_stats_buf = 764 (htt_tx_tid_stats_tlv *)tag_buf; 765 uint8_t i; 766 uint16_t index = 0; 767 char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 768 769 if (!tid_name) { 770 dp_stats_err("Output buffer not allocated"); 771 return; 772 } 773 774 DP_PRINT_STATS("HTT_TX_TID_STATS_TLV:"); 775 for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) { 776 index += qdf_snprint(&tid_name[index], 777 DP_MAX_STRING_LEN - index, 778 " %u:%u,", i, dp_stats_buf->tid_name[i]); 779 } 780 DP_PRINT_STATS("tid_name = %s ", tid_name); 781 DP_PRINT_STATS("sw_peer_id__tid_num = %u", 782 dp_stats_buf->sw_peer_id__tid_num); 783 DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u", 784 dp_stats_buf->num_sched_pending__num_ppdu_in_hwq); 785 DP_PRINT_STATS("tid_flags = %u", 786 dp_stats_buf->tid_flags); 787 DP_PRINT_STATS("hw_queued = %u", 788 dp_stats_buf->hw_queued); 789 DP_PRINT_STATS("hw_reaped = %u", 790 dp_stats_buf->hw_reaped); 791 DP_PRINT_STATS("mpdus_hw_filter = %u", 792 dp_stats_buf->mpdus_hw_filter); 793 DP_PRINT_STATS("qdepth_bytes = %u", 794 dp_stats_buf->qdepth_bytes); 795 DP_PRINT_STATS("qdepth_num_msdu = %u", 796 dp_stats_buf->qdepth_num_msdu); 797 DP_PRINT_STATS("qdepth_num_mpdu = %u", 798 dp_stats_buf->qdepth_num_mpdu); 799 DP_PRINT_STATS("last_scheduled_tsmp = %u", 800 dp_stats_buf->last_scheduled_tsmp); 801 DP_PRINT_STATS("pause_module_id = %u", 802 dp_stats_buf->pause_module_id); 803 DP_PRINT_STATS("block_module_id = %u\n", 804 dp_stats_buf->block_module_id); 805 DP_PRINT_STATS("tid_tx_airtime = %u\n", 806 dp_stats_buf->tid_tx_airtime); 807 qdf_mem_free(tid_name); 808 } 809 810 /* 811 * dp_print_tx_tid_stats_v1_tlv: display htt_tx_tid_stats_v1_tlv 812 * @tag_buf: buffer containing the tlv htt_tx_tid_stats_v1_tlv 813 * 814 * return:void 815 */ 816 static void dp_print_tx_tid_stats_v1_tlv(uint32_t *tag_buf) 817 { 818 htt_tx_tid_stats_v1_tlv *dp_stats_buf = 819 (htt_tx_tid_stats_v1_tlv *)tag_buf; 820 uint8_t i; 821 uint16_t index = 0; 822 char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 823 824 if (!tid_name) { 825 dp_stats_err("Output buffer not allocated"); 826 return; 827 } 828 829 DP_PRINT_STATS("HTT_TX_TID_STATS_V1_TLV:"); 830 for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) { 831 index += qdf_snprint(&tid_name[index], 832 DP_MAX_STRING_LEN - index, 833 " %u:%u,", i, dp_stats_buf->tid_name[i]); 834 } 835 DP_PRINT_STATS("tid_name = %s ", tid_name); 836 DP_PRINT_STATS("sw_peer_id__tid_num = %u", 837 dp_stats_buf->sw_peer_id__tid_num); 838 DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u", 839 dp_stats_buf->num_sched_pending__num_ppdu_in_hwq); 840 DP_PRINT_STATS("tid_flags = %u", 841 dp_stats_buf->tid_flags); 842 DP_PRINT_STATS("max_qdepth_bytes = %u", 843 dp_stats_buf->max_qdepth_bytes); 844 DP_PRINT_STATS("max_qdepth_n_msdus = %u", 845 dp_stats_buf->max_qdepth_n_msdus); 846 DP_PRINT_STATS("rsvd = %u", 847 dp_stats_buf->rsvd); 848 DP_PRINT_STATS("qdepth_bytes = %u", 849 dp_stats_buf->qdepth_bytes); 850 DP_PRINT_STATS("qdepth_num_msdu = %u", 851 dp_stats_buf->qdepth_num_msdu); 852 DP_PRINT_STATS("qdepth_num_mpdu = %u", 853 dp_stats_buf->qdepth_num_mpdu); 854 DP_PRINT_STATS("last_scheduled_tsmp = %u", 855 dp_stats_buf->last_scheduled_tsmp); 856 DP_PRINT_STATS("pause_module_id = %u", 857 dp_stats_buf->pause_module_id); 858 DP_PRINT_STATS("block_module_id = %u\n", 859 dp_stats_buf->block_module_id); 860 DP_PRINT_STATS("tid_tx_airtime = %u\n", 861 dp_stats_buf->tid_tx_airtime); 862 qdf_mem_free(tid_name); 863 } 864 865 /* 866 * dp_print_rx_tid_stats_tlv: display htt_rx_tid_stats_tlv 867 * @tag_buf: buffer containing the tlv htt_rx_tid_stats_tlv 868 * 869 * return:void 870 */ 871 static void dp_print_rx_tid_stats_tlv(uint32_t *tag_buf) 872 { 873 htt_rx_tid_stats_tlv *dp_stats_buf = 874 (htt_rx_tid_stats_tlv *)tag_buf; 875 uint8_t i; 876 uint16_t index = 0; 877 char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 878 879 if (!tid_name) { 880 dp_stats_err("Output buffer not allocated"); 881 return; 882 } 883 884 DP_PRINT_STATS("HTT_RX_TID_STATS_TLV:"); 885 DP_PRINT_STATS("sw_peer_id__tid_num = %u", 886 dp_stats_buf->sw_peer_id__tid_num); 887 for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) { 888 index += qdf_snprint(&tid_name[index], 889 DP_MAX_STRING_LEN - index, 890 " %u:%u,", i, dp_stats_buf->tid_name[i]); 891 } 892 DP_PRINT_STATS("tid_name = %s ", tid_name); 893 DP_PRINT_STATS("dup_in_reorder = %u", 894 dp_stats_buf->dup_in_reorder); 895 DP_PRINT_STATS("dup_past_outside_window = %u", 896 dp_stats_buf->dup_past_outside_window); 897 DP_PRINT_STATS("dup_past_within_window = %u", 898 dp_stats_buf->dup_past_within_window); 899 DP_PRINT_STATS("rxdesc_err_decrypt = %u\n", 900 dp_stats_buf->rxdesc_err_decrypt); 901 qdf_mem_free(tid_name); 902 } 903 904 /* 905 * dp_print_counter_tlv: display htt_counter_tlv 906 * @tag_buf: buffer containing the tlv htt_counter_tlv 907 * 908 * return:void 909 */ 910 static void dp_print_counter_tlv(uint32_t *tag_buf) 911 { 912 htt_counter_tlv *dp_stats_buf = 913 (htt_counter_tlv *)tag_buf; 914 uint8_t i; 915 uint16_t index = 0; 916 char *counter_name = qdf_mem_malloc(DP_MAX_STRING_LEN); 917 918 if (!counter_name) { 919 dp_stats_err("Output buffer not allocated"); 920 return; 921 } 922 923 DP_PRINT_STATS("HTT_COUNTER_TLV:"); 924 for (i = 0; i < DP_HTT_COUNTER_NAME_LEN; i++) { 925 index += qdf_snprint(&counter_name[index], 926 DP_MAX_STRING_LEN - index, 927 " %u:%u,", i, dp_stats_buf->counter_name[i]); 928 } 929 DP_PRINT_STATS("counter_name = %s ", counter_name); 930 DP_PRINT_STATS("count = %u\n", 931 dp_stats_buf->count); 932 qdf_mem_free(counter_name); 933 } 934 935 /* 936 * dp_print_peer_stats_cmn_tlv: display htt_peer_stats_cmn_tlv 937 * @tag_buf: buffer containing the tlv htt_peer_stats_cmn_tlv 938 * 939 * return:void 940 */ 941 static void dp_print_peer_stats_cmn_tlv(uint32_t *tag_buf) 942 { 943 htt_peer_stats_cmn_tlv *dp_stats_buf = 944 (htt_peer_stats_cmn_tlv *)tag_buf; 945 946 DP_PRINT_STATS("HTT_PEER_STATS_CMN_TLV:"); 947 DP_PRINT_STATS("ppdu_cnt = %u", 948 dp_stats_buf->ppdu_cnt); 949 DP_PRINT_STATS("mpdu_cnt = %u", 950 dp_stats_buf->mpdu_cnt); 951 DP_PRINT_STATS("msdu_cnt = %u", 952 dp_stats_buf->msdu_cnt); 953 DP_PRINT_STATS("pause_bitmap = %u", 954 dp_stats_buf->pause_bitmap); 955 DP_PRINT_STATS("block_bitmap = %u", 956 dp_stats_buf->block_bitmap); 957 DP_PRINT_STATS("current_timestamp = %u\n", 958 dp_stats_buf->current_timestamp); 959 DP_PRINT_STATS("inactive_time = %u", 960 dp_stats_buf->inactive_time); 961 } 962 963 /* 964 * dp_print_peer_details_tlv: display htt_peer_details_tlv 965 * @tag_buf: buffer containing the tlv htt_peer_details_tlv 966 * 967 * return:void 968 */ 969 static void dp_print_peer_details_tlv(uint32_t *tag_buf) 970 { 971 htt_peer_details_tlv *dp_stats_buf = 972 (htt_peer_details_tlv *)tag_buf; 973 974 DP_PRINT_STATS("HTT_PEER_DETAILS_TLV:"); 975 DP_PRINT_STATS("peer_type = %u", 976 dp_stats_buf->peer_type); 977 DP_PRINT_STATS("sw_peer_id = %u", 978 dp_stats_buf->sw_peer_id); 979 DP_PRINT_STATS("vdev_pdev_ast_idx = %u", 980 dp_stats_buf->vdev_pdev_ast_idx); 981 DP_PRINT_STATS("mac_addr(upper 4 bytes) = %u", 982 dp_stats_buf->mac_addr.mac_addr31to0); 983 DP_PRINT_STATS("mac_addr(lower 2 bytes) = %u", 984 dp_stats_buf->mac_addr.mac_addr47to32); 985 DP_PRINT_STATS("peer_flags = %u", 986 dp_stats_buf->peer_flags); 987 DP_PRINT_STATS("qpeer_flags = %u\n", 988 dp_stats_buf->qpeer_flags); 989 } 990 991 /* 992 * dp_print_tx_peer_rate_stats_tlv: display htt_tx_peer_rate_stats_tlv 993 * @tag_buf: buffer containing the tlv htt_tx_peer_rate_stats_tlv 994 * 995 * return:void 996 */ 997 static void dp_print_tx_peer_rate_stats_tlv(uint32_t *tag_buf) 998 { 999 htt_tx_peer_rate_stats_tlv *dp_stats_buf = 1000 (htt_tx_peer_rate_stats_tlv *)tag_buf; 1001 uint8_t i, j; 1002 uint16_t index = 0; 1003 char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0}; 1004 char *tx_gi_ext[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0}; 1005 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 1006 1007 if (!str_buf) { 1008 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 1009 FL("Output buffer not allocated")); 1010 return; 1011 } 1012 1013 for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) { 1014 tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 1015 tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 1016 if (!tx_gi[i] || !tx_gi_ext[i]) { 1017 dp_err("Unable to allocate buffer for tx_gi"); 1018 goto fail1; 1019 } 1020 } 1021 1022 DP_PRINT_STATS("HTT_TX_PEER_RATE_STATS_TLV:"); 1023 DP_PRINT_STATS("tx_ldpc = %u", 1024 dp_stats_buf->tx_ldpc); 1025 DP_PRINT_STATS("rts_cnt = %u", 1026 dp_stats_buf->rts_cnt); 1027 DP_PRINT_STATS("ack_rssi = %u", 1028 dp_stats_buf->ack_rssi); 1029 1030 index = 0; 1031 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1032 for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) { 1033 index += qdf_snprint(&str_buf[index], 1034 DP_MAX_STRING_LEN - index, 1035 " %u:%u,", i, dp_stats_buf->tx_mcs[i]); 1036 } 1037 for (i = 0; i < DP_HTT_TX_MCS_EXT_LEN; i++) { 1038 index += qdf_snprint(&str_buf[index], 1039 DP_MAX_STRING_LEN - index, 1040 " %u:%u,", i + DP_HTT_TX_MCS_LEN, 1041 dp_stats_buf->tx_mcs_ext[i]); 1042 } 1043 DP_PRINT_STATS("tx_mcs = %s ", str_buf); 1044 1045 index = 0; 1046 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1047 for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) { 1048 index += qdf_snprint(&str_buf[index], 1049 DP_MAX_STRING_LEN - index, 1050 " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]); 1051 } 1052 for (i = 0; i < DP_HTT_TX_SU_MCS_EXT_LEN; i++) { 1053 index += qdf_snprint(&str_buf[index], 1054 DP_MAX_STRING_LEN - index, 1055 " %u:%u,", i + DP_HTT_TX_SU_MCS_LEN, 1056 dp_stats_buf->tx_su_mcs_ext[i]); 1057 } 1058 DP_PRINT_STATS("tx_su_mcs = %s ", str_buf); 1059 1060 1061 index = 0; 1062 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1063 for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) { 1064 index += qdf_snprint(&str_buf[index], 1065 DP_MAX_STRING_LEN - index, 1066 " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]); 1067 } 1068 for (i = 0; i < DP_HTT_TX_MU_MCS_EXT_LEN; i++) { 1069 index += qdf_snprint(&str_buf[index], 1070 DP_MAX_STRING_LEN - index, 1071 " %u:%u,", i + DP_HTT_TX_MU_MCS_LEN, 1072 dp_stats_buf->tx_mu_mcs_ext[i]); 1073 } 1074 DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf); 1075 1076 index = 0; 1077 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1078 for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) { 1079 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 1080 index += qdf_snprint(&str_buf[index], 1081 DP_MAX_STRING_LEN - index, 1082 " %u:%u,", (i + 1), 1083 dp_stats_buf->tx_nss[i]); 1084 } 1085 DP_PRINT_STATS("tx_nss = %s ", str_buf); 1086 index = 0; 1087 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1088 for (i = 0; i < DP_HTT_TX_BW_LEN; i++) { 1089 index += qdf_snprint(&str_buf[index], 1090 DP_MAX_STRING_LEN - index, 1091 " %u:%u,", i, dp_stats_buf->tx_bw[i]); 1092 } 1093 DP_PRINT_STATS("tx_bw = %s ", str_buf); 1094 1095 index = 0; 1096 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1097 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 1098 index += qdf_snprint(&str_buf[index], 1099 DP_MAX_STRING_LEN - index, 1100 " %u:%u,", i, dp_stats_buf->tx_stbc[i]); 1101 } 1102 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 1103 index += qdf_snprint(&str_buf[index], 1104 DP_MAX_STRING_LEN - index, 1105 " %u:%u,", i + HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 1106 dp_stats_buf->tx_stbc_ext[i]); 1107 } 1108 DP_PRINT_STATS("tx_stbc = %s ", str_buf); 1109 1110 1111 index = 0; 1112 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1113 1114 for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) { 1115 index += qdf_snprint(&str_buf[index], 1116 DP_MAX_STRING_LEN - index, 1117 " %u:%u,", i, dp_stats_buf->tx_pream[i]); 1118 } 1119 DP_PRINT_STATS("tx_pream = %s ", str_buf); 1120 1121 for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) { 1122 index = 0; 1123 for (i = 0; i < HTT_TX_PEER_STATS_NUM_MCS_COUNTERS; i++) { 1124 index += qdf_snprint(&tx_gi[j][index], 1125 DP_MAX_STRING_LEN - index, 1126 " %u:%u,", i, 1127 dp_stats_buf->tx_gi[j][i]); 1128 } 1129 DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]); 1130 } 1131 1132 for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) { 1133 index = 0; 1134 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 1135 index += qdf_snprint(&tx_gi_ext[j][index], 1136 DP_MAX_STRING_LEN - index, 1137 " %u:%u,", i, 1138 dp_stats_buf->tx_gi_ext[j][i]); 1139 } 1140 DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]); 1141 } 1142 1143 index = 0; 1144 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1145 for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) { 1146 index += qdf_snprint(&str_buf[index], 1147 DP_MAX_STRING_LEN - index, 1148 " %u:%u,", i, dp_stats_buf->tx_dcm[i]); 1149 } 1150 DP_PRINT_STATS("tx_dcm = %s\n", str_buf); 1151 1152 fail1: 1153 for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) { 1154 if (tx_gi[i]) 1155 qdf_mem_free(tx_gi[i]); 1156 if (tx_gi_ext[i]) 1157 qdf_mem_free(tx_gi_ext[i]); 1158 } 1159 qdf_mem_free(str_buf); 1160 } 1161 1162 /* 1163 * dp_print_rx_peer_rate_stats_tlv: display htt_rx_peer_rate_stats_tlv 1164 * @tag_buf: buffer containing the tlv htt_rx_peer_rate_stats_tlv 1165 * 1166 * return:void 1167 */ 1168 static void dp_print_rx_peer_rate_stats_tlv(uint32_t *tag_buf) 1169 { 1170 htt_rx_peer_rate_stats_tlv *dp_stats_buf = 1171 (htt_rx_peer_rate_stats_tlv *)tag_buf; 1172 uint8_t i, j; 1173 uint16_t index = 0; 1174 char *rssi_chain[DP_HTT_PEER_NUM_SS] = {0}; 1175 char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0}; 1176 char *rx_gi_ext[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0}; 1177 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 1178 1179 if (!str_buf) { 1180 dp_stats_err("Output buffer not allocated"); 1181 return; 1182 } 1183 1184 for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) { 1185 rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 1186 if (!rssi_chain[i]) { 1187 dp_err("Unable to allocate buffer for rssi_chain"); 1188 goto fail1; 1189 } 1190 } 1191 1192 for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) { 1193 rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 1194 rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 1195 if (!rx_gi[i] || !rx_gi_ext[i]) { 1196 dp_err("Unable to allocate buffer for rx_gi"); 1197 goto fail1; 1198 } 1199 } 1200 1201 DP_PRINT_STATS("HTT_RX_PEER_RATE_STATS_TLV:"); 1202 DP_PRINT_STATS("nsts = %u", 1203 dp_stats_buf->nsts); 1204 DP_PRINT_STATS("rx_ldpc = %u", 1205 dp_stats_buf->rx_ldpc); 1206 DP_PRINT_STATS("rts_cnt = %u", 1207 dp_stats_buf->rts_cnt); 1208 DP_PRINT_STATS("rssi_mgmt = %u", 1209 dp_stats_buf->rssi_mgmt); 1210 DP_PRINT_STATS("rssi_data = %u", 1211 dp_stats_buf->rssi_data); 1212 DP_PRINT_STATS("rssi_comb = %u", 1213 dp_stats_buf->rssi_comb); 1214 1215 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1216 for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) { 1217 index += qdf_snprint(&str_buf[index], 1218 DP_MAX_STRING_LEN - index, 1219 " %u:%u,", i, dp_stats_buf->rx_mcs[i]); 1220 } 1221 for (i = 0; i < DP_HTT_RX_MCS_EXT_LEN; i++) { 1222 index += qdf_snprint(&str_buf[index], 1223 DP_MAX_STRING_LEN - index, 1224 " %u:%u,", i + DP_HTT_RX_MCS_LEN, 1225 dp_stats_buf->rx_mcs_ext[i]); 1226 } 1227 DP_PRINT_STATS("rx_mcs = %s ", str_buf); 1228 1229 index = 0; 1230 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1231 for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) { 1232 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 1233 index += qdf_snprint(&str_buf[index], 1234 DP_MAX_STRING_LEN - index, 1235 " %u:%u,", (i + 1), 1236 dp_stats_buf->rx_nss[i]); 1237 } 1238 DP_PRINT_STATS("rx_nss = %s ", str_buf); 1239 1240 index = 0; 1241 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1242 for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) { 1243 index += qdf_snprint(&str_buf[index], 1244 DP_MAX_STRING_LEN - index, 1245 " %u:%u,", i, dp_stats_buf->rx_dcm[i]); 1246 } 1247 DP_PRINT_STATS("rx_dcm = %s ", str_buf); 1248 1249 index = 0; 1250 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1251 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 1252 index += qdf_snprint(&str_buf[index], 1253 DP_MAX_STRING_LEN - index, 1254 " %u:%u,", i, dp_stats_buf->rx_stbc[i]); 1255 } 1256 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 1257 index += qdf_snprint(&str_buf[index], 1258 DP_MAX_STRING_LEN - index, 1259 " %u:%u,", i + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS, 1260 dp_stats_buf->rx_stbc_ext[i]); 1261 } 1262 DP_PRINT_STATS("rx_stbc = %s ", str_buf); 1263 1264 index = 0; 1265 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1266 for (i = 0; i < DP_HTT_RX_BW_LEN; i++) { 1267 index += qdf_snprint(&str_buf[index], 1268 DP_MAX_STRING_LEN - index, 1269 " %u:%u,", i, dp_stats_buf->rx_bw[i]); 1270 } 1271 DP_PRINT_STATS("rx_bw = %s ", str_buf); 1272 1273 for (j = 0; j < DP_HTT_PEER_NUM_SS; j++) { 1274 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1275 index = 0; 1276 for (i = 0; i < HTT_RX_PEER_STATS_NUM_BW_COUNTERS; i++) { 1277 index += qdf_snprint(&rssi_chain[j][index], 1278 DP_MAX_STRING_LEN - index, 1279 " %u:%u,", i, 1280 dp_stats_buf->rssi_chain[j][i]); 1281 } 1282 DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]); 1283 } 1284 1285 for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) { 1286 index = 0; 1287 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 1288 index += qdf_snprint(&rx_gi[j][index], 1289 DP_MAX_STRING_LEN - index, 1290 " %u:%u,", i, 1291 dp_stats_buf->rx_gi[j][i]); 1292 } 1293 DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]); 1294 } 1295 1296 for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) { 1297 index = 0; 1298 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 1299 index += qdf_snprint(&rx_gi_ext[j][index], 1300 DP_MAX_STRING_LEN - index, 1301 " %u:%u,", i, 1302 dp_stats_buf->rx_gi_ext[j][i]); 1303 } 1304 DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]); 1305 } 1306 1307 index = 0; 1308 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 1309 for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) { 1310 index += qdf_snprint(&str_buf[index], 1311 DP_MAX_STRING_LEN - index, 1312 " %u:%u,", i, dp_stats_buf->rx_pream[i]); 1313 } 1314 DP_PRINT_STATS("rx_pream = %s\n", str_buf); 1315 1316 fail1: 1317 for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) { 1318 if (!rssi_chain[i]) 1319 break; 1320 qdf_mem_free(rssi_chain[i]); 1321 } 1322 1323 for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) { 1324 if (rx_gi[i]) 1325 qdf_mem_free(rx_gi[i]); 1326 if (rx_gi_ext[i]) 1327 qdf_mem_free(rx_gi_ext[i]); 1328 } 1329 qdf_mem_free(str_buf); 1330 } 1331 1332 /* 1333 * dp_print_tx_hwq_mu_mimo_sch_stats_tlv: display htt_tx_hwq_mu_mimo_sch_stats 1334 * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_sch_stats_tlv 1335 * 1336 * return:void 1337 */ 1338 static void dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t *tag_buf) 1339 { 1340 htt_tx_hwq_mu_mimo_sch_stats_tlv *dp_stats_buf = 1341 (htt_tx_hwq_mu_mimo_sch_stats_tlv *)tag_buf; 1342 1343 DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:"); 1344 DP_PRINT_STATS("mu_mimo_sch_posted = %u", 1345 dp_stats_buf->mu_mimo_sch_posted); 1346 DP_PRINT_STATS("mu_mimo_sch_failed = %u", 1347 dp_stats_buf->mu_mimo_sch_failed); 1348 DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n", 1349 dp_stats_buf->mu_mimo_ppdu_posted); 1350 } 1351 1352 /* 1353 * dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv: display htt_tx_hwq_mu_mimo_mpdu_stats 1354 * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_mpdu_stats_tlv 1355 * 1356 * return:void 1357 */ 1358 static void dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf) 1359 { 1360 htt_tx_hwq_mu_mimo_mpdu_stats_tlv *dp_stats_buf = 1361 (htt_tx_hwq_mu_mimo_mpdu_stats_tlv *)tag_buf; 1362 1363 DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:"); 1364 DP_PRINT_STATS("mu_mimo_mpdus_queued_usr = %u", 1365 dp_stats_buf->mu_mimo_mpdus_queued_usr); 1366 DP_PRINT_STATS("mu_mimo_mpdus_tried_usr = %u", 1367 dp_stats_buf->mu_mimo_mpdus_tried_usr); 1368 DP_PRINT_STATS("mu_mimo_mpdus_failed_usr = %u", 1369 dp_stats_buf->mu_mimo_mpdus_failed_usr); 1370 DP_PRINT_STATS("mu_mimo_mpdus_requeued_usr = %u", 1371 dp_stats_buf->mu_mimo_mpdus_requeued_usr); 1372 DP_PRINT_STATS("mu_mimo_err_no_ba_usr = %u", 1373 dp_stats_buf->mu_mimo_err_no_ba_usr); 1374 DP_PRINT_STATS("mu_mimo_mpdu_underrun_usr = %u", 1375 dp_stats_buf->mu_mimo_mpdu_underrun_usr); 1376 DP_PRINT_STATS("mu_mimo_ampdu_underrun_usr = %u\n", 1377 dp_stats_buf->mu_mimo_ampdu_underrun_usr); 1378 } 1379 1380 /* 1381 * dp_print_tx_hwq_mu_mimo_cmn_stats_tlv: display htt_tx_hwq_mu_mimo_cmn_stats 1382 * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_cmn_stats_tlv 1383 * 1384 * return:void 1385 */ 1386 static inline void dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t *tag_buf) 1387 { 1388 htt_tx_hwq_mu_mimo_cmn_stats_tlv *dp_stats_buf = 1389 (htt_tx_hwq_mu_mimo_cmn_stats_tlv *)tag_buf; 1390 1391 DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:"); 1392 DP_PRINT_STATS("mac_id__hwq_id__word = %u\n", 1393 dp_stats_buf->mac_id__hwq_id__word); 1394 } 1395 1396 /* 1397 * dp_print_tx_hwq_stats_cmn_tlv: display htt_tx_hwq_stats_cmn_tlv 1398 * @tag_buf: buffer containing the tlv htt_tx_hwq_stats_cmn_tlv 1399 * 1400 * return:void 1401 */ 1402 static void dp_print_tx_hwq_stats_cmn_tlv(uint32_t *tag_buf) 1403 { 1404 htt_tx_hwq_stats_cmn_tlv *dp_stats_buf = 1405 (htt_tx_hwq_stats_cmn_tlv *)tag_buf; 1406 1407 DP_PRINT_STATS("HTT_TX_HWQ_STATS_CMN_TLV:"); 1408 DP_PRINT_STATS("mac_id__hwq_id__word = %u", 1409 dp_stats_buf->mac_id__hwq_id__word); 1410 DP_PRINT_STATS("xretry = %u", 1411 dp_stats_buf->xretry); 1412 DP_PRINT_STATS("underrun_cnt = %u", 1413 dp_stats_buf->underrun_cnt); 1414 DP_PRINT_STATS("flush_cnt = %u", 1415 dp_stats_buf->flush_cnt); 1416 DP_PRINT_STATS("filt_cnt = %u", 1417 dp_stats_buf->filt_cnt); 1418 DP_PRINT_STATS("null_mpdu_bmap = %u", 1419 dp_stats_buf->null_mpdu_bmap); 1420 DP_PRINT_STATS("user_ack_failure = %u", 1421 dp_stats_buf->user_ack_failure); 1422 DP_PRINT_STATS("ack_tlv_proc = %u", 1423 dp_stats_buf->ack_tlv_proc); 1424 DP_PRINT_STATS("sched_id_proc = %u", 1425 dp_stats_buf->sched_id_proc); 1426 DP_PRINT_STATS("null_mpdu_tx_count = %u", 1427 dp_stats_buf->null_mpdu_tx_count); 1428 DP_PRINT_STATS("mpdu_bmap_not_recvd = %u", 1429 dp_stats_buf->mpdu_bmap_not_recvd); 1430 DP_PRINT_STATS("num_bar = %u", 1431 dp_stats_buf->num_bar); 1432 DP_PRINT_STATS("rts = %u", 1433 dp_stats_buf->rts); 1434 DP_PRINT_STATS("cts2self = %u", 1435 dp_stats_buf->cts2self); 1436 DP_PRINT_STATS("qos_null = %u", 1437 dp_stats_buf->qos_null); 1438 DP_PRINT_STATS("mpdu_tried_cnt = %u", 1439 dp_stats_buf->mpdu_tried_cnt); 1440 DP_PRINT_STATS("mpdu_queued_cnt = %u", 1441 dp_stats_buf->mpdu_queued_cnt); 1442 DP_PRINT_STATS("mpdu_ack_fail_cnt = %u", 1443 dp_stats_buf->mpdu_ack_fail_cnt); 1444 DP_PRINT_STATS("mpdu_filt_cnt = %u", 1445 dp_stats_buf->mpdu_filt_cnt); 1446 DP_PRINT_STATS("false_mpdu_ack_count = %u\n", 1447 dp_stats_buf->false_mpdu_ack_count); 1448 } 1449 1450 /* 1451 * dp_print_tx_hwq_difs_latency_stats_tlv_v: display 1452 * htt_tx_hwq_difs_latency_stats_tlv_v 1453 * @tag_buf: buffer containing the tlv htt_tx_hwq_difs_latency_stats_tlv_v 1454 * 1455 *return:void 1456 */ 1457 static void dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t *tag_buf) 1458 { 1459 htt_tx_hwq_difs_latency_stats_tlv_v *dp_stats_buf = 1460 (htt_tx_hwq_difs_latency_stats_tlv_v *)tag_buf; 1461 uint8_t i; 1462 uint16_t index = 0; 1463 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1464 char *difs_latency_hist = qdf_mem_malloc(DP_MAX_STRING_LEN); 1465 1466 if (!difs_latency_hist) { 1467 dp_stats_err("Output buffer not allocated"); 1468 return; 1469 } 1470 1471 tag_len = qdf_min(tag_len, 1472 (uint32_t)HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS); 1473 1474 DP_PRINT_STATS("HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:"); 1475 DP_PRINT_STATS("hist_intvl = %u", 1476 dp_stats_buf->hist_intvl); 1477 1478 for (i = 0; i < tag_len; i++) { 1479 index += qdf_snprint(&difs_latency_hist[index], 1480 DP_MAX_STRING_LEN - index, 1481 " %u:%u,", i, 1482 dp_stats_buf->difs_latency_hist[i]); 1483 } 1484 DP_PRINT_STATS("difs_latency_hist = %s\n", difs_latency_hist); 1485 qdf_mem_free(difs_latency_hist); 1486 } 1487 1488 /* 1489 * dp_print_tx_hwq_cmd_result_stats_tlv_v: display htt_tx_hwq_cmd_result_stats 1490 * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_result_stats_tlv_v 1491 * 1492 * return:void 1493 */ 1494 static void dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t *tag_buf) 1495 { 1496 htt_tx_hwq_cmd_result_stats_tlv_v *dp_stats_buf = 1497 (htt_tx_hwq_cmd_result_stats_tlv_v *)tag_buf; 1498 uint8_t i; 1499 uint16_t index = 0; 1500 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1501 char *cmd_result = qdf_mem_malloc(DP_MAX_STRING_LEN); 1502 1503 if (!cmd_result) { 1504 dp_stats_err("Output buffer not allocated"); 1505 return; 1506 } 1507 1508 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_RESULT_STATS); 1509 1510 DP_PRINT_STATS("HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:"); 1511 for (i = 0; i < tag_len; i++) { 1512 index += qdf_snprint(&cmd_result[index], 1513 DP_MAX_STRING_LEN - index, 1514 " %u:%u,", i, dp_stats_buf->cmd_result[i]); 1515 } 1516 DP_PRINT_STATS("cmd_result = %s ", cmd_result); 1517 qdf_mem_free(cmd_result); 1518 } 1519 1520 /* 1521 * dp_print_tx_hwq_cmd_stall_stats_tlv_v: display htt_tx_hwq_cmd_stall_stats_tlv 1522 * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_stall_stats_tlv_v 1523 * 1524 * return:void 1525 */ 1526 static void dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t *tag_buf) 1527 { 1528 htt_tx_hwq_cmd_stall_stats_tlv_v *dp_stats_buf = 1529 (htt_tx_hwq_cmd_stall_stats_tlv_v *)tag_buf; 1530 uint8_t i; 1531 uint16_t index = 0; 1532 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1533 char *cmd_stall_status = qdf_mem_malloc(DP_MAX_STRING_LEN); 1534 1535 if (!cmd_stall_status) { 1536 dp_stats_err("Output buffer not allocated"); 1537 return; 1538 } 1539 1540 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_STALL_STATS); 1541 1542 DP_PRINT_STATS("HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:"); 1543 for (i = 0; i < tag_len; i++) { 1544 index += qdf_snprint(&cmd_stall_status[index], 1545 DP_MAX_STRING_LEN - index, 1546 " %u:%u,", i, 1547 dp_stats_buf->cmd_stall_status[i]); 1548 } 1549 DP_PRINT_STATS("cmd_stall_status = %s\n", cmd_stall_status); 1550 qdf_mem_free(cmd_stall_status); 1551 } 1552 1553 /* 1554 * dp_print_tx_hwq_fes_result_stats_tlv_v: display htt_tx_hwq_fes_result_stats 1555 * @tag_buf: buffer containing the tlv htt_tx_hwq_fes_result_stats_tlv_v 1556 * 1557 * return:void 1558 */ 1559 static void dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t *tag_buf) 1560 { 1561 htt_tx_hwq_fes_result_stats_tlv_v *dp_stats_buf = 1562 (htt_tx_hwq_fes_result_stats_tlv_v *)tag_buf; 1563 uint8_t i; 1564 uint16_t index = 0; 1565 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 1566 char *fes_result = qdf_mem_malloc(DP_MAX_STRING_LEN); 1567 1568 if (!fes_result) { 1569 dp_stats_err("Output buffer not allocated"); 1570 return; 1571 } 1572 1573 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_FES_RESULT_STATS); 1574 1575 DP_PRINT_STATS("HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:"); 1576 for (i = 0; i < tag_len; i++) { 1577 index += qdf_snprint(&fes_result[index], 1578 DP_MAX_STRING_LEN - index, 1579 " %u:%u,", i, dp_stats_buf->fes_result[i]); 1580 } 1581 DP_PRINT_STATS("fes_result = %s ", fes_result); 1582 qdf_mem_free(fes_result); 1583 } 1584 1585 /* 1586 * dp_print_tx_selfgen_cmn_stats_tlv: display htt_tx_selfgen_cmn_stats_tlv 1587 * @tag_buf: buffer containing the tlv htt_tx_selfgen_cmn_stats_tlv 1588 * 1589 * return:void 1590 */ 1591 static void dp_print_tx_selfgen_cmn_stats_tlv(uint32_t *tag_buf) 1592 { 1593 htt_tx_selfgen_cmn_stats_tlv *dp_stats_buf = 1594 (htt_tx_selfgen_cmn_stats_tlv *)tag_buf; 1595 DP_PRINT_STATS("HTT_TX_SELFGEN_CMN_STATS_TLV:"); 1596 DP_PRINT_STATS("mac_id__word = %u", 1597 dp_stats_buf->mac_id__word); 1598 DP_PRINT_STATS("su_bar = %u", 1599 dp_stats_buf->su_bar); 1600 DP_PRINT_STATS("rts = %u", 1601 dp_stats_buf->rts); 1602 DP_PRINT_STATS("cts2self = %u", 1603 dp_stats_buf->cts2self); 1604 DP_PRINT_STATS("qos_null = %u", 1605 dp_stats_buf->qos_null); 1606 DP_PRINT_STATS("delayed_bar_1 = %u", 1607 dp_stats_buf->delayed_bar_1); 1608 DP_PRINT_STATS("delayed_bar_2 = %u", 1609 dp_stats_buf->delayed_bar_2); 1610 DP_PRINT_STATS("delayed_bar_3 = %u", 1611 dp_stats_buf->delayed_bar_3); 1612 DP_PRINT_STATS("delayed_bar_4 = %u", 1613 dp_stats_buf->delayed_bar_4); 1614 DP_PRINT_STATS("delayed_bar_5 = %u", 1615 dp_stats_buf->delayed_bar_5); 1616 DP_PRINT_STATS("delayed_bar_6 = %u", 1617 dp_stats_buf->delayed_bar_6); 1618 DP_PRINT_STATS("delayed_bar_7 = %u\n", 1619 dp_stats_buf->delayed_bar_7); 1620 } 1621 1622 /* 1623 * dp_print_tx_selfgen_ac_stats_tlv: display htt_tx_selfgen_ac_stats_tlv 1624 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_stats_tlv 1625 * 1626 * return:void 1627 */ 1628 static void dp_print_tx_selfgen_ac_stats_tlv(uint32_t *tag_buf) 1629 { 1630 htt_tx_selfgen_ac_stats_tlv *dp_stats_buf = 1631 (htt_tx_selfgen_ac_stats_tlv *)tag_buf; 1632 1633 DP_PRINT_STATS("HTT_TX_SELFGEN_AC_STATS_TLV:"); 1634 DP_PRINT_STATS("ac_su_ndpa = %u", 1635 dp_stats_buf->ac_su_ndpa); 1636 DP_PRINT_STATS("ac_su_ndp = %u", 1637 dp_stats_buf->ac_su_ndp); 1638 DP_PRINT_STATS("ac_mu_mimo_ndpa = %u", 1639 dp_stats_buf->ac_mu_mimo_ndpa); 1640 DP_PRINT_STATS("ac_mu_mimo_ndp = %u", 1641 dp_stats_buf->ac_mu_mimo_ndp); 1642 DP_PRINT_STATS("ac_mu_mimo_brpoll_1 = %u", 1643 dp_stats_buf->ac_mu_mimo_brpoll_1); 1644 DP_PRINT_STATS("ac_mu_mimo_brpoll_2 = %u", 1645 dp_stats_buf->ac_mu_mimo_brpoll_2); 1646 DP_PRINT_STATS("ac_mu_mimo_brpoll_3 = %u\n", 1647 dp_stats_buf->ac_mu_mimo_brpoll_3); 1648 } 1649 1650 /* 1651 * dp_print_tx_selfgen_ax_stats_tlv: display htt_tx_selfgen_ax_stats_tlv 1652 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_stats_tlv 1653 * 1654 * return:void 1655 */ 1656 static void dp_print_tx_selfgen_ax_stats_tlv(uint32_t *tag_buf) 1657 { 1658 htt_tx_selfgen_ax_stats_tlv *dp_stats_buf = 1659 (htt_tx_selfgen_ax_stats_tlv *)tag_buf; 1660 1661 DP_PRINT_STATS("HTT_TX_SELFGEN_AX_STATS_TLV:"); 1662 DP_PRINT_STATS("ax_su_ndpa = %u", 1663 dp_stats_buf->ax_su_ndpa); 1664 DP_PRINT_STATS("ax_su_ndp = %u", 1665 dp_stats_buf->ax_su_ndp); 1666 DP_PRINT_STATS("ax_mu_mimo_ndpa = %u", 1667 dp_stats_buf->ax_mu_mimo_ndpa); 1668 DP_PRINT_STATS("ax_mu_mimo_ndp = %u", 1669 dp_stats_buf->ax_mu_mimo_ndp); 1670 DP_PRINT_STATS("ax_mu_mimo_brpoll_1 = %u", 1671 dp_stats_buf->ax_mu_mimo_brpoll_1); 1672 DP_PRINT_STATS("ax_mu_mimo_brpoll_2 = %u", 1673 dp_stats_buf->ax_mu_mimo_brpoll_2); 1674 DP_PRINT_STATS("ax_mu_mimo_brpoll_3 = %u", 1675 dp_stats_buf->ax_mu_mimo_brpoll_3); 1676 DP_PRINT_STATS("ax_mu_mimo_brpoll_4 = %u", 1677 dp_stats_buf->ax_mu_mimo_brpoll_4); 1678 DP_PRINT_STATS("ax_mu_mimo_brpoll_5 = %u", 1679 dp_stats_buf->ax_mu_mimo_brpoll_5); 1680 DP_PRINT_STATS("ax_mu_mimo_brpoll_6 = %u", 1681 dp_stats_buf->ax_mu_mimo_brpoll_6); 1682 DP_PRINT_STATS("ax_mu_mimo_brpoll_7 = %u", 1683 dp_stats_buf->ax_mu_mimo_brpoll_7); 1684 DP_PRINT_STATS("ax_basic_trigger = %u", 1685 dp_stats_buf->ax_basic_trigger); 1686 DP_PRINT_STATS("ax_bsr_trigger = %u", 1687 dp_stats_buf->ax_bsr_trigger); 1688 DP_PRINT_STATS("ax_mu_bar_trigger = %u", 1689 dp_stats_buf->ax_mu_bar_trigger); 1690 DP_PRINT_STATS("ax_mu_rts_trigger = %u\n", 1691 dp_stats_buf->ax_mu_rts_trigger); 1692 } 1693 1694 /* 1695 * dp_print_tx_selfgen_ac_err_stats_tlv: display htt_tx_selfgen_ac_err_stats_tlv 1696 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_err_stats_tlv 1697 * 1698 * return:void 1699 */ 1700 static void dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t *tag_buf) 1701 { 1702 htt_tx_selfgen_ac_err_stats_tlv *dp_stats_buf = 1703 (htt_tx_selfgen_ac_err_stats_tlv *)tag_buf; 1704 1705 DP_PRINT_STATS("HTT_TX_SELFGEN_AC_ERR_STATS_TLV:"); 1706 DP_PRINT_STATS("ac_su_ndp_err = %u", 1707 dp_stats_buf->ac_su_ndp_err); 1708 DP_PRINT_STATS("ac_su_ndpa_err = %u", 1709 dp_stats_buf->ac_su_ndpa_err); 1710 DP_PRINT_STATS("ac_mu_mimo_ndpa_err = %u", 1711 dp_stats_buf->ac_mu_mimo_ndpa_err); 1712 DP_PRINT_STATS("ac_mu_mimo_ndp_err = %u", 1713 dp_stats_buf->ac_mu_mimo_ndp_err); 1714 DP_PRINT_STATS("ac_mu_mimo_brp1_err = %u", 1715 dp_stats_buf->ac_mu_mimo_brp1_err); 1716 DP_PRINT_STATS("ac_mu_mimo_brp2_err = %u", 1717 dp_stats_buf->ac_mu_mimo_brp2_err); 1718 DP_PRINT_STATS("ac_mu_mimo_brp3_err = %u\n", 1719 dp_stats_buf->ac_mu_mimo_brp3_err); 1720 } 1721 1722 /* dp_print_tx_selfgen_be_err_stats_tlv: display htt_tx_selfgen_be_err_stats_tlv 1723 * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_err_stats_tlv 1724 * 1725 * return:void 1726 */ 1727 static void dp_print_tx_selfgen_be_err_stats_tlv(uint32_t *tag_buf) 1728 { 1729 htt_tx_selfgen_be_err_stats_tlv *dp_stats_buf = 1730 (htt_tx_selfgen_be_err_stats_tlv *)tag_buf; 1731 uint16_t i; 1732 1733 DP_PRINT_STATS("HTT_TX_SELFGEN_BE_ERR_STATS_TLV:"); 1734 DP_PRINT_STATS("be_su_ndp_err = %u", 1735 dp_stats_buf->be_su_ndp_err); 1736 DP_PRINT_STATS("be_su_ndpa_err = %u", 1737 dp_stats_buf->be_su_ndpa_err); 1738 DP_PRINT_STATS("be_mu_mimo_ndpa_err = %u", 1739 dp_stats_buf->be_mu_mimo_ndpa_err); 1740 DP_PRINT_STATS("be_mu_mimo_ndp_err = %u", 1741 dp_stats_buf->be_mu_mimo_ndp_err); 1742 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1743 DP_PRINT_STATS("be_mu_mimo_brp_err_%d: %u", 1744 i, dp_stats_buf->be_mu_mimo_brp_err[i]); 1745 DP_PRINT_STATS("be_basic_trigger_err = %u", 1746 dp_stats_buf->be_basic_trigger_err); 1747 DP_PRINT_STATS("be_bsr_trigger_err = %u", 1748 dp_stats_buf->be_bsr_trigger_err); 1749 DP_PRINT_STATS("be_mu_bar_trigger_err = %u", 1750 dp_stats_buf->be_mu_bar_trigger_err); 1751 DP_PRINT_STATS("be_mu_rts_trigger_err = %u", 1752 dp_stats_buf->be_mu_rts_trigger_err); 1753 DP_PRINT_STATS("be_ulmumimo_trigger_err = %u", 1754 dp_stats_buf->be_ulmumimo_trigger_err); 1755 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1756 DP_PRINT_STATS("be_mu_mimo_brp_err_num_cbf_received _%d: %u", i, 1757 dp_stats_buf->be_mu_mimo_brp_err_num_cbf_received[i]); 1758 DP_PRINT_STATS("be_su_ndpa_flushed = %u", 1759 dp_stats_buf->be_su_ndpa_flushed); 1760 DP_PRINT_STATS("be_su_ndp_flushed = %u", 1761 dp_stats_buf->be_su_ndp_flushed); 1762 DP_PRINT_STATS("be_mu_mimo_ndpa_flushed = %u", 1763 dp_stats_buf->be_mu_mimo_ndpa_flushed); 1764 DP_PRINT_STATS("be_mu_mimo_ndp_flushed = %u", 1765 dp_stats_buf->be_mu_mimo_ndp_flushed); 1766 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1767 DP_PRINT_STATS("be_mu_mimo_brpoll_flushed_%d: %u", 1768 i, dp_stats_buf->be_mu_mimo_brpoll_flushed[i]); 1769 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1770 DP_PRINT_STATS("be_ul_mumimo_trigger_err_%d: %u", 1771 i, dp_stats_buf->be_ul_mumimo_trigger_err[i]); 1772 } 1773 1774 /* 1775 * dp_print_tx_selfgen_be_stats_tlv: display htt_tx_selfgen_be_stats_tlv 1776 * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_stats_tlv 1777 * 1778 * return:void 1779 */ 1780 static void dp_print_tx_selfgen_be_stats_tlv(uint32_t *tag_buf) 1781 { 1782 htt_tx_selfgen_be_stats_tlv *dp_stats_buf = 1783 (htt_tx_selfgen_be_stats_tlv *)tag_buf; 1784 uint16_t i; 1785 1786 DP_PRINT_STATS("HTT_TX_SELFGEN_BE_STATS_TLV:"); 1787 DP_PRINT_STATS("be_su_ndpa = %u", 1788 dp_stats_buf->be_su_ndpa); 1789 DP_PRINT_STATS("be_su_ndp = %u", 1790 dp_stats_buf->be_su_ndp); 1791 DP_PRINT_STATS("be_mu_mimo_ndpa = %u", 1792 dp_stats_buf->be_mu_mimo_ndpa); 1793 DP_PRINT_STATS("be_mu_mimo_ndp = %u", 1794 dp_stats_buf->be_mu_mimo_ndp); 1795 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1796 DP_PRINT_STATS("be_mu_mimo_brpoll_%d = %u", 1797 i, dp_stats_buf->be_mu_mimo_brpoll[i]); 1798 DP_PRINT_STATS("be_basic_trigger = %u", 1799 dp_stats_buf->be_basic_trigger); 1800 DP_PRINT_STATS("be_bsr_trigger = %u", 1801 dp_stats_buf->be_bsr_trigger); 1802 DP_PRINT_STATS("be_mu_bar_trigger = %u", 1803 dp_stats_buf->be_mu_bar_trigger); 1804 DP_PRINT_STATS("be_mu_rts_trigger = %u", 1805 dp_stats_buf->be_mu_rts_trigger); 1806 DP_PRINT_STATS("be_ulmumimo_trigger = %u", 1807 dp_stats_buf->be_ulmumimo_trigger); 1808 DP_PRINT_STATS("be_su_ndpa_queued = %u", 1809 dp_stats_buf->be_su_ndpa_queued); 1810 DP_PRINT_STATS("be_su_ndp_queued = %u", 1811 dp_stats_buf->be_su_ndp_queued); 1812 DP_PRINT_STATS("be_mu_mimo_ndpa_queued = %u", 1813 dp_stats_buf->be_mu_mimo_ndpa_queued); 1814 DP_PRINT_STATS("be_mu_mimo_ndp_queued = %u", 1815 dp_stats_buf->be_mu_mimo_ndp_queued); 1816 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1817 DP_PRINT_STATS("be_mu_mimo_brpoll_queued_%d = %u", 1818 i, dp_stats_buf->be_mu_mimo_brpoll_queued[i]); 1819 for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++) 1820 DP_PRINT_STATS("be_ul_mumimo_trigger_%d = %u", 1821 i, dp_stats_buf->be_ul_mumimo_trigger[i]); 1822 } 1823 1824 /* 1825 * dp_print_tx_selfgen_ax_err_stats_tlv: display htt_tx_selfgen_ax_err_stats_tlv 1826 * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_err_stats_tlv 1827 * 1828 * return:void 1829 */ 1830 static void dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t *tag_buf) 1831 { 1832 htt_tx_selfgen_ax_err_stats_tlv *dp_stats_buf = 1833 (htt_tx_selfgen_ax_err_stats_tlv *)tag_buf; 1834 1835 DP_PRINT_STATS("HTT_TX_SELFGEN_AX_ERR_STATS_TLV:"); 1836 DP_PRINT_STATS("ax_su_ndp_err = %u", 1837 dp_stats_buf->ax_su_ndp_err); 1838 DP_PRINT_STATS("ax_su_ndpa_err = %u", 1839 dp_stats_buf->ax_su_ndpa_err); 1840 DP_PRINT_STATS("ax_mu_mimo_ndpa_err = %u", 1841 dp_stats_buf->ax_mu_mimo_ndpa_err); 1842 DP_PRINT_STATS("ax_mu_mimo_ndp_err = %u", 1843 dp_stats_buf->ax_mu_mimo_ndp_err); 1844 DP_PRINT_STATS("ax_mu_mimo_brp1_err = %u", 1845 dp_stats_buf->ax_mu_mimo_brp1_err); 1846 DP_PRINT_STATS("ax_mu_mimo_brp2_err = %u", 1847 dp_stats_buf->ax_mu_mimo_brp2_err); 1848 DP_PRINT_STATS("ax_mu_mimo_brp3_err = %u", 1849 dp_stats_buf->ax_mu_mimo_brp3_err); 1850 DP_PRINT_STATS("ax_mu_mimo_brp4_err = %u", 1851 dp_stats_buf->ax_mu_mimo_brp4_err); 1852 DP_PRINT_STATS("ax_mu_mimo_brp5_err = %u", 1853 dp_stats_buf->ax_mu_mimo_brp5_err); 1854 DP_PRINT_STATS("ax_mu_mimo_brp6_err = %u", 1855 dp_stats_buf->ax_mu_mimo_brp6_err); 1856 DP_PRINT_STATS("ax_mu_mimo_brp7_err = %u", 1857 dp_stats_buf->ax_mu_mimo_brp7_err); 1858 DP_PRINT_STATS("ax_basic_trigger_err = %u", 1859 dp_stats_buf->ax_basic_trigger_err); 1860 DP_PRINT_STATS("ax_bsr_trigger_err = %u", 1861 dp_stats_buf->ax_bsr_trigger_err); 1862 DP_PRINT_STATS("ax_mu_bar_trigger_err = %u", 1863 dp_stats_buf->ax_mu_bar_trigger_err); 1864 DP_PRINT_STATS("ax_mu_rts_trigger_err = %u\n", 1865 dp_stats_buf->ax_mu_rts_trigger_err); 1866 } 1867 1868 /* 1869 * dp_print_tx_sounding_stats_tlv: display htt_tx_sounding_stats_tlv 1870 * @tag_buf: buffer containing the tlv htt_tx_soundig_stats_tlv 1871 * 1872 * return:void 1873 */ 1874 static void dp_print_tx_sounding_stats_tlv(uint32_t *tag_buf) 1875 { 1876 htt_tx_sounding_stats_tlv *dp_stats_buf = 1877 (htt_tx_sounding_stats_tlv *)tag_buf; 1878 uint16_t i; 1879 uint16_t max_bw = HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; 1880 bool cv_stats = false; 1881 1882 switch (dp_stats_buf->tx_sounding_mode) { 1883 case HTT_TX_AC_SOUNDING_MODE: 1884 DP_PRINT_STATS("\n HTT_TX_AC_SOUNDING_STATS_TLV: "); 1885 DP_PRINT_STATS("ac_cbf_20 = IBF : %d, SU_SIFS : %d, " 1886 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1887 dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1], 1888 dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3], 1889 dp_stats_buf->cbf_20[4]); 1890 DP_PRINT_STATS("ac_cbf_40 = IBF : %d, SU_SIFS : %d, " 1891 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1892 dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1], 1893 dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3], 1894 dp_stats_buf->cbf_40[4]); 1895 DP_PRINT_STATS("ac_cbf_80 = IBF : %d, SU_SIFS : %d, " 1896 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1897 dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1], 1898 dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3], 1899 dp_stats_buf->cbf_80[4]); 1900 DP_PRINT_STATS("ac_cbf_160 = IBF : %d, SU_SIFS : %d, " 1901 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1902 dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1], 1903 dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3], 1904 dp_stats_buf->cbf_160[4]); 1905 for (i = 0; 1906 i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; 1907 i++) { 1908 DP_PRINT_STATS("Sounding User %d = 20MHz: %d, " 1909 "40MHz : %d, 80MHz: %d, 160MHz: %d", i, 1910 dp_stats_buf->sounding[(i * max_bw) + 0], 1911 dp_stats_buf->sounding[(i * max_bw) + 1], 1912 dp_stats_buf->sounding[(i * max_bw) + 2], 1913 dp_stats_buf->sounding[(i * max_bw) + 3]); 1914 } 1915 break; 1916 case HTT_TX_AX_SOUNDING_MODE: 1917 DP_PRINT_STATS("\n HTT_TX_AX_SOUNDING_STATS_TLV: "); 1918 DP_PRINT_STATS("ax_cbf_20 = IBF : %d, SU_SIFS : %d, " 1919 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1920 dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1], 1921 dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3], 1922 dp_stats_buf->cbf_20[4]); 1923 DP_PRINT_STATS("ax_cbf_40 = IBF : %d, SU_SIFS : %d, " 1924 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1925 dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1], 1926 dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3], 1927 dp_stats_buf->cbf_40[4]); 1928 DP_PRINT_STATS("ax_cbf_80 = IBF : %d, SU_SIFS : %d, " 1929 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1930 dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1], 1931 dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3], 1932 dp_stats_buf->cbf_80[4]); 1933 DP_PRINT_STATS("ax_cbf_160 = IBF : %d, SU_SIFS : %d, " 1934 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1935 dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1], 1936 dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3], 1937 dp_stats_buf->cbf_160[4]); 1938 for (i = 0; 1939 i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; 1940 i++) { 1941 DP_PRINT_STATS("Sounding User %d = 20MHz: %d, " 1942 "40MHz : %d, 80MHz: %d, 160MHz: %d", i, 1943 dp_stats_buf->sounding[(i * max_bw) + 0], 1944 dp_stats_buf->sounding[(i * max_bw) + 1], 1945 dp_stats_buf->sounding[(i * max_bw) + 2], 1946 dp_stats_buf->sounding[(i * max_bw) + 3]); 1947 } 1948 break; 1949 case HTT_TX_BE_SOUNDING_MODE: 1950 DP_PRINT_STATS("\n HTT_TX_BE_SOUNDING_STATS_TLV: "); 1951 DP_PRINT_STATS("be_cbf_20 = IBF : %d, SU_SIFS : %d, " 1952 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1953 dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1], 1954 dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3], 1955 dp_stats_buf->cbf_20[4]); 1956 DP_PRINT_STATS("be_cbf_40 = IBF : %d, SU_SIFS : %d, " 1957 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1958 dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1], 1959 dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3], 1960 dp_stats_buf->cbf_40[4]); 1961 DP_PRINT_STATS("be_cbf_80 = IBF : %d, SU_SIFS : %d, " 1962 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1963 dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1], 1964 dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3], 1965 dp_stats_buf->cbf_80[4]); 1966 DP_PRINT_STATS("be_cbf_160 = IBF : %d, SU_SIFS : %d, " 1967 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1968 dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1], 1969 dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3], 1970 dp_stats_buf->cbf_160[4]); 1971 DP_PRINT_STATS("be_cbf_320 = IBF : %d, SU_SIFS : %d, " 1972 "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:", 1973 dp_stats_buf->cbf_320[0], dp_stats_buf->cbf_320[1], 1974 dp_stats_buf->cbf_320[2], dp_stats_buf->cbf_320[3], 1975 dp_stats_buf->cbf_320[4]); 1976 for (i = 0; 1977 i < HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS; 1978 i++) { 1979 DP_PRINT_STATS("Sounding User %d = 20MHz: %d, " 1980 "40MHz : %d, 80MHz: %d, 160MHz: %d, " 1981 "320MHz: %d", i, 1982 dp_stats_buf->sounding[(i * max_bw) + 0], 1983 dp_stats_buf->sounding[(i * max_bw) + 1], 1984 dp_stats_buf->sounding[(i * max_bw) + 2], 1985 dp_stats_buf->sounding[(i * max_bw) + 3], 1986 dp_stats_buf->sounding_320[i]); 1987 } 1988 cv_stats = true; 1989 break; 1990 default: 1991 break; 1992 } 1993 1994 if (cv_stats) { 1995 DP_PRINT_STATS("\n CV UPLOAD HANDLER STATS:"); 1996 DP_PRINT_STATS("cv_nc_mismatch_err : %u", 1997 dp_stats_buf->cv_nc_mismatch_err); 1998 DP_PRINT_STATS("cv_fcs_err : %u", 1999 dp_stats_buf->cv_fcs_err); 2000 DP_PRINT_STATS("cv_frag_idx_mismatch : %u", 2001 dp_stats_buf->cv_frag_idx_mismatch); 2002 DP_PRINT_STATS("cv_invalid_peer_id : %u", 2003 dp_stats_buf->cv_invalid_peer_id); 2004 DP_PRINT_STATS("cv_no_txbf_setup : %u", 2005 dp_stats_buf->cv_no_txbf_setup); 2006 DP_PRINT_STATS("cv_expiry_in_update : %u", 2007 dp_stats_buf->cv_expiry_in_update); 2008 DP_PRINT_STATS("cv_pkt_bw_exceed : %u", 2009 dp_stats_buf->cv_pkt_bw_exceed); 2010 DP_PRINT_STATS("cv_dma_not_done_err : %u", 2011 dp_stats_buf->cv_dma_not_done_err); 2012 DP_PRINT_STATS("cv_update_failed : %u\n", 2013 dp_stats_buf->cv_update_failed); 2014 2015 DP_PRINT_STATS("\n CV QUERY STATS:"); 2016 DP_PRINT_STATS("cv_total_query : %u", 2017 dp_stats_buf->cv_total_query); 2018 DP_PRINT_STATS("cv_total_pattern_query : %u", 2019 dp_stats_buf->cv_total_pattern_query); 2020 DP_PRINT_STATS("cv_total_bw_query : %u", 2021 dp_stats_buf->cv_total_bw_query); 2022 DP_PRINT_STATS("cv_total_query : %u", 2023 dp_stats_buf->cv_total_query); 2024 DP_PRINT_STATS("cv_invalid_bw_coding : %u", 2025 dp_stats_buf->cv_invalid_bw_coding); 2026 DP_PRINT_STATS("cv_forced_sounding : %u", 2027 dp_stats_buf->cv_forced_sounding); 2028 DP_PRINT_STATS("cv_standalone_sounding : %u", 2029 dp_stats_buf->cv_standalone_sounding); 2030 DP_PRINT_STATS("cv_nc_mismatch : %u", 2031 dp_stats_buf->cv_nc_mismatch); 2032 DP_PRINT_STATS("cv_fb_type_mismatch : %u", 2033 dp_stats_buf->cv_fb_type_mismatch); 2034 DP_PRINT_STATS("cv_ofdma_bw_mismatch : %u", 2035 dp_stats_buf->cv_ofdma_bw_mismatch); 2036 DP_PRINT_STATS("cv_bw_mismatch : %u", 2037 dp_stats_buf->cv_bw_mismatch); 2038 DP_PRINT_STATS("cv_pattern_mismatch : %u", 2039 dp_stats_buf->cv_pattern_mismatch); 2040 DP_PRINT_STATS("cv_preamble_mismatch : %u", 2041 dp_stats_buf->cv_preamble_mismatch); 2042 DP_PRINT_STATS("cv_nr_mismatch : %u", 2043 dp_stats_buf->cv_nr_mismatch); 2044 DP_PRINT_STATS("cv_in_use_cnt_exceeded : %u", 2045 dp_stats_buf->cv_in_use_cnt_exceeded); 2046 DP_PRINT_STATS("cv_found : %u", 2047 dp_stats_buf->cv_found); 2048 DP_PRINT_STATS("cv_not found : %u", 2049 dp_stats_buf->cv_not_found); 2050 DP_PRINT_STATS("cv_ntbr_sounding : %u", 2051 dp_stats_buf->cv_ntbr_sounding); 2052 DP_PRINT_STATS("cv_found_upload_in_progress: %u", 2053 dp_stats_buf->cv_found_upload_in_progress); 2054 DP_PRINT_STATS("cv_expired_during_query : %u\n", 2055 dp_stats_buf->cv_expired_during_query); 2056 } 2057 } 2058 2059 /* 2060 * dp_print_tx_pdev_mu_mimo_sch_stats_tlv: display htt_tx_pdev_mu_mimo_sch_stats 2061 * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_sch_stats_tlv 2062 * 2063 * return:void 2064 */ 2065 static void dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t *tag_buf) 2066 { 2067 uint8_t i; 2068 htt_tx_pdev_mu_mimo_sch_stats_tlv *dp_stats_buf = 2069 (htt_tx_pdev_mu_mimo_sch_stats_tlv *)tag_buf; 2070 2071 DP_PRINT_STATS("HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:"); 2072 DP_PRINT_STATS("mu_mimo_sch_posted = %u", 2073 dp_stats_buf->mu_mimo_sch_posted); 2074 DP_PRINT_STATS("mu_mimo_sch_failed = %u", 2075 dp_stats_buf->mu_mimo_sch_failed); 2076 DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n", 2077 dp_stats_buf->mu_mimo_ppdu_posted); 2078 2079 DP_PRINT_STATS("11ac MU_MIMO SCH STATS:"); 2080 2081 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) { 2082 DP_PRINT_STATS("ac_mu_mimo_sch_nusers_%u = %u", i, 2083 dp_stats_buf->ac_mu_mimo_sch_nusers[i]); 2084 } 2085 2086 DP_PRINT_STATS("\n11ax MU_MIMO SCH STATS:"); 2087 2088 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) { 2089 DP_PRINT_STATS("ax_mu_mimo_sch_nusers_%u = %u", i, 2090 dp_stats_buf->ax_mu_mimo_sch_nusers[i]); 2091 } 2092 2093 DP_PRINT_STATS("\n11ax OFDMA SCH STATS:"); 2094 2095 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) { 2096 DP_PRINT_STATS("ax_ofdma_sch_nusers_%u = %u", i, 2097 dp_stats_buf->ax_ofdma_sch_nusers[i]); 2098 } 2099 } 2100 2101 /* 2102 * dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv: display 2103 * htt_tx_pdev_mu_mimo_mpdu_stats_tlv 2104 * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_mpdu_stats_tlv 2105 * 2106 * return:void 2107 */ 2108 static void dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf) 2109 { 2110 htt_tx_pdev_mpdu_stats_tlv *dp_stats_buf = 2111 (htt_tx_pdev_mpdu_stats_tlv *)tag_buf; 2112 2113 if (dp_stats_buf->tx_sched_mode == 2114 HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) { 2115 if (!dp_stats_buf->user_index) 2116 DP_PRINT_STATS( 2117 "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n"); 2118 2119 if (dp_stats_buf->user_index < 2120 HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) { 2121 DP_PRINT_STATS( 2122 "ac_mu_mimo_mpdus_queued_usr_%u = %u", 2123 dp_stats_buf->user_index, 2124 dp_stats_buf->mpdus_queued_usr); 2125 DP_PRINT_STATS( 2126 "ac_mu_mimo_mpdus_tried_usr_%u = %u", 2127 dp_stats_buf->user_index, 2128 dp_stats_buf->mpdus_tried_usr); 2129 DP_PRINT_STATS( 2130 "ac_mu_mimo_mpdus_failed_usr_%u = %u", 2131 dp_stats_buf->user_index, 2132 dp_stats_buf->mpdus_failed_usr); 2133 DP_PRINT_STATS( 2134 "ac_mu_mimo_mpdus_requeued_usr_%u = %u", 2135 dp_stats_buf->user_index, 2136 dp_stats_buf->mpdus_requeued_usr); 2137 DP_PRINT_STATS( 2138 "ac_mu_mimo_err_no_ba_usr_%u = %u", 2139 dp_stats_buf->user_index, 2140 dp_stats_buf->err_no_ba_usr); 2141 DP_PRINT_STATS( 2142 "ac_mu_mimo_mpdu_underrun_usr_%u = %u", 2143 dp_stats_buf->user_index, 2144 dp_stats_buf->mpdu_underrun_usr); 2145 DP_PRINT_STATS( 2146 "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n", 2147 dp_stats_buf->user_index, 2148 dp_stats_buf->ampdu_underrun_usr); 2149 } 2150 } 2151 2152 if (dp_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) { 2153 if (!dp_stats_buf->user_index) 2154 DP_PRINT_STATS( 2155 "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n"); 2156 2157 if (dp_stats_buf->user_index < 2158 HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) { 2159 DP_PRINT_STATS( 2160 "ax_mu_mimo_mpdus_queued_usr_%u = %u", 2161 dp_stats_buf->user_index, 2162 dp_stats_buf->mpdus_queued_usr); 2163 DP_PRINT_STATS( 2164 "ax_mu_mimo_mpdus_tried_usr_%u = %u", 2165 dp_stats_buf->user_index, 2166 dp_stats_buf->mpdus_tried_usr); 2167 DP_PRINT_STATS( 2168 "ax_mu_mimo_mpdus_failed_usr_%u = %u", 2169 dp_stats_buf->user_index, 2170 dp_stats_buf->mpdus_failed_usr); 2171 DP_PRINT_STATS( 2172 "ax_mu_mimo_mpdus_requeued_usr_%u = %u", 2173 dp_stats_buf->user_index, 2174 dp_stats_buf->mpdus_requeued_usr); 2175 DP_PRINT_STATS( 2176 "ax_mu_mimo_err_no_ba_usr_%u = %u", 2177 dp_stats_buf->user_index, 2178 dp_stats_buf->err_no_ba_usr); 2179 DP_PRINT_STATS( 2180 "ax_mu_mimo_mpdu_underrun_usr_%u = %u", 2181 dp_stats_buf->user_index, 2182 dp_stats_buf->mpdu_underrun_usr); 2183 DP_PRINT_STATS( 2184 "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n", 2185 dp_stats_buf->user_index, 2186 dp_stats_buf->ampdu_underrun_usr); 2187 } 2188 } 2189 2190 if (dp_stats_buf->tx_sched_mode == 2191 HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) { 2192 if (!dp_stats_buf->user_index) 2193 DP_PRINT_STATS( 2194 "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n"); 2195 2196 if (dp_stats_buf->user_index < 2197 HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) { 2198 DP_PRINT_STATS( 2199 "ax_mu_ofdma_mpdus_queued_usr_%u = %u", 2200 dp_stats_buf->user_index, 2201 dp_stats_buf->mpdus_queued_usr); 2202 DP_PRINT_STATS( 2203 "ax_mu_ofdma_mpdus_tried_usr_%u = %u", 2204 dp_stats_buf->user_index, 2205 dp_stats_buf->mpdus_tried_usr); 2206 DP_PRINT_STATS( 2207 "ax_mu_ofdma_mpdus_failed_usr_%u = %u", 2208 dp_stats_buf->user_index, 2209 dp_stats_buf->mpdus_failed_usr); 2210 DP_PRINT_STATS( 2211 "ax_mu_ofdma_mpdus_requeued_usr_%u = %u", 2212 dp_stats_buf->user_index, 2213 dp_stats_buf->mpdus_requeued_usr); 2214 DP_PRINT_STATS( 2215 "ax_mu_ofdma_err_no_ba_usr_%u = %u", 2216 dp_stats_buf->user_index, 2217 dp_stats_buf->err_no_ba_usr); 2218 DP_PRINT_STATS( 2219 "ax_mu_ofdma_mpdu_underrun_usr_%u = %u", 2220 dp_stats_buf->user_index, 2221 dp_stats_buf->mpdu_underrun_usr); 2222 DP_PRINT_STATS( 2223 "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n", 2224 dp_stats_buf->user_index, 2225 dp_stats_buf->ampdu_underrun_usr); 2226 } 2227 } 2228 } 2229 2230 /* 2231 * dp_print_sched_txq_cmd_posted_tlv_v: display htt_sched_txq_cmd_posted_tlv_v 2232 * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_posted_tlv_v 2233 * 2234 * return:void 2235 */ 2236 static void dp_print_sched_txq_cmd_posted_tlv_v(uint32_t *tag_buf) 2237 { 2238 htt_sched_txq_cmd_posted_tlv_v *dp_stats_buf = 2239 (htt_sched_txq_cmd_posted_tlv_v *)tag_buf; 2240 uint8_t i; 2241 uint16_t index = 0; 2242 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2243 char *sched_cmd_posted = qdf_mem_malloc(DP_MAX_STRING_LEN); 2244 2245 if (!sched_cmd_posted) { 2246 dp_stats_err("Output buffer not allocated"); 2247 return; 2248 } 2249 2250 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX); 2251 2252 DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_POSTED_TLV_V:"); 2253 for (i = 0; i < tag_len; i++) { 2254 index += qdf_snprint(&sched_cmd_posted[index], 2255 DP_MAX_STRING_LEN - index, 2256 " %u:%u,", i, 2257 dp_stats_buf->sched_cmd_posted[i]); 2258 } 2259 DP_PRINT_STATS("sched_cmd_posted = %s\n", sched_cmd_posted); 2260 qdf_mem_free(sched_cmd_posted); 2261 } 2262 2263 /* 2264 * dp_print_sched_txq_cmd_reaped_tlv_v: display htt_sched_txq_cmd_reaped_tlv_v 2265 * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_reaped_tlv_v 2266 * 2267 * return:void 2268 */ 2269 static void dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t *tag_buf) 2270 { 2271 htt_sched_txq_cmd_reaped_tlv_v *dp_stats_buf = 2272 (htt_sched_txq_cmd_reaped_tlv_v *)tag_buf; 2273 uint8_t i; 2274 uint16_t index = 0; 2275 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2276 char *sched_cmd_reaped = qdf_mem_malloc(DP_MAX_STRING_LEN); 2277 2278 if (!sched_cmd_reaped) { 2279 dp_stats_err("Output buffer not allocated"); 2280 return; 2281 } 2282 2283 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX); 2284 2285 DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_REAPED_TLV_V:"); 2286 for (i = 0; i < tag_len; i++) { 2287 index += qdf_snprint(&sched_cmd_reaped[index], 2288 DP_MAX_STRING_LEN - index, 2289 " %u:%u,", i, 2290 dp_stats_buf->sched_cmd_reaped[i]); 2291 } 2292 DP_PRINT_STATS("sched_cmd_reaped = %s\n", sched_cmd_reaped); 2293 qdf_mem_free(sched_cmd_reaped); 2294 } 2295 2296 /* 2297 * dp_print_tx_pdev_stats_sched_per_txq_tlv: display 2298 * htt_tx_pdev_stats_sched_per_txq_tlv 2299 * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sched_per_txq_tlv 2300 * 2301 * return:void 2302 */ 2303 static void dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t *tag_buf) 2304 { 2305 htt_tx_pdev_stats_sched_per_txq_tlv *dp_stats_buf = 2306 (htt_tx_pdev_stats_sched_per_txq_tlv *)tag_buf; 2307 2308 DP_PRINT_STATS("HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:"); 2309 DP_PRINT_STATS("mac_id__txq_id__word = %u", 2310 dp_stats_buf->mac_id__txq_id__word); 2311 DP_PRINT_STATS("sched_policy = %u", 2312 dp_stats_buf->sched_policy); 2313 DP_PRINT_STATS("last_sched_cmd_posted_timestamp = %u", 2314 dp_stats_buf->last_sched_cmd_posted_timestamp); 2315 DP_PRINT_STATS("last_sched_cmd_compl_timestamp = %u", 2316 dp_stats_buf->last_sched_cmd_compl_timestamp); 2317 DP_PRINT_STATS("sched_2_tac_lwm_count = %u", 2318 dp_stats_buf->sched_2_tac_lwm_count); 2319 DP_PRINT_STATS("sched_2_tac_ring_full = %u", 2320 dp_stats_buf->sched_2_tac_ring_full); 2321 DP_PRINT_STATS("sched_cmd_post_failure = %u", 2322 dp_stats_buf->sched_cmd_post_failure); 2323 DP_PRINT_STATS("num_active_tids = %u", 2324 dp_stats_buf->num_active_tids); 2325 DP_PRINT_STATS("num_ps_schedules = %u", 2326 dp_stats_buf->num_ps_schedules); 2327 DP_PRINT_STATS("sched_cmds_pending = %u", 2328 dp_stats_buf->sched_cmds_pending); 2329 DP_PRINT_STATS("num_tid_register = %u", 2330 dp_stats_buf->num_tid_register); 2331 DP_PRINT_STATS("num_tid_unregister = %u", 2332 dp_stats_buf->num_tid_unregister); 2333 DP_PRINT_STATS("num_qstats_queried = %u", 2334 dp_stats_buf->num_qstats_queried); 2335 DP_PRINT_STATS("qstats_update_pending = %u", 2336 dp_stats_buf->qstats_update_pending); 2337 DP_PRINT_STATS("last_qstats_query_timestamp = %u", 2338 dp_stats_buf->last_qstats_query_timestamp); 2339 DP_PRINT_STATS("num_tqm_cmdq_full = %u", 2340 dp_stats_buf->num_tqm_cmdq_full); 2341 DP_PRINT_STATS("num_de_sched_algo_trigger = %u", 2342 dp_stats_buf->num_de_sched_algo_trigger); 2343 DP_PRINT_STATS("num_rt_sched_algo_trigger = %u", 2344 dp_stats_buf->num_rt_sched_algo_trigger); 2345 DP_PRINT_STATS("num_tqm_sched_algo_trigger = %u", 2346 dp_stats_buf->num_tqm_sched_algo_trigger); 2347 DP_PRINT_STATS("notify_sched = %u\n", 2348 dp_stats_buf->notify_sched); 2349 } 2350 2351 /* 2352 * dp_print_stats_tx_sched_cmn_tlv: display htt_stats_tx_sched_cmn_tlv 2353 * @tag_buf: buffer containing the tlv htt_stats_tx_sched_cmn_tlv 2354 * 2355 * return:void 2356 */ 2357 static void dp_print_stats_tx_sched_cmn_tlv(uint32_t *tag_buf) 2358 { 2359 htt_stats_tx_sched_cmn_tlv *dp_stats_buf = 2360 (htt_stats_tx_sched_cmn_tlv *)tag_buf; 2361 2362 DP_PRINT_STATS("HTT_STATS_TX_SCHED_CMN_TLV:"); 2363 DP_PRINT_STATS("mac_id__word = %u", 2364 dp_stats_buf->mac_id__word); 2365 DP_PRINT_STATS("current_timestamp = %u\n", 2366 dp_stats_buf->current_timestamp); 2367 } 2368 2369 /* 2370 * dp_print_tx_tqm_gen_mpdu_stats_tlv_v: display htt_tx_tqm_gen_mpdu_stats_tlv_v 2371 * @tag_buf: buffer containing the tlv htt_tx_tqm_gen_mpdu_stats_tlv_v 2372 * 2373 * return:void 2374 */ 2375 static void dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t *tag_buf) 2376 { 2377 htt_tx_tqm_gen_mpdu_stats_tlv_v *dp_stats_buf = 2378 (htt_tx_tqm_gen_mpdu_stats_tlv_v *)tag_buf; 2379 uint8_t i; 2380 uint16_t index = 0; 2381 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2382 char *gen_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN); 2383 2384 if (!gen_mpdu_end_reason) { 2385 dp_stats_err("Output buffer not allocated"); 2386 return; 2387 } 2388 2389 tag_len = qdf_min(tag_len, 2390 (uint32_t)HTT_TX_TQM_MAX_GEN_MPDU_END_REASON); 2391 2392 DP_PRINT_STATS("HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:"); 2393 for (i = 0; i < tag_len; i++) { 2394 index += qdf_snprint(&gen_mpdu_end_reason[index], 2395 DP_MAX_STRING_LEN - index, 2396 " %u:%u,", i, 2397 dp_stats_buf->gen_mpdu_end_reason[i]); 2398 } 2399 DP_PRINT_STATS("gen_mpdu_end_reason = %s\n", gen_mpdu_end_reason); 2400 qdf_mem_free(gen_mpdu_end_reason); 2401 } 2402 2403 /* 2404 * dp_print_tx_tqm_list_mpdu_stats_tlv_v: display htt_tx_tqm_list_mpdu_stats_tlv 2405 * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_stats_tlv_v 2406 * 2407 * return:void 2408 */ 2409 static void dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t *tag_buf) 2410 { 2411 htt_tx_tqm_list_mpdu_stats_tlv_v *dp_stats_buf = 2412 (htt_tx_tqm_list_mpdu_stats_tlv_v *)tag_buf; 2413 uint8_t i; 2414 uint16_t index = 0; 2415 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2416 char *list_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN); 2417 2418 if (!list_mpdu_end_reason) { 2419 dp_stats_err("Output buffer not allocated"); 2420 return; 2421 } 2422 2423 tag_len = qdf_min(tag_len, 2424 (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_END_REASON); 2425 2426 DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:"); 2427 for (i = 0; i < tag_len; i++) { 2428 index += qdf_snprint(&list_mpdu_end_reason[index], 2429 DP_MAX_STRING_LEN - index, 2430 " %u:%u,", i, 2431 dp_stats_buf->list_mpdu_end_reason[i]); 2432 } 2433 DP_PRINT_STATS("list_mpdu_end_reason = %s\n", 2434 list_mpdu_end_reason); 2435 qdf_mem_free(list_mpdu_end_reason); 2436 } 2437 2438 /* 2439 * dp_print_tx_tqm_list_mpdu_cnt_tlv_v: display htt_tx_tqm_list_mpdu_cnt_tlv_v 2440 * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_cnt_tlv_v 2441 * 2442 * return:void 2443 */ 2444 static void dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t *tag_buf) 2445 { 2446 htt_tx_tqm_list_mpdu_cnt_tlv_v *dp_stats_buf = 2447 (htt_tx_tqm_list_mpdu_cnt_tlv_v *)tag_buf; 2448 uint8_t i; 2449 uint16_t index = 0; 2450 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2451 char *list_mpdu_cnt_hist = qdf_mem_malloc(DP_MAX_STRING_LEN); 2452 2453 if (!list_mpdu_cnt_hist) { 2454 dp_stats_err("Output buffer not allocated"); 2455 return; 2456 } 2457 2458 tag_len = qdf_min(tag_len, 2459 (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS); 2460 2461 DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:"); 2462 for (i = 0; i < tag_len; i++) { 2463 index += qdf_snprint(&list_mpdu_cnt_hist[index], 2464 DP_MAX_STRING_LEN - index, 2465 " %u:%u,", i, 2466 dp_stats_buf->list_mpdu_cnt_hist[i]); 2467 } 2468 DP_PRINT_STATS("list_mpdu_cnt_hist = %s\n", list_mpdu_cnt_hist); 2469 qdf_mem_free(list_mpdu_cnt_hist); 2470 } 2471 2472 /* 2473 * dp_print_tx_tqm_pdev_stats_tlv_v: display htt_tx_tqm_pdev_stats_tlv_v 2474 * @tag_buf: buffer containing the tlv htt_tx_tqm_pdev_stats_tlv_v 2475 * 2476 * return:void 2477 */ 2478 static void dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t *tag_buf) 2479 { 2480 htt_tx_tqm_pdev_stats_tlv_v *dp_stats_buf = 2481 (htt_tx_tqm_pdev_stats_tlv_v *)tag_buf; 2482 2483 DP_PRINT_STATS("HTT_TX_TQM_PDEV_STATS_TLV_V:"); 2484 DP_PRINT_STATS("msdu_count = %u", 2485 dp_stats_buf->msdu_count); 2486 DP_PRINT_STATS("mpdu_count = %u", 2487 dp_stats_buf->mpdu_count); 2488 DP_PRINT_STATS("remove_msdu = %u", 2489 dp_stats_buf->remove_msdu); 2490 DP_PRINT_STATS("remove_mpdu = %u", 2491 dp_stats_buf->remove_mpdu); 2492 DP_PRINT_STATS("remove_msdu_ttl = %u", 2493 dp_stats_buf->remove_msdu_ttl); 2494 DP_PRINT_STATS("send_bar = %u", 2495 dp_stats_buf->send_bar); 2496 DP_PRINT_STATS("bar_sync = %u", 2497 dp_stats_buf->bar_sync); 2498 DP_PRINT_STATS("notify_mpdu = %u", 2499 dp_stats_buf->notify_mpdu); 2500 DP_PRINT_STATS("sync_cmd = %u", 2501 dp_stats_buf->sync_cmd); 2502 DP_PRINT_STATS("write_cmd = %u", 2503 dp_stats_buf->write_cmd); 2504 DP_PRINT_STATS("hwsch_trigger = %u", 2505 dp_stats_buf->hwsch_trigger); 2506 DP_PRINT_STATS("ack_tlv_proc = %u", 2507 dp_stats_buf->ack_tlv_proc); 2508 DP_PRINT_STATS("gen_mpdu_cmd = %u", 2509 dp_stats_buf->gen_mpdu_cmd); 2510 DP_PRINT_STATS("gen_list_cmd = %u", 2511 dp_stats_buf->gen_list_cmd); 2512 DP_PRINT_STATS("remove_mpdu_cmd = %u", 2513 dp_stats_buf->remove_mpdu_cmd); 2514 DP_PRINT_STATS("remove_mpdu_tried_cmd = %u", 2515 dp_stats_buf->remove_mpdu_tried_cmd); 2516 DP_PRINT_STATS("mpdu_queue_stats_cmd = %u", 2517 dp_stats_buf->mpdu_queue_stats_cmd); 2518 DP_PRINT_STATS("mpdu_head_info_cmd = %u", 2519 dp_stats_buf->mpdu_head_info_cmd); 2520 DP_PRINT_STATS("msdu_flow_stats_cmd = %u", 2521 dp_stats_buf->msdu_flow_stats_cmd); 2522 DP_PRINT_STATS("remove_msdu_cmd = %u", 2523 dp_stats_buf->remove_msdu_cmd); 2524 DP_PRINT_STATS("remove_msdu_ttl_cmd = %u", 2525 dp_stats_buf->remove_msdu_ttl_cmd); 2526 DP_PRINT_STATS("flush_cache_cmd = %u", 2527 dp_stats_buf->flush_cache_cmd); 2528 DP_PRINT_STATS("update_mpduq_cmd = %u", 2529 dp_stats_buf->update_mpduq_cmd); 2530 DP_PRINT_STATS("enqueue = %u", 2531 dp_stats_buf->enqueue); 2532 DP_PRINT_STATS("enqueue_notify = %u", 2533 dp_stats_buf->enqueue_notify); 2534 DP_PRINT_STATS("notify_mpdu_at_head = %u", 2535 dp_stats_buf->notify_mpdu_at_head); 2536 DP_PRINT_STATS("notify_mpdu_state_valid = %u\n", 2537 dp_stats_buf->notify_mpdu_state_valid); 2538 } 2539 2540 /* 2541 * dp_print_tx_tqm_cmn_stats_tlv: display htt_tx_tqm_cmn_stats_tlv 2542 * @tag_buf: buffer containing the tlv htt_tx_tqm_cmn_stats_tlv 2543 * 2544 * return:void 2545 */ 2546 static void dp_print_tx_tqm_cmn_stats_tlv(uint32_t *tag_buf) 2547 { 2548 htt_tx_tqm_cmn_stats_tlv *dp_stats_buf = 2549 (htt_tx_tqm_cmn_stats_tlv *)tag_buf; 2550 2551 DP_PRINT_STATS("HTT_TX_TQM_CMN_STATS_TLV:"); 2552 DP_PRINT_STATS("mac_id__word = %u", 2553 dp_stats_buf->mac_id__word); 2554 DP_PRINT_STATS("max_cmdq_id = %u", 2555 dp_stats_buf->max_cmdq_id); 2556 DP_PRINT_STATS("list_mpdu_cnt_hist_intvl = %u", 2557 dp_stats_buf->list_mpdu_cnt_hist_intvl); 2558 DP_PRINT_STATS("add_msdu = %u", 2559 dp_stats_buf->add_msdu); 2560 DP_PRINT_STATS("q_empty = %u", 2561 dp_stats_buf->q_empty); 2562 DP_PRINT_STATS("q_not_empty = %u", 2563 dp_stats_buf->q_not_empty); 2564 DP_PRINT_STATS("drop_notification = %u", 2565 dp_stats_buf->drop_notification); 2566 DP_PRINT_STATS("desc_threshold = %u\n", 2567 dp_stats_buf->desc_threshold); 2568 } 2569 2570 /* 2571 * dp_print_tx_tqm_error_stats_tlv: display htt_tx_tqm_error_stats_tlv 2572 * @tag_buf: buffer containing the tlv htt_tx_tqm_error_stats_tlv 2573 * 2574 * return:void 2575 */ 2576 static void dp_print_tx_tqm_error_stats_tlv(uint32_t *tag_buf) 2577 { 2578 htt_tx_tqm_error_stats_tlv *dp_stats_buf = 2579 (htt_tx_tqm_error_stats_tlv *)tag_buf; 2580 2581 DP_PRINT_STATS("HTT_TX_TQM_ERROR_STATS_TLV:"); 2582 DP_PRINT_STATS("q_empty_failure = %u", 2583 dp_stats_buf->q_empty_failure); 2584 DP_PRINT_STATS("q_not_empty_failure = %u", 2585 dp_stats_buf->q_not_empty_failure); 2586 DP_PRINT_STATS("add_msdu_failure = %u\n", 2587 dp_stats_buf->add_msdu_failure); 2588 } 2589 2590 /* 2591 * dp_print_tx_tqm_cmdq_status_tlv: display htt_tx_tqm_cmdq_status_tlv 2592 * @tag_buf: buffer containing the tlv htt_tx_tqm_cmdq_status_tlv 2593 * 2594 * return:void 2595 */ 2596 static void dp_print_tx_tqm_cmdq_status_tlv(uint32_t *tag_buf) 2597 { 2598 htt_tx_tqm_cmdq_status_tlv *dp_stats_buf = 2599 (htt_tx_tqm_cmdq_status_tlv *)tag_buf; 2600 2601 DP_PRINT_STATS("HTT_TX_TQM_CMDQ_STATUS_TLV:"); 2602 DP_PRINT_STATS("mac_id__cmdq_id__word = %u", 2603 dp_stats_buf->mac_id__cmdq_id__word); 2604 DP_PRINT_STATS("sync_cmd = %u", 2605 dp_stats_buf->sync_cmd); 2606 DP_PRINT_STATS("write_cmd = %u", 2607 dp_stats_buf->write_cmd); 2608 DP_PRINT_STATS("gen_mpdu_cmd = %u", 2609 dp_stats_buf->gen_mpdu_cmd); 2610 DP_PRINT_STATS("mpdu_queue_stats_cmd = %u", 2611 dp_stats_buf->mpdu_queue_stats_cmd); 2612 DP_PRINT_STATS("mpdu_head_info_cmd = %u", 2613 dp_stats_buf->mpdu_head_info_cmd); 2614 DP_PRINT_STATS("msdu_flow_stats_cmd = %u", 2615 dp_stats_buf->msdu_flow_stats_cmd); 2616 DP_PRINT_STATS("remove_mpdu_cmd = %u", 2617 dp_stats_buf->remove_mpdu_cmd); 2618 DP_PRINT_STATS("remove_msdu_cmd = %u", 2619 dp_stats_buf->remove_msdu_cmd); 2620 DP_PRINT_STATS("flush_cache_cmd = %u", 2621 dp_stats_buf->flush_cache_cmd); 2622 DP_PRINT_STATS("update_mpduq_cmd = %u", 2623 dp_stats_buf->update_mpduq_cmd); 2624 DP_PRINT_STATS("update_msduq_cmd = %u\n", 2625 dp_stats_buf->update_msduq_cmd); 2626 } 2627 2628 /* 2629 * dp_print_tx_de_eapol_packets_stats_tlv: display htt_tx_de_eapol_packets_stats 2630 * @tag_buf: buffer containing the tlv htt_tx_de_eapol_packets_stats_tlv 2631 * 2632 * return:void 2633 */ 2634 static void dp_print_tx_de_eapol_packets_stats_tlv(uint32_t *tag_buf) 2635 { 2636 htt_tx_de_eapol_packets_stats_tlv *dp_stats_buf = 2637 (htt_tx_de_eapol_packets_stats_tlv *)tag_buf; 2638 2639 DP_PRINT_STATS("HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:"); 2640 DP_PRINT_STATS("m1_packets = %u", 2641 dp_stats_buf->m1_packets); 2642 DP_PRINT_STATS("m2_packets = %u", 2643 dp_stats_buf->m2_packets); 2644 DP_PRINT_STATS("m3_packets = %u", 2645 dp_stats_buf->m3_packets); 2646 DP_PRINT_STATS("m4_packets = %u", 2647 dp_stats_buf->m4_packets); 2648 DP_PRINT_STATS("g1_packets = %u", 2649 dp_stats_buf->g1_packets); 2650 DP_PRINT_STATS("g2_packets = %u\n", 2651 dp_stats_buf->g2_packets); 2652 } 2653 2654 /* 2655 * dp_print_tx_de_classify_failed_stats_tlv: display 2656 * htt_tx_de_classify_failed_stats_tlv 2657 * @tag_buf: buffer containing the tlv htt_tx_de_classify_failed_stats_tlv 2658 * 2659 * return:void 2660 */ 2661 static void dp_print_tx_de_classify_failed_stats_tlv(uint32_t *tag_buf) 2662 { 2663 htt_tx_de_classify_failed_stats_tlv *dp_stats_buf = 2664 (htt_tx_de_classify_failed_stats_tlv *)tag_buf; 2665 2666 DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:"); 2667 DP_PRINT_STATS("ap_bss_peer_not_found = %u", 2668 dp_stats_buf->ap_bss_peer_not_found); 2669 DP_PRINT_STATS("ap_bcast_mcast_no_peer = %u", 2670 dp_stats_buf->ap_bcast_mcast_no_peer); 2671 DP_PRINT_STATS("sta_delete_in_progress = %u", 2672 dp_stats_buf->sta_delete_in_progress); 2673 DP_PRINT_STATS("ibss_no_bss_peer = %u", 2674 dp_stats_buf->ibss_no_bss_peer); 2675 DP_PRINT_STATS("invaild_vdev_type = %u", 2676 dp_stats_buf->invaild_vdev_type); 2677 DP_PRINT_STATS("invalid_ast_peer_entry = %u", 2678 dp_stats_buf->invalid_ast_peer_entry); 2679 DP_PRINT_STATS("peer_entry_invalid = %u", 2680 dp_stats_buf->peer_entry_invalid); 2681 DP_PRINT_STATS("ethertype_not_ip = %u", 2682 dp_stats_buf->ethertype_not_ip); 2683 DP_PRINT_STATS("eapol_lookup_failed = %u", 2684 dp_stats_buf->eapol_lookup_failed); 2685 DP_PRINT_STATS("qpeer_not_allow_data = %u", 2686 dp_stats_buf->qpeer_not_allow_data); 2687 DP_PRINT_STATS("fse_tid_override = %u\n", 2688 dp_stats_buf->fse_tid_override); 2689 } 2690 2691 /* 2692 * dp_print_tx_de_classify_stats_tlv: display htt_tx_de_classify_stats_tlv 2693 * @tag_buf: buffer containing the tlv htt_tx_de_classify_stats_tlv 2694 * 2695 * return:void 2696 */ 2697 static void dp_print_tx_de_classify_stats_tlv(uint32_t *tag_buf) 2698 { 2699 htt_tx_de_classify_stats_tlv *dp_stats_buf = 2700 (htt_tx_de_classify_stats_tlv *)tag_buf; 2701 2702 DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATS_TLV:"); 2703 DP_PRINT_STATS("arp_packets = %u", 2704 dp_stats_buf->arp_packets); 2705 DP_PRINT_STATS("igmp_packets = %u", 2706 dp_stats_buf->igmp_packets); 2707 DP_PRINT_STATS("dhcp_packets = %u", 2708 dp_stats_buf->dhcp_packets); 2709 DP_PRINT_STATS("host_inspected = %u", 2710 dp_stats_buf->host_inspected); 2711 DP_PRINT_STATS("htt_included = %u", 2712 dp_stats_buf->htt_included); 2713 DP_PRINT_STATS("htt_valid_mcs = %u", 2714 dp_stats_buf->htt_valid_mcs); 2715 DP_PRINT_STATS("htt_valid_nss = %u", 2716 dp_stats_buf->htt_valid_nss); 2717 DP_PRINT_STATS("htt_valid_preamble_type = %u", 2718 dp_stats_buf->htt_valid_preamble_type); 2719 DP_PRINT_STATS("htt_valid_chainmask = %u", 2720 dp_stats_buf->htt_valid_chainmask); 2721 DP_PRINT_STATS("htt_valid_guard_interval = %u", 2722 dp_stats_buf->htt_valid_guard_interval); 2723 DP_PRINT_STATS("htt_valid_retries = %u", 2724 dp_stats_buf->htt_valid_retries); 2725 DP_PRINT_STATS("htt_valid_bw_info = %u", 2726 dp_stats_buf->htt_valid_bw_info); 2727 DP_PRINT_STATS("htt_valid_power = %u", 2728 dp_stats_buf->htt_valid_power); 2729 DP_PRINT_STATS("htt_valid_key_flags = %u", 2730 dp_stats_buf->htt_valid_key_flags); 2731 DP_PRINT_STATS("htt_valid_no_encryption = %u", 2732 dp_stats_buf->htt_valid_no_encryption); 2733 DP_PRINT_STATS("fse_entry_count = %u", 2734 dp_stats_buf->fse_entry_count); 2735 DP_PRINT_STATS("fse_priority_be = %u", 2736 dp_stats_buf->fse_priority_be); 2737 DP_PRINT_STATS("fse_priority_high = %u", 2738 dp_stats_buf->fse_priority_high); 2739 DP_PRINT_STATS("fse_priority_low = %u", 2740 dp_stats_buf->fse_priority_low); 2741 DP_PRINT_STATS("fse_traffic_ptrn_be = %u", 2742 dp_stats_buf->fse_traffic_ptrn_be); 2743 DP_PRINT_STATS("fse_traffic_ptrn_over_sub = %u", 2744 dp_stats_buf->fse_traffic_ptrn_over_sub); 2745 DP_PRINT_STATS("fse_traffic_ptrn_bursty = %u", 2746 dp_stats_buf->fse_traffic_ptrn_bursty); 2747 DP_PRINT_STATS("fse_traffic_ptrn_interactive = %u", 2748 dp_stats_buf->fse_traffic_ptrn_interactive); 2749 DP_PRINT_STATS("fse_traffic_ptrn_periodic = %u", 2750 dp_stats_buf->fse_traffic_ptrn_periodic); 2751 DP_PRINT_STATS("fse_hwqueue_alloc = %u", 2752 dp_stats_buf->fse_hwqueue_alloc); 2753 DP_PRINT_STATS("fse_hwqueue_created = %u", 2754 dp_stats_buf->fse_hwqueue_created); 2755 DP_PRINT_STATS("fse_hwqueue_send_to_host = %u", 2756 dp_stats_buf->fse_hwqueue_send_to_host); 2757 DP_PRINT_STATS("mcast_entry = %u", 2758 dp_stats_buf->mcast_entry); 2759 DP_PRINT_STATS("bcast_entry = %u\n", 2760 dp_stats_buf->bcast_entry); 2761 } 2762 2763 /* 2764 * dp_print_tx_de_classify_status_stats_tlv: display 2765 * htt_tx_de_classify_status_stats_tlv 2766 * @tag_buf: buffer containing the tlv htt_tx_de_classify_status_stats_tlv 2767 * 2768 * return:void 2769 */ 2770 static void dp_print_tx_de_classify_status_stats_tlv(uint32_t *tag_buf) 2771 { 2772 htt_tx_de_classify_status_stats_tlv *dp_stats_buf = 2773 (htt_tx_de_classify_status_stats_tlv *)tag_buf; 2774 2775 DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:"); 2776 DP_PRINT_STATS("eok = %u", 2777 dp_stats_buf->eok); 2778 DP_PRINT_STATS("classify_done = %u", 2779 dp_stats_buf->classify_done); 2780 DP_PRINT_STATS("lookup_failed = %u", 2781 dp_stats_buf->lookup_failed); 2782 DP_PRINT_STATS("send_host_dhcp = %u", 2783 dp_stats_buf->send_host_dhcp); 2784 DP_PRINT_STATS("send_host_mcast = %u", 2785 dp_stats_buf->send_host_mcast); 2786 DP_PRINT_STATS("send_host_unknown_dest = %u", 2787 dp_stats_buf->send_host_unknown_dest); 2788 DP_PRINT_STATS("send_host = %u", 2789 dp_stats_buf->send_host); 2790 DP_PRINT_STATS("status_invalid = %u\n", 2791 dp_stats_buf->status_invalid); 2792 } 2793 2794 /* 2795 * dp_print_tx_de_enqueue_packets_stats_tlv: display 2796 * htt_tx_de_enqueue_packets_stats_tlv 2797 * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_packets_stats_tlv 2798 * 2799 * return:void 2800 */ 2801 static void dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t *tag_buf) 2802 { 2803 htt_tx_de_enqueue_packets_stats_tlv *dp_stats_buf = 2804 (htt_tx_de_enqueue_packets_stats_tlv *)tag_buf; 2805 2806 DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:"); 2807 DP_PRINT_STATS("enqueued_pkts = %u", 2808 dp_stats_buf->enqueued_pkts); 2809 DP_PRINT_STATS("to_tqm = %u", 2810 dp_stats_buf->to_tqm); 2811 DP_PRINT_STATS("to_tqm_bypass = %u\n", 2812 dp_stats_buf->to_tqm_bypass); 2813 } 2814 2815 /* 2816 * dp_print_tx_de_enqueue_discard_stats_tlv: display 2817 * htt_tx_de_enqueue_discard_stats_tlv 2818 * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_discard_stats_tlv 2819 * 2820 * return:void 2821 */ 2822 static void dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t *tag_buf) 2823 { 2824 htt_tx_de_enqueue_discard_stats_tlv *dp_stats_buf = 2825 (htt_tx_de_enqueue_discard_stats_tlv *)tag_buf; 2826 2827 DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:"); 2828 DP_PRINT_STATS("discarded_pkts = %u", 2829 dp_stats_buf->discarded_pkts); 2830 DP_PRINT_STATS("local_frames = %u", 2831 dp_stats_buf->local_frames); 2832 DP_PRINT_STATS("is_ext_msdu = %u\n", 2833 dp_stats_buf->is_ext_msdu); 2834 } 2835 2836 /* 2837 * dp_print_tx_de_compl_stats_tlv: display htt_tx_de_compl_stats_tlv 2838 * @tag_buf: buffer containing the tlv htt_tx_de_compl_stats_tlv 2839 * 2840 * return:void 2841 */ 2842 static void dp_print_tx_de_compl_stats_tlv(uint32_t *tag_buf) 2843 { 2844 htt_tx_de_compl_stats_tlv *dp_stats_buf = 2845 (htt_tx_de_compl_stats_tlv *)tag_buf; 2846 2847 DP_PRINT_STATS("HTT_TX_DE_COMPL_STATS_TLV:"); 2848 DP_PRINT_STATS("tcl_dummy_frame = %u", 2849 dp_stats_buf->tcl_dummy_frame); 2850 DP_PRINT_STATS("tqm_dummy_frame = %u", 2851 dp_stats_buf->tqm_dummy_frame); 2852 DP_PRINT_STATS("tqm_notify_frame = %u", 2853 dp_stats_buf->tqm_notify_frame); 2854 DP_PRINT_STATS("fw2wbm_enq = %u", 2855 dp_stats_buf->fw2wbm_enq); 2856 DP_PRINT_STATS("tqm_bypass_frame = %u\n", 2857 dp_stats_buf->tqm_bypass_frame); 2858 } 2859 2860 /* 2861 * dp_print_tx_de_cmn_stats_tlv: display htt_tx_de_cmn_stats_tlv 2862 * @tag_buf: buffer containing the tlv htt_tx_de_cmn_stats_tlv 2863 * 2864 * return:void 2865 */ 2866 static void dp_print_tx_de_cmn_stats_tlv(uint32_t *tag_buf) 2867 { 2868 htt_tx_de_cmn_stats_tlv *dp_stats_buf = 2869 (htt_tx_de_cmn_stats_tlv *)tag_buf; 2870 2871 DP_PRINT_STATS("HTT_TX_DE_CMN_STATS_TLV:"); 2872 DP_PRINT_STATS("mac_id__word = %u", 2873 dp_stats_buf->mac_id__word); 2874 DP_PRINT_STATS("tcl2fw_entry_count = %u", 2875 dp_stats_buf->tcl2fw_entry_count); 2876 DP_PRINT_STATS("not_to_fw = %u", 2877 dp_stats_buf->not_to_fw); 2878 DP_PRINT_STATS("invalid_pdev_vdev_peer = %u", 2879 dp_stats_buf->invalid_pdev_vdev_peer); 2880 DP_PRINT_STATS("tcl_res_invalid_addrx = %u", 2881 dp_stats_buf->tcl_res_invalid_addrx); 2882 DP_PRINT_STATS("wbm2fw_entry_count = %u", 2883 dp_stats_buf->wbm2fw_entry_count); 2884 DP_PRINT_STATS("invalid_pdev = %u\n", 2885 dp_stats_buf->invalid_pdev); 2886 } 2887 2888 /* 2889 * dp_print_ring_if_stats_tlv: display htt_ring_if_stats_tlv 2890 * @tag_buf: buffer containing the tlv htt_ring_if_stats_tlv 2891 * 2892 * return:void 2893 */ 2894 static void dp_print_ring_if_stats_tlv(uint32_t *tag_buf) 2895 { 2896 htt_ring_if_stats_tlv *dp_stats_buf = 2897 (htt_ring_if_stats_tlv *)tag_buf; 2898 uint8_t i; 2899 uint16_t index = 0; 2900 char *wm_hit_count = qdf_mem_malloc(DP_MAX_STRING_LEN); 2901 2902 if (!wm_hit_count) { 2903 dp_stats_err("Output buffer not allocated"); 2904 return; 2905 } 2906 2907 DP_PRINT_STATS("HTT_RING_IF_STATS_TLV:"); 2908 DP_PRINT_STATS("base_addr = %u", 2909 dp_stats_buf->base_addr); 2910 DP_PRINT_STATS("elem_size = %u", 2911 dp_stats_buf->elem_size); 2912 DP_PRINT_STATS("num_elems__prefetch_tail_idx = %u", 2913 dp_stats_buf->num_elems__prefetch_tail_idx); 2914 DP_PRINT_STATS("head_idx__tail_idx = %u", 2915 dp_stats_buf->head_idx__tail_idx); 2916 DP_PRINT_STATS("shadow_head_idx__shadow_tail_idx = %u", 2917 dp_stats_buf->shadow_head_idx__shadow_tail_idx); 2918 DP_PRINT_STATS("num_tail_incr = %u", 2919 dp_stats_buf->num_tail_incr); 2920 DP_PRINT_STATS("lwm_thresh__hwm_thresh = %u", 2921 dp_stats_buf->lwm_thresh__hwm_thresh); 2922 DP_PRINT_STATS("overrun_hit_count = %u", 2923 dp_stats_buf->overrun_hit_count); 2924 DP_PRINT_STATS("underrun_hit_count = %u", 2925 dp_stats_buf->underrun_hit_count); 2926 DP_PRINT_STATS("prod_blockwait_count = %u", 2927 dp_stats_buf->prod_blockwait_count); 2928 DP_PRINT_STATS("cons_blockwait_count = %u", 2929 dp_stats_buf->cons_blockwait_count); 2930 2931 for (i = 0; i < DP_HTT_LOW_WM_HIT_COUNT_LEN; i++) { 2932 index += qdf_snprint(&wm_hit_count[index], 2933 DP_MAX_STRING_LEN - index, 2934 " %u:%u,", i, 2935 dp_stats_buf->low_wm_hit_count[i]); 2936 } 2937 DP_PRINT_STATS("low_wm_hit_count = %s ", wm_hit_count); 2938 2939 qdf_mem_zero(wm_hit_count, DP_MAX_STRING_LEN); 2940 2941 index = 0; 2942 for (i = 0; i < DP_HTT_HIGH_WM_HIT_COUNT_LEN; i++) { 2943 index += qdf_snprint(&wm_hit_count[index], 2944 DP_MAX_STRING_LEN - index, 2945 " %u:%u,", i, 2946 dp_stats_buf->high_wm_hit_count[i]); 2947 } 2948 DP_PRINT_STATS("high_wm_hit_count = %s\n", wm_hit_count); 2949 } 2950 2951 /* 2952 * dp_print_ring_if_cmn_tlv: display htt_ring_if_cmn_tlv 2953 * @tag_buf: buffer containing the tlv htt_ring_if_cmn_tlv 2954 * 2955 * return:void 2956 */ 2957 static void dp_print_ring_if_cmn_tlv(uint32_t *tag_buf) 2958 { 2959 htt_ring_if_cmn_tlv *dp_stats_buf = 2960 (htt_ring_if_cmn_tlv *)tag_buf; 2961 2962 DP_PRINT_STATS("HTT_RING_IF_CMN_TLV:"); 2963 DP_PRINT_STATS("mac_id__word = %u", 2964 dp_stats_buf->mac_id__word); 2965 DP_PRINT_STATS("num_records = %u\n", 2966 dp_stats_buf->num_records); 2967 } 2968 2969 /* 2970 * dp_print_sfm_client_user_tlv_v: display htt_sfm_client_user_tlv_v 2971 * @tag_buf: buffer containing the tlv htt_sfm_client_user_tlv_v 2972 * 2973 * return:void 2974 */ 2975 static void dp_print_sfm_client_user_tlv_v(uint32_t *tag_buf) 2976 { 2977 htt_sfm_client_user_tlv_v *dp_stats_buf = 2978 (htt_sfm_client_user_tlv_v *)tag_buf; 2979 uint8_t i; 2980 uint16_t index = 0; 2981 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 2982 char *dwords_used_by_user_n = qdf_mem_malloc(DP_MAX_STRING_LEN); 2983 2984 if (!dwords_used_by_user_n) { 2985 dp_stats_err("Output buffer not allocated"); 2986 return; 2987 } 2988 2989 DP_PRINT_STATS("HTT_SFM_CLIENT_USER_TLV_V:"); 2990 for (i = 0; i < tag_len; i++) { 2991 index += qdf_snprint(&dwords_used_by_user_n[index], 2992 DP_MAX_STRING_LEN - index, 2993 " %u:%u,", i, 2994 dp_stats_buf->dwords_used_by_user_n[i]); 2995 } 2996 DP_PRINT_STATS("dwords_used_by_user_n = %s\n", 2997 dwords_used_by_user_n); 2998 qdf_mem_free(dwords_used_by_user_n); 2999 } 3000 3001 /* 3002 * dp_print_sfm_client_tlv: display htt_sfm_client_tlv 3003 * @tag_buf: buffer containing the tlv htt_sfm_client_tlv 3004 * 3005 * return:void 3006 */ 3007 static void dp_print_sfm_client_tlv(uint32_t *tag_buf) 3008 { 3009 htt_sfm_client_tlv *dp_stats_buf = 3010 (htt_sfm_client_tlv *)tag_buf; 3011 3012 DP_PRINT_STATS("HTT_SFM_CLIENT_TLV:"); 3013 DP_PRINT_STATS("client_id = %u", 3014 dp_stats_buf->client_id); 3015 DP_PRINT_STATS("buf_min = %u", 3016 dp_stats_buf->buf_min); 3017 DP_PRINT_STATS("buf_max = %u", 3018 dp_stats_buf->buf_max); 3019 DP_PRINT_STATS("buf_busy = %u", 3020 dp_stats_buf->buf_busy); 3021 DP_PRINT_STATS("buf_alloc = %u", 3022 dp_stats_buf->buf_alloc); 3023 DP_PRINT_STATS("buf_avail = %u", 3024 dp_stats_buf->buf_avail); 3025 DP_PRINT_STATS("num_users = %u\n", 3026 dp_stats_buf->num_users); 3027 } 3028 3029 /* 3030 * dp_print_sfm_cmn_tlv: display htt_sfm_cmn_tlv 3031 * @tag_buf: buffer containing the tlv htt_sfm_cmn_tlv 3032 * 3033 * return:void 3034 */ 3035 static void dp_print_sfm_cmn_tlv(uint32_t *tag_buf) 3036 { 3037 htt_sfm_cmn_tlv *dp_stats_buf = 3038 (htt_sfm_cmn_tlv *)tag_buf; 3039 3040 DP_PRINT_STATS("HTT_SFM_CMN_TLV:"); 3041 DP_PRINT_STATS("mac_id__word = %u", 3042 dp_stats_buf->mac_id__word); 3043 DP_PRINT_STATS("buf_total = %u", 3044 dp_stats_buf->buf_total); 3045 DP_PRINT_STATS("mem_empty = %u", 3046 dp_stats_buf->mem_empty); 3047 DP_PRINT_STATS("deallocate_bufs = %u", 3048 dp_stats_buf->deallocate_bufs); 3049 DP_PRINT_STATS("num_records = %u\n", 3050 dp_stats_buf->num_records); 3051 } 3052 3053 /* 3054 * dp_print_sring_stats_tlv: display htt_sring_stats_tlv 3055 * @tag_buf: buffer containing the tlv htt_sring_stats_tlv 3056 * 3057 * return:void 3058 */ 3059 static void dp_print_sring_stats_tlv(uint32_t *tag_buf) 3060 { 3061 htt_sring_stats_tlv *dp_stats_buf = 3062 (htt_sring_stats_tlv *)tag_buf; 3063 3064 DP_PRINT_STATS("HTT_SRING_STATS_TLV:"); 3065 DP_PRINT_STATS("mac_id__ring_id__arena__ep = %u", 3066 dp_stats_buf->mac_id__ring_id__arena__ep); 3067 DP_PRINT_STATS("base_addr_lsb = %u", 3068 dp_stats_buf->base_addr_lsb); 3069 DP_PRINT_STATS("base_addr_msb = %u", 3070 dp_stats_buf->base_addr_msb); 3071 DP_PRINT_STATS("ring_size = %u", 3072 dp_stats_buf->ring_size); 3073 DP_PRINT_STATS("elem_size = %u", 3074 dp_stats_buf->elem_size); 3075 DP_PRINT_STATS("num_avail_words__num_valid_words = %u", 3076 dp_stats_buf->num_avail_words__num_valid_words); 3077 DP_PRINT_STATS("head_ptr__tail_ptr = %u", 3078 dp_stats_buf->head_ptr__tail_ptr); 3079 DP_PRINT_STATS("consumer_empty__producer_full = %u", 3080 dp_stats_buf->consumer_empty__producer_full); 3081 DP_PRINT_STATS("prefetch_count__internal_tail_ptr = %u\n", 3082 dp_stats_buf->prefetch_count__internal_tail_ptr); 3083 } 3084 3085 /* 3086 * dp_print_sring_cmn_tlv: display htt_sring_cmn_tlv 3087 * @tag_buf: buffer containing the tlv htt_sring_cmn_tlv 3088 * 3089 * return:void 3090 */ 3091 static void dp_print_sring_cmn_tlv(uint32_t *tag_buf) 3092 { 3093 htt_sring_cmn_tlv *dp_stats_buf = 3094 (htt_sring_cmn_tlv *)tag_buf; 3095 3096 DP_PRINT_STATS("HTT_SRING_CMN_TLV:"); 3097 DP_PRINT_STATS("num_records = %u\n", 3098 dp_stats_buf->num_records); 3099 } 3100 3101 /* 3102 * dp_print_tx_pdev_rate_stats_tlv: display htt_tx_pdev_rate_stats_tlv 3103 * @tag_buf: buffer containing the tlv htt_tx_pdev_rate_stats_tlv 3104 * 3105 * return:void 3106 */ 3107 static void dp_print_tx_pdev_rate_stats_tlv(uint32_t *tag_buf) 3108 { 3109 htt_tx_pdev_rate_stats_tlv *dp_stats_buf = 3110 (htt_tx_pdev_rate_stats_tlv *)tag_buf; 3111 uint8_t i, j; 3112 uint16_t index = 0; 3113 char *tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3114 char *tx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3115 char *ac_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3116 char *ax_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3117 char *ofdma_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3118 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 3119 3120 if (!str_buf) { 3121 dp_err("Output buffer not allocated"); 3122 return; 3123 } 3124 3125 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3126 tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3127 tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3128 if (!tx_gi[i] || !tx_gi_ext[i]) { 3129 dp_err("Unable to allocate buffer for tx_gi"); 3130 goto fail1; 3131 } 3132 ac_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3133 if (!ac_mu_mimo_tx_gi[i]) { 3134 dp_err("Unable to allocate buffer for ac_mu_mimo_tx_gi"); 3135 goto fail1; 3136 } 3137 ax_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3138 if (!ax_mu_mimo_tx_gi[i]) { 3139 dp_err("Unable to allocate buffer for ax_mu_mimo_tx_gi"); 3140 goto fail1; 3141 } 3142 ofdma_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN); 3143 if (!ofdma_tx_gi[i]) { 3144 dp_err("Unable to allocate buffer for ofdma_tx_gi"); 3145 goto fail1; 3146 } 3147 } 3148 3149 DP_PRINT_STATS("HTT_TX_PDEV_RATE_STATS_TLV:"); 3150 DP_PRINT_STATS("mac_id__word = %u", 3151 dp_stats_buf->mac_id__word); 3152 DP_PRINT_STATS("tx_ldpc = %u", 3153 dp_stats_buf->tx_ldpc); 3154 DP_PRINT_STATS("rts_cnt = %u", 3155 dp_stats_buf->rts_cnt); 3156 DP_PRINT_STATS("rts_success = %u", 3157 dp_stats_buf->rts_success); 3158 3159 DP_PRINT_STATS("ack_rssi = %u", 3160 dp_stats_buf->ack_rssi); 3161 3162 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3163 for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) { 3164 index += qdf_snprint(&str_buf[index], 3165 DP_MAX_STRING_LEN - index, 3166 " %u:%u,", i, dp_stats_buf->tx_mcs[i]); 3167 } 3168 3169 for (i = 0; i < DP_HTT_TX_MCS_EXT_LEN; i++) { 3170 index += qdf_snprint(&str_buf[index], 3171 DP_MAX_STRING_LEN - index, 3172 " %u:%u,", i + DP_HTT_TX_MCS_LEN, 3173 dp_stats_buf->tx_mcs_ext[i]); 3174 } 3175 3176 for (i = 0; i < DP_HTT_TX_MCS_EXT2_LEN; i++) { 3177 index += qdf_snprint(&str_buf[index], 3178 DP_MAX_STRING_LEN - index, 3179 " %u:%u,", i + DP_HTT_TX_MCS_LEN + 3180 DP_HTT_TX_MCS_EXT_LEN, 3181 dp_stats_buf->tx_mcs_ext_2[i]); 3182 } 3183 DP_PRINT_STATS("tx_mcs = %s ", str_buf); 3184 3185 index = 0; 3186 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3187 for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) { 3188 index += qdf_snprint(&str_buf[index], 3189 DP_MAX_STRING_LEN - index, 3190 " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]); 3191 } 3192 DP_PRINT_STATS("tx_su_mcs = %s ", str_buf); 3193 3194 index = 0; 3195 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3196 for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) { 3197 index += qdf_snprint(&str_buf[index], 3198 DP_MAX_STRING_LEN - index, 3199 " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]); 3200 } 3201 DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf); 3202 3203 index = 0; 3204 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3205 for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) { 3206 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 3207 index += qdf_snprint(&str_buf[index], 3208 DP_MAX_STRING_LEN - index, 3209 " %u:%u,", (i + 1), 3210 dp_stats_buf->tx_nss[i]); 3211 } 3212 DP_PRINT_STATS("tx_nss = %s ", str_buf); 3213 3214 index = 0; 3215 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3216 for (i = 0; i < DP_HTT_TX_BW_LEN; i++) { 3217 index += qdf_snprint(&str_buf[index], 3218 DP_MAX_STRING_LEN - index, 3219 " %u:%u,", i, dp_stats_buf->tx_bw[i]); 3220 } 3221 DP_PRINT_STATS("tx_bw = %s ", str_buf); 3222 3223 DP_PRINT_STATS("tx_bw_320mhz = %u ", dp_stats_buf->tx_bw_320mhz); 3224 3225 index = 0; 3226 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3227 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3228 index += qdf_snprint(&str_buf[index], 3229 DP_MAX_STRING_LEN - index, 3230 " %u:%u,", i, dp_stats_buf->tx_stbc[i]); 3231 } 3232 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 3233 index += qdf_snprint(&str_buf[index], 3234 DP_MAX_STRING_LEN - index, 3235 " %u:%u,", i + HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS, 3236 dp_stats_buf->tx_stbc_ext[i]); 3237 } 3238 DP_PRINT_STATS("tx_stbc = %s ", str_buf); 3239 3240 index = 0; 3241 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3242 for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) { 3243 index += qdf_snprint(&str_buf[index], 3244 DP_MAX_STRING_LEN - index, 3245 " %u:%u,", i, dp_stats_buf->tx_pream[i]); 3246 } 3247 DP_PRINT_STATS("tx_pream = %s ", str_buf); 3248 3249 for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) { 3250 index = 0; 3251 qdf_mem_zero(tx_gi[j], DP_MAX_STRING_LEN); 3252 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3253 index += qdf_snprint(&tx_gi[j][index], 3254 DP_MAX_STRING_LEN - index, 3255 " %u:%u,", i, 3256 dp_stats_buf->tx_gi[j][i]); 3257 } 3258 DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]); 3259 } 3260 3261 for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) { 3262 index = 0; 3263 qdf_mem_zero(tx_gi_ext[j], DP_MAX_STRING_LEN); 3264 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) { 3265 index += qdf_snprint(&tx_gi_ext[j][index], 3266 DP_MAX_STRING_LEN - index, 3267 " %u:%u,", i, 3268 dp_stats_buf->tx_gi_ext[j][i]); 3269 } 3270 DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]); 3271 } 3272 3273 index = 0; 3274 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3275 for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) { 3276 index += qdf_snprint(&str_buf[index], 3277 DP_MAX_STRING_LEN - index, 3278 " %u:%u,", i, dp_stats_buf->tx_dcm[i]); 3279 } 3280 DP_PRINT_STATS("tx_dcm = %s", str_buf); 3281 3282 index = 0; 3283 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3284 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) { 3285 index += qdf_snprint(&str_buf[index], 3286 DP_MAX_STRING_LEN - index, 3287 " %u:%u,", i, 3288 dp_stats_buf->tx_su_punctured_mode[i]); 3289 } 3290 DP_PRINT_STATS("tx_su_punctured_mode = %s\n", str_buf); 3291 3292 DP_PRINT_STATS("rts_success = %u", 3293 dp_stats_buf->rts_success); 3294 DP_PRINT_STATS("ac_mu_mimo_tx_ldpc = %u", 3295 dp_stats_buf->ac_mu_mimo_tx_ldpc); 3296 DP_PRINT_STATS("ax_mu_mimo_tx_ldpc = %u", 3297 dp_stats_buf->ax_mu_mimo_tx_ldpc); 3298 DP_PRINT_STATS("ofdma_tx_ldpc = %u", 3299 dp_stats_buf->ofdma_tx_ldpc); 3300 3301 index = 0; 3302 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3303 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) { 3304 index += qdf_snprint(&str_buf[index], 3305 DP_MAX_STRING_LEN - index, 3306 " %u:%u,", 3307 i, dp_stats_buf->tx_legacy_cck_rate[i]); 3308 } 3309 DP_PRINT_STATS("tx_legacy_cck_rate = %s ", str_buf); 3310 3311 index = 0; 3312 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3313 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) { 3314 index += qdf_snprint(&str_buf[index], 3315 DP_MAX_STRING_LEN - index, 3316 " %u:%u,", i, 3317 dp_stats_buf->tx_legacy_ofdm_rate[i]); 3318 } 3319 DP_PRINT_STATS("tx_legacy_ofdm_rate = %s ", str_buf); 3320 3321 index = 0; 3322 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3323 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LTF; i++) { 3324 index += qdf_snprint(&str_buf[index], 3325 DP_MAX_STRING_LEN - index, 3326 " %u:%u,", 3327 i, dp_stats_buf->tx_he_ltf[i]); 3328 } 3329 DP_PRINT_STATS("tx_he_ltf = %s ", str_buf); 3330 3331 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3332 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3333 index += qdf_snprint(&str_buf[index], 3334 DP_MAX_STRING_LEN - index, 3335 " %u:%u,", 3336 i, dp_stats_buf->ofdma_tx_mcs[i]); 3337 } 3338 DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf); 3339 3340 index = 0; 3341 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3342 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3343 index += qdf_snprint(&str_buf[index], 3344 DP_MAX_STRING_LEN - index, 3345 " %u:%u,", 3346 i, dp_stats_buf->ac_mu_mimo_tx_mcs[i]); 3347 } 3348 DP_PRINT_STATS("ac_mu_mimo_tx_mcs = %s ", str_buf); 3349 3350 index = 0; 3351 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3352 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3353 index += qdf_snprint(&str_buf[index], 3354 DP_MAX_STRING_LEN - index, 3355 " %u:%u,", 3356 i, dp_stats_buf->ax_mu_mimo_tx_mcs[i]); 3357 } 3358 DP_PRINT_STATS("ax_mu_mimo_tx_mcs = %s ", str_buf); 3359 3360 index = 0; 3361 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3362 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3363 index += qdf_snprint(&str_buf[index], 3364 DP_MAX_STRING_LEN - index, 3365 " %u:%u,", 3366 i, dp_stats_buf->ofdma_tx_mcs[i]); 3367 } 3368 DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf); 3369 3370 index = 0; 3371 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3372 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 3373 index += qdf_snprint(&str_buf[index], 3374 DP_MAX_STRING_LEN - index, 3375 " %u:%u,", 3376 i, dp_stats_buf->ac_mu_mimo_tx_nss[i]); 3377 } 3378 DP_PRINT_STATS("ac_mu_mimo_tx_nss = %s ", str_buf); 3379 3380 index = 0; 3381 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3382 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 3383 index += qdf_snprint(&str_buf[index], 3384 DP_MAX_STRING_LEN - index, 3385 " %u:%u,", 3386 i, dp_stats_buf->ax_mu_mimo_tx_nss[i]); 3387 } 3388 DP_PRINT_STATS("ax_mu_mimo_tx_nss = %s ", str_buf); 3389 3390 index = 0; 3391 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3392 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 3393 index += qdf_snprint(&str_buf[index], 3394 DP_MAX_STRING_LEN - index, 3395 " %u:%u,", 3396 i, dp_stats_buf->ofdma_tx_nss[i]); 3397 } 3398 DP_PRINT_STATS("ofdma_tx_nss = %s ", str_buf); 3399 3400 index = 0; 3401 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3402 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3403 index += qdf_snprint(&str_buf[index], 3404 DP_MAX_STRING_LEN - index, 3405 " %u:%u,", 3406 i, dp_stats_buf->ac_mu_mimo_tx_bw[i]); 3407 } 3408 DP_PRINT_STATS("ac_mu_mimo_tx_bw = %s ", str_buf); 3409 3410 index = 0; 3411 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3412 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3413 index += qdf_snprint(&str_buf[index], 3414 DP_MAX_STRING_LEN - index, 3415 " %u:%u,", 3416 i, dp_stats_buf->ax_mu_mimo_tx_bw[i]); 3417 } 3418 DP_PRINT_STATS("ax_mu_mimo_tx_bw = %s ", str_buf); 3419 3420 index = 0; 3421 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3422 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3423 index += qdf_snprint(&str_buf[index], 3424 DP_MAX_STRING_LEN - index, 3425 " %u:%u,", 3426 i, dp_stats_buf->ofdma_tx_bw[i]); 3427 } 3428 3429 DP_PRINT_STATS("ofdma_tx_bw = %s ", str_buf); 3430 3431 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3432 index = 0; 3433 qdf_mem_zero(ac_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN); 3434 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3435 index += qdf_snprint(&ac_mu_mimo_tx_gi[j][index], 3436 DP_MAX_STRING_LEN - index, 3437 " %u:%u,", i, 3438 dp_stats_buf-> 3439 ac_mu_mimo_tx_gi[j][i]); 3440 } 3441 DP_PRINT_STATS("ac_mu_mimo_tx_gi[%u] = %s ", 3442 j, ac_mu_mimo_tx_gi[j]); 3443 } 3444 3445 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3446 index = 0; 3447 qdf_mem_zero(ax_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN); 3448 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3449 index += qdf_snprint(&ax_mu_mimo_tx_gi[j][index], 3450 DP_MAX_STRING_LEN - index, 3451 " %u:%u,", i, 3452 dp_stats_buf->ax_mu_mimo_tx_gi[j][i]); 3453 } 3454 DP_PRINT_STATS("ax_mu_mimo_tx_gi[%u] = %s ", 3455 j, ax_mu_mimo_tx_gi[j]); 3456 } 3457 3458 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3459 index = 0; 3460 qdf_mem_zero(ofdma_tx_gi[j], DP_MAX_STRING_LEN); 3461 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3462 index += qdf_snprint(&ofdma_tx_gi[j][index], 3463 DP_MAX_STRING_LEN - index, 3464 " %u:%u,", i, 3465 dp_stats_buf->ofdma_tx_gi[j][i]); 3466 } 3467 DP_PRINT_STATS("ofdma_tx_gi[%u] = %s ", 3468 j, ofdma_tx_gi[j]); 3469 } 3470 3471 fail1: 3472 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3473 if (tx_gi[i]) 3474 qdf_mem_free(tx_gi[i]); 3475 if (tx_gi_ext[i]) 3476 qdf_mem_free(tx_gi_ext[i]); 3477 if (ac_mu_mimo_tx_gi[i]) 3478 qdf_mem_free(ac_mu_mimo_tx_gi[i]); 3479 if (ax_mu_mimo_tx_gi[i]) 3480 qdf_mem_free(ax_mu_mimo_tx_gi[i]); 3481 if (ofdma_tx_gi[i]) 3482 qdf_mem_free(ofdma_tx_gi[i]); 3483 } 3484 qdf_mem_free(str_buf); 3485 } 3486 3487 /* 3488 * dp_print_rx_pdev_rate_ext_stats_tlv: display htt_rx_pdev_rate_ext_stats_tlv 3489 * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_ext_stats_tlv 3490 * 3491 * return:void 3492 */ 3493 static void dp_print_rx_pdev_rate_ext_stats_tlv(struct dp_pdev *pdev, 3494 uint32_t *tag_buf) 3495 { 3496 htt_rx_pdev_rate_ext_stats_tlv *dp_stats_buf = 3497 (htt_rx_pdev_rate_ext_stats_tlv *)tag_buf; 3498 uint8_t i, j; 3499 uint16_t index = 0; 3500 char *rx_gi_ext[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3501 char *ul_ofdma_rx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0}; 3502 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 3503 3504 if (!str_buf) { 3505 dp_err("Output buffer not allocated"); 3506 return; 3507 } 3508 3509 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3510 rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3511 if (!rx_gi_ext[i]) { 3512 dp_err("Unable to allocate buffer for rx_gi_ext"); 3513 goto fail1; 3514 } 3515 3516 ul_ofdma_rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3517 if (!ul_ofdma_rx_gi_ext[i]) { 3518 dp_err("Unable to allocate buffer for ul_ofdma_rx_gi_ext"); 3519 goto fail1; 3520 } 3521 } 3522 3523 index = 0; 3524 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3525 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3526 index += qdf_snprint(&str_buf[index], 3527 DP_MAX_STRING_LEN - index, 3528 " %u:%u,", i, dp_stats_buf->rx_mcs_ext[i]); 3529 } 3530 3531 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT2; i++) { 3532 index += qdf_snprint(&str_buf[index], 3533 DP_MAX_STRING_LEN - index, 3534 " %u:%u,", i + DP_HTT_RX_PDEV_MCS_LEN_EXT, 3535 dp_stats_buf->rx_mcs_ext_2[i]); 3536 } 3537 DP_PRINT_STATS("rx_mcs_ext = %s ", str_buf); 3538 3539 index = 0; 3540 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3541 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3542 index += qdf_snprint(&str_buf[index], 3543 DP_MAX_STRING_LEN - index, 3544 " %u:%u,", i, dp_stats_buf->rx_stbc_ext[i]); 3545 } 3546 DP_PRINT_STATS("rx_stbc_ext = %s ", str_buf); 3547 3548 for (j = 0; j < DP_HTT_RX_GI_LEN; j++) { 3549 index = 0; 3550 qdf_mem_zero(rx_gi_ext[j], DP_MAX_STRING_LEN); 3551 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3552 index += qdf_snprint(&rx_gi_ext[j][index], 3553 DP_MAX_STRING_LEN - index, 3554 " %u:%u,", i, 3555 dp_stats_buf->rx_gi_ext[j][i]); 3556 } 3557 DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]); 3558 } 3559 3560 index = 0; 3561 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3562 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3563 index += qdf_snprint(&str_buf[index], 3564 DP_MAX_STRING_LEN - index, 3565 " %u:%u,", 3566 i, dp_stats_buf->ul_ofdma_rx_mcs_ext[i]); 3567 } 3568 DP_PRINT_STATS("ul_ofdma_rx_mcs_ext = %s", str_buf); 3569 3570 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3571 index = 0; 3572 qdf_mem_zero(ul_ofdma_rx_gi_ext[j], DP_MAX_STRING_LEN); 3573 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3574 index += qdf_snprint(&ul_ofdma_rx_gi_ext[j][index], 3575 DP_MAX_STRING_LEN - index, 3576 " %u:%u,", i, 3577 dp_stats_buf-> 3578 ul_ofdma_rx_gi_ext[j][i]); 3579 } 3580 DP_PRINT_STATS("ul_ofdma_rx_gi_ext[%u] = %s ", 3581 j, ul_ofdma_rx_gi_ext[j]); 3582 } 3583 3584 index = 0; 3585 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3586 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3587 index += qdf_snprint(&str_buf[index], 3588 DP_MAX_STRING_LEN - index, 3589 " %u:%u,", i, 3590 dp_stats_buf->rx_11ax_su_txbf_mcs_ext[i]); 3591 } 3592 DP_PRINT_STATS("rx_11ax_su_txbf_mcs_ext = %s ", str_buf); 3593 3594 index = 0; 3595 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3596 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3597 index += qdf_snprint(&str_buf[index], 3598 DP_MAX_STRING_LEN - index, 3599 " %u:%u,", i, 3600 dp_stats_buf->rx_11ax_mu_txbf_mcs_ext[i]); 3601 } 3602 DP_PRINT_STATS("rx_11ax_mu_txbf_mcs_ext = %s ", str_buf); 3603 3604 index = 0; 3605 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3606 for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) { 3607 index += qdf_snprint(&str_buf[index], 3608 DP_MAX_STRING_LEN - index, 3609 " %u:%u,", i, 3610 dp_stats_buf->rx_11ax_dl_ofdma_mcs_ext[i]); 3611 } 3612 DP_PRINT_STATS("rx_11ax_dl_ofdma_mcs_ext = %s ", str_buf); 3613 3614 index = 0; 3615 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3616 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_EXT2_COUNTERS; i++) { 3617 index += qdf_snprint(&str_buf[index], 3618 DP_MAX_STRING_LEN - index, 3619 " %u:%u,", i, 3620 dp_stats_buf->rx_bw_ext[i]); 3621 } 3622 DP_PRINT_STATS("rx_bw_ext = %s ", str_buf); 3623 3624 index = 0; 3625 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3626 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) { 3627 index += qdf_snprint(&str_buf[index], 3628 DP_MAX_STRING_LEN - index, 3629 " %u:%u,", i, 3630 dp_stats_buf->rx_su_punctured_mode[i]); 3631 } 3632 DP_PRINT_STATS("rx_su_punctured_mode = %s ", str_buf); 3633 3634 fail1: 3635 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3636 if (ul_ofdma_rx_gi_ext[i]) 3637 qdf_mem_free(ul_ofdma_rx_gi_ext[i]); 3638 if (rx_gi_ext[i]) 3639 qdf_mem_free(rx_gi_ext[i]); 3640 } 3641 3642 qdf_mem_free(str_buf); 3643 } 3644 3645 /* 3646 * dp_print_rx_pdev_rate_stats_tlv: display htt_rx_pdev_rate_stats_tlv 3647 * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv 3648 * 3649 * return:void 3650 */ 3651 static void dp_print_rx_pdev_rate_stats_tlv(struct dp_pdev *pdev, 3652 uint32_t *tag_buf) 3653 { 3654 htt_rx_pdev_rate_stats_tlv *dp_stats_buf = 3655 (htt_rx_pdev_rate_stats_tlv *)tag_buf; 3656 uint8_t i, j; 3657 uint16_t index = 0; 3658 char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN]; 3659 char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS]; 3660 char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN); 3661 char *ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS]; 3662 3663 if (!str_buf) { 3664 dp_err("Output buffer not allocated"); 3665 return; 3666 } 3667 3668 for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) { 3669 rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3670 if (!rssi_chain[i]) { 3671 dp_err("Unable to allocate buffer for rssi_chain"); 3672 goto fail1; 3673 } 3674 } 3675 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3676 rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3677 if (!rx_gi[i]) { 3678 dp_err("Unable to allocate buffer for rx_gi"); 3679 goto fail2; 3680 } 3681 } 3682 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) { 3683 ul_ofdma_rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN); 3684 if (!ul_ofdma_rx_gi[i]) { 3685 dp_err("Unable to allocate buffer for ul_ofdma_rx_gi"); 3686 goto fail3; 3687 } 3688 } 3689 3690 DP_PRINT_STATS("ul_ofdma_data_rx_ppdu = %d", 3691 pdev->stats.ul_ofdma.data_rx_ppdu); 3692 3693 for (i = 0; i < OFDMA_NUM_USERS; i++) { 3694 DP_PRINT_STATS("ul_ofdma data %d user = %d", 3695 i, pdev->stats.ul_ofdma.data_users[i]); 3696 } 3697 3698 index = 0; 3699 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3700 for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) { 3701 index += qdf_snprint(&str_buf[index], 3702 DP_MAX_STRING_LEN - index, 3703 " %u:%u,", i, 3704 pdev->stats.ul_ofdma.data_rx_ru_size[i]); 3705 } 3706 DP_PRINT_STATS("ul_ofdma_data_rx_ru_size= %s", str_buf); 3707 3708 index = 0; 3709 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3710 for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) { 3711 index += qdf_snprint(&str_buf[index], 3712 DP_MAX_STRING_LEN - index, 3713 " %u:%u,", i, 3714 pdev->stats.ul_ofdma.nondata_rx_ru_size[i]); 3715 } 3716 DP_PRINT_STATS("ul_ofdma_nondata_rx_ru_size= %s", str_buf); 3717 3718 DP_PRINT_STATS("HTT_RX_PDEV_RATE_STATS_TLV:"); 3719 DP_PRINT_STATS("mac_id__word = %u", 3720 dp_stats_buf->mac_id__word); 3721 DP_PRINT_STATS("nsts = %u", 3722 dp_stats_buf->nsts); 3723 DP_PRINT_STATS("rx_ldpc = %u", 3724 dp_stats_buf->rx_ldpc); 3725 DP_PRINT_STATS("rts_cnt = %u", 3726 dp_stats_buf->rts_cnt); 3727 DP_PRINT_STATS("rssi_mgmt = %u", 3728 dp_stats_buf->rssi_mgmt); 3729 DP_PRINT_STATS("rssi_data = %u", 3730 dp_stats_buf->rssi_data); 3731 DP_PRINT_STATS("rssi_comb = %u", 3732 dp_stats_buf->rssi_comb); 3733 DP_PRINT_STATS("rssi_in_dbm = %d", 3734 dp_stats_buf->rssi_in_dbm); 3735 DP_PRINT_STATS("rx_11ax_su_ext = %u", 3736 dp_stats_buf->rx_11ax_su_ext); 3737 DP_PRINT_STATS("rx_11ac_mumimo = %u", 3738 dp_stats_buf->rx_11ac_mumimo); 3739 DP_PRINT_STATS("rx_11ax_mumimo = %u", 3740 dp_stats_buf->rx_11ax_mumimo); 3741 DP_PRINT_STATS("rx_11ax_ofdma = %u", 3742 dp_stats_buf->rx_11ax_ofdma); 3743 DP_PRINT_STATS("txbf = %u", 3744 dp_stats_buf->txbf); 3745 DP_PRINT_STATS("rx_su_ndpa = %u", 3746 dp_stats_buf->rx_su_ndpa); 3747 DP_PRINT_STATS("rx_br_poll = %u", 3748 dp_stats_buf->rx_br_poll); 3749 3750 index = 0; 3751 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3752 for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) { 3753 index += qdf_snprint(&str_buf[index], 3754 DP_MAX_STRING_LEN - index, 3755 " %u:%u,", i, dp_stats_buf->rx_mcs[i]); 3756 } 3757 DP_PRINT_STATS("rx_mcs = %s ", str_buf); 3758 3759 index = 0; 3760 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3761 for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) { 3762 /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */ 3763 index += qdf_snprint(&str_buf[index], 3764 DP_MAX_STRING_LEN - index, 3765 " %u:%u,", (i + 1), 3766 dp_stats_buf->rx_nss[i]); 3767 } 3768 DP_PRINT_STATS("rx_nss = %s ", str_buf); 3769 3770 index = 0; 3771 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3772 for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) { 3773 index += qdf_snprint(&str_buf[index], 3774 DP_MAX_STRING_LEN - index, 3775 " %u:%u,", i, dp_stats_buf->rx_dcm[i]); 3776 } 3777 DP_PRINT_STATS("rx_dcm = %s ", str_buf); 3778 3779 index = 0; 3780 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3781 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3782 index += qdf_snprint(&str_buf[index], 3783 DP_MAX_STRING_LEN - index, 3784 " %u:%u,", i, dp_stats_buf->rx_stbc[i]); 3785 } 3786 DP_PRINT_STATS("rx_stbc = %s ", str_buf); 3787 3788 index = 0; 3789 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3790 for (i = 0; i < DP_HTT_RX_BW_LEN; i++) { 3791 index += qdf_snprint(&str_buf[index], 3792 DP_MAX_STRING_LEN - index, 3793 " %u:%u,", i, dp_stats_buf->rx_bw[i]); 3794 } 3795 DP_PRINT_STATS("rx_bw = %s ", str_buf); 3796 3797 for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) { 3798 index = 0; 3799 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3800 index += qdf_snprint(&rssi_chain[j][index], 3801 DP_MAX_STRING_LEN - index, 3802 " %u:%u,", i, 3803 dp_stats_buf->rssi_chain[j][i]); 3804 } 3805 DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]); 3806 } 3807 3808 for (j = 0; j < DP_HTT_RX_GI_LEN; j++) { 3809 index = 0; 3810 qdf_mem_zero(rx_gi[j], DP_MAX_STRING_LEN); 3811 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3812 index += qdf_snprint(&rx_gi[j][index], 3813 DP_MAX_STRING_LEN - index, 3814 " %u:%u,", i, 3815 dp_stats_buf->rx_gi[j][i]); 3816 } 3817 DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]); 3818 } 3819 3820 index = 0; 3821 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3822 for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) { 3823 index += qdf_snprint(&str_buf[index], 3824 DP_MAX_STRING_LEN - index, 3825 " %u:%u,", 3826 i, 3827 dp_stats_buf->rx_pream[i]); 3828 } 3829 DP_PRINT_STATS("rx_pream = %s", str_buf); 3830 3831 index = 0; 3832 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3833 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) { 3834 index += qdf_snprint(&str_buf[index], 3835 DP_MAX_STRING_LEN - index, 3836 " %u:%u,", 3837 i, 3838 dp_stats_buf->rx_legacy_cck_rate[i]); 3839 } 3840 DP_PRINT_STATS("rx_legacy_cck_rate = %s", str_buf); 3841 3842 index = 0; 3843 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3844 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) { 3845 index += qdf_snprint(&str_buf[index], 3846 DP_MAX_STRING_LEN - index, 3847 " %u:%u,", 3848 i, 3849 dp_stats_buf->rx_legacy_ofdm_rate[i]); 3850 } 3851 DP_PRINT_STATS("rx_legacy_ofdm_rate = %s", str_buf); 3852 3853 index = 0; 3854 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3855 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3856 index += qdf_snprint(&str_buf[index], 3857 DP_MAX_STRING_LEN - index, 3858 " %u:%u,", 3859 i, dp_stats_buf->ul_ofdma_rx_mcs[i]); 3860 } 3861 DP_PRINT_STATS("ul_ofdma_rx_mcs = %s", str_buf); 3862 3863 DP_PRINT_STATS("rx_11ax_ul_ofdma = %u", 3864 dp_stats_buf->rx_11ax_ul_ofdma); 3865 3866 for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) { 3867 index = 0; 3868 qdf_mem_zero(ul_ofdma_rx_gi[j], DP_MAX_STRING_LEN); 3869 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3870 index += qdf_snprint(&ul_ofdma_rx_gi[j][index], 3871 DP_MAX_STRING_LEN - index, 3872 " %u:%u,", i, 3873 dp_stats_buf-> 3874 ul_ofdma_rx_gi[j][i]); 3875 } 3876 DP_PRINT_STATS("ul_ofdma_rx_gi[%u] = %s ", 3877 j, ul_ofdma_rx_gi[j]); 3878 } 3879 3880 index = 0; 3881 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3882 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) { 3883 index += qdf_snprint(&str_buf[index], 3884 DP_MAX_STRING_LEN - index, 3885 " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_nss[i]); 3886 } 3887 DP_PRINT_STATS("ul_ofdma_rx_nss = %s", str_buf); 3888 3889 index = 0; 3890 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3891 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) { 3892 index += qdf_snprint(&str_buf[index], 3893 DP_MAX_STRING_LEN - index, 3894 " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_bw[i]); 3895 } 3896 DP_PRINT_STATS("ul_ofdma_rx_bw = %s", str_buf); 3897 DP_PRINT_STATS("ul_ofdma_rx_stbc = %u", 3898 dp_stats_buf->ul_ofdma_rx_stbc); 3899 DP_PRINT_STATS("ul_ofdma_rx_ldpc = %u", 3900 dp_stats_buf->ul_ofdma_rx_ldpc); 3901 3902 index = 0; 3903 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3904 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3905 index += qdf_snprint(&str_buf[index], 3906 DP_MAX_STRING_LEN - index, 3907 " %u:%u,", i, 3908 dp_stats_buf->rx_ulofdma_non_data_ppdu[i]); 3909 } 3910 DP_PRINT_STATS("rx_ulofdma_non_data_ppdu = %s", str_buf); 3911 3912 index = 0; 3913 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3914 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3915 index += qdf_snprint(&str_buf[index], 3916 DP_MAX_STRING_LEN - index, 3917 " %u:%u,", 3918 i, dp_stats_buf->rx_ulofdma_data_ppdu[i]); 3919 } 3920 DP_PRINT_STATS("rx_ulofdma_data_ppdu = %s", str_buf); 3921 3922 index = 0; 3923 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3924 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3925 index += qdf_snprint(&str_buf[index], 3926 DP_MAX_STRING_LEN - index, 3927 " %u:%u,", 3928 i, dp_stats_buf->rx_ulofdma_mpdu_ok[i]); 3929 } 3930 DP_PRINT_STATS("rx_ulofdma_mpdu_ok = %s", str_buf); 3931 3932 index = 0; 3933 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3934 for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) { 3935 index += qdf_snprint(&str_buf[index], 3936 DP_MAX_STRING_LEN - index, 3937 " %u:%u,", 3938 i, dp_stats_buf->rx_ulofdma_mpdu_fail[i]); 3939 } 3940 DP_PRINT_STATS("rx_ulofdma_mpdu_fail = %s", str_buf); 3941 3942 index = 0; 3943 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3944 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3945 index += qdf_snprint(&str_buf[index], 3946 DP_MAX_STRING_LEN - index, 3947 " %u:%u,", 3948 i, dp_stats_buf->rx_11ax_su_txbf_mcs[i]); 3949 } 3950 DP_PRINT_STATS("rx_11ax_su_txbf_mcs = %s", str_buf); 3951 3952 index = 0; 3953 qdf_mem_zero(str_buf, DP_MAX_STRING_LEN); 3954 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) { 3955 index += qdf_snprint(&str_buf[index], 3956 DP_MAX_STRING_LEN - index, 3957 " %u:%u,", 3958 i, dp_stats_buf->rx_11ax_mu_txbf_mcs[i]); 3959 } 3960 DP_PRINT_STATS("rx_11ax_mu_txbf_mcs = %s", str_buf); 3961 3962 for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) 3963 qdf_mem_free(ul_ofdma_rx_gi[i]); 3964 3965 fail3: 3966 for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) 3967 qdf_mem_free(rx_gi[i]); 3968 fail2: 3969 for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) 3970 qdf_mem_free(rssi_chain[i]); 3971 fail1: 3972 qdf_mem_free(str_buf); 3973 3974 } 3975 3976 /* 3977 * dp_print_rx_soc_fw_stats_tlv: display htt_rx_soc_fw_stats_tlv 3978 * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv 3979 * 3980 * return:void 3981 */ 3982 static void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf) 3983 { 3984 htt_rx_soc_fw_stats_tlv *dp_stats_buf = 3985 (htt_rx_soc_fw_stats_tlv *)tag_buf; 3986 3987 DP_PRINT_STATS("HTT_RX_SOC_FW_STATS_TLV:"); 3988 DP_PRINT_STATS("fw_reo_ring_data_msdu = %u", 3989 dp_stats_buf->fw_reo_ring_data_msdu); 3990 DP_PRINT_STATS("fw_to_host_data_msdu_bcmc = %u", 3991 dp_stats_buf->fw_to_host_data_msdu_bcmc); 3992 DP_PRINT_STATS("fw_to_host_data_msdu_uc = %u", 3993 dp_stats_buf->fw_to_host_data_msdu_uc); 3994 DP_PRINT_STATS("ofld_remote_data_buf_recycle_cnt = %u", 3995 dp_stats_buf->ofld_remote_data_buf_recycle_cnt); 3996 DP_PRINT_STATS("ofld_remote_free_buf_indication_cnt = %u", 3997 dp_stats_buf->ofld_remote_free_buf_indication_cnt); 3998 DP_PRINT_STATS("ofld_buf_to_host_data_msdu_uc = %u ", 3999 dp_stats_buf->ofld_buf_to_host_data_msdu_uc); 4000 DP_PRINT_STATS("reo_fw_ring_to_host_data_msdu_uc = %u ", 4001 dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc); 4002 DP_PRINT_STATS("wbm_sw_ring_reap = %u ", 4003 dp_stats_buf->wbm_sw_ring_reap); 4004 DP_PRINT_STATS("wbm_forward_to_host_cnt = %u ", 4005 dp_stats_buf->wbm_forward_to_host_cnt); 4006 DP_PRINT_STATS("wbm_target_recycle_cnt = %u ", 4007 dp_stats_buf->wbm_target_recycle_cnt); 4008 DP_PRINT_STATS("target_refill_ring_recycle_cnt = %u", 4009 dp_stats_buf->target_refill_ring_recycle_cnt); 4010 4011 } 4012 4013 /* 4014 * dp_print_rx_soc_fw_refill_ring_empty_tlv_v: display 4015 * htt_rx_soc_fw_refill_ring_empty_tlv_v 4016 * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v 4017 * 4018 * return:void 4019 */ 4020 static void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf) 4021 { 4022 htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf = 4023 (htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf; 4024 uint8_t i; 4025 uint16_t index = 0; 4026 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4027 char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN); 4028 4029 if (!refill_ring_empty_cnt) { 4030 dp_stats_err("Output buffer not allocated"); 4031 return; 4032 } 4033 4034 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING); 4035 4036 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:"); 4037 for (i = 0; i < tag_len; i++) { 4038 index += qdf_snprint(&refill_ring_empty_cnt[index], 4039 DP_MAX_STRING_LEN - index, 4040 " %u:%u,", i, 4041 dp_stats_buf->refill_ring_empty_cnt[i]); 4042 } 4043 DP_PRINT_STATS("refill_ring_empty_cnt = %s\n", 4044 refill_ring_empty_cnt); 4045 qdf_mem_free(refill_ring_empty_cnt); 4046 } 4047 4048 /* 4049 * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v: display 4050 * htt_rx_soc_fw_refill_ring_num_refill_tlv_v 4051 * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv 4052 * 4053 * return:void 4054 */ 4055 static void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v( 4056 uint32_t *tag_buf) 4057 { 4058 htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf = 4059 (htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf; 4060 uint8_t i; 4061 uint16_t index = 0; 4062 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4063 char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN); 4064 4065 if (!refill_ring_num_refill) { 4066 dp_stats_err("Output buffer not allocated"); 4067 return; 4068 } 4069 4070 tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS); 4071 4072 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:"); 4073 for (i = 0; i < tag_len; i++) { 4074 index += qdf_snprint(&refill_ring_num_refill[index], 4075 DP_MAX_STRING_LEN - index, 4076 " %u:%u,", i, 4077 dp_stats_buf->refill_ring_num_refill[i]); 4078 } 4079 DP_PRINT_STATS("refill_ring_num_refill = %s\n", 4080 refill_ring_num_refill); 4081 qdf_mem_free(refill_ring_num_refill); 4082 } 4083 4084 /* 4085 * dp_print_rx_pdev_fw_stats_tlv: display htt_rx_pdev_fw_stats_tlv 4086 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv 4087 * 4088 * return:void 4089 */ 4090 static void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf) 4091 { 4092 htt_rx_pdev_fw_stats_tlv *dp_stats_buf = 4093 (htt_rx_pdev_fw_stats_tlv *)tag_buf; 4094 uint8_t i; 4095 uint16_t index = 0; 4096 char fw_ring_mgmt_subtype[DP_MAX_STRING_LEN]; 4097 char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN]; 4098 4099 DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:"); 4100 DP_PRINT_STATS("mac_id__word = %u", 4101 dp_stats_buf->mac_id__word); 4102 DP_PRINT_STATS("ppdu_recvd = %u", 4103 dp_stats_buf->ppdu_recvd); 4104 DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u", 4105 dp_stats_buf->mpdu_cnt_fcs_ok); 4106 DP_PRINT_STATS("mpdu_cnt_fcs_err = %u", 4107 dp_stats_buf->mpdu_cnt_fcs_err); 4108 DP_PRINT_STATS("tcp_msdu_cnt = %u", 4109 dp_stats_buf->tcp_msdu_cnt); 4110 DP_PRINT_STATS("tcp_ack_msdu_cnt = %u", 4111 dp_stats_buf->tcp_ack_msdu_cnt); 4112 DP_PRINT_STATS("udp_msdu_cnt = %u", 4113 dp_stats_buf->udp_msdu_cnt); 4114 DP_PRINT_STATS("other_msdu_cnt = %u", 4115 dp_stats_buf->other_msdu_cnt); 4116 DP_PRINT_STATS("fw_ring_mpdu_ind = %u", 4117 dp_stats_buf->fw_ring_mpdu_ind); 4118 4119 for (i = 0; i < DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) { 4120 index += qdf_snprint(&fw_ring_mgmt_subtype[index], 4121 DP_MAX_STRING_LEN - index, 4122 " %u:%u,", i, 4123 dp_stats_buf->fw_ring_mgmt_subtype[i]); 4124 } 4125 DP_PRINT_STATS("fw_ring_mgmt_subtype = %s ", fw_ring_mgmt_subtype); 4126 4127 index = 0; 4128 for (i = 0; i < DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) { 4129 index += qdf_snprint(&fw_ring_ctrl_subtype[index], 4130 DP_MAX_STRING_LEN - index, 4131 " %u:%u,", i, 4132 dp_stats_buf->fw_ring_ctrl_subtype[i]); 4133 } 4134 DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype); 4135 DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u", 4136 dp_stats_buf->fw_ring_mcast_data_msdu); 4137 DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u", 4138 dp_stats_buf->fw_ring_bcast_data_msdu); 4139 DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u", 4140 dp_stats_buf->fw_ring_ucast_data_msdu); 4141 DP_PRINT_STATS("fw_ring_null_data_msdu = %u", 4142 dp_stats_buf->fw_ring_null_data_msdu); 4143 DP_PRINT_STATS("fw_ring_mpdu_drop = %u", 4144 dp_stats_buf->fw_ring_mpdu_drop); 4145 DP_PRINT_STATS("ofld_local_data_ind_cnt = %u", 4146 dp_stats_buf->ofld_local_data_ind_cnt); 4147 DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u", 4148 dp_stats_buf->ofld_local_data_buf_recycle_cnt); 4149 DP_PRINT_STATS("drx_local_data_ind_cnt = %u", 4150 dp_stats_buf->drx_local_data_ind_cnt); 4151 DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u", 4152 dp_stats_buf->drx_local_data_buf_recycle_cnt); 4153 DP_PRINT_STATS("local_nondata_ind_cnt = %u", 4154 dp_stats_buf->local_nondata_ind_cnt); 4155 DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u", 4156 dp_stats_buf->local_nondata_buf_recycle_cnt); 4157 DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u", 4158 dp_stats_buf->fw_status_buf_ring_refill_cnt); 4159 DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u", 4160 dp_stats_buf->fw_status_buf_ring_empty_cnt); 4161 DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u", 4162 dp_stats_buf->fw_pkt_buf_ring_refill_cnt); 4163 DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u", 4164 dp_stats_buf->fw_pkt_buf_ring_empty_cnt); 4165 DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u", 4166 dp_stats_buf->fw_link_buf_ring_refill_cnt); 4167 DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u", 4168 dp_stats_buf->fw_link_buf_ring_empty_cnt); 4169 DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u", 4170 dp_stats_buf->host_pkt_buf_ring_refill_cnt); 4171 DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u", 4172 dp_stats_buf->host_pkt_buf_ring_empty_cnt); 4173 DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u", 4174 dp_stats_buf->mon_pkt_buf_ring_refill_cnt); 4175 DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u", 4176 dp_stats_buf->mon_pkt_buf_ring_empty_cnt); 4177 DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u", 4178 dp_stats_buf->mon_status_buf_ring_refill_cnt); 4179 DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u", 4180 dp_stats_buf->mon_status_buf_ring_empty_cnt); 4181 DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u", 4182 dp_stats_buf->mon_desc_buf_ring_refill_cnt); 4183 DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u", 4184 dp_stats_buf->mon_desc_buf_ring_empty_cnt); 4185 DP_PRINT_STATS("mon_dest_ring_update_cnt = %u", 4186 dp_stats_buf->mon_dest_ring_update_cnt); 4187 DP_PRINT_STATS("mon_dest_ring_full_cnt = %u", 4188 dp_stats_buf->mon_dest_ring_full_cnt); 4189 DP_PRINT_STATS("rx_suspend_cnt = %u", 4190 dp_stats_buf->rx_suspend_cnt); 4191 DP_PRINT_STATS("rx_suspend_fail_cnt = %u", 4192 dp_stats_buf->rx_suspend_fail_cnt); 4193 DP_PRINT_STATS("rx_resume_cnt = %u", 4194 dp_stats_buf->rx_resume_cnt); 4195 DP_PRINT_STATS("rx_resume_fail_cnt = %u", 4196 dp_stats_buf->rx_resume_fail_cnt); 4197 DP_PRINT_STATS("rx_ring_switch_cnt = %u", 4198 dp_stats_buf->rx_ring_switch_cnt); 4199 DP_PRINT_STATS("rx_ring_restore_cnt = %u", 4200 dp_stats_buf->rx_ring_restore_cnt); 4201 DP_PRINT_STATS("rx_flush_cnt = %u\n", 4202 dp_stats_buf->rx_flush_cnt); 4203 } 4204 4205 /* 4206 * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v: display 4207 * htt_rx_pdev_fw_ring_mpdu_err_tlv_v 4208 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v 4209 * 4210 * return:void 4211 */ 4212 static void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf) 4213 { 4214 htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf = 4215 (htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf; 4216 uint8_t i; 4217 uint16_t index = 0; 4218 char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN); 4219 4220 if (!fw_ring_mpdu_err) { 4221 dp_stats_err("Output buffer not allocated"); 4222 return; 4223 } 4224 4225 DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:"); 4226 for (i = 0; i < DP_HTT_FW_RING_MPDU_ERR_LEN; i++) { 4227 index += qdf_snprint(&fw_ring_mpdu_err[index], 4228 DP_MAX_STRING_LEN - index, 4229 " %u:%u,", i, 4230 dp_stats_buf->fw_ring_mpdu_err[i]); 4231 } 4232 DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err); 4233 qdf_mem_free(fw_ring_mpdu_err); 4234 } 4235 4236 /* 4237 * dp_print_rx_pdev_fw_mpdu_drop_tlv_v: display htt_rx_pdev_fw_mpdu_drop_tlv_v 4238 * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v 4239 * 4240 * return:void 4241 */ 4242 static void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf) 4243 { 4244 htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf = 4245 (htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf; 4246 uint8_t i; 4247 uint16_t index = 0; 4248 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4249 char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN); 4250 4251 if (!fw_mpdu_drop) { 4252 dp_stats_err("Output buffer not allocated"); 4253 return; 4254 } 4255 4256 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX); 4257 4258 DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:"); 4259 for (i = 0; i < tag_len; i++) { 4260 index += qdf_snprint(&fw_mpdu_drop[index], 4261 DP_MAX_STRING_LEN - index, 4262 " %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]); 4263 } 4264 DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop); 4265 qdf_mem_free(fw_mpdu_drop); 4266 } 4267 4268 /* 4269 * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error 4270 * packets 4271 * 4272 * tag_buf - Buffer 4273 * Return - NULL 4274 */ 4275 static void dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf) 4276 { 4277 htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf = 4278 (htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf; 4279 4280 uint8_t i; 4281 uint16_t index = 0; 4282 char rxdma_err_cnt[DP_MAX_STRING_LEN]; 4283 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4284 4285 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE); 4286 4287 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V"); 4288 4289 for (i = 0; i < tag_len; i++) { 4290 index += snprintf(&rxdma_err_cnt[index], 4291 DP_MAX_STRING_LEN - index, 4292 " %u:%u,", i, 4293 dp_stats_buf->rxdma_err[i]); 4294 } 4295 4296 DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt); 4297 } 4298 4299 /* 4300 * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error 4301 * packets 4302 * 4303 * tag_buf - Buffer 4304 * Return - NULL 4305 */ 4306 static void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf) 4307 { 4308 htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf = 4309 (htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf; 4310 4311 uint8_t i; 4312 uint16_t index = 0; 4313 char reo_err_cnt[DP_MAX_STRING_LEN]; 4314 uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2); 4315 4316 tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE); 4317 4318 DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V"); 4319 4320 for (i = 0; i < tag_len; i++) { 4321 index += snprintf(&reo_err_cnt[index], 4322 DP_MAX_STRING_LEN - index, 4323 " %u:%u,", i, 4324 dp_stats_buf->reo_err[i]); 4325 } 4326 4327 DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt); 4328 } 4329 4330 /* 4331 * dp_print_rx_reo_debug_stats_tlv() - REO Statistics 4332 * 4333 * tag_buf - Buffer 4334 * Return - NULL 4335 */ 4336 static void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf) 4337 { 4338 htt_rx_reo_resource_stats_tlv_v *dp_stats_buf = 4339 (htt_rx_reo_resource_stats_tlv_v *)tag_buf; 4340 4341 DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV"); 4342 4343 DP_PRINT_STATS("sample_id: %u ", 4344 dp_stats_buf->sample_id); 4345 DP_PRINT_STATS("total_max: %u ", 4346 dp_stats_buf->total_max); 4347 DP_PRINT_STATS("total_avg: %u ", 4348 dp_stats_buf->total_avg); 4349 DP_PRINT_STATS("total_sample: %u ", 4350 dp_stats_buf->total_sample); 4351 DP_PRINT_STATS("non_zeros_avg: %u ", 4352 dp_stats_buf->non_zeros_avg); 4353 DP_PRINT_STATS("non_zeros_sample: %u ", 4354 dp_stats_buf->non_zeros_sample); 4355 DP_PRINT_STATS("last_non_zeros_max: %u ", 4356 dp_stats_buf->last_non_zeros_max); 4357 DP_PRINT_STATS("last_non_zeros_min: %u ", 4358 dp_stats_buf->last_non_zeros_min); 4359 DP_PRINT_STATS("last_non_zeros_avg: %u ", 4360 dp_stats_buf->last_non_zeros_avg); 4361 DP_PRINT_STATS("last_non_zeros_sample: %u\n ", 4362 dp_stats_buf->last_non_zeros_sample); 4363 } 4364 4365 /* 4366 * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors 4367 * 4368 * tag_buf - Buffer 4369 * Return - NULL 4370 */ 4371 static void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf) 4372 { 4373 htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf = 4374 (htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf; 4375 4376 uint8_t i = 0; 4377 uint16_t index = 0; 4378 char phy_errs[DP_MAX_STRING_LEN]; 4379 4380 DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV"); 4381 4382 DP_PRINT_STATS("mac_id_word: %u", 4383 dp_stats_buf->mac_id__word); 4384 DP_PRINT_STATS("total_phy_err_cnt: %u", 4385 dp_stats_buf->total_phy_err_cnt); 4386 4387 for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) { 4388 index += snprintf(&phy_errs[index], 4389 DP_MAX_STRING_LEN - index, 4390 " %u:%u,", i, dp_stats_buf->phy_err[i]); 4391 } 4392 4393 DP_PRINT_STATS("phy_errs: %s\n", phy_errs); 4394 } 4395 4396 /* 4397 * dp_htt_stats_print_tag: function to select the tag type and 4398 * print the corresponding tag structure 4399 * @pdev: pdev pointer 4400 * @tag_type: tag type that is to be printed 4401 * @tag_buf: pointer to the tag structure 4402 * 4403 * return: void 4404 */ 4405 void dp_htt_stats_print_tag(struct dp_pdev *pdev, 4406 uint8_t tag_type, uint32_t *tag_buf) 4407 { 4408 switch (tag_type) { 4409 case HTT_STATS_TX_PDEV_CMN_TAG: 4410 dp_print_tx_pdev_stats_cmn_tlv(tag_buf); 4411 break; 4412 case HTT_STATS_TX_PDEV_UNDERRUN_TAG: 4413 dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf); 4414 break; 4415 case HTT_STATS_TX_PDEV_SIFS_TAG: 4416 dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf); 4417 break; 4418 case HTT_STATS_TX_PDEV_FLUSH_TAG: 4419 dp_print_tx_pdev_stats_flush_tlv_v(tag_buf); 4420 break; 4421 4422 case HTT_STATS_TX_PDEV_PHY_ERR_TAG: 4423 dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf); 4424 break; 4425 4426 case HTT_STATS_STRING_TAG: 4427 dp_print_stats_string_tlv(tag_buf); 4428 break; 4429 4430 case HTT_STATS_TX_HWQ_CMN_TAG: 4431 dp_print_tx_hwq_stats_cmn_tlv(tag_buf); 4432 break; 4433 4434 case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG: 4435 dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf); 4436 break; 4437 4438 case HTT_STATS_TX_HWQ_CMD_RESULT_TAG: 4439 dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf); 4440 break; 4441 4442 case HTT_STATS_TX_HWQ_CMD_STALL_TAG: 4443 dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf); 4444 break; 4445 4446 case HTT_STATS_TX_HWQ_FES_STATUS_TAG: 4447 dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf); 4448 break; 4449 4450 case HTT_STATS_TX_TQM_GEN_MPDU_TAG: 4451 dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf); 4452 break; 4453 4454 case HTT_STATS_TX_TQM_LIST_MPDU_TAG: 4455 dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf); 4456 break; 4457 4458 case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG: 4459 dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf); 4460 break; 4461 4462 case HTT_STATS_TX_TQM_CMN_TAG: 4463 dp_print_tx_tqm_cmn_stats_tlv(tag_buf); 4464 break; 4465 4466 case HTT_STATS_TX_TQM_PDEV_TAG: 4467 dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf); 4468 break; 4469 4470 case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG: 4471 dp_print_tx_tqm_cmdq_status_tlv(tag_buf); 4472 break; 4473 4474 case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG: 4475 dp_print_tx_de_eapol_packets_stats_tlv(tag_buf); 4476 break; 4477 4478 case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG: 4479 dp_print_tx_de_classify_failed_stats_tlv(tag_buf); 4480 break; 4481 4482 case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG: 4483 dp_print_tx_de_classify_stats_tlv(tag_buf); 4484 break; 4485 4486 case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG: 4487 dp_print_tx_de_classify_status_stats_tlv(tag_buf); 4488 break; 4489 4490 case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG: 4491 dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf); 4492 break; 4493 4494 case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG: 4495 dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf); 4496 break; 4497 4498 case HTT_STATS_TX_DE_CMN_TAG: 4499 dp_print_tx_de_cmn_stats_tlv(tag_buf); 4500 break; 4501 4502 case HTT_STATS_RING_IF_TAG: 4503 dp_print_ring_if_stats_tlv(tag_buf); 4504 break; 4505 4506 case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG: 4507 dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf); 4508 break; 4509 4510 case HTT_STATS_SFM_CMN_TAG: 4511 dp_print_sfm_cmn_tlv(tag_buf); 4512 break; 4513 4514 case HTT_STATS_SRING_STATS_TAG: 4515 dp_print_sring_stats_tlv(tag_buf); 4516 break; 4517 4518 case HTT_STATS_RX_PDEV_FW_STATS_TAG: 4519 dp_print_rx_pdev_fw_stats_tlv(tag_buf); 4520 break; 4521 4522 case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG: 4523 dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf); 4524 break; 4525 4526 case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG: 4527 dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf); 4528 break; 4529 4530 case HTT_STATS_RX_SOC_FW_STATS_TAG: 4531 dp_print_rx_soc_fw_stats_tlv(tag_buf); 4532 break; 4533 4534 case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG: 4535 dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf); 4536 break; 4537 4538 case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG: 4539 dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v( 4540 tag_buf); 4541 break; 4542 4543 case HTT_STATS_TX_PDEV_RATE_STATS_TAG: 4544 dp_print_tx_pdev_rate_stats_tlv(tag_buf); 4545 break; 4546 4547 case HTT_STATS_RX_PDEV_RATE_STATS_TAG: 4548 dp_print_rx_pdev_rate_stats_tlv(pdev, tag_buf); 4549 break; 4550 4551 case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG: 4552 dp_print_rx_pdev_rate_ext_stats_tlv(pdev, tag_buf); 4553 break; 4554 4555 case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG: 4556 dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf); 4557 break; 4558 4559 case HTT_STATS_TX_SCHED_CMN_TAG: 4560 dp_print_stats_tx_sched_cmn_tlv(tag_buf); 4561 break; 4562 4563 case HTT_STATS_TX_PDEV_MPDU_STATS_TAG: 4564 dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf); 4565 break; 4566 4567 case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG: 4568 dp_print_sched_txq_cmd_posted_tlv_v(tag_buf); 4569 break; 4570 4571 case HTT_STATS_RING_IF_CMN_TAG: 4572 dp_print_ring_if_cmn_tlv(tag_buf); 4573 break; 4574 4575 case HTT_STATS_SFM_CLIENT_USER_TAG: 4576 dp_print_sfm_client_user_tlv_v(tag_buf); 4577 break; 4578 4579 case HTT_STATS_SFM_CLIENT_TAG: 4580 dp_print_sfm_client_tlv(tag_buf); 4581 break; 4582 4583 case HTT_STATS_TX_TQM_ERROR_STATS_TAG: 4584 dp_print_tx_tqm_error_stats_tlv(tag_buf); 4585 break; 4586 4587 case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG: 4588 dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf); 4589 break; 4590 4591 case HTT_STATS_SRING_CMN_TAG: 4592 dp_print_sring_cmn_tlv(tag_buf); 4593 break; 4594 4595 case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG: 4596 dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf); 4597 break; 4598 4599 case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG: 4600 dp_print_tx_selfgen_cmn_stats_tlv(tag_buf); 4601 break; 4602 4603 case HTT_STATS_TX_SELFGEN_AC_STATS_TAG: 4604 dp_print_tx_selfgen_ac_stats_tlv(tag_buf); 4605 break; 4606 4607 case HTT_STATS_TX_SELFGEN_AX_STATS_TAG: 4608 dp_print_tx_selfgen_ax_stats_tlv(tag_buf); 4609 break; 4610 4611 case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG: 4612 dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf); 4613 break; 4614 4615 case HTT_STATS_TX_SELFGEN_BE_STATS_TAG: 4616 dp_print_tx_selfgen_be_stats_tlv(tag_buf); 4617 break; 4618 4619 case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG: 4620 dp_print_tx_selfgen_be_err_stats_tlv(tag_buf); 4621 break; 4622 4623 case HTT_STATS_TX_SOUNDING_STATS_TAG: 4624 dp_print_tx_sounding_stats_tlv(tag_buf); 4625 break; 4626 4627 case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG: 4628 dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf); 4629 break; 4630 4631 case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG: 4632 dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf); 4633 break; 4634 4635 case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG: 4636 dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf); 4637 break; 4638 4639 case HTT_STATS_HW_INTR_MISC_TAG: 4640 dp_print_hw_stats_intr_misc_tlv(tag_buf); 4641 break; 4642 4643 case HTT_STATS_HW_WD_TIMEOUT_TAG: 4644 dp_print_hw_stats_wd_timeout_tlv(tag_buf); 4645 break; 4646 4647 case HTT_STATS_HW_PDEV_ERRS_TAG: 4648 dp_print_hw_stats_pdev_errs_tlv(tag_buf); 4649 break; 4650 4651 case HTT_STATS_COUNTER_NAME_TAG: 4652 dp_print_counter_tlv(tag_buf); 4653 break; 4654 4655 case HTT_STATS_TX_TID_DETAILS_TAG: 4656 dp_print_tx_tid_stats_tlv(tag_buf); 4657 break; 4658 4659 case HTT_STATS_TX_TID_DETAILS_V1_TAG: 4660 dp_print_tx_tid_stats_v1_tlv(tag_buf); 4661 break; 4662 4663 case HTT_STATS_RX_TID_DETAILS_TAG: 4664 dp_print_rx_tid_stats_tlv(tag_buf); 4665 break; 4666 4667 case HTT_STATS_PEER_STATS_CMN_TAG: 4668 dp_print_peer_stats_cmn_tlv(tag_buf); 4669 break; 4670 4671 case HTT_STATS_PEER_DETAILS_TAG: 4672 dp_print_peer_details_tlv(tag_buf); 4673 break; 4674 4675 case HTT_STATS_PEER_MSDU_FLOWQ_TAG: 4676 dp_print_msdu_flow_stats_tlv(tag_buf); 4677 break; 4678 4679 case HTT_STATS_PEER_TX_RATE_STATS_TAG: 4680 dp_print_tx_peer_rate_stats_tlv(tag_buf); 4681 break; 4682 4683 case HTT_STATS_PEER_RX_RATE_STATS_TAG: 4684 dp_print_rx_peer_rate_stats_tlv(tag_buf); 4685 break; 4686 4687 case HTT_STATS_TX_DE_COMPL_STATS_TAG: 4688 dp_print_tx_de_compl_stats_tlv(tag_buf); 4689 break; 4690 4691 case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG: 4692 dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf); 4693 break; 4694 4695 case HTT_STATS_RX_REFILL_REO_ERR_TAG: 4696 dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf); 4697 break; 4698 4699 case HTT_STATS_RX_REO_RESOURCE_STATS_TAG: 4700 dp_print_rx_reo_debug_stats_tlv(tag_buf); 4701 break; 4702 4703 case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG: 4704 dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf); 4705 break; 4706 4707 default: 4708 break; 4709 } 4710 } 4711 4712 /* 4713 * dp_htt_stats_copy_tag: function to select the tag type and 4714 * copy the corresponding tag structure 4715 * @pdev: DP_PDEV handle 4716 * @tag_type: tag type that is to be printed 4717 * @tag_buf: pointer to the tag structure 4718 * 4719 * return: void 4720 */ 4721 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf) 4722 { 4723 void *dest_ptr = NULL; 4724 uint32_t size = 0; 4725 uint32_t size_expected = 0; 4726 uint64_t val = 1; 4727 4728 pdev->fw_stats_tlv_bitmap_rcvd |= (val << tag_type); 4729 switch (tag_type) { 4730 case HTT_STATS_TX_PDEV_CMN_TAG: 4731 dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv; 4732 size = sizeof(htt_tx_pdev_stats_cmn_tlv); 4733 size_expected = sizeof(struct cdp_htt_tx_pdev_stats_cmn_tlv); 4734 break; 4735 case HTT_STATS_TX_PDEV_UNDERRUN_TAG: 4736 dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv; 4737 size = sizeof(htt_tx_pdev_stats_urrn_tlv_v); 4738 size_expected = sizeof(struct cdp_htt_tx_pdev_stats_urrn_tlv_v); 4739 break; 4740 case HTT_STATS_TX_PDEV_SIFS_TAG: 4741 dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv; 4742 size = sizeof(htt_tx_pdev_stats_sifs_tlv_v); 4743 size_expected = sizeof(struct cdp_htt_tx_pdev_stats_sifs_tlv_v); 4744 break; 4745 case HTT_STATS_TX_PDEV_FLUSH_TAG: 4746 dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv; 4747 size = sizeof(htt_tx_pdev_stats_flush_tlv_v); 4748 size_expected = 4749 sizeof(struct cdp_htt_tx_pdev_stats_flush_tlv_v); 4750 break; 4751 case HTT_STATS_TX_PDEV_PHY_ERR_TAG: 4752 dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv; 4753 size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v); 4754 size_expected = 4755 sizeof(struct cdp_htt_tx_pdev_stats_phy_err_tlv_v); 4756 break; 4757 case HTT_STATS_RX_PDEV_FW_STATS_TAG: 4758 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv; 4759 size = sizeof(htt_rx_pdev_fw_stats_tlv); 4760 size_expected = sizeof(struct cdp_htt_rx_pdev_fw_stats_tlv); 4761 break; 4762 case HTT_STATS_RX_SOC_FW_STATS_TAG: 4763 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv; 4764 size = sizeof(htt_rx_soc_fw_stats_tlv); 4765 size_expected = sizeof(struct cdp_htt_rx_soc_fw_stats_tlv); 4766 break; 4767 case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG: 4768 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv; 4769 size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v); 4770 size_expected = 4771 sizeof(struct cdp_htt_rx_soc_fw_refill_ring_empty_tlv_v); 4772 break; 4773 case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG: 4774 dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv; 4775 size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v); 4776 size_expected = 4777 sizeof(struct cdp_htt_rx_soc_fw_refill_ring_num_refill_tlv_v); 4778 break; 4779 case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG: 4780 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv; 4781 size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v); 4782 size_expected = 4783 sizeof(struct cdp_htt_rx_pdev_fw_ring_mpdu_err_tlv_v); 4784 break; 4785 case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG: 4786 dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop; 4787 size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v); 4788 size_expected = 4789 sizeof(struct cdp_htt_rx_pdev_fw_mpdu_drop_tlv_v); 4790 break; 4791 default: 4792 break; 4793 } 4794 4795 if (size_expected < size) 4796 dp_warn("Buffer Overflow:FW Struct Size:%d Host Struct Size:%d" 4797 , size, size_expected); 4798 4799 if (dest_ptr) 4800 qdf_mem_copy(dest_ptr, tag_buf, size_expected); 4801 4802 if (((pdev->fw_stats_tlv_bitmap_rcvd) & DP_HTT_TX_RX_EXPECTED_TLVS) 4803 == DP_HTT_TX_RX_EXPECTED_TLVS) { 4804 qdf_event_set(&pdev->fw_stats_event); 4805 } 4806 } 4807 4808 #ifdef VDEV_PEER_PROTOCOL_COUNT 4809 #ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING 4810 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev, 4811 bool is_egress, 4812 bool is_rx) 4813 { 4814 int mask; 4815 4816 if (is_egress) 4817 if (is_rx) 4818 mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK; 4819 else 4820 mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK; 4821 else 4822 if (is_rx) 4823 mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK; 4824 else 4825 mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK; 4826 4827 if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) { 4828 dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask); 4829 return QDF_STATUS_SUCCESS; 4830 } 4831 return QDF_STATUS_E_FAILURE; 4832 } 4833 4834 #else 4835 static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev, 4836 bool is_egress, 4837 bool is_rx) 4838 { 4839 return QDF_STATUS_E_FAILURE; 4840 } 4841 #endif 4842 4843 void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev, 4844 qdf_nbuf_t nbuf, 4845 struct dp_txrx_peer *txrx_peer, 4846 bool is_egress, 4847 bool is_rx) 4848 { 4849 struct dp_peer_per_pkt_stats *per_pkt_stats; 4850 struct protocol_trace_count *protocol_trace_cnt; 4851 enum cdp_protocol_trace prot; 4852 struct dp_soc *soc; 4853 struct ether_header *eh; 4854 char *mac; 4855 bool new_peer_ref = false; 4856 struct dp_peer *peer = NULL; 4857 4858 if (qdf_likely(!vdev->peer_protocol_count_track)) 4859 return; 4860 if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev, 4861 is_egress, 4862 is_rx) == 4863 QDF_STATUS_SUCCESS)) 4864 return; 4865 4866 soc = vdev->pdev->soc; 4867 eh = (struct ether_header *)qdf_nbuf_data(nbuf); 4868 if (is_rx) 4869 mac = eh->ether_shost; 4870 else 4871 mac = eh->ether_dhost; 4872 4873 if (!txrx_peer) { 4874 peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id, 4875 DP_MOD_ID_GENERIC_STATS); 4876 new_peer_ref = true; 4877 if (!peer) 4878 return; 4879 4880 txrx_peer = peer->txrx_peer; 4881 if (!txrx_peer) 4882 goto dp_vdev_peer_stats_update_protocol_cnt_free_peer; 4883 } 4884 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 4885 4886 if (qdf_nbuf_is_icmp_pkt(nbuf) == true) 4887 prot = CDP_TRACE_ICMP; 4888 else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true) 4889 prot = CDP_TRACE_ARP; 4890 else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true) 4891 prot = CDP_TRACE_EAP; 4892 else 4893 goto dp_vdev_peer_stats_update_protocol_cnt_free_peer; 4894 4895 if (is_rx) 4896 protocol_trace_cnt = per_pkt_stats->rx.protocol_trace_cnt; 4897 else 4898 protocol_trace_cnt = per_pkt_stats->tx.protocol_trace_cnt; 4899 4900 if (is_egress) 4901 protocol_trace_cnt[prot].egress_cnt++; 4902 else 4903 protocol_trace_cnt[prot].ingress_cnt++; 4904 dp_vdev_peer_stats_update_protocol_cnt_free_peer: 4905 if (new_peer_ref) 4906 dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS); 4907 } 4908 4909 void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl, 4910 int8_t vdev_id, 4911 qdf_nbuf_t nbuf, 4912 bool is_egress, 4913 bool is_rx) 4914 { 4915 struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); 4916 struct dp_vdev *vdev; 4917 4918 vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS); 4919 if (!vdev) 4920 return; 4921 4922 if (qdf_likely(vdev->peer_protocol_count_track)) 4923 dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL, 4924 is_egress, is_rx); 4925 4926 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 4927 } 4928 #endif 4929 4930 #if defined(QCA_ENH_V3_STATS_SUPPORT) || defined(HW_TX_DELAY_STATS_ENABLE) 4931 /** 4932 * dp_vow_str_fw_to_hw_delay() - Return string for a delay 4933 * @index: Index of delay 4934 * 4935 * Return: char const pointer 4936 */ 4937 static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index) 4938 { 4939 if (index > CDP_DELAY_BUCKET_MAX) { 4940 return "Invalid index"; 4941 } 4942 return fw_to_hw_delay_bucket[index]; 4943 } 4944 4945 /** 4946 * dp_accumulate_delay_stats() - Update delay stats members 4947 * @total: Update stats total structure 4948 * @per_ring: per ring structures from where stats need to be accumulated 4949 * 4950 * Return: void 4951 */ 4952 static void 4953 dp_accumulate_delay_stats(struct cdp_delay_stats *total, 4954 struct cdp_delay_stats *per_ring) 4955 { 4956 uint8_t index; 4957 4958 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) 4959 total->delay_bucket[index] += per_ring->delay_bucket[index]; 4960 total->min_delay = QDF_MIN(total->min_delay, per_ring->min_delay); 4961 total->max_delay = QDF_MAX(total->max_delay, per_ring->max_delay); 4962 total->avg_delay = ((total->avg_delay + per_ring->avg_delay) >> 1); 4963 } 4964 #endif 4965 4966 #ifdef QCA_ENH_V3_STATS_SUPPORT 4967 /** 4968 * dp_vow_str_sw_enq_delay() - Return string for a delay 4969 * @index: Index of delay 4970 * 4971 * Return: char const pointer 4972 */ 4973 static inline const char *dp_vow_str_sw_enq_delay(uint8_t index) 4974 { 4975 if (index > CDP_DELAY_BUCKET_MAX) { 4976 return "Invalid index"; 4977 } 4978 return sw_enq_delay_bucket[index]; 4979 } 4980 4981 /** 4982 * dp_vow_str_intfrm_delay() - Return string for a delay 4983 * @index: Index of delay 4984 * 4985 * Return: char const pointer 4986 */ 4987 static inline const char *dp_vow_str_intfrm_delay(uint8_t index) 4988 { 4989 if (index > CDP_DELAY_BUCKET_MAX) { 4990 return "Invalid index"; 4991 } 4992 return intfrm_delay_bucket[index]; 4993 } 4994 4995 /** 4996 * dp_accumulate_tid_stats() - Accumulate TID stats from each ring 4997 * @pdev: pdev handle 4998 * @tid: traffic ID 4999 * @total_tx: fill this tx structure to get stats from all wbm rings 5000 * @total_rx: fill this rx structure to get stats from all reo rings 5001 * @type: delay stats or regular frame counters 5002 * 5003 * Return: void 5004 */ 5005 static void 5006 dp_accumulate_tid_stats(struct dp_pdev *pdev, uint8_t tid, 5007 struct cdp_tid_tx_stats *total_tx, 5008 struct cdp_tid_rx_stats *total_rx, uint8_t type) 5009 { 5010 uint8_t i = 0, ring_id = 0, drop = 0, tqm_status_idx = 0, htt_status_idx = 0; 5011 struct cdp_tid_stats *tid_stats = &pdev->stats.tid_stats; 5012 struct cdp_tid_tx_stats *per_ring_tx = NULL; 5013 struct cdp_tid_rx_stats *per_ring_rx = NULL; 5014 5015 if (wlan_cfg_get_dp_soc_nss_cfg(pdev->soc->wlan_cfg_ctx)) { 5016 qdf_mem_copy(total_tx, &tid_stats->tid_tx_stats[0][tid], 5017 sizeof(struct cdp_tid_tx_stats)); 5018 qdf_mem_copy(total_rx, &tid_stats->tid_rx_stats[0][tid], 5019 sizeof(struct cdp_tid_rx_stats)); 5020 return; 5021 } else { 5022 qdf_mem_zero(total_tx, sizeof(struct cdp_tid_tx_stats)); 5023 qdf_mem_zero(total_rx, sizeof(struct cdp_tid_rx_stats)); 5024 } 5025 5026 switch (type) { 5027 case TID_COUNTER_STATS: 5028 { 5029 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5030 per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid]; 5031 total_tx->success_cnt += per_ring_tx->success_cnt; 5032 total_tx->comp_fail_cnt += per_ring_tx->comp_fail_cnt; 5033 for (tqm_status_idx = 0; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) { 5034 total_tx->tqm_status_cnt[tqm_status_idx] += 5035 per_ring_tx->tqm_status_cnt[tqm_status_idx]; 5036 } 5037 5038 for (htt_status_idx = 0; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) { 5039 total_tx->htt_status_cnt[htt_status_idx] += 5040 per_ring_tx->htt_status_cnt[htt_status_idx]; 5041 } 5042 5043 for (drop = 0; drop < TX_MAX_DROP; drop++) 5044 total_tx->swdrop_cnt[drop] += 5045 per_ring_tx->swdrop_cnt[drop]; 5046 } 5047 for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) { 5048 per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid]; 5049 total_rx->delivered_to_stack += 5050 per_ring_rx->delivered_to_stack; 5051 total_rx->intrabss_cnt += per_ring_rx->intrabss_cnt; 5052 total_rx->msdu_cnt += per_ring_rx->msdu_cnt; 5053 total_rx->mcast_msdu_cnt += per_ring_rx->mcast_msdu_cnt; 5054 total_rx->bcast_msdu_cnt += per_ring_rx->bcast_msdu_cnt; 5055 for (drop = 0; drop < RX_MAX_DROP; drop++) 5056 total_rx->fail_cnt[drop] += 5057 per_ring_rx->fail_cnt[drop]; 5058 } 5059 break; 5060 } 5061 5062 case TID_DELAY_STATS: 5063 { 5064 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5065 per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid]; 5066 dp_accumulate_delay_stats(&total_tx->swq_delay, 5067 &per_ring_tx->swq_delay); 5068 dp_accumulate_delay_stats(&total_tx->hwtx_delay, 5069 &per_ring_tx->hwtx_delay); 5070 dp_accumulate_delay_stats(&total_tx->intfrm_delay, 5071 &per_ring_tx->intfrm_delay); 5072 } 5073 for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) { 5074 per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid]; 5075 dp_accumulate_delay_stats(&total_rx->intfrm_delay, 5076 &per_ring_rx->intfrm_delay); 5077 dp_accumulate_delay_stats(&total_rx->to_stack_delay, 5078 &per_ring_rx->to_stack_delay); 5079 } 5080 break; 5081 } 5082 5083 case TID_RX_ERROR_STATS: 5084 { 5085 for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) { 5086 per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid]; 5087 total_rx->reo_err.err_src_reo_code_inv += per_ring_rx->reo_err.err_src_reo_code_inv; 5088 for (i = 0; i < CDP_REO_CODE_MAX; i++) { 5089 total_rx->reo_err.err_reo_codes[i] += per_ring_rx->reo_err.err_reo_codes[i]; 5090 } 5091 5092 total_rx->rxdma_err.err_src_rxdma_code_inv += per_ring_rx->rxdma_err.err_src_rxdma_code_inv; 5093 for (i = 0; i < CDP_DMA_CODE_MAX; i++) { 5094 total_rx->rxdma_err.err_dma_codes[i] += per_ring_rx->rxdma_err.err_dma_codes[i]; 5095 } 5096 } 5097 break; 5098 } 5099 default: 5100 qdf_err("Invalid stats type"); 5101 break; 5102 } 5103 } 5104 5105 void dp_pdev_print_tid_stats(struct dp_pdev *pdev) 5106 { 5107 struct cdp_tid_tx_stats total_tx; 5108 struct cdp_tid_rx_stats total_rx; 5109 uint8_t tid, tqm_status_idx, htt_status_idx; 5110 5111 DP_PRINT_STATS("Packets received in hardstart: %llu ", 5112 pdev->stats.tid_stats.ingress_stack); 5113 DP_PRINT_STATS("Packets dropped in osif layer: %llu ", 5114 pdev->stats.tid_stats.osif_drop); 5115 DP_PRINT_STATS("Per TID Video Stats:\n"); 5116 5117 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5118 dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx, 5119 TID_COUNTER_STATS); 5120 DP_PRINT_STATS("----TID: %d----", tid); 5121 DP_PRINT_STATS("Tx TQM Success Count: %llu", 5122 total_tx.tqm_status_cnt[HAL_TX_TQM_RR_FRAME_ACKED]); 5123 DP_PRINT_STATS("Tx HTT Success Count: %llu", 5124 total_tx.htt_status_cnt[HTT_TX_FW2WBM_TX_STATUS_OK]); 5125 for (tqm_status_idx = 1; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) { 5126 if (total_tx.tqm_status_cnt[tqm_status_idx]) { 5127 DP_PRINT_STATS("Tx TQM Drop Count[%d]: %llu", 5128 tqm_status_idx, total_tx.tqm_status_cnt[tqm_status_idx]); 5129 } 5130 } 5131 5132 for (htt_status_idx = 1; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) { 5133 if (total_tx.htt_status_cnt[htt_status_idx]) { 5134 DP_PRINT_STATS("Tx HTT Drop Count[%d]: %llu", 5135 htt_status_idx, total_tx.htt_status_cnt[htt_status_idx]); 5136 } 5137 } 5138 5139 DP_PRINT_STATS("Tx Hardware Drop Count: %llu", 5140 total_tx.swdrop_cnt[TX_HW_ENQUEUE]); 5141 DP_PRINT_STATS("Tx Software Drop Count: %llu", 5142 total_tx.swdrop_cnt[TX_SW_ENQUEUE]); 5143 DP_PRINT_STATS("Tx Descriptor Error Count: %llu", 5144 total_tx.swdrop_cnt[TX_DESC_ERR]); 5145 DP_PRINT_STATS("Tx HAL Ring Error Count: %llu", 5146 total_tx.swdrop_cnt[TX_HAL_RING_ACCESS_ERR]); 5147 DP_PRINT_STATS("Tx Dma Map Error Count: %llu", 5148 total_tx.swdrop_cnt[TX_DMA_MAP_ERR]); 5149 DP_PRINT_STATS("Rx Delievered Count: %llu", 5150 total_rx.delivered_to_stack); 5151 DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu", 5152 total_rx.fail_cnt[ENQUEUE_DROP]); 5153 DP_PRINT_STATS("Rx Intrabss Drop Count: %llu", 5154 total_rx.fail_cnt[INTRABSS_DROP]); 5155 DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu", 5156 total_rx.fail_cnt[MSDU_DONE_FAILURE]); 5157 DP_PRINT_STATS("Rx Invalid Peer Count: %llu", 5158 total_rx.fail_cnt[INVALID_PEER_VDEV]); 5159 DP_PRINT_STATS("Rx Policy Check Drop Count: %llu", 5160 total_rx.fail_cnt[POLICY_CHECK_DROP]); 5161 DP_PRINT_STATS("Rx Mec Drop Count: %llu", 5162 total_rx.fail_cnt[MEC_DROP]); 5163 DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu", 5164 total_rx.fail_cnt[NAWDS_MCAST_DROP]); 5165 DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu", 5166 total_rx.fail_cnt[MESH_FILTER_DROP]); 5167 DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu", 5168 total_rx.intrabss_cnt); 5169 DP_PRINT_STATS("Rx MSDU Count: %llu", total_rx.msdu_cnt); 5170 DP_PRINT_STATS("Rx Multicast MSDU Count: %llu", 5171 total_rx.mcast_msdu_cnt); 5172 DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n", 5173 total_rx.bcast_msdu_cnt); 5174 } 5175 } 5176 5177 void dp_pdev_print_delay_stats(struct dp_pdev *pdev) 5178 { 5179 struct dp_soc *soc = pdev->soc; 5180 struct cdp_tid_tx_stats total_tx; 5181 struct cdp_tid_rx_stats total_rx; 5182 struct cdp_tid_stats *tid_stats; 5183 5184 uint8_t tid, index; 5185 uint64_t count = 0; 5186 5187 if (!soc) 5188 return; 5189 5190 tid = 0; 5191 index = 0; 5192 tid_stats = &pdev->stats.tid_stats; 5193 5194 DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n"); 5195 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5196 dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx, 5197 TID_DELAY_STATS); 5198 DP_PRINT_STATS("----TID: %d----", tid); 5199 5200 DP_PRINT_STATS("Software Enqueue Delay:"); 5201 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5202 count = total_tx.swq_delay.delay_bucket[index]; 5203 if (count) { 5204 DP_PRINT_STATS("%s: Packets = %llu", 5205 dp_vow_str_sw_enq_delay(index), 5206 count); 5207 } 5208 } 5209 5210 DP_PRINT_STATS("Min = %u", total_tx.swq_delay.min_delay); 5211 DP_PRINT_STATS("Max = %u", total_tx.swq_delay.max_delay); 5212 DP_PRINT_STATS("Avg = %u\n", total_tx.swq_delay.avg_delay); 5213 5214 DP_PRINT_STATS("Hardware Transmission Delay:"); 5215 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5216 count = total_tx.hwtx_delay.delay_bucket[index]; 5217 if (count) { 5218 DP_PRINT_STATS("%s: Packets = %llu", 5219 dp_vow_str_fw_to_hw_delay(index), 5220 count); 5221 } 5222 } 5223 DP_PRINT_STATS("Min = %u", total_tx.hwtx_delay.min_delay); 5224 DP_PRINT_STATS("Max = %u", total_tx.hwtx_delay.max_delay); 5225 DP_PRINT_STATS("Avg = %u\n", total_tx.hwtx_delay.avg_delay); 5226 5227 DP_PRINT_STATS("Tx Interframe Delay:"); 5228 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5229 count = total_tx.intfrm_delay.delay_bucket[index]; 5230 if (count) { 5231 DP_PRINT_STATS("%s: Packets = %llu", 5232 dp_vow_str_intfrm_delay(index), 5233 count); 5234 } 5235 } 5236 DP_PRINT_STATS("Min = %u", total_tx.intfrm_delay.min_delay); 5237 DP_PRINT_STATS("Max = %u", total_tx.intfrm_delay.max_delay); 5238 DP_PRINT_STATS("Avg = %u\n", total_tx.intfrm_delay.avg_delay); 5239 5240 DP_PRINT_STATS("Rx Interframe Delay:"); 5241 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5242 count = total_rx.intfrm_delay.delay_bucket[index]; 5243 if (count) { 5244 DP_PRINT_STATS("%s: Packets = %llu", 5245 dp_vow_str_intfrm_delay(index), 5246 count); 5247 } 5248 } 5249 DP_PRINT_STATS("Min = %u", total_rx.intfrm_delay.min_delay); 5250 DP_PRINT_STATS("Max = %u", total_rx.intfrm_delay.max_delay); 5251 DP_PRINT_STATS("Avg = %u\n", total_rx.intfrm_delay.avg_delay); 5252 5253 DP_PRINT_STATS("Rx Reap to Stack Delay:"); 5254 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5255 count = total_rx.to_stack_delay.delay_bucket[index]; 5256 if (count) { 5257 DP_PRINT_STATS("%s: Packets = %llu", 5258 dp_vow_str_intfrm_delay(index), 5259 count); 5260 } 5261 } 5262 5263 DP_PRINT_STATS("Min = %u", total_rx.to_stack_delay.min_delay); 5264 DP_PRINT_STATS("Max = %u", total_rx.to_stack_delay.max_delay); 5265 DP_PRINT_STATS("Avg = %u\n", total_rx.to_stack_delay.avg_delay); 5266 } 5267 } 5268 5269 void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev) 5270 { 5271 struct dp_soc *soc = pdev->soc; 5272 struct cdp_tid_rx_stats total_rx; 5273 struct cdp_tid_tx_stats total_tx; 5274 struct cdp_tid_stats *tid_stats; 5275 5276 uint8_t tid, index; 5277 5278 if (!soc) 5279 return; 5280 5281 tid_stats = &pdev->stats.tid_stats; 5282 5283 DP_PRINT_STATS("Per TID RX Error Stats:\n"); 5284 for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) { 5285 dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx, 5286 TID_RX_ERROR_STATS); 5287 DP_PRINT_STATS("----TID: %d----", tid + 4); 5288 5289 DP_PRINT_STATS("Rx REO Error stats:"); 5290 DP_PRINT_STATS("err_src_reo_code_inv = %llu", total_rx.reo_err.err_src_reo_code_inv); 5291 for (index = 0; index < CDP_REO_CODE_MAX; index++) { 5292 DP_PRINT_STATS("err src reo codes: %d = %llu", index, total_rx.reo_err.err_reo_codes[index]); 5293 } 5294 5295 DP_PRINT_STATS("Rx Rxdma Error stats:"); 5296 DP_PRINT_STATS("err_src_rxdma_code_inv = %llu", total_rx.rxdma_err.err_src_rxdma_code_inv); 5297 for (index = 0; index < CDP_DMA_CODE_MAX; index++) { 5298 DP_PRINT_STATS("err src dma codes: %d = %llu", index, total_rx.rxdma_err.err_dma_codes[index]); 5299 } 5300 } 5301 } 5302 5303 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 5304 struct cdp_tid_stats_intf *tid_stats) 5305 { 5306 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 5307 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 5308 struct cdp_tid_rx_stats rx; 5309 struct cdp_tid_tx_stats tx; 5310 uint8_t tid; 5311 uint32_t size; 5312 5313 if (!pdev) 5314 return QDF_STATUS_E_INVAL; 5315 5316 size = sizeof(struct cdp_delay_stats); 5317 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5318 dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_COUNTER_STATS); 5319 /* Copy specific accumulated Tx tid stats */ 5320 tid_stats->tx_total[tid].success_cnt = tx.success_cnt; 5321 tid_stats->tx_total[tid].comp_fail_cnt = tx.comp_fail_cnt; 5322 qdf_mem_copy(&tid_stats->tx_total[tid].tqm_status_cnt[0], 5323 &tx.tqm_status_cnt[0], 5324 CDP_MAX_TX_TQM_STATUS * sizeof(uint64_t)); 5325 qdf_mem_copy(&tid_stats->tx_total[tid].htt_status_cnt[0], 5326 &tx.htt_status_cnt[0], 5327 CDP_MAX_TX_HTT_STATUS * sizeof(uint64_t)); 5328 qdf_mem_copy(&tid_stats->tx_total[tid].swdrop_cnt[0], 5329 &tx.swdrop_cnt[0], TX_MAX_DROP * sizeof(uint64_t)); 5330 5331 /* Copy specific accumulated Rx tid stats */ 5332 tid_stats->rx_total[tid].delivered_to_stack = 5333 rx.delivered_to_stack; 5334 tid_stats->rx_total[tid].intrabss_cnt = rx.intrabss_cnt; 5335 tid_stats->rx_total[tid].msdu_cnt = rx.msdu_cnt; 5336 tid_stats->rx_total[tid].mcast_msdu_cnt = rx.mcast_msdu_cnt; 5337 tid_stats->rx_total[tid].bcast_msdu_cnt = rx.bcast_msdu_cnt; 5338 qdf_mem_copy(&tid_stats->rx_total[tid].fail_cnt[0], 5339 &rx.fail_cnt[0], RX_MAX_DROP * sizeof(uint64_t)); 5340 5341 dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_DELAY_STATS); 5342 /* Copy specific accumulated Tx delay stats */ 5343 qdf_mem_copy(&tid_stats->tx_total[tid].swq_delay, 5344 &tx.swq_delay, size); 5345 qdf_mem_copy(&tid_stats->tx_total[tid].hwtx_delay, 5346 &tx.hwtx_delay, size); 5347 qdf_mem_copy(&tid_stats->tx_total[tid].intfrm_delay, 5348 &tx.intfrm_delay, size); 5349 5350 /* Copy specific accumulated Rx delay stats */ 5351 qdf_mem_copy(&tid_stats->rx_total[tid].intfrm_delay, 5352 &rx.intfrm_delay, size); 5353 qdf_mem_copy(&tid_stats->rx_total[tid].to_stack_delay, 5354 &rx.to_stack_delay, size); 5355 } 5356 for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) { 5357 dp_accumulate_tid_stats(pdev, tid, &tx, &rx, 5358 TID_RX_ERROR_STATS); 5359 /* Copy specific accumulated VOW Rx stats */ 5360 qdf_mem_copy(&tid_stats->rx_total[tid].reo_err, 5361 &rx.reo_err, sizeof(struct cdp_reo_error_stats)); 5362 qdf_mem_copy(&tid_stats->rx_total[tid].rxdma_err, &rx.rxdma_err, 5363 sizeof(struct cdp_rxdma_error_stats)); 5364 } 5365 tid_stats->ingress_stack = pdev->stats.tid_stats.ingress_stack; 5366 tid_stats->osif_drop = pdev->stats.tid_stats.osif_drop; 5367 5368 return QDF_STATUS_SUCCESS; 5369 } 5370 #else 5371 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 5372 struct cdp_tid_stats_intf *tid_stats) 5373 { 5374 return QDF_STATUS_E_INVAL; 5375 } 5376 #endif 5377 5378 #ifdef HW_TX_DELAY_STATS_ENABLE 5379 static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev) 5380 { 5381 struct cdp_delay_stats delay_stats; 5382 struct cdp_tid_tx_stats *per_ring; 5383 uint8_t tid, index; 5384 uint64_t count = 0; 5385 uint8_t ring_id; 5386 5387 if (!vdev) 5388 return; 5389 5390 DP_PRINT_STATS("vdev_id: %d Per TID Delay Non-Zero Stats:\n", 5391 vdev->vdev_id); 5392 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5393 qdf_mem_zero(&delay_stats, sizeof(delay_stats)); 5394 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5395 per_ring = &vdev->stats.tid_tx_stats[ring_id][tid]; 5396 dp_accumulate_delay_stats(&delay_stats, 5397 &per_ring->hwtx_delay); 5398 } 5399 5400 DP_PRINT_STATS("Hardware Tx completion latency stats TID: %d", 5401 tid); 5402 for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) { 5403 count = delay_stats.delay_bucket[index]; 5404 if (count) { 5405 DP_PRINT_STATS("%s: Packets = %llu", 5406 dp_vow_str_fw_to_hw_delay(index), 5407 count); 5408 } 5409 } 5410 5411 DP_PRINT_STATS("Min = %u", delay_stats.min_delay); 5412 DP_PRINT_STATS("Max = %u", delay_stats.max_delay); 5413 DP_PRINT_STATS("Avg = %u\n", delay_stats.avg_delay); 5414 } 5415 } 5416 5417 void dp_pdev_print_tx_delay_stats(struct dp_soc *soc) 5418 { 5419 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0); 5420 struct dp_vdev *vdev; 5421 struct dp_vdev **vdev_array = NULL; 5422 int index = 0, num_vdev = 0; 5423 5424 if (!pdev) { 5425 dp_err("pdev is NULL"); 5426 return; 5427 } 5428 5429 vdev_array = 5430 qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS); 5431 if (!vdev_array) 5432 return; 5433 5434 qdf_spin_lock_bh(&pdev->vdev_list_lock); 5435 DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) { 5436 if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS)) 5437 continue; 5438 vdev_array[index] = vdev; 5439 index = index + 1; 5440 } 5441 qdf_spin_unlock_bh(&pdev->vdev_list_lock); 5442 5443 num_vdev = index; 5444 5445 for (index = 0; index < num_vdev; index++) { 5446 vdev = vdev_array[index]; 5447 dp_vdev_print_tx_delay_stats(vdev); 5448 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 5449 } 5450 qdf_mem_free(vdev_array); 5451 } 5452 5453 /** 5454 * dp_reset_delay_stats() - reset delay stats 5455 * @per_ring: per ring structures from where stats need to be accumulated 5456 * 5457 * Return: void 5458 */ 5459 static void dp_reset_delay_stats(struct cdp_delay_stats *per_ring) 5460 { 5461 qdf_mem_zero(per_ring, sizeof(struct cdp_delay_stats)); 5462 } 5463 5464 /** 5465 * dp_vdev_init_tx_delay_stats() - Clear tx delay stats 5466 * @vdev: vdev handle 5467 * 5468 * Return: None 5469 */ 5470 static void dp_vdev_init_tx_delay_stats(struct dp_vdev *vdev) 5471 { 5472 struct cdp_tid_tx_stats *per_ring; 5473 uint8_t tid; 5474 uint8_t ring_id; 5475 5476 if (!vdev) 5477 return; 5478 5479 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 5480 for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) { 5481 per_ring = &vdev->stats.tid_tx_stats[ring_id][tid]; 5482 dp_reset_delay_stats(&per_ring->hwtx_delay); 5483 } 5484 } 5485 } 5486 5487 void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc) 5488 { 5489 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0); 5490 struct dp_vdev *vdev; 5491 struct dp_vdev **vdev_array = NULL; 5492 int index = 0, num_vdev = 0; 5493 5494 if (!pdev) { 5495 dp_err("pdev is NULL"); 5496 return; 5497 } 5498 5499 vdev_array = 5500 qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS); 5501 if (!vdev_array) 5502 return; 5503 5504 qdf_spin_lock_bh(&pdev->vdev_list_lock); 5505 DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) { 5506 if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS) != 5507 QDF_STATUS_SUCCESS) 5508 continue; 5509 vdev_array[index] = vdev; 5510 index = index + 1; 5511 } 5512 qdf_spin_unlock_bh(&pdev->vdev_list_lock); 5513 5514 num_vdev = index; 5515 5516 for (index = 0; index < num_vdev; index++) { 5517 vdev = vdev_array[index]; 5518 dp_vdev_init_tx_delay_stats(vdev); 5519 dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS); 5520 } 5521 qdf_mem_free(vdev_array); 5522 } 5523 #endif 5524 5525 void dp_print_soc_cfg_params(struct dp_soc *soc) 5526 { 5527 struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx; 5528 uint8_t index = 0, i = 0; 5529 char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH]; 5530 int num_of_int_contexts; 5531 5532 if (!soc) { 5533 dp_err("Context is null"); 5534 return; 5535 } 5536 5537 soc_cfg_ctx = soc->wlan_cfg_ctx; 5538 5539 if (!soc_cfg_ctx) { 5540 dp_err("Context is null"); 5541 return; 5542 } 5543 5544 num_of_int_contexts = 5545 wlan_cfg_get_num_contexts(soc_cfg_ctx); 5546 5547 DP_PRINT_STATS("No. of interrupt contexts: %u", 5548 soc_cfg_ctx->num_int_ctxts); 5549 DP_PRINT_STATS("Max clients: %u", 5550 soc_cfg_ctx->max_clients); 5551 DP_PRINT_STATS("Max alloc size: %u ", 5552 soc_cfg_ctx->max_alloc_size); 5553 DP_PRINT_STATS("Per pdev tx ring: %u ", 5554 soc_cfg_ctx->per_pdev_tx_ring); 5555 DP_PRINT_STATS("Num tcl data rings: %u ", 5556 soc_cfg_ctx->num_tcl_data_rings); 5557 DP_PRINT_STATS("Per pdev rx ring: %u ", 5558 soc_cfg_ctx->per_pdev_rx_ring); 5559 DP_PRINT_STATS("Per pdev lmac ring: %u ", 5560 soc_cfg_ctx->per_pdev_lmac_ring); 5561 DP_PRINT_STATS("Num of reo dest rings: %u ", 5562 soc_cfg_ctx->num_reo_dest_rings); 5563 DP_PRINT_STATS("Num tx desc pool: %u ", 5564 soc_cfg_ctx->num_tx_desc_pool); 5565 DP_PRINT_STATS("Num tx ext desc pool: %u ", 5566 soc_cfg_ctx->num_tx_ext_desc_pool); 5567 DP_PRINT_STATS("Num tx desc: %u ", 5568 soc_cfg_ctx->num_tx_desc); 5569 DP_PRINT_STATS("Num tx ext desc: %u ", 5570 soc_cfg_ctx->num_tx_ext_desc); 5571 DP_PRINT_STATS("Htt packet type: %u ", 5572 soc_cfg_ctx->htt_packet_type); 5573 DP_PRINT_STATS("Max peer_ids: %u ", 5574 soc_cfg_ctx->max_peer_id); 5575 DP_PRINT_STATS("Tx ring size: %u ", 5576 soc_cfg_ctx->tx_ring_size); 5577 DP_PRINT_STATS("Tx comp ring size: %u ", 5578 soc_cfg_ctx->tx_comp_ring_size); 5579 DP_PRINT_STATS("Tx comp ring size nss: %u ", 5580 soc_cfg_ctx->tx_comp_ring_size_nss); 5581 DP_PRINT_STATS("Int batch threshold tx: %u ", 5582 soc_cfg_ctx->int_batch_threshold_tx); 5583 DP_PRINT_STATS("Int timer threshold tx: %u ", 5584 soc_cfg_ctx->int_timer_threshold_tx); 5585 DP_PRINT_STATS("Int batch threshold rx: %u ", 5586 soc_cfg_ctx->int_batch_threshold_rx); 5587 DP_PRINT_STATS("Int timer threshold rx: %u ", 5588 soc_cfg_ctx->int_timer_threshold_rx); 5589 DP_PRINT_STATS("Int batch threshold other: %u ", 5590 soc_cfg_ctx->int_batch_threshold_other); 5591 DP_PRINT_STATS("Int timer threshold other: %u ", 5592 soc_cfg_ctx->int_timer_threshold_other); 5593 DP_PRINT_STATS("DP NAPI scale factor: %u ", 5594 soc_cfg_ctx->napi_scale_factor); 5595 5596 for (i = 0; i < num_of_int_contexts; i++) { 5597 index += qdf_snprint(&ring_mask[index], 5598 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5599 " %d", 5600 soc_cfg_ctx->int_tx_ring_mask[i]); 5601 } 5602 5603 DP_PRINT_STATS("Tx ring mask (0-%d):%s", 5604 num_of_int_contexts, ring_mask); 5605 5606 index = 0; 5607 for (i = 0; i < num_of_int_contexts; i++) { 5608 index += qdf_snprint(&ring_mask[index], 5609 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5610 " %d", 5611 soc_cfg_ctx->int_rx_ring_mask[i]); 5612 } 5613 5614 DP_PRINT_STATS("Rx ring mask (0-%d):%s", 5615 num_of_int_contexts, ring_mask); 5616 5617 index = 0; 5618 for (i = 0; i < num_of_int_contexts; i++) { 5619 index += qdf_snprint(&ring_mask[index], 5620 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5621 " %d", 5622 soc_cfg_ctx->int_rx_mon_ring_mask[i]); 5623 } 5624 5625 DP_PRINT_STATS("Rx mon ring mask (0-%d):%s", 5626 num_of_int_contexts, ring_mask); 5627 5628 index = 0; 5629 for (i = 0; i < num_of_int_contexts; i++) { 5630 index += qdf_snprint(&ring_mask[index], 5631 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5632 " %d", 5633 soc_cfg_ctx->int_rx_err_ring_mask[i]); 5634 } 5635 5636 DP_PRINT_STATS("Rx err ring mask (0-%d):%s", 5637 num_of_int_contexts, ring_mask); 5638 5639 index = 0; 5640 for (i = 0; i < num_of_int_contexts; i++) { 5641 index += qdf_snprint(&ring_mask[index], 5642 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5643 " %d", 5644 soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]); 5645 } 5646 5647 DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s", 5648 num_of_int_contexts, ring_mask); 5649 5650 index = 0; 5651 for (i = 0; i < num_of_int_contexts; i++) { 5652 index += qdf_snprint(&ring_mask[index], 5653 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5654 " %d", 5655 soc_cfg_ctx->int_reo_status_ring_mask[i]); 5656 } 5657 5658 DP_PRINT_STATS("Reo ring mask (0-%d):%s", 5659 num_of_int_contexts, ring_mask); 5660 5661 index = 0; 5662 for (i = 0; i < num_of_int_contexts; i++) { 5663 index += qdf_snprint(&ring_mask[index], 5664 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5665 " %d", 5666 soc_cfg_ctx->int_rxdma2host_ring_mask[i]); 5667 } 5668 5669 DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s", 5670 num_of_int_contexts, ring_mask); 5671 5672 index = 0; 5673 for (i = 0; i < num_of_int_contexts; i++) { 5674 index += qdf_snprint(&ring_mask[index], 5675 DP_MAX_INT_CONTEXTS_STRING_LENGTH - index, 5676 " %d", 5677 soc_cfg_ctx->int_host2rxdma_ring_mask[i]); 5678 } 5679 5680 DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s", 5681 num_of_int_contexts, ring_mask); 5682 5683 DP_PRINT_STATS("Rx hash: %u ", 5684 soc_cfg_ctx->rx_hash); 5685 DP_PRINT_STATS("Tso enabled: %u ", 5686 soc_cfg_ctx->tso_enabled); 5687 DP_PRINT_STATS("Lro enabled: %u ", 5688 soc_cfg_ctx->lro_enabled); 5689 DP_PRINT_STATS("Sg enabled: %u ", 5690 soc_cfg_ctx->sg_enabled); 5691 DP_PRINT_STATS("Gro enabled: %u ", 5692 soc_cfg_ctx->gro_enabled); 5693 DP_PRINT_STATS("TC based dynamic GRO: %u ", 5694 soc_cfg_ctx->tc_based_dynamic_gro); 5695 DP_PRINT_STATS("TC ingress prio: %u ", 5696 soc_cfg_ctx->tc_ingress_prio); 5697 DP_PRINT_STATS("rawmode enabled: %u ", 5698 soc_cfg_ctx->rawmode_enabled); 5699 DP_PRINT_STATS("peer flow ctrl enabled: %u ", 5700 soc_cfg_ctx->peer_flow_ctrl_enabled); 5701 DP_PRINT_STATS("napi enabled: %u ", 5702 soc_cfg_ctx->napi_enabled); 5703 DP_PRINT_STATS("P2P Tcp Udp checksum offload: %u ", 5704 soc_cfg_ctx->p2p_tcp_udp_checksumoffload); 5705 DP_PRINT_STATS("NAN Tcp Udp checksum offload: %u ", 5706 soc_cfg_ctx->nan_tcp_udp_checksumoffload); 5707 DP_PRINT_STATS("Tcp Udp checksum offload: %u ", 5708 soc_cfg_ctx->tcp_udp_checksumoffload); 5709 DP_PRINT_STATS("Defrag timeout check: %u ", 5710 soc_cfg_ctx->defrag_timeout_check); 5711 DP_PRINT_STATS("Rx defrag min timeout: %u ", 5712 soc_cfg_ctx->rx_defrag_min_timeout); 5713 DP_PRINT_STATS("WBM release ring: %u ", 5714 soc_cfg_ctx->wbm_release_ring); 5715 DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ", 5716 soc_cfg_ctx->tcl_cmd_credit_ring); 5717 DP_PRINT_STATS("TCL Status ring: %u ", 5718 soc_cfg_ctx->tcl_status_ring); 5719 DP_PRINT_STATS("REO Reinject ring: %u ", 5720 soc_cfg_ctx->reo_reinject_ring); 5721 DP_PRINT_STATS("RX release ring: %u ", 5722 soc_cfg_ctx->rx_release_ring); 5723 DP_PRINT_STATS("REO Exception ring: %u ", 5724 soc_cfg_ctx->reo_exception_ring); 5725 DP_PRINT_STATS("REO CMD ring: %u ", 5726 soc_cfg_ctx->reo_cmd_ring); 5727 DP_PRINT_STATS("REO STATUS ring: %u ", 5728 soc_cfg_ctx->reo_status_ring); 5729 DP_PRINT_STATS("RXDMA refill ring: %u ", 5730 soc_cfg_ctx->rxdma_refill_ring); 5731 DP_PRINT_STATS("TX_desc limit_0: %u ", 5732 soc_cfg_ctx->tx_desc_limit_0); 5733 DP_PRINT_STATS("TX_desc limit_1: %u ", 5734 soc_cfg_ctx->tx_desc_limit_1); 5735 DP_PRINT_STATS("TX_desc limit_2: %u ", 5736 soc_cfg_ctx->tx_desc_limit_2); 5737 DP_PRINT_STATS("TX device limit: %u ", 5738 soc_cfg_ctx->tx_device_limit); 5739 DP_PRINT_STATS("TX sw internode queue: %u ", 5740 soc_cfg_ctx->tx_sw_internode_queue); 5741 DP_PRINT_STATS("RXDMA err dst ring: %u ", 5742 soc_cfg_ctx->rxdma_err_dst_ring); 5743 DP_PRINT_STATS("RX Flow Tag Enabled: %u ", 5744 soc_cfg_ctx->is_rx_flow_tag_enabled); 5745 DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ", 5746 soc_cfg_ctx->rx_flow_search_table_size); 5747 DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ", 5748 soc_cfg_ctx->is_rx_flow_search_table_per_pdev); 5749 } 5750 5751 void 5752 dp_print_pdev_cfg_params(struct dp_pdev *pdev) 5753 { 5754 struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx; 5755 5756 if (!pdev) { 5757 dp_err("Context is null"); 5758 return; 5759 } 5760 5761 pdev_cfg_ctx = pdev->wlan_cfg_ctx; 5762 5763 if (!pdev_cfg_ctx) { 5764 dp_err("Context is null"); 5765 return; 5766 } 5767 5768 DP_PRINT_STATS("Rx dma buf ring size: %d ", 5769 pdev_cfg_ctx->rx_dma_buf_ring_size); 5770 DP_PRINT_STATS("DMA Mon buf ring size: %d ", 5771 pdev_cfg_ctx->dma_mon_buf_ring_size); 5772 DP_PRINT_STATS("DMA Mon dest ring size: %d ", 5773 pdev_cfg_ctx->dma_rx_mon_dest_ring_size); 5774 DP_PRINT_STATS("DMA Mon status ring size: %d ", 5775 pdev_cfg_ctx->dma_mon_status_ring_size); 5776 DP_PRINT_STATS("Rxdma monitor desc ring: %d", 5777 pdev_cfg_ctx->rxdma_monitor_desc_ring); 5778 DP_PRINT_STATS("Num mac rings: %d ", 5779 pdev_cfg_ctx->num_mac_rings); 5780 } 5781 5782 /** 5783 * dp_print_ring_stat_from_hal(): Print hal level ring stats 5784 * @soc: DP_SOC handle 5785 * @srng: DP_SRNG handle 5786 * @ring_name: SRNG name 5787 * @ring_type: srng src/dst ring 5788 * 5789 * Return: void 5790 */ 5791 static void 5792 dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng, 5793 enum hal_ring_type ring_type) 5794 { 5795 uint32_t tailp; 5796 uint32_t headp; 5797 int32_t hw_headp = -1; 5798 int32_t hw_tailp = -1; 5799 uint32_t ring_usage; 5800 const char *ring_name; 5801 struct hal_soc *hal_soc; 5802 5803 if (soc && srng && srng->hal_srng) { 5804 hal_soc = (struct hal_soc *)soc->hal_soc; 5805 ring_name = dp_srng_get_str_from_hal_ring_type(ring_type); 5806 hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp); 5807 ring_usage = hal_get_ring_usage(srng->hal_srng, 5808 ring_type, &headp, &tailp); 5809 5810 DP_PRINT_STATS("%s:SW: Head = %d Tail = %d Ring Usage = %u", 5811 ring_name, headp, tailp, ring_usage); 5812 5813 hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp, 5814 &hw_tailp, ring_type); 5815 ring_usage = 0; 5816 if (hw_headp >= 0 && tailp >= 0) 5817 ring_usage = 5818 hal_get_ring_usage( 5819 srng->hal_srng, ring_type, 5820 &hw_headp, &hw_tailp); 5821 DP_PRINT_STATS("%s:HW: Head = %d Tail = %d Ring Usage = %u", 5822 ring_name, hw_headp, hw_tailp, ring_usage); 5823 } 5824 } 5825 5826 #ifdef FEATURE_TSO_STATS 5827 /** 5828 * dp_print_tso_seg_stats - tso segment stats 5829 * @pdev: pdev handle 5830 * @id: tso packet id 5831 * 5832 * Return: None 5833 */ 5834 static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id) 5835 { 5836 uint8_t num_seg; 5837 uint32_t segid; 5838 5839 /* TSO LEVEL 2 - SEGMENT INFO */ 5840 num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg; 5841 for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) { 5842 DP_PRINT_STATS( 5843 "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u", 5844 segid, 5845 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5846 .tso_seg[segid].num_frags, 5847 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5848 .tso_seg[segid].total_len, 5849 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5850 .tso_seg[segid].tso_flags.tcp_seq_num, 5851 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5852 .tso_seg[segid].tso_flags.ip_id); 5853 DP_PRINT_STATS( 5854 "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u", 5855 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5856 .tso_seg[segid].tso_flags.fin, 5857 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5858 .tso_seg[segid].tso_flags.syn, 5859 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5860 .tso_seg[segid].tso_flags.rst, 5861 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5862 .tso_seg[segid].tso_flags.psh, 5863 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5864 .tso_seg[segid].tso_flags.ack, 5865 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5866 .tso_seg[segid].tso_flags.urg, 5867 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5868 .tso_seg[segid].tso_flags.ece, 5869 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5870 .tso_seg[segid].tso_flags.cwr, 5871 pdev->stats.tso_stats.tso_info.tso_packet_info[id] 5872 .tso_seg[segid].tso_flags.ns); 5873 } 5874 } 5875 #else 5876 static inline 5877 void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id) 5878 { 5879 } 5880 #endif /* FEATURE_TSO_STATS */ 5881 5882 /** 5883 * dp_print_mon_ring_stats_from_hal() - Print stat for monitor rings based 5884 * on target 5885 * @pdev: physical device handle 5886 * @mac_id: mac id 5887 * 5888 * Return: void 5889 */ 5890 static inline 5891 void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id) 5892 { 5893 if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) { 5894 dp_print_ring_stat_from_hal(pdev->soc, 5895 &pdev->soc->rxdma_mon_buf_ring[mac_id], 5896 RXDMA_MONITOR_BUF); 5897 dp_print_ring_stat_from_hal(pdev->soc, 5898 &pdev->soc->rxdma_mon_dst_ring[mac_id], 5899 RXDMA_MONITOR_DST); 5900 dp_print_ring_stat_from_hal(pdev->soc, 5901 &pdev->soc->rxdma_mon_desc_ring[mac_id], 5902 RXDMA_MONITOR_DESC); 5903 } 5904 5905 dp_print_ring_stat_from_hal(pdev->soc, 5906 &pdev->soc->rxdma_mon_status_ring[mac_id], 5907 RXDMA_MONITOR_STATUS); 5908 } 5909 5910 void 5911 dp_print_ring_stats(struct dp_pdev *pdev) 5912 { 5913 struct dp_soc *soc = pdev->soc; 5914 uint32_t i; 5915 int mac_id; 5916 int lmac_id; 5917 5918 if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS)) 5919 return; 5920 5921 dp_print_ring_stat_from_hal(pdev->soc, 5922 &pdev->soc->wbm_idle_link_ring, 5923 WBM_IDLE_LINK); 5924 dp_print_ring_stat_from_hal(pdev->soc, 5925 &pdev->soc->reo_exception_ring, 5926 REO_EXCEPTION); 5927 dp_print_ring_stat_from_hal(pdev->soc, 5928 &pdev->soc->reo_reinject_ring, 5929 REO_REINJECT); 5930 dp_print_ring_stat_from_hal(pdev->soc, 5931 &pdev->soc->reo_cmd_ring, 5932 REO_CMD); 5933 dp_print_ring_stat_from_hal(pdev->soc, 5934 &pdev->soc->reo_status_ring, 5935 REO_STATUS); 5936 dp_print_ring_stat_from_hal(pdev->soc, 5937 &pdev->soc->rx_rel_ring, 5938 WBM2SW_RELEASE); 5939 dp_print_ring_stat_from_hal(pdev->soc, 5940 &pdev->soc->tcl_cmd_credit_ring, 5941 TCL_CMD_CREDIT); 5942 dp_print_ring_stat_from_hal(pdev->soc, 5943 &pdev->soc->tcl_status_ring, 5944 TCL_STATUS); 5945 dp_print_ring_stat_from_hal(pdev->soc, 5946 &pdev->soc->wbm_desc_rel_ring, 5947 SW2WBM_RELEASE); 5948 for (i = 0; i < MAX_REO_DEST_RINGS; i++) 5949 dp_print_ring_stat_from_hal(pdev->soc, 5950 &pdev->soc->reo_dest_ring[i], 5951 REO_DST); 5952 5953 for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) 5954 dp_print_ring_stat_from_hal(pdev->soc, 5955 &pdev->soc->tcl_data_ring[i], 5956 TCL_DATA); 5957 for (i = 0; i < pdev->soc->num_tcl_data_rings; i++) 5958 dp_print_ring_stat_from_hal(pdev->soc, 5959 &pdev->soc->tx_comp_ring[i], 5960 WBM2SW_RELEASE); 5961 5962 if (pdev->soc->features.dmac_cmn_src_rxbuf_ring_enabled) { 5963 for (i = 0; i < pdev->soc->num_rx_refill_buf_rings; i++) { 5964 dp_print_ring_stat_from_hal 5965 (pdev->soc, &pdev->soc->rx_refill_buf_ring[i], 5966 RXDMA_BUF); 5967 } 5968 } else { 5969 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0, 5970 pdev->pdev_id); 5971 dp_print_ring_stat_from_hal 5972 (pdev->soc, &pdev->soc->rx_refill_buf_ring[lmac_id], 5973 RXDMA_BUF); 5974 } 5975 5976 dp_print_ring_stat_from_hal(pdev->soc, 5977 &pdev->rx_refill_buf_ring2, 5978 RXDMA_BUF); 5979 5980 for (i = 0; i < MAX_RX_MAC_RINGS; i++) 5981 dp_print_ring_stat_from_hal(pdev->soc, 5982 &pdev->rx_mac_buf_ring[i], 5983 RXDMA_BUF); 5984 5985 for (mac_id = 0; 5986 mac_id < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev; 5987 mac_id++) { 5988 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 5989 mac_id, pdev->pdev_id); 5990 5991 dp_print_mon_ring_stat_from_hal(pdev, lmac_id); 5992 } 5993 5994 for (i = 0; i < soc->wlan_cfg_ctx->num_rxdma_dst_rings_per_pdev; i++) { 5995 lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 5996 i, pdev->pdev_id); 5997 5998 dp_print_ring_stat_from_hal(pdev->soc, 5999 &pdev->soc->rxdma_err_dst_ring 6000 [lmac_id], 6001 RXDMA_DST); 6002 } 6003 hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS); 6004 } 6005 6006 /** 6007 * dp_print_common_rates_info(): Print common rate for tx or rx 6008 * @pkt_type_array: rate type array contains rate info 6009 * 6010 * Return:void 6011 */ 6012 static inline void 6013 dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array) 6014 { 6015 uint8_t mcs, pkt_type; 6016 6017 DP_PRINT_STATS("MSDU Count"); 6018 for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) { 6019 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6020 if (!cdp_rate_string[pkt_type][mcs].valid) 6021 continue; 6022 6023 DP_PRINT_STATS(" %s = %d", 6024 cdp_rate_string[pkt_type][mcs].mcs_type, 6025 pkt_type_array[pkt_type].mcs_count[mcs]); 6026 } 6027 6028 DP_PRINT_STATS("\n"); 6029 } 6030 } 6031 6032 /** 6033 * dp_print_common_ppdu_rates_info(): Print ppdu rate for tx or rx 6034 * @pkt_type_array: rate type array contains rate info 6035 * @pkt_type: packet type 6036 * 6037 * Return:void 6038 */ 6039 #ifdef WLAN_FEATURE_11BE 6040 static inline void 6041 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array, 6042 enum cdp_packet_type pkt_type) 6043 { 6044 uint8_t mcs; 6045 6046 DP_PRINT_STATS("PPDU Count"); 6047 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6048 if (pkt_type == DOT11_AX) { 6049 if (!dp_ppdu_rate_string[0][mcs].valid) 6050 continue; 6051 6052 DP_PRINT_STATS(" %s = %d", 6053 dp_ppdu_rate_string[0][mcs].mcs_type, 6054 pkt_type_array->mcs_count[mcs]); 6055 } else if (pkt_type == DOT11_BE) { 6056 if (!dp_ppdu_rate_string[1][mcs].valid) 6057 continue; 6058 6059 DP_PRINT_STATS(" %s = %d", 6060 dp_ppdu_rate_string[1][mcs].mcs_type, 6061 pkt_type_array->mcs_count[mcs]); 6062 } 6063 } 6064 6065 DP_PRINT_STATS("\n"); 6066 } 6067 #else 6068 static inline void 6069 dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array, 6070 enum cdp_packet_type pkt_type) 6071 { 6072 uint8_t mcs; 6073 6074 DP_PRINT_STATS("PPDU Count"); 6075 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6076 if (!dp_ppdu_rate_string[0][mcs].valid) 6077 continue; 6078 6079 DP_PRINT_STATS(" %s = %d", 6080 dp_ppdu_rate_string[0][mcs].mcs_type, 6081 pkt_type_array->mcs_count[mcs]); 6082 } 6083 6084 DP_PRINT_STATS("\n"); 6085 } 6086 #endif 6087 6088 /** 6089 * dp_print_mu_be_ppdu_rates_info(): Print mu be rate for tx or rx 6090 * @pkt_type_array: rate type array contains rate info 6091 * 6092 * Return:void 6093 */ 6094 #ifdef WLAN_FEATURE_11BE 6095 static inline void 6096 dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array) 6097 { 6098 uint8_t mcs, pkt_type; 6099 6100 DP_PRINT_STATS("PPDU Count"); 6101 for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) { 6102 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6103 if (!dp_mu_be_rate_string[pkt_type][mcs].valid) 6104 continue; 6105 6106 DP_PRINT_STATS(" %s = %d", 6107 dp_mu_be_rate_string[pkt_type][mcs].mcs_type, 6108 pkt_type_array[pkt_type].mcs_count[mcs]); 6109 } 6110 6111 DP_PRINT_STATS("\n"); 6112 } 6113 } 6114 #endif 6115 6116 static inline void 6117 dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu) 6118 { 6119 uint8_t mcs, pkt_type; 6120 6121 DP_PRINT_STATS("PPDU Count"); 6122 for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) { 6123 for (mcs = 0; mcs < MAX_MCS; mcs++) { 6124 if (!dp_mu_rate_string[pkt_type][mcs].valid) 6125 continue; 6126 6127 DP_PRINT_STATS(" %s = %d", 6128 dp_mu_rate_string[pkt_type][mcs].mcs_type, 6129 rx_mu[pkt_type].ppdu.mcs_count[mcs]); 6130 } 6131 6132 DP_PRINT_STATS("\n"); 6133 } 6134 } 6135 6136 void dp_print_rx_rates(struct dp_vdev *vdev) 6137 { 6138 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 6139 uint8_t i; 6140 uint8_t index = 0; 6141 char nss[DP_NSS_LENGTH]; 6142 6143 DP_PRINT_STATS("Rx Rate Info:\n"); 6144 dp_print_common_rates_info(pdev->stats.rx.pkt_type); 6145 6146 index = 0; 6147 for (i = 0; i < SS_COUNT; i++) { 6148 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 6149 " %d", pdev->stats.rx.nss[i]); 6150 } 6151 DP_PRINT_STATS("NSS(1-8) = %s", 6152 nss); 6153 6154 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6155 pdev->stats.rx.sgi_count[0], 6156 pdev->stats.rx.sgi_count[1], 6157 pdev->stats.rx.sgi_count[2], 6158 pdev->stats.rx.sgi_count[3]); 6159 DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d", 6160 pdev->stats.rx.bw[0], pdev->stats.rx.bw[1], 6161 pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]); 6162 DP_PRINT_STATS("Reception Type =" 6163 "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d", 6164 pdev->stats.rx.reception_type[0], 6165 pdev->stats.rx.reception_type[1], 6166 pdev->stats.rx.reception_type[2], 6167 pdev->stats.rx.reception_type[3]); 6168 DP_PRINT_STATS("Aggregation:\n"); 6169 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 6170 pdev->stats.rx.ampdu_cnt); 6171 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 6172 pdev->stats.rx.non_ampdu_cnt); 6173 DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d", 6174 pdev->stats.rx.amsdu_cnt); 6175 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d", 6176 pdev->stats.rx.non_amsdu_cnt); 6177 } 6178 6179 void dp_print_tx_rates(struct dp_vdev *vdev) 6180 { 6181 struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev; 6182 6183 DP_PRINT_STATS("Tx Rate Info:\n"); 6184 dp_print_common_rates_info(pdev->stats.tx.pkt_type); 6185 6186 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6187 pdev->stats.tx.sgi_count[0], 6188 pdev->stats.tx.sgi_count[1], 6189 pdev->stats.tx.sgi_count[2], 6190 pdev->stats.tx.sgi_count[3]); 6191 6192 DP_PRINT_STATS("BW Counts = 20MHZ %d, 40MHZ %d, 80MHZ %d, 160MHZ %d", 6193 pdev->stats.tx.bw[0], pdev->stats.tx.bw[1], 6194 pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]); 6195 6196 DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma); 6197 DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc); 6198 DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc); 6199 DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries); 6200 DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi); 6201 DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d", 6202 pdev->stats.tx.pream_punct_cnt); 6203 6204 DP_PRINT_STATS("Aggregation:\n"); 6205 DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d", 6206 pdev->stats.tx.ampdu_cnt); 6207 DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d", 6208 pdev->stats.tx.non_ampdu_cnt); 6209 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 6210 pdev->stats.tx.amsdu_cnt); 6211 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 6212 pdev->stats.tx.non_amsdu_cnt); 6213 } 6214 6215 /** 6216 * dp_print_nss(): Print nss count 6217 * @nss: printable nss count array 6218 * @pnss: nss count array 6219 * @ss_count: number of nss 6220 * 6221 * Return:void 6222 */ 6223 static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count) 6224 { 6225 uint32_t index; 6226 uint8_t i; 6227 6228 index = 0; 6229 for (i = 0; i < ss_count; i++) { 6230 index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index, 6231 " %d", *(pnss + i)); 6232 } 6233 } 6234 6235 /** 6236 * dp_print_jitter_stats(): Print per-tid jitter stats 6237 * @peer: DP peer object 6238 * @pdev: DP pdev object 6239 * 6240 * Return: void 6241 */ 6242 #ifdef WLAN_PEER_JITTER 6243 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev) 6244 { 6245 uint8_t tid = 0; 6246 6247 if (!pdev || !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) 6248 return; 6249 6250 if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) 6251 return; 6252 6253 DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n"); 6254 for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { 6255 struct cdp_peer_tid_stats *rx_tid = 6256 &peer->txrx_peer->jitter_stats[tid]; 6257 6258 DP_PRINT_STATS("Node tid = %d\n" 6259 "Average Jiiter : %u (us)\n" 6260 "Average Delay : %u (us)\n" 6261 "Total Average error count : %llu\n" 6262 "Total Success Count : %llu\n" 6263 "Total Drop : %llu\n", 6264 tid, 6265 rx_tid->tx_avg_jitter, 6266 rx_tid->tx_avg_delay, 6267 rx_tid->tx_avg_err, 6268 rx_tid->tx_total_success, 6269 rx_tid->tx_drop); 6270 } 6271 } 6272 #else 6273 static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev) 6274 { 6275 } 6276 #endif /* WLAN_PEER_JITTER */ 6277 6278 #ifdef QCA_PEER_EXT_STATS 6279 /* 6280 * dp_print_hist_stats() : Print delay histogram 6281 * @hstats: Histogram stats 6282 * 6283 * Return: void 6284 */ 6285 static void dp_print_hist_stats(struct cdp_hist_stats *hstats, 6286 enum cdp_hist_types hist_type) 6287 { 6288 uint8_t index = 0; 6289 uint64_t count = 0; 6290 bool hist_delay_data = false; 6291 6292 for (index = 0; index < CDP_HIST_BUCKET_MAX; index++) { 6293 count = hstats->hist.freq[index]; 6294 if (!count) 6295 continue; 6296 hist_delay_data = true; 6297 if (hist_type == CDP_HIST_TYPE_SW_ENQEUE_DELAY) 6298 DP_PRINT_STATS("%s: Packets = %llu", 6299 dp_vow_str_sw_enq_delay(index), 6300 count); 6301 else if (hist_type == CDP_HIST_TYPE_HW_COMP_DELAY) 6302 DP_PRINT_STATS("%s: Packets = %llu", 6303 dp_vow_str_fw_to_hw_delay(index), 6304 count); 6305 else if (hist_type == CDP_HIST_TYPE_REAP_STACK) 6306 DP_PRINT_STATS("%s: Packets = %llu", 6307 dp_vow_str_intfrm_delay(index), 6308 count); 6309 } 6310 6311 /* 6312 * If none of the buckets have any packets, 6313 * there is no need to display the stats. 6314 */ 6315 if (hist_delay_data) { 6316 DP_PRINT_STATS("Min = %u", hstats->min); 6317 DP_PRINT_STATS("Max = %u", hstats->max); 6318 DP_PRINT_STATS("Avg = %u\n", hstats->avg); 6319 } 6320 } 6321 6322 /* 6323 * dp_accumulate_delay_tid_stats(): Accumulate the tid stats to the 6324 * hist stats. 6325 * @soc: DP SoC handle 6326 * @stats: cdp_delay_tid stats 6327 * @dst_hstats: Destination histogram to copy tid stats 6328 * @tid: TID value 6329 * 6330 * Return: void 6331 */ 6332 static void dp_accumulate_delay_tid_stats(struct dp_soc *soc, 6333 struct cdp_delay_tid_stats stats[] 6334 [CDP_MAX_TXRX_CTX], 6335 struct cdp_hist_stats *dst_hstats, 6336 uint8_t tid, uint32_t mode) 6337 { 6338 uint8_t ring_id; 6339 6340 if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) { 6341 struct cdp_delay_tid_stats *dstats = 6342 &stats[tid][0]; 6343 struct cdp_hist_stats *src_hstats = NULL; 6344 6345 switch (mode) { 6346 case CDP_HIST_TYPE_SW_ENQEUE_DELAY: 6347 src_hstats = &dstats->tx_delay.tx_swq_delay; 6348 break; 6349 case CDP_HIST_TYPE_HW_COMP_DELAY: 6350 src_hstats = &dstats->tx_delay.hwtx_delay; 6351 break; 6352 case CDP_HIST_TYPE_REAP_STACK: 6353 src_hstats = &dstats->rx_delay.to_stack_delay; 6354 break; 6355 default: 6356 break; 6357 } 6358 6359 if (src_hstats) 6360 dp_copy_hist_stats(src_hstats, dst_hstats); 6361 6362 return; 6363 } 6364 6365 for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) { 6366 struct cdp_delay_tid_stats *dstats = 6367 &stats[tid][ring_id]; 6368 struct cdp_hist_stats *src_hstats = NULL; 6369 6370 switch (mode) { 6371 case CDP_HIST_TYPE_SW_ENQEUE_DELAY: 6372 src_hstats = &dstats->tx_delay.tx_swq_delay; 6373 break; 6374 case CDP_HIST_TYPE_HW_COMP_DELAY: 6375 src_hstats = &dstats->tx_delay.hwtx_delay; 6376 break; 6377 case CDP_HIST_TYPE_REAP_STACK: 6378 src_hstats = &dstats->rx_delay.to_stack_delay; 6379 break; 6380 default: 6381 break; 6382 } 6383 6384 if (src_hstats) 6385 dp_accumulate_hist_stats(src_hstats, dst_hstats); 6386 } 6387 } 6388 6389 /* 6390 * dp_peer_print_delay_stats(): Print peer delay stats 6391 * @soc: DP SoC handle 6392 * @peer: DP peer handle 6393 * 6394 * Return: void 6395 */ 6396 void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev, 6397 struct dp_peer *peer) 6398 { 6399 struct dp_peer_delay_stats *delay_stats; 6400 struct dp_soc *soc = NULL; 6401 struct cdp_hist_stats hist_stats; 6402 uint8_t tid; 6403 6404 if (!peer || !peer->txrx_peer) 6405 return; 6406 6407 if (!pdev || !pdev->soc) 6408 return; 6409 6410 soc = pdev->soc; 6411 if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) 6412 return; 6413 6414 delay_stats = peer->txrx_peer->delay_stats; 6415 if (!delay_stats) 6416 return; 6417 6418 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 6419 DP_PRINT_STATS("----TID: %d----", tid); 6420 DP_PRINT_STATS("Software Enqueue Delay:"); 6421 dp_hist_init(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY); 6422 dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats, 6423 &hist_stats, tid, 6424 CDP_HIST_TYPE_SW_ENQEUE_DELAY); 6425 dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY); 6426 6427 DP_PRINT_STATS("Hardware Transmission Delay:"); 6428 dp_hist_init(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY); 6429 dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats, 6430 &hist_stats, tid, 6431 CDP_HIST_TYPE_HW_COMP_DELAY); 6432 dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY); 6433 } 6434 } 6435 6436 /* 6437 * dp_peer_print_rx_delay_stats(): Print peer delay stats 6438 * @soc: DP SoC handle 6439 * @peer: DP peer handle 6440 * 6441 * Return: void 6442 */ 6443 void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev, 6444 struct dp_peer *peer) 6445 { 6446 struct dp_peer_delay_stats *delay_stats; 6447 struct dp_soc *soc = NULL; 6448 struct cdp_hist_stats hist_stats; 6449 uint8_t tid; 6450 6451 if (!peer || !peer->txrx_peer) 6452 return; 6453 6454 if (!pdev || !pdev->soc) 6455 return; 6456 6457 soc = pdev->soc; 6458 if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) 6459 return; 6460 6461 delay_stats = peer->txrx_peer->delay_stats; 6462 if (!delay_stats) 6463 return; 6464 6465 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 6466 DP_PRINT_STATS("----TID: %d----", tid); 6467 DP_PRINT_STATS("Rx Reap2stack Deliver Delay:"); 6468 dp_hist_init(&hist_stats, CDP_HIST_TYPE_REAP_STACK); 6469 dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats, 6470 &hist_stats, tid, 6471 CDP_HIST_TYPE_REAP_STACK); 6472 dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_REAP_STACK); 6473 } 6474 } 6475 6476 #else 6477 static inline void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev, 6478 struct dp_peer *peer) 6479 { 6480 } 6481 6482 static inline void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev, 6483 struct dp_peer *peer) 6484 { 6485 } 6486 #endif 6487 6488 #ifdef WLAN_FEATURE_11BE 6489 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, 6490 enum peer_stats_type stats_type) 6491 { 6492 uint8_t i; 6493 6494 if (stats_type == PEER_TX_STATS) { 6495 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n", 6496 peer_stats->tx.bw[CMN_BW_20MHZ], 6497 peer_stats->tx.bw[CMN_BW_40MHZ], 6498 peer_stats->tx.bw[CMN_BW_80MHZ], 6499 peer_stats->tx.bw[CMN_BW_160MHZ], 6500 peer_stats->tx.bw[CMN_BW_320MHZ]); 6501 DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n", 6502 peer_stats->tx.punc_bw[NO_PUNCTURE], 6503 peer_stats->tx.punc_bw[PUNCTURED_20MHZ], 6504 peer_stats->tx.punc_bw[PUNCTURED_40MHZ], 6505 peer_stats->tx.punc_bw[PUNCTURED_80MHZ], 6506 peer_stats->tx.punc_bw[PUNCTURED_120MHZ]); 6507 DP_PRINT_STATS("RU Locations"); 6508 for (i = 0; i < RU_INDEX_MAX; i++) 6509 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6510 cdp_ru_string[i].ru_type, 6511 peer_stats->tx.ru_loc[i].num_msdu, 6512 peer_stats->tx.ru_loc[i].num_mpdu, 6513 peer_stats->tx.ru_loc[i].mpdu_tried); 6514 dp_print_common_ppdu_rates_info(&peer_stats->tx.su_be_ppdu_cnt, 6515 DOT11_BE); 6516 dp_print_mu_be_ppdu_rates_info(&peer_stats->tx.mu_be_ppdu_cnt[0]); 6517 6518 } else { 6519 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d", 6520 peer_stats->rx.bw[CMN_BW_20MHZ], 6521 peer_stats->rx.bw[CMN_BW_40MHZ], 6522 peer_stats->rx.bw[CMN_BW_80MHZ], 6523 peer_stats->rx.bw[CMN_BW_160MHZ], 6524 peer_stats->rx.bw[CMN_BW_320MHZ]); 6525 DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n", 6526 peer_stats->rx.punc_bw[NO_PUNCTURE], 6527 peer_stats->rx.punc_bw[PUNCTURED_20MHZ], 6528 peer_stats->rx.punc_bw[PUNCTURED_40MHZ], 6529 peer_stats->rx.punc_bw[PUNCTURED_80MHZ], 6530 peer_stats->rx.punc_bw[PUNCTURED_120MHZ]); 6531 dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt, 6532 DOT11_BE); 6533 dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]); 6534 } 6535 } 6536 #else 6537 void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats, 6538 enum peer_stats_type stats_type) 6539 { 6540 } 6541 #endif 6542 6543 void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats, 6544 enum peer_stats_type stats_type) 6545 { 6546 if (stats_type == PEER_TX_STATS) { 6547 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n", 6548 peer_stats->tx.bw[CMN_BW_20MHZ], 6549 peer_stats->tx.bw[CMN_BW_40MHZ], 6550 peer_stats->tx.bw[CMN_BW_80MHZ], 6551 peer_stats->tx.bw[CMN_BW_160MHZ]); 6552 DP_PRINT_STATS("RU Locations"); 6553 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6554 cdp_ru_string[RU_26_INDEX].ru_type, 6555 peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu, 6556 peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu, 6557 peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried); 6558 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6559 cdp_ru_string[RU_52_INDEX].ru_type, 6560 peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu, 6561 peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu, 6562 peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried); 6563 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6564 cdp_ru_string[RU_106_INDEX].ru_type, 6565 peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu, 6566 peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu, 6567 peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried); 6568 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6569 cdp_ru_string[RU_242_INDEX].ru_type, 6570 peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu, 6571 peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu, 6572 peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried); 6573 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6574 cdp_ru_string[RU_484_INDEX].ru_type, 6575 peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu, 6576 peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu, 6577 peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried); 6578 DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d", 6579 cdp_ru_string[RU_996_INDEX].ru_type, 6580 peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu, 6581 peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu, 6582 peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried); 6583 } else { 6584 DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d", 6585 peer_stats->rx.bw[CMN_BW_20MHZ], 6586 peer_stats->rx.bw[CMN_BW_40MHZ], 6587 peer_stats->rx.bw[CMN_BW_80MHZ], 6588 peer_stats->rx.bw[CMN_BW_160MHZ]); 6589 } 6590 } 6591 6592 #ifdef REO_SHARED_QREF_TABLE_EN 6593 static void dp_peer_print_reo_qref_table(struct dp_peer *peer) 6594 { 6595 struct hal_soc *hal; 6596 struct dp_peer *mld_peer; 6597 int i; 6598 uint64_t *reo_qref_addr; 6599 uint32_t peer_idx; 6600 6601 hal = (struct hal_soc *)peer->vdev->pdev->soc->hal_soc; 6602 6603 if (!hal_reo_shared_qaddr_is_enable((hal_soc_handle_t)hal)) 6604 return; 6605 6606 peer_idx = (peer->peer_id * DP_MAX_TIDS); 6607 6608 if ((!hal->reo_qref.non_mlo_reo_qref_table_vaddr) || 6609 (!hal->reo_qref.mlo_reo_qref_table_vaddr)) { 6610 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, 6611 FL("REO shared table not allocated")); 6612 return; 6613 } 6614 6615 reo_qref_addr = &hal->reo_qref.non_mlo_reo_qref_table_vaddr[peer_idx]; 6616 mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer); 6617 if (mld_peer) { 6618 peer = mld_peer; 6619 hal = (struct hal_soc *) 6620 peer->vdev->pdev->soc->hal_soc; 6621 peer_idx = (mld_peer->peer_id - HAL_ML_PEER_ID_START) * 6622 DP_MAX_TIDS; 6623 reo_qref_addr = &hal->reo_qref.mlo_reo_qref_table_vaddr[peer_idx]; 6624 } 6625 DP_PRINT_STATS("Reo Qref table for peer_id: %d\n", peer->peer_id); 6626 6627 for (i = 0; i < DP_MAX_TIDS; i++) 6628 DP_PRINT_STATS(" Tid [%d] :%llx", i, reo_qref_addr[i]); 6629 } 6630 #else 6631 static inline void dp_peer_print_reo_qref_table(struct dp_peer *peer) 6632 { 6633 } 6634 #endif 6635 6636 void dp_print_peer_stats(struct dp_peer *peer, 6637 struct cdp_peer_stats *peer_stats) 6638 { 6639 uint8_t i; 6640 uint32_t index; 6641 uint32_t j; 6642 char nss[DP_NSS_LENGTH]; 6643 char mu_group_id[DP_MU_GROUP_LENGTH]; 6644 struct dp_pdev *pdev; 6645 uint32_t *pnss; 6646 enum cdp_mu_packet_type rx_mu_type; 6647 struct cdp_rx_mu *rx_mu; 6648 6649 pdev = peer->vdev->pdev; 6650 6651 DP_PRINT_STATS("Node Tx Stats:\n"); 6652 DP_PRINT_STATS("Total Packet Completions = %d", 6653 peer_stats->tx.comp_pkt.num); 6654 DP_PRINT_STATS("Total Bytes Completions = %llu", 6655 peer_stats->tx.comp_pkt.bytes); 6656 DP_PRINT_STATS("Success Packets = %d", 6657 peer_stats->tx.tx_success.num); 6658 DP_PRINT_STATS("Success Bytes = %llu", 6659 peer_stats->tx.tx_success.bytes); 6660 DP_PRINT_STATS("Success Packets in TWT Session = %d", 6661 peer_stats->tx.tx_success_twt.num); 6662 DP_PRINT_STATS("Success Bytes in TWT Session = %llu", 6663 peer_stats->tx.tx_success_twt.bytes); 6664 DP_PRINT_STATS("Unicast Success Packets = %d", 6665 peer_stats->tx.ucast.num); 6666 DP_PRINT_STATS("Unicast Success Bytes = %llu", 6667 peer_stats->tx.ucast.bytes); 6668 DP_PRINT_STATS("Multicast Success Packets = %d", 6669 peer_stats->tx.mcast.num); 6670 DP_PRINT_STATS("Multicast Success Bytes = %llu", 6671 peer_stats->tx.mcast.bytes); 6672 DP_PRINT_STATS("Broadcast Success Packets = %d", 6673 peer_stats->tx.bcast.num); 6674 DP_PRINT_STATS("Broadcast Success Bytes = %llu", 6675 peer_stats->tx.bcast.bytes); 6676 DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %d", 6677 peer_stats->tx.retry_count); 6678 DP_PRINT_STATS("Packets Successfully Sent after more than one retry = %d", 6679 peer_stats->tx.multiple_retry_count); 6680 DP_PRINT_STATS("Packets Failed = %d", 6681 peer_stats->tx.tx_failed); 6682 DP_PRINT_STATS("Packets Failed due to retry threshold breach = %d", 6683 peer_stats->tx.failed_retry_count); 6684 DP_PRINT_STATS("Packets In OFDMA = %d", 6685 peer_stats->tx.ofdma); 6686 DP_PRINT_STATS("Packets In STBC = %d", 6687 peer_stats->tx.stbc); 6688 DP_PRINT_STATS("Packets In LDPC = %d", 6689 peer_stats->tx.ldpc); 6690 DP_PRINT_STATS("Packet Retries = %d", 6691 peer_stats->tx.retries); 6692 DP_PRINT_STATS("MSDU's Part of AMSDU = %d", 6693 peer_stats->tx.amsdu_cnt); 6694 DP_PRINT_STATS("Msdu's As Part of Ampdu = %d", 6695 peer_stats->tx.non_ampdu_cnt); 6696 DP_PRINT_STATS("Msdu's As Ampdu = %d", 6697 peer_stats->tx.ampdu_cnt); 6698 DP_PRINT_STATS("Last Packet RSSI = %d", 6699 peer_stats->tx.last_ack_rssi); 6700 DP_PRINT_STATS("Dropped At FW: Removed Pkts = %u", 6701 peer_stats->tx.dropped.fw_rem.num); 6702 DP_PRINT_STATS("Release source not TQM = %u", 6703 peer_stats->tx.release_src_not_tqm); 6704 if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) { 6705 DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu", 6706 peer_stats->tx.dropped.fw_rem.bytes); 6707 } 6708 DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d", 6709 peer_stats->tx.dropped.fw_rem_tx); 6710 DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d", 6711 peer_stats->tx.dropped.fw_rem_notx); 6712 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u", 6713 peer_stats->tx.dropped.fw_reason1); 6714 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u", 6715 peer_stats->tx.dropped.fw_reason2); 6716 DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u", 6717 peer_stats->tx.dropped.fw_reason3); 6718 DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u", 6719 peer_stats->tx.dropped.fw_rem_queue_disable); 6720 DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u", 6721 peer_stats->tx.dropped.fw_rem_no_match); 6722 DP_PRINT_STATS("Dropped due to HW threshold criteria = %u", 6723 peer_stats->tx.dropped.drop_threshold); 6724 DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u", 6725 peer_stats->tx.dropped.drop_link_desc_na); 6726 DP_PRINT_STATS("Drop bit set or invalid flow = %u", 6727 peer_stats->tx.dropped.invalid_drop); 6728 DP_PRINT_STATS("MCAST vdev drop in HW = %u", 6729 peer_stats->tx.dropped.mcast_vdev_drop); 6730 DP_PRINT_STATS("Dropped : Age Out = %d", 6731 peer_stats->tx.dropped.age_out); 6732 DP_PRINT_STATS("Dropped : Invalid Reason = %u", 6733 peer_stats->tx.dropped.invalid_rr); 6734 DP_PRINT_STATS("NAWDS : "); 6735 DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d", 6736 peer_stats->tx.nawds_mcast_drop); 6737 DP_PRINT_STATS(" Nawds multicast Tx Packet Count = %d", 6738 peer_stats->tx.nawds_mcast.num); 6739 DP_PRINT_STATS(" Nawds multicast Tx Packet Bytes = %llu", 6740 peer_stats->tx.nawds_mcast.bytes); 6741 6742 DP_PRINT_STATS("PPDU's = %d", peer_stats->tx.tx_ppdus); 6743 DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d", 6744 peer_stats->tx.pream_punct_cnt); 6745 DP_PRINT_STATS("MPDU's Successful = %d", 6746 peer_stats->tx.tx_mpdus_success); 6747 DP_PRINT_STATS("MPDU's Tried = %d", peer_stats->tx.tx_mpdus_tried); 6748 6749 DP_PRINT_STATS("Rate Info:"); 6750 dp_print_common_rates_info(peer_stats->tx.pkt_type); 6751 6752 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6753 peer_stats->tx.sgi_count[0], 6754 peer_stats->tx.sgi_count[1], 6755 peer_stats->tx.sgi_count[2], 6756 peer_stats->tx.sgi_count[3]); 6757 6758 DP_PRINT_STATS("Wireless Mutlimedia "); 6759 DP_PRINT_STATS(" Best effort = %d", 6760 peer_stats->tx.wme_ac_type[0]); 6761 DP_PRINT_STATS(" Background= %d", 6762 peer_stats->tx.wme_ac_type[1]); 6763 DP_PRINT_STATS(" Video = %d", 6764 peer_stats->tx.wme_ac_type[2]); 6765 DP_PRINT_STATS(" Voice = %d", 6766 peer_stats->tx.wme_ac_type[3]); 6767 6768 DP_PRINT_STATS("Excess Retries per AC "); 6769 DP_PRINT_STATS(" Best effort = %d", 6770 peer_stats->tx.excess_retries_per_ac[0]); 6771 DP_PRINT_STATS(" Background= %d", 6772 peer_stats->tx.excess_retries_per_ac[1]); 6773 DP_PRINT_STATS(" Video = %d", 6774 peer_stats->tx.excess_retries_per_ac[2]); 6775 DP_PRINT_STATS(" Voice = %d", 6776 peer_stats->tx.excess_retries_per_ac[3]); 6777 6778 pnss = &peer_stats->tx.nss[0]; 6779 dp_print_nss(nss, pnss, SS_COUNT); 6780 6781 DP_PRINT_STATS("NSS(1-8) = %s", nss); 6782 6783 DP_PRINT_STATS("Transmit Type :"); 6784 DP_PRINT_STATS("MSDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 6785 peer_stats->tx.transmit_type[SU].num_msdu, 6786 peer_stats->tx.transmit_type[MU_MIMO].num_msdu, 6787 peer_stats->tx.transmit_type[MU_OFDMA].num_msdu, 6788 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu); 6789 6790 DP_PRINT_STATS("MPDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 6791 peer_stats->tx.transmit_type[SU].num_mpdu, 6792 peer_stats->tx.transmit_type[MU_MIMO].num_mpdu, 6793 peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu, 6794 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu); 6795 6796 DP_PRINT_STATS("MPDUs Tried: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d", 6797 peer_stats->tx.transmit_type[SU].mpdu_tried, 6798 peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried, 6799 peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried, 6800 peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried); 6801 6802 for (i = 0; i < MAX_MU_GROUP_ID;) { 6803 index = 0; 6804 for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID; 6805 j++) { 6806 index += qdf_snprint(&mu_group_id[index], 6807 DP_MU_GROUP_LENGTH - index, 6808 " %d", 6809 peer_stats->tx.mu_group_id[i]); 6810 i++; 6811 } 6812 6813 DP_PRINT_STATS("User position list for GID %02d->%d: [%s]", 6814 i - DP_MU_GROUP_SHOW, i - 1, mu_group_id); 6815 } 6816 6817 DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]", 6818 peer_stats->tx.ru_start, peer_stats->tx.ru_tones); 6819 6820 DP_PRINT_STATS("Aggregation:"); 6821 DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d", 6822 peer_stats->tx.amsdu_cnt); 6823 DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d", 6824 peer_stats->tx.non_amsdu_cnt); 6825 6826 DP_PRINT_STATS("Bytes and Packets transmitted in last one sec:"); 6827 DP_PRINT_STATS(" Bytes transmitted in last sec: %d", 6828 peer_stats->tx.tx_byte_rate); 6829 DP_PRINT_STATS(" Data transmitted in last sec: %d", 6830 peer_stats->tx.tx_data_rate); 6831 6832 if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats) 6833 pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats, 6834 PEER_TX_STATS); 6835 6836 if (!IS_MLO_DP_LINK_PEER(peer)) { 6837 dp_print_jitter_stats(peer, pdev); 6838 dp_peer_print_tx_delay_stats(pdev, peer); 6839 } 6840 6841 DP_PRINT_STATS("Node Rx Stats:"); 6842 DP_PRINT_STATS("Packets Sent To Stack = %d", 6843 peer_stats->rx.to_stack.num); 6844 DP_PRINT_STATS("Bytes Sent To Stack = %llu", 6845 peer_stats->rx.to_stack.bytes); 6846 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 6847 DP_PRINT_STATS("Ring Id = %d", i); 6848 DP_PRINT_STATS(" Packets Received = %d", 6849 peer_stats->rx.rcvd_reo[i].num); 6850 DP_PRINT_STATS(" Bytes Received = %llu", 6851 peer_stats->rx.rcvd_reo[i].bytes); 6852 } 6853 for (i = 0; i < CDP_MAX_LMACS; i++) 6854 DP_PRINT_STATS("Packets Received on lmac[%d] = %d ( %llu ),", 6855 i, peer_stats->rx.rx_lmac[i].num, 6856 peer_stats->rx.rx_lmac[i].bytes); 6857 6858 DP_PRINT_STATS("Unicast Packets Received = %d", 6859 peer_stats->rx.unicast.num); 6860 DP_PRINT_STATS("Unicast Bytes Received = %llu", 6861 peer_stats->rx.unicast.bytes); 6862 DP_PRINT_STATS("Multicast Packets Received = %d", 6863 peer_stats->rx.multicast.num); 6864 DP_PRINT_STATS("Multicast Bytes Received = %llu", 6865 peer_stats->rx.multicast.bytes); 6866 DP_PRINT_STATS("Broadcast Packets Received = %d", 6867 peer_stats->rx.bcast.num); 6868 DP_PRINT_STATS("Broadcast Bytes Received = %llu", 6869 peer_stats->rx.bcast.bytes); 6870 DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %d", 6871 peer_stats->rx.to_stack_twt.num); 6872 DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu", 6873 peer_stats->rx.to_stack_twt.bytes); 6874 DP_PRINT_STATS("Intra BSS Packets Received = %d", 6875 peer_stats->rx.intra_bss.pkts.num); 6876 DP_PRINT_STATS("Intra BSS Bytes Received = %llu", 6877 peer_stats->rx.intra_bss.pkts.bytes); 6878 DP_PRINT_STATS("Intra BSS Packets Failed = %d", 6879 peer_stats->rx.intra_bss.fail.num); 6880 DP_PRINT_STATS("Intra BSS Bytes Failed = %llu", 6881 peer_stats->rx.intra_bss.fail.bytes); 6882 DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded = %d", 6883 peer_stats->rx.intra_bss.mdns_no_fwd); 6884 DP_PRINT_STATS("Raw Packets Received = %d", 6885 peer_stats->rx.raw.num); 6886 DP_PRINT_STATS("Raw Bytes Received = %llu", 6887 peer_stats->rx.raw.bytes); 6888 DP_PRINT_STATS("Errors: MIC Errors = %d", 6889 peer_stats->rx.err.mic_err); 6890 DP_PRINT_STATS("Errors: Decryption Errors = %d", 6891 peer_stats->rx.err.decrypt_err); 6892 DP_PRINT_STATS("Errors: PN Errors = %d", 6893 peer_stats->rx.err.pn_err); 6894 DP_PRINT_STATS("Errors: OOR Errors = %d", 6895 peer_stats->rx.err.oor_err); 6896 DP_PRINT_STATS("Errors: 2k Jump Errors = %d", 6897 peer_stats->rx.err.jump_2k_err); 6898 DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %d", 6899 peer_stats->rx.err.rxdma_wifi_parse_err); 6900 DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d", 6901 peer_stats->rx.non_ampdu_cnt); 6902 DP_PRINT_STATS("Msdu's Received As Ampdu = %d", 6903 peer_stats->rx.ampdu_cnt); 6904 DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d", 6905 peer_stats->rx.non_amsdu_cnt); 6906 DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d", 6907 peer_stats->rx.amsdu_cnt); 6908 DP_PRINT_STATS("MSDU Rx Retries= %d", peer_stats->rx.rx_retries); 6909 DP_PRINT_STATS("MPDU Rx Retries= %d", peer_stats->rx.mpdu_retry_cnt); 6910 DP_PRINT_STATS("NAWDS : "); 6911 DP_PRINT_STATS(" Nawds multicast Drop Rx Packet = %d", 6912 peer_stats->rx.nawds_mcast_drop); 6913 DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %d", 6914 peer_stats->rx.mcast_3addr_drop); 6915 DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d", 6916 peer_stats->rx.sgi_count[0], 6917 peer_stats->rx.sgi_count[1], 6918 peer_stats->rx.sgi_count[2], 6919 peer_stats->rx.sgi_count[3]); 6920 6921 DP_PRINT_STATS("Wireless Mutlimedia "); 6922 DP_PRINT_STATS(" Best effort = %d", 6923 peer_stats->rx.wme_ac_type[0]); 6924 DP_PRINT_STATS(" Background= %d", 6925 peer_stats->rx.wme_ac_type[1]); 6926 DP_PRINT_STATS(" Video = %d", 6927 peer_stats->rx.wme_ac_type[2]); 6928 DP_PRINT_STATS(" Voice = %d", 6929 peer_stats->rx.wme_ac_type[3]); 6930 6931 DP_PRINT_STATS(" Total Rx PPDU Count = %d", peer_stats->rx.rx_ppdus); 6932 DP_PRINT_STATS(" Total Rx MPDU Count = %d", peer_stats->rx.rx_mpdus); 6933 DP_PRINT_STATS("MSDU Reception Type"); 6934 DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d", 6935 peer_stats->rx.reception_type[0], 6936 peer_stats->rx.reception_type[1], 6937 peer_stats->rx.reception_type[2], 6938 peer_stats->rx.reception_type[3]); 6939 DP_PRINT_STATS("PPDU Reception Type"); 6940 DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d", 6941 peer_stats->rx.ppdu_cnt[0], 6942 peer_stats->rx.ppdu_cnt[1], 6943 peer_stats->rx.ppdu_cnt[2], 6944 peer_stats->rx.ppdu_cnt[3]); 6945 6946 dp_print_common_rates_info(peer_stats->rx.pkt_type); 6947 dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt, 6948 DOT11_AX); 6949 dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]); 6950 6951 pnss = &peer_stats->rx.nss[0]; 6952 dp_print_nss(nss, pnss, SS_COUNT); 6953 DP_PRINT_STATS("MSDU Count"); 6954 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 6955 6956 DP_PRINT_STATS("reception mode SU"); 6957 pnss = &peer_stats->rx.ppdu_nss[0]; 6958 dp_print_nss(nss, pnss, SS_COUNT); 6959 6960 DP_PRINT_STATS(" PPDU Count"); 6961 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 6962 6963 DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d", 6964 peer_stats->rx.mpdu_cnt_fcs_ok, 6965 peer_stats->rx.mpdu_cnt_fcs_err); 6966 6967 for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX; rx_mu_type++) { 6968 DP_PRINT_STATS("reception mode %s", 6969 mu_reception_mode[rx_mu_type]); 6970 rx_mu = &peer_stats->rx.rx_mu[rx_mu_type]; 6971 6972 pnss = &rx_mu->ppdu_nss[0]; 6973 dp_print_nss(nss, pnss, SS_COUNT); 6974 DP_PRINT_STATS(" PPDU Count"); 6975 DP_PRINT_STATS(" NSS(1-8) = %s", nss); 6976 6977 DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d", 6978 rx_mu->mpdu_cnt_fcs_ok, 6979 rx_mu->mpdu_cnt_fcs_err); 6980 } 6981 6982 DP_PRINT_STATS("Aggregation:"); 6983 DP_PRINT_STATS(" Msdu's Part of Ampdu = %d", 6984 peer_stats->rx.ampdu_cnt); 6985 DP_PRINT_STATS(" Msdu's With No Mpdu Level Aggregation = %d", 6986 peer_stats->rx.non_ampdu_cnt); 6987 DP_PRINT_STATS(" Msdu's Part of Amsdu = %d", 6988 peer_stats->rx.amsdu_cnt); 6989 DP_PRINT_STATS(" Msdu's With No Msdu Level Aggregation = %d", 6990 peer_stats->rx.non_amsdu_cnt); 6991 6992 DP_PRINT_STATS("Bytes and Packets received in last one sec:"); 6993 DP_PRINT_STATS(" Bytes received in last sec: %d", 6994 peer_stats->rx.rx_byte_rate); 6995 DP_PRINT_STATS(" Data received in last sec: %d", 6996 peer_stats->rx.rx_data_rate); 6997 DP_PRINT_STATS("MEC Packet Drop = %d", 6998 peer_stats->rx.mec_drop.num); 6999 DP_PRINT_STATS("MEC Byte Drop = %llu", 7000 peer_stats->rx.mec_drop.bytes); 7001 DP_PRINT_STATS("Multipass Rx Packet Drop = %d", 7002 peer_stats->rx.multipass_rx_pkt_drop); 7003 DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %d", 7004 peer_stats->rx.peer_unauth_rx_pkt_drop); 7005 DP_PRINT_STATS("Policy Check Rx Packet Drop = %d", 7006 peer_stats->rx.policy_check_drop); 7007 if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats) 7008 pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats, 7009 PEER_RX_STATS); 7010 7011 if (!IS_MLO_DP_LINK_PEER(peer)) 7012 dp_peer_print_rx_delay_stats(pdev, peer); 7013 7014 dp_peer_print_reo_qref_table(peer); 7015 } 7016 7017 void dp_print_per_ring_stats(struct dp_soc *soc) 7018 { 7019 uint8_t ring; 7020 uint16_t core; 7021 uint64_t total_packets; 7022 7023 DP_PRINT_STATS("Reo packets per ring:"); 7024 for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) { 7025 total_packets = 0; 7026 DP_PRINT_STATS("Packets on ring %u:", ring); 7027 for (core = 0; core < num_possible_cpus(); core++) { 7028 if (!soc->stats.rx.ring_packets[core][ring]) 7029 continue; 7030 DP_PRINT_STATS("Packets arriving on core %u: %llu", 7031 core, 7032 soc->stats.rx.ring_packets[core][ring]); 7033 total_packets += soc->stats.rx.ring_packets[core][ring]; 7034 } 7035 DP_PRINT_STATS("Total packets on ring %u: %llu", 7036 ring, total_packets); 7037 } 7038 } 7039 7040 void dp_txrx_path_stats(struct dp_soc *soc) 7041 { 7042 uint8_t error_code; 7043 uint8_t loop_pdev; 7044 struct dp_pdev *pdev; 7045 uint8_t i; 7046 7047 if (!soc) { 7048 dp_err("%s: Invalid access", __func__); 7049 return; 7050 } 7051 7052 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 7053 pdev = soc->pdev_list[loop_pdev]; 7054 dp_aggregate_pdev_stats(pdev); 7055 DP_PRINT_STATS("Tx path Statistics:"); 7056 DP_PRINT_STATS("from stack: %u msdus (%llu bytes)", 7057 pdev->stats.tx_i.rcvd.num, 7058 pdev->stats.tx_i.rcvd.bytes); 7059 DP_PRINT_STATS("processed from host: %u msdus (%llu bytes)", 7060 pdev->stats.tx_i.processed.num, 7061 pdev->stats.tx_i.processed.bytes); 7062 DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)", 7063 pdev->stats.tx.tx_success.num, 7064 pdev->stats.tx.tx_success.bytes); 7065 for (i = 0; i < soc->num_tcl_data_rings; i++) { 7066 DP_PRINT_STATS("Enqueue to SW2TCL%u: %u", i + 1, 7067 soc->stats.tx.tcl_enq[i]); 7068 DP_PRINT_STATS("TX completions reaped from ring %u: %u", 7069 i, soc->stats.tx.tx_comp[i]); 7070 } 7071 7072 DP_PRINT_STATS("Invalid release source: %u", 7073 soc->stats.tx.invalid_release_source); 7074 DP_PRINT_STATS("Dropped in host:"); 7075 DP_PRINT_STATS("Total packets dropped: %u,", 7076 pdev->stats.tx_i.dropped.dropped_pkt.num); 7077 DP_PRINT_STATS("Descriptor not available: %u", 7078 pdev->stats.tx_i.dropped.desc_na.num); 7079 DP_PRINT_STATS("Ring full: %u", 7080 pdev->stats.tx_i.dropped.ring_full); 7081 DP_PRINT_STATS("Enqueue fail: %u", 7082 pdev->stats.tx_i.dropped.enqueue_fail); 7083 DP_PRINT_STATS("Pkt dropped in vdev-id check: %u", 7084 pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check); 7085 DP_PRINT_STATS("DMA Error: %u", 7086 pdev->stats.tx_i.dropped.dma_error); 7087 7088 DP_PRINT_STATS("Dropped in hardware:"); 7089 DP_PRINT_STATS("total packets dropped: %u", 7090 pdev->stats.tx.tx_failed); 7091 DP_PRINT_STATS("mpdu age out: %u", 7092 pdev->stats.tx.dropped.age_out); 7093 DP_PRINT_STATS("firmware removed packets: %u (%llu bytes)", 7094 pdev->stats.tx.dropped.fw_rem.num, 7095 pdev->stats.tx.dropped.fw_rem.bytes); 7096 DP_PRINT_STATS("firmware removed tx: %u", 7097 pdev->stats.tx.dropped.fw_rem_tx); 7098 DP_PRINT_STATS("firmware removed notx %u", 7099 pdev->stats.tx.dropped.fw_rem_notx); 7100 DP_PRINT_STATS("Invalid peer on tx path: %u", 7101 pdev->soc->stats.tx.tx_invalid_peer.num); 7102 DP_PRINT_STATS("Tx desc freed in non-completion path: %u", 7103 pdev->soc->stats.tx.tx_comp_exception); 7104 DP_PRINT_STATS("Tx desc force freed: %u", 7105 pdev->soc->stats.tx.tx_comp_force_freed); 7106 7107 DP_PRINT_STATS("Tx packets sent per interrupt:"); 7108 DP_PRINT_STATS("Single Packet: %u", 7109 pdev->stats.tx_comp_histogram.pkts_1); 7110 DP_PRINT_STATS("2-20 Packets: %u", 7111 pdev->stats.tx_comp_histogram.pkts_2_20); 7112 DP_PRINT_STATS("21-40 Packets: %u", 7113 pdev->stats.tx_comp_histogram.pkts_21_40); 7114 DP_PRINT_STATS("41-60 Packets: %u", 7115 pdev->stats.tx_comp_histogram.pkts_41_60); 7116 DP_PRINT_STATS("61-80 Packets: %u", 7117 pdev->stats.tx_comp_histogram.pkts_61_80); 7118 DP_PRINT_STATS("81-100 Packets: %u", 7119 pdev->stats.tx_comp_histogram.pkts_81_100); 7120 DP_PRINT_STATS("101-200 Packets: %u", 7121 pdev->stats.tx_comp_histogram.pkts_101_200); 7122 DP_PRINT_STATS(" 201+ Packets: %u", 7123 pdev->stats.tx_comp_histogram.pkts_201_plus); 7124 7125 DP_PRINT_STATS("Rx path statistics"); 7126 7127 DP_PRINT_STATS("delivered %u msdus ( %llu bytes),", 7128 pdev->stats.rx.to_stack.num, 7129 pdev->stats.rx.to_stack.bytes); 7130 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 7131 if (!pdev->stats.rx.rcvd_reo[i].num) 7132 continue; 7133 DP_PRINT_STATS( 7134 "received on reo[%d] %u msdus( %llu bytes),", 7135 i, pdev->stats.rx.rcvd_reo[i].num, 7136 pdev->stats.rx.rcvd_reo[i].bytes); 7137 } 7138 for (i = 0; i < CDP_MAX_LMACS; i++) 7139 DP_PRINT_STATS("received on lmac[%d] %u msdus (%llu bytes),", 7140 i, pdev->stats.rx.rx_lmac[i].num, 7141 pdev->stats.rx.rx_lmac[i].bytes); 7142 DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),", 7143 pdev->stats.rx.intra_bss.pkts.num, 7144 pdev->stats.rx.intra_bss.pkts.bytes); 7145 DP_PRINT_STATS("intra-bss fails %u msdus ( %llu bytes),", 7146 pdev->stats.rx.intra_bss.fail.num, 7147 pdev->stats.rx.intra_bss.fail.bytes); 7148 DP_PRINT_STATS("intra-bss no mdns fwds %u msdus", 7149 pdev->stats.rx.intra_bss.mdns_no_fwd); 7150 DP_PRINT_STATS("intra-bss EAPOL drops: %u", 7151 soc->stats.rx.err.intrabss_eapol_drop); 7152 7153 DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),", 7154 pdev->stats.rx.raw.num, 7155 pdev->stats.rx.raw.bytes); 7156 DP_PRINT_STATS("mic errors %u", 7157 pdev->stats.rx.err.mic_err); 7158 DP_PRINT_STATS("Invalid peer on rx path: %u", 7159 pdev->soc->stats.rx.err.rx_invalid_peer.num); 7160 DP_PRINT_STATS("sw_peer_id invalid %u", 7161 pdev->soc->stats.rx.err.rx_invalid_peer_id.num); 7162 DP_PRINT_STATS("packet_len invalid %u", 7163 pdev->soc->stats.rx.err.rx_invalid_pkt_len.num); 7164 DP_PRINT_STATS("sa or da idx invalid %u", 7165 pdev->soc->stats.rx.err.invalid_sa_da_idx); 7166 DP_PRINT_STATS("defrag peer uninit %u", 7167 pdev->soc->stats.rx.err.defrag_peer_uninit); 7168 DP_PRINT_STATS("pkts delivered no peer %u", 7169 pdev->soc->stats.rx.err.pkt_delivered_no_peer); 7170 DP_PRINT_STATS("RX invalid cookie: %d", 7171 soc->stats.rx.err.invalid_cookie); 7172 DP_PRINT_STATS("RX stale cookie: %d", 7173 soc->stats.rx.err.stale_cookie); 7174 DP_PRINT_STATS("2k jump delba sent: %u", 7175 pdev->soc->stats.rx.err.rx_2k_jump_delba_sent); 7176 DP_PRINT_STATS("2k jump msdu to stack: %u", 7177 pdev->soc->stats.rx.err.rx_2k_jump_to_stack); 7178 DP_PRINT_STATS("2k jump msdu drop: %u", 7179 pdev->soc->stats.rx.err.rx_2k_jump_drop); 7180 DP_PRINT_STATS("REO err oor msdu to stack %u", 7181 pdev->soc->stats.rx.err.reo_err_oor_to_stack); 7182 DP_PRINT_STATS("REO err oor msdu drop: %u", 7183 pdev->soc->stats.rx.err.reo_err_oor_drop); 7184 DP_PRINT_STATS("Rx err msdu rejected: %d", 7185 soc->stats.rx.err.rejected); 7186 DP_PRINT_STATS("Rx raw frame dropped: %d", 7187 soc->stats.rx.err.raw_frm_drop); 7188 DP_PRINT_STATS("Rx stale link desc cookie: %d", 7189 pdev->soc->stats.rx.err.invalid_link_cookie); 7190 DP_PRINT_STATS("Rx nbuf sanity fails: %d", 7191 pdev->soc->stats.rx.err.nbuf_sanity_fail); 7192 DP_PRINT_STATS("Rx refill duplicate link desc: %d", 7193 pdev->soc->stats.rx.err.dup_refill_link_desc); 7194 DP_PRINT_STATS("Rx ipa smmu map duplicate: %d", 7195 pdev->soc->stats.rx.err.ipa_smmu_map_dup); 7196 DP_PRINT_STATS("Rx ipa smmu unmap duplicate: %d", 7197 pdev->soc->stats.rx.err.ipa_smmu_unmap_dup); 7198 DP_PRINT_STATS("Rx ipa smmu unmap no pipes: %d", 7199 pdev->soc->stats.rx.err.ipa_unmap_no_pipe); 7200 DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d", 7201 soc->stats.rx.err.pn_in_dest_check_fail); 7202 7203 DP_PRINT_STATS("Reo Statistics"); 7204 DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full); 7205 DP_PRINT_STATS("rbm error: %u msdus", 7206 pdev->soc->stats.rx.err.invalid_rbm); 7207 DP_PRINT_STATS("hal ring access fail: %u msdus", 7208 pdev->soc->stats.rx.err.hal_ring_access_fail); 7209 7210 DP_PRINT_STATS("hal ring access full fail: %u msdus", 7211 pdev->soc->stats.rx.err.hal_ring_access_full_fail); 7212 7213 DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame); 7214 7215 for (error_code = 0; error_code < HAL_REO_ERR_MAX; 7216 error_code++) { 7217 if (!pdev->soc->stats.rx.err.reo_error[error_code]) 7218 continue; 7219 DP_PRINT_STATS("Reo error number (%u): %u msdus", 7220 error_code, 7221 pdev->soc->stats.rx.err 7222 .reo_error[error_code]); 7223 } 7224 7225 for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX; 7226 error_code++) { 7227 if (!pdev->soc->stats.rx.err.rxdma_error[error_code]) 7228 continue; 7229 DP_PRINT_STATS("Rxdma error number (%u): %u msdus", 7230 error_code, 7231 pdev->soc->stats.rx.err 7232 .rxdma_error[error_code]); 7233 } 7234 7235 DP_PRINT_STATS("Rx packets reaped per interrupt:"); 7236 DP_PRINT_STATS("Single Packet: %u", 7237 pdev->stats.rx_ind_histogram.pkts_1); 7238 DP_PRINT_STATS("2-20 Packets: %u", 7239 pdev->stats.rx_ind_histogram.pkts_2_20); 7240 DP_PRINT_STATS("21-40 Packets: %u", 7241 pdev->stats.rx_ind_histogram.pkts_21_40); 7242 DP_PRINT_STATS("41-60 Packets: %u", 7243 pdev->stats.rx_ind_histogram.pkts_41_60); 7244 DP_PRINT_STATS("61-80 Packets: %u", 7245 pdev->stats.rx_ind_histogram.pkts_61_80); 7246 DP_PRINT_STATS("81-100 Packets: %u", 7247 pdev->stats.rx_ind_histogram.pkts_81_100); 7248 DP_PRINT_STATS("101-200 Packets: %u", 7249 pdev->stats.rx_ind_histogram.pkts_101_200); 7250 DP_PRINT_STATS(" 201+ Packets: %u", 7251 pdev->stats.rx_ind_histogram.pkts_201_plus); 7252 7253 DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u", 7254 __func__, 7255 pdev->soc->wlan_cfg_ctx 7256 ->tso_enabled, 7257 pdev->soc->wlan_cfg_ctx 7258 ->lro_enabled, 7259 pdev->soc->wlan_cfg_ctx 7260 ->rx_hash, 7261 pdev->soc->wlan_cfg_ctx 7262 ->napi_enabled); 7263 #ifdef QCA_LL_TX_FLOW_CONTROL_V2 7264 DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u", 7265 __func__, 7266 pdev->soc->wlan_cfg_ctx 7267 ->tx_flow_stop_queue_threshold, 7268 pdev->soc->wlan_cfg_ctx 7269 ->tx_flow_start_queue_offset); 7270 #endif 7271 } 7272 } 7273 7274 /* 7275 * dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats 7276 * Current scope is bar received count 7277 * 7278 * @soc : Datapath SOC handle 7279 * @peer: Datapath peer handle 7280 * @arg : argument to iterate function 7281 * 7282 * Return: void 7283 */ 7284 static void 7285 dp_peer_ctrl_frames_stats_get(struct dp_soc *soc, 7286 struct dp_peer *peer, 7287 void *arg) 7288 { 7289 uint32_t waitcnt; 7290 struct dp_pdev *pdev = peer->vdev->pdev; 7291 7292 waitcnt = 0; 7293 dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev); 7294 while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) && 7295 waitcnt < 10) { 7296 schedule_timeout_interruptible( 7297 STATS_PROC_TIMEOUT); 7298 waitcnt++; 7299 } 7300 qdf_atomic_set(&pdev->stats_cmd_complete, 0); 7301 } 7302 7303 void 7304 dp_print_pdev_tx_stats(struct dp_pdev *pdev) 7305 { 7306 uint8_t i = 0, index = 0; 7307 7308 DP_PRINT_STATS("PDEV Tx Stats:\n"); 7309 DP_PRINT_STATS("Received From Stack:"); 7310 DP_PRINT_STATS(" Packets = %u", 7311 pdev->stats.tx_i.rcvd.num); 7312 DP_PRINT_STATS(" Bytes = %llu", 7313 pdev->stats.tx_i.rcvd.bytes); 7314 DP_PRINT_STATS("Processed:"); 7315 DP_PRINT_STATS(" Packets = %u", 7316 pdev->stats.tx_i.processed.num); 7317 DP_PRINT_STATS(" Bytes = %llu", 7318 pdev->stats.tx_i.processed.bytes); 7319 DP_PRINT_STATS("Total Completions:"); 7320 DP_PRINT_STATS(" Packets = %u", 7321 pdev->stats.tx.comp_pkt.num); 7322 DP_PRINT_STATS(" Bytes = %llu", 7323 pdev->stats.tx.comp_pkt.bytes); 7324 DP_PRINT_STATS("Successful Completions:"); 7325 DP_PRINT_STATS(" Packets = %u", 7326 pdev->stats.tx.tx_success.num); 7327 DP_PRINT_STATS(" Bytes = %llu", 7328 pdev->stats.tx.tx_success.bytes); 7329 DP_PRINT_STATS("Dropped:"); 7330 DP_PRINT_STATS(" Total = %u", 7331 pdev->stats.tx_i.dropped.dropped_pkt.num); 7332 DP_PRINT_STATS(" Dma_map_error = %u", 7333 pdev->stats.tx_i.dropped.dma_error); 7334 DP_PRINT_STATS(" Ring Full = %u", 7335 pdev->stats.tx_i.dropped.ring_full); 7336 DP_PRINT_STATS(" Descriptor Not available = %u", 7337 pdev->stats.tx_i.dropped.desc_na.num); 7338 DP_PRINT_STATS(" HW enqueue failed= %u", 7339 pdev->stats.tx_i.dropped.enqueue_fail); 7340 DP_PRINT_STATS(" Descriptor alloc fail = %u", 7341 pdev->stats.tx_i.dropped.desc_na_exc_alloc_fail.num); 7342 DP_PRINT_STATS(" Tx outstanding too many = %u", 7343 pdev->stats.tx_i.dropped.desc_na_exc_outstand.num); 7344 DP_PRINT_STATS(" Pkt dropped in vdev-id check= %u", 7345 pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check); 7346 DP_PRINT_STATS(" Resources Full = %u", 7347 pdev->stats.tx_i.dropped.res_full); 7348 DP_PRINT_STATS("Tx failed = %u", 7349 pdev->stats.tx.tx_failed); 7350 DP_PRINT_STATS(" FW removed Pkts = %u", 7351 pdev->stats.tx.dropped.fw_rem.num); 7352 DP_PRINT_STATS(" FW removed bytes= %llu", 7353 pdev->stats.tx.dropped.fw_rem.bytes); 7354 DP_PRINT_STATS(" FW removed transmitted = %u", 7355 pdev->stats.tx.dropped.fw_rem_tx); 7356 DP_PRINT_STATS(" FW removed untransmitted = %u", 7357 pdev->stats.tx.dropped.fw_rem_notx); 7358 DP_PRINT_STATS(" FW removed untransmitted fw_reason1 = %u", 7359 pdev->stats.tx.dropped.fw_reason1); 7360 DP_PRINT_STATS(" FW removed untransmitted fw_reason2 = %u", 7361 pdev->stats.tx.dropped.fw_reason2); 7362 DP_PRINT_STATS(" FW removed untransmitted fw_reason3 = %u", 7363 pdev->stats.tx.dropped.fw_reason3); 7364 DP_PRINT_STATS(" FW removed untransmitted disable queue = %u", 7365 pdev->stats.tx.dropped.fw_rem_queue_disable); 7366 DP_PRINT_STATS(" FW removed untransmitted no match = %u", 7367 pdev->stats.tx.dropped.fw_rem_no_match); 7368 DP_PRINT_STATS(" Dropped due to HW threshold criteria = %u", 7369 pdev->stats.tx.dropped.drop_threshold); 7370 DP_PRINT_STATS(" Link desc not available drop = %u", 7371 pdev->stats.tx.dropped.drop_link_desc_na); 7372 DP_PRINT_STATS(" Drop bit set or invalid flow = %u", 7373 pdev->stats.tx.dropped.invalid_drop); 7374 DP_PRINT_STATS(" MCAST vdev drop in HW = %u", 7375 pdev->stats.tx.dropped.mcast_vdev_drop); 7376 DP_PRINT_STATS(" Dropped with invalid reason = %u", 7377 pdev->stats.tx.dropped.invalid_rr); 7378 DP_PRINT_STATS(" Aged Out from msdu/mpdu queues = %u", 7379 pdev->stats.tx.dropped.age_out); 7380 DP_PRINT_STATS(" headroom insufficient = %u", 7381 pdev->stats.tx_i.dropped.headroom_insufficient); 7382 DP_PRINT_STATS("Multicast:"); 7383 DP_PRINT_STATS(" Packets: %u", 7384 pdev->stats.tx.mcast.num); 7385 DP_PRINT_STATS(" Bytes: %llu", 7386 pdev->stats.tx.mcast.bytes); 7387 DP_PRINT_STATS("Scatter Gather:"); 7388 DP_PRINT_STATS(" Packets = %d", 7389 pdev->stats.tx_i.sg.sg_pkt.num); 7390 DP_PRINT_STATS(" Bytes = %llu", 7391 pdev->stats.tx_i.sg.sg_pkt.bytes); 7392 DP_PRINT_STATS(" Dropped By Host = %u", 7393 pdev->stats.tx_i.sg.dropped_host.num); 7394 DP_PRINT_STATS(" Dropped By Target = %u", 7395 pdev->stats.tx_i.sg.dropped_target); 7396 DP_PRINT_STATS("Mcast Enhancement:"); 7397 DP_PRINT_STATS(" Packets = %u", 7398 pdev->stats.tx_i.mcast_en.mcast_pkt.num); 7399 DP_PRINT_STATS(" Bytes = %llu", 7400 pdev->stats.tx_i.mcast_en.mcast_pkt.bytes); 7401 DP_PRINT_STATS(" Dropped: Map Errors = %u", 7402 pdev->stats.tx_i.mcast_en.dropped_map_error); 7403 DP_PRINT_STATS(" Dropped: Self Mac = %u", 7404 pdev->stats.tx_i.mcast_en.dropped_self_mac); 7405 DP_PRINT_STATS(" Dropped: Send Fail = %u", 7406 pdev->stats.tx_i.mcast_en.dropped_send_fail); 7407 DP_PRINT_STATS(" Unicast sent = %u", 7408 pdev->stats.tx_i.mcast_en.ucast); 7409 DP_PRINT_STATS("IGMP Mcast Enhancement:"); 7410 DP_PRINT_STATS(" IGMP packets received = %u", 7411 pdev->stats.tx_i.igmp_mcast_en.igmp_rcvd); 7412 DP_PRINT_STATS(" Converted to uncast = %u", 7413 pdev->stats.tx_i.igmp_mcast_en.igmp_ucast_converted); 7414 DP_PRINT_STATS("Raw:"); 7415 DP_PRINT_STATS(" Packets = %u", 7416 pdev->stats.tx_i.raw.raw_pkt.num); 7417 DP_PRINT_STATS(" Bytes = %llu", 7418 pdev->stats.tx_i.raw.raw_pkt.bytes); 7419 DP_PRINT_STATS(" DMA map error = %u", 7420 pdev->stats.tx_i.raw.dma_map_error); 7421 DP_PRINT_STATS(" RAW pkt type[!data] error = %u", 7422 pdev->stats.tx_i.raw.invalid_raw_pkt_datatype); 7423 DP_PRINT_STATS(" Frags count overflow error = %u", 7424 pdev->stats.tx_i.raw.num_frags_overflow_err); 7425 DP_PRINT_STATS("Reinjected:"); 7426 DP_PRINT_STATS(" Packets = %u", 7427 pdev->stats.tx_i.reinject_pkts.num); 7428 DP_PRINT_STATS(" Bytes = %llu\n", 7429 pdev->stats.tx_i.reinject_pkts.bytes); 7430 DP_PRINT_STATS("Inspected:"); 7431 DP_PRINT_STATS(" Packets = %d", 7432 pdev->stats.tx_i.inspect_pkts.num); 7433 DP_PRINT_STATS(" Bytes = %llu", 7434 pdev->stats.tx_i.inspect_pkts.bytes); 7435 DP_PRINT_STATS("Nawds Multicast:"); 7436 DP_PRINT_STATS(" Packets = %u", 7437 pdev->stats.tx_i.nawds_mcast.num); 7438 DP_PRINT_STATS(" Bytes = %llu", 7439 pdev->stats.tx_i.nawds_mcast.bytes); 7440 DP_PRINT_STATS("CCE Classified:"); 7441 DP_PRINT_STATS(" CCE Classified Packets: %u", 7442 pdev->stats.tx_i.cce_classified); 7443 DP_PRINT_STATS(" RAW CCE Classified Packets: %u", 7444 pdev->stats.tx_i.cce_classified_raw); 7445 DP_PRINT_STATS("Mesh stats:"); 7446 DP_PRINT_STATS(" frames to firmware: %u", 7447 pdev->stats.tx_i.mesh.exception_fw); 7448 DP_PRINT_STATS(" completions from fw: %u", 7449 pdev->stats.tx_i.mesh.completion_fw); 7450 DP_PRINT_STATS("PPDU stats counter"); 7451 for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) { 7452 DP_PRINT_STATS(" Tag[%d] = %llu", index, 7453 pdev->stats.ppdu_stats_counter[index]); 7454 } 7455 DP_PRINT_STATS("BA not received for delayed_ba: %u", 7456 pdev->stats.cdp_delayed_ba_not_recev); 7457 7458 dp_monitor_print_tx_stats(pdev); 7459 7460 DP_PRINT_STATS("tx_ppdu_proc: %llu", 7461 pdev->stats.tx_ppdu_proc); 7462 DP_PRINT_STATS("ack ba comes twice: %llu", 7463 pdev->stats.ack_ba_comes_twice); 7464 DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu", 7465 pdev->stats.ppdu_drop); 7466 DP_PRINT_STATS("ppdu dropped because of wrap around: %llu", 7467 pdev->stats.ppdu_wrap_drop); 7468 7469 for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) { 7470 if (!pdev->stats.wdi_event[i]) 7471 DP_PRINT_STATS("Wdi msgs received from fw[%d]:%d", 7472 i, pdev->stats.wdi_event[i]); 7473 } 7474 7475 dp_monitor_print_pdev_tx_capture_stats(pdev); 7476 } 7477 7478 void 7479 dp_print_pdev_rx_stats(struct dp_pdev *pdev) 7480 { 7481 uint8_t i; 7482 7483 DP_PRINT_STATS("PDEV Rx Stats:\n"); 7484 DP_PRINT_STATS("Received From HW (Per Rx Ring):"); 7485 DP_PRINT_STATS(" Packets = %u %u %u %u", 7486 pdev->stats.rx.rcvd_reo[0].num, 7487 pdev->stats.rx.rcvd_reo[1].num, 7488 pdev->stats.rx.rcvd_reo[2].num, 7489 pdev->stats.rx.rcvd_reo[3].num); 7490 DP_PRINT_STATS(" Bytes = %llu %llu %llu %llu", 7491 pdev->stats.rx.rcvd_reo[0].bytes, 7492 pdev->stats.rx.rcvd_reo[1].bytes, 7493 pdev->stats.rx.rcvd_reo[2].bytes, 7494 pdev->stats.rx.rcvd_reo[3].bytes); 7495 for (i = 0; i < CDP_MAX_LMACS; i++) 7496 DP_PRINT_STATS("Packets Received on lmac[%d] = %d (%llu)", 7497 i, pdev->stats.rx.rx_lmac[i].num, 7498 pdev->stats.rx.rx_lmac[i].bytes); 7499 DP_PRINT_STATS("Replenished:"); 7500 DP_PRINT_STATS(" Packets = %u", 7501 pdev->stats.replenish.pkts.num); 7502 DP_PRINT_STATS(" Buffers Added To Freelist = %u", 7503 pdev->stats.buf_freelist); 7504 DP_PRINT_STATS(" Low threshold intr = %d", 7505 pdev->stats.replenish.low_thresh_intrs); 7506 DP_PRINT_STATS("Dropped:"); 7507 DP_PRINT_STATS(" msdu_not_done = %u", 7508 pdev->stats.dropped.msdu_not_done); 7509 DP_PRINT_STATS(" wifi parse = %u", 7510 pdev->stats.dropped.wifi_parse); 7511 DP_PRINT_STATS(" mon_rx_drop = %u", 7512 pdev->stats.dropped.mon_rx_drop); 7513 DP_PRINT_STATS(" mon_radiotap_update_err = %u", 7514 pdev->stats.dropped.mon_radiotap_update_err); 7515 DP_PRINT_STATS(" mec_drop = %u", 7516 pdev->stats.rx.mec_drop.num); 7517 DP_PRINT_STATS(" Bytes = %llu", 7518 pdev->stats.rx.mec_drop.bytes); 7519 DP_PRINT_STATS(" peer_unauth_drop = %u", 7520 pdev->stats.rx.peer_unauth_rx_pkt_drop); 7521 DP_PRINT_STATS(" policy_check_drop = %u", 7522 pdev->stats.rx.policy_check_drop); 7523 DP_PRINT_STATS("Sent To Stack:"); 7524 DP_PRINT_STATS(" Packets = %u", 7525 pdev->stats.rx.to_stack.num); 7526 DP_PRINT_STATS(" Bytes = %llu", 7527 pdev->stats.rx.to_stack.bytes); 7528 DP_PRINT_STATS(" vlan_tag_stp_cnt = %u", 7529 pdev->stats.vlan_tag_stp_cnt); 7530 DP_PRINT_STATS("Multicast/Broadcast:"); 7531 DP_PRINT_STATS(" Packets = %u", 7532 pdev->stats.rx.multicast.num); 7533 DP_PRINT_STATS(" Bytes = %llu", 7534 pdev->stats.rx.multicast.bytes); 7535 DP_PRINT_STATS("Errors:"); 7536 DP_PRINT_STATS(" Rxdma Ring Un-inititalized = %u", 7537 pdev->stats.replenish.rxdma_err); 7538 DP_PRINT_STATS(" Desc Alloc Failed: = %u", 7539 pdev->stats.err.desc_alloc_fail); 7540 DP_PRINT_STATS(" IP checksum error = %u", 7541 pdev->stats.err.ip_csum_err); 7542 DP_PRINT_STATS(" TCP/UDP checksum error = %u", 7543 pdev->stats.err.tcp_udp_csum_err); 7544 DP_PRINT_STATS(" Failed frag alloc = %u", 7545 pdev->stats.replenish.frag_alloc_fail); 7546 7547 dp_pdev_iterate_peer_lock_safe(pdev, dp_peer_ctrl_frames_stats_get, 7548 NULL, DP_MOD_ID_GENERIC_STATS); 7549 /* Get bar_recv_cnt */ 7550 DP_PRINT_STATS("BAR Received Count: = %u", 7551 pdev->stats.rx.bar_recv_cnt); 7552 7553 DP_PRINT_STATS("RX Buffer Pool Stats:\n"); 7554 DP_PRINT_STATS("\tBuffers consumed during refill = %llu", 7555 pdev->stats.rx_buffer_pool.num_bufs_consumed); 7556 DP_PRINT_STATS("\tSuccessful allocations during refill = %llu", 7557 pdev->stats.rx_buffer_pool.num_bufs_alloc_success); 7558 DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu", 7559 pdev->stats.rx_buffer_pool.num_pool_bufs_replenish); 7560 } 7561 7562 void 7563 dp_print_soc_tx_stats(struct dp_soc *soc) 7564 { 7565 uint8_t desc_pool_id; 7566 7567 soc->stats.tx.desc_in_use = 0; 7568 7569 DP_PRINT_STATS("SOC Tx Stats:\n"); 7570 7571 for (desc_pool_id = 0; 7572 desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx); 7573 desc_pool_id++) 7574 soc->stats.tx.desc_in_use += 7575 soc->tx_desc[desc_pool_id].num_allocated; 7576 7577 DP_PRINT_STATS("Tx Descriptors In Use = %u", 7578 soc->stats.tx.desc_in_use); 7579 DP_PRINT_STATS("Tx Invalid peer:"); 7580 DP_PRINT_STATS(" Packets = %u", 7581 soc->stats.tx.tx_invalid_peer.num); 7582 DP_PRINT_STATS(" Bytes = %llu", 7583 soc->stats.tx.tx_invalid_peer.bytes); 7584 DP_PRINT_STATS("Packets dropped due to TCL ring full = %u %u %u %u", 7585 soc->stats.tx.tcl_ring_full[0], 7586 soc->stats.tx.tcl_ring_full[1], 7587 soc->stats.tx.tcl_ring_full[2], 7588 soc->stats.tx.tcl_ring_full[3]); 7589 DP_PRINT_STATS("Tx invalid completion release = %u", 7590 soc->stats.tx.invalid_release_source); 7591 DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]", 7592 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL], 7593 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER], 7594 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC], 7595 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF], 7596 soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]); 7597 DP_PRINT_STATS("Tx comp non wbm internal error = %d", 7598 soc->stats.tx.non_wbm_internal_err); 7599 DP_PRINT_STATS("Tx comp loop pkt limit hit = %d", 7600 soc->stats.tx.tx_comp_loop_pkt_limit_hit); 7601 DP_PRINT_STATS("Tx comp HP out of sync2 = %d", 7602 soc->stats.tx.hp_oos2); 7603 } 7604 7605 static 7606 int dp_fill_rx_interrupt_ctx_stats(struct dp_intr *intr_ctx, 7607 char *buf, int buf_len) 7608 { int i; 7609 int pos = 0; 7610 7611 if (buf_len <= 0 || !buf) { 7612 dp_err("incorrect buf or buf_len(%d)!", buf_len); 7613 return pos; 7614 } 7615 7616 for (i = 0; i < MAX_REO_DEST_RINGS; i++) { 7617 if (intr_ctx->intr_stats.num_rx_ring_masks[i]) 7618 pos += qdf_scnprintf(buf + pos, 7619 buf_len - pos, 7620 "reo[%u]:%u ", i, 7621 intr_ctx->intr_stats.num_rx_ring_masks[i]); 7622 } 7623 return pos; 7624 } 7625 7626 static 7627 int dp_fill_tx_interrupt_ctx_stats(struct dp_intr *intr_ctx, 7628 char *buf, int buf_len) 7629 { int i; 7630 int pos = 0; 7631 7632 if (buf_len <= 0 || !buf) { 7633 dp_err("incorrect buf or buf_len(%d)!", buf_len); 7634 return pos; 7635 } 7636 7637 for (i = 0; i < MAX_TCL_DATA_RINGS; i++) { 7638 if (intr_ctx->intr_stats.num_tx_ring_masks[i]) 7639 pos += qdf_scnprintf(buf + pos, 7640 buf_len - pos, 7641 "tx_comps[%u]:%u ", i, 7642 intr_ctx->intr_stats.num_tx_ring_masks[i]); 7643 } 7644 return pos; 7645 } 7646 7647 #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING 7648 #define DP_SRNG_HIGH_WM_STATS_STRING_LEN 512 7649 void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask) 7650 { 7651 char *buf; 7652 int ring, pos, buf_len; 7653 char srng_high_wm_str[DP_SRNG_HIGH_WM_STATS_STRING_LEN] = {'\0'}; 7654 7655 if (!srng_mask) 7656 return; 7657 7658 buf = srng_high_wm_str; 7659 buf_len = DP_SRNG_HIGH_WM_STATS_STRING_LEN; 7660 7661 dp_info("%8s %7s %12s %10s %10s %10s %10s %10s %10s", 7662 "ring_id", "high_wm", "time", "<50", "50-60", "60-70", 7663 "70-80", "80-90", "90-100"); 7664 7665 if (srng_mask & (1 << REO_DST)) { 7666 for (ring = 0; ring < soc->num_reo_dest_rings; ring++) { 7667 pos = 0; 7668 pos += hal_dump_srng_high_wm_stats(soc->hal_soc, 7669 soc->reo_dest_ring[ring].hal_srng, 7670 buf, buf_len, pos); 7671 dp_info("%s", srng_high_wm_str); 7672 } 7673 } 7674 } 7675 #endif 7676 7677 #define DP_INT_CTX_STATS_STRING_LEN 512 7678 void dp_print_soc_interrupt_stats(struct dp_soc *soc) 7679 { 7680 char *buf; 7681 char int_ctx_str[DP_INT_CTX_STATS_STRING_LEN] = {'\0'}; 7682 int i, pos, buf_len; 7683 struct dp_intr_stats *intr_stats; 7684 7685 buf = int_ctx_str; 7686 buf_len = DP_INT_CTX_STATS_STRING_LEN; 7687 7688 for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) { 7689 pos = 0; 7690 qdf_mem_zero(int_ctx_str, sizeof(int_ctx_str)); 7691 intr_stats = &soc->intr_ctx[i].intr_stats; 7692 7693 if (!intr_stats->num_masks && !intr_stats->num_near_full_masks) 7694 continue; 7695 7696 pos += qdf_scnprintf(buf + pos, 7697 buf_len - pos, 7698 "%2u[%3d] - Total:%u ", 7699 i, 7700 hif_get_int_ctx_irq_num(soc->hif_handle, 7701 i), 7702 intr_stats->num_masks); 7703 7704 if (soc->intr_ctx[i].tx_ring_mask) 7705 pos += dp_fill_tx_interrupt_ctx_stats(&soc->intr_ctx[i], 7706 buf + pos, 7707 buf_len - pos); 7708 7709 if (soc->intr_ctx[i].rx_ring_mask) 7710 pos += dp_fill_rx_interrupt_ctx_stats(&soc->intr_ctx[i], 7711 buf + pos, 7712 buf_len - pos); 7713 if (soc->intr_ctx[i].rx_err_ring_mask) 7714 pos += qdf_scnprintf(buf + pos, 7715 buf_len - pos, 7716 "reo_err:%u ", 7717 intr_stats->num_rx_err_ring_masks); 7718 7719 if (soc->intr_ctx[i].rx_wbm_rel_ring_mask) 7720 pos += qdf_scnprintf(buf + pos, 7721 buf_len - pos, 7722 "wbm_rx_err:%u ", 7723 intr_stats->num_rx_wbm_rel_ring_masks); 7724 7725 if (soc->intr_ctx[i].rxdma2host_ring_mask) 7726 pos += qdf_scnprintf(buf + pos, 7727 buf_len - pos, 7728 "rxdma2_host_err:%u ", 7729 intr_stats->num_rxdma2host_ring_masks); 7730 7731 if (soc->intr_ctx[i].rx_near_full_grp_1_mask) 7732 pos += qdf_scnprintf(buf + pos, 7733 buf_len - pos, 7734 "rx_near_full_grp_1:%u ", 7735 intr_stats->num_near_full_masks); 7736 7737 if (soc->intr_ctx[i].rx_near_full_grp_2_mask) 7738 pos += qdf_scnprintf(buf + pos, 7739 buf_len - pos, 7740 "rx_near_full_grp_2:%u ", 7741 intr_stats->num_near_full_masks); 7742 if (soc->intr_ctx[i].tx_ring_near_full_mask) 7743 pos += qdf_scnprintf(buf + pos, 7744 buf_len - pos, 7745 "tx_near_full:%u ", 7746 intr_stats->num_near_full_masks); 7747 7748 dp_info("%s", int_ctx_str); 7749 } 7750 } 7751 7752 void 7753 dp_print_soc_rx_stats(struct dp_soc *soc) 7754 { 7755 uint32_t i; 7756 char reo_error[DP_REO_ERR_LENGTH]; 7757 char rxdma_error[DP_RXDMA_ERR_LENGTH]; 7758 uint8_t index = 0; 7759 7760 DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries); 7761 DP_PRINT_STATS("SOC Rx Stats:\n"); 7762 DP_PRINT_STATS("Fragmented packets: %u", 7763 soc->stats.rx.rx_frags); 7764 DP_PRINT_STATS("Reo reinjected packets: %u", 7765 soc->stats.rx.reo_reinject); 7766 DP_PRINT_STATS("Errors:\n"); 7767 DP_PRINT_STATS("Rx Decrypt Errors = %d", 7768 (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] + 7769 soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC])); 7770 DP_PRINT_STATS("Invalid RBM = %d", 7771 soc->stats.rx.err.invalid_rbm); 7772 DP_PRINT_STATS("Invalid Vdev = %d", 7773 soc->stats.rx.err.invalid_vdev); 7774 DP_PRINT_STATS("Invalid sa_idx or da_idx = %d", 7775 soc->stats.rx.err.invalid_sa_da_idx); 7776 DP_PRINT_STATS("Defrag peer uninit = %d", 7777 soc->stats.rx.err.defrag_peer_uninit); 7778 DP_PRINT_STATS("Pkts delivered no peer = %d", 7779 soc->stats.rx.err.pkt_delivered_no_peer); 7780 DP_PRINT_STATS("Invalid Pdev = %d", 7781 soc->stats.rx.err.invalid_pdev); 7782 DP_PRINT_STATS("Invalid Peer = %d", 7783 soc->stats.rx.err.rx_invalid_peer.num); 7784 DP_PRINT_STATS("HAL Ring Access Fail = %d", 7785 soc->stats.rx.err.hal_ring_access_fail); 7786 DP_PRINT_STATS("HAL Ring Access Full Fail = %d", 7787 soc->stats.rx.err.hal_ring_access_full_fail); 7788 DP_PRINT_STATS("MSDU Done failures = %d", 7789 soc->stats.rx.err.msdu_done_fail); 7790 DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags); 7791 DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait); 7792 DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err); 7793 DP_PRINT_STATS("RX frag OOR: %d", soc->stats.rx.rx_frag_oor); 7794 7795 DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2); 7796 DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full); 7797 7798 DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d", 7799 soc->stats.rx.reap_loop_pkt_limit_hit); 7800 DP_PRINT_STATS("RX DESC invalid magic: %u", 7801 soc->stats.rx.err.rx_desc_invalid_magic); 7802 DP_PRINT_STATS("RX DUP DESC: %d", 7803 soc->stats.rx.err.hal_reo_dest_dup); 7804 DP_PRINT_STATS("RX REL DUP DESC: %d", 7805 soc->stats.rx.err.hal_wbm_rel_dup); 7806 7807 DP_PRINT_STATS("RXDMA ERR DUP DESC: %d", 7808 soc->stats.rx.err.hal_rxdma_err_dup); 7809 7810 DP_PRINT_STATS("RX scatter msdu: %d", 7811 soc->stats.rx.err.scatter_msdu); 7812 7813 DP_PRINT_STATS("RX invalid cookie: %d", 7814 soc->stats.rx.err.invalid_cookie); 7815 7816 DP_PRINT_STATS("RX stale cookie: %d", 7817 soc->stats.rx.err.stale_cookie); 7818 7819 DP_PRINT_STATS("RX wait completed msdu break: %d", 7820 soc->stats.rx.msdu_scatter_wait_break); 7821 7822 DP_PRINT_STATS("2k jump delba sent: %d", 7823 soc->stats.rx.err.rx_2k_jump_delba_sent); 7824 7825 DP_PRINT_STATS("2k jump msdu to stack: %d", 7826 soc->stats.rx.err.rx_2k_jump_to_stack); 7827 7828 DP_PRINT_STATS("2k jump msdu drop: %d", 7829 soc->stats.rx.err.rx_2k_jump_drop); 7830 7831 DP_PRINT_STATS("REO err oor msdu to stack %d", 7832 soc->stats.rx.err.reo_err_oor_to_stack); 7833 7834 DP_PRINT_STATS("REO err oor msdu drop: %d", 7835 soc->stats.rx.err.reo_err_oor_drop); 7836 7837 DP_PRINT_STATS("Rx err msdu rejected: %d", 7838 soc->stats.rx.err.rejected); 7839 7840 DP_PRINT_STATS("Rx stale link desc cookie: %d", 7841 soc->stats.rx.err.invalid_link_cookie); 7842 7843 DP_PRINT_STATS("Rx nbuf sanity fail: %d", 7844 soc->stats.rx.err.nbuf_sanity_fail); 7845 7846 DP_PRINT_STATS("Rx err msdu continuation err: %d", 7847 soc->stats.rx.err.msdu_continuation_err); 7848 7849 DP_PRINT_STATS("ssn update count: %d", 7850 soc->stats.rx.err.ssn_update_count); 7851 7852 DP_PRINT_STATS("bar handle update fail count: %d", 7853 soc->stats.rx.err.bar_handle_fail_count); 7854 7855 DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d", 7856 soc->stats.rx.err.pn_in_dest_check_fail); 7857 7858 for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) { 7859 index += qdf_snprint(&rxdma_error[index], 7860 DP_RXDMA_ERR_LENGTH - index, 7861 " %d", soc->stats.rx.err.rxdma_error[i]); 7862 } 7863 DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error); 7864 7865 index = 0; 7866 for (i = 0; i < HAL_REO_ERR_MAX; i++) { 7867 index += qdf_snprint(&reo_error[index], 7868 DP_REO_ERR_LENGTH - index, 7869 " %d", soc->stats.rx.err.reo_error[i]); 7870 } 7871 DP_PRINT_STATS("REO Error(0-14):%s", reo_error); 7872 DP_PRINT_STATS("REO CMD SEND FAIL: %d", 7873 soc->stats.rx.err.reo_cmd_send_fail); 7874 7875 DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame); 7876 DP_PRINT_STATS("Rxdma2rel route drop:%d", 7877 soc->stats.rx.rxdma2rel_route_drop); 7878 DP_PRINT_STATS("Reo2rel route drop:%d", 7879 soc->stats.rx.reo2rel_route_drop); 7880 DP_PRINT_STATS("Rx Flush count:%d", soc->stats.rx.err.rx_flush_count); 7881 DP_PRINT_STATS("Rx invalid TID count:%d", 7882 soc->stats.rx.err.rx_invalid_tid_err); 7883 } 7884 7885 #ifdef FEATURE_TSO_STATS 7886 void dp_print_tso_stats(struct dp_soc *soc, 7887 enum qdf_stats_verbosity_level level) 7888 { 7889 uint8_t loop_pdev; 7890 uint32_t id; 7891 struct dp_pdev *pdev; 7892 7893 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 7894 pdev = soc->pdev_list[loop_pdev]; 7895 DP_PRINT_STATS("TSO Statistics\n"); 7896 DP_PRINT_STATS( 7897 "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d", 7898 pdev->stats.tx_i.rcvd.num, 7899 pdev->stats.tx.tx_success.num, 7900 pdev->stats.tso_stats.num_tso_pkts.num, 7901 pdev->stats.tso_stats.tso_comp); 7902 7903 for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) { 7904 /* TSO LEVEL 1 - PACKET INFO */ 7905 DP_PRINT_STATS( 7906 "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u", 7907 id, 7908 pdev->stats.tso_stats.tso_info 7909 .tso_packet_info[id].tso_packet_len, 7910 pdev->stats.tso_stats.tso_info 7911 .tso_packet_info[id].num_seg); 7912 /* TSO LEVEL 2 */ 7913 if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH) 7914 dp_print_tso_seg_stats(pdev, id); 7915 } 7916 7917 DP_PRINT_STATS( 7918 "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu", 7919 pdev->stats.tso_stats.seg_histogram.segs_1, 7920 pdev->stats.tso_stats.seg_histogram.segs_2_5, 7921 pdev->stats.tso_stats.seg_histogram.segs_6_10, 7922 pdev->stats.tso_stats.seg_histogram.segs_11_15, 7923 pdev->stats.tso_stats.seg_histogram.segs_16_20, 7924 pdev->stats.tso_stats.seg_histogram.segs_20_plus); 7925 } 7926 } 7927 7928 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev, 7929 uint8_t _p_cntrs) 7930 { 7931 if (_p_cntrs == 1) { 7932 DP_STATS_INC(pdev, 7933 tso_stats.seg_histogram.segs_1, 1); 7934 } else if (_p_cntrs >= 2 && _p_cntrs <= 5) { 7935 DP_STATS_INC(pdev, 7936 tso_stats.seg_histogram.segs_2_5, 1); 7937 } else if (_p_cntrs > 5 && _p_cntrs <= 10) { 7938 DP_STATS_INC(pdev, 7939 tso_stats.seg_histogram.segs_6_10, 1); 7940 } else if (_p_cntrs > 10 && _p_cntrs <= 15) { 7941 DP_STATS_INC(pdev, 7942 tso_stats.seg_histogram.segs_11_15, 1); 7943 } else if (_p_cntrs > 15 && _p_cntrs <= 20) { 7944 DP_STATS_INC(pdev, 7945 tso_stats.seg_histogram.segs_16_20, 1); 7946 } else if (_p_cntrs > 20) { 7947 DP_STATS_INC(pdev, 7948 tso_stats.seg_histogram.segs_20_plus, 1); 7949 } 7950 } 7951 7952 void dp_tso_segment_update(struct dp_pdev *pdev, 7953 uint32_t stats_idx, 7954 uint8_t idx, 7955 struct qdf_tso_seg_t seg) 7956 { 7957 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7958 .tso_seg[idx].num_frags, 7959 seg.num_frags); 7960 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7961 .tso_seg[idx].total_len, 7962 seg.total_len); 7963 7964 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7965 .tso_seg[idx].tso_flags.tso_enable, 7966 seg.tso_flags.tso_enable); 7967 7968 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7969 .tso_seg[idx].tso_flags.fin, 7970 seg.tso_flags.fin); 7971 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7972 .tso_seg[idx].tso_flags.syn, 7973 seg.tso_flags.syn); 7974 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7975 .tso_seg[idx].tso_flags.rst, 7976 seg.tso_flags.rst); 7977 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7978 .tso_seg[idx].tso_flags.psh, 7979 seg.tso_flags.psh); 7980 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7981 .tso_seg[idx].tso_flags.ack, 7982 seg.tso_flags.ack); 7983 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7984 .tso_seg[idx].tso_flags.urg, 7985 seg.tso_flags.urg); 7986 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7987 .tso_seg[idx].tso_flags.ece, 7988 seg.tso_flags.ece); 7989 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7990 .tso_seg[idx].tso_flags.cwr, 7991 seg.tso_flags.cwr); 7992 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7993 .tso_seg[idx].tso_flags.ns, 7994 seg.tso_flags.ns); 7995 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7996 .tso_seg[idx].tso_flags.tcp_seq_num, 7997 seg.tso_flags.tcp_seq_num); 7998 DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx] 7999 .tso_seg[idx].tso_flags.ip_id, 8000 seg.tso_flags.ip_id); 8001 } 8002 8003 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx, 8004 qdf_nbuf_t msdu, uint16_t num_segs) 8005 { 8006 DP_STATS_UPD(pdev, 8007 tso_stats.tso_info.tso_packet_info[stats_idx] 8008 .num_seg, 8009 num_segs); 8010 8011 DP_STATS_UPD(pdev, 8012 tso_stats.tso_info.tso_packet_info[stats_idx] 8013 .tso_packet_len, 8014 qdf_nbuf_get_tcp_payload_len(msdu)); 8015 } 8016 8017 void dp_tso_segment_stats_update(struct dp_pdev *pdev, 8018 struct qdf_tso_seg_elem_t *stats_seg, 8019 uint32_t stats_idx) 8020 { 8021 uint8_t tso_seg_idx = 0; 8022 8023 while (stats_seg && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) { 8024 dp_tso_segment_update(pdev, stats_idx, 8025 tso_seg_idx, 8026 stats_seg->seg); 8027 ++tso_seg_idx; 8028 stats_seg = stats_seg->next; 8029 } 8030 } 8031 8032 void dp_txrx_clear_tso_stats(struct dp_soc *soc) 8033 { 8034 uint8_t loop_pdev; 8035 struct dp_pdev *pdev; 8036 8037 for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { 8038 pdev = soc->pdev_list[loop_pdev]; 8039 dp_init_tso_stats(pdev); 8040 } 8041 } 8042 #endif /* FEATURE_TSO_STATS */ 8043 8044 QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer, 8045 enum cdp_peer_stats_type type, 8046 cdp_peer_stats_param_t *buf) 8047 { 8048 QDF_STATUS ret = QDF_STATUS_SUCCESS; 8049 struct dp_peer *tgt_peer; 8050 struct dp_txrx_peer *txrx_peer; 8051 struct dp_peer_per_pkt_stats *peer_stats; 8052 8053 txrx_peer = dp_get_txrx_peer(peer); 8054 if (!txrx_peer) 8055 return QDF_STATUS_E_FAILURE; 8056 8057 peer_stats = &txrx_peer->stats.per_pkt_stats; 8058 switch (type) { 8059 case cdp_peer_tx_ucast: 8060 buf->tx_ucast = peer_stats->tx.ucast; 8061 break; 8062 case cdp_peer_tx_mcast: 8063 buf->tx_mcast = peer_stats->tx.mcast; 8064 break; 8065 case cdp_peer_tx_inactive_time: 8066 tgt_peer = dp_get_tgt_peer_from_peer(peer); 8067 if (tgt_peer) 8068 buf->tx_inactive_time = 8069 tgt_peer->stats.tx.inactive_time; 8070 else 8071 ret = QDF_STATUS_E_FAILURE; 8072 break; 8073 case cdp_peer_rx_ucast: 8074 buf->rx_ucast = peer_stats->rx.unicast; 8075 break; 8076 default: 8077 ret = QDF_STATUS_E_FAILURE; 8078 break; 8079 } 8080 8081 return ret; 8082 } 8083 8084 #ifdef QCA_ENHANCED_STATS_SUPPORT 8085 #ifdef WLAN_FEATURE_11BE_MLO 8086 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 8087 enum cdp_peer_stats_type type, 8088 cdp_peer_stats_param_t *buf) 8089 { 8090 QDF_STATUS ret = QDF_STATUS_E_FAILURE; 8091 struct dp_soc *soc = peer->vdev->pdev->soc; 8092 8093 if (IS_MLO_DP_MLD_PEER(peer)) { 8094 struct dp_peer *link_peer; 8095 struct dp_soc *link_peer_soc; 8096 8097 link_peer = dp_get_primary_link_peer_by_id(soc, peer->peer_id, 8098 DP_MOD_ID_CDP); 8099 8100 if (link_peer) { 8101 link_peer_soc = link_peer->vdev->pdev->soc; 8102 ret = dp_monitor_peer_get_stats_param(link_peer_soc, 8103 link_peer, 8104 type, buf); 8105 dp_peer_unref_delete(link_peer, DP_MOD_ID_CDP); 8106 } 8107 return ret; 8108 } else { 8109 return dp_monitor_peer_get_stats_param(soc, peer, type, buf); 8110 } 8111 } 8112 #else 8113 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 8114 enum cdp_peer_stats_type type, 8115 cdp_peer_stats_param_t *buf) 8116 { 8117 struct dp_soc *soc = peer->vdev->pdev->soc; 8118 8119 return dp_monitor_peer_get_stats_param(soc, peer, type, buf); 8120 } 8121 #endif 8122 #else 8123 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 8124 enum cdp_peer_stats_type type, 8125 cdp_peer_stats_param_t *buf) 8126 { 8127 QDF_STATUS ret = QDF_STATUS_SUCCESS; 8128 struct dp_txrx_peer *txrx_peer; 8129 struct dp_peer_extd_stats *peer_stats; 8130 8131 txrx_peer = dp_get_txrx_peer(peer); 8132 if (!txrx_peer) 8133 return QDF_STATUS_E_FAILURE; 8134 8135 peer_stats = &txrx_peer->stats.extd_stats; 8136 8137 switch (type) { 8138 case cdp_peer_tx_rate: 8139 buf->tx_rate = peer_stats->tx.tx_rate; 8140 break; 8141 case cdp_peer_tx_last_tx_rate: 8142 buf->last_tx_rate = peer_stats->tx.last_tx_rate; 8143 break; 8144 case cdp_peer_tx_ratecode: 8145 buf->tx_ratecode = peer_stats->tx.tx_ratecode; 8146 break; 8147 case cdp_peer_rx_rate: 8148 buf->rx_rate = peer_stats->rx.rx_rate; 8149 break; 8150 case cdp_peer_rx_last_rx_rate: 8151 buf->last_rx_rate = peer_stats->rx.last_rx_rate; 8152 break; 8153 case cdp_peer_rx_ratecode: 8154 buf->rx_ratecode = peer_stats->rx.rx_ratecode; 8155 break; 8156 case cdp_peer_rx_avg_snr: 8157 buf->rx_avg_snr = peer_stats->rx.avg_snr; 8158 break; 8159 case cdp_peer_rx_snr: 8160 buf->rx_snr = peer_stats->rx.snr; 8161 break; 8162 default: 8163 ret = QDF_STATUS_E_FAILURE; 8164 break; 8165 } 8166 8167 return ret; 8168 } 8169 #endif 8170 8171 /** 8172 * dp_is_wds_extended() - Check if wds ext is enabled 8173 * @txrx_peer: DP txrx_peer handle 8174 * 8175 * return: true if enabled, false if not 8176 */ 8177 #ifdef QCA_SUPPORT_WDS_EXTENDED 8178 static inline 8179 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer) 8180 { 8181 if (qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT, 8182 &txrx_peer->wds_ext.init)) 8183 return true; 8184 8185 return false; 8186 } 8187 #else 8188 static inline 8189 bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer) 8190 { 8191 return false; 8192 } 8193 #endif /* QCA_SUPPORT_WDS_EXTENDED */ 8194 8195 /** 8196 * dp_peer_get_hw_txrx_stats_en() - Get value of hw_txrx_stats_en 8197 * @txrx_peer: DP txrx_peer handle 8198 * 8199 * Return: true if enabled, false if not 8200 */ 8201 #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT 8202 static inline 8203 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer) 8204 { 8205 return txrx_peer->hw_txrx_stats_en; 8206 } 8207 #else 8208 static inline 8209 bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer) 8210 { 8211 return false; 8212 } 8213 #endif 8214 8215 #ifdef WLAN_FEATURE_11BE_MLO 8216 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer) 8217 { 8218 /* ML primay link peer return mld_peer */ 8219 if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link) 8220 return peer->mld_peer; 8221 8222 return peer; 8223 } 8224 #else 8225 static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer) 8226 { 8227 return peer; 8228 } 8229 #endif 8230 8231 /** 8232 * dp_update_vdev_basic_stats() - Update vdev basic stats 8233 * @txrx_peer: DP txrx_peer handle 8234 * @tgtobj: Pointer to buffer for vdev stats 8235 * 8236 * Return: None 8237 */ 8238 static inline 8239 void dp_update_vdev_basic_stats(struct dp_txrx_peer *txrx_peer, 8240 struct cdp_vdev_stats *tgtobj) 8241 { 8242 if (qdf_unlikely(!txrx_peer || !tgtobj)) 8243 return; 8244 8245 if (!dp_peer_get_hw_txrx_stats_en(txrx_peer)) { 8246 tgtobj->tx.comp_pkt.num += txrx_peer->comp_pkt.num; 8247 tgtobj->tx.comp_pkt.bytes += txrx_peer->comp_pkt.bytes; 8248 tgtobj->tx.tx_failed += txrx_peer->tx_failed; 8249 } 8250 tgtobj->rx.to_stack.num += txrx_peer->to_stack.num; 8251 tgtobj->rx.to_stack.bytes += txrx_peer->to_stack.bytes; 8252 } 8253 8254 #ifdef QCA_ENHANCED_STATS_SUPPORT 8255 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj, 8256 void *arg) 8257 { 8258 struct dp_txrx_peer *txrx_peer; 8259 struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg; 8260 struct dp_peer_per_pkt_stats *per_pkt_stats; 8261 8262 txrx_peer = dp_get_txrx_peer(srcobj); 8263 if (qdf_unlikely(!txrx_peer)) 8264 goto link_stats; 8265 8266 if (qdf_unlikely(dp_is_wds_extended(txrx_peer))) 8267 return; 8268 8269 if (!dp_peer_is_primary_link_peer(srcobj)) 8270 goto link_stats; 8271 8272 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8273 8274 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 8275 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8276 8277 link_stats: 8278 dp_monitor_peer_get_stats(soc, srcobj, vdev_stats, UPDATE_VDEV_STATS); 8279 } 8280 8281 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev, 8282 struct dp_peer *peer) 8283 { 8284 struct dp_soc *soc = vdev->pdev->soc; 8285 struct dp_txrx_peer *txrx_peer; 8286 struct dp_peer_per_pkt_stats *per_pkt_stats; 8287 struct cdp_vdev_stats *vdev_stats = &vdev->stats; 8288 8289 txrx_peer = peer->txrx_peer; 8290 if (!txrx_peer) 8291 goto link_stats; 8292 8293 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8294 8295 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 8296 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8297 8298 link_stats: 8299 dp_monitor_peer_get_stats(soc, peer, vdev_stats, UPDATE_VDEV_STATS); 8300 } 8301 8302 #else 8303 void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj, 8304 void *arg) 8305 { 8306 struct dp_txrx_peer *txrx_peer; 8307 struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg; 8308 struct dp_peer_per_pkt_stats *per_pkt_stats; 8309 struct dp_peer_extd_stats *extd_stats; 8310 8311 txrx_peer = dp_get_txrx_peer(srcobj); 8312 if (qdf_unlikely(!txrx_peer)) 8313 return; 8314 8315 if (qdf_unlikely(dp_is_wds_extended(txrx_peer))) 8316 return; 8317 8318 if (!dp_peer_is_primary_link_peer(srcobj)) 8319 return; 8320 8321 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8322 8323 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 8324 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8325 8326 extd_stats = &txrx_peer->stats.extd_stats; 8327 DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats); 8328 } 8329 8330 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev, 8331 struct dp_peer *peer) 8332 { 8333 struct dp_txrx_peer *txrx_peer; 8334 struct dp_peer_per_pkt_stats *per_pkt_stats; 8335 struct dp_peer_extd_stats *extd_stats; 8336 struct cdp_vdev_stats *vdev_stats = &vdev->stats; 8337 8338 txrx_peer = peer->txrx_peer; 8339 if (!txrx_peer) 8340 return; 8341 8342 dp_update_vdev_basic_stats(txrx_peer, vdev_stats); 8343 8344 per_pkt_stats = &txrx_peer->stats.per_pkt_stats; 8345 DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats); 8346 8347 extd_stats = &txrx_peer->stats.extd_stats; 8348 DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats); 8349 } 8350 #endif 8351 8352 void dp_update_pdev_stats(struct dp_pdev *tgtobj, 8353 struct cdp_vdev_stats *srcobj) 8354 { 8355 uint8_t i; 8356 uint8_t pream_type; 8357 uint8_t mu_type; 8358 struct cdp_pdev_stats *pdev_stats = NULL; 8359 8360 pdev_stats = &tgtobj->stats; 8361 for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { 8362 for (i = 0; i < MAX_MCS; i++) { 8363 tgtobj->stats.tx.pkt_type[pream_type]. 8364 mcs_count[i] += 8365 srcobj->tx.pkt_type[pream_type]. 8366 mcs_count[i]; 8367 tgtobj->stats.rx.pkt_type[pream_type]. 8368 mcs_count[i] += 8369 srcobj->rx.pkt_type[pream_type]. 8370 mcs_count[i]; 8371 } 8372 } 8373 8374 for (i = 0; i < MAX_BW; i++) { 8375 tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i]; 8376 tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i]; 8377 } 8378 8379 for (i = 0; i < SS_COUNT; i++) { 8380 tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i]; 8381 tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i]; 8382 tgtobj->stats.rx.ppdu_nss[i] += srcobj->rx.ppdu_nss[i]; 8383 } 8384 8385 for (i = 0; i < WME_AC_MAX; i++) { 8386 tgtobj->stats.tx.wme_ac_type[i] += 8387 srcobj->tx.wme_ac_type[i]; 8388 tgtobj->stats.rx.wme_ac_type[i] += 8389 srcobj->rx.wme_ac_type[i]; 8390 tgtobj->stats.tx.excess_retries_per_ac[i] += 8391 srcobj->tx.excess_retries_per_ac[i]; 8392 } 8393 8394 for (i = 0; i < MAX_GI; i++) { 8395 tgtobj->stats.tx.sgi_count[i] += 8396 srcobj->tx.sgi_count[i]; 8397 tgtobj->stats.rx.sgi_count[i] += 8398 srcobj->rx.sgi_count[i]; 8399 } 8400 8401 for (i = 0; i < MAX_RECEPTION_TYPES; i++) { 8402 tgtobj->stats.rx.reception_type[i] += 8403 srcobj->rx.reception_type[i]; 8404 tgtobj->stats.rx.ppdu_cnt[i] += srcobj->rx.ppdu_cnt[i]; 8405 } 8406 8407 for (i = 0; i < MAX_TRANSMIT_TYPES; i++) { 8408 tgtobj->stats.tx.transmit_type[i].num_msdu += 8409 srcobj->tx.transmit_type[i].num_msdu; 8410 tgtobj->stats.tx.transmit_type[i].num_mpdu += 8411 srcobj->tx.transmit_type[i].num_mpdu; 8412 tgtobj->stats.tx.transmit_type[i].mpdu_tried += 8413 srcobj->tx.transmit_type[i].mpdu_tried; 8414 } 8415 8416 for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++) 8417 tgtobj->stats.tx.no_ack_count[i] += srcobj->tx.no_ack_count[i]; 8418 8419 for (i = 0; i < MAX_MU_GROUP_ID; i++) 8420 tgtobj->stats.tx.mu_group_id[i] = srcobj->tx.mu_group_id[i]; 8421 8422 for (i = 0; i < MAX_RU_LOCATIONS; i++) { 8423 tgtobj->stats.tx.ru_loc[i].num_msdu += 8424 srcobj->tx.ru_loc[i].num_msdu; 8425 tgtobj->stats.tx.ru_loc[i].num_mpdu += 8426 srcobj->tx.ru_loc[i].num_mpdu; 8427 tgtobj->stats.tx.ru_loc[i].mpdu_tried += 8428 srcobj->tx.ru_loc[i].mpdu_tried; 8429 } 8430 8431 tgtobj->stats.tx.tx_ppdus += srcobj->tx.tx_ppdus; 8432 tgtobj->stats.tx.tx_mpdus_success += srcobj->tx.tx_mpdus_success; 8433 tgtobj->stats.tx.tx_mpdus_tried += srcobj->tx.tx_mpdus_tried; 8434 tgtobj->stats.tx.retries_mpdu += srcobj->tx.retries_mpdu; 8435 tgtobj->stats.tx.mpdu_success_with_retries += 8436 srcobj->tx.mpdu_success_with_retries; 8437 tgtobj->stats.tx.last_tx_ts = srcobj->tx.last_tx_ts; 8438 tgtobj->stats.tx.tx_rate = srcobj->tx.tx_rate; 8439 tgtobj->stats.tx.last_tx_rate = srcobj->tx.last_tx_rate; 8440 tgtobj->stats.tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs; 8441 tgtobj->stats.tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate; 8442 tgtobj->stats.tx.mcast_last_tx_rate_mcs = 8443 srcobj->tx.mcast_last_tx_rate_mcs; 8444 tgtobj->stats.tx.rnd_avg_tx_rate = srcobj->tx.rnd_avg_tx_rate; 8445 tgtobj->stats.tx.avg_tx_rate = srcobj->tx.avg_tx_rate; 8446 tgtobj->stats.tx.tx_ratecode = srcobj->tx.tx_ratecode; 8447 tgtobj->stats.tx.ru_start = srcobj->tx.ru_start; 8448 tgtobj->stats.tx.ru_tones = srcobj->tx.ru_tones; 8449 tgtobj->stats.tx.last_ack_rssi = srcobj->tx.last_ack_rssi; 8450 tgtobj->stats.tx.nss_info = srcobj->tx.nss_info; 8451 tgtobj->stats.tx.mcs_info = srcobj->tx.mcs_info; 8452 tgtobj->stats.tx.bw_info = srcobj->tx.bw_info; 8453 tgtobj->stats.tx.gi_info = srcobj->tx.gi_info; 8454 tgtobj->stats.tx.preamble_info = srcobj->tx.preamble_info; 8455 tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes; 8456 tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num; 8457 tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num; 8458 tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes; 8459 tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num; 8460 tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes; 8461 tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num; 8462 tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes; 8463 tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num; 8464 tgtobj->stats.tx.tx_success.bytes += 8465 srcobj->tx.tx_success.bytes; 8466 tgtobj->stats.tx.nawds_mcast.num += 8467 srcobj->tx.nawds_mcast.num; 8468 tgtobj->stats.tx.nawds_mcast.bytes += 8469 srcobj->tx.nawds_mcast.bytes; 8470 tgtobj->stats.tx.nawds_mcast_drop += 8471 srcobj->tx.nawds_mcast_drop; 8472 tgtobj->stats.tx.num_ppdu_cookie_valid += 8473 srcobj->tx.num_ppdu_cookie_valid; 8474 tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed; 8475 tgtobj->stats.tx.ofdma += srcobj->tx.ofdma; 8476 tgtobj->stats.tx.stbc += srcobj->tx.stbc; 8477 tgtobj->stats.tx.ldpc += srcobj->tx.ldpc; 8478 tgtobj->stats.tx.pream_punct_cnt += srcobj->tx.pream_punct_cnt; 8479 tgtobj->stats.tx.retries += srcobj->tx.retries; 8480 tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt; 8481 tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt; 8482 tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt; 8483 tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt; 8484 tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num; 8485 tgtobj->stats.tx.dropped.fw_rem.bytes += 8486 srcobj->tx.dropped.fw_rem.bytes; 8487 tgtobj->stats.tx.dropped.fw_rem_tx += 8488 srcobj->tx.dropped.fw_rem_tx; 8489 tgtobj->stats.tx.dropped.fw_rem_notx += 8490 srcobj->tx.dropped.fw_rem_notx; 8491 tgtobj->stats.tx.dropped.fw_reason1 += 8492 srcobj->tx.dropped.fw_reason1; 8493 tgtobj->stats.tx.dropped.fw_reason2 += 8494 srcobj->tx.dropped.fw_reason2; 8495 tgtobj->stats.tx.dropped.fw_reason3 += 8496 srcobj->tx.dropped.fw_reason3; 8497 tgtobj->stats.tx.dropped.fw_rem_queue_disable += 8498 srcobj->tx.dropped.fw_rem_queue_disable; 8499 tgtobj->stats.tx.dropped.fw_rem_no_match += 8500 srcobj->tx.dropped.fw_rem_no_match; 8501 tgtobj->stats.tx.dropped.drop_threshold += 8502 srcobj->tx.dropped.drop_threshold; 8503 tgtobj->stats.tx.dropped.drop_link_desc_na += 8504 srcobj->tx.dropped.drop_link_desc_na; 8505 tgtobj->stats.tx.dropped.invalid_drop += 8506 srcobj->tx.dropped.invalid_drop; 8507 tgtobj->stats.tx.dropped.mcast_vdev_drop += 8508 srcobj->tx.dropped.mcast_vdev_drop; 8509 tgtobj->stats.tx.dropped.invalid_rr += 8510 srcobj->tx.dropped.invalid_rr; 8511 tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out; 8512 tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err; 8513 tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err; 8514 tgtobj->stats.rx.err.fcserr += srcobj->rx.err.fcserr; 8515 tgtobj->stats.rx.err.pn_err += srcobj->rx.err.pn_err; 8516 tgtobj->stats.rx.err.oor_err += srcobj->rx.err.oor_err; 8517 tgtobj->stats.rx.err.jump_2k_err += srcobj->rx.err.jump_2k_err; 8518 tgtobj->stats.rx.err.rxdma_wifi_parse_err += 8519 srcobj->rx.err.rxdma_wifi_parse_err; 8520 if (srcobj->rx.snr != 0) 8521 tgtobj->stats.rx.snr = srcobj->rx.snr; 8522 tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate; 8523 tgtobj->stats.rx.last_rx_rate = srcobj->rx.last_rx_rate; 8524 tgtobj->stats.rx.rnd_avg_rx_rate = srcobj->rx.rnd_avg_rx_rate; 8525 tgtobj->stats.rx.avg_rx_rate = srcobj->rx.avg_rx_rate; 8526 tgtobj->stats.rx.rx_ratecode = srcobj->rx.rx_ratecode; 8527 tgtobj->stats.rx.avg_snr = srcobj->rx.avg_snr; 8528 tgtobj->stats.rx.rx_snr_measured_time = srcobj->rx.rx_snr_measured_time; 8529 tgtobj->stats.rx.last_snr = srcobj->rx.last_snr; 8530 tgtobj->stats.rx.nss_info = srcobj->rx.nss_info; 8531 tgtobj->stats.rx.mcs_info = srcobj->rx.mcs_info; 8532 tgtobj->stats.rx.bw_info = srcobj->rx.bw_info; 8533 tgtobj->stats.rx.gi_info = srcobj->rx.gi_info; 8534 tgtobj->stats.rx.preamble_info = srcobj->rx.preamble_info; 8535 tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt; 8536 tgtobj->stats.rx.ampdu_cnt += srcobj->rx.ampdu_cnt; 8537 tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt; 8538 tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt; 8539 tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop; 8540 tgtobj->stats.rx.mcast_3addr_drop += srcobj->rx.mcast_3addr_drop; 8541 tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num; 8542 tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes; 8543 8544 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { 8545 tgtobj->stats.rx.rcvd_reo[i].num += 8546 srcobj->rx.rcvd_reo[i].num; 8547 tgtobj->stats.rx.rcvd_reo[i].bytes += 8548 srcobj->rx.rcvd_reo[i].bytes; 8549 } 8550 8551 for (i = 0; i < CDP_MAX_LMACS; i++) { 8552 tgtobj->stats.rx.rx_lmac[i].num += 8553 srcobj->rx.rx_lmac[i].num; 8554 tgtobj->stats.rx.rx_lmac[i].bytes += 8555 srcobj->rx.rx_lmac[i].bytes; 8556 } 8557 8558 srcobj->rx.unicast.num = 8559 srcobj->rx.to_stack.num - 8560 (srcobj->rx.multicast.num); 8561 srcobj->rx.unicast.bytes = 8562 srcobj->rx.to_stack.bytes - 8563 (srcobj->rx.multicast.bytes); 8564 8565 tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num; 8566 tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes; 8567 tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num; 8568 tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes; 8569 tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num; 8570 tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes; 8571 tgtobj->stats.rx.raw.num += srcobj->rx.raw.num; 8572 tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes; 8573 tgtobj->stats.rx.intra_bss.pkts.num += 8574 srcobj->rx.intra_bss.pkts.num; 8575 tgtobj->stats.rx.intra_bss.pkts.bytes += 8576 srcobj->rx.intra_bss.pkts.bytes; 8577 tgtobj->stats.rx.intra_bss.fail.num += 8578 srcobj->rx.intra_bss.fail.num; 8579 tgtobj->stats.rx.intra_bss.fail.bytes += 8580 srcobj->rx.intra_bss.fail.bytes; 8581 8582 tgtobj->stats.tx.last_ack_rssi = 8583 srcobj->tx.last_ack_rssi; 8584 tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num; 8585 tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes; 8586 tgtobj->stats.rx.multipass_rx_pkt_drop += 8587 srcobj->rx.multipass_rx_pkt_drop; 8588 tgtobj->stats.rx.peer_unauth_rx_pkt_drop += 8589 srcobj->rx.peer_unauth_rx_pkt_drop; 8590 tgtobj->stats.rx.policy_check_drop += 8591 srcobj->rx.policy_check_drop; 8592 8593 for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) { 8594 tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_ok += 8595 srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok; 8596 tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_err += 8597 srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err; 8598 for (i = 0; i < SS_COUNT; i++) 8599 tgtobj->stats.rx.rx_mu[mu_type].ppdu_nss[i] += 8600 srcobj->rx.rx_mu[mu_type].ppdu_nss[i]; 8601 for (i = 0; i < MAX_MCS; i++) 8602 tgtobj->stats.rx.rx_mu[mu_type].ppdu.mcs_count[i] += 8603 srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i]; 8604 } 8605 8606 for (i = 0; i < MAX_MCS; i++) { 8607 tgtobj->stats.rx.su_ax_ppdu_cnt.mcs_count[i] += 8608 srcobj->rx.su_ax_ppdu_cnt.mcs_count[i]; 8609 tgtobj->stats.rx.rx_mpdu_cnt[i] += srcobj->rx.rx_mpdu_cnt[i]; 8610 } 8611 8612 tgtobj->stats.rx.mpdu_cnt_fcs_ok += srcobj->rx.mpdu_cnt_fcs_ok; 8613 tgtobj->stats.rx.mpdu_cnt_fcs_err += srcobj->rx.mpdu_cnt_fcs_err; 8614 tgtobj->stats.rx.rx_mpdus += srcobj->rx.rx_mpdus; 8615 tgtobj->stats.rx.rx_ppdus += srcobj->rx.rx_ppdus; 8616 tgtobj->stats.rx.mpdu_retry_cnt += srcobj->rx.mpdu_retry_cnt; 8617 tgtobj->stats.rx.rx_retries += srcobj->rx.rx_retries; 8618 8619 DP_UPDATE_11BE_STATS(pdev_stats, srcobj); 8620 } 8621 8622 void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj) 8623 { 8624 tgtobj->stats.tx_i.dropped.dropped_pkt.num = 8625 tgtobj->stats.tx_i.dropped.dma_error + 8626 tgtobj->stats.tx_i.dropped.ring_full + 8627 tgtobj->stats.tx_i.dropped.enqueue_fail + 8628 tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check + 8629 tgtobj->stats.tx_i.dropped.desc_na.num + 8630 tgtobj->stats.tx_i.dropped.res_full + 8631 tgtobj->stats.tx_i.dropped.headroom_insufficient; 8632 } 8633 8634 void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj, 8635 struct cdp_vdev_stats *srcobj) 8636 { 8637 tgtobj->tx.last_tx_rate = srcobj->tx.last_tx_rate; 8638 tgtobj->tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs; 8639 tgtobj->tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate; 8640 tgtobj->tx.mcast_last_tx_rate_mcs = srcobj->tx.mcast_last_tx_rate_mcs; 8641 tgtobj->rx.last_rx_rate = srcobj->rx.last_rx_rate; 8642 } 8643 8644 void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj, 8645 struct dp_vdev *srcobj) 8646 { 8647 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.nawds_mcast); 8648 8649 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.rcvd); 8650 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.processed); 8651 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.reinject_pkts); 8652 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.inspect_pkts); 8653 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.raw.raw_pkt); 8654 DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.dma_map_error); 8655 DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.num_frags_overflow_err); 8656 DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_host.num); 8657 DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_target); 8658 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sg.sg_pkt); 8659 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.mcast_en.mcast_pkt); 8660 DP_STATS_AGGR(tgtobj, srcobj, 8661 tx_i.mcast_en.dropped_map_error); 8662 DP_STATS_AGGR(tgtobj, srcobj, 8663 tx_i.mcast_en.dropped_self_mac); 8664 DP_STATS_AGGR(tgtobj, srcobj, 8665 tx_i.mcast_en.dropped_send_fail); 8666 DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast); 8667 DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_rcvd); 8668 DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_ucast_converted); 8669 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error); 8670 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full); 8671 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail); 8672 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fail_per_pkt_vdev_id_check); 8673 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.desc_na.num); 8674 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full); 8675 DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient); 8676 DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified); 8677 DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw); 8678 DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd); 8679 DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.exception_fw); 8680 DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.completion_fw); 8681 8682 DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.reo_rcvd_pkt); 8683 DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.null_q_desc_pkt); 8684 DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.routed_eapol_pkt); 8685 8686 tgtobj->stats.tx_i.dropped.dropped_pkt.num = 8687 tgtobj->stats.tx_i.dropped.dma_error + 8688 tgtobj->stats.tx_i.dropped.ring_full + 8689 tgtobj->stats.tx_i.dropped.enqueue_fail + 8690 tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check + 8691 tgtobj->stats.tx_i.dropped.desc_na.num + 8692 tgtobj->stats.tx_i.dropped.res_full + 8693 tgtobj->stats.tx_i.dropped.headroom_insufficient; 8694 } 8695 8696 QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl, 8697 struct cdp_soc_stats *soc_stats) 8698 { 8699 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 8700 uint8_t inx; 8701 uint8_t cpus; 8702 8703 /* soc tx stats */ 8704 soc_stats->tx.egress = soc->stats.tx.egress[0]; 8705 soc_stats->tx.tx_invalid_peer = soc->stats.tx.tx_invalid_peer; 8706 for (inx = 0; inx < CDP_MAX_TX_DATA_RINGS; inx++) { 8707 soc_stats->tx.tx_hw_enq[inx] = soc->stats.tx.tcl_enq[inx]; 8708 soc_stats->tx.tx_hw_ring_full[inx] = 8709 soc->stats.tx.tcl_ring_full[inx]; 8710 } 8711 soc_stats->tx.desc_in_use = soc->stats.tx.desc_in_use; 8712 soc_stats->tx.dropped_fw_removed = soc->stats.tx.dropped_fw_removed; 8713 soc_stats->tx.invalid_release_source = 8714 soc->stats.tx.invalid_release_source; 8715 for (inx = 0; inx < CDP_MAX_WIFI_INT_ERROR_REASONS; inx++) 8716 soc_stats->tx.wifi_internal_error[inx] = 8717 soc->stats.tx.wbm_internal_error[inx]; 8718 soc_stats->tx.non_wifi_internal_err = 8719 soc->stats.tx.non_wbm_internal_err; 8720 soc_stats->tx.tx_comp_loop_pkt_limit_hit = 8721 soc->stats.tx.tx_comp_loop_pkt_limit_hit; 8722 soc_stats->tx.hp_oos2 = soc->stats.tx.hp_oos2; 8723 soc_stats->tx.tx_comp_exception = soc->stats.tx.tx_comp_exception; 8724 /* soc rx stats */ 8725 soc_stats->rx.ingress = soc->stats.rx.ingress; 8726 soc_stats->rx.err_ring_pkts = soc->stats.rx.err_ring_pkts; 8727 soc_stats->rx.rx_frags = soc->stats.rx.rx_frags; 8728 soc_stats->rx.rx_hw_reinject = soc->stats.rx.reo_reinject; 8729 soc_stats->rx.bar_frame = soc->stats.rx.bar_frame; 8730 soc_stats->rx.rx_frag_err_len_error = 8731 soc->stats.rx.rx_frag_err_len_error; 8732 soc_stats->rx.rx_frag_err_no_peer = soc->stats.rx.rx_frag_err_no_peer; 8733 soc_stats->rx.rx_frag_wait = soc->stats.rx.rx_frag_wait; 8734 soc_stats->rx.rx_frag_err = soc->stats.rx.rx_frag_err; 8735 soc_stats->rx.rx_frag_oor = soc->stats.rx.rx_frag_oor; 8736 soc_stats->rx.reap_loop_pkt_limit_hit = 8737 soc->stats.rx.reap_loop_pkt_limit_hit; 8738 soc_stats->rx.hp_oos2 = soc->stats.rx.hp_oos2; 8739 soc_stats->rx.near_full = soc->stats.rx.near_full; 8740 soc_stats->rx.msdu_scatter_wait_break = 8741 soc->stats.rx.msdu_scatter_wait_break; 8742 soc_stats->rx.rx_sw_route_drop = soc->stats.rx.rxdma2rel_route_drop; 8743 soc_stats->rx.rx_hw_route_drop = soc->stats.rx.reo2rel_route_drop; 8744 soc_stats->rx.rx_packets.num_cpus = qdf_min((uint32_t)CDP_NR_CPUS, 8745 num_possible_cpus()); 8746 for (cpus = 0; cpus < soc_stats->rx.rx_packets.num_cpus; cpus++) { 8747 for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++) 8748 soc_stats->rx.rx_packets.pkts[cpus][inx] = 8749 soc->stats.rx.ring_packets[cpus][inx]; 8750 } 8751 soc_stats->rx.err.rx_rejected = soc->stats.rx.err.rejected; 8752 soc_stats->rx.err.rx_raw_frm_drop = soc->stats.rx.err.raw_frm_drop; 8753 soc_stats->rx.err.phy_ring_access_fail = 8754 soc->stats.rx.err.hal_ring_access_fail; 8755 soc_stats->rx.err.phy_ring_access_full_fail = 8756 soc->stats.rx.err.hal_ring_access_full_fail; 8757 for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++) 8758 soc_stats->rx.err.phy_rx_hw_error[inx] = 8759 soc->stats.rx.err.hal_reo_error[inx]; 8760 soc_stats->rx.err.phy_rx_hw_dest_dup = 8761 soc->stats.rx.err.hal_reo_dest_dup; 8762 soc_stats->rx.err.phy_wifi_rel_dup = soc->stats.rx.err.hal_wbm_rel_dup; 8763 soc_stats->rx.err.phy_rx_sw_err_dup = 8764 soc->stats.rx.err.hal_rxdma_err_dup; 8765 soc_stats->rx.err.invalid_rbm = soc->stats.rx.err.invalid_rbm; 8766 soc_stats->rx.err.invalid_vdev = soc->stats.rx.err.invalid_vdev; 8767 soc_stats->rx.err.invalid_pdev = soc->stats.rx.err.invalid_pdev; 8768 soc_stats->rx.err.pkt_delivered_no_peer = 8769 soc->stats.rx.err.pkt_delivered_no_peer; 8770 soc_stats->rx.err.defrag_peer_uninit = 8771 soc->stats.rx.err.defrag_peer_uninit; 8772 soc_stats->rx.err.invalid_sa_da_idx = 8773 soc->stats.rx.err.invalid_sa_da_idx; 8774 soc_stats->rx.err.msdu_done_fail = soc->stats.rx.err.msdu_done_fail; 8775 soc_stats->rx.err.rx_invalid_peer = soc->stats.rx.err.rx_invalid_peer; 8776 soc_stats->rx.err.rx_invalid_peer_id = 8777 soc->stats.rx.err.rx_invalid_peer_id; 8778 soc_stats->rx.err.rx_invalid_pkt_len = 8779 soc->stats.rx.err.rx_invalid_pkt_len; 8780 for (inx = 0; inx < qdf_min((uint32_t)CDP_WIFI_ERR_MAX, 8781 (uint32_t)HAL_RXDMA_ERR_MAX); inx++) 8782 soc_stats->rx.err.rx_sw_error[inx] = 8783 soc->stats.rx.err.rxdma_error[inx]; 8784 for (inx = 0; inx < qdf_min((uint32_t)CDP_RX_ERR_MAX, 8785 (uint32_t)HAL_REO_ERR_MAX); inx++) 8786 soc_stats->rx.err.rx_hw_error[inx] = 8787 soc->stats.rx.err.reo_error[inx]; 8788 soc_stats->rx.err.rx_desc_invalid_magic = 8789 soc->stats.rx.err.rx_desc_invalid_magic; 8790 soc_stats->rx.err.rx_hw_cmd_send_fail = 8791 soc->stats.rx.err.reo_cmd_send_fail; 8792 soc_stats->rx.err.rx_hw_cmd_send_drain = 8793 soc->stats.rx.err.reo_cmd_send_drain; 8794 soc_stats->rx.err.scatter_msdu = soc->stats.rx.err.scatter_msdu; 8795 soc_stats->rx.err.invalid_cookie = soc->stats.rx.err.invalid_cookie; 8796 soc_stats->rx.err.stale_cookie = soc->stats.rx.err.stale_cookie; 8797 soc_stats->rx.err.rx_2k_jump_delba_sent = 8798 soc->stats.rx.err.rx_2k_jump_delba_sent; 8799 soc_stats->rx.err.rx_2k_jump_to_stack = 8800 soc->stats.rx.err.rx_2k_jump_to_stack; 8801 soc_stats->rx.err.rx_2k_jump_drop = soc->stats.rx.err.rx_2k_jump_drop; 8802 soc_stats->rx.err.rx_hw_err_msdu_buf_rcved = 8803 soc->stats.rx.err.reo_err_msdu_buf_rcved; 8804 soc_stats->rx.err.rx_hw_err_msdu_buf_invalid_cookie = 8805 soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie; 8806 soc_stats->rx.err.rx_hw_err_oor_drop = 8807 soc->stats.rx.err.reo_err_oor_drop; 8808 soc_stats->rx.err.rx_hw_err_oor_to_stack = 8809 soc->stats.rx.err.reo_err_oor_to_stack; 8810 soc_stats->rx.err.rx_hw_err_oor_sg_count = 8811 soc->stats.rx.err.reo_err_oor_sg_count; 8812 soc_stats->rx.err.msdu_count_mismatch = 8813 soc->stats.rx.err.msdu_count_mismatch; 8814 soc_stats->rx.err.invalid_link_cookie = 8815 soc->stats.rx.err.invalid_link_cookie; 8816 soc_stats->rx.err.nbuf_sanity_fail = soc->stats.rx.err.nbuf_sanity_fail; 8817 soc_stats->rx.err.dup_refill_link_desc = 8818 soc->stats.rx.err.dup_refill_link_desc; 8819 soc_stats->rx.err.msdu_continuation_err = 8820 soc->stats.rx.err.msdu_continuation_err; 8821 soc_stats->rx.err.ssn_update_count = soc->stats.rx.err.ssn_update_count; 8822 soc_stats->rx.err.bar_handle_fail_count = 8823 soc->stats.rx.err.bar_handle_fail_count; 8824 soc_stats->rx.err.intrabss_eapol_drop = 8825 soc->stats.rx.err.intrabss_eapol_drop; 8826 soc_stats->rx.err.pn_in_dest_check_fail = 8827 soc->stats.rx.err.pn_in_dest_check_fail; 8828 soc_stats->rx.err.msdu_len_err = soc->stats.rx.err.msdu_len_err; 8829 soc_stats->rx.err.rx_flush_count = soc->stats.rx.err.rx_flush_count; 8830 /* soc ast stats */ 8831 soc_stats->ast.added = soc->stats.ast.added; 8832 soc_stats->ast.deleted = soc->stats.ast.deleted; 8833 soc_stats->ast.aged_out = soc->stats.ast.aged_out; 8834 soc_stats->ast.map_err = soc->stats.ast.map_err; 8835 soc_stats->ast.ast_mismatch = soc->stats.ast.ast_mismatch; 8836 /* soc mec stats */ 8837 soc_stats->mec.added = soc->stats.mec.added; 8838 soc_stats->mec.deleted = soc->stats.mec.deleted; 8839 8840 return QDF_STATUS_SUCCESS; 8841 } 8842 8843 #ifdef QCA_PEER_EXT_STATS 8844 QDF_STATUS 8845 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 8846 uint8_t *peer_mac, 8847 struct cdp_delay_tid_stats *delay_stats) 8848 { 8849 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 8850 struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, 8851 DP_MOD_ID_CDP); 8852 struct dp_peer_delay_stats *pext_stats; 8853 struct cdp_delay_rx_stats *rx_delay; 8854 struct cdp_delay_tx_stats *tx_delay; 8855 uint8_t tid; 8856 8857 if (!peer) 8858 return QDF_STATUS_E_FAILURE; 8859 8860 if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx)) { 8861 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8862 return QDF_STATUS_E_FAILURE; 8863 } 8864 8865 if (!peer->txrx_peer) { 8866 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8867 return QDF_STATUS_E_FAILURE; 8868 } 8869 8870 pext_stats = peer->txrx_peer->delay_stats; 8871 if (!pext_stats) { 8872 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8873 return QDF_STATUS_E_FAILURE; 8874 } 8875 8876 for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) { 8877 rx_delay = &delay_stats[tid].rx_delay; 8878 dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats, 8879 &rx_delay->to_stack_delay, tid, 8880 CDP_HIST_TYPE_REAP_STACK); 8881 tx_delay = &delay_stats[tid].tx_delay; 8882 dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats, 8883 &tx_delay->tx_swq_delay, tid, 8884 CDP_HIST_TYPE_SW_ENQEUE_DELAY); 8885 dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats, 8886 &tx_delay->hwtx_delay, tid, 8887 CDP_HIST_TYPE_HW_COMP_DELAY); 8888 } 8889 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8890 8891 return QDF_STATUS_SUCCESS; 8892 } 8893 #else 8894 QDF_STATUS 8895 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 8896 uint8_t *peer_mac, 8897 struct cdp_delay_tid_stats *delay_stats) 8898 { 8899 return QDF_STATUS_E_FAILURE; 8900 } 8901 #endif /* QCA_PEER_EXT_STATS */ 8902 8903 #ifdef WLAN_PEER_JITTER 8904 QDF_STATUS 8905 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 8906 uint8_t vdev_id, uint8_t *peer_mac, 8907 struct cdp_peer_tid_stats *tid_stats) 8908 { 8909 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 8910 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 8911 struct dp_peer *peer; 8912 uint8_t tid; 8913 8914 if (!pdev) 8915 return QDF_STATUS_E_FAILURE; 8916 8917 if (!wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) 8918 return QDF_STATUS_E_FAILURE; 8919 8920 peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, DP_MOD_ID_CDP); 8921 if (!peer) 8922 return QDF_STATUS_E_FAILURE; 8923 8924 if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) { 8925 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8926 return QDF_STATUS_E_FAILURE; 8927 } 8928 8929 for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) { 8930 struct cdp_peer_tid_stats *rx_tid = 8931 &peer->txrx_peer->jitter_stats[tid]; 8932 8933 tid_stats[tid].tx_avg_jitter = rx_tid->tx_avg_jitter; 8934 tid_stats[tid].tx_avg_delay = rx_tid->tx_avg_delay; 8935 tid_stats[tid].tx_avg_err = rx_tid->tx_avg_err; 8936 tid_stats[tid].tx_total_success = rx_tid->tx_total_success; 8937 tid_stats[tid].tx_drop = rx_tid->tx_drop; 8938 } 8939 dp_peer_unref_delete(peer, DP_MOD_ID_CDP); 8940 8941 return QDF_STATUS_SUCCESS; 8942 } 8943 #else 8944 QDF_STATUS 8945 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 8946 uint8_t vdev_id, uint8_t *peer_mac, 8947 struct cdp_peer_tid_stats *tid_stats) 8948 { 8949 return QDF_STATUS_E_FAILURE; 8950 } 8951 #endif /* WLAN_PEER_JITTER */ 8952 8953 #ifdef WLAN_TX_PKT_CAPTURE_ENH 8954 QDF_STATUS 8955 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, 8956 uint8_t vdev_id, uint8_t *peer_mac, 8957 struct cdp_peer_tx_capture_stats *stats) 8958 { 8959 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 8960 struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id, 8961 DP_MOD_ID_TX_CAPTURE); 8962 QDF_STATUS status; 8963 8964 if (!peer) 8965 return QDF_STATUS_E_FAILURE; 8966 8967 status = dp_monitor_peer_tx_capture_get_stats(soc, peer, stats); 8968 dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE); 8969 8970 return status; 8971 } 8972 8973 QDF_STATUS 8974 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 8975 struct cdp_pdev_tx_capture_stats *stats) 8976 { 8977 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 8978 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 8979 8980 if (!pdev) 8981 return QDF_STATUS_E_FAILURE; 8982 8983 return dp_monitor_pdev_tx_capture_get_stats(soc, pdev, stats); 8984 } 8985 #else /* WLAN_TX_PKT_CAPTURE_ENH */ 8986 QDF_STATUS 8987 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, 8988 uint8_t vdev_id, uint8_t *peer_mac, 8989 struct cdp_peer_tx_capture_stats *stats) 8990 { 8991 return QDF_STATUS_E_FAILURE; 8992 } 8993 8994 QDF_STATUS 8995 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 8996 struct cdp_pdev_tx_capture_stats *stats) 8997 { 8998 return QDF_STATUS_E_FAILURE; 8999 } 9000 #endif /* WLAN_TX_PKT_CAPTURE_ENH */ 9001 9002 #ifdef WLAN_TELEMETRY_STATS_SUPPORT 9003 QDF_STATUS 9004 dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 9005 struct cdp_pdev_telemetry_stats *stats) 9006 { 9007 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9008 struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); 9009 9010 if (!pdev) 9011 return QDF_STATUS_E_FAILURE; 9012 9013 stats->tx_mpdu_failed = pdev->stats.telemetry_stats.tx_mpdu_failed; 9014 stats->tx_mpdu_total = pdev->stats.telemetry_stats.tx_mpdu_total; 9015 9016 return QDF_STATUS_SUCCESS; 9017 } 9018 9019 QDF_STATUS 9020 dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr, 9021 struct cdp_peer_telemetry_stats *stats) 9022 { 9023 struct dp_soc *soc = (struct dp_soc *)soc_hdl; 9024 struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL, 9025 DP_MOD_ID_MISC); 9026 9027 if (!peer) 9028 return QDF_STATUS_E_FAILURE; 9029 9030 dp_monitor_peer_telemetry_stats(peer, stats); 9031 dp_peer_unref_delete(peer, DP_MOD_ID_MISC); 9032 9033 return QDF_STATUS_SUCCESS; 9034 } 9035 #endif 9036