cfr.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. /* SPDX-License-Identifier: BSD-3-Clause-Clear */
  2. /*
  3. * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
  4. * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
  5. */
  6. #ifndef ATH11K_CFR_H
  7. #define ATH11K_CFR_H
  8. #include "dbring.h"
  9. #include "wmi.h"
  10. #define ATH11K_CFR_NUM_RESP_PER_EVENT 1
  11. #define ATH11K_CFR_EVENT_TIMEOUT_MS 1
  12. #define ATH11K_CFR_NUM_RING_ENTRIES 1
  13. #define ATH11K_MAX_CFR_ENABLED_CLIENTS 10
  14. #define CFR_MAX_LUT_ENTRIES 136
  15. #define HOST_MAX_CHAINS 8
  16. enum ath11k_cfr_correlate_event_type {
  17. ATH11K_CORRELATE_DBR_EVENT,
  18. ATH11K_CORRELATE_TX_EVENT,
  19. };
  20. struct ath11k_sta;
  21. struct ath11k_per_peer_cfr_capture;
  22. #define ATH11K_CFR_START_MAGIC 0xDEADBEAF
  23. #define ATH11K_CFR_END_MAGIC 0xBEAFDEAD
  24. #define VENDOR_QCA 0x8cfdf0
  25. #define PLATFORM_TYPE_ARM 2
  26. enum ath11k_cfr_meta_version {
  27. ATH11K_CFR_META_VERSION_NONE,
  28. ATH11K_CFR_META_VERSION_1,
  29. ATH11K_CFR_META_VERSION_2,
  30. ATH11K_CFR_META_VERSION_3,
  31. ATH11K_CFR_META_VERSION_4,
  32. ATH11K_CFR_META_VERSION_MAX = 0xFF,
  33. };
  34. enum ath11k_cfr_data_version {
  35. ATH11K_CFR_DATA_VERSION_NONE,
  36. ATH11K_CFR_DATA_VERSION_1,
  37. ATH11K_CFR_DATA_VERSION_MAX = 0xFF,
  38. };
  39. enum ath11k_cfr_capture_ack_mode {
  40. ATH11K_CFR_CAPTURE_LEGACY_ACK,
  41. ATH11K_CFR_CAPTURE_DUP_LEGACY_ACK,
  42. ATH11K_CFR_CAPTURE_HT_ACK,
  43. ATH11K_CFR_CAPTURE_VHT_ACK,
  44. /*Always keep this at last*/
  45. ATH11K_CFR_CAPTURE_INVALID_ACK
  46. };
  47. enum ath11k_cfr_correlate_status {
  48. ATH11K_CORRELATE_STATUS_RELEASE,
  49. ATH11K_CORRELATE_STATUS_HOLD,
  50. ATH11K_CORRELATE_STATUS_ERR,
  51. };
  52. enum ath11k_cfr_preamble_type {
  53. ATH11K_CFR_PREAMBLE_TYPE_LEGACY,
  54. ATH11K_CFR_PREAMBLE_TYPE_HT,
  55. ATH11K_CFR_PREAMBLE_TYPE_VHT,
  56. };
  57. struct ath11k_cfr_peer_tx_param {
  58. u32 capture_method;
  59. u32 vdev_id;
  60. u8 peer_mac_addr[ETH_ALEN];
  61. u32 primary_20mhz_chan;
  62. u32 bandwidth;
  63. u32 phy_mode;
  64. u32 band_center_freq1;
  65. u32 band_center_freq2;
  66. u32 spatial_streams;
  67. u32 correlation_info_1;
  68. u32 correlation_info_2;
  69. u32 status;
  70. u32 timestamp_us;
  71. u32 counter;
  72. u32 chain_rssi[WMI_MAX_CHAINS];
  73. u16 chain_phase[WMI_MAX_CHAINS];
  74. u32 cfo_measurement;
  75. u8 agc_gain[HOST_MAX_CHAINS];
  76. u32 rx_start_ts;
  77. };
  78. struct cfr_metadata {
  79. u8 peer_addr[ETH_ALEN];
  80. u8 status;
  81. u8 capture_bw;
  82. u8 channel_bw;
  83. u8 phy_mode;
  84. u16 prim20_chan;
  85. u16 center_freq1;
  86. u16 center_freq2;
  87. u8 capture_mode;
  88. u8 capture_type;
  89. u8 sts_count;
  90. u8 num_rx_chain;
  91. u32 timestamp;
  92. u32 length;
  93. u32 chain_rssi[HOST_MAX_CHAINS];
  94. u16 chain_phase[HOST_MAX_CHAINS];
  95. u32 cfo_measurement;
  96. u8 agc_gain[HOST_MAX_CHAINS];
  97. u32 rx_start_ts;
  98. } __packed;
  99. struct ath11k_csi_cfr_header {
  100. u32 start_magic_num;
  101. u32 vendorid;
  102. u8 cfr_metadata_version;
  103. u8 cfr_data_version;
  104. u8 chip_type;
  105. u8 platform_type;
  106. u32 cfr_metadata_len;
  107. struct cfr_metadata meta_data;
  108. } __packed;
  109. #define TONES_IN_20MHZ 256
  110. #define TONES_IN_40MHZ 512
  111. #define TONES_IN_80MHZ 1024
  112. #define TONES_IN_160MHZ 2048 /* 160 MHz isn't supported yet */
  113. #define TONES_INVALID 0
  114. #define CFIR_DMA_HDR_INFO0_TAG GENMASK(7, 0)
  115. #define CFIR_DMA_HDR_INFO0_LEN GENMASK(13, 8)
  116. #define CFIR_DMA_HDR_INFO1_UPLOAD_DONE GENMASK(0, 0)
  117. #define CFIR_DMA_HDR_INFO1_CAPTURE_TYPE GENMASK(3, 1)
  118. #define CFIR_DMA_HDR_INFO1_PREAMBLE_TYPE GENMASK(5, 4)
  119. #define CFIR_DMA_HDR_INFO1_NSS GENMASK(8, 6)
  120. #define CFIR_DMA_HDR_INFO1_NUM_CHAINS GENMASK(11, 9)
  121. #define CFIR_DMA_HDR_INFO1_UPLOAD_PKT_BW GENMASK(14, 12)
  122. #define CFIR_DMA_HDR_INFO1_SW_PEER_ID_VALID GENMASK(15, 15)
  123. struct ath11k_cfr_dma_hdr {
  124. u16 info0;
  125. u16 info1;
  126. u16 sw_peer_id;
  127. u16 phy_ppdu_id;
  128. };
  129. struct ath11k_look_up_table {
  130. bool dbr_recv;
  131. bool tx_recv;
  132. u8 *data;
  133. u32 data_len;
  134. u16 dbr_ppdu_id;
  135. u16 tx_ppdu_id;
  136. dma_addr_t dbr_address;
  137. struct ath11k_csi_cfr_header header;
  138. struct ath11k_cfr_dma_hdr hdr;
  139. u64 txrx_tstamp;
  140. u64 dbr_tstamp;
  141. u32 header_length;
  142. u32 payload_length;
  143. struct ath11k_dbring_element *buff;
  144. };
  145. struct cfr_unassoc_pool_entry {
  146. u8 peer_mac[ETH_ALEN];
  147. u32 period;
  148. bool is_valid;
  149. };
  150. struct ath11k_cfr {
  151. struct ath11k_dbring rx_ring;
  152. /* Protects cfr data */
  153. spinlock_t lock;
  154. /* Protect for lut entries */
  155. spinlock_t lut_lock;
  156. struct ath11k_look_up_table *lut;
  157. struct dentry *enable_cfr;
  158. struct dentry *cfr_unassoc;
  159. struct rchan *rfs_cfr_capture;
  160. u8 cfr_enabled_peer_cnt;
  161. u32 lut_num;
  162. u64 tx_evt_cnt;
  163. u64 dbr_evt_cnt;
  164. u64 release_cnt;
  165. u64 tx_peer_status_cfr_fail;
  166. u64 tx_evt_status_cfr_fail;
  167. u64 tx_dbr_lookup_fail;
  168. u64 last_success_tstamp;
  169. u64 flush_dbr_cnt;
  170. u64 clear_txrx_event;
  171. u64 cfr_dma_aborts;
  172. bool enabled;
  173. enum wmi_phy_mode phymode;
  174. struct cfr_unassoc_pool_entry unassoc_pool[ATH11K_MAX_CFR_ENABLED_CLIENTS];
  175. };
  176. enum ath11k_cfr_capture_method {
  177. ATH11K_CFR_CAPTURE_METHOD_NULL_FRAME,
  178. ATH11K_CFR_CAPTURE_METHOD_NULL_FRAME_WITH_PHASE,
  179. ATH11K_CFR_CAPTURE_METHOD_PROBE_RESP,
  180. ATH11K_CFR_CAPTURE_METHOD_MAX,
  181. };
  182. enum ath11k_cfr_capture_bw {
  183. ATH11K_CFR_CAPTURE_BW_20,
  184. ATH11K_CFR_CAPTURE_BW_40,
  185. ATH11K_CFR_CAPTURE_BW_80,
  186. ATH11K_CFR_CAPTURE_BW_MAX,
  187. };
  188. #ifdef CONFIG_ATH11K_CFR
  189. int ath11k_cfr_init(struct ath11k_base *ab);
  190. void ath11k_cfr_deinit(struct ath11k_base *ab);
  191. void ath11k_cfr_lut_update_paddr(struct ath11k *ar, dma_addr_t paddr,
  192. u32 buf_id);
  193. void ath11k_cfr_decrement_peer_count(struct ath11k *ar,
  194. struct ath11k_sta *arsta);
  195. void ath11k_cfr_update_unassoc_pool_entry(struct ath11k *ar,
  196. const u8 *peer_mac);
  197. bool ath11k_cfr_peer_is_in_cfr_unassoc_pool(struct ath11k *ar,
  198. const u8 *peer_mac);
  199. void ath11k_cfr_update_unassoc_pool(struct ath11k *ar,
  200. struct ath11k_per_peer_cfr_capture *params,
  201. u8 *peer_mac);
  202. int ath11k_cfr_send_peer_cfr_capture_cmd(struct ath11k *ar,
  203. struct ath11k_sta *arsta,
  204. struct ath11k_per_peer_cfr_capture *params,
  205. const u8 *peer_mac);
  206. struct ath11k_dbring *ath11k_cfr_get_dbring(struct ath11k *ar);
  207. void ath11k_cfr_release_lut_entry(struct ath11k_look_up_table *lut);
  208. int ath11k_process_cfr_capture_event(struct ath11k_base *ab,
  209. struct ath11k_cfr_peer_tx_param *params);
  210. void ath11k_cfr_update_phymode(struct ath11k *ar, enum wmi_phy_mode phymode);
  211. #else
  212. static inline void ath11k_cfr_update_phymode(struct ath11k *ar,
  213. enum wmi_phy_mode phymode)
  214. {
  215. }
  216. static inline int ath11k_cfr_init(struct ath11k_base *ab)
  217. {
  218. return 0;
  219. }
  220. static inline void ath11k_cfr_deinit(struct ath11k_base *ab)
  221. {
  222. }
  223. static inline void ath11k_cfr_lut_update_paddr(struct ath11k *ar,
  224. dma_addr_t paddr, u32 buf_id)
  225. {
  226. }
  227. static inline void ath11k_cfr_decrement_peer_count(struct ath11k *ar,
  228. struct ath11k_sta *arsta)
  229. {
  230. }
  231. static inline void ath11k_cfr_update_unassoc_pool_entry(struct ath11k *ar,
  232. const u8 *peer_mac)
  233. {
  234. }
  235. static inline bool
  236. ath11k_cfr_peer_is_in_cfr_unassoc_pool(struct ath11k *ar, const u8 *peer_mac)
  237. {
  238. return false;
  239. }
  240. static inline void
  241. ath11k_cfr_update_unassoc_pool(struct ath11k *ar,
  242. struct ath11k_per_peer_cfr_capture *params,
  243. u8 *peer_mac)
  244. {
  245. }
  246. static inline int
  247. ath11k_cfr_send_peer_cfr_capture_cmd(struct ath11k *ar,
  248. struct ath11k_sta *arsta,
  249. struct ath11k_per_peer_cfr_capture *params,
  250. const u8 *peer_mac)
  251. {
  252. return 0;
  253. }
  254. static inline void ath11k_cfr_release_lut_entry(struct ath11k_look_up_table *lut)
  255. {
  256. }
  257. static inline
  258. struct ath11k_dbring *ath11k_cfr_get_dbring(struct ath11k *ar)
  259. {
  260. return NULL;
  261. }
  262. static inline
  263. int ath11k_process_cfr_capture_event(struct ath11k_base *ab,
  264. struct ath11k_cfr_peer_tx_param *params)
  265. {
  266. return 0;
  267. }
  268. #endif /* CONFIG_ATH11K_CFR */
  269. #endif /* ATH11K_CFR_H */