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