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