dp_stats.c 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. /*
  2. * Copyright (c) 2017 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #include "qdf_types.h"
  19. #include "htt_stats.h"
  20. #include "dp_types.h"
  21. #include "dp_internal.h"
  22. #define DP_MAX_STRING_LEN 500
  23. /* these values are fixed in the next gerrit */
  24. #define DP_HTT_DATA_LEN 1
  25. #define DP_HTT_URRN_STATS_LEN 1
  26. #define DP_HTT_FLUSH_ERRS_LEN 1
  27. #define DP_HTT_SIFS_STATUS_LEN 1
  28. #define DP_HTT_PHY_ERRS_LEN 1
  29. #define DP_HTT_HW_INTR_NAME_LEN HTT_STATS_MAX_HW_INTR_NAME_LEN
  30. #define DP_HTT_HW_MODULE_NAME_LEN HTT_STATS_MAX_HW_MODULE_NAME_LEN
  31. #define DP_HTT_COUNTER_NAME_LEN HTT_MAX_COUNTER_NAME
  32. #define DP_HTT_PEER_DETAILS_LEN 1
  33. #define DP_HTT_MU_MIMO_SCH_STATS_TLV_LEN 1
  34. #define DP_HTT_MU_MIMO_MPDU_STATS_TLV_LEN 1
  35. #define DP_HTT_DIFS_LATENCY_HIST_LEN 1
  36. #define DP_HTT_CMD_RESULT_LEN 1
  37. #define DP_HTT_CMD_STALL_STATUS_LEN 1
  38. #define DP_HTT_FES_RESULT_LEN 1
  39. #define DP_HTT_SCHED_CMD_POSTED_LEN 1
  40. #define DP_HTT_SCHED_CMD_REAPED_LEN 1
  41. #define DP_HTT_GEN_MPDU_END_REASON_LEN 1
  42. #define DP_HTT_LIST_MPDU_END_REASON_LEN 1
  43. #define DP_HTT_LIST_MPDU_CNT_HIST_LEN 1
  44. #define DP_HTT_LOW_WM_HIT_COUNT_LEN HTT_STATS_LOW_WM_BINS
  45. #define DP_HTT_HIGH_WM_HIT_COUNT_LEN HTT_STATS_HIGH_WM_BINS
  46. #define DP_HTT_DWORDS_USED_BY_USER_N_LEN 1
  47. #define DP_HTT_TX_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  48. #define DP_HTT_TX_SU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  49. #define DP_HTT_TX_MU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  50. #define DP_HTT_TX_NSS_LEN HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS
  51. #define DP_HTT_TX_BW_LEN HTT_TX_PDEV_STATS_NUM_BW_COUNTERS
  52. #define DP_HTT_TX_STBC_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  53. #define DP_HTT_TX_PREAM_LEN HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES
  54. #define DP_HTT_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
  55. #define DP_HTT_TX_DCM_LEN HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS
  56. #define DP_HTT_RX_MCS_LEN HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS
  57. #define DP_HTT_RX_NSS_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
  58. #define DP_HTT_RX_DCM_LEN HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS
  59. #define DP_HTT_RX_STBC_LEN HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS
  60. #define DP_HTT_RX_BW_LEN HTT_RX_PDEV_STATS_NUM_BW_COUNTERS
  61. #define DP_HTT_RX_PREAM_LEN HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES
  62. #define DP_HTT_RSSI_CHAIN_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
  63. #define DP_HTT_RX_GI_LEN HTT_RX_PDEV_STATS_NUM_GI_COUNTERS
  64. #define DP_HTT_REFILL_RING_EMPTY_CNT_LEN 1
  65. #define DP_HTT_REFILL_RING_NUM_REFILL_LEN 1
  66. #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX
  67. #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX
  68. #define DP_HTT_FW_RING_MPDU_ERR_LEN HTT_RX_STATS_RXDMA_MAX_ERR
  69. #define DP_HTT_FW_MPDU_DROP_LEN 1
  70. #define DP_HTT_TID_NAME_LEN MAX_HTT_TID_NAME
  71. /* TODO:Below stat function is for initial testing
  72. * Further functions will be added after reviews on the FW side are complete
  73. */
  74. /**
  75. * dp_print_tx_pdev_stats_cmn_tlv: display htt_tx_pdev_stats_cmn_tlv
  76. * @dp_htt_tag:pointer to structure htt_tx_pdev_stats_cmn_tlv
  77. *
  78. * return:void
  79. */
  80. static inline void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf)
  81. {
  82. htt_tx_pdev_stats_cmn_tlv *dp_htt_tag =
  83. (htt_tx_pdev_stats_cmn_tlv *)tag_buf;
  84. DP_TRACE_STATS(NONE, "Pdev Stats:\n");
  85. DP_TRACE_STATS(NONE, "mac_id__word = %d",
  86. dp_htt_tag->mac_id__word);
  87. DP_TRACE_STATS(NONE, "hw_queued = %d",
  88. dp_htt_tag->hw_queued);
  89. DP_TRACE_STATS(NONE, "hw_reaped = %d",
  90. dp_htt_tag->hw_reaped);
  91. DP_TRACE_STATS(NONE, "underrun = %d",
  92. dp_htt_tag->underrun);
  93. DP_TRACE_STATS(NONE, "hw_paused = %d",
  94. dp_htt_tag->hw_paused);
  95. DP_TRACE_STATS(NONE, "hw_flush = %d",
  96. dp_htt_tag->hw_flush);
  97. DP_TRACE_STATS(NONE, "hw_filt = %d",
  98. dp_htt_tag->hw_filt);
  99. DP_TRACE_STATS(NONE, "tx_abort = %d",
  100. dp_htt_tag->tx_abort);
  101. DP_TRACE_STATS(NONE, "mpdu_requeued = %d",
  102. dp_htt_tag->mpdu_requed);
  103. DP_TRACE_STATS(NONE, "tx_xretry = %d",
  104. dp_htt_tag->tx_xretry);
  105. DP_TRACE_STATS(NONE, "data_rc = %d",
  106. dp_htt_tag->data_rc);
  107. DP_TRACE_STATS(NONE, "mpdu_dropped_xretry = %d",
  108. dp_htt_tag->mpdu_dropped_xretry);
  109. DP_TRACE_STATS(NONE, "illegal_rate_phy_err = %d",
  110. dp_htt_tag->illgl_rate_phy_err);
  111. DP_TRACE_STATS(NONE, "cont_xretry = %d",
  112. dp_htt_tag->cont_xretry);
  113. DP_TRACE_STATS(NONE, "tx_timeout = %d",
  114. dp_htt_tag->tx_timeout);
  115. DP_TRACE_STATS(NONE, "pdev_resets = %d",
  116. dp_htt_tag->pdev_resets);
  117. DP_TRACE_STATS(NONE, "phy_underrun = %d",
  118. dp_htt_tag->phy_underrun);
  119. DP_TRACE_STATS(NONE, "txop_ovf = %d",
  120. dp_htt_tag->txop_ovf);
  121. DP_TRACE_STATS(NONE, "seq_posted = %d",
  122. dp_htt_tag->seq_posted);
  123. DP_TRACE_STATS(NONE, "seq_failed_queueing = %d",
  124. dp_htt_tag->seq_failed_queueing);
  125. DP_TRACE_STATS(NONE, "seq_completed = %d",
  126. dp_htt_tag->seq_completed);
  127. DP_TRACE_STATS(NONE, "seq_restarted = %d",
  128. dp_htt_tag->seq_restarted);
  129. DP_TRACE_STATS(NONE, "mu_seq_posted = %d",
  130. dp_htt_tag->mu_seq_posted);
  131. DP_TRACE_STATS(NONE, "mpdu_count_tqm = %d",
  132. dp_htt_tag->mpdu_count_tqm);
  133. DP_TRACE_STATS(NONE, "msdu_count_tqm = %d",
  134. dp_htt_tag->msdu_count_tqm);
  135. DP_TRACE_STATS(NONE, "mpdu_removed_tqm = %d",
  136. dp_htt_tag->mpdu_removed_tqm);
  137. DP_TRACE_STATS(NONE, "msdu_removed_tqm = %d",
  138. dp_htt_tag->msdu_removed_tqm);
  139. DP_TRACE_STATS(NONE, "mpdus_sw_flush = %d",
  140. dp_htt_tag->mpdus_sw_flush);
  141. DP_TRACE_STATS(NONE, "mpdus_hw_filter = %d",
  142. dp_htt_tag->mpdus_hw_filter);
  143. DP_TRACE_STATS(NONE, "mpdus_truncated = %d",
  144. dp_htt_tag->mpdus_truncated);
  145. DP_TRACE_STATS(NONE, "mpdus_ack_failed = %d",
  146. dp_htt_tag->mpdus_ack_failed);
  147. DP_TRACE_STATS(NONE, "mpdus_expired = %d",
  148. dp_htt_tag->mpdus_expired);
  149. DP_TRACE_STATS(NONE, "mpdus_seq_hw_retry = %d",
  150. dp_htt_tag->mpdus_seq_hw_retry);
  151. DP_TRACE_STATS(NONE, "ack_tlv_proc = %d",
  152. dp_htt_tag->ack_tlv_proc);
  153. DP_TRACE_STATS(NONE, "coex_abort_mpdu_cnt_valid = %d",
  154. dp_htt_tag->
  155. coex_abort_mpdu_cnt_valid);
  156. DP_TRACE_STATS(NONE, "coex_abort_mpdu_cnt = %d",
  157. dp_htt_tag->coex_abort_mpdu_cnt);
  158. }
  159. /**
  160. * dp_print_tx_pdev_stats_urrn_tlv_v: display htt_tx_pdev_stats_urrn_tlv_v
  161. * @tag_buf: buffer containing the tlv
  162. *
  163. * return:void
  164. */
  165. static inline void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf)
  166. {
  167. htt_tx_pdev_stats_urrn_tlv_v *dp_htt_tag =
  168. (htt_tx_pdev_stats_urrn_tlv_v *)tag_buf;
  169. uint8_t i;
  170. uint16_t index = 0;
  171. char urrn_stats[DP_MAX_STRING_LEN];
  172. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  173. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
  174. DP_TRACE_STATS(NONE, "Pdev Underun Stats:\n");
  175. for (i = 0; i < tag_len; i++) {
  176. index += qdf_snprint(&urrn_stats[index],
  177. DP_MAX_STRING_LEN - index, " %d,",
  178. dp_htt_tag->urrn_stats[i]);
  179. }
  180. DP_TRACE_STATS(NONE, "urrn_stats = %s", urrn_stats);
  181. }
  182. /*
  183. * dp_print_tx_pdev_stats_flush_tlv_v: display htt_tx_pdev_stats_flush_tlv_v
  184. * @tag_buf: buffer containing the tlv *
  185. * return:void
  186. */
  187. static inline void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf)
  188. {
  189. htt_tx_pdev_stats_flush_tlv_v *dp_htt_tag =
  190. (htt_tx_pdev_stats_flush_tlv_v *)tag_buf;
  191. uint8_t i;
  192. uint8_t index = 0;
  193. char flush_errs[DP_MAX_STRING_LEN];
  194. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  195. tag_len = qdf_min(tag_len,
  196. (uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);
  197. DP_TRACE_STATS(NONE, "Pdev Flush Stats:\n");
  198. for (i = 0; i < tag_len; i++) {
  199. index += qdf_snprint(&flush_errs[index],
  200. DP_MAX_STRING_LEN - index, " %d,",
  201. dp_htt_tag->flush_errs[i]);
  202. }
  203. DP_TRACE_STATS(NONE, "flush_errs = %s ", flush_errs);
  204. }
  205. /*
  206. * dp_print_tx_pdev_stats_sifs_tlv_v: display htt_tx_pdev_stats_sifs_tlv_v
  207. * @tag_buf: buffer containing the tlv *
  208. * return:void
  209. */
  210. static inline void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf)
  211. {
  212. htt_tx_pdev_stats_sifs_tlv_v *dp_htt_tag =
  213. (htt_tx_pdev_stats_sifs_tlv_v *)tag_buf;
  214. uint8_t i;
  215. uint8_t index = 0;
  216. char sifs_status[DP_MAX_STRING_LEN];
  217. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  218. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS);
  219. DP_TRACE_STATS(NONE, "Pdev SIFS Stats:\n");
  220. for (i = 0; i < tag_len; i++) {
  221. index += qdf_snprint(&sifs_status[index],
  222. DP_MAX_STRING_LEN - index, " %d,",
  223. dp_htt_tag->sifs_status[i]);
  224. }
  225. DP_TRACE_STATS(NONE, "sifs_status = %s ", sifs_status);
  226. }
  227. /**
  228. * dp_htt_stats_print_tag: function to select the tag type and
  229. * print the corresponding tag structure
  230. * @tag_type: tag type that is to be printed
  231. * @tag_buf: pointer to the tag structure
  232. *
  233. * return: void
  234. */
  235. void dp_htt_stats_print_tag(uint8_t tag_type, uint32_t *tag_buf)
  236. {
  237. switch (tag_type) {
  238. case HTT_STATS_TX_PDEV_CMN_TAG:
  239. dp_print_tx_pdev_stats_cmn_tlv(tag_buf);
  240. break;
  241. case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
  242. dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf);
  243. break;
  244. case HTT_STATS_TX_PDEV_SIFS_TAG:
  245. dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf);
  246. break;
  247. default:
  248. break;
  249. }
  250. }