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