dp_be_rx.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /*
  2. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021 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. #ifndef _DP_BE_RX_H_
  20. #define _DP_BE_RX_H_
  21. #include <dp_types.h>
  22. #include "dp_be.h"
  23. /*
  24. * dp_be_intrabss_params
  25. *
  26. * @dest_soc: dest soc to forward the packet to
  27. * @tx_vdev_id: vdev id retrieved from dest peer
  28. */
  29. struct dp_be_intrabss_params {
  30. struct dp_soc *dest_soc;
  31. uint8_t tx_vdev_id;
  32. };
  33. #ifndef QCA_HOST_MODE_WIFI_DISABLED
  34. /*
  35. * dp_rx_intrabss_fwd_be() - API for intrabss fwd. For EAPOL
  36. * pkt with DA not equal to vdev mac addr, fwd is not allowed.
  37. * @soc: core txrx main context
  38. * @ta_peer: source peer entry
  39. * @rx_tlv_hdr: start address of rx tlvs
  40. * @nbuf: nbuf that has to be intrabss forwarded
  41. * @msdu_metadata: msdu metadata
  42. *
  43. * Return: true if it is forwarded else false
  44. */
  45. bool dp_rx_intrabss_fwd_be(struct dp_soc *soc,
  46. struct dp_peer *ta_peer,
  47. uint8_t *rx_tlv_hdr,
  48. qdf_nbuf_t nbuf,
  49. struct hal_rx_msdu_metadata msdu_metadata);
  50. #endif
  51. uint32_t dp_rx_process_be(struct dp_intr *int_ctx,
  52. hal_ring_handle_t hal_ring_hdl, uint8_t reo_ring_num,
  53. uint32_t quota);
  54. /**
  55. * dp_rx_desc_pool_init_be() - Initialize Rx Descriptor pool(s)
  56. * @soc: Handle to DP Soc structure
  57. * @rx_desc_pool: Rx descriptor pool handler
  58. * @pool_id: Rx descriptor pool ID
  59. *
  60. * Return: QDF_STATUS_SUCCESS - succeeded, others - failed
  61. */
  62. QDF_STATUS dp_rx_desc_pool_init_be(struct dp_soc *soc,
  63. struct rx_desc_pool *rx_desc_pool,
  64. uint32_t pool_id);
  65. /**
  66. * dp_rx_desc_pool_deinit_be() - De-initialize Rx Descriptor pool(s)
  67. * @soc: Handle to DP Soc structure
  68. * @rx_desc_pool: Rx descriptor pool handler
  69. * @pool_id: Rx descriptor pool ID
  70. *
  71. * Return: None
  72. */
  73. void dp_rx_desc_pool_deinit_be(struct dp_soc *soc,
  74. struct rx_desc_pool *rx_desc_pool,
  75. uint32_t pool_id);
  76. /**
  77. * dp_wbm_get_rx_desc_from_hal_desc_be() - Get corresponding Rx Desc
  78. * address from WBM ring Desc
  79. * @soc: Handle to DP Soc structure
  80. * @ring_desc: ring descriptor structure pointer
  81. * @r_rx_desc: pointer to a pointer of Rx Desc
  82. *
  83. * Return: QDF_STATUS_SUCCESS - succeeded, others - failed
  84. */
  85. QDF_STATUS dp_wbm_get_rx_desc_from_hal_desc_be(struct dp_soc *soc,
  86. void *ring_desc,
  87. struct dp_rx_desc **r_rx_desc);
  88. /**
  89. * dp_rx_desc_cookie_2_va_be() - Convert RX Desc cookie ID to VA
  90. * @soc:Handle to DP Soc structure
  91. * @cookie: cookie used to lookup virtual address
  92. *
  93. * Return: Rx descriptor virtual address
  94. */
  95. struct dp_rx_desc *dp_rx_desc_cookie_2_va_be(struct dp_soc *soc,
  96. uint32_t cookie);
  97. #if !defined(DP_FEATURE_HW_COOKIE_CONVERSION) || \
  98. defined(DP_HW_COOKIE_CONVERT_EXCEPTION)
  99. /**
  100. * dp_rx_desc_sw_cc_check() - check if RX desc VA is got correctly,
  101. if not, do SW cookie conversion.
  102. * @soc:Handle to DP Soc structure
  103. * @rx_buf_cookie: RX desc cookie ID
  104. * @r_rx_desc: double pointer for RX desc
  105. *
  106. * Return: None
  107. */
  108. static inline void
  109. dp_rx_desc_sw_cc_check(struct dp_soc *soc,
  110. uint32_t rx_buf_cookie,
  111. struct dp_rx_desc **r_rx_desc)
  112. {
  113. if (qdf_unlikely(!(*r_rx_desc))) {
  114. *r_rx_desc = (struct dp_rx_desc *)
  115. dp_cc_desc_find(soc,
  116. rx_buf_cookie);
  117. }
  118. }
  119. #else
  120. static inline void
  121. dp_rx_desc_sw_cc_check(struct dp_soc *soc,
  122. uint32_t rx_buf_cookie,
  123. struct dp_rx_desc **r_rx_desc)
  124. {
  125. }
  126. #endif /* DP_FEATURE_HW_COOKIE_CONVERSION && DP_HW_COOKIE_CONVERT_EXCEPTION */
  127. #define DP_PEER_METADATA_OFFLOAD_GET_BE(_peer_metadata) (0)
  128. #ifdef DP_USE_REDUCED_PEER_ID_FIELD_WIDTH
  129. static inline uint16_t
  130. dp_rx_peer_metadata_peer_id_get_be(struct dp_soc *soc, uint32_t peer_metadata)
  131. {
  132. struct htt_rx_peer_metadata_v1 *metadata =
  133. (struct htt_rx_peer_metadata_v1 *)&peer_metadata;
  134. uint16_t peer_id;
  135. peer_id = metadata->peer_id |
  136. (metadata->ml_peer_valid << soc->peer_id_shift);
  137. return peer_id;
  138. }
  139. #else
  140. /* Combine ml_peer_valid and peer_id field */
  141. #define DP_BE_PEER_METADATA_PEER_ID_MASK 0x00003fff
  142. #define DP_BE_PEER_METADATA_PEER_ID_SHIFT 0
  143. static inline uint16_t
  144. dp_rx_peer_metadata_peer_id_get_be(struct dp_soc *soc, uint32_t peer_metadata)
  145. {
  146. return ((peer_metadata & DP_BE_PEER_METADATA_PEER_ID_MASK) >>
  147. DP_BE_PEER_METADATA_PEER_ID_SHIFT);
  148. }
  149. #endif
  150. static inline uint16_t
  151. dp_rx_peer_metadata_vdev_id_get_be(struct dp_soc *soc, uint32_t peer_metadata)
  152. {
  153. struct htt_rx_peer_metadata_v1 *metadata =
  154. (struct htt_rx_peer_metadata_v1 *)&peer_metadata;
  155. return metadata->vdev_id;
  156. }
  157. #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
  158. /**
  159. * dp_rx_nf_process() - Near Full state handler for RX rings.
  160. * @int_ctx: interrupt context
  161. * @hal_ring_hdl: Rx ring handle
  162. * @reo_ring_num: RX ring number
  163. * @quota: Quota of work to be done
  164. *
  165. * Return: work done in the handler
  166. */
  167. uint32_t dp_rx_nf_process(struct dp_intr *int_ctx,
  168. hal_ring_handle_t hal_ring_hdl,
  169. uint8_t reo_ring_num,
  170. uint32_t quota);
  171. #else
  172. static inline
  173. uint32_t dp_rx_nf_process(struct dp_intr *int_ctx,
  174. hal_ring_handle_t hal_ring_hdl,
  175. uint8_t reo_ring_num,
  176. uint32_t quota)
  177. {
  178. return 0;
  179. }
  180. #endif /*WLAN_FEATURE_NEAR_FULL_IRQ */
  181. #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
  182. struct dp_soc *
  183. dp_rx_replensih_soc_get(struct dp_soc *soc, uint8_t reo_ring_num);
  184. #else
  185. static inline struct dp_soc *
  186. dp_rx_replensih_soc_get(struct dp_soc *soc, uint8_t reo_ring_num)
  187. {
  188. return soc;
  189. }
  190. #endif
  191. #ifdef WLAN_FEATURE_11BE_MLO
  192. #ifdef WLAN_MCAST_MLO
  193. /**
  194. * dp_rx_mlo_igmp_handler() - Rx handler for Mcast packets
  195. * @soc: Handle to DP Soc structure
  196. * @vdev: DP vdev handle
  197. * @peer: DP peer handle
  198. * @nbuf: nbuf to be enqueued
  199. *
  200. * Return: true when packet sent to stack, false failure
  201. */
  202. bool dp_rx_mlo_igmp_handler(struct dp_soc *soc,
  203. struct dp_vdev *vdev,
  204. struct dp_peer *peer,
  205. qdf_nbuf_t nbuf);
  206. #endif
  207. #endif
  208. #endif