1 /*
2  * Copyright (c) 2019-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 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 _TARGET_IF_CFR_ENH_H_
21 #define _TARGET_IF_CFR_ENH_H_
22 
23 #ifdef WLAN_ENH_CFR_ENABLE
24 /*
25  * Memory requirements :
26  *
27  *  1. DMA header :
28  *
29  * Legacy DMA header(QCA8074V2) : 2 words (length = 8 bytes)
30  * Enhanced DMA header(QCA6018) : Upto 16 words depending on no. of MU users
31  *                       in UL-MU-PPDU (Max length = 64 bytes)
32  *
33  * Fixed 4 words for whal_cfir_enhanced_hdr + freeze TLV
34  *                                          + uplink_user_info TLV (MAX 4)
35  *
36  * mu_rx_num_users -> No. of words in CFR DMA header
37  * 0 -> 12  =  4 + 7(freeze TLV) + 1(for 64-bit alignment)
38  * 1 -> 12  =  4 + 7(freeze TLV) + 1(user1)
39  * 2 -> 14  =  4 + 7(freeze TLV) + 2(users 1,2) + 1(for 64-bit alignment)
40  * 3 -> 14  =  4 + 7(freeze TLV) + 3(users 1,2,3)
41  * 4 -> 16  =  4 + 7(freeze TLV) + 4(users 1,2,3,4) + 1(for 64-bit alignment)
42  *
43  *
44  * 2. CFR data size for max BW/Nss/Nrx
45  *
46  *	Cypress : Max BW = 80 MHz
47  *			 NSS = 2
48  *			 Nrx = 2
49  *			 Size of one tone = 4 bytes
50  *
51  *		a. RTT-H - 2048 bytes
52  *
53  *		b. Debug-H (MIMO CFR) - 16016 bytes
54  *
55  *		c. RTT-H + CIR - 10240 bytes = 2048(RTT-H) + 8192(CIR)
56  */
57 
58 /* Max 4 users in MU case */
59 #define CYP_CFR_MU_USERS 4
60 
61 #define CYP_MAX_HEADER_LENGTH_WORDS 16
62 
63 /* payload_len = Max(2048, 16016, 10240) = 16064 (64-bit alignment) */
64 #define CYP_MAX_DATA_LENGTH_BYTES 16064
65 
66 /* in ms */
67 #define LUT_AGE_TIMER 3000
68 #define LUT_AGE_THRESHOLD 3000
69 
70 /* Max size :
71  * sizeof(csi_cfr_header) + 64 bytes(cfr header) + 16064 bytes(cfr payload)
72  */
73 #define STREAMFS_MAX_SUBBUF_CYP \
74 	(sizeof(struct csi_cfr_header) + \
75 	 (CYP_MAX_HEADER_LENGTH_WORDS * 4) + \
76 	 CYP_MAX_DATA_LENGTH_BYTES)
77 
78 #define STREAMFS_NUM_SUBBUF_CYP 255
79 
80 /* Max 37 users in MU case for Pine */
81 #define PINE_CFR_MU_USERS 37
82 
83 #define PINE_MAX_HEADER_LENGTH_WORDS 50
84 
85 #define PINE_MAX_DATA_LENGTH_BYTES 16384
86 
87 /* Max size :
88  * sizeof(csi_cfr_header) + 200 bytes(cfr header) + 16384 bytes(cfr payload)
89  */
90 #define STREAMFS_MAX_SUBBUF_PINE \
91 	(sizeof(struct csi_cfr_header) + \
92 	 (PINE_MAX_HEADER_LENGTH_WORDS * 4) + \
93 	 PINE_MAX_DATA_LENGTH_BYTES)
94 
95 #define STREAMFS_NUM_SUBBUF_PINE 255
96 
97 /* Max 37 users in MU case for Waikiki */
98 #define WAIKIKI_CFR_MU_USERS 37
99 
100 #define WAIKIKI_MAX_HEADER_LENGTH_WORDS 88
101 
102 #define WAIKIKI_MAX_DATA_LENGTH_BYTES 64512
103 
104 /* Max size :
105  * sizeof(csi_cfr_header) + 352 bytes(cfr header) + 64512 bytes(cfr payload)
106  * where cfr_header size = rtt upload header len + freeze_tlv len +
107  *                         uplink user setup info + alignment/reserved bytes
108  *                       = 16bytes + 32bytes + (8bytes * 37users) + 8bytes
109  */
110 #define STREAMFS_MAX_SUBBUF_WAIKIKI \
111 	(sizeof(struct csi_cfr_header) + \
112 	 (WAIKIKI_MAX_HEADER_LENGTH_WORDS * 4) + \
113 	 WAIKIKI_MAX_DATA_LENGTH_BYTES)
114 
115 #define STREAMFS_NUM_SUBBUF_WAIKIKI  127
116 
117 /* Max 4 users in MU case for Spruce */
118 #define SPRUCE_CFR_MU_USERS 4
119 
120 #define SPRUCE_MAX_HEADER_LENGTH_WORDS 16
121 
122 #define SPRUCE_MAX_DATA_LENGTH_BYTES 16384
123 
124 /* Max size :
125  * sizeof(csi_cfr_header) + 200 bytes(cfr header) + 16384 bytes(cfr payload)
126  */
127 #define STREAMFS_MAX_SUBBUF_SPRUCE \
128 	(sizeof(struct csi_cfr_header) + \
129 	 (SPRUCE_MAX_HEADER_LENGTH_WORDS * 4) + \
130 	 SPRUCE_MAX_DATA_LENGTH_BYTES)
131 
132 #define STREAMFS_NUM_SUBBUF_SPRUCE 255
133 
134 /* Max 8 users in MU case for QCN6432 */
135 #define QCN6432_CFR_MU_USERS 8
136 
137 /* uCode header = (14 + (max number of MU users supported *2))*4 Bytes */
138 #define QCN6432_MAX_HEADER_LENGTH_WORDS 30
139 
140 /* Maximum number of tones that can be uploaded is 1001
141  * Max data len = Num tones per stream per chain * max chains
142  * max nss * size of tone
143  *              = 1001 * 2 * 4 * 4 = 32032 Bytes
144  * Total length = Max data len + ucode header
145  *              = 32032 + 120 = 32152 Bytes
146  */
147 #define QCN6432_MAX_DATA_LENGTH_BYTES 32152
148 
149 /* Max size :
150  * sizeof(csi_cfr_header) + 120 bytes(ucode header) + 32152 bytes(cfr payload)
151  */
152 #define STREAMFS_MAX_SUBBUF_QCN6432 \
153 	(sizeof(struct csi_cfr_header) + \
154 	 (QCN6432_MAX_HEADER_LENGTH_WORDS * 4) + \
155 	 QCN6432_MAX_DATA_LENGTH_BYTES)
156 
157 /* The number of buffers allotted by two IPC rings is 103.
158  * Hence, the relayFS should be have more than 103 buffers.
159  * Considering the maximum size of CFR log size to be 8MB
160  * and which should be multiple of relayFS buffer pool memory.
161  *
162  * Size of a relayFS buffer = csi metadata + QCN6432_MAX_DATA_LENGTH_BYTES
163  *                          = 310 + 32152
164  *                          = 32462 Bytes
165  *
166  * Num of streamfs sub buffers = 4MB / 32462B
167  *                             = 128 (approax)
168  */
169 #define STREAMFS_NUM_SUBBUF_QCN6432 128
170 
171 /* Max 4 users in MU case for QCA5332 */
172 #define QCA5332_CFR_MU_USERS 4
173 
174 #define QCA5332_MAX_HEADER_LENGTH_WORDS 22
175 
176 #define QCA5332_MAX_DATA_LENGTH_BYTES 8192
177 
178 /* Max size :
179  * sizeof(csi_cfr_header) + 88 bytes(cfr header) + 8192 bytes(cfr payload)
180  * where cfr_header size = rtt upload header len + freeze_tlv len +
181  *                         uplink user setup info + alignment/reserved bytes
182  *                       = 16bytes + 32bytes + (8bytes * 4users) + 8bytes
183  */
184 #define STREAMFS_MAX_SUBBUF_QCA5332 \
185 	(sizeof(struct csi_cfr_header) + \
186 	 (QCA5332_MAX_HEADER_LENGTH_WORDS * 4) + \
187 	QCA5332_MAX_DATA_LENGTH_BYTES)
188 
189 #define STREAMFS_NUM_SUBBUF_QCA5332 255
190 
191 /* enum macrx_freeze_tlv_version: Reported by uCode in enh_dma_header
192  * MACRX_FREEZE_TLV_VERSION_1: Single MU UL user info reported by MAC.
193  * This is used in Cypress/HastingsPrime chips. Corresponding structures are
194  * macrx_freeze_capture_channel and 1 uplink_user_setup_info.
195  *
196  * MACRX_FREEZE_TLV_VERSION_2: Upto 4 MU UL user info reported by MAC.
197  * This is used in Maple/Spruce/Moselle chips. Corresponding structures are
198  * macrx_freeze_capture_channel and 2 uplink_user_setup_info.
199  *
200  * MACRX_FREEZE_TLV_VERSION_3: Upto 37 MU UL user info reported by MAC.
201  * This is used in Pine chip. The corresponding structures are
202  * macrx_freeze_capture_channel_v3 and 37 uplink_user_setup_info.
203  *
204  * MACRX_FREEZE_TLV_VERSION_4: Upto 37 MU UL user info reported by MAC.
205  * This is used in Hamilton 1/2.
206  *
207  * MACRX_FREEZE_TLV_VERSION_5: Upto 37 MU UL user info reported by MAC.
208  * This is used in Waikiki chipsets.
209  */
210 enum macrx_freeze_tlv_version {
211 	MACRX_FREEZE_TLV_VERSION_1 = 1,
212 	MACRX_FREEZE_TLV_VERSION_2 = 2,
213 	MACRX_FREEZE_TLV_VERSION_3 = 3,
214 	MACRX_FREEZE_TLV_VERSION_4 = 4,
215 	MACRX_FREEZE_TLV_VERSION_5 = 5,
216 	MACRX_FREEZE_TLV_VERSION_MAX
217 };
218 
219 /* Max 4 users in MU case for Maple */
220 #define MAPLE_CFR_MU_USERS 4
221 
222 #define MAPLE_MAX_HEADER_LENGTH_WORDS 16
223 
224 #define MAPLE_MAX_DATA_LENGTH_BYTES 4096
225 
226 /* Max size :
227  * sizeof(csi_cfr_header) + 64 bytes(cfr uCode header) +
228  * 4096 bytes(cfr payload)
229  */
230 #define STREAMFS_MAX_SUBBUF_MAPLE \
231 	(sizeof(struct csi_cfr_header) + \
232 	 (MAPLE_MAX_HEADER_LENGTH_WORDS * 4) + \
233 	 MAPLE_MAX_DATA_LENGTH_BYTES)
234 
235 /*
236  * RelayFS memory required:
237  * Max sub buffer size * Number of sub buffers
238  *
239  * Cascade: (2200B  * 1100) ~= 2MB
240  * Dakota:  (1100B  * 2200) ~= 2MB
241  * Hawkeye: (8200B  * 255 ) ~= 2MB
242  * Cypress: (16438B * 255 ) ~= 4MB
243  * Pine   : (16894B * 255 ) ~= 4MB
244  * Maple  : (4470B *  255 ) ~= 1MB
245  *
246  */
247 #define STREAMFS_NUM_SUBBUF_MAPLE 255
248 
249 enum UCODE_UPLOAD_HEADER_VERSION {
250 	UPLOAD_HEADER_VERSION_1 = 1,
251 	UPLOAD_HEADER_VERSION_2 = 2,
252 	UPLOAD_HEADER_VERSION_3 = 3,
253 	UPLOAD_HEADER_VERSION_4 = 4,
254 	UPLOAD_HEADER_VERSION_8 = 8,
255 	UPLOAD_HEADER_VERSION_9 = 9,
256 	UPLOAD_HEADER_VERSION_MAX
257 };
258 
259 /*
260  * @tag: ucode fills this with 0xBA
261  *
262  * @length: length of CFR header in words (32-bit)
263  *
264  * @upload_done: ucode sets this to 1 to indicate DMA completion
265  *
266  * @capture_type:
267  *
268  *			0 - None
269  *			1 - RTT-H (Nss = 1, Nrx)
270  *			2 - Debug-H (Nss, Nrx)
271  *			3 - Reserved
272  *			5 - RTT-H + CIR(Nss, Nrx)
273  *
274  * @preamble_type:
275  *
276  *			0 - Legacy
277  *			1 - HT
278  *			2 - VHT
279  *			3 - HE
280  *
281  * @nss:
282  *
283  *			0 - 1-stream
284  *			1 - 2-stream
285  *			..	..
286  *			7 - 8-stream
287  *
288  *@num_chains:
289  *
290  *			0 - 1-chain
291  *			1 - 2-chain
292  *			..  ..
293  *			7 - 8-chain
294  *
295  *@upload_bw_pkt:
296  *
297  *			0 - 20 MHz
298  *			1 - 40 MHz
299  *			2 - 80 MHz
300  *			3 - 160 MHz
301  *
302  * @sw_peer_id_valid: Indicates whether sw_peer_id field is valid or not,
303  * sent from MAC to PHY via the MACRX_FREEZE_CAPTURE_CHANNEL TLV
304  *
305  * @sw_peer_id: Indicates peer id based on AST search, sent from MAC to PHY
306  * via the MACRX_FREEZE_CAPTURE_CHANNEL TLV
307  *
308  * @phy_ppdu_id: sent from PHY to MAC, copied to MACRX_FREEZE_CAPTURE_CHANNEL
309  * TLV
310  *
311  * @total_bytes: Total size of CFR payload (FFT bins)
312  *
313  * @header_version:
314  *
315  *			1 - HKV2/Hastings
316  *			2 - Cypress
317  *			3 - Hasting Prime
318  *			4 - Pine
319  *			8 - Hamilton
320  *			9 - Waikiki
321  *
322  * @target_id:
323  *
324  *			1 - Hastings
325  *			2 - Cypress
326  *			3 - Hastings Prime
327  *			4 - Pine
328  *
329  * @cfr_fmt:
330  *
331  *			0 - raw (32-bit format)
332  *			1 - compressed (24-bit format)
333  *
334  * @mu_rx_data_incl: Indicates whether CFR header contains UL-MU-MIMO info
335  *
336  * @freeze_data_incl: Indicates whether CFR header contains
337  * MACRX_FREEZE_CAPTURE_CHANNEL TLV
338  *
339  * @freeze_tlv_version: Indicates the version of freeze_tlv
340  *			1 - HSP, Cypress
341  *			2 - Maple/Spruce/Moselle
342  *			3 - Pine
343  *
344  * @decimation_factor: FFT bins decimation
345  * @mu_rx_num_users: Number of users in UL-MU-PPDU
346  */
347 struct whal_cfir_enhanced_hdr {
348 	uint16_t tag              :  8,
349 		 length           :  6,
350 		 rsvd1            :  2;
351 
352 	uint16_t upload_done        :  1,
353 		 capture_type       :  3,
354 		 preamble_type      :  2,
355 		 nss                :  3,
356 		 num_chains         :  3,
357 		 upload_pkt_bw      :  3,
358 		 sw_peer_id_valid   :  1;
359 
360 	uint16_t sw_peer_id         : 16;
361 
362 	uint16_t phy_ppdu_id        : 16;
363 
364 	uint16_t total_bytes;
365 
366 	uint16_t header_version     :4,
367 		 target_id          :4,
368 		 cfr_fmt            :1,
369 		 rsvd2              :1,
370 		 mu_rx_data_incl    :1,
371 		 freeze_data_incl   :1,
372 		 freeze_tlv_version :4;
373 
374 	uint16_t mu_rx_num_users   :8,
375 		 decimation_factor :4,
376 		 rsvd3             :4;
377 
378 	uint16_t rsvd4;
379 };
380 
381 /*
382  * freeze_tlv v1/v2 used by Hastings/Cypress/Maple/Spruce/Moselle supports upto
383  * 4 UL MU users
384  *
385  * @freeze:
386  *		0: Allow channel capture
387  *		1: Freeze channel capture
388  *
389  * @capture_reason: Field only valid when the freeze field is 1. Indicates why
390  * the MAC asked to capture the channel
391  *		0: freeze_reason_TM
392  *		1: freeze_reason_FTM
393  *		2: freeze_reason_ACK_resp_to_TM_FTM
394  *		3: freeze_reason_TA_RA_TYPE_FILTER
395  *		4: freeze readon NDP_NDP
396  *		5: freeze_reason_ALL_PACKET
397  *
398  * @packet_type: Packet type of captured packets.
399  *		0: Management
400  *		1: Control
401  *		2: Data
402  *		3: Extension
403  *
404  * @packet_sub_type: packet subtype of the captured packets.
405  * @sw_peer_id_valid: It is valid only when the freeze field is set to 1.
406  *		0: no TA address search on the received frame has been
407  *		   performed. This is due to the frame not having a TA address
408  *		   (like ACK frame), or the received frame being from an other
409  *		   AP to which this device is not associated.
410  *		1: field sw_peer_id will contain valid information.
411  *		   This implies that a (successful) address search has been
412  *		   performed on the TA address of the received frame.
413  *
414  * @sw_peer_id: Valid only when sw_peer_id_valid field is set. It is an
415  * identifier that allows SW to double check that the CSI info stored belongs
416  * to the device with this SW identifier.
417  *
418  * @phy_ppdu_id: ppdu_id of ppdu which has channel capture performed. Field
419  * only valid when the freeze field is set to 1.
420  *
421  * @packet_ta_lower_16: Packet’s lower 16bits transmit address in MAC header.
422  *
423  * @packet_ta_mid_16: Packet’s middle 16bits transmit address in MAC header.
424  *
425  * @packet_ta_upper_16: Packet’s upper 16bits transmit address in MAC header.
426  *
427  * @packet_ra_lower_16: Packet’s lower 16bits receive address in MAC header.
428  *
429  * @packet_ra_mid_16: Packet’s middle 16bits receive address in MAC header.
430  *
431  * @packet_ra_upper_16: Packet’s upper 16bits receive address in MAC header.
432  *
433  * @tsf_timestamp_15_0: MAC side 64bit TSF timestamp when this TLV is sent to
434  * PHY. Bits [15:0].
435  *
436  * @tsf_timestamp_31_16: MAC side 64bit TSF timestamp when this TLV is sent to
437  * PHY. Bits [31:16].
438  *
439  * @tsf_timestamp_47_32: MAC side 64bit TSF timestamp when this TLV is sent to
440  * PHY. Bits [47:32].
441  *
442  * @tsf_timestamp_63_48: MAC side 64bit TSF timestamp when this TLV is sent to
443  * PHY. Bits [63:48].
444  *
445  * @user_index_or_user_mask_5_0: When freeze_tlv_version is 1, this field from
446  * MAC, indicate to PHY which user's channel information need to be uploaded.
447  * When freeze_tlv_version is 2 & MU_SUPPORT_IN_TLV is 1, this field indicates
448  * bitmap of users upto 4 to which channel capture need to be uploaded. And if
449  * freeze_tlv_version is 2 & MU_SUPPORT_IN_TLV is 0, this field indicate to PHY
450  * which user's channel information need to be uploaded
451  *
452  * @directed: Indicate the frame is directed to us or not when NDPA/NDP capture
453  * or FTM/TM/ACK capture. 1=directed. For other modes, it is 0.
454  */
455 struct macrx_freeze_capture_channel {
456 	uint16_t freeze                          :  1, //[0]
457 		 capture_reason                  :  3, //[3:1]
458 		 packet_type                     :  2, //[5:4]
459 		 packet_sub_type                 :  4, //[9:6]
460 		 reserved                        :  5, //[14:10]
461 		 sw_peer_id_valid                :  1; //[15]
462 	uint16_t sw_peer_id                      : 16; //[15:0]
463 	uint16_t phy_ppdu_id                     : 16; //[15:0]
464 	uint16_t packet_ta_lower_16              : 16; //[15:0]
465 	uint16_t packet_ta_mid_16                : 16; //[15:0]
466 	uint16_t packet_ta_upper_16              : 16; //[15:0]
467 	uint16_t packet_ra_lower_16              : 16; //[15:0]
468 	uint16_t packet_ra_mid_16                : 16; //[15:0]
469 	uint16_t packet_ra_upper_16              : 16; //[15:0]
470 	uint16_t tsf_timestamp_15_0              : 16; //[15:0]
471 	uint16_t tsf_timestamp_31_16             : 16; //[15:0]
472 	uint16_t tsf_timestamp_47_32             : 16; //[15:0]
473 	uint16_t tsf_timestamp_63_48             : 16; //[15:0]
474 	uint16_t user_index_or_user_mask_5_0     :  6, //[5:0]
475 		 directed                        :  1, //[6]
476 		 reserved_13                     :  9; //[15:7]
477 };
478 
479 /*
480  * freeze_tlv v3 used by Pine
481  *
482  * @freeze:
483  *		0: Allow channel capture
484  *		1: Freeze channel capture
485  *
486  * @capture_reason: Field only valid when the freeze field is 1. Indicates why
487  * the MAC asked to capture the channel
488  *		0: freeze_reason_TM
489  *		1: freeze_reason_FTM
490  *		2: freeze_reason_ACK_resp_to_TM_FTM
491  *		3: freeze_reason_TA_RA_TYPE_FILTER
492  *		4: freeze readon NDP_NDP
493  *		5: freeze_reason_ALL_PACKET
494  *
495  * @packet_type: Packet type of captured packets.
496  *		0: Management
497  *		1: Control
498  *		2: Data
499  *		3: Extension
500  *
501  * @packet_sub_type: packet subtype of the captured packets.
502  *
503  * @directed: Indicate the frame is directed to us or not when NDPA/NDP capture
504  * or FTM/TM/ACK capture. 1=directed. For other modes, it is 0.
505  *
506  * @sw_peer_id_valid: It is valid only when the freeze field is set to 1.
507  *		0: no TA address search on the received frame has been
508  *		   performed. This is due to the frame not having a TA address
509  *		   (like ACK frame), or the received frame being from an other
510  *		   AP to which this device is not associated.
511  *		1: field sw_peer_id will contain valid information.
512  *		   This implies that a (successful) address search has been
513  *		   performed on the TA address of the received frame.
514  *
515  * @sw_peer_id: Valid only when sw_peer_id_valid field is set. It is an
516  * identifier that allows SW to double check that the CSI info stored belongs
517  * to the device with this SW identifier.
518  *
519  * @phy_ppdu_id: ppdu_id of ppdu which has channel capture performed. Field
520  * only valid when the freeze field is set to 1.
521  *
522  * @packet_ta_lower_16: Packet’s lower 16bits transmit address in MAC header.
523  *
524  * @packet_ta_mid_16: Packet’s middle 16bits transmit address in MAC header.
525  *
526  * @packet_ta_upper_16: Packet’s upper 16bits transmit address in MAC header.
527  *
528  * @packet_ra_lower_16: Packet’s lower 16bits receive address in MAC header.
529  *
530  * @packet_ra_mid_16: Packet’s middle 16bits receive address in MAC header.
531  *
532  * @packet_ra_upper_16: Packet’s upper 16bits receive address in MAC header.
533  *
534  * @tsf_timestamp_15_0: MAC side 64bit TSF timestamp when this TLV is sent to
535  * PHY. Bits [15:0].
536  *
537  * @tsf_timestamp_31_16: MAC side 64bit TSF timestamp when this TLV is sent to
538  * PHY. Bits [31:16].
539  *
540  * @tsf_timestamp_47_32: MAC side 64bit TSF timestamp when this TLV is sent to
541  * PHY. Bits [47:32].
542  *
543  * @tsf_63_48_or_user_mask_36_32: Indicates to PHY which user's channel info
544  * need to be uploaded. Only valid in UL MU case with MU_SUPPORT_IN_TLV = 1.
545  * Otherwise this indicates to PHY MSBs 63:48 of the MAC side 64bit TSF
546  * timestamp when this TLV is sent to PHY.
547  *
548  * @user_index_or_user_mask_15_0: Indicate to PHY which user's channel info
549  * need to be uploaded in UL MU case with MU_SUPPORT_IN_TLV = 1. Otherwise it
550  * indicate PHY which user’s channel information need to be uploaded.
551  *
552  * @user_mask_31_16: Indicate to PHY which user’s channel information need to
553  * be uploaded. Only valid in UL MU case with MU_SUPPORT_IN_TLV = 1.
554  */
555 struct macrx_freeze_capture_channel_v3 {
556 	uint16_t freeze                          :  1, //[0]
557 		 capture_reason                  :  3, //[3:1]
558 		 packet_type                     :  2, //[5:4]
559 		 packet_sub_type                 :  4, //[9:6]
560 		 directed                        :  1, //[10]
561 		 reserved                        :  4, //[14:11]
562 		 sw_peer_id_valid                :  1; //[15]
563 	uint16_t sw_peer_id                      : 16; //[15:0]
564 	uint16_t phy_ppdu_id                     : 16; //[15:0]
565 	uint16_t packet_ta_lower_16              : 16; //[15:0]
566 	uint16_t packet_ta_mid_16                : 16; //[15:0]
567 	uint16_t packet_ta_upper_16              : 16; //[15:0]
568 	uint16_t packet_ra_lower_16              : 16; //[15:0]
569 	uint16_t packet_ra_mid_16                : 16; //[15:0]
570 	uint16_t packet_ra_upper_16              : 16; //[15:0]
571 	uint16_t tsf_timestamp_15_0              : 16; //[15:0]
572 	uint16_t tsf_timestamp_31_16             : 16; //[15:0]
573 	uint16_t tsf_timestamp_47_32             : 16; //[15:0]
574 	uint16_t tsf_63_48_or_user_mask_36_32    : 16; //[15:0]
575 	uint16_t user_index_or_user_mask_15_0    : 16; //[15:0]
576 	uint16_t user_mask_31_16                 : 16; //[15:0]
577 };
578 
579 struct uplink_user_setup_info {
580 	uint32_t bw_info_valid                   :  1, //[0]
581 		 uplink_receive_type             :  2, //[2:1]
582 		 reserved_0a                     :  1, //[3]
583 		 uplink_11ax_mcs                 :  4, //[7:4]
584 		 ru_width                        :  7, //[14:8]
585 		 reserved_0b                     :  1, //[15]
586 		 nss                             :  3, //[18:16]
587 		 stream_offset                   :  3, //[21:19]
588 		 sta_dcm                         :  1, //[22]
589 		 sta_coding                      :  1, //[23]
590 		 ru_start_index                  :  7, //[30:24]
591 		 reserved_0c                     :  1; //[31]
592 };
593 
594 struct macrx_freeze_capture_channel_v5 {
595 	uint16_t freeze                          :  1, //[0]
596 		 capture_reason                  :  3, //[3:1]
597 		 packet_type                     :  2, //[5:4]
598 		 packet_sub_type                 :  4, //[9:6]
599 		 reserved                        :  5, //[14:10]
600 		 sw_peer_id_valid                :  1; //[15]
601 	uint16_t sw_peer_id                      : 16; //[15:0]
602 	uint16_t phy_ppdu_id                     : 16; //[15:0]
603 	uint16_t packet_ta_lower_16              : 16; //[15:0]
604 	uint16_t packet_ta_mid_16                : 16; //[15:0]
605 	uint16_t packet_ta_upper_16              : 16; //[15:0]
606 	uint16_t packet_ra_lower_16              : 16; //[15:0]
607 	uint16_t packet_ra_mid_16                : 16; //[15:0]
608 	uint16_t packet_ra_upper_16              : 16; //[15:0]
609 	uint16_t tsf_timestamp_15_0              : 16; //[15:0]
610 	uint16_t tsf_timestamp_31_16             : 16; //[15:0]
611 	uint16_t tsf_timestamp_47_32             : 16; //[15:0]
612 	uint16_t tsf_timestamp_63_48             : 16; //[15:0]
613 	uint16_t user_index_or_user_mask_5_0     :  6, //[5:0]
614 		 directed                        :  1, //[6]
615 		 reserved_13                     :  9; //[15:7]
616 	uint16_t user_mask_21_6                  : 16; //[15:0]
617 	uint16_t user_mask_36_22                 : 15, //[14:0]
618 		 reserved_15a                    :  1; //[15]
619 };
620 
621 struct uplink_user_setup_info_v2 {
622 	uint32_t bw_info_valid                   :  1, //[0]
623 		 uplink_receive_type             :  2, //[2:1]
624 		 reserved_0a                     :  1, //[3]
625 		 uplink_11ax_mcs                 :  4, //[7:4]
626 		 nss                             :  3, //[10:8]
627 		 stream_offset                   :  3, //[13:11]
628 		 sta_dcm                         :  1, //[14]
629 		 sta_coding                      :  1, //[15]
630 		 ru_type_80_0                    :  4, //[19:16]
631 		 ru_type_80_1                    :  4, //[23:20]
632 		 ru_type_80_2                    :  4, //[27:24]
633 		 ru_type_80_3                    :  4; //[31:28]
634 	uint32_t ru_start_index_80_0             :  6, //[5:0]
635 		 reserved_1a                     :  2, //[7:6]
636 		 ru_start_index_80_1             :  6, //[13:8]
637 		 reserved_1b                     :  2, //[15:14]
638 		 ru_start_index_80_2             :  6, //[21:16]
639 		 reserved_1c                     :  2, //[23:22]
640 		 ru_start_index_80_3             :  6, //[29:24]
641 		 reserved_1d                     :  2; //[31-30]
642 };
643 
644 /**
645  * cfr_enh_init_pdev() - Inits cfr pdev and registers necessary handlers.
646  * @psoc: pointer to psoc object
647  * @pdev: pointer to pdev object
648  *
649  * Return: Registration status for necessary handlers
650  */
651 QDF_STATUS cfr_enh_init_pdev(
652 		struct wlan_objmgr_psoc *psoc,
653 		struct wlan_objmgr_pdev *pdev);
654 
655 /**
656  * cfr_enh_deinit_pdev() - De-inits corresponding pdev and handlers.
657  * @psoc: pointer to psoc object
658  * @pdev: pointer to pdev object
659  *
660  * Return: De-registration status for necessary handlers
661  */
662 QDF_STATUS cfr_enh_deinit_pdev(
663 		struct wlan_objmgr_psoc *psoc,
664 		struct wlan_objmgr_pdev *pdev);
665 
666 /**
667  * target_if_cfr_start_lut_age_timer() - Start timer to flush aged-out LUT
668  * entries
669  * @pdev: pointer to pdev object
670  *
671  * Return: None
672  */
673 void target_if_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev);
674 
675 /**
676  * target_if_cfr_stop_lut_age_timer() - Stop timer to flush aged-out LUT
677  * entries
678  * @pdev: pointer to pdev object
679  *
680  * Return: None
681  */
682 void target_if_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev);
683 
684 /**
685  * target_if_cfr_dump_lut_enh() - Dump all valid LUT entries
686  * @pdev: objmgr PDEV
687  *
688  * Return: none
689  */
690 void target_if_cfr_dump_lut_enh(struct wlan_objmgr_pdev *pdev);
691 
692 /**
693  * target_if_cfr_config_rcc() - Start repetitive channel capture
694  * @pdev: pointer to pdev object
695  * @rcc_param: rcc configurations
696  *
697  * Return: Success/Failure status
698  */
699 QDF_STATUS target_if_cfr_config_rcc(struct wlan_objmgr_pdev *pdev,
700 				    struct cfr_rcc_param *rcc_param);
701 
702 /**
703  *  target_if_cfr_default_ta_ra_config() - Configure default values to all
704  *  params(BW/NSS/TA/RA) in TA_RA mode
705  * @rcc_param: rcc configurations
706  * @allvalid: Indicates whether all TA_RA params are valid or not.
707  *            It could be either 0 or 1.
708  *            1: should be sent to FW during CFR initialization
709  *            0: should be set, after a successful commit session.
710  * @reset_cfg: This bitmap is being used to determine which groups'
711  *            parameters are needed to be reset to its default state.
712  */
713 void target_if_cfr_default_ta_ra_config(struct cfr_rcc_param *rcc_param,
714 					bool allvalid, uint16_t reset_cfg);
715 
716 /**
717  * target_if_cfr_rx_tlv_process() - Process PPDU status TLVs and store info in
718  * lookup table
719  * @pdev: PDEV object
720  * @nbuf: ppdu info
721  *
722  * Return: none
723  */
724 void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf);
725 
726 /**
727  * target_if_cfr_update_global_cfg() - Update global config after a successful
728  * commit
729  * @pdev: pointer to pdev object
730  *
731  * Return: None
732  */
733 void target_if_cfr_update_global_cfg(struct wlan_objmgr_pdev *pdev);
734 #else
cfr_enh_init_pdev(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)735 static inline QDF_STATUS cfr_enh_init_pdev(
736 		struct wlan_objmgr_psoc *psoc,
737 		struct wlan_objmgr_pdev *pdev)
738 {
739 	return QDF_STATUS_SUCCESS;
740 }
741 
cfr_enh_deinit_pdev(struct wlan_objmgr_psoc * psoc,struct wlan_objmgr_pdev * pdev)742 static inline QDF_STATUS cfr_enh_deinit_pdev(
743 		struct wlan_objmgr_psoc *psoc,
744 		struct wlan_objmgr_pdev *pdev)
745 {
746 	return QDF_STATUS_SUCCESS;
747 }
748 #endif
749 #endif
750