dp_rx_mon.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. * Copyright (c) 2016-2018 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. #ifndef _DP_RX_MON_H_
  19. #define _DP_RX_MON_H_
  20. #ifdef CONFIG_MCL
  21. #include <cds_ieee80211_defines.h>
  22. #endif
  23. /**
  24. * dp_rx_mon_dest_process() - Brain of the Rx processing functionality
  25. * Called from the bottom half (tasklet/NET_RX_SOFTIRQ)
  26. * @soc: core txrx main context 164
  27. * @hal_ring: opaque pointer to the HAL Rx Ring, which will be serviced
  28. * @quota: No. of units (packets) that can be serviced in one shot.
  29. *
  30. * This function implements the core of Rx functionality. This is
  31. * expected to handle only non-error frames.
  32. *
  33. * Return: uint32_t: No. of elements processed
  34. */
  35. void dp_rx_mon_dest_process(struct dp_soc *soc, uint32_t mac_id,
  36. uint32_t quota);
  37. QDF_STATUS dp_rx_pdev_mon_attach(struct dp_pdev *pdev);
  38. QDF_STATUS dp_rx_pdev_mon_detach(struct dp_pdev *pdev);
  39. QDF_STATUS dp_rx_pdev_mon_status_attach(struct dp_pdev *pdev, int mac_id);
  40. QDF_STATUS dp_rx_pdev_mon_status_detach(struct dp_pdev *pdev, int mac_id);
  41. uint32_t dp_mon_process(struct dp_soc *soc, uint32_t mac_id, uint32_t quota);
  42. QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id,
  43. qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu);
  44. /*
  45. * dp_rx_mon_deliver_non_std() - deliver frames for non standard path
  46. * @soc: core txrx main contex
  47. * @mac_id: MAC ID
  48. *
  49. * This function delivers the radio tap and dummy MSDU
  50. * into user layer application for preamble only PPDU.
  51. *
  52. * Return: Operation status
  53. */
  54. QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc, uint32_t mac_id);
  55. uint32_t dp_rxdma_err_process(struct dp_soc *soc, uint32_t mac_id,
  56. uint32_t quota);
  57. #ifndef REMOVE_MON_DBG_STATS
  58. /*
  59. * dp_rx_mon_update_dbg_ppdu_stats() - Update status ring TLV count
  60. * @ppdu_info: HAL RX PPDU info retrieved from status ring TLV
  61. * @rx_mon_stats: monitor mode status/destination ring PPDU and MPDU count
  62. *
  63. * Update status ring PPDU start and end count. Keep track TLV state on
  64. * PPDU start and end to find out if start and end is matching. Keep
  65. * track missing PPDU start and end count. Keep track matching PPDU
  66. * start and end count.
  67. *
  68. * Return: None
  69. */
  70. static inline void
  71. dp_rx_mon_update_dbg_ppdu_stats(struct hal_rx_ppdu_info *ppdu_info,
  72. struct cdp_pdev_mon_stats *rx_mon_stats)
  73. {
  74. if (ppdu_info->rx_state ==
  75. HAL_RX_MON_PPDU_START) {
  76. rx_mon_stats->status_ppdu_start++;
  77. if (rx_mon_stats->status_ppdu_state
  78. != CDP_MON_PPDU_END)
  79. rx_mon_stats->status_ppdu_end_mis++;
  80. rx_mon_stats->status_ppdu_state
  81. = CDP_MON_PPDU_START;
  82. } else if (ppdu_info->rx_state ==
  83. HAL_RX_MON_PPDU_END) {
  84. rx_mon_stats->status_ppdu_end++;
  85. if (rx_mon_stats->status_ppdu_state
  86. != CDP_MON_PPDU_START)
  87. rx_mon_stats->status_ppdu_start_mis++;
  88. else
  89. rx_mon_stats->status_ppdu_compl++;
  90. rx_mon_stats->status_ppdu_state
  91. = CDP_MON_PPDU_END;
  92. }
  93. }
  94. /*
  95. * dp_rx_mon_init_dbg_ppdu_stats() - initialization for monitor mode stats
  96. * @ppdu_info: HAL RX PPDU info retrieved from status ring TLV
  97. * @rx_mon_stats: monitor mode status/destination ring PPDU and MPDU count
  98. *
  99. * Return: None
  100. */
  101. static inline void
  102. dp_rx_mon_init_dbg_ppdu_stats(struct hal_rx_ppdu_info *ppdu_info,
  103. struct cdp_pdev_mon_stats *rx_mon_stats)
  104. {
  105. ppdu_info->rx_state = HAL_RX_MON_PPDU_END;
  106. rx_mon_stats->status_ppdu_state
  107. = CDP_MON_PPDU_END;
  108. }
  109. /*
  110. * dp_rx_mon_dbg_dbg_ppdu_stats() - Print monitor mode status ring stats
  111. * @ppdu_info: HAL RX PPDU info retrieved from status ring TLV
  112. * @rx_mon_stats: monitor mode status/destination ring PPDU and MPDU count
  113. *
  114. * Print monitor mode PPDU start and end TLV count
  115. * Return: None
  116. */
  117. static inline void
  118. dp_rx_mon_print_dbg_ppdu_stats(struct cdp_pdev_mon_stats *rx_mon_stats)
  119. {
  120. DP_PRINT_STATS("status_ppdu_compl_cnt = %d",
  121. rx_mon_stats->status_ppdu_compl);
  122. DP_PRINT_STATS("status_ppdu_start_cnt = %d",
  123. rx_mon_stats->status_ppdu_start);
  124. DP_PRINT_STATS("status_ppdu_end_cnt = %d",
  125. rx_mon_stats->status_ppdu_end);
  126. DP_PRINT_STATS("status_ppdu_start_mis_cnt = %d",
  127. rx_mon_stats->status_ppdu_start_mis);
  128. DP_PRINT_STATS("status_ppdu_end_mis_cnt = %d",
  129. rx_mon_stats->status_ppdu_end_mis);
  130. }
  131. #else
  132. static inline void
  133. dp_rx_mon_update_dbg_ppdu_stats(struct hal_rx_ppdu_info *ppdu_info,
  134. struct cdp_pdev_mon_stats *rx_mon_stats)
  135. {
  136. }
  137. static inline void
  138. dp_rx_mon_init_dbg_ppdu_stats(struct hal_rx_ppdu_info *ppdu_info,
  139. struct cdp_pdev_mon_stats *rx_mon_stats)
  140. {
  141. }
  142. static inline void
  143. dp_rx_mon_print_dbg_ppdu_stats(struct hal_rx_ppdu_info *ppdu_info,
  144. struct cdp_pdev_mon_stats *rx_mon_stats)
  145. {
  146. }
  147. #endif
  148. #endif