xref: /wlan-driver/qca-wifi-host-cmn/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #ifndef _WLAN_CFR_UTILS_API_H_
21*5113495bSYour Name #define _WLAN_CFR_UTILS_API_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include <wlan_objmgr_cmn.h>
24*5113495bSYour Name #include <qdf_streamfs.h>
25*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
26*5113495bSYour Name #include <qdf_timer.h>
27*5113495bSYour Name #endif
28*5113495bSYour Name 
29*5113495bSYour Name #define cfr_alert(format, args...) \
30*5113495bSYour Name 		QDF_TRACE_FATAL(QDF_MODULE_ID_CFR, format, ## args)
31*5113495bSYour Name 
32*5113495bSYour Name #define cfr_err(format, args...) \
33*5113495bSYour Name 		QDF_TRACE_ERROR(QDF_MODULE_ID_CFR, format, ## args)
34*5113495bSYour Name 
35*5113495bSYour Name #define cfr_warn(format, args...) \
36*5113495bSYour Name 		QDF_TRACE_WARN(QDF_MODULE_ID_CFR, format, ## args)
37*5113495bSYour Name 
38*5113495bSYour Name #define cfr_info(format, args...) \
39*5113495bSYour Name 		QDF_TRACE_INFO(QDF_MODULE_ID_CFR, format, ## args)
40*5113495bSYour Name 
41*5113495bSYour Name #define cfr_debug(format, args...) \
42*5113495bSYour Name 		QDF_TRACE_DEBUG(QDF_MODULE_ID_CFR, format, ## args)
43*5113495bSYour Name 
44*5113495bSYour Name #define DBR_EVENT_TIMEOUT_IN_MS_CFR 1
45*5113495bSYour Name #define DBR_NUM_RESP_PER_EVENT_CFR 1
46*5113495bSYour Name #define MAX_CFR_ENABLED_CLIENTS 10
47*5113495bSYour Name #define CFR_CAPTURE_HOST_MEM_REQ_ID 9
48*5113495bSYour Name #define CFR_HOST_MEM_READ_INDEX_DEFAULT 8
49*5113495bSYour Name #define CFR_VENDOR_ID 0x8cfdf0
50*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
51*5113495bSYour Name #define MAX_CFR_MU_USERS 4
52*5113495bSYour Name #define NUM_CHAN_CAPTURE_STATUS 4
53*5113495bSYour Name #define NUM_CHAN_CAPTURE_REASON 6
54*5113495bSYour Name #if defined(QCA_WIFI_QCA6750) || defined(QCA_WIFI_QCA6490) || \
55*5113495bSYour Name 	defined(QCA_WIFI_WCN6450)
56*5113495bSYour Name #define MAX_TA_RA_ENTRIES 4
57*5113495bSYour Name #define MAX_RESET_CFG_ENTRY 0xF
58*5113495bSYour Name #else
59*5113495bSYour Name #define MAX_TA_RA_ENTRIES 16
60*5113495bSYour Name #define MAX_RESET_CFG_ENTRY 0xFFFF
61*5113495bSYour Name #endif
62*5113495bSYour Name #define CFR_INVALID_VDEV_ID 0xff
63*5113495bSYour Name #define DEFAULT_SRNGID_CFR 0
64*5113495bSYour Name #endif
65*5113495bSYour Name 
66*5113495bSYour Name #define MAX_CFR_PRD  (10 * 60 * 1000)   /* 10 minutes */
67*5113495bSYour Name #define CFR_MOD_PRD  10                 /* CFR period to be multiples of 10ms */
68*5113495bSYour Name 
69*5113495bSYour Name #define MAX_AGC_GAIN 62
70*5113495bSYour Name #define INVALID_AGC_GAIN 0xFFFF
71*5113495bSYour Name 
72*5113495bSYour Name enum cfrmetaversion {
73*5113495bSYour Name 	CFR_META_VERSION_NONE,
74*5113495bSYour Name 	CFR_META_VERSION_1, /* initial version for legacy_cfr_metadata */
75*5113495bSYour Name 	CFR_META_VERSION_2, /* initial version for dbr_cfr_metadata */
76*5113495bSYour Name 	CFR_META_VERSION_3, /* initial version for enh_cfr_metadata */
77*5113495bSYour Name 	CFR_META_VERSION_4, /* agc gain, cfo, rx_start_ts in dbr_cfr_metadata */
78*5113495bSYour Name 	CFR_META_VERSION_5, /* agc gain, cfo, rx_start_ts in enh_cfr_metadata */
79*5113495bSYour Name 	CFR_META_VERSION_6, /* mcs, gi_type in dbr_cfr_metadata */
80*5113495bSYour Name 	CFR_META_VERSION_7, /* mcs, gi_type, sig_info in enh_cfr_metadata */
81*5113495bSYour Name 	CFR_META_VERSION_8, /* agc gain table index in dbr_cfr_metadata */
82*5113495bSYour Name 	CFR_META_VERSION_9, /* agc gain table index in enh_cfr_metadata */
83*5113495bSYour Name 	CFR_META_VERSION_MAX = 0xFF,
84*5113495bSYour Name };
85*5113495bSYour Name 
86*5113495bSYour Name enum cfrdataversion {
87*5113495bSYour Name 	CFR_DATA_VERSION_NONE,
88*5113495bSYour Name 	CFR_DATA_VERSION_1,
89*5113495bSYour Name 	CFR_DATA_VERSION_MAX = 0xFF,
90*5113495bSYour Name };
91*5113495bSYour Name 
92*5113495bSYour Name enum cfrplatformtype {
93*5113495bSYour Name 	CFR_PLATFORM_TYPE_NONE,
94*5113495bSYour Name 	CFR_PLATFORM_TYPE_MIPS,
95*5113495bSYour Name 	CFR_PLATFORM_TYPE_ARM,
96*5113495bSYour Name 	CFR_PLATFFORM_TYPE_MAX = 0xFF,
97*5113495bSYour Name };
98*5113495bSYour Name 
99*5113495bSYour Name enum cfrradiotype {
100*5113495bSYour Name 	CFR_CAPTURE_RADIO_NONE,
101*5113495bSYour Name 	CFR_CAPTURE_RADIO_OSPREY,
102*5113495bSYour Name 	CFR_CAPTURE_RADIO_PEAKCOCK,
103*5113495bSYour Name 	CFR_CAPTURE_RADIO_SCORPION,
104*5113495bSYour Name 	CFR_CAPTURE_RADIO_HONEYBEE,
105*5113495bSYour Name 	CFR_CAPTURE_RADIO_DRAGONFLY,
106*5113495bSYour Name 	CFR_CAPTURE_RADIO_JET,
107*5113495bSYour Name 	CFR_CAPTURE_RADIO_PEREGRINE = 17,
108*5113495bSYour Name 	CFR_CAPTURE_RADIO_SWIFT,
109*5113495bSYour Name 	CFR_CAPTURE_RADIO_BEELINER,
110*5113495bSYour Name 	CFR_CAPTURE_RADIO_CASCADE,
111*5113495bSYour Name 	CFR_CAPTURE_RADIO_DAKOTA,
112*5113495bSYour Name 	CFR_CAPTURE_RADIO_BESRA,
113*5113495bSYour Name 	CFR_CAPTURE_RADIO_HKV2,
114*5113495bSYour Name 	CFR_CAPTURE_RADIO_CYP,
115*5113495bSYour Name 	CFR_CAPTURE_RADIO_HSP,
116*5113495bSYour Name 	CFR_CAPTURE_RADIO_PINE,
117*5113495bSYour Name 	CFR_CAPTURE_RADIO_ADRASTEA,
118*5113495bSYour Name 	CFR_CAPTURE_RADIO_MAPLE,
119*5113495bSYour Name 	CFR_CAPTURE_RADIO_MOSELLE,
120*5113495bSYour Name 	CFR_CAPTURE_RADIO_SPRUCE,
121*5113495bSYour Name 	CFR_CAPTURE_RADIO_ALDER,
122*5113495bSYour Name 	CFR_CAPTURE_RADIO_WAIKIKI,
123*5113495bSYour Name 	CFR_CAPTURE_RADIO_KIWI,
124*5113495bSYour Name 	CFR_CAPTURE_RADIO_MANGO,
125*5113495bSYour Name 	CFR_CAPTURE_RADIO_MIAMI,
126*5113495bSYour Name 	CFR_CAPTURE_RADIO_YORK,
127*5113495bSYour Name 	CFR_CAPTURE_RADIO_PEACH,
128*5113495bSYour Name 	CFR_CAPTURE_RADIO_PEBBLE,
129*5113495bSYour Name 	CFR_CAPTURE_RADIO_EVROS,
130*5113495bSYour Name 	CFR_CAPTURE_RADIO_MAX = 0xFF,
131*5113495bSYour Name };
132*5113495bSYour Name 
133*5113495bSYour Name enum ack_capture_mode {
134*5113495bSYour Name 	CFR_LEGACY_ACK     = 0,
135*5113495bSYour Name 	CFR_DUP_LEGACY_ACK = 1,
136*5113495bSYour Name 	CFR_HT_ACK         = 2,
137*5113495bSYour Name 	CFR_VHT_ACK        = 3,
138*5113495bSYour Name 	CFR_INVALID_ACK, /*Always keep this at last*/
139*5113495bSYour Name };
140*5113495bSYour Name 
141*5113495bSYour Name /* Similar to WMI_PEER_CFR_CAPTURE_METHOD used in one-shot capture */
142*5113495bSYour Name enum cfr_capture_type {
143*5113495bSYour Name 	CFR_TYPE_METHOD_NULL_FRAME = 0,
144*5113495bSYour Name 	CFR_TYPE_METHOD_NULL_FRAME_WITH_PHASE = 1,
145*5113495bSYour Name 	CFR_TYPE_METHOD_PROBE_RESP = 2,
146*5113495bSYour Name 	CFR_TYPE_METHOD_TM = 3,
147*5113495bSYour Name 	CFR_TYPE_METHOD_FTM = 4,
148*5113495bSYour Name 	CFR_TYPE_METHOD_ACK_RESP_TO_TM_FTM = 5,
149*5113495bSYour Name 	CFR_TYPE_METHOD_TA_RA_TYPE_FILTER = 6,
150*5113495bSYour Name 	CFR_TYPE_METHOD_NDPA_NDP = 7,
151*5113495bSYour Name 	CFR_TYPE_METHOD_ALL_PACKET = 8,
152*5113495bSYour Name 	/* Add new capture methods before this line */
153*5113495bSYour Name 	CFR_TYPE_METHOD_LAST_VALID,
154*5113495bSYour Name 	CFR_TYPE_METHOD_AUTO = 0xff,
155*5113495bSYour Name 	CFR_TYPE_METHOD_MAX,
156*5113495bSYour Name };
157*5113495bSYour Name 
158*5113495bSYour Name #define HOST_MAX_CHAINS 8
159*5113495bSYour Name 
160*5113495bSYour Name /* ensure to add new members at the end of the structure only */
161*5113495bSYour Name struct dbr_cfr_metadata {
162*5113495bSYour Name 	u_int8_t    peer_addr[QDF_MAC_ADDR_SIZE];
163*5113495bSYour Name 	u_int8_t    status;
164*5113495bSYour Name 	u_int8_t    capture_bw;
165*5113495bSYour Name 	u_int8_t    channel_bw;
166*5113495bSYour Name 	u_int8_t    phy_mode;
167*5113495bSYour Name 	u_int16_t   prim20_chan;
168*5113495bSYour Name 	u_int16_t   center_freq1;
169*5113495bSYour Name 	u_int16_t   center_freq2;
170*5113495bSYour Name 	u_int8_t    capture_mode;
171*5113495bSYour Name 	u_int8_t    capture_type;
172*5113495bSYour Name 	u_int8_t    sts_count;
173*5113495bSYour Name 	u_int8_t    num_rx_chain;
174*5113495bSYour Name 	u_int32_t   timestamp;
175*5113495bSYour Name 	u_int32_t   length;
176*5113495bSYour Name 	u_int32_t   chain_rssi[HOST_MAX_CHAINS];
177*5113495bSYour Name 	u_int16_t   chain_phase[HOST_MAX_CHAINS];
178*5113495bSYour Name 	u_int32_t   rtt_cfo_measurement;
179*5113495bSYour Name 	u_int8_t    agc_gain[HOST_MAX_CHAINS];
180*5113495bSYour Name 	u_int32_t   rx_start_ts;
181*5113495bSYour Name 	u_int16_t   mcs_rate;
182*5113495bSYour Name 	u_int16_t   gi_type;
183*5113495bSYour Name 	u_int8_t    agc_gain_tbl_index[HOST_MAX_CHAINS];
184*5113495bSYour Name } __attribute__ ((__packed__));
185*5113495bSYour Name 
186*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
187*5113495bSYour Name struct cfr_su_sig_info {
188*5113495bSYour Name 	u_int8_t coding;
189*5113495bSYour Name 	u_int8_t stbc;
190*5113495bSYour Name 	u_int8_t beamformed;
191*5113495bSYour Name 	u_int8_t dcm;
192*5113495bSYour Name 	u_int8_t ltf_size;
193*5113495bSYour Name 	u_int8_t sgi;
194*5113495bSYour Name 	u_int16_t reserved;
195*5113495bSYour Name } __attribute__ ((__packed__));
196*5113495bSYour Name 
197*5113495bSYour Name /* ensure to add new members at the end of the structure only */
198*5113495bSYour Name struct enh_cfr_metadata {
199*5113495bSYour Name 	u_int8_t    status;
200*5113495bSYour Name 	u_int8_t    capture_bw;
201*5113495bSYour Name 	u_int8_t    channel_bw;
202*5113495bSYour Name 	u_int8_t    phy_mode;
203*5113495bSYour Name 	u_int16_t   prim20_chan;
204*5113495bSYour Name 	u_int16_t   center_freq1;
205*5113495bSYour Name 	u_int16_t   center_freq2;
206*5113495bSYour Name 	u_int8_t    capture_mode; /* ack_capture_mode */
207*5113495bSYour Name 	u_int8_t    capture_type; /* cfr_capture_type */
208*5113495bSYour Name 	u_int8_t    sts_count;
209*5113495bSYour Name 	u_int8_t    num_rx_chain;
210*5113495bSYour Name 	u_int64_t   timestamp;
211*5113495bSYour Name 	u_int32_t   length;
212*5113495bSYour Name 	u_int8_t    is_mu_ppdu;
213*5113495bSYour Name 	u_int8_t    num_mu_users;
214*5113495bSYour Name 	union {
215*5113495bSYour Name 		u_int8_t    su_peer_addr[QDF_MAC_ADDR_SIZE];
216*5113495bSYour Name 		u_int8_t    mu_peer_addr[MAX_CFR_MU_USERS][QDF_MAC_ADDR_SIZE];
217*5113495bSYour Name 	} peer_addr;
218*5113495bSYour Name 	u_int32_t   chain_rssi[HOST_MAX_CHAINS];
219*5113495bSYour Name 	u_int16_t   chain_phase[HOST_MAX_CHAINS];
220*5113495bSYour Name 	u_int32_t   rtt_cfo_measurement;
221*5113495bSYour Name 	u_int8_t    agc_gain[HOST_MAX_CHAINS];
222*5113495bSYour Name 	u_int32_t   rx_start_ts;
223*5113495bSYour Name 	u_int16_t   mcs_rate;
224*5113495bSYour Name 	u_int16_t   gi_type;
225*5113495bSYour Name 	struct cfr_su_sig_info sig_info;
226*5113495bSYour Name 	u_int8_t    agc_gain_tbl_index[HOST_MAX_CHAINS];
227*5113495bSYour Name } __attribute__ ((__packed__));
228*5113495bSYour Name #endif
229*5113495bSYour Name 
230*5113495bSYour Name #define  CFR_META_DATA_LEN \
231*5113495bSYour Name 	(sizeof(struct csi_cfr_header) - sizeof(struct cfr_header_cmn))
232*5113495bSYour Name 
233*5113495bSYour Name struct cfr_header_cmn {
234*5113495bSYour Name 	u_int32_t   start_magic_num;
235*5113495bSYour Name 	u_int32_t   vendorid;
236*5113495bSYour Name 	u_int8_t    cfr_metadata_version;
237*5113495bSYour Name 	u_int8_t    cfr_data_version;
238*5113495bSYour Name 	u_int8_t    chip_type;
239*5113495bSYour Name 	u_int8_t    pltform_type;
240*5113495bSYour Name 	u_int32_t   cfr_metadata_len;
241*5113495bSYour Name 	u_int64_t   host_real_ts;
242*5113495bSYour Name } __attribute__ ((__packed__));
243*5113495bSYour Name 
244*5113495bSYour Name struct csi_cfr_header {
245*5113495bSYour Name 	struct cfr_header_cmn cmn;
246*5113495bSYour Name 	union {
247*5113495bSYour Name 		struct dbr_cfr_metadata meta_dbr;
248*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
249*5113495bSYour Name 		struct enh_cfr_metadata meta_enh;
250*5113495bSYour Name #endif
251*5113495bSYour Name 	} u;
252*5113495bSYour Name } __attribute__ ((__packed__));
253*5113495bSYour Name 
254*5113495bSYour Name /**
255*5113495bSYour Name  * struct cfr_capture_params - structure to store cfr config param
256*5113495bSYour Name  * @bandwidth: bandwidth of capture
257*5113495bSYour Name  * @period: period of capture
258*5113495bSYour Name  * @method: enum of method being followed to capture cfr data. 0-QoS null data
259*5113495bSYour Name  */
260*5113495bSYour Name struct cfr_capture_params {
261*5113495bSYour Name 	u_int8_t   bandwidth;
262*5113495bSYour Name 	u_int32_t  period;
263*5113495bSYour Name 	u_int8_t   method;
264*5113495bSYour Name };
265*5113495bSYour Name 
266*5113495bSYour Name /**
267*5113495bSYour Name  * struct psoc_cfr - private psoc object for cfr
268*5113495bSYour Name  * @psoc_obj: pointer to psoc object
269*5113495bSYour Name  * @is_cfr_capable: flag to determine if cfr is enabled or not
270*5113495bSYour Name  * @is_cfr_pdev_id_soc: flag to send cfr request with PDEV_ID_SOC
271*5113495bSYour Name  * @is_cap_interval_mode_sel_support: flag to determine if target supports both
272*5113495bSYour Name  *				      capture_count and capture_duration modes
273*5113495bSYour Name  *				      with a nob provided to configure
274*5113495bSYour Name  * @is_mo_marking_support: flag to determine if MO marking is supported or not
275*5113495bSYour Name  * @is_aoa_for_rcc_support:
276*5113495bSYour Name  */
277*5113495bSYour Name struct psoc_cfr {
278*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc_obj;
279*5113495bSYour Name 	uint8_t is_cfr_capable;
280*5113495bSYour Name 	uint8_t is_cfr_pdev_id_soc;
281*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
282*5113495bSYour Name 	uint8_t is_cap_interval_mode_sel_support;
283*5113495bSYour Name 	uint8_t is_mo_marking_support;
284*5113495bSYour Name 	uint8_t is_aoa_for_rcc_support;
285*5113495bSYour Name #endif
286*5113495bSYour Name };
287*5113495bSYour Name 
288*5113495bSYour Name /**
289*5113495bSYour Name  * struct cfr_wmi_host_mem_chunk - wmi mem chunk related
290*5113495bSYour Name  * @vaddr: pointer to virtual address
291*5113495bSYour Name  * @paddr: physical address
292*5113495bSYour Name  * @len: len of the mem chunk allocated
293*5113495bSYour Name  * @req_id: reqid related to the mem chunk
294*5113495bSYour Name  */
295*5113495bSYour Name struct cfr_wmi_host_mem_chunk {
296*5113495bSYour Name 	uint32_t *vaddr;
297*5113495bSYour Name 	qdf_dma_addr_t paddr;
298*5113495bSYour Name 	uint32_t len;
299*5113495bSYour Name 	uint32_t req_id;
300*5113495bSYour Name };
301*5113495bSYour Name 
302*5113495bSYour Name struct whal_cfir_dma_hdr {
303*5113495bSYour Name 	uint16_t
304*5113495bSYour Name 		// 'BA'
305*5113495bSYour Name 		tag                 : 8,
306*5113495bSYour Name 		// '02', length of header in 4 octet units
307*5113495bSYour Name 		length              : 6,
308*5113495bSYour Name 		// 00
309*5113495bSYour Name 		reserved            : 2;
310*5113495bSYour Name 	uint16_t
311*5113495bSYour Name 		// [16]
312*5113495bSYour Name 		upload_done         : 1,
313*5113495bSYour Name 		// [17:18], 0: invalid, 1: CFR, 2: CIR, 3: DebugH
314*5113495bSYour Name 		capture_type        : 3,
315*5113495bSYour Name 		// [19:20], 0: Legacy, 1: HT, 2: VHT, 3: HE
316*5113495bSYour Name 		preamble_type       : 2,
317*5113495bSYour Name 		// [21:23], 0: 1-stream, 1: 2-stream, ..., 7: 8-stream
318*5113495bSYour Name 		nss                 : 3,
319*5113495bSYour Name 		// [24:27], 0: invalid, 1: 1-chain, 2: 2-chain, etc.
320*5113495bSYour Name 		num_chains          : 3,
321*5113495bSYour Name 		// [28:30], 0: 20 MHz, 1: 40 MHz, 2: 80 MHz, 3: 160 MHz
322*5113495bSYour Name 		upload_pkt_bw       : 3,    // [31]
323*5113495bSYour Name 		sw_peer_id_valid    : 1;
324*5113495bSYour Name 	uint16_t
325*5113495bSYour Name 		sw_peer_id          : 16;   // [15:0]
326*5113495bSYour Name 	uint16_t
327*5113495bSYour Name 		phy_ppdu_id         : 16;   // [15:0]
328*5113495bSYour Name };
329*5113495bSYour Name 
330*5113495bSYour Name #define MAX_LUT_ENTRIES 140 /* For HKv2 136 is max */
331*5113495bSYour Name 
332*5113495bSYour Name /**
333*5113495bSYour Name  * struct look_up_table - Placeholder for 2 asynchronous events (DBR and
334*5113495bSYour Name  * TXRX event)
335*5113495bSYour Name  * @dbr_recv: Indicates whether WMI for DBR completion is received or not
336*5113495bSYour Name  * @tx_recv: Indicates whether WMI for TX completion (or) WDI event for RX
337*5113495bSYour Name  * status is received or not
338*5113495bSYour Name  * @data: pointer to CFR data that ucode DMAs to host memory
339*5113495bSYour Name  * @data_len: length of CFR data DMAed by ucode
340*5113495bSYour Name  * @dbr_ppdu_id: PPDU id retrieved from DBR completion WMI event
341*5113495bSYour Name  * @tx_ppdu_id: PPDU id retrieved from WMI TX completion event (or) PPDU status
342*5113495bSYour Name  * TLV
343*5113495bSYour Name  * @dbr_address: Physical address of the CFR data dump retrieved from DBR
344*5113495bSYour Name  * completion WMI event
345*5113495bSYour Name  * @tx_address1: Physical address of the CFR data from TX/RX event
346*5113495bSYour Name  * @tx_address2: Physical address of the CFR data from TX/RX event
347*5113495bSYour Name  * @header: CFR header constructed by host
348*5113495bSYour Name  * @dma_hdr: CFR header constructed by ucode
349*5113495bSYour Name  * @txrx_tstamp: Timestamp when TX/RX event was received
350*5113495bSYour Name  * @dbr_tstamp: Timestamp when DBR completion event was received
351*5113495bSYour Name  * @header_length: Length of header DMAed by ucode in words
352*5113495bSYour Name  * @payload_length: Length of CFR payload
353*5113495bSYour Name  */
354*5113495bSYour Name struct look_up_table {
355*5113495bSYour Name 	bool dbr_recv;
356*5113495bSYour Name 	bool tx_recv;
357*5113495bSYour Name 	uint8_t *data; /* capture payload */
358*5113495bSYour Name 	uint32_t data_len; /* capture len */
359*5113495bSYour Name 	uint16_t dbr_ppdu_id; /* ppdu id from dbr */
360*5113495bSYour Name 	uint16_t tx_ppdu_id; /* ppdu id from TX event */
361*5113495bSYour Name 	qdf_dma_addr_t dbr_address; /* capture len */
362*5113495bSYour Name 	uint32_t tx_address1; /* capture len */
363*5113495bSYour Name 	uint32_t tx_address2; /* capture len */
364*5113495bSYour Name 	struct csi_cfr_header header;
365*5113495bSYour Name 	struct whal_cfir_dma_hdr dma_hdr;
366*5113495bSYour Name 	uint64_t txrx_tstamp;
367*5113495bSYour Name 	uint64_t dbr_tstamp;
368*5113495bSYour Name 	uint32_t header_length;
369*5113495bSYour Name 	uint32_t payload_length;
370*5113495bSYour Name };
371*5113495bSYour Name 
372*5113495bSYour Name struct unassoc_pool_entry {
373*5113495bSYour Name 	struct qdf_mac_addr mac;
374*5113495bSYour Name 	struct cfr_capture_params cfr_params;
375*5113495bSYour Name 	bool is_valid;
376*5113495bSYour Name };
377*5113495bSYour Name 
378*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
379*5113495bSYour Name /**
380*5113495bSYour Name  * struct ta_ra_cfr_cfg - structure to store configuration of 16 groups in
381*5113495bSYour Name  * M_TA_RA mode
382*5113495bSYour Name  * @filter_group_id: Filter group number for which the below filters needs to be
383*5113495bSYour Name  * applied
384*5113495bSYour Name  * @bw: CFR capture will be done for packets matching the bandwidths specified
385*5113495bSYour Name  * within this bitmask
386*5113495bSYour Name  * @nss: CFR capture will be done for packets matching the Nss specified within
387*5113495bSYour Name  * this bitmask
388*5113495bSYour Name  * @rsvd0: reserved bits
389*5113495bSYour Name  * @valid_ta: Ta_addr is valid if set
390*5113495bSYour Name  * @valid_ta_mask: Ta_addr_mask is valid if set
391*5113495bSYour Name  * @valid_ra: Ra_addr is valid if set
392*5113495bSYour Name  * @valid_ra_mask: Ra_addr_mask is valid if set
393*5113495bSYour Name  * @valid_bw_mask: Bandwidth is valid if set
394*5113495bSYour Name  * @valid_nss_mask: NSS is valid if set
395*5113495bSYour Name  * @valid_mgmt_subtype: Mgmt_subtype is valid if set
396*5113495bSYour Name  * @valid_ctrl_subtype: Ctrl_subtype is valid if set
397*5113495bSYour Name  * @valid_data_subtype: Data_subtype is valid if set
398*5113495bSYour Name  * @rsvd1: reserved bits
399*5113495bSYour Name  * @mgmt_subtype_filter: Managments Packets matching the subtype filter
400*5113495bSYour Name  * categories will be filtered in by MAC for CFR capture.
401*5113495bSYour Name  * @ctrl_subtype_filter: Control Packets matching the subtype filter
402*5113495bSYour Name  * categories will be filtered in by MAC for CFR capture.
403*5113495bSYour Name  * @data_subtype_filter: Data Packets matching the subtype filter
404*5113495bSYour Name  * categories will be filtered in by MAC for CFR capture.
405*5113495bSYour Name  * @tx_addr: Packets whose transmitter address matches (tx_addr & tx_addr_mask)
406*5113495bSYour Name  * will be filtered in by MAC
407*5113495bSYour Name  * @tx_addr_mask: Packets whose transmitter address matches (tx_addr &
408*5113495bSYour Name  * tx_addr_mask) will be filtered in by MAC
409*5113495bSYour Name  * @rx_addr: Packets whose receiver address matches (rx_addr & rx_addr_mask)
410*5113495bSYour Name  * will be filtered in by MAC
411*5113495bSYour Name  * @rx_addr_mask: Packets whose receiver address matches (rx_addr &
412*5113495bSYour Name  * rx_addr_mask) will be filtered in by MAC
413*5113495bSYour Name  */
414*5113495bSYour Name struct ta_ra_cfr_cfg {
415*5113495bSYour Name 	uint8_t filter_group_id;
416*5113495bSYour Name 	uint16_t bw                          :6,
417*5113495bSYour Name 		 nss                         :8,
418*5113495bSYour Name 		 rsvd0                       :2;
419*5113495bSYour Name 	uint16_t valid_ta                    :1,
420*5113495bSYour Name 		 valid_ta_mask               :1,
421*5113495bSYour Name 		 valid_ra                    :1,
422*5113495bSYour Name 		 valid_ra_mask               :1,
423*5113495bSYour Name 		 valid_bw_mask               :1,
424*5113495bSYour Name 		 valid_nss_mask              :1,
425*5113495bSYour Name 		 valid_mgmt_subtype          :1,
426*5113495bSYour Name 		 valid_ctrl_subtype          :1,
427*5113495bSYour Name 		 valid_data_subtype          :1,
428*5113495bSYour Name 		 rsvd1                       :7;
429*5113495bSYour Name 	uint16_t mgmt_subtype_filter;
430*5113495bSYour Name 	uint16_t ctrl_subtype_filter;
431*5113495bSYour Name 	uint16_t data_subtype_filter;
432*5113495bSYour Name 	uint8_t tx_addr[QDF_MAC_ADDR_SIZE];
433*5113495bSYour Name 	uint8_t rx_addr[QDF_MAC_ADDR_SIZE];
434*5113495bSYour Name 	uint8_t tx_addr_mask[QDF_MAC_ADDR_SIZE];
435*5113495bSYour Name 	uint8_t rx_addr_mask[QDF_MAC_ADDR_SIZE];
436*5113495bSYour Name 
437*5113495bSYour Name } qdf_packed;
438*5113495bSYour Name 
439*5113495bSYour Name /**
440*5113495bSYour Name  * struct cfr_rcc_param - structure to store cfr config param
441*5113495bSYour Name  * @pdev_id: pdev_id for identifying the MAC
442*5113495bSYour Name  * @vdev_id: vdev_id of current rcc configures
443*5113495bSYour Name  * @srng_id: srng id of current rcc configures
444*5113495bSYour Name  * @capture_duration: Capture Duration field for which CFR capture has to
445*5113495bSYour Name  * happen, in microsecond units
446*5113495bSYour Name  * @capture_interval: Capture interval field which is time in between
447*5113495bSYour Name  * consecutive CFR capture, in microsecond units
448*5113495bSYour Name  * @ul_mu_user_mask_lower: Bitfields indicates which of the users in the current
449*5113495bSYour Name  * UL MU transmission are enabled for CFR capture.
450*5113495bSYour Name  * @ul_mu_user_mask_upper: This is continuation of the above lower mask.
451*5113495bSYour Name  * @freeze_tlv_delay_cnt_en: Enable Freeze TLV delay counter in MAC
452*5113495bSYour Name  * @freeze_tlv_delay_cnt_thr: Indicates the number of consecutive Rx packets to
453*5113495bSYour Name  * be skipped before CFR capture is enabled again.
454*5113495bSYour Name  * @rsvd0: reserved bits
455*5113495bSYour Name  * @filter_group_bitmap: Bitfields set indicates which of the CFR group config
456*5113495bSYour Name  * is enabled
457*5113495bSYour Name  * @m_directed_ftm: Filter Directed FTM ACK frames for CFR capture
458*5113495bSYour Name  * @m_all_ftm_ack: Filter All FTM ACK frames for CFR capture
459*5113495bSYour Name  * @m_ndpa_ndp_directed: Filter NDPA NDP Directed Frames for CFR capture
460*5113495bSYour Name  * @m_ndpa_ndp_all: Filter all NDPA NDP for CFR capture
461*5113495bSYour Name  * @m_ta_ra_filter: Filter Frames based on TA/RA/Subtype as provided in CFR
462*5113495bSYour Name  * Group config
463*5113495bSYour Name  * @m_all_packet: Filter in All packets for CFR Capture
464*5113495bSYour Name  * @en_ta_ra_filter_in_as_fp: Filter in frames as FP/MO in m_ta_ra_filter mode
465*5113495bSYour Name  * @rsvd1: reserved bits
466*5113495bSYour Name  * @num_grp_tlvs: Indicates the number of groups in M_TA_RA mode, that have
467*5113495bSYour Name  * changes in the current commit session, use to construct WMI group TLV(s)
468*5113495bSYour Name  * @curr: Placeholder for M_TA_RA group config in current commit session
469*5113495bSYour Name  * @modified_in_curr_session: Bitmap indicating number of groups in M_TA_RA mode
470*5113495bSYour Name  * that have changed in current commit session.
471*5113495bSYour Name  * @capture_count: After capture_count+1 number of captures, MAC stops RCC  and
472*5113495bSYour Name  * waits for capture_interval duration before enabling again
473*5113495bSYour Name  * @capture_intval_mode_sel: 0 indicates capture_duration mode, 1 indicates the
474*5113495bSYour Name  * capture_count mode.
475*5113495bSYour Name  * @rsvd2: reserved bits
476*5113495bSYour Name  */
477*5113495bSYour Name struct cfr_rcc_param {
478*5113495bSYour Name 	uint8_t pdev_id;
479*5113495bSYour Name 	uint8_t vdev_id;
480*5113495bSYour Name 	uint8_t srng_id;
481*5113495bSYour Name 	uint32_t capture_duration;
482*5113495bSYour Name 	uint32_t capture_interval;
483*5113495bSYour Name 	uint32_t ul_mu_user_mask_lower;
484*5113495bSYour Name 	uint32_t ul_mu_user_mask_upper;
485*5113495bSYour Name 	uint16_t freeze_tlv_delay_cnt_en  :1,
486*5113495bSYour Name 		 freeze_tlv_delay_cnt_thr :8,
487*5113495bSYour Name 		 rsvd0 :7;
488*5113495bSYour Name 	uint16_t filter_group_bitmap;
489*5113495bSYour Name 	uint8_t m_directed_ftm           : 1,
490*5113495bSYour Name 		m_all_ftm_ack            : 1,
491*5113495bSYour Name 		m_ndpa_ndp_directed      : 1,
492*5113495bSYour Name 		m_ndpa_ndp_all           : 1,
493*5113495bSYour Name 		m_ta_ra_filter           : 1,
494*5113495bSYour Name 		m_all_packet             : 1,
495*5113495bSYour Name 		en_ta_ra_filter_in_as_fp : 1,
496*5113495bSYour Name 		rsvd1                    : 1;
497*5113495bSYour Name 	uint8_t num_grp_tlvs;
498*5113495bSYour Name 
499*5113495bSYour Name 	struct ta_ra_cfr_cfg curr[MAX_TA_RA_ENTRIES];
500*5113495bSYour Name 	unsigned long modified_in_curr_session;
501*5113495bSYour Name 	uint32_t capture_count            :16,
502*5113495bSYour Name 		 capture_intval_mode_sel  :1,
503*5113495bSYour Name 		 rsvd2                    :15;
504*5113495bSYour Name };
505*5113495bSYour Name #endif /* WLAN_ENH_CFR_ENABLE */
506*5113495bSYour Name 
507*5113495bSYour Name /**
508*5113495bSYour Name  * struct nl_event_cb - nl event cb for cfr data
509*5113495bSYour Name  * @vdev_id: vdev id
510*5113495bSYour Name  * @pid: PID to which data is sent via unicast nl event
511*5113495bSYour Name  * @cfr_nl_cb: callback to send nl event
512*5113495bSYour Name  */
513*5113495bSYour Name struct nl_event_cb {
514*5113495bSYour Name 	uint8_t vdev_id;
515*5113495bSYour Name 	uint32_t pid;
516*5113495bSYour Name 	void (*cfr_nl_cb)(uint8_t vdev_id, uint32_t pid,
517*5113495bSYour Name 			  const void *data, uint32_t data_len);
518*5113495bSYour Name };
519*5113495bSYour Name 
520*5113495bSYour Name /**
521*5113495bSYour Name  * struct pdev_cfr - private pdev object for cfr
522*5113495bSYour Name  * @pdev_obj: pointer to pdev object
523*5113495bSYour Name  * @is_cfr_capable: flag to determine if cfr is enabled or not
524*5113495bSYour Name  * @cfr_timer_enable: flag to enable/disable timer
525*5113495bSYour Name  * @chip_type: chip type which is defined in enum cfrradiotype
526*5113495bSYour Name  * @cfr_mem_chunk: Region of memory used for storing cfr data
527*5113495bSYour Name  * @cfr_max_sta_count: Maximum stations supported in one-shot capture mode
528*5113495bSYour Name  * @cfr_current_sta_count:
529*5113495bSYour Name  * @num_subbufs: No. of sub-buffers used in relayfs
530*5113495bSYour Name  * @subbuf_size: Size of sub-buffer used in relayfs
531*5113495bSYour Name  * @chan_ptr: Channel in relayfs
532*5113495bSYour Name  * @dir_ptr: Parent directory of relayfs file
533*5113495bSYour Name  * @lut: lookup table used to store asynchronous DBR and TX/RX events for
534*5113495bSYour Name  * correlation
535*5113495bSYour Name  * @lut_num: Number of lut
536*5113495bSYour Name  * @dbr_buf_size: Size of DBR completion buffer
537*5113495bSYour Name  * @dbr_num_bufs: No. of DBR completions
538*5113495bSYour Name  * @max_mu_users: Max number of MU users
539*5113495bSYour Name  * @tx_evt_cnt: No. of TX completion events till CFR stop was issued
540*5113495bSYour Name  * @total_tx_evt_cnt: No. of Tx completion events since wifi was up
541*5113495bSYour Name  * @dbr_evt_cnt: No. of WMI DBR completion events
542*5113495bSYour Name  * @release_cnt: No. of CFR data buffers relayed to userspace
543*5113495bSYour Name  * @tx_peer_status_cfr_fail: No. of tx events without tx status set to
544*5113495bSYour Name  * PEER_CFR_CAPTURE_EVT_STATUS_MASK indicating CFR capture failure on a peer.
545*5113495bSYour Name  * @tx_evt_status_cfr_fail: No. of tx events without tx status set to
546*5113495bSYour Name  * CFR_TX_EVT_STATUS_MASK indicating CFR capture status failure.
547*5113495bSYour Name  * @tx_dbr_cookie_lookup_fail: No. of dbr cookie lookup failures during tx event
548*5113495bSYour Name  * process.
549*5113495bSYour Name  * @rcc_param: Structure to store CFR config for the current commit session
550*5113495bSYour Name  * @global: Structure to store accumulated CFR config
551*5113495bSYour Name  * @rx_tlv_evt_cnt: Number of CFR WDI events from datapath
552*5113495bSYour Name  * @lut_age_timer: Timer to flush pending TXRX/DBR events in lookup table
553*5113495bSYour Name  * @lut_timer_init: flag to determine if lut_age_timer is initialized or not
554*5113495bSYour Name  * @is_cfr_rcc_capable: Flag to determine if RCC is enabled or not.
555*5113495bSYour Name  * @flush_dbr_cnt: No. of un-correlated DBR completions flushed when a newer
556*5113495bSYour Name  * PPDU is correlated successfully with newer DBR completion
557*5113495bSYour Name  * @invalid_dma_length_cnt: No. of buffers for which CFR DMA header length (or)
558*5113495bSYour Name  * data length was invalid
559*5113495bSYour Name  * @flush_timeout_dbr_cnt: No. of DBR completion flushed out in ageout logic
560*5113495bSYour Name  * @clear_txrx_event: No. of PPDU status TLVs over-written in LUT
561*5113495bSYour Name  * @last_success_tstamp: DBR timestamp which indicates that both DBR and TX/RX
562*5113495bSYour Name  * events have been received successfully.
563*5113495bSYour Name  * @cfr_dma_aborts: No. of CFR DMA aborts in ucode
564*5113495bSYour Name  * @is_cap_interval_mode_sel_support: flag to determine if target supports both
565*5113495bSYour Name  * @is_mo_marking_support: flag to determine if MO marking is supported or not
566*5113495bSYour Name  * @is_aoa_for_rcc_support: flag to determine if AoA is available for RCC or not
567*5113495bSYour Name  * capture_count and capture_duration modes with a nob provided to configure.
568*5113495bSYour Name  * @unassoc_pool: Pool of un-associated clients used when capture method is
569*5113495bSYour Name  * CFR_CAPTURE_METHOD_PROBE_RESPONSE
570*5113495bSYour Name  * @nl_cb: call back to register for nl event for cfr data
571*5113495bSYour Name  * @lut_lock: Lock to protect access to cfr lookup table
572*5113495bSYour Name  * @lut_lock_initialised: Check lut_lock initialised or not.
573*5113495bSYour Name  * @is_prevent_suspend: CFR wake lock acquired or not
574*5113495bSYour Name  * @wake_lock: wake lock for cfr
575*5113495bSYour Name  * @runtime_lock: runtime lock for cfr
576*5113495bSYour Name  * @freq: current operating freq for which AoA Phase delta values reported by FW
577*5113495bSYour Name  * @max_aoa_chains: Indicate the max number of chains to which target supports
578*5113495bSYour Name  * AoA data.
579*5113495bSYour Name  * @phase_delta: per chain phase delta associated with 62 gain values reported
580*5113495bSYour Name  * by FW via WMI_PDEV_AOA_PHASEDELTA_EVENTID. This is for the targets which
581*5113495bSYour Name  * supports only default gain table.
582*5113495bSYour Name  * @ibf_cal_val: Per chain IBF cal value from FW.
583*5113495bSYour Name  * @is_enh_aoa_data: flag to indicate the pdev supports enhanced AoA.
584*5113495bSYour Name  * @max_agc_gain_tbls: Max rx AGC gain tables supported & advertised by target.
585*5113495bSYour Name  * @max_agc_gain_per_tbl_2g: Max possible rx AGC gain per table on 2GHz band.
586*5113495bSYour Name  * @max_agc_gain_per_tbl_5g: Max possible rx AGC gain per table on 5GHz band.
587*5113495bSYour Name  * @max_agc_gain_per_tbl_6g: Max possbile rx AGC gain per table on 6GHz band.
588*5113495bSYour Name  * @max_bdf_entries_per_tbl: Max entries per table in gain & phase array.
589*5113495bSYour Name  * @max_entries_all_table: Max entries across table in gain & phase array.
590*5113495bSYour Name  * @gain_stop_index_array: This array has optimized gain range values stored.
591*5113495bSYour Name  * @enh_phase_delta_array: This array has optimized phase delta values stored
592*5113495bSYour Name  * aligning with gain_stop_index_array.
593*5113495bSYour Name  * @start_ent: array where each entry indicates the offset index per table to be
594*5113495bSYour Name  * applied on gain_stop_index_array and enh_phase_delta_array
595*5113495bSYour Name  * @xbar_config: xbar config to be used to map bb to rf chainmask.
596*5113495bSYour Name  */
597*5113495bSYour Name /*
598*5113495bSYour Name  * To be extended if we get more capbality info
599*5113495bSYour Name  * from FW's extended service ready event.
600*5113495bSYour Name  */
601*5113495bSYour Name struct pdev_cfr {
602*5113495bSYour Name 	struct wlan_objmgr_pdev *pdev_obj;
603*5113495bSYour Name 	uint8_t is_cfr_capable;
604*5113495bSYour Name 	uint8_t cfr_timer_enable;
605*5113495bSYour Name 	uint8_t chip_type;
606*5113495bSYour Name 	struct cfr_wmi_host_mem_chunk cfr_mem_chunk;
607*5113495bSYour Name 	uint16_t cfr_max_sta_count;
608*5113495bSYour Name 	uint16_t cfr_current_sta_count;
609*5113495bSYour Name 	uint32_t num_subbufs;
610*5113495bSYour Name 	uint32_t subbuf_size;
611*5113495bSYour Name 	qdf_streamfs_chan_t chan_ptr;
612*5113495bSYour Name 	qdf_dentry_t dir_ptr;
613*5113495bSYour Name 	struct look_up_table **lut;
614*5113495bSYour Name 	uint32_t lut_num;
615*5113495bSYour Name 	uint32_t dbr_buf_size;
616*5113495bSYour Name 	uint32_t dbr_num_bufs;
617*5113495bSYour Name 	uint32_t max_mu_users;
618*5113495bSYour Name 	uint64_t tx_evt_cnt;
619*5113495bSYour Name 	uint64_t total_tx_evt_cnt;
620*5113495bSYour Name 	uint64_t dbr_evt_cnt;
621*5113495bSYour Name 	uint64_t release_cnt;
622*5113495bSYour Name 	uint64_t tx_peer_status_cfr_fail;
623*5113495bSYour Name 	uint64_t tx_evt_status_cfr_fail;
624*5113495bSYour Name 	uint64_t tx_dbr_cookie_lookup_fail;
625*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
626*5113495bSYour Name 	struct cfr_rcc_param rcc_param;
627*5113495bSYour Name 	struct ta_ra_cfr_cfg global[MAX_TA_RA_ENTRIES];
628*5113495bSYour Name 	uint64_t rx_tlv_evt_cnt;
629*5113495bSYour Name 	qdf_timer_t lut_age_timer;
630*5113495bSYour Name 	uint8_t lut_timer_init;
631*5113495bSYour Name 	uint8_t is_cfr_rcc_capable;
632*5113495bSYour Name 	uint64_t flush_dbr_cnt;
633*5113495bSYour Name 	uint64_t invalid_dma_length_cnt;
634*5113495bSYour Name 	uint64_t flush_timeout_dbr_cnt;
635*5113495bSYour Name 	uint64_t clear_txrx_event;
636*5113495bSYour Name 	uint64_t last_success_tstamp;
637*5113495bSYour Name 	uint64_t cfr_dma_aborts;
638*5113495bSYour Name 	uint8_t is_cap_interval_mode_sel_support;
639*5113495bSYour Name 	uint8_t is_mo_marking_support;
640*5113495bSYour Name 	uint8_t is_aoa_for_rcc_support;
641*5113495bSYour Name #endif
642*5113495bSYour Name 	struct unassoc_pool_entry unassoc_pool[MAX_CFR_ENABLED_CLIENTS];
643*5113495bSYour Name 	struct nl_event_cb nl_cb;
644*5113495bSYour Name 	qdf_spinlock_t lut_lock;
645*5113495bSYour Name 	bool lut_lock_initialised;
646*5113495bSYour Name #ifdef WLAN_CFR_PM
647*5113495bSYour Name 	bool is_prevent_suspend;
648*5113495bSYour Name 	qdf_wake_lock_t wake_lock;
649*5113495bSYour Name 	qdf_runtime_lock_t runtime_lock;
650*5113495bSYour Name #endif
651*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
652*5113495bSYour Name 	uint32_t freq;
653*5113495bSYour Name 	uint32_t max_aoa_chains;
654*5113495bSYour Name 	uint16_t phase_delta[HOST_MAX_CHAINS][MAX_AGC_GAIN];
655*5113495bSYour Name 	uint32_t ibf_cal_val[HOST_MAX_CHAINS];
656*5113495bSYour Name #ifdef WLAN_RCC_ENHANCED_AOA_SUPPORT
657*5113495bSYour Name 	bool is_enh_aoa_data;
658*5113495bSYour Name 	uint32_t max_agc_gain_tbls;
659*5113495bSYour Name 	uint16_t max_agc_gain_per_tbl_2g[PSOC_MAX_NUM_AGC_GAIN_TBLS];
660*5113495bSYour Name 	uint16_t max_agc_gain_per_tbl_5g[PSOC_MAX_NUM_AGC_GAIN_TBLS];
661*5113495bSYour Name 	uint16_t max_agc_gain_per_tbl_6g[PSOC_MAX_NUM_AGC_GAIN_TBLS];
662*5113495bSYour Name 	uint8_t max_bdf_entries_per_tbl[PSOC_MAX_NUM_AGC_GAIN_TBLS];
663*5113495bSYour Name 	uint32_t max_entries_all_table;
664*5113495bSYour Name 	uint16_t *gain_stop_index_array;
665*5113495bSYour Name 	uint16_t *enh_phase_delta_array;
666*5113495bSYour Name 	uint8_t start_ent[PSOC_MAX_NUM_AGC_GAIN_TBLS];
667*5113495bSYour Name 	uint32_t xbar_config;
668*5113495bSYour Name #endif /* WLAN_RCC_ENHANCED_AOA_SUPPORT */
669*5113495bSYour Name #endif /* WLAN_ENH_CFR_ENABLE */
670*5113495bSYour Name };
671*5113495bSYour Name 
672*5113495bSYour Name /**
673*5113495bSYour Name  * enum cfr_capt_status - CFR capture status
674*5113495bSYour Name  * @PEER_CFR_CAPTURE_DISABLE: Capture not in progress
675*5113495bSYour Name  * @PEER_CFR_CAPTURE_ENABLE: Capture in progress
676*5113495bSYour Name  */
677*5113495bSYour Name enum cfr_capt_status {
678*5113495bSYour Name 	PEER_CFR_CAPTURE_DISABLE,
679*5113495bSYour Name 	PEER_CFR_CAPTURE_ENABLE,
680*5113495bSYour Name };
681*5113495bSYour Name 
682*5113495bSYour Name /**
683*5113495bSYour Name  * struct peer_cfr - private peer object for cfr
684*5113495bSYour Name  * @peer_obj: pointer to peer_obj
685*5113495bSYour Name  * @request: Type of request (start/stop)
686*5113495bSYour Name  * @bandwidth: bandwidth of capture for this peer
687*5113495bSYour Name  * @period: period of capture for this peer
688*5113495bSYour Name  * @capture_method: enum determining type of cfr data capture.
689*5113495bSYour Name  *                 0-Qos null data
690*5113495bSYour Name  */
691*5113495bSYour Name struct peer_cfr {
692*5113495bSYour Name 	struct wlan_objmgr_peer *peer_obj;
693*5113495bSYour Name 	u_int8_t   request;            /* start/stop */
694*5113495bSYour Name 	u_int8_t   bandwidth;
695*5113495bSYour Name 	u_int32_t  period;
696*5113495bSYour Name 	u_int8_t   capture_method;
697*5113495bSYour Name };
698*5113495bSYour Name 
699*5113495bSYour Name /**
700*5113495bSYour Name  * cfr_initialize_pdev() - cfr initialize pdev
701*5113495bSYour Name  * @pdev: Pointer to pdev_obj
702*5113495bSYour Name  *
703*5113495bSYour Name  * Return: status of cfr pdev init
704*5113495bSYour Name  */
705*5113495bSYour Name QDF_STATUS cfr_initialize_pdev(struct wlan_objmgr_pdev *pdev);
706*5113495bSYour Name 
707*5113495bSYour Name /**
708*5113495bSYour Name  * cfr_deinitialize_pdev() - cfr deinitialize pdev
709*5113495bSYour Name  * @pdev: Pointer to pdev_obj
710*5113495bSYour Name  *
711*5113495bSYour Name  * Return: status of cfr pdev deinit
712*5113495bSYour Name  */
713*5113495bSYour Name QDF_STATUS cfr_deinitialize_pdev(struct wlan_objmgr_pdev *pdev);
714*5113495bSYour Name 
715*5113495bSYour Name /**
716*5113495bSYour Name  * wlan_cfr_init() - Global init for cfr.
717*5113495bSYour Name  *
718*5113495bSYour Name  * Return: status of global init pass/fail
719*5113495bSYour Name  */
720*5113495bSYour Name QDF_STATUS wlan_cfr_init(void);
721*5113495bSYour Name 
722*5113495bSYour Name /**
723*5113495bSYour Name  * wlan_cfr_deinit() - Global de-init for cfr.
724*5113495bSYour Name  *
725*5113495bSYour Name  * Return: status of global de-init pass/fail
726*5113495bSYour Name  */
727*5113495bSYour Name QDF_STATUS wlan_cfr_deinit(void);
728*5113495bSYour Name 
729*5113495bSYour Name /**
730*5113495bSYour Name  * wlan_cfr_pdev_open() - pdev_open function for cfr.
731*5113495bSYour Name  * @pdev: pointer to pdev object
732*5113495bSYour Name  *
733*5113495bSYour Name  * Return: status of pdev_open pass/fail
734*5113495bSYour Name  */
735*5113495bSYour Name QDF_STATUS wlan_cfr_pdev_open(struct wlan_objmgr_pdev *pdev);
736*5113495bSYour Name 
737*5113495bSYour Name /**
738*5113495bSYour Name  * wlan_cfr_pdev_close() - pdev_close function for cfr.
739*5113495bSYour Name  * @pdev: pointer to pdev object
740*5113495bSYour Name  *
741*5113495bSYour Name  * Return: status of pdev_close pass/fail
742*5113495bSYour Name  */
743*5113495bSYour Name QDF_STATUS wlan_cfr_pdev_close(struct wlan_objmgr_pdev *pdev);
744*5113495bSYour Name 
745*5113495bSYour Name /**
746*5113495bSYour Name  * count_set_bits() - function to count set bits in a bitmap
747*5113495bSYour Name  * @value: input bitmap
748*5113495bSYour Name  *
749*5113495bSYour Name  * Return: No. of set bits
750*5113495bSYour Name  */
751*5113495bSYour Name uint8_t count_set_bits(unsigned long value);
752*5113495bSYour Name 
753*5113495bSYour Name /**
754*5113495bSYour Name  * wlan_cfr_is_feature_disabled() - Check if cfr feature is disabled
755*5113495bSYour Name  * @pdev: the physical device object.
756*5113495bSYour Name  *
757*5113495bSYour Name  * Return : true if cfr is disabled, else false.
758*5113495bSYour Name  */
759*5113495bSYour Name bool wlan_cfr_is_feature_disabled(struct wlan_objmgr_pdev *pdev);
760*5113495bSYour Name 
761*5113495bSYour Name #ifdef WLAN_ENH_CFR_ENABLE
762*5113495bSYour Name /**
763*5113495bSYour Name  * wlan_cfr_rx_tlv_process() - Process PPDU status TLVs and store info in
764*5113495bSYour Name  * lookup table
765*5113495bSYour Name  * @pdev: PDEV object
766*5113495bSYour Name  * @nbuf: ppdu info
767*5113495bSYour Name  *
768*5113495bSYour Name  * Return: none
769*5113495bSYour Name  */
770*5113495bSYour Name void wlan_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf);
771*5113495bSYour Name #endif
772*5113495bSYour Name #endif
773