dp_rx.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /* SPDX-License-Identifier: BSD-3-Clause-Clear */
  2. /*
  3. * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
  4. * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
  5. */
  6. #ifndef ATH12K_DP_RX_H
  7. #define ATH12K_DP_RX_H
  8. #include <crypto/hash.h>
  9. #include "core.h"
  10. #include "debug.h"
  11. #define DP_MAX_NWIFI_HDR_LEN 30
  12. struct ath12k_reoq_buf {
  13. void *vaddr;
  14. dma_addr_t paddr_aligned;
  15. u32 size;
  16. };
  17. struct ath12k_dp_rx_tid {
  18. u8 tid;
  19. u32 ba_win_sz;
  20. struct ath12k_reoq_buf qbuf;
  21. /* Info related to rx fragments */
  22. u32 cur_sn;
  23. u16 last_frag_no;
  24. u16 rx_frag_bitmap;
  25. struct sk_buff_head rx_frags;
  26. struct hal_reo_dest_ring *dst_ring_desc;
  27. /* Timer info related to fragments */
  28. struct timer_list frag_timer;
  29. struct ath12k_dp *dp;
  30. };
  31. struct ath12k_dp_rx_tid_rxq {
  32. u8 tid;
  33. bool active;
  34. struct ath12k_reoq_buf qbuf;
  35. };
  36. struct ath12k_dp_rx_reo_cache_flush_elem {
  37. struct list_head list;
  38. struct ath12k_dp_rx_tid_rxq data;
  39. unsigned long ts;
  40. };
  41. struct dp_reo_update_rx_queue_elem {
  42. struct list_head list;
  43. struct ath12k_dp_rx_tid_rxq rx_tid;
  44. int peer_id;
  45. bool is_ml_peer;
  46. u16 ml_peer_id;
  47. };
  48. struct ath12k_dp_rx_reo_cmd {
  49. struct list_head list;
  50. struct ath12k_dp_rx_tid_rxq data;
  51. int cmd_num;
  52. void (*handler)(struct ath12k_dp *dp, void *ctx,
  53. enum hal_reo_cmd_status status);
  54. };
  55. #define ATH12K_DP_RX_FRAGMENT_TIMEOUT_MS (2 * HZ)
  56. #define ATH12K_DP_RX_REO_DESC_FREE_THRES 64
  57. #define ATH12K_DP_RX_REO_DESC_FREE_TIMEOUT_MS 1000
  58. enum ath12k_dp_rx_decap_type {
  59. DP_RX_DECAP_TYPE_RAW,
  60. DP_RX_DECAP_TYPE_NATIVE_WIFI,
  61. DP_RX_DECAP_TYPE_ETHERNET2_DIX,
  62. DP_RX_DECAP_TYPE_8023,
  63. };
  64. struct ath12k_dp_rx_rfc1042_hdr {
  65. u8 llc_dsap;
  66. u8 llc_ssap;
  67. u8 llc_ctrl;
  68. u8 snap_oui[3];
  69. __be16 snap_type;
  70. } __packed;
  71. static inline u32 ath12k_he_gi_to_nl80211_he_gi(u8 sgi)
  72. {
  73. u32 ret = 0;
  74. switch (sgi) {
  75. case RX_MSDU_START_SGI_0_8_US:
  76. ret = NL80211_RATE_INFO_HE_GI_0_8;
  77. break;
  78. case RX_MSDU_START_SGI_1_6_US:
  79. ret = NL80211_RATE_INFO_HE_GI_1_6;
  80. break;
  81. case RX_MSDU_START_SGI_3_2_US:
  82. ret = NL80211_RATE_INFO_HE_GI_3_2;
  83. break;
  84. default:
  85. ret = NL80211_RATE_INFO_HE_GI_0_8;
  86. break;
  87. }
  88. return ret;
  89. }
  90. static inline bool ath12k_dp_rx_h_more_frags(struct ath12k_hal *hal,
  91. struct sk_buff *skb)
  92. {
  93. struct ieee80211_hdr *hdr;
  94. hdr = (struct ieee80211_hdr *)(skb->data + hal->hal_desc_sz);
  95. return ieee80211_has_morefrags(hdr->frame_control);
  96. }
  97. static inline u16 ath12k_dp_rx_h_frag_no(struct ath12k_hal *hal,
  98. struct sk_buff *skb)
  99. {
  100. struct ieee80211_hdr *hdr;
  101. hdr = (struct ieee80211_hdr *)(skb->data + hal->hal_desc_sz);
  102. return le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG;
  103. }
  104. static inline u8 ath12k_dp_rx_h_l3pad(struct ath12k_base *ab,
  105. struct hal_rx_desc *desc)
  106. {
  107. return ab->hal.ops->rx_desc_get_l3_pad_bytes(desc);
  108. }
  109. static inline void ath12k_dp_rx_desc_end_tlv_copy(struct ath12k_hal *hal,
  110. struct hal_rx_desc *fdesc,
  111. struct hal_rx_desc *ldesc)
  112. {
  113. hal->ops->rx_desc_copy_end_tlv(fdesc, ldesc);
  114. }
  115. static inline void ath12k_dp_rxdesc_set_msdu_len(struct ath12k_hal *hal,
  116. struct hal_rx_desc *desc,
  117. u16 len)
  118. {
  119. hal->ops->rx_desc_set_msdu_len(desc, len);
  120. }
  121. static inline u32 ath12k_dp_rxdesc_get_ppduid(struct ath12k_base *ab,
  122. struct hal_rx_desc *rx_desc)
  123. {
  124. return ab->hal.ops->rx_desc_get_mpdu_ppdu_id(rx_desc);
  125. }
  126. static inline void ath12k_dp_rx_desc_get_dot11_hdr(struct ath12k_hal *hal,
  127. struct hal_rx_desc *desc,
  128. struct ieee80211_hdr *hdr)
  129. {
  130. hal->ops->rx_desc_get_dot11_hdr(desc, hdr);
  131. }
  132. static inline void ath12k_dp_rx_desc_get_crypto_header(struct ath12k_hal *hal,
  133. struct hal_rx_desc *desc,
  134. u8 *crypto_hdr,
  135. enum hal_encrypt_type enctype)
  136. {
  137. hal->ops->rx_desc_get_crypto_header(desc, crypto_hdr, enctype);
  138. }
  139. static inline u8 ath12k_dp_rx_get_msdu_src_link(struct ath12k_hal *hal,
  140. struct hal_rx_desc *desc)
  141. {
  142. return hal->ops->rx_desc_get_msdu_src_link_id(desc);
  143. }
  144. static inline void ath12k_dp_clean_up_skb_list(struct sk_buff_head *skb_list)
  145. {
  146. struct sk_buff *skb;
  147. while ((skb = __skb_dequeue(skb_list)))
  148. dev_kfree_skb_any(skb);
  149. }
  150. static inline
  151. void ath12k_dp_extract_rx_desc_data(struct ath12k_hal *hal,
  152. struct hal_rx_desc_data *rx_info,
  153. struct hal_rx_desc *rx_desc,
  154. struct hal_rx_desc *ldesc)
  155. {
  156. hal->ops->extract_rx_desc_data(rx_info, rx_desc, ldesc);
  157. }
  158. void ath12k_dp_rx_h_undecap(struct ath12k_pdev_dp *dp_pdev, struct sk_buff *msdu,
  159. struct hal_rx_desc *rx_desc,
  160. enum hal_encrypt_type enctype,
  161. bool decrypted,
  162. struct hal_rx_desc_data *rx_info);
  163. void ath12k_dp_rx_deliver_msdu(struct ath12k_pdev_dp *dp_pdev, struct napi_struct *napi,
  164. struct sk_buff *msdu,
  165. struct hal_rx_desc_data *rx_info);
  166. bool ath12k_dp_rx_check_nwifi_hdr_len_valid(struct ath12k_dp *dp,
  167. struct hal_rx_desc *rx_desc,
  168. struct sk_buff *msdu,
  169. struct hal_rx_desc_data *rx_info);
  170. u64 ath12k_dp_rx_h_get_pn(struct ath12k_dp *dp, struct sk_buff *skb);
  171. void ath12k_dp_rx_h_sort_frags(struct ath12k_hal *hal,
  172. struct sk_buff_head *frag_list,
  173. struct sk_buff *cur_frag);
  174. void ath12k_dp_rx_h_undecap_frag(struct ath12k_pdev_dp *dp_pdev, struct sk_buff *msdu,
  175. enum hal_encrypt_type enctype, u32 flags);
  176. int ath12k_dp_rx_h_michael_mic(struct crypto_shash *tfm, u8 *key,
  177. struct ieee80211_hdr *hdr, u8 *data,
  178. size_t data_len, u8 *mic);
  179. int ath12k_dp_rx_ampdu_start(struct ath12k *ar,
  180. struct ieee80211_ampdu_params *params,
  181. u8 link_id);
  182. int ath12k_dp_rx_ampdu_stop(struct ath12k *ar,
  183. struct ieee80211_ampdu_params *params,
  184. u8 link_id);
  185. int ath12k_dp_rx_peer_pn_replay_config(struct ath12k_link_vif *arvif,
  186. const u8 *peer_addr,
  187. enum set_key_cmd key_cmd,
  188. struct ieee80211_key_conf *key);
  189. void ath12k_dp_rx_peer_tid_cleanup(struct ath12k *ar, struct ath12k_dp_link_peer *peer);
  190. void ath12k_dp_rx_peer_tid_delete(struct ath12k *ar,
  191. struct ath12k_dp_link_peer *peer, u8 tid);
  192. int ath12k_dp_rx_peer_tid_setup(struct ath12k *ar, const u8 *peer_mac, int vdev_id,
  193. u8 tid, u32 ba_win_sz, u16 ssn,
  194. enum hal_pn_type pn_type);
  195. int ath12k_dp_rx_pdev_reo_setup(struct ath12k_base *ab);
  196. void ath12k_dp_rx_pdev_reo_cleanup(struct ath12k_base *ab);
  197. int ath12k_dp_rx_htt_setup(struct ath12k_base *ab);
  198. int ath12k_dp_rx_alloc(struct ath12k_base *ab);
  199. void ath12k_dp_rx_free(struct ath12k_base *ab);
  200. int ath12k_dp_rx_pdev_alloc(struct ath12k_base *ab, int pdev_idx);
  201. void ath12k_dp_rx_pdev_free(struct ath12k_base *ab, int pdev_idx);
  202. void ath12k_dp_rx_reo_cmd_list_cleanup(struct ath12k_base *ab);
  203. int ath12k_dp_rx_bufs_replenish(struct ath12k_dp *dp,
  204. struct dp_rxdma_ring *rx_ring,
  205. struct list_head *used_list,
  206. int req_entries);
  207. int ath12k_dp_rx_pdev_mon_attach(struct ath12k *ar);
  208. int ath12k_dp_rx_peer_frag_setup(struct ath12k *ar, const u8 *peer_mac, int vdev_id);
  209. u8 ath12k_dp_rx_h_l3pad(struct ath12k_base *ab,
  210. struct hal_rx_desc *desc);
  211. struct ath12k_dp_link_peer *
  212. ath12k_dp_rx_h_find_link_peer(struct ath12k_pdev_dp *dp_pdev, struct sk_buff *msdu,
  213. struct hal_rx_desc_data *rx_info);
  214. u8 ath12k_dp_rx_h_decap_type(struct ath12k_base *ab,
  215. struct hal_rx_desc *desc);
  216. u32 ath12k_dp_rx_h_mpdu_err(struct ath12k_base *ab,
  217. struct hal_rx_desc *desc);
  218. int ath12k_dp_rx_crypto_mic_len(struct ath12k_dp *dp, enum hal_encrypt_type enctype);
  219. u32 ath12k_dp_rxdesc_get_ppduid(struct ath12k_base *ab,
  220. struct hal_rx_desc *rx_desc);
  221. void ath12k_dp_rx_h_ppdu(struct ath12k_pdev_dp *dp_pdev,
  222. struct hal_rx_desc_data *rx_info);
  223. struct sk_buff *ath12k_dp_rx_get_msdu_last_buf(struct sk_buff_head *msdu_list,
  224. struct sk_buff *first);
  225. void ath12k_dp_reo_cmd_free(struct ath12k_dp *dp, void *ctx,
  226. enum hal_reo_cmd_status status);
  227. void ath12k_dp_rx_tid_del_func(struct ath12k_dp *dp, void *ctx,
  228. enum hal_reo_cmd_status status);
  229. void ath12k_dp_rx_process_reo_cmd_update_rx_queue_list(struct ath12k_dp *dp);
  230. void ath12k_dp_init_rx_tid_rxq(struct ath12k_dp_rx_tid_rxq *rx_tid_rxq,
  231. struct ath12k_dp_rx_tid *rx_tid,
  232. bool active);
  233. void ath12k_dp_mark_tid_as_inactive(struct ath12k_dp *dp, int peer_id, u8 tid);
  234. #endif /* ATH12K_DP_RX_H */