dp_tx.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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. #include "core.h"
  7. #include "dp_tx.h"
  8. #include "debug.h"
  9. #include "debugfs.h"
  10. #include "hw.h"
  11. #include "peer.h"
  12. #include "mac.h"
  13. enum hal_tcl_encap_type
  14. ath12k_dp_tx_get_encap_type(struct ath12k_base *ab, struct sk_buff *skb)
  15. {
  16. struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
  17. if (test_bit(ATH12K_FLAG_RAW_MODE, &ab->dev_flags))
  18. return HAL_TCL_ENCAP_TYPE_RAW;
  19. if (tx_info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP)
  20. return HAL_TCL_ENCAP_TYPE_ETHERNET;
  21. return HAL_TCL_ENCAP_TYPE_NATIVE_WIFI;
  22. }
  23. EXPORT_SYMBOL(ath12k_dp_tx_get_encap_type);
  24. void ath12k_dp_tx_encap_nwifi(struct sk_buff *skb)
  25. {
  26. struct ieee80211_hdr *hdr = (void *)skb->data;
  27. u8 *qos_ctl;
  28. if (!ieee80211_is_data_qos(hdr->frame_control))
  29. return;
  30. qos_ctl = ieee80211_get_qos_ctl(hdr);
  31. memmove(skb->data + IEEE80211_QOS_CTL_LEN,
  32. skb->data, (void *)qos_ctl - (void *)skb->data);
  33. skb_pull(skb, IEEE80211_QOS_CTL_LEN);
  34. hdr = (void *)skb->data;
  35. hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
  36. }
  37. EXPORT_SYMBOL(ath12k_dp_tx_encap_nwifi);
  38. u8 ath12k_dp_tx_get_tid(struct sk_buff *skb)
  39. {
  40. struct ieee80211_hdr *hdr = (void *)skb->data;
  41. struct ath12k_skb_cb *cb = ATH12K_SKB_CB(skb);
  42. if (cb->flags & ATH12K_SKB_HW_80211_ENCAP)
  43. return skb->priority & IEEE80211_QOS_CTL_TID_MASK;
  44. else if (!ieee80211_is_data_qos(hdr->frame_control))
  45. return HAL_DESC_REO_NON_QOS_TID;
  46. else
  47. return skb->priority & IEEE80211_QOS_CTL_TID_MASK;
  48. }
  49. EXPORT_SYMBOL(ath12k_dp_tx_get_tid);
  50. enum hal_encrypt_type ath12k_dp_tx_get_encrypt_type(u32 cipher)
  51. {
  52. switch (cipher) {
  53. case WLAN_CIPHER_SUITE_WEP40:
  54. return HAL_ENCRYPT_TYPE_WEP_40;
  55. case WLAN_CIPHER_SUITE_WEP104:
  56. return HAL_ENCRYPT_TYPE_WEP_104;
  57. case WLAN_CIPHER_SUITE_TKIP:
  58. return HAL_ENCRYPT_TYPE_TKIP_MIC;
  59. case WLAN_CIPHER_SUITE_CCMP:
  60. return HAL_ENCRYPT_TYPE_CCMP_128;
  61. case WLAN_CIPHER_SUITE_CCMP_256:
  62. return HAL_ENCRYPT_TYPE_CCMP_256;
  63. case WLAN_CIPHER_SUITE_GCMP:
  64. return HAL_ENCRYPT_TYPE_GCMP_128;
  65. case WLAN_CIPHER_SUITE_GCMP_256:
  66. return HAL_ENCRYPT_TYPE_AES_GCMP_256;
  67. default:
  68. return HAL_ENCRYPT_TYPE_OPEN;
  69. }
  70. }
  71. EXPORT_SYMBOL(ath12k_dp_tx_get_encrypt_type);
  72. void ath12k_dp_tx_release_txbuf(struct ath12k_dp *dp,
  73. struct ath12k_tx_desc_info *tx_desc,
  74. u8 pool_id)
  75. {
  76. spin_lock_bh(&dp->tx_desc_lock[pool_id]);
  77. tx_desc->skb_ext_desc = NULL;
  78. list_move_tail(&tx_desc->list, &dp->tx_desc_free_list[pool_id]);
  79. spin_unlock_bh(&dp->tx_desc_lock[pool_id]);
  80. }
  81. EXPORT_SYMBOL(ath12k_dp_tx_release_txbuf);
  82. struct ath12k_tx_desc_info *ath12k_dp_tx_assign_buffer(struct ath12k_dp *dp,
  83. u8 pool_id)
  84. {
  85. struct ath12k_tx_desc_info *desc;
  86. spin_lock_bh(&dp->tx_desc_lock[pool_id]);
  87. desc = list_first_entry_or_null(&dp->tx_desc_free_list[pool_id],
  88. struct ath12k_tx_desc_info,
  89. list);
  90. if (!desc) {
  91. spin_unlock_bh(&dp->tx_desc_lock[pool_id]);
  92. ath12k_warn(dp->ab, "failed to allocate data Tx buffer\n");
  93. return NULL;
  94. }
  95. list_move_tail(&desc->list, &dp->tx_desc_used_list[pool_id]);
  96. spin_unlock_bh(&dp->tx_desc_lock[pool_id]);
  97. return desc;
  98. }
  99. EXPORT_SYMBOL(ath12k_dp_tx_assign_buffer);
  100. void *ath12k_dp_metadata_align_skb(struct sk_buff *skb, u8 tail_len)
  101. {
  102. struct sk_buff *tail;
  103. void *metadata;
  104. if (unlikely(skb_cow_data(skb, tail_len, &tail) < 0))
  105. return NULL;
  106. metadata = pskb_put(skb, tail, tail_len);
  107. memset(metadata, 0, tail_len);
  108. return metadata;
  109. }
  110. EXPORT_SYMBOL(ath12k_dp_metadata_align_skb);
  111. static void ath12k_dp_tx_move_payload(struct sk_buff *skb,
  112. unsigned long delta,
  113. bool head)
  114. {
  115. unsigned long len = skb->len;
  116. if (head) {
  117. skb_push(skb, delta);
  118. memmove(skb->data, skb->data + delta, len);
  119. skb_trim(skb, len);
  120. } else {
  121. skb_put(skb, delta);
  122. memmove(skb->data + delta, skb->data, len);
  123. skb_pull(skb, delta);
  124. }
  125. }
  126. int ath12k_dp_tx_align_payload(struct ath12k_dp *dp, struct sk_buff **pskb)
  127. {
  128. u32 iova_mask = dp->hw_params->iova_mask;
  129. unsigned long offset, delta1, delta2;
  130. struct sk_buff *skb2, *skb = *pskb;
  131. unsigned int headroom = skb_headroom(skb);
  132. int tailroom = skb_tailroom(skb);
  133. int ret = 0;
  134. offset = (unsigned long)skb->data & iova_mask;
  135. delta1 = offset;
  136. delta2 = iova_mask - offset + 1;
  137. if (headroom >= delta1) {
  138. ath12k_dp_tx_move_payload(skb, delta1, true);
  139. } else if (tailroom >= delta2) {
  140. ath12k_dp_tx_move_payload(skb, delta2, false);
  141. } else {
  142. skb2 = skb_realloc_headroom(skb, iova_mask);
  143. if (!skb2) {
  144. ret = -ENOMEM;
  145. goto out;
  146. }
  147. dev_kfree_skb_any(skb);
  148. offset = (unsigned long)skb2->data & iova_mask;
  149. if (offset)
  150. ath12k_dp_tx_move_payload(skb2, offset, true);
  151. *pskb = skb2;
  152. }
  153. out:
  154. return ret;
  155. }
  156. EXPORT_SYMBOL(ath12k_dp_tx_align_payload);
  157. void ath12k_dp_tx_free_txbuf(struct ath12k_dp *dp,
  158. struct dp_tx_ring *tx_ring,
  159. struct ath12k_tx_desc_params *desc_params)
  160. {
  161. struct ath12k_pdev_dp *dp_pdev;
  162. struct sk_buff *msdu = desc_params->skb;
  163. struct ath12k_skb_cb *skb_cb;
  164. u8 pdev_idx = ath12k_hw_mac_id_to_pdev_id(dp->hw_params, desc_params->mac_id);
  165. skb_cb = ATH12K_SKB_CB(msdu);
  166. dma_unmap_single(dp->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE);
  167. if (skb_cb->paddr_ext_desc) {
  168. dma_unmap_single(dp->dev, skb_cb->paddr_ext_desc,
  169. desc_params->skb_ext_desc->len, DMA_TO_DEVICE);
  170. dev_kfree_skb_any(desc_params->skb_ext_desc);
  171. }
  172. guard(rcu)();
  173. dp_pdev = ath12k_dp_to_pdev_dp(dp, pdev_idx);
  174. ieee80211_free_txskb(ath12k_pdev_dp_to_hw(dp_pdev), msdu);
  175. if (atomic_dec_and_test(&dp_pdev->num_tx_pending))
  176. wake_up(&dp_pdev->tx_empty_waitq);
  177. }
  178. EXPORT_SYMBOL(ath12k_dp_tx_free_txbuf);