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