xref: /wlan-driver/qca-wifi-host-cmn/hal/wifi3.0/be/hal_be_generic_api.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-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 _HAL_BE_GENERIC_API_H_
21*5113495bSYour Name #define _HAL_BE_GENERIC_API_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include <hal_be_hw_headers.h>
24*5113495bSYour Name #include "hal_be_tx.h"
25*5113495bSYour Name #include "hal_be_reo.h"
26*5113495bSYour Name #include <hal_api_mon.h>
27*5113495bSYour Name #include <hal_generic_api.h>
28*5113495bSYour Name #include "txmon_tlvs.h"
29*5113495bSYour Name 
30*5113495bSYour Name /*
31*5113495bSYour Name  * Debug macro to print the TLV header tag
32*5113495bSYour Name  */
33*5113495bSYour Name #define SHOW_DEFINED(x) do {} while (0)
34*5113495bSYour Name 
35*5113495bSYour Name #if defined(WLAN_PKT_CAPTURE_TX_2_0) && !defined(TX_MONITOR_WORD_MASK)
36*5113495bSYour Name typedef struct tx_fes_setup hal_tx_fes_setup_t;
37*5113495bSYour Name typedef struct tx_peer_entry hal_tx_peer_entry_t;
38*5113495bSYour Name typedef struct tx_queue_extension hal_tx_queue_ext_t;
39*5113495bSYour Name typedef struct tx_msdu_start hal_tx_msdu_start_t;
40*5113495bSYour Name typedef struct tx_mpdu_start hal_tx_mpdu_start_t;
41*5113495bSYour Name typedef struct tx_fes_status_end hal_tx_fes_status_end_t;
42*5113495bSYour Name typedef struct response_end_status hal_response_end_status_t;
43*5113495bSYour Name typedef struct tx_fes_status_prot hal_tx_fes_status_prot_t;
44*5113495bSYour Name typedef struct pcu_ppdu_setup_init hal_pcu_ppdu_setup_t;
45*5113495bSYour Name #endif
46*5113495bSYour Name 
47*5113495bSYour Name #if defined(WLAN_FEATURE_TSF_AUTO_REPORT) || defined(WLAN_CONFIG_TX_DELAY)
48*5113495bSYour Name static inline void
hal_tx_comp_get_buffer_timestamp_be(void * desc,struct hal_tx_completion_status * ts)49*5113495bSYour Name hal_tx_comp_get_buffer_timestamp_be(void *desc,
50*5113495bSYour Name 				    struct hal_tx_completion_status *ts)
51*5113495bSYour Name {
52*5113495bSYour Name 	ts->buffer_timestamp = HAL_TX_DESC_GET(desc, WBM2SW_COMPLETION_RING_TX,
53*5113495bSYour Name 					       BUFFER_TIMESTAMP);
54*5113495bSYour Name }
55*5113495bSYour Name #else /* !(WLAN_FEATURE_TSF_AUTO_REPORT || WLAN_CONFIG_TX_DELAY) */
56*5113495bSYour Name static inline void
hal_tx_comp_get_buffer_timestamp_be(void * desc,struct hal_tx_completion_status * ts)57*5113495bSYour Name hal_tx_comp_get_buffer_timestamp_be(void *desc,
58*5113495bSYour Name 				    struct hal_tx_completion_status *ts)
59*5113495bSYour Name {
60*5113495bSYour Name }
61*5113495bSYour Name #endif /* WLAN_FEATURE_TSF_AUTO_REPORT || WLAN_CONFIG_TX_DELAY */
62*5113495bSYour Name 
63*5113495bSYour Name /**
64*5113495bSYour Name  * hal_tx_comp_get_status_generic_be() - TQM Release reason
65*5113495bSYour Name  * @desc: WBM descriptor
66*5113495bSYour Name  * @ts1: completion ring Tx status
67*5113495bSYour Name  * @hal: hal_soc
68*5113495bSYour Name  *
69*5113495bSYour Name  * This function will parse the WBM completion descriptor and populate in
70*5113495bSYour Name  * HAL structure
71*5113495bSYour Name  *
72*5113495bSYour Name  * Return: none
73*5113495bSYour Name  */
74*5113495bSYour Name static inline void
hal_tx_comp_get_status_generic_be(void * desc,void * ts1,struct hal_soc * hal)75*5113495bSYour Name hal_tx_comp_get_status_generic_be(void *desc, void *ts1,
76*5113495bSYour Name 				  struct hal_soc *hal)
77*5113495bSYour Name {
78*5113495bSYour Name 	uint8_t rate_stats_valid = 0;
79*5113495bSYour Name 	uint32_t rate_stats = 0;
80*5113495bSYour Name 	struct hal_tx_completion_status *ts =
81*5113495bSYour Name 		(struct hal_tx_completion_status *)ts1;
82*5113495bSYour Name 
83*5113495bSYour Name 	ts->ppdu_id = HAL_TX_DESC_GET(desc, WBM2SW_COMPLETION_RING_TX,
84*5113495bSYour Name 				      TQM_STATUS_NUMBER);
85*5113495bSYour Name 	ts->ack_frame_rssi = HAL_TX_DESC_GET(desc, WBM2SW_COMPLETION_RING_TX,
86*5113495bSYour Name 					     ACK_FRAME_RSSI);
87*5113495bSYour Name 	ts->first_msdu = HAL_TX_DESC_GET(desc, WBM2SW_COMPLETION_RING_TX,
88*5113495bSYour Name 					 FIRST_MSDU);
89*5113495bSYour Name 	ts->last_msdu = HAL_TX_DESC_GET(desc, WBM2SW_COMPLETION_RING_TX,
90*5113495bSYour Name 					LAST_MSDU);
91*5113495bSYour Name #if 0
92*5113495bSYour Name 	// TODO -  This has to be calculated form first and last msdu
93*5113495bSYour Name 	ts->msdu_part_of_amsdu = HAL_TX_DESC_GET(desc,
94*5113495bSYour Name 						 WBM2SW_COMPLETION_RING_TX,
95*5113495bSYour Name 						 MSDU_PART_OF_AMSDU);
96*5113495bSYour Name #endif
97*5113495bSYour Name 
98*5113495bSYour Name 	ts->peer_id = HAL_TX_DESC_GET(desc, WBM2SW_COMPLETION_RING_TX,
99*5113495bSYour Name 				      SW_PEER_ID);
100*5113495bSYour Name 	ts->tid = HAL_TX_DESC_GET(desc, WBM2SW_COMPLETION_RING_TX, TID);
101*5113495bSYour Name 	ts->transmit_cnt = HAL_TX_DESC_GET(desc, WBM2SW_COMPLETION_RING_TX,
102*5113495bSYour Name 					   TRANSMIT_COUNT);
103*5113495bSYour Name 
104*5113495bSYour Name 	rate_stats = HAL_TX_DESC_GET(desc, HAL_TX_COMP, TX_RATE_STATS);
105*5113495bSYour Name 
106*5113495bSYour Name 	rate_stats_valid = HAL_TX_MS(TX_RATE_STATS_INFO,
107*5113495bSYour Name 			TX_RATE_STATS_INFO_VALID, rate_stats);
108*5113495bSYour Name 
109*5113495bSYour Name 	ts->valid = rate_stats_valid;
110*5113495bSYour Name 
111*5113495bSYour Name 	if (rate_stats_valid) {
112*5113495bSYour Name 		ts->bw = HAL_TX_MS(TX_RATE_STATS_INFO, TRANSMIT_BW,
113*5113495bSYour Name 				rate_stats);
114*5113495bSYour Name 		ts->pkt_type = HAL_TX_MS(TX_RATE_STATS_INFO,
115*5113495bSYour Name 				TRANSMIT_PKT_TYPE, rate_stats);
116*5113495bSYour Name 		ts->stbc = HAL_TX_MS(TX_RATE_STATS_INFO,
117*5113495bSYour Name 				TRANSMIT_STBC, rate_stats);
118*5113495bSYour Name 		ts->ldpc = HAL_TX_MS(TX_RATE_STATS_INFO, TRANSMIT_LDPC,
119*5113495bSYour Name 				rate_stats);
120*5113495bSYour Name 		ts->sgi = HAL_TX_MS(TX_RATE_STATS_INFO, TRANSMIT_SGI,
121*5113495bSYour Name 				rate_stats);
122*5113495bSYour Name 		ts->mcs = HAL_TX_MS(TX_RATE_STATS_INFO, TRANSMIT_MCS,
123*5113495bSYour Name 				rate_stats);
124*5113495bSYour Name 		ts->ofdma = HAL_TX_MS(TX_RATE_STATS_INFO, OFDMA_TRANSMISSION,
125*5113495bSYour Name 				rate_stats);
126*5113495bSYour Name 		ts->tones_in_ru = HAL_TX_MS(TX_RATE_STATS_INFO, TONES_IN_RU,
127*5113495bSYour Name 				rate_stats);
128*5113495bSYour Name 	}
129*5113495bSYour Name 
130*5113495bSYour Name 	ts->release_src = hal_tx_comp_get_buffer_source_generic_be(desc);
131*5113495bSYour Name 	ts->status = hal_tx_comp_get_release_reason(
132*5113495bSYour Name 					desc,
133*5113495bSYour Name 					hal_soc_to_hal_soc_handle(hal));
134*5113495bSYour Name 
135*5113495bSYour Name 	ts->tsf = HAL_TX_DESC_GET(desc, UNIFIED_WBM_RELEASE_RING_6,
136*5113495bSYour Name 			TX_RATE_STATS_INFO_TX_RATE_STATS);
137*5113495bSYour Name 	hal_tx_comp_get_buffer_timestamp_be(desc, ts);
138*5113495bSYour Name }
139*5113495bSYour Name 
140*5113495bSYour Name /**
141*5113495bSYour Name  * hal_tx_set_pcp_tid_map_generic_be() - Configure default PCP to TID map table
142*5113495bSYour Name  * @soc: HAL SoC context
143*5113495bSYour Name  * @map: PCP-TID mapping table
144*5113495bSYour Name  *
145*5113495bSYour Name  * PCP are mapped to 8 TID values using TID values programmed
146*5113495bSYour Name  * in one set of mapping registers PCP_TID_MAP_<0 to 6>
147*5113495bSYour Name  * The mapping register has TID mapping for 8 PCP values
148*5113495bSYour Name  *
149*5113495bSYour Name  * Return: none
150*5113495bSYour Name  */
hal_tx_set_pcp_tid_map_generic_be(struct hal_soc * soc,uint8_t * map)151*5113495bSYour Name static void hal_tx_set_pcp_tid_map_generic_be(struct hal_soc *soc, uint8_t *map)
152*5113495bSYour Name {
153*5113495bSYour Name 	uint32_t addr, value;
154*5113495bSYour Name 
155*5113495bSYour Name 	addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR(
156*5113495bSYour Name 				MAC_TCL_REG_REG_BASE);
157*5113495bSYour Name 
158*5113495bSYour Name 	value = (map[0] |
159*5113495bSYour Name 		(map[1] << HWIO_TCL_R0_PCP_TID_MAP_PCP_1_SHFT) |
160*5113495bSYour Name 		(map[2] << HWIO_TCL_R0_PCP_TID_MAP_PCP_2_SHFT) |
161*5113495bSYour Name 		(map[3] << HWIO_TCL_R0_PCP_TID_MAP_PCP_3_SHFT) |
162*5113495bSYour Name 		(map[4] << HWIO_TCL_R0_PCP_TID_MAP_PCP_4_SHFT) |
163*5113495bSYour Name 		(map[5] << HWIO_TCL_R0_PCP_TID_MAP_PCP_5_SHFT) |
164*5113495bSYour Name 		(map[6] << HWIO_TCL_R0_PCP_TID_MAP_PCP_6_SHFT) |
165*5113495bSYour Name 		(map[7] << HWIO_TCL_R0_PCP_TID_MAP_PCP_7_SHFT));
166*5113495bSYour Name 
167*5113495bSYour Name 	HAL_REG_WRITE(soc, addr, (value & HWIO_TCL_R0_PCP_TID_MAP_RMSK));
168*5113495bSYour Name }
169*5113495bSYour Name 
170*5113495bSYour Name /**
171*5113495bSYour Name  * hal_tx_update_pcp_tid_generic_be() - Update the pcp tid map table with
172*5113495bSYour Name  *					value received from user-space
173*5113495bSYour Name  * @soc: HAL SoC context
174*5113495bSYour Name  * @pcp: pcp value
175*5113495bSYour Name  * @tid : tid value
176*5113495bSYour Name  *
177*5113495bSYour Name  * Return: void
178*5113495bSYour Name  */
179*5113495bSYour Name static void
hal_tx_update_pcp_tid_generic_be(struct hal_soc * soc,uint8_t pcp,uint8_t tid)180*5113495bSYour Name hal_tx_update_pcp_tid_generic_be(struct hal_soc *soc,
181*5113495bSYour Name 				 uint8_t pcp, uint8_t tid)
182*5113495bSYour Name {
183*5113495bSYour Name 	uint32_t addr, value, regval;
184*5113495bSYour Name 
185*5113495bSYour Name 	addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR(
186*5113495bSYour Name 				MAC_TCL_REG_REG_BASE);
187*5113495bSYour Name 
188*5113495bSYour Name 	value = (uint32_t)tid << (HAL_TX_BITS_PER_TID * pcp);
189*5113495bSYour Name 
190*5113495bSYour Name 	/* Read back previous PCP TID config and update
191*5113495bSYour Name 	 * with new config.
192*5113495bSYour Name 	 */
193*5113495bSYour Name 	regval = HAL_REG_READ(soc, addr);
194*5113495bSYour Name 	regval &= ~(HAL_TX_TID_BITS_MASK << (HAL_TX_BITS_PER_TID * pcp));
195*5113495bSYour Name 	regval |= value;
196*5113495bSYour Name 
197*5113495bSYour Name 	HAL_REG_WRITE(soc, addr,
198*5113495bSYour Name 		      (regval & HWIO_TCL_R0_PCP_TID_MAP_RMSK));
199*5113495bSYour Name }
200*5113495bSYour Name 
201*5113495bSYour Name /**
202*5113495bSYour Name  * hal_tx_update_tidmap_prty_generic_be() - Update the tid map priority
203*5113495bSYour Name  * @soc: HAL SoC context
204*5113495bSYour Name  * @value: priority value
205*5113495bSYour Name  *
206*5113495bSYour Name  * Return: void
207*5113495bSYour Name  */
208*5113495bSYour Name static
hal_tx_update_tidmap_prty_generic_be(struct hal_soc * soc,uint8_t value)209*5113495bSYour Name void hal_tx_update_tidmap_prty_generic_be(struct hal_soc *soc, uint8_t value)
210*5113495bSYour Name {
211*5113495bSYour Name 	uint32_t addr;
212*5113495bSYour Name 
213*5113495bSYour Name 	addr = HWIO_TCL_R0_TID_MAP_PRTY_ADDR(
214*5113495bSYour Name 				MAC_TCL_REG_REG_BASE);
215*5113495bSYour Name 
216*5113495bSYour Name 	HAL_REG_WRITE(soc, addr,
217*5113495bSYour Name 		      (value & HWIO_TCL_R0_TID_MAP_PRTY_RMSK));
218*5113495bSYour Name }
219*5113495bSYour Name 
220*5113495bSYour Name /**
221*5113495bSYour Name  * hal_rx_get_tlv_size_generic_be() - Get rx packet tlv size
222*5113495bSYour Name  * @rx_pkt_tlv_size: TLV size for regular RX packets
223*5113495bSYour Name  * @rx_mon_pkt_tlv_size: TLV size for monitor mode packets
224*5113495bSYour Name  *
225*5113495bSYour Name  * Return: size of rx pkt tlv before the actual data
226*5113495bSYour Name  */
hal_rx_get_tlv_size_generic_be(uint16_t * rx_pkt_tlv_size,uint16_t * rx_mon_pkt_tlv_size)227*5113495bSYour Name static void hal_rx_get_tlv_size_generic_be(uint16_t *rx_pkt_tlv_size,
228*5113495bSYour Name 					   uint16_t *rx_mon_pkt_tlv_size)
229*5113495bSYour Name {
230*5113495bSYour Name 	*rx_pkt_tlv_size = RX_PKT_TLVS_LEN;
231*5113495bSYour Name 	/* For now mon pkt tlv is same as rx pkt tlv */
232*5113495bSYour Name 	*rx_mon_pkt_tlv_size = MON_RX_PKT_TLVS_LEN;
233*5113495bSYour Name }
234*5113495bSYour Name 
235*5113495bSYour Name /**
236*5113495bSYour Name  * hal_rx_flow_get_tuple_info_be() - Setup a flow search entry in HW FST
237*5113495bSYour Name  * @rx_fst: Pointer to the Rx Flow Search Table
238*5113495bSYour Name  * @hal_hash: HAL 5 tuple hash
239*5113495bSYour Name  * @flow_tuple_info: 5-tuple info of the flow returned to the caller
240*5113495bSYour Name  *
241*5113495bSYour Name  * Return: Success/Failure
242*5113495bSYour Name  */
243*5113495bSYour Name static void *
hal_rx_flow_get_tuple_info_be(uint8_t * rx_fst,uint32_t hal_hash,uint8_t * flow_tuple_info)244*5113495bSYour Name hal_rx_flow_get_tuple_info_be(uint8_t *rx_fst, uint32_t hal_hash,
245*5113495bSYour Name 			      uint8_t *flow_tuple_info)
246*5113495bSYour Name {
247*5113495bSYour Name 	struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst;
248*5113495bSYour Name 	void *hal_fse = NULL;
249*5113495bSYour Name 	struct hal_flow_tuple_info *tuple_info
250*5113495bSYour Name 		= (struct hal_flow_tuple_info *)flow_tuple_info;
251*5113495bSYour Name 
252*5113495bSYour Name 	hal_fse = (uint8_t *)fst->base_vaddr +
253*5113495bSYour Name 		(hal_hash * HAL_RX_FST_ENTRY_SIZE);
254*5113495bSYour Name 
255*5113495bSYour Name 	if (!hal_fse || !tuple_info)
256*5113495bSYour Name 		return NULL;
257*5113495bSYour Name 
258*5113495bSYour Name 	if (!HAL_GET_FLD(hal_fse, RX_FLOW_SEARCH_ENTRY, VALID))
259*5113495bSYour Name 		return NULL;
260*5113495bSYour Name 
261*5113495bSYour Name 	tuple_info->src_ip_127_96 =
262*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
263*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY,
264*5113495bSYour Name 						      SRC_IP_127_96));
265*5113495bSYour Name 	tuple_info->src_ip_95_64 =
266*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
267*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY,
268*5113495bSYour Name 						      SRC_IP_95_64));
269*5113495bSYour Name 	tuple_info->src_ip_63_32 =
270*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
271*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY,
272*5113495bSYour Name 						      SRC_IP_63_32));
273*5113495bSYour Name 	tuple_info->src_ip_31_0 =
274*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
275*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY,
276*5113495bSYour Name 						      SRC_IP_31_0));
277*5113495bSYour Name 	tuple_info->dest_ip_127_96 =
278*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
279*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY,
280*5113495bSYour Name 						      DEST_IP_127_96));
281*5113495bSYour Name 	tuple_info->dest_ip_95_64 =
282*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
283*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY,
284*5113495bSYour Name 						      DEST_IP_95_64));
285*5113495bSYour Name 	tuple_info->dest_ip_63_32 =
286*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
287*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY,
288*5113495bSYour Name 						      DEST_IP_63_32));
289*5113495bSYour Name 	tuple_info->dest_ip_31_0 =
290*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
291*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY,
292*5113495bSYour Name 						      DEST_IP_31_0));
293*5113495bSYour Name 	tuple_info->dest_port = HAL_GET_FLD(hal_fse,
294*5113495bSYour Name 					    RX_FLOW_SEARCH_ENTRY,
295*5113495bSYour Name 					    DEST_PORT);
296*5113495bSYour Name 	tuple_info->src_port = HAL_GET_FLD(hal_fse,
297*5113495bSYour Name 					   RX_FLOW_SEARCH_ENTRY,
298*5113495bSYour Name 					   SRC_PORT);
299*5113495bSYour Name 	tuple_info->l4_protocol = HAL_GET_FLD(hal_fse,
300*5113495bSYour Name 					      RX_FLOW_SEARCH_ENTRY,
301*5113495bSYour Name 					      L4_PROTOCOL);
302*5113495bSYour Name 
303*5113495bSYour Name 	return hal_fse;
304*5113495bSYour Name }
305*5113495bSYour Name 
306*5113495bSYour Name /**
307*5113495bSYour Name  * hal_rx_flow_delete_entry_be() - Setup a flow search entry in HW FST
308*5113495bSYour Name  * @rx_fst: Pointer to the Rx Flow Search Table
309*5113495bSYour Name  * @hal_rx_fse: Pointer to the Rx Flow that is to be deleted from the FST
310*5113495bSYour Name  *
311*5113495bSYour Name  * Return: Success/Failure
312*5113495bSYour Name  */
313*5113495bSYour Name static QDF_STATUS
hal_rx_flow_delete_entry_be(uint8_t * rx_fst,void * hal_rx_fse)314*5113495bSYour Name hal_rx_flow_delete_entry_be(uint8_t *rx_fst, void *hal_rx_fse)
315*5113495bSYour Name {
316*5113495bSYour Name 	uint8_t *fse = (uint8_t *)hal_rx_fse;
317*5113495bSYour Name 
318*5113495bSYour Name 	if (!HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID))
319*5113495bSYour Name 		return QDF_STATUS_E_NOENT;
320*5113495bSYour Name 
321*5113495bSYour Name 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY, VALID);
322*5113495bSYour Name 
323*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
324*5113495bSYour Name }
325*5113495bSYour Name 
326*5113495bSYour Name /**
327*5113495bSYour Name  * hal_rx_fst_get_fse_size_be() - Retrieve the size of each entry in Rx FST
328*5113495bSYour Name  *
329*5113495bSYour Name  * Return: size of each entry/flow in Rx FST
330*5113495bSYour Name  */
331*5113495bSYour Name static inline uint32_t
hal_rx_fst_get_fse_size_be(void)332*5113495bSYour Name hal_rx_fst_get_fse_size_be(void)
333*5113495bSYour Name {
334*5113495bSYour Name 	return HAL_RX_FST_ENTRY_SIZE;
335*5113495bSYour Name }
336*5113495bSYour Name 
337*5113495bSYour Name /*
338*5113495bSYour Name  * TX MONITOR
339*5113495bSYour Name  */
340*5113495bSYour Name 
341*5113495bSYour Name #ifdef WLAN_PKT_CAPTURE_TX_2_0
342*5113495bSYour Name /**
343*5113495bSYour Name  * hal_txmon_is_mon_buf_addr_tlv_generic_be() - api to find mon buffer tlv
344*5113495bSYour Name  * @tx_tlv_hdr: pointer to TLV header
345*5113495bSYour Name  *
346*5113495bSYour Name  * Return: bool based on tlv tag matches monitor buffer address tlv
347*5113495bSYour Name  */
348*5113495bSYour Name static inline bool
hal_txmon_is_mon_buf_addr_tlv_generic_be(void * tx_tlv_hdr)349*5113495bSYour Name hal_txmon_is_mon_buf_addr_tlv_generic_be(void *tx_tlv_hdr)
350*5113495bSYour Name {
351*5113495bSYour Name 	uint32_t tlv_tag;
352*5113495bSYour Name 
353*5113495bSYour Name 	tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(tx_tlv_hdr);
354*5113495bSYour Name 
355*5113495bSYour Name 	if (WIFIMON_BUFFER_ADDR_E == tlv_tag)
356*5113495bSYour Name 		return true;
357*5113495bSYour Name 
358*5113495bSYour Name 	return false;
359*5113495bSYour Name }
360*5113495bSYour Name 
361*5113495bSYour Name /**
362*5113495bSYour Name  * hal_txmon_populate_packet_info_generic_be() - api to populate packet info
363*5113495bSYour Name  * @tx_tlv: pointer to TLV header
364*5113495bSYour Name  * @packet_info: place holder for packet info
365*5113495bSYour Name  *
366*5113495bSYour Name  * Return: Address to void
367*5113495bSYour Name  */
368*5113495bSYour Name static inline void
hal_txmon_populate_packet_info_generic_be(void * tx_tlv,void * packet_info)369*5113495bSYour Name hal_txmon_populate_packet_info_generic_be(void *tx_tlv, void *packet_info)
370*5113495bSYour Name {
371*5113495bSYour Name 	struct hal_mon_packet_info *pkt_info;
372*5113495bSYour Name 	struct mon_buffer_addr *addr = (struct mon_buffer_addr *)tx_tlv;
373*5113495bSYour Name 
374*5113495bSYour Name 	pkt_info = (struct hal_mon_packet_info *)packet_info;
375*5113495bSYour Name 	pkt_info->sw_cookie = (((uint64_t)addr->buffer_virt_addr_63_32 << 32) |
376*5113495bSYour Name 			       (addr->buffer_virt_addr_31_0));
377*5113495bSYour Name 	pkt_info->dma_length = addr->dma_length + 1;
378*5113495bSYour Name 	pkt_info->msdu_continuation = addr->msdu_continuation;
379*5113495bSYour Name 	pkt_info->truncated = addr->truncated;
380*5113495bSYour Name }
381*5113495bSYour Name 
382*5113495bSYour Name /**
383*5113495bSYour Name  * hal_txmon_parse_tx_fes_setup() - parse tx_fes_setup tlv
384*5113495bSYour Name  *
385*5113495bSYour Name  * @tx_tlv: pointer to tx_fes_setup tlv header
386*5113495bSYour Name  * @tx_ppdu_info: pointer to hal_tx_ppdu_info
387*5113495bSYour Name  *
388*5113495bSYour Name  * Return: void
389*5113495bSYour Name  */
390*5113495bSYour Name static inline void
hal_txmon_parse_tx_fes_setup(void * tx_tlv,struct hal_tx_ppdu_info * tx_ppdu_info)391*5113495bSYour Name hal_txmon_parse_tx_fes_setup(void *tx_tlv,
392*5113495bSYour Name 			     struct hal_tx_ppdu_info *tx_ppdu_info)
393*5113495bSYour Name {
394*5113495bSYour Name 	hal_tx_fes_setup_t *tx_fes_setup = (hal_tx_fes_setup_t *)tx_tlv;
395*5113495bSYour Name 
396*5113495bSYour Name 	tx_ppdu_info->num_users = tx_fes_setup->number_of_users;
397*5113495bSYour Name 	if (tx_ppdu_info->num_users == 0)
398*5113495bSYour Name 		tx_ppdu_info->num_users = 1;
399*5113495bSYour Name 
400*5113495bSYour Name 	TXMON_HAL(tx_ppdu_info, ppdu_id) = tx_fes_setup->schedule_id;
401*5113495bSYour Name 	TXMON_HAL_STATUS(tx_ppdu_info, ppdu_id) = tx_fes_setup->schedule_id;
402*5113495bSYour Name }
403*5113495bSYour Name 
404*5113495bSYour Name /**
405*5113495bSYour Name  * hal_txmon_get_num_users() - get num users from tx_fes_setup tlv
406*5113495bSYour Name  *
407*5113495bSYour Name  * @tx_tlv: pointer to tx_fes_setup tlv header
408*5113495bSYour Name  *
409*5113495bSYour Name  * Return: number of users
410*5113495bSYour Name  */
411*5113495bSYour Name static inline uint8_t
hal_txmon_get_num_users(void * tx_tlv)412*5113495bSYour Name hal_txmon_get_num_users(void *tx_tlv)
413*5113495bSYour Name {
414*5113495bSYour Name 	hal_tx_fes_setup_t *tx_fes_setup = (hal_tx_fes_setup_t *)tx_tlv;
415*5113495bSYour Name 
416*5113495bSYour Name 	return tx_fes_setup->number_of_users;
417*5113495bSYour Name }
418*5113495bSYour Name 
419*5113495bSYour Name /**
420*5113495bSYour Name  * hal_txmon_parse_tx_fes_status_end() - parse tx_fes_status_end tlv
421*5113495bSYour Name  *
422*5113495bSYour Name  * @tx_tlv: pointer to tx_fes_status_end tlv header
423*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
424*5113495bSYour Name  * @tx_status_info: pointer to hal_tx_status_info
425*5113495bSYour Name  *
426*5113495bSYour Name  * Return: void
427*5113495bSYour Name  */
428*5113495bSYour Name static inline void
hal_txmon_parse_tx_fes_status_end(void * tx_tlv,struct hal_tx_ppdu_info * ppdu_info,struct hal_tx_status_info * tx_status_info)429*5113495bSYour Name hal_txmon_parse_tx_fes_status_end(void *tx_tlv,
430*5113495bSYour Name 				  struct hal_tx_ppdu_info *ppdu_info,
431*5113495bSYour Name 				  struct hal_tx_status_info *tx_status_info)
432*5113495bSYour Name {
433*5113495bSYour Name 	hal_tx_fes_status_end_t *tx_fes_end = (hal_tx_fes_status_end_t *)tx_tlv;
434*5113495bSYour Name 
435*5113495bSYour Name 	if (tx_fes_end->phytx_abort_request_info_valid) {
436*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info, phy_abort_reason) =
437*5113495bSYour Name 		tx_fes_end->phytx_abort_request_info_details.phytx_abort_reason;
438*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info, phy_abort_user_number) =
439*5113495bSYour Name 		tx_fes_end->phytx_abort_request_info_details.user_number;
440*5113495bSYour Name 	}
441*5113495bSYour Name 
442*5113495bSYour Name 	TXMON_STATUS_INFO(tx_status_info,
443*5113495bSYour Name 			  response_type) = tx_fes_end->response_type;
444*5113495bSYour Name 	TXMON_STATUS_INFO(tx_status_info,
445*5113495bSYour Name 			  r2r_to_follow) = tx_fes_end->r2r_end_status_to_follow;
446*5113495bSYour Name 	/*  update phy timestamp to ppdu timestamp */
447*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, ppdu_timestamp) =
448*5113495bSYour Name 		(tx_fes_end->start_of_frame_timestamp_15_0 |
449*5113495bSYour Name 		 tx_fes_end->start_of_frame_timestamp_31_16 <<
450*5113495bSYour Name 		 HAL_TX_LSB(TX_FES_STATUS_END, START_OF_FRAME_TIMESTAMP_31_16));
451*5113495bSYour Name }
452*5113495bSYour Name 
453*5113495bSYour Name /**
454*5113495bSYour Name  * hal_txmon_parse_response_end_status() - parse response_end_status tlv
455*5113495bSYour Name  *
456*5113495bSYour Name  * @tx_tlv: pointer to response_end_status tlv header
457*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
458*5113495bSYour Name  * @tx_status_info: pointer to hal_tx_status_info
459*5113495bSYour Name  *
460*5113495bSYour Name  * Return: void
461*5113495bSYour Name  */
462*5113495bSYour Name static inline void
hal_txmon_parse_response_end_status(void * tx_tlv,struct hal_tx_ppdu_info * ppdu_info,struct hal_tx_status_info * tx_status_info)463*5113495bSYour Name hal_txmon_parse_response_end_status(void *tx_tlv,
464*5113495bSYour Name 				    struct hal_tx_ppdu_info *ppdu_info,
465*5113495bSYour Name 				    struct hal_tx_status_info *tx_status_info)
466*5113495bSYour Name {
467*5113495bSYour Name 	hal_response_end_status_t *resp_end_status = NULL;
468*5113495bSYour Name 
469*5113495bSYour Name 	resp_end_status = (hal_response_end_status_t *)tx_tlv;
470*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, bw) = resp_end_status->coex_based_tx_bw;
471*5113495bSYour Name 	TXMON_STATUS_INFO(tx_status_info, generated_response) =
472*5113495bSYour Name 		resp_end_status->generated_response;
473*5113495bSYour Name 	TXMON_STATUS_INFO(tx_status_info, mba_count) =
474*5113495bSYour Name 		resp_end_status->mba_user_count;
475*5113495bSYour Name 	TXMON_STATUS_INFO(tx_status_info, mba_fake_bitmap_count) =
476*5113495bSYour Name 		resp_end_status->mba_fake_bitmap_count;
477*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, ppdu_timestamp) =
478*5113495bSYour Name 		(resp_end_status->start_of_frame_timestamp_15_0 |
479*5113495bSYour Name 		 (resp_end_status->start_of_frame_timestamp_31_16 << 16));
480*5113495bSYour Name }
481*5113495bSYour Name 
482*5113495bSYour Name /**
483*5113495bSYour Name  * hal_txmon_parse_pcu_ppdu_setup_init() - parse pcu_ppdu_setup_init tlv
484*5113495bSYour Name  *
485*5113495bSYour Name  * @tx_tlv: pointer to pcu_ppdu_setup_init tlv header
486*5113495bSYour Name  * @data_status_info: pointer to data hal_tx_status_info
487*5113495bSYour Name  * @prot_status_info: pointer to protection hal_tx_status_info
488*5113495bSYour Name  *
489*5113495bSYour Name  * Return: void
490*5113495bSYour Name  */
491*5113495bSYour Name static inline void
hal_txmon_parse_pcu_ppdu_setup_init(void * tx_tlv,struct hal_tx_status_info * data_status_info,struct hal_tx_status_info * prot_status_info)492*5113495bSYour Name hal_txmon_parse_pcu_ppdu_setup_init(void *tx_tlv,
493*5113495bSYour Name 				    struct hal_tx_status_info *data_status_info,
494*5113495bSYour Name 				    struct hal_tx_status_info *prot_status_info)
495*5113495bSYour Name {
496*5113495bSYour Name 	hal_pcu_ppdu_setup_t *pcu_init = (hal_pcu_ppdu_setup_t *)tx_tlv;
497*5113495bSYour Name 
498*5113495bSYour Name 	prot_status_info->protection_addr =
499*5113495bSYour Name 		pcu_init->use_address_fields_for_protection;
500*5113495bSYour Name 	/* protection frame address 1 */
501*5113495bSYour Name 	*(uint32_t *)&prot_status_info->addr1[0] =
502*5113495bSYour Name 		pcu_init->protection_frame_ad1_31_0;
503*5113495bSYour Name 	*(uint16_t *)&prot_status_info->addr1[4] =
504*5113495bSYour Name 		pcu_init->protection_frame_ad1_47_32;
505*5113495bSYour Name 	/* protection frame address 2 */
506*5113495bSYour Name 	*(uint32_t *)&prot_status_info->addr2[0] =
507*5113495bSYour Name 		pcu_init->protection_frame_ad2_15_0;
508*5113495bSYour Name 	*(uint32_t *)&prot_status_info->addr2[2] =
509*5113495bSYour Name 		pcu_init->protection_frame_ad2_47_16;
510*5113495bSYour Name 	/* protection frame address 3 */
511*5113495bSYour Name 	*(uint32_t *)&prot_status_info->addr3[0] =
512*5113495bSYour Name 		pcu_init->protection_frame_ad3_31_0;
513*5113495bSYour Name 	*(uint16_t *)&prot_status_info->addr3[4] =
514*5113495bSYour Name 		pcu_init->protection_frame_ad3_47_32;
515*5113495bSYour Name 	/* protection frame address 4 */
516*5113495bSYour Name 	*(uint32_t *)&prot_status_info->addr4[0] =
517*5113495bSYour Name 		pcu_init->protection_frame_ad4_15_0;
518*5113495bSYour Name 	*(uint32_t *)&prot_status_info->addr4[2] =
519*5113495bSYour Name 		pcu_init->protection_frame_ad4_47_16;
520*5113495bSYour Name }
521*5113495bSYour Name 
522*5113495bSYour Name /**
523*5113495bSYour Name  * hal_txmon_parse_peer_entry() - parse peer entry tlv
524*5113495bSYour Name  *
525*5113495bSYour Name  * @tx_tlv: pointer to peer_entry tlv header
526*5113495bSYour Name  * @user_id: user_id
527*5113495bSYour Name  * @tx_ppdu_info: pointer to hal_tx_ppdu_info
528*5113495bSYour Name  * @tx_status_info: pointer to hal_tx_status_info
529*5113495bSYour Name  *
530*5113495bSYour Name  * Return: void
531*5113495bSYour Name  */
532*5113495bSYour Name static inline void
hal_txmon_parse_peer_entry(void * tx_tlv,uint8_t user_id,struct hal_tx_ppdu_info * tx_ppdu_info,struct hal_tx_status_info * tx_status_info)533*5113495bSYour Name hal_txmon_parse_peer_entry(void *tx_tlv,
534*5113495bSYour Name 			   uint8_t user_id,
535*5113495bSYour Name 			   struct hal_tx_ppdu_info *tx_ppdu_info,
536*5113495bSYour Name 			   struct hal_tx_status_info *tx_status_info)
537*5113495bSYour Name {
538*5113495bSYour Name 	hal_tx_peer_entry_t *peer_entry = (hal_tx_peer_entry_t *)tx_tlv;
539*5113495bSYour Name 
540*5113495bSYour Name 	*(uint32_t *)&tx_status_info->addr1[0] =
541*5113495bSYour Name 				peer_entry->mac_addr_a_31_0;
542*5113495bSYour Name 	*(uint16_t *)&tx_status_info->addr1[4] =
543*5113495bSYour Name 				peer_entry->mac_addr_a_47_32;
544*5113495bSYour Name 	*(uint32_t *)&tx_status_info->addr2[0] =
545*5113495bSYour Name 				peer_entry->mac_addr_b_15_0;
546*5113495bSYour Name 	*(uint32_t *)&tx_status_info->addr2[2] =
547*5113495bSYour Name 				peer_entry->mac_addr_b_47_16;
548*5113495bSYour Name 	TXMON_HAL_USER(tx_ppdu_info, user_id, sw_peer_id) =
549*5113495bSYour Name 				peer_entry->sw_peer_id;
550*5113495bSYour Name }
551*5113495bSYour Name 
552*5113495bSYour Name /**
553*5113495bSYour Name  * hal_txmon_parse_queue_exten() - parse queue exten tlv
554*5113495bSYour Name  *
555*5113495bSYour Name  * @tx_tlv: pointer to queue exten tlv header
556*5113495bSYour Name  * @tx_ppdu_info: pointer to hal_tx_ppdu_info
557*5113495bSYour Name  *
558*5113495bSYour Name  * Return: void
559*5113495bSYour Name  */
560*5113495bSYour Name static inline void
hal_txmon_parse_queue_exten(void * tx_tlv,struct hal_tx_ppdu_info * tx_ppdu_info)561*5113495bSYour Name hal_txmon_parse_queue_exten(void *tx_tlv,
562*5113495bSYour Name 			    struct hal_tx_ppdu_info *tx_ppdu_info)
563*5113495bSYour Name {
564*5113495bSYour Name 	hal_tx_queue_ext_t *queue_ext = (hal_tx_queue_ext_t *)tx_tlv;
565*5113495bSYour Name 
566*5113495bSYour Name 	TXMON_HAL_STATUS(tx_ppdu_info, frame_control) = queue_ext->frame_ctl;
567*5113495bSYour Name 	TXMON_HAL_STATUS(tx_ppdu_info, frame_control_info_valid) = true;
568*5113495bSYour Name }
569*5113495bSYour Name 
570*5113495bSYour Name /**
571*5113495bSYour Name  * hal_txmon_parse_mpdu_start() - parse mpdu start tlv
572*5113495bSYour Name  *
573*5113495bSYour Name  * @tx_tlv: pointer to mpdu start tlv header
574*5113495bSYour Name  * @user_id: user id
575*5113495bSYour Name  * @tx_ppdu_info: pointer to hal_tx_ppdu_info
576*5113495bSYour Name  *
577*5113495bSYour Name  * Return: void
578*5113495bSYour Name  */
579*5113495bSYour Name static inline void
hal_txmon_parse_mpdu_start(void * tx_tlv,uint8_t user_id,struct hal_tx_ppdu_info * tx_ppdu_info)580*5113495bSYour Name hal_txmon_parse_mpdu_start(void *tx_tlv, uint8_t user_id,
581*5113495bSYour Name 			   struct hal_tx_ppdu_info *tx_ppdu_info)
582*5113495bSYour Name {
583*5113495bSYour Name 	hal_tx_mpdu_start_t *mpdu_start = (hal_tx_mpdu_start_t *)tx_tlv;
584*5113495bSYour Name 
585*5113495bSYour Name 	TXMON_HAL_USER(tx_ppdu_info, user_id, start_seq) =
586*5113495bSYour Name 		mpdu_start->mpdu_sequence_number;
587*5113495bSYour Name 	TXMON_HAL(tx_ppdu_info, cur_usr_idx) = user_id;
588*5113495bSYour Name }
589*5113495bSYour Name 
590*5113495bSYour Name /**
591*5113495bSYour Name  * hal_txmon_parse_msdu_start() - parse msdu start tlv
592*5113495bSYour Name  *
593*5113495bSYour Name  * @tx_tlv: pointer to msdu start tlv header
594*5113495bSYour Name  * @user_id: user id
595*5113495bSYour Name  * @tx_ppdu_info: pointer to hal_tx_ppdu_info
596*5113495bSYour Name  *
597*5113495bSYour Name  * Return: void
598*5113495bSYour Name  */
599*5113495bSYour Name static inline void
hal_txmon_parse_msdu_start(void * tx_tlv,uint8_t user_id,struct hal_tx_ppdu_info * tx_ppdu_info)600*5113495bSYour Name hal_txmon_parse_msdu_start(void *tx_tlv, uint8_t user_id,
601*5113495bSYour Name 			   struct hal_tx_ppdu_info *tx_ppdu_info)
602*5113495bSYour Name {
603*5113495bSYour Name }
604*5113495bSYour Name 
605*5113495bSYour Name /**
606*5113495bSYour Name  * hal_txmon_parse_tx_fes_status_prot() - parse tx_fes_status_prot tlv
607*5113495bSYour Name  *
608*5113495bSYour Name  * @tx_tlv: pointer to pcu_ppdu_setup_init tlv header
609*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
610*5113495bSYour Name  * @tx_status_info: pointer to hal_tx_status_info
611*5113495bSYour Name  *
612*5113495bSYour Name  * Return: void
613*5113495bSYour Name  */
614*5113495bSYour Name static inline void
hal_txmon_parse_tx_fes_status_prot(void * tx_tlv,struct hal_tx_ppdu_info * ppdu_info,struct hal_tx_status_info * tx_status_info)615*5113495bSYour Name hal_txmon_parse_tx_fes_status_prot(void *tx_tlv,
616*5113495bSYour Name 				   struct hal_tx_ppdu_info *ppdu_info,
617*5113495bSYour Name 				   struct hal_tx_status_info *tx_status_info)
618*5113495bSYour Name {
619*5113495bSYour Name 	hal_tx_fes_status_prot_t *fes_prot = (hal_tx_fes_status_prot_t *)tx_tlv;
620*5113495bSYour Name 
621*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, ppdu_timestamp) =
622*5113495bSYour Name 		(fes_prot->start_of_frame_timestamp_15_0 |
623*5113495bSYour Name 		 fes_prot->start_of_frame_timestamp_31_16 << 15);
624*5113495bSYour Name }
625*5113495bSYour Name 
626*5113495bSYour Name /**
627*5113495bSYour Name  * get_ru_offset_from_start_index() - api to get ru offset from ru index
628*5113495bSYour Name  *
629*5113495bSYour Name  * @ru_size: RU size
630*5113495bSYour Name  * @start_idx: Start index
631*5113495bSYour Name  *
632*5113495bSYour Name  * Return: uint8_t ru allocation offset
633*5113495bSYour Name  */
634*5113495bSYour Name static inline
get_ru_offset_from_start_index(uint8_t ru_size,uint8_t start_idx)635*5113495bSYour Name uint8_t get_ru_offset_from_start_index(uint8_t ru_size, uint8_t start_idx)
636*5113495bSYour Name {
637*5113495bSYour Name 	uint8_t ru_alloc_offset[HAL_MAX_DL_MU_USERS][HAL_MAX_RU_INDEX] = {
638*5113495bSYour Name 		{0, 0, 0, 0, 0, 0, 0},
639*5113495bSYour Name 		{1, 0, 0, 0, 0, 0, 0},
640*5113495bSYour Name 		{2, 1, 0, 0, 0, 0, 0},
641*5113495bSYour Name 		{3, 1, 0, 0, 0, 0, 0},
642*5113495bSYour Name 		{4, 0, 0, 0, 0, 0, 0},
643*5113495bSYour Name 		{5, 2, 1, 0, 0, 0, 0},
644*5113495bSYour Name 		{6, 2, 1, 0, 0, 0, 0},
645*5113495bSYour Name 		{7, 3, 1, 0, 0, 0, 0},
646*5113495bSYour Name 		{8, 3, 1, 0, 0, 0, 0},
647*5113495bSYour Name 		{9, 4, 2, 1, 0, 0, 0},
648*5113495bSYour Name 		{10, 4, 2, 1, 0, 0, 0},
649*5113495bSYour Name 		{11, 5, 2, 1, 0, 0, 0},
650*5113495bSYour Name 		{12, 5, 2, 1, 0, 0, 0},
651*5113495bSYour Name 		{13, 0, 0, 1, 0, 0, 0},
652*5113495bSYour Name 		{14, 6, 3, 1, 0, 0, 0},
653*5113495bSYour Name 		{15, 6, 3, 1, 0, 0, 0},
654*5113495bSYour Name 		{16, 7, 3, 1, 0, 0, 0},
655*5113495bSYour Name 		{17, 7, 3, 1, 0, 0, 0},
656*5113495bSYour Name 		{18, 0, 0, 0, 0, 0, 0},
657*5113495bSYour Name 		{19, 8, 4, 2, 1, 0, 0},
658*5113495bSYour Name 		{20, 8, 4, 2, 1, 0, 0},
659*5113495bSYour Name 		{21, 9, 4, 2, 1, 0, 0},
660*5113495bSYour Name 		{22, 9, 4, 2, 1, 0, 0},
661*5113495bSYour Name 		{23, 0, 0, 2, 1, 0, 0},
662*5113495bSYour Name 		{24, 10, 5, 2, 1, 0, 0},
663*5113495bSYour Name 		{25, 10, 5, 2, 1, 0, 0},
664*5113495bSYour Name 		{26, 11, 5, 2, 1, 0, 0},
665*5113495bSYour Name 		{27, 11, 5, 2, 1, 0, 0},
666*5113495bSYour Name 		{28, 12, 6, 3, 1, 0, 0},
667*5113495bSYour Name 		{29, 12, 6, 3, 1, 0, 0},
668*5113495bSYour Name 		{30, 13, 6, 3, 1, 0, 0},
669*5113495bSYour Name 		{31, 13, 6, 3, 1, 0, 0},
670*5113495bSYour Name 		{32, 0, 0, 3, 1, 0, 0},
671*5113495bSYour Name 		{33, 14, 7, 3, 1, 0, 0},
672*5113495bSYour Name 		{34, 14, 7, 3, 1, 0, 0},
673*5113495bSYour Name 		{35, 15, 7, 3, 1, 0, 0},
674*5113495bSYour Name 		{36, 15, 7, 3, 1, 0, 0},
675*5113495bSYour Name 	};
676*5113495bSYour Name 
677*5113495bSYour Name 	if (start_idx >= HAL_MAX_UL_MU_USERS || ru_size >= HAL_MAX_RU_INDEX)
678*5113495bSYour Name 		return 0;
679*5113495bSYour Name 
680*5113495bSYour Name 	return ru_alloc_offset[start_idx][ru_size];
681*5113495bSYour Name }
682*5113495bSYour Name 
683*5113495bSYour Name /**
684*5113495bSYour Name  * hal_txmon_parse_fw2sw() - parse firmware to software tlv
685*5113495bSYour Name  *
686*5113495bSYour Name  * @tx_tlv: pointer to firmware to software tlvmpdu start tlv header
687*5113495bSYour Name  * @type: place where this tlv is generated
688*5113495bSYour Name  * @status_info: pointer to hal_tx_status_info
689*5113495bSYour Name  *
690*5113495bSYour Name  * Return: void
691*5113495bSYour Name  */
692*5113495bSYour Name static inline void
hal_txmon_parse_fw2sw(void * tx_tlv,uint8_t type,struct hal_tx_status_info * status_info)693*5113495bSYour Name hal_txmon_parse_fw2sw(void *tx_tlv, uint8_t type,
694*5113495bSYour Name 		      struct hal_tx_status_info *status_info)
695*5113495bSYour Name {
696*5113495bSYour Name 	uint32_t *msg = (uint32_t *)tx_tlv;
697*5113495bSYour Name 
698*5113495bSYour Name 	switch (type) {
699*5113495bSYour Name 	case TXMON_FW2SW_TYPE_FES_SETUP:
700*5113495bSYour Name 	{
701*5113495bSYour Name 		uint32_t schedule_id;
702*5113495bSYour Name 		uint16_t c_freq1;
703*5113495bSYour Name 		uint16_t c_freq2;
704*5113495bSYour Name 		uint16_t freq_mhz;
705*5113495bSYour Name 		uint8_t phy_mode;
706*5113495bSYour Name 
707*5113495bSYour Name 		c_freq1 = TXMON_FW2SW_MON_FES_SETUP_BAND_CENTER_FREQ1_GET(*msg);
708*5113495bSYour Name 		c_freq2 = TXMON_FW2SW_MON_FES_SETUP_BAND_CENTER_FREQ2_GET(*msg);
709*5113495bSYour Name 
710*5113495bSYour Name 		msg++;
711*5113495bSYour Name 		phy_mode = TXMON_FW2SW_MON_FES_SETUP_PHY_MODE_GET(*msg);
712*5113495bSYour Name 		freq_mhz = TXMON_FW2SW_MON_FES_SETUP_MHZ_GET(*msg);
713*5113495bSYour Name 
714*5113495bSYour Name 		msg++;
715*5113495bSYour Name 		schedule_id = TXMON_FW2SW_MON_FES_SETUP_SCHEDULE_ID_GET(*msg);
716*5113495bSYour Name 
717*5113495bSYour Name 		TXMON_STATUS_INFO(status_info, band_center_freq1) = c_freq1;
718*5113495bSYour Name 		TXMON_STATUS_INFO(status_info, band_center_freq2) = c_freq2;
719*5113495bSYour Name 		TXMON_STATUS_INFO(status_info, freq) = freq_mhz;
720*5113495bSYour Name 		TXMON_STATUS_INFO(status_info, phy_mode) = phy_mode;
721*5113495bSYour Name 		TXMON_STATUS_INFO(status_info, schedule_id) = schedule_id;
722*5113495bSYour Name 
723*5113495bSYour Name 		break;
724*5113495bSYour Name 	}
725*5113495bSYour Name 	case TXMON_FW2SW_TYPE_FES_SETUP_USER:
726*5113495bSYour Name 	{
727*5113495bSYour Name 		break;
728*5113495bSYour Name 	}
729*5113495bSYour Name 	case TXMON_FW2SW_TYPE_FES_SETUP_EXT:
730*5113495bSYour Name 	{
731*5113495bSYour Name 		break;
732*5113495bSYour Name 	}
733*5113495bSYour Name 	};
734*5113495bSYour Name }
735*5113495bSYour Name 
736*5113495bSYour Name /**
737*5113495bSYour Name  * hal_txmon_parse_u_sig_hdr() - parse u_sig header information from tlv
738*5113495bSYour Name  *
739*5113495bSYour Name  * @tx_tlv: pointer to mactx_u_sig_eht_su_mu/tb tlv
740*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
741*5113495bSYour Name  *
742*5113495bSYour Name  * Return: void
743*5113495bSYour Name  */
744*5113495bSYour Name static inline void
hal_txmon_parse_u_sig_hdr(void * tx_tlv,struct hal_tx_ppdu_info * ppdu_info)745*5113495bSYour Name hal_txmon_parse_u_sig_hdr(void *tx_tlv, struct hal_tx_ppdu_info *ppdu_info)
746*5113495bSYour Name {
747*5113495bSYour Name 	struct hal_mon_usig_hdr *usig = (struct hal_mon_usig_hdr *)tx_tlv;
748*5113495bSYour Name 	struct hal_mon_usig_cmn *usig_1 = &usig->usig_1;
749*5113495bSYour Name 	uint8_t bad_usig_crc;
750*5113495bSYour Name 
751*5113495bSYour Name 	bad_usig_crc = HAL_TX_DESC_GET_64(tx_tlv,
752*5113495bSYour Name 					  MACTX_U_SIG_EHT_SU_MU_MACTX_U_SIG_EHT_SU_MU_INFO_DETAILS,
753*5113495bSYour Name 					  CRC) ? 0 : 1;
754*5113495bSYour Name 
755*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, usig_common) |=
756*5113495bSYour Name 			QDF_MON_STATUS_USIG_PHY_VERSION_KNOWN |
757*5113495bSYour Name 			QDF_MON_STATUS_USIG_BW_KNOWN |
758*5113495bSYour Name 			QDF_MON_STATUS_USIG_UL_DL_KNOWN |
759*5113495bSYour Name 			QDF_MON_STATUS_USIG_BSS_COLOR_KNOWN |
760*5113495bSYour Name 			QDF_MON_STATUS_USIG_TXOP_KNOWN;
761*5113495bSYour Name 
762*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, usig_common) |=
763*5113495bSYour Name 			(usig_1->phy_version <<
764*5113495bSYour Name 			 QDF_MON_STATUS_USIG_PHY_VERSION_SHIFT);
765*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, usig_common) |=
766*5113495bSYour Name 			(usig_1->bw << QDF_MON_STATUS_USIG_BW_SHIFT);
767*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, usig_common) |=
768*5113495bSYour Name 			(usig_1->ul_dl << QDF_MON_STATUS_USIG_UL_DL_SHIFT);
769*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, usig_common) |=
770*5113495bSYour Name 			(usig_1->bss_color <<
771*5113495bSYour Name 			 QDF_MON_STATUS_USIG_BSS_COLOR_SHIFT);
772*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, usig_common) |=
773*5113495bSYour Name 			(usig_1->txop << QDF_MON_STATUS_USIG_TXOP_SHIFT);
774*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, usig_common) |= bad_usig_crc;
775*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, bw) = usig_1->bw;
776*5113495bSYour Name 
777*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, usig_flags) = 1;
778*5113495bSYour Name }
779*5113495bSYour Name 
780*5113495bSYour Name /**
781*5113495bSYour Name  * hal_txmon_populate_he_data_per_user() - populate he data per user
782*5113495bSYour Name  *
783*5113495bSYour Name  * @usr: pointer to hal_txmon_user_desc_per_user
784*5113495bSYour Name  * @user_id: user index
785*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
786*5113495bSYour Name  *
787*5113495bSYour Name  * Return: void
788*5113495bSYour Name  */
789*5113495bSYour Name static inline void
hal_txmon_populate_he_data_per_user(struct hal_txmon_user_desc_per_user * usr,uint32_t user_id,struct hal_tx_ppdu_info * ppdu_info)790*5113495bSYour Name hal_txmon_populate_he_data_per_user(struct hal_txmon_user_desc_per_user *usr,
791*5113495bSYour Name 				    uint32_t user_id,
792*5113495bSYour Name 				    struct hal_tx_ppdu_info *ppdu_info)
793*5113495bSYour Name {
794*5113495bSYour Name 	uint32_t he_data1 = TXMON_HAL_USER(ppdu_info, user_id, he_data1);
795*5113495bSYour Name 	uint32_t he_data2 = TXMON_HAL_USER(ppdu_info, user_id, he_data2);
796*5113495bSYour Name 	uint32_t he_data3 = TXMON_HAL_USER(ppdu_info, user_id, he_data3);
797*5113495bSYour Name 	uint32_t he_data5 = TXMON_HAL_USER(ppdu_info, user_id, he_data5);
798*5113495bSYour Name 	uint32_t he_data6 = TXMON_HAL_USER(ppdu_info, user_id, he_data6);
799*5113495bSYour Name 
800*5113495bSYour Name 	/* populate */
801*5113495bSYour Name 	/* BEAM CHANGE */
802*5113495bSYour Name 	he_data1 |= QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN;
803*5113495bSYour Name 	he_data1 |= QDF_MON_STATUS_TXBF_KNOWN;
804*5113495bSYour Name 	he_data5 |= (!!usr->user_bf_type << QDF_MON_STATUS_TXBF_SHIFT);
805*5113495bSYour Name 	he_data3 |= (!!usr->user_bf_type << QDF_MON_STATUS_BEAM_CHANGE_SHIFT);
806*5113495bSYour Name 
807*5113495bSYour Name 	/* UL/DL known */
808*5113495bSYour Name 	he_data1 |= QDF_MON_STATUS_HE_DL_UL_KNOWN;
809*5113495bSYour Name 	he_data3 |= (1 << QDF_MON_STATUS_DL_UL_SHIFT);
810*5113495bSYour Name 
811*5113495bSYour Name 	/* MCS */
812*5113495bSYour Name 	he_data1 |= QDF_MON_STATUS_HE_MCS_KNOWN;
813*5113495bSYour Name 	he_data3 |= (usr->mcs << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT);
814*5113495bSYour Name 	/* DCM */
815*5113495bSYour Name 	he_data1 |= QDF_MON_STATUS_HE_DCM_KNOWN;
816*5113495bSYour Name 	he_data3 |= (usr->dcm << QDF_MON_STATUS_DCM_SHIFT);
817*5113495bSYour Name 	/* LDPC EXTRA SYMB */
818*5113495bSYour Name 	he_data1 |= QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN;
819*5113495bSYour Name 	he_data3 |= (usr->ldpc_extra_symbol <<
820*5113495bSYour Name 		     QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT);
821*5113495bSYour Name 	/* RU offset and RU */
822*5113495bSYour Name 	he_data2 |= QDF_MON_STATUS_RU_ALLOCATION_OFFSET_KNOWN;
823*5113495bSYour Name 	he_data2 |= (get_ru_offset_from_start_index(usr->ru_size,
824*5113495bSYour Name 						    usr->ru_start_index) <<
825*5113495bSYour Name 		     QDF_MON_STATUS_RU_ALLOCATION_SHIFT);
826*5113495bSYour Name 	/* Data BW and RU allocation */
827*5113495bSYour Name 	if (usr->ru_size < HAL_MAX_RU_INDEX) {
828*5113495bSYour Name 		/* update bandwidth if it is full bandwidth */
829*5113495bSYour Name 		he_data1 |= QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
830*5113495bSYour Name 		he_data5 = (he_data5 & 0xFFF0) | (4 + usr->ru_size);
831*5113495bSYour Name 	}
832*5113495bSYour Name 
833*5113495bSYour Name 	he_data6 |= (usr->nss & 0xF);
834*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info, user_id, mcs) = usr->mcs;
835*5113495bSYour Name 
836*5113495bSYour Name 	/* update stack variable to ppdu_info */
837*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info, user_id, he_data1) = he_data1;
838*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info, user_id, he_data2) = he_data2;
839*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info, user_id, he_data3) = he_data3;
840*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info, user_id, he_data5) = he_data5;
841*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info, user_id, he_data6) = he_data6;
842*5113495bSYour Name }
843*5113495bSYour Name 
844*5113495bSYour Name /**
845*5113495bSYour Name  * hal_txmon_get_user_desc_per_user() - get mactx user desc per user from tlv
846*5113495bSYour Name  *
847*5113495bSYour Name  * @tx_tlv: pointer to mactx_user_desc_per_user tlv
848*5113495bSYour Name  * @usr: pointer to hal_txmon_user_desc_per_user
849*5113495bSYour Name  *
850*5113495bSYour Name  * Return: void
851*5113495bSYour Name  */
852*5113495bSYour Name static inline void
hal_txmon_get_user_desc_per_user(void * tx_tlv,struct hal_txmon_user_desc_per_user * usr)853*5113495bSYour Name hal_txmon_get_user_desc_per_user(void *tx_tlv,
854*5113495bSYour Name 				 struct hal_txmon_user_desc_per_user *usr)
855*5113495bSYour Name {
856*5113495bSYour Name 	usr->psdu_length = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
857*5113495bSYour Name 					      PSDU_LENGTH);
858*5113495bSYour Name 	usr->ru_start_index = HAL_TX_DESC_GET_64(tx_tlv,
859*5113495bSYour Name 						 MACTX_USER_DESC_PER_USER,
860*5113495bSYour Name 						 RU_START_INDEX);
861*5113495bSYour Name 	usr->ru_size = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
862*5113495bSYour Name 					  RU_SIZE);
863*5113495bSYour Name 	usr->ofdma_mu_mimo_enabled =
864*5113495bSYour Name 		HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
865*5113495bSYour Name 				   OFDMA_MU_MIMO_ENABLED);
866*5113495bSYour Name 	usr->nss = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
867*5113495bSYour Name 				      NSS) + 1;
868*5113495bSYour Name 	usr->stream_offset = HAL_TX_DESC_GET_64(tx_tlv,
869*5113495bSYour Name 						MACTX_USER_DESC_PER_USER,
870*5113495bSYour Name 						STREAM_OFFSET);
871*5113495bSYour Name 	usr->mcs = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, MCS);
872*5113495bSYour Name 	usr->dcm = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, DCM);
873*5113495bSYour Name 	usr->fec_type = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
874*5113495bSYour Name 					   FEC_TYPE);
875*5113495bSYour Name 	usr->user_bf_type = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
876*5113495bSYour Name 					       USER_BF_TYPE);
877*5113495bSYour Name 	usr->drop_user_cbf = HAL_TX_DESC_GET_64(tx_tlv,
878*5113495bSYour Name 						MACTX_USER_DESC_PER_USER,
879*5113495bSYour Name 						DROP_USER_CBF);
880*5113495bSYour Name 	usr->ldpc_extra_symbol = HAL_TX_DESC_GET_64(tx_tlv,
881*5113495bSYour Name 						    MACTX_USER_DESC_PER_USER,
882*5113495bSYour Name 						    LDPC_EXTRA_SYMBOL);
883*5113495bSYour Name 	usr->force_extra_symbol = HAL_TX_DESC_GET_64(tx_tlv,
884*5113495bSYour Name 						     MACTX_USER_DESC_PER_USER,
885*5113495bSYour Name 						     FORCE_EXTRA_SYMBOL);
886*5113495bSYour Name 	usr->sw_peer_id = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
887*5113495bSYour Name 					     SW_PEER_ID);
888*5113495bSYour Name }
889*5113495bSYour Name 
890*5113495bSYour Name /**
891*5113495bSYour Name  * hal_txmon_populate_eht_sig_per_user() - populate eht sig user information
892*5113495bSYour Name  *
893*5113495bSYour Name  * @usr: pointer to hal_txmon_user_desc_per_user
894*5113495bSYour Name  * @user_id: user index
895*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
896*5113495bSYour Name  *
897*5113495bSYour Name  * Return: void
898*5113495bSYour Name  */
899*5113495bSYour Name static inline void
hal_txmon_populate_eht_sig_per_user(struct hal_txmon_user_desc_per_user * usr,uint32_t user_id,struct hal_tx_ppdu_info * ppdu_info)900*5113495bSYour Name hal_txmon_populate_eht_sig_per_user(struct hal_txmon_user_desc_per_user *usr,
901*5113495bSYour Name 				    uint32_t user_id,
902*5113495bSYour Name 				    struct hal_tx_ppdu_info *ppdu_info)
903*5113495bSYour Name {
904*5113495bSYour Name 	uint32_t eht_known = 0;
905*5113495bSYour Name 	uint32_t eht_data[6] = {0};
906*5113495bSYour Name 	uint8_t i = 0;
907*5113495bSYour Name 
908*5113495bSYour Name 	eht_known = QDF_MON_STATUS_EHT_LDPC_EXTRA_SYMBOL_SEG_KNOWN;
909*5113495bSYour Name 
910*5113495bSYour Name 	eht_data[0] |= (usr->ldpc_extra_symbol <<
911*5113495bSYour Name 			QDF_MON_STATUS_EHT_LDPC_EXTRA_SYMBOL_SEG_SHIFT);
912*5113495bSYour Name 
913*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_known) |= eht_known;
914*5113495bSYour Name 
915*5113495bSYour Name 	for (i = 0; i < 6; i++)
916*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, eht_data[i]) |= eht_data[i];
917*5113495bSYour Name }
918*5113495bSYour Name 
919*5113495bSYour Name /**
920*5113495bSYour Name  * hal_txmon_parse_user_desc_per_user() - parse mactx user desc per user
921*5113495bSYour Name  *
922*5113495bSYour Name  * @tx_tlv: pointer to mactx_user_desc_per_user tlv
923*5113495bSYour Name  * @user_id: user index
924*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
925*5113495bSYour Name  *
926*5113495bSYour Name  * Return: void
927*5113495bSYour Name  */
928*5113495bSYour Name static inline void
hal_txmon_parse_user_desc_per_user(void * tx_tlv,uint32_t user_id,struct hal_tx_ppdu_info * ppdu_info)929*5113495bSYour Name hal_txmon_parse_user_desc_per_user(void *tx_tlv, uint32_t user_id,
930*5113495bSYour Name 				   struct hal_tx_ppdu_info *ppdu_info)
931*5113495bSYour Name {
932*5113495bSYour Name 	struct hal_txmon_user_desc_per_user usr_info = {0};
933*5113495bSYour Name 
934*5113495bSYour Name 	hal_txmon_get_user_desc_per_user(tx_tlv, &usr_info);
935*5113495bSYour Name 
936*5113495bSYour Name 	/* based on preamble type populate user desc user info */
937*5113495bSYour Name 	if (TXMON_HAL_STATUS(ppdu_info, he_flags))
938*5113495bSYour Name 		hal_txmon_populate_he_data_per_user(&usr_info,
939*5113495bSYour Name 						    user_id, ppdu_info);
940*5113495bSYour Name 
941*5113495bSYour Name 	hal_txmon_populate_eht_sig_per_user(&usr_info, user_id, ppdu_info);
942*5113495bSYour Name }
943*5113495bSYour Name 
944*5113495bSYour Name /**
945*5113495bSYour Name  * hal_txmon_get_user_desc_common() - update hal_txmon_usr_desc_common from tlv
946*5113495bSYour Name  *
947*5113495bSYour Name  * @tx_tlv: pointer to mactx_user_desc_common tlv
948*5113495bSYour Name  * @usr_common: pointer to hal_txmon_usr_desc_common
949*5113495bSYour Name  *
950*5113495bSYour Name  * Return: void
951*5113495bSYour Name  */
952*5113495bSYour Name static inline void
hal_txmon_get_user_desc_common(void * tx_tlv,struct hal_txmon_usr_desc_common * usr_common)953*5113495bSYour Name hal_txmon_get_user_desc_common(void *tx_tlv,
954*5113495bSYour Name 			       struct hal_txmon_usr_desc_common *usr_common)
955*5113495bSYour Name {
956*5113495bSYour Name 	usr_common->ltf_size =
957*5113495bSYour Name 		HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, LTF_SIZE);
958*5113495bSYour Name 	usr_common->pkt_extn_pe =
959*5113495bSYour Name 		HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
960*5113495bSYour Name 				   PACKET_EXTENSION_PE_DISAMBIGUITY);
961*5113495bSYour Name 	usr_common->a_factor =
962*5113495bSYour Name 		HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
963*5113495bSYour Name 				   PACKET_EXTENSION_A_FACTOR);
964*5113495bSYour Name 	usr_common->center_ru_0 =
965*5113495bSYour Name 		HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, CENTER_RU_0);
966*5113495bSYour Name 	usr_common->center_ru_1 =
967*5113495bSYour Name 		HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, CENTER_RU_1);
968*5113495bSYour Name 	usr_common->num_ltf_symbols =
969*5113495bSYour Name 		HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
970*5113495bSYour Name 				   NUM_LTF_SYMBOLS);
971*5113495bSYour Name 	usr_common->doppler_indication =
972*5113495bSYour Name 		HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
973*5113495bSYour Name 				   DOPPLER_INDICATION);
974*5113495bSYour Name 	usr_common->spatial_reuse =
975*5113495bSYour Name 		HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
976*5113495bSYour Name 				   SPATIAL_REUSE);
977*5113495bSYour Name 
978*5113495bSYour Name 	usr_common->ru_channel_0[0] =
979*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
980*5113495bSYour Name 			   RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_0);
981*5113495bSYour Name 	usr_common->ru_channel_0[1] =
982*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
983*5113495bSYour Name 			   RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_1);
984*5113495bSYour Name 	usr_common->ru_channel_0[2] =
985*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
986*5113495bSYour Name 			   RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_2);
987*5113495bSYour Name 	usr_common->ru_channel_0[3] =
988*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
989*5113495bSYour Name 			   RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_3);
990*5113495bSYour Name 	usr_common->ru_channel_0[4] =
991*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
992*5113495bSYour Name 			   RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND0_0);
993*5113495bSYour Name 	usr_common->ru_channel_0[5] =
994*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
995*5113495bSYour Name 			   RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND0_1);
996*5113495bSYour Name 	usr_common->ru_channel_0[6] =
997*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
998*5113495bSYour Name 			   RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND0_2);
999*5113495bSYour Name 	usr_common->ru_channel_0[7] =
1000*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
1001*5113495bSYour Name 			   RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND0_3);
1002*5113495bSYour Name 
1003*5113495bSYour Name 	usr_common->ru_channel_1[0] =
1004*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
1005*5113495bSYour Name 			   RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_0);
1006*5113495bSYour Name 	usr_common->ru_channel_1[1] =
1007*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
1008*5113495bSYour Name 			   RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_1);
1009*5113495bSYour Name 	usr_common->ru_channel_1[2] =
1010*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
1011*5113495bSYour Name 			   RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_2);
1012*5113495bSYour Name 	usr_common->ru_channel_1[3] =
1013*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
1014*5113495bSYour Name 			   RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_3);
1015*5113495bSYour Name 	usr_common->ru_channel_1[4] =
1016*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
1017*5113495bSYour Name 			   RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND1_0);
1018*5113495bSYour Name 	usr_common->ru_channel_1[5] =
1019*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
1020*5113495bSYour Name 			   RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND1_1);
1021*5113495bSYour Name 	usr_common->ru_channel_1[6] =
1022*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
1023*5113495bSYour Name 			   RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND1_2);
1024*5113495bSYour Name 	usr_common->ru_channel_1[7] =
1025*5113495bSYour Name 	HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON,
1026*5113495bSYour Name 			   RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND1_3);
1027*5113495bSYour Name }
1028*5113495bSYour Name 
1029*5113495bSYour Name /**
1030*5113495bSYour Name  * hal_txmon_populate_he_data_common() - populate he data common information
1031*5113495bSYour Name  *
1032*5113495bSYour Name  * @usr_common: pointer to hal_txmon_usr_desc_common
1033*5113495bSYour Name  * @user_id: user index
1034*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
1035*5113495bSYour Name  *
1036*5113495bSYour Name  * Return: void
1037*5113495bSYour Name  */
1038*5113495bSYour Name static inline void
hal_txmon_populate_he_data_common(struct hal_txmon_usr_desc_common * usr_common,uint32_t user_id,struct hal_tx_ppdu_info * ppdu_info)1039*5113495bSYour Name hal_txmon_populate_he_data_common(struct hal_txmon_usr_desc_common *usr_common,
1040*5113495bSYour Name 				  uint32_t user_id,
1041*5113495bSYour Name 				  struct hal_tx_ppdu_info *ppdu_info)
1042*5113495bSYour Name {
1043*5113495bSYour Name 	/* HE data 1 */
1044*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info,
1045*5113495bSYour Name 		       user_id, he_data1) |= QDF_MON_STATUS_HE_DOPPLER_KNOWN;
1046*5113495bSYour Name 
1047*5113495bSYour Name 	/* HE data 2 */
1048*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info, user_id,
1049*5113495bSYour Name 		       he_data2) |= (QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
1050*5113495bSYour Name 				     QDF_MON_STATUS_LTF_SYMBOLS_KNOWN);
1051*5113495bSYour Name 
1052*5113495bSYour Name 	/* HE data 5 */
1053*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info, user_id, he_data5) |=
1054*5113495bSYour Name 		(usr_common->pkt_extn_pe <<
1055*5113495bSYour Name 		 QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT) |
1056*5113495bSYour Name 		(usr_common->a_factor << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT) |
1057*5113495bSYour Name 		((1 + usr_common->ltf_size) <<
1058*5113495bSYour Name 		 QDF_MON_STATUS_HE_LTF_SIZE_SHIFT) |
1059*5113495bSYour Name 		(usr_common->num_ltf_symbols <<
1060*5113495bSYour Name 		 QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
1061*5113495bSYour Name 
1062*5113495bSYour Name 	/* HE data 6 */
1063*5113495bSYour Name 	TXMON_HAL_USER(ppdu_info, user_id,
1064*5113495bSYour Name 		       he_data6) |= (usr_common->doppler_indication <<
1065*5113495bSYour Name 				     QDF_MON_STATUS_DOPPLER_SHIFT);
1066*5113495bSYour Name }
1067*5113495bSYour Name 
1068*5113495bSYour Name /**
1069*5113495bSYour Name  * hal_txmon_populate_he_mu_common() - populate he mu common information
1070*5113495bSYour Name  *
1071*5113495bSYour Name  * @usr_common: pointer to hal_txmon_usr_desc_common
1072*5113495bSYour Name  * @user_id: user index
1073*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
1074*5113495bSYour Name  *
1075*5113495bSYour Name  * Return: void
1076*5113495bSYour Name  */
1077*5113495bSYour Name static inline void
hal_txmon_populate_he_mu_common(struct hal_txmon_usr_desc_common * usr_common,uint32_t user_id,struct hal_tx_ppdu_info * ppdu_info)1078*5113495bSYour Name hal_txmon_populate_he_mu_common(struct hal_txmon_usr_desc_common *usr_common,
1079*5113495bSYour Name 				uint32_t user_id,
1080*5113495bSYour Name 				struct hal_tx_ppdu_info *ppdu_info)
1081*5113495bSYour Name {
1082*5113495bSYour Name 	uint16_t he_mu_flag_1 = 0;
1083*5113495bSYour Name 	uint16_t he_mu_flag_2 = 0;
1084*5113495bSYour Name 	uint16_t i = 0;
1085*5113495bSYour Name 
1086*5113495bSYour Name 	he_mu_flag_1 |= (QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_KNOWN |
1087*5113495bSYour Name 			 QDF_MON_STATUS_CHANNEL_1_CENTER_26_RU_KNOWN |
1088*5113495bSYour Name 			 ((usr_common->center_ru_0 <<
1089*5113495bSYour Name 			   QDF_MON_STATUS_CHANNEL_1_CENTER_26_RU_SHIFT) &
1090*5113495bSYour Name 			  QDF_MON_STATUS_CHANNEL_1_CENTER_26_RU_VALUE));
1091*5113495bSYour Name 	he_mu_flag_2 |= ((usr_common->center_ru_1 <<
1092*5113495bSYour Name 			  QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_SHIFT) &
1093*5113495bSYour Name 			 QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_VALUE);
1094*5113495bSYour Name 
1095*5113495bSYour Name 	for (i = 0; i < usr_common->num_users; i++) {
1096*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_flags1) |= he_mu_flag_1;
1097*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_flags2) |= he_mu_flag_2;
1098*5113495bSYour Name 
1099*5113495bSYour Name 		/* channel 1 */
1100*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_RU[0]) =
1101*5113495bSYour Name 					usr_common->ru_channel_0[0];
1102*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_RU[1]) =
1103*5113495bSYour Name 					usr_common->ru_channel_0[1];
1104*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_RU[2]) =
1105*5113495bSYour Name 					usr_common->ru_channel_0[2];
1106*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_RU[3]) =
1107*5113495bSYour Name 					usr_common->ru_channel_0[3];
1108*5113495bSYour Name 		/* channel 2 */
1109*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_RU[4]) =
1110*5113495bSYour Name 					usr_common->ru_channel_1[0];
1111*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_RU[5]) =
1112*5113495bSYour Name 					usr_common->ru_channel_1[1];
1113*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_RU[6]) =
1114*5113495bSYour Name 					usr_common->ru_channel_1[2];
1115*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, i, he_RU[7]) =
1116*5113495bSYour Name 					usr_common->ru_channel_1[3];
1117*5113495bSYour Name 	}
1118*5113495bSYour Name }
1119*5113495bSYour Name 
1120*5113495bSYour Name /**
1121*5113495bSYour Name  * hal_txmon_populate_eht_sig_common() - populate eht sig common information
1122*5113495bSYour Name  *
1123*5113495bSYour Name  * @usr_common: pointer to hal_txmon_usr_desc_common
1124*5113495bSYour Name  * @user_id: user index
1125*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
1126*5113495bSYour Name  *
1127*5113495bSYour Name  * Return: void
1128*5113495bSYour Name  */
1129*5113495bSYour Name static inline void
hal_txmon_populate_eht_sig_common(struct hal_txmon_usr_desc_common * usr_common,uint32_t user_id,struct hal_tx_ppdu_info * ppdu_info)1130*5113495bSYour Name hal_txmon_populate_eht_sig_common(struct hal_txmon_usr_desc_common *usr_common,
1131*5113495bSYour Name 				  uint32_t user_id,
1132*5113495bSYour Name 				  struct hal_tx_ppdu_info *ppdu_info)
1133*5113495bSYour Name {
1134*5113495bSYour Name 	uint32_t eht_known = 0;
1135*5113495bSYour Name 	uint32_t eht_data[9] = {0};
1136*5113495bSYour Name 	uint8_t num_ru_allocation_known = 0;
1137*5113495bSYour Name 	uint8_t i = 0;
1138*5113495bSYour Name 
1139*5113495bSYour Name 	eht_known = (QDF_MON_STATUS_EHT_SPATIAL_REUSE_KNOWN |
1140*5113495bSYour Name 		     QDF_MON_STATUS_EHT_EHT_LTF_KNOWN |
1141*5113495bSYour Name 		     QDF_MON_STATUS_EHT_PRE_FEC_PADDING_FACTOR_KNOWN |
1142*5113495bSYour Name 		     QDF_MON_STATUS_EHT_PE_DISAMBIGUITY_KNOWN |
1143*5113495bSYour Name 		     QDF_MON_STATUS_EHT_DISREARD_KNOWN);
1144*5113495bSYour Name 
1145*5113495bSYour Name 	eht_data[0] |= (usr_common->spatial_reuse <<
1146*5113495bSYour Name 			QDF_MON_STATUS_EHT_SPATIAL_REUSE_SHIFT);
1147*5113495bSYour Name 	eht_data[0] |= (usr_common->num_ltf_symbols <<
1148*5113495bSYour Name 			QDF_MON_STATUS_EHT_EHT_LTF_SHIFT);
1149*5113495bSYour Name 	eht_data[0] |= (usr_common->a_factor <<
1150*5113495bSYour Name 			QDF_MON_STATUS_EHT_PRE_FEC_PADDING_FACTOR_SHIFT);
1151*5113495bSYour Name 	eht_data[0] |= (usr_common->pkt_extn_pe <<
1152*5113495bSYour Name 			QDF_MON_STATUS_EHT_PE_DISAMBIGUITY_SHIFT);
1153*5113495bSYour Name 	eht_data[0] |= (0xF << QDF_MON_STATUS_EHT_DISREGARD_SHIFT);
1154*5113495bSYour Name 
1155*5113495bSYour Name 	switch (TXMON_HAL_STATUS(ppdu_info, bw)) {
1156*5113495bSYour Name 	case HAL_EHT_BW_320_2:
1157*5113495bSYour Name 	case HAL_EHT_BW_320_1:
1158*5113495bSYour Name 		num_ru_allocation_known += 4;
1159*5113495bSYour Name 
1160*5113495bSYour Name 		eht_data[3] |= (usr_common->ru_channel_0[7] <<
1161*5113495bSYour Name 				QDF_MON_STATUS_EHT_RU_ALLOCATION2_6_SHIFT);
1162*5113495bSYour Name 		eht_data[3] |= (usr_common->ru_channel_0[6] <<
1163*5113495bSYour Name 				QDF_MON_STATUS_EHT_RU_ALLOCATION2_5_SHIFT);
1164*5113495bSYour Name 		eht_data[3] |= (usr_common->ru_channel_0[5] <<
1165*5113495bSYour Name 				QDF_MON_STATUS_EHT_RU_ALLOCATION2_4_SHIFT);
1166*5113495bSYour Name 		eht_data[2] |= (usr_common->ru_channel_0[4] <<
1167*5113495bSYour Name 				QDF_MON_STATUS_EHT_RU_ALLOCATION2_3_SHIFT);
1168*5113495bSYour Name 		fallthrough;
1169*5113495bSYour Name 	case HAL_EHT_BW_160:
1170*5113495bSYour Name 		num_ru_allocation_known += 2;
1171*5113495bSYour Name 
1172*5113495bSYour Name 		eht_data[2] |= (usr_common->ru_channel_0[3] <<
1173*5113495bSYour Name 				QDF_MON_STATUS_EHT_RU_ALLOCATION2_2_SHIFT);
1174*5113495bSYour Name 		eht_data[2] |= (usr_common->ru_channel_0[2] <<
1175*5113495bSYour Name 				QDF_MON_STATUS_EHT_RU_ALLOCATION2_1_SHIFT);
1176*5113495bSYour Name 		fallthrough;
1177*5113495bSYour Name 	case HAL_EHT_BW_80:
1178*5113495bSYour Name 		num_ru_allocation_known += 1;
1179*5113495bSYour Name 
1180*5113495bSYour Name 		eht_data[1] |= (usr_common->ru_channel_0[1] <<
1181*5113495bSYour Name 				QDF_MON_STATUS_EHT_RU_ALLOCATION1_2_SHIFT);
1182*5113495bSYour Name 		fallthrough;
1183*5113495bSYour Name 	case HAL_EHT_BW_40:
1184*5113495bSYour Name 	case HAL_EHT_BW_20:
1185*5113495bSYour Name 		num_ru_allocation_known += 1;
1186*5113495bSYour Name 
1187*5113495bSYour Name 		eht_data[1] |= (usr_common->ru_channel_0[0] <<
1188*5113495bSYour Name 				QDF_MON_STATUS_EHT_RU_ALLOCATION1_1_SHIFT);
1189*5113495bSYour Name 		break;
1190*5113495bSYour Name 	default:
1191*5113495bSYour Name 		break;
1192*5113495bSYour Name 	}
1193*5113495bSYour Name 
1194*5113495bSYour Name 	eht_known |= (num_ru_allocation_known <<
1195*5113495bSYour Name 		      QDF_MON_STATUS_EHT_NUM_KNOWN_RU_ALLOCATIONS_SHIFT);
1196*5113495bSYour Name 
1197*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_known) |= eht_known;
1198*5113495bSYour Name 
1199*5113495bSYour Name 	for (i = 0; i < 4; i++)
1200*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, eht_data[i]) |= eht_data[i];
1201*5113495bSYour Name }
1202*5113495bSYour Name 
1203*5113495bSYour Name /**
1204*5113495bSYour Name  * hal_txmon_parse_user_desc_common() - parse mactx user desc common tlv
1205*5113495bSYour Name  *
1206*5113495bSYour Name  * @tx_tlv: pointer to mactx_user_desc_common tlv
1207*5113495bSYour Name  * @user_id: user index
1208*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
1209*5113495bSYour Name  *
1210*5113495bSYour Name  * Return: void
1211*5113495bSYour Name  */
1212*5113495bSYour Name static inline void
hal_txmon_parse_user_desc_common(void * tx_tlv,uint32_t user_id,struct hal_tx_ppdu_info * ppdu_info)1213*5113495bSYour Name hal_txmon_parse_user_desc_common(void *tx_tlv, uint32_t user_id,
1214*5113495bSYour Name 				 struct hal_tx_ppdu_info *ppdu_info)
1215*5113495bSYour Name {
1216*5113495bSYour Name 	struct hal_txmon_usr_desc_common usr_common = {0};
1217*5113495bSYour Name 
1218*5113495bSYour Name 	usr_common.num_users = TXMON_HAL(ppdu_info, num_users);
1219*5113495bSYour Name 	hal_txmon_get_user_desc_common(tx_tlv, &usr_common);
1220*5113495bSYour Name 
1221*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info,
1222*5113495bSYour Name 			 he_mu_flags) = IS_MULTI_USERS(usr_common.num_users);
1223*5113495bSYour Name 
1224*5113495bSYour Name 	switch (TXMON_HAL_STATUS(ppdu_info, preamble_type)) {
1225*5113495bSYour Name 	case TXMON_PKT_TYPE_11AX:
1226*5113495bSYour Name 		if (TXMON_HAL_STATUS(ppdu_info, he_flags))
1227*5113495bSYour Name 			hal_txmon_populate_he_data_common(&usr_common,
1228*5113495bSYour Name 							  user_id, ppdu_info);
1229*5113495bSYour Name 		if (TXMON_HAL_STATUS(ppdu_info, he_mu_flags))
1230*5113495bSYour Name 			hal_txmon_populate_he_mu_common(&usr_common,
1231*5113495bSYour Name 							user_id, ppdu_info);
1232*5113495bSYour Name 		break;
1233*5113495bSYour Name 	case TXMON_PKT_TYPE_11BE:
1234*5113495bSYour Name 		hal_txmon_populate_eht_sig_common(&usr_common,
1235*5113495bSYour Name 						  user_id, ppdu_info);
1236*5113495bSYour Name 		break;
1237*5113495bSYour Name 	}
1238*5113495bSYour Name }
1239*5113495bSYour Name 
1240*5113495bSYour Name /**
1241*5113495bSYour Name  * hal_txmon_parse_eht_sig_non_mumimo_user_info() - parse eht sig non mumimo tlv
1242*5113495bSYour Name  *
1243*5113495bSYour Name  * @tx_tlv: pointer to hal_eht_sig_non_mu_mimo_user_info
1244*5113495bSYour Name  * @user_id: user index
1245*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
1246*5113495bSYour Name  *
1247*5113495bSYour Name  * Return: void
1248*5113495bSYour Name  */
1249*5113495bSYour Name static inline void
hal_txmon_parse_eht_sig_non_mumimo_user_info(void * tx_tlv,uint32_t user_id,struct hal_tx_ppdu_info * ppdu_info)1250*5113495bSYour Name hal_txmon_parse_eht_sig_non_mumimo_user_info(void *tx_tlv, uint32_t user_id,
1251*5113495bSYour Name 					     struct hal_tx_ppdu_info *ppdu_info)
1252*5113495bSYour Name {
1253*5113495bSYour Name 	struct hal_eht_sig_non_mu_mimo_user_info *user_info;
1254*5113495bSYour Name 	uint32_t idx = TXMON_HAL_STATUS(ppdu_info, num_eht_user_info_valid);
1255*5113495bSYour Name 
1256*5113495bSYour Name 	user_info = (struct hal_eht_sig_non_mu_mimo_user_info *)tx_tlv;
1257*5113495bSYour Name 
1258*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1259*5113495bSYour Name 		QDF_MON_STATUS_EHT_USER_STA_ID_KNOWN |
1260*5113495bSYour Name 		QDF_MON_STATUS_EHT_USER_MCS_KNOWN |
1261*5113495bSYour Name 		QDF_MON_STATUS_EHT_USER_CODING_KNOWN |
1262*5113495bSYour Name 		QDF_MON_STATUS_EHT_USER_NSS_KNOWN |
1263*5113495bSYour Name 		QDF_MON_STATUS_EHT_USER_BEAMFORMING_KNOWN;
1264*5113495bSYour Name 
1265*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1266*5113495bSYour Name 				(user_info->sta_id <<
1267*5113495bSYour Name 				 QDF_MON_STATUS_EHT_USER_STA_ID_SHIFT);
1268*5113495bSYour Name 
1269*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1270*5113495bSYour Name 				(user_info->mcs <<
1271*5113495bSYour Name 				 QDF_MON_STATUS_EHT_USER_MCS_SHIFT);
1272*5113495bSYour Name 
1273*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, mcs) = user_info->mcs;
1274*5113495bSYour Name 
1275*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1276*5113495bSYour Name 				(user_info->nss <<
1277*5113495bSYour Name 				 QDF_MON_STATUS_EHT_USER_NSS_SHIFT);
1278*5113495bSYour Name 
1279*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, nss) = user_info->nss + 1;
1280*5113495bSYour Name 
1281*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1282*5113495bSYour Name 				(user_info->beamformed <<
1283*5113495bSYour Name 				 QDF_MON_STATUS_EHT_USER_BEAMFORMING_SHIFT);
1284*5113495bSYour Name 
1285*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1286*5113495bSYour Name 				(user_info->coding <<
1287*5113495bSYour Name 				 QDF_MON_STATUS_EHT_USER_CODING_SHIFT);
1288*5113495bSYour Name 
1289*5113495bSYour Name 	/* TODO: CRC */
1290*5113495bSYour Name 
1291*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, num_eht_user_info_valid) += 1;
1292*5113495bSYour Name }
1293*5113495bSYour Name 
1294*5113495bSYour Name /**
1295*5113495bSYour Name  * hal_txmon_parse_eht_sig_mumimo_user_info() - parse eht sig mumimo tlv
1296*5113495bSYour Name  *
1297*5113495bSYour Name  * @tx_tlv: pointer to hal_eht_sig_mu_mimo_user_info
1298*5113495bSYour Name  * @user_id: user index
1299*5113495bSYour Name  * @ppdu_info: pointer to hal_tx_ppdu_info
1300*5113495bSYour Name  *
1301*5113495bSYour Name  * Return: void
1302*5113495bSYour Name  */
1303*5113495bSYour Name static inline void
hal_txmon_parse_eht_sig_mumimo_user_info(void * tx_tlv,uint32_t user_id,struct hal_tx_ppdu_info * ppdu_info)1304*5113495bSYour Name hal_txmon_parse_eht_sig_mumimo_user_info(void *tx_tlv, uint32_t user_id,
1305*5113495bSYour Name 					 struct hal_tx_ppdu_info *ppdu_info)
1306*5113495bSYour Name {
1307*5113495bSYour Name 	struct hal_eht_sig_mu_mimo_user_info *user_info;
1308*5113495bSYour Name 	uint32_t idx = TXMON_HAL_STATUS(ppdu_info, num_eht_user_info_valid);
1309*5113495bSYour Name 
1310*5113495bSYour Name 	user_info = (struct hal_eht_sig_mu_mimo_user_info *)tx_tlv;
1311*5113495bSYour Name 
1312*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1313*5113495bSYour Name 		QDF_MON_STATUS_EHT_USER_STA_ID_KNOWN |
1314*5113495bSYour Name 		QDF_MON_STATUS_EHT_USER_MCS_KNOWN |
1315*5113495bSYour Name 		QDF_MON_STATUS_EHT_USER_CODING_KNOWN |
1316*5113495bSYour Name 		QDF_MON_STATUS_EHT_USER_SPATIAL_CONFIG_KNOWN;
1317*5113495bSYour Name 
1318*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1319*5113495bSYour Name 				(user_info->sta_id <<
1320*5113495bSYour Name 				 QDF_MON_STATUS_EHT_USER_STA_ID_SHIFT);
1321*5113495bSYour Name 
1322*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1323*5113495bSYour Name 				(user_info->mcs <<
1324*5113495bSYour Name 				 QDF_MON_STATUS_EHT_USER_MCS_SHIFT);
1325*5113495bSYour Name 
1326*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, mcs) = user_info->mcs;
1327*5113495bSYour Name 
1328*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1329*5113495bSYour Name 				(user_info->coding <<
1330*5113495bSYour Name 				 QDF_MON_STATUS_EHT_USER_CODING_SHIFT);
1331*5113495bSYour Name 
1332*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, eht_user_info[idx]) |=
1333*5113495bSYour Name 				(user_info->spatial_coding <<
1334*5113495bSYour Name 				 QDF_MON_STATUS_EHT_USER_SPATIAL_CONFIG_SHIFT);
1335*5113495bSYour Name 	/*  TODO: CRC */
1336*5113495bSYour Name 
1337*5113495bSYour Name 	TXMON_HAL_STATUS(ppdu_info, num_eht_user_info_valid) += 1;
1338*5113495bSYour Name }
1339*5113495bSYour Name 
1340*5113495bSYour Name /**
1341*5113495bSYour Name  * hal_txmon_status_get_num_users_generic_be() - api to get num users
1342*5113495bSYour Name  * from start of fes window
1343*5113495bSYour Name  *
1344*5113495bSYour Name  * @tx_tlv_hdr: pointer to TLV header
1345*5113495bSYour Name  * @num_users: reference to number of user
1346*5113495bSYour Name  *
1347*5113495bSYour Name  * Return: status
1348*5113495bSYour Name  */
1349*5113495bSYour Name static inline uint32_t
hal_txmon_status_get_num_users_generic_be(void * tx_tlv_hdr,uint8_t * num_users)1350*5113495bSYour Name hal_txmon_status_get_num_users_generic_be(void *tx_tlv_hdr, uint8_t *num_users)
1351*5113495bSYour Name {
1352*5113495bSYour Name 	uint32_t tlv_tag, user_id, tlv_len;
1353*5113495bSYour Name 	uint32_t tlv_status = HAL_MON_TX_STATUS_PPDU_NOT_DONE;
1354*5113495bSYour Name 	void *tx_tlv;
1355*5113495bSYour Name 
1356*5113495bSYour Name 	tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(tx_tlv_hdr);
1357*5113495bSYour Name 	user_id = HAL_RX_GET_USER_TLV32_USERID(tx_tlv_hdr);
1358*5113495bSYour Name 	tlv_len = HAL_RX_GET_USER_TLV32_LEN(tx_tlv_hdr);
1359*5113495bSYour Name 
1360*5113495bSYour Name 	tx_tlv = (uint8_t *)tx_tlv_hdr + HAL_RX_TLV64_HDR_SIZE;
1361*5113495bSYour Name 	/* window starts with either initiator or response */
1362*5113495bSYour Name 	switch (tlv_tag) {
1363*5113495bSYour Name 	case WIFITX_FES_SETUP_E:
1364*5113495bSYour Name 	{
1365*5113495bSYour Name 		*num_users = hal_txmon_get_num_users(tx_tlv);
1366*5113495bSYour Name 		if (*num_users == 0)
1367*5113495bSYour Name 			*num_users = 1;
1368*5113495bSYour Name 
1369*5113495bSYour Name 		tlv_status = HAL_MON_TX_FES_SETUP;
1370*5113495bSYour Name 		break;
1371*5113495bSYour Name 	}
1372*5113495bSYour Name 	case WIFIRX_RESPONSE_REQUIRED_INFO_E:
1373*5113495bSYour Name 	{
1374*5113495bSYour Name 		*num_users = HAL_TX_DESC_GET_64(tx_tlv,
1375*5113495bSYour Name 						RX_RESPONSE_REQUIRED_INFO,
1376*5113495bSYour Name 						RESPONSE_STA_COUNT);
1377*5113495bSYour Name 		if (*num_users == 0)
1378*5113495bSYour Name 			*num_users = 1;
1379*5113495bSYour Name 		tlv_status = HAL_MON_RX_RESPONSE_REQUIRED_INFO;
1380*5113495bSYour Name 		break;
1381*5113495bSYour Name 	}
1382*5113495bSYour Name 	};
1383*5113495bSYour Name 
1384*5113495bSYour Name 	return tlv_status;
1385*5113495bSYour Name }
1386*5113495bSYour Name 
1387*5113495bSYour Name #ifdef MONITOR_TLV_RECORDING_ENABLE
1388*5113495bSYour Name static inline void
hal_tx_tlv_record_set_data_ppdu_info(struct hal_tx_ppdu_info * ppdu_info)1389*5113495bSYour Name hal_tx_tlv_record_set_data_ppdu_info(struct hal_tx_ppdu_info *ppdu_info)
1390*5113495bSYour Name {
1391*5113495bSYour Name 	ppdu_info->tx_tlv_info.is_data_ppdu_info = 1;
1392*5113495bSYour Name }
1393*5113495bSYour Name #else
1394*5113495bSYour Name static inline void
hal_tx_tlv_record_set_data_ppdu_info(struct hal_tx_ppdu_info * ppdu_info)1395*5113495bSYour Name hal_tx_tlv_record_set_data_ppdu_info(struct hal_tx_ppdu_info *ppdu_info)
1396*5113495bSYour Name {
1397*5113495bSYour Name }
1398*5113495bSYour Name #endif
1399*5113495bSYour Name /**
1400*5113495bSYour Name  * hal_txmon_get_word_mask_generic_be() - api to get word mask for tx monitor
1401*5113495bSYour Name  * @wmask: pointer to hal_txmon_word_mask_config_t
1402*5113495bSYour Name  *
1403*5113495bSYour Name  * Return: void
1404*5113495bSYour Name  */
1405*5113495bSYour Name static inline
hal_txmon_get_word_mask_generic_be(void * wmask)1406*5113495bSYour Name void hal_txmon_get_word_mask_generic_be(void *wmask)
1407*5113495bSYour Name {
1408*5113495bSYour Name 	hal_txmon_word_mask_config_t *word_mask = NULL;
1409*5113495bSYour Name 
1410*5113495bSYour Name 	word_mask = (hal_txmon_word_mask_config_t *)wmask;
1411*5113495bSYour Name 	qdf_mem_set(word_mask, sizeof(hal_txmon_word_mask_config_t), 0xFF);
1412*5113495bSYour Name 	word_mask->compaction_enable = 0;
1413*5113495bSYour Name }
1414*5113495bSYour Name 
1415*5113495bSYour Name /**
1416*5113495bSYour Name  * hal_tx_get_ppdu_info() - api to get tx ppdu info
1417*5113495bSYour Name  * @data_info: populate dp_ppdu_info data
1418*5113495bSYour Name  * @prot_info: populate dp_ppdu_info protection
1419*5113495bSYour Name  * @tlv_tag: Tag
1420*5113495bSYour Name  *
1421*5113495bSYour Name  * Return: dp_tx_ppdu_info pointer
1422*5113495bSYour Name  */
1423*5113495bSYour Name static inline void *
hal_tx_get_ppdu_info(void * data_info,void * prot_info,uint32_t tlv_tag)1424*5113495bSYour Name hal_tx_get_ppdu_info(void *data_info, void *prot_info, uint32_t tlv_tag)
1425*5113495bSYour Name {
1426*5113495bSYour Name 	struct hal_tx_ppdu_info *prot_ppdu_info = prot_info;
1427*5113495bSYour Name 
1428*5113495bSYour Name 	switch (tlv_tag) {
1429*5113495bSYour Name 	case WIFITX_FES_SETUP_E:/* DOWNSTREAM */
1430*5113495bSYour Name 	case WIFITX_FLUSH_E:/* DOWNSTREAM */
1431*5113495bSYour Name 	case WIFIPCU_PPDU_SETUP_INIT_E:/* DOWNSTREAM */
1432*5113495bSYour Name 	case WIFITX_PEER_ENTRY_E:/* DOWNSTREAM */
1433*5113495bSYour Name 	case WIFITX_QUEUE_EXTENSION_E:/* DOWNSTREAM */
1434*5113495bSYour Name 	case WIFITX_MPDU_START_E:/* DOWNSTREAM */
1435*5113495bSYour Name 	case WIFITX_MSDU_START_E:/* DOWNSTREAM */
1436*5113495bSYour Name 	case WIFITX_DATA_E:/* DOWNSTREAM */
1437*5113495bSYour Name 	case WIFIMON_BUFFER_ADDR_E:/* DOWNSTREAM */
1438*5113495bSYour Name 	case WIFITX_MPDU_END_E:/* DOWNSTREAM */
1439*5113495bSYour Name 	case WIFITX_MSDU_END_E:/* DOWNSTREAM */
1440*5113495bSYour Name 	case WIFITX_LAST_MPDU_FETCHED_E:/* DOWNSTREAM */
1441*5113495bSYour Name 	case WIFITX_LAST_MPDU_END_E:/* DOWNSTREAM */
1442*5113495bSYour Name 	case WIFICOEX_TX_REQ_E:/* DOWNSTREAM */
1443*5113495bSYour Name 	case WIFITX_RAW_OR_NATIVE_FRAME_SETUP_E:/* DOWNSTREAM */
1444*5113495bSYour Name 	case WIFINDP_PREAMBLE_DONE_E:/* DOWNSTREAM */
1445*5113495bSYour Name 	case WIFISCH_CRITICAL_TLV_REFERENCE_E:/* DOWNSTREAM */
1446*5113495bSYour Name 	case WIFITX_LOOPBACK_SETUP_E:/* DOWNSTREAM */
1447*5113495bSYour Name 	case WIFITX_FES_SETUP_COMPLETE_E:/* DOWNSTREAM */
1448*5113495bSYour Name 	case WIFITQM_MPDU_GLOBAL_START_E:/* DOWNSTREAM */
1449*5113495bSYour Name 	case WIFITX_WUR_DATA_E:/* DOWNSTREAM */
1450*5113495bSYour Name 	case WIFISCHEDULER_END_E:/* DOWNSTREAM */
1451*5113495bSYour Name 	case WIFITX_FES_STATUS_START_PPDU_E:/* UPSTREAM */
1452*5113495bSYour Name 	{
1453*5113495bSYour Name 		hal_tx_tlv_record_set_data_ppdu_info(data_info);
1454*5113495bSYour Name 		return data_info;
1455*5113495bSYour Name 	}
1456*5113495bSYour Name 	}
1457*5113495bSYour Name 
1458*5113495bSYour Name 	/*
1459*5113495bSYour Name 	 * check current prot_tlv_status is start protection
1460*5113495bSYour Name 	 * check current tlv_tag is either start protection or end protection
1461*5113495bSYour Name 	 */
1462*5113495bSYour Name 	if (TXMON_HAL(prot_ppdu_info,
1463*5113495bSYour Name 		      prot_tlv_status) == WIFITX_FES_STATUS_START_PROT_E) {
1464*5113495bSYour Name 		return prot_info;
1465*5113495bSYour Name 	} else if (tlv_tag == WIFITX_FES_STATUS_PROT_E ||
1466*5113495bSYour Name 		   tlv_tag == WIFITX_FES_STATUS_START_PROT_E) {
1467*5113495bSYour Name 		TXMON_HAL(prot_ppdu_info, prot_tlv_status) = tlv_tag;
1468*5113495bSYour Name 		return prot_info;
1469*5113495bSYour Name 	}
1470*5113495bSYour Name 
1471*5113495bSYour Name 	hal_tx_tlv_record_set_data_ppdu_info(data_info);
1472*5113495bSYour Name 	return data_info;
1473*5113495bSYour Name }
1474*5113495bSYour Name 
1475*5113495bSYour Name #ifdef MONITOR_TLV_RECORDING_ENABLE
1476*5113495bSYour Name static inline void
hal_tx_record_tlv_info(struct hal_tx_ppdu_info * ppdu_info,uint32_t tlv_tag)1477*5113495bSYour Name hal_tx_record_tlv_info(struct hal_tx_ppdu_info *ppdu_info,
1478*5113495bSYour Name 		       uint32_t tlv_tag)
1479*5113495bSYour Name {
1480*5113495bSYour Name 	ppdu_info->tx_tlv_info.tlv_tag = tlv_tag;
1481*5113495bSYour Name 	switch (tlv_tag) {
1482*5113495bSYour Name 	case WIFITX_FES_SETUP_E:
1483*5113495bSYour Name 	case WIFITXPCU_BUFFER_STATUS_E:
1484*5113495bSYour Name 	case WIFIPCU_PPDU_SETUP_INIT_E:
1485*5113495bSYour Name 	case WIFISCH_CRITICAL_TLV_REFERENCE_E:
1486*5113495bSYour Name 	case WIFITX_PEER_ENTRY_E:
1487*5113495bSYour Name 	case WIFITX_RAW_OR_NATIVE_FRAME_SETUP_E:
1488*5113495bSYour Name 	case WIFITX_QUEUE_EXTENSION_E:
1489*5113495bSYour Name 	case WIFITX_FES_SETUP_COMPLETE_E:
1490*5113495bSYour Name 	case WIFIFW2SW_MON_E:
1491*5113495bSYour Name 	case WIFISCHEDULER_END_E:
1492*5113495bSYour Name 	case WIFITQM_MPDU_GLOBAL_START_E:
1493*5113495bSYour Name 		ppdu_info->tx_tlv_info.tlv_category = CATEGORY_PPDU_START;
1494*5113495bSYour Name 		break;
1495*5113495bSYour Name 
1496*5113495bSYour Name 	case WIFITX_MPDU_START_E:
1497*5113495bSYour Name 	case WIFITX_MSDU_START_E:
1498*5113495bSYour Name 	case WIFITX_DATA_E:
1499*5113495bSYour Name 	case WIFITX_MSDU_END_E:
1500*5113495bSYour Name 	case WIFITX_MPDU_END_E:
1501*5113495bSYour Name 		ppdu_info->tx_tlv_info.tlv_category = CATEGORY_MPDU;
1502*5113495bSYour Name 		break;
1503*5113495bSYour Name 
1504*5113495bSYour Name 	case WIFITX_LAST_MPDU_FETCHED_E:
1505*5113495bSYour Name 	case WIFITX_LAST_MPDU_END_E:
1506*5113495bSYour Name 	case WIFIPDG_TX_REQ_E:
1507*5113495bSYour Name 	case WIFITX_FES_STATUS_START_PPDU_E:
1508*5113495bSYour Name 	case WIFIPHYTX_PPDU_HEADER_INFO_REQUEST_E:
1509*5113495bSYour Name 	case WIFIMACTX_L_SIG_A_E:
1510*5113495bSYour Name 	case WIFITXPCU_PREAMBLE_DONE_E:
1511*5113495bSYour Name 	case WIFIMACTX_USER_DESC_COMMON_E:
1512*5113495bSYour Name 	case WIFIMACTX_SERVICE_E:
1513*5113495bSYour Name 	case WIFITXDMA_STOP_REQUEST_E:
1514*5113495bSYour Name 	case WIFITXPCU_USER_BUFFER_STATUS_E:
1515*5113495bSYour Name 	case WIFITX_FES_STATUS_USER_PPDU_E:
1516*5113495bSYour Name 	case WIFITX_MPDU_COUNT_TRANSFER_END_E:
1517*5113495bSYour Name 	case WIFIRX_START_PARAM_E:
1518*5113495bSYour Name 	case WIFITX_FES_STATUS_ACK_OR_BA_E:
1519*5113495bSYour Name 	case WIFITX_FES_STATUS_USER_RESPONSE_E:
1520*5113495bSYour Name 	case WIFITX_FES_STATUS_END_E:
1521*5113495bSYour Name 	case WIFITX_FES_STATUS_PROT_E:
1522*5113495bSYour Name 	case WIFIMACTX_PHY_DESC_E:
1523*5113495bSYour Name 	case WIFIMACTX_HE_SIG_A_SU_E:
1524*5113495bSYour Name 		ppdu_info->tx_tlv_info.tlv_category = CATEGORY_PPDU_END;
1525*5113495bSYour Name 		break;
1526*5113495bSYour Name 	}
1527*5113495bSYour Name }
1528*5113495bSYour Name #else
1529*5113495bSYour Name static inline void
hal_tx_record_tlv_info(struct hal_tx_ppdu_info * ppdu_info,uint32_t tlv_tag)1530*5113495bSYour Name hal_tx_record_tlv_info(struct hal_tx_ppdu_info *ppdu_info,
1531*5113495bSYour Name 		       uint32_t tlv_tag)
1532*5113495bSYour Name {
1533*5113495bSYour Name }
1534*5113495bSYour Name #endif
1535*5113495bSYour Name 
1536*5113495bSYour Name /**
1537*5113495bSYour Name  * hal_txmon_status_parse_tlv_generic_be() - api to parse status tlv.
1538*5113495bSYour Name  * @data_ppdu_info: hal_txmon data ppdu info
1539*5113495bSYour Name  * @prot_ppdu_info: hal_txmon prot ppdu info
1540*5113495bSYour Name  * @data_status_info: pointer to data status info
1541*5113495bSYour Name  * @prot_status_info: pointer to prot status info
1542*5113495bSYour Name  * @tx_tlv_hdr: fragment of tx_tlv_hdr
1543*5113495bSYour Name  * @status_frag: qdf_frag_t buffer
1544*5113495bSYour Name  *
1545*5113495bSYour Name  * Return: status
1546*5113495bSYour Name  */
1547*5113495bSYour Name static inline uint32_t
hal_txmon_status_parse_tlv_generic_be(void * data_ppdu_info,void * prot_ppdu_info,void * data_status_info,void * prot_status_info,void * tx_tlv_hdr,qdf_frag_t status_frag)1548*5113495bSYour Name hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
1549*5113495bSYour Name 				      void *prot_ppdu_info,
1550*5113495bSYour Name 				      void *data_status_info,
1551*5113495bSYour Name 				      void *prot_status_info,
1552*5113495bSYour Name 				      void *tx_tlv_hdr,
1553*5113495bSYour Name 				      qdf_frag_t status_frag)
1554*5113495bSYour Name {
1555*5113495bSYour Name 	struct hal_tx_ppdu_info *ppdu_info;
1556*5113495bSYour Name 	struct hal_tx_status_info *tx_status_info;
1557*5113495bSYour Name 	struct hal_mon_packet_info *packet_info = NULL;
1558*5113495bSYour Name 	uint32_t tlv_tag, user_id, tlv_len, tlv_user_id;
1559*5113495bSYour Name 	uint32_t status = HAL_MON_TX_STATUS_PPDU_NOT_DONE;
1560*5113495bSYour Name 	void *tx_tlv;
1561*5113495bSYour Name 
1562*5113495bSYour Name 	tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(tx_tlv_hdr);
1563*5113495bSYour Name 	tlv_user_id = HAL_RX_GET_USER_TLV32_USERID(tx_tlv_hdr);
1564*5113495bSYour Name 	tlv_len = HAL_RX_GET_USER_TLV32_LEN(tx_tlv_hdr);
1565*5113495bSYour Name 
1566*5113495bSYour Name 	tx_tlv = (uint8_t *)tx_tlv_hdr + HAL_RX_TLV64_HDR_SIZE;
1567*5113495bSYour Name 
1568*5113495bSYour Name 	/* parse tlv and populate tx_ppdu_info */
1569*5113495bSYour Name 	ppdu_info = hal_tx_get_ppdu_info(data_ppdu_info,
1570*5113495bSYour Name 					 prot_ppdu_info, tlv_tag);
1571*5113495bSYour Name 	tx_status_info = (ppdu_info->is_data ? data_status_info :
1572*5113495bSYour Name 			  prot_status_info);
1573*5113495bSYour Name 
1574*5113495bSYour Name 	user_id = (tlv_user_id > ppdu_info->num_users ? 0 : tlv_user_id);
1575*5113495bSYour Name 	hal_tx_record_tlv_info(ppdu_info, tlv_tag);
1576*5113495bSYour Name 
1577*5113495bSYour Name 	switch (tlv_tag) {
1578*5113495bSYour Name 	/* start of initiator FES window */
1579*5113495bSYour Name 	case WIFITX_FES_SETUP_E:/* DOWNSTREAM - COMPACTION */
1580*5113495bSYour Name 	{
1581*5113495bSYour Name 		/* initiator PPDU window start */
1582*5113495bSYour Name 		hal_txmon_parse_tx_fes_setup(tx_tlv, ppdu_info);
1583*5113495bSYour Name 
1584*5113495bSYour Name 		status = HAL_MON_TX_FES_SETUP;
1585*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_SETUP_E);
1586*5113495bSYour Name 		break;
1587*5113495bSYour Name 	}
1588*5113495bSYour Name 	/* end of initiator FES window */
1589*5113495bSYour Name 	case WIFITX_FES_STATUS_END_E:/* UPSTREAM - COMPACTION */
1590*5113495bSYour Name 	{
1591*5113495bSYour Name 		hal_txmon_parse_tx_fes_status_end(tx_tlv, ppdu_info,
1592*5113495bSYour Name 						  tx_status_info);
1593*5113495bSYour Name 
1594*5113495bSYour Name 		status = HAL_MON_TX_FES_STATUS_END;
1595*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_STATUS_END_E);
1596*5113495bSYour Name 		break;
1597*5113495bSYour Name 	}
1598*5113495bSYour Name 	/* response window open */
1599*5113495bSYour Name 	case WIFIRX_RESPONSE_REQUIRED_INFO_E:/* UPSTREAM */
1600*5113495bSYour Name 	{
1601*5113495bSYour Name 		/* response PPDU window start */
1602*5113495bSYour Name 		uint32_t ppdu_id = 0;
1603*5113495bSYour Name 		uint8_t reception_type = 0;
1604*5113495bSYour Name 		uint8_t response_sta_count = 0;
1605*5113495bSYour Name 
1606*5113495bSYour Name 		status = HAL_MON_RX_RESPONSE_REQUIRED_INFO;
1607*5113495bSYour Name 
1608*5113495bSYour Name 		ppdu_id = HAL_TX_DESC_GET_64(tx_tlv,
1609*5113495bSYour Name 					     RX_RESPONSE_REQUIRED_INFO,
1610*5113495bSYour Name 					     PHY_PPDU_ID);
1611*5113495bSYour Name 		reception_type =
1612*5113495bSYour Name 			HAL_TX_DESC_GET_64(tx_tlv, RX_RESPONSE_REQUIRED_INFO,
1613*5113495bSYour Name 					   SU_OR_UPLINK_MU_RECEPTION);
1614*5113495bSYour Name 		response_sta_count =
1615*5113495bSYour Name 			HAL_TX_DESC_GET_64(tx_tlv, RX_RESPONSE_REQUIRED_INFO,
1616*5113495bSYour Name 					   RESPONSE_STA_COUNT);
1617*5113495bSYour Name 
1618*5113495bSYour Name 		/* get mac address */
1619*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr1[0] =
1620*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
1621*5113495bSYour Name 						   RX_RESPONSE_REQUIRED_INFO,
1622*5113495bSYour Name 						   ADDR1_31_0);
1623*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr1[4] =
1624*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
1625*5113495bSYour Name 						   RX_RESPONSE_REQUIRED_INFO,
1626*5113495bSYour Name 						   ADDR1_47_32);
1627*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr2[0] =
1628*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
1629*5113495bSYour Name 						   RX_RESPONSE_REQUIRED_INFO,
1630*5113495bSYour Name 						   ADDR2_15_0);
1631*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr2[2] =
1632*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
1633*5113495bSYour Name 						   RX_RESPONSE_REQUIRED_INFO,
1634*5113495bSYour Name 						   ADDR2_47_16);
1635*5113495bSYour Name 
1636*5113495bSYour Name 		TXMON_HAL(ppdu_info, ppdu_id) = ppdu_id;
1637*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, ppdu_id) = ppdu_id;
1638*5113495bSYour Name 
1639*5113495bSYour Name 		if (response_sta_count == 0)
1640*5113495bSYour Name 			response_sta_count = 1;
1641*5113495bSYour Name 		TXMON_HAL(ppdu_info, num_users) = response_sta_count;
1642*5113495bSYour Name 
1643*5113495bSYour Name 		if (reception_type)
1644*5113495bSYour Name 			TXMON_STATUS_INFO(tx_status_info,
1645*5113495bSYour Name 					  transmission_type) =
1646*5113495bSYour Name 							TXMON_SU_TRANSMISSION;
1647*5113495bSYour Name 		else
1648*5113495bSYour Name 			TXMON_STATUS_INFO(tx_status_info,
1649*5113495bSYour Name 					  transmission_type) =
1650*5113495bSYour Name 							TXMON_MU_TRANSMISSION;
1651*5113495bSYour Name 
1652*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_RESPONSE_REQUIRED_INFO_E);
1653*5113495bSYour Name 		break;
1654*5113495bSYour Name 	}
1655*5113495bSYour Name 	/* Response window close */
1656*5113495bSYour Name 	case WIFIRESPONSE_END_STATUS_E:/* UPSTREAM - COMPACTION */
1657*5113495bSYour Name 	{
1658*5113495bSYour Name 		/* response PPDU window end */
1659*5113495bSYour Name 		hal_txmon_parse_response_end_status(tx_tlv, ppdu_info,
1660*5113495bSYour Name 						    tx_status_info);
1661*5113495bSYour Name 
1662*5113495bSYour Name 		status = HAL_MON_RESPONSE_END_STATUS_INFO;
1663*5113495bSYour Name 		SHOW_DEFINED(WIFIRESPONSE_END_STATUS_E);
1664*5113495bSYour Name 		break;
1665*5113495bSYour Name 	}
1666*5113495bSYour Name 	case WIFITX_FLUSH_E:/* DOWNSTREAM */
1667*5113495bSYour Name 	{
1668*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FLUSH_E);
1669*5113495bSYour Name 		break;
1670*5113495bSYour Name 	}
1671*5113495bSYour Name 	/* Downstream tlv */
1672*5113495bSYour Name 	case WIFIPCU_PPDU_SETUP_INIT_E:/* DOWNSTREAM - COMPACTION */
1673*5113495bSYour Name 	{
1674*5113495bSYour Name 		hal_txmon_parse_pcu_ppdu_setup_init(tx_tlv, data_status_info,
1675*5113495bSYour Name 						    prot_status_info);
1676*5113495bSYour Name 		status = HAL_MON_TX_PCU_PPDU_SETUP_INIT;
1677*5113495bSYour Name 		SHOW_DEFINED(WIFIPCU_PPDU_SETUP_INIT_E);
1678*5113495bSYour Name 		break;
1679*5113495bSYour Name 	}
1680*5113495bSYour Name 	case WIFITX_PEER_ENTRY_E:/* DOWNSTREAM - COMPACTION */
1681*5113495bSYour Name 	{
1682*5113495bSYour Name 		hal_txmon_parse_peer_entry(tx_tlv, user_id,
1683*5113495bSYour Name 					   ppdu_info, tx_status_info);
1684*5113495bSYour Name 		SHOW_DEFINED(WIFITX_PEER_ENTRY_E);
1685*5113495bSYour Name 		break;
1686*5113495bSYour Name 	}
1687*5113495bSYour Name 	case WIFITX_QUEUE_EXTENSION_E:/* DOWNSTREAM - COMPACTION */
1688*5113495bSYour Name 	{
1689*5113495bSYour Name 		status = HAL_MON_TX_QUEUE_EXTENSION;
1690*5113495bSYour Name 		hal_txmon_parse_queue_exten(tx_tlv, ppdu_info);
1691*5113495bSYour Name 
1692*5113495bSYour Name 		SHOW_DEFINED(WIFITX_QUEUE_EXTENSION_E);
1693*5113495bSYour Name 		break;
1694*5113495bSYour Name 	}
1695*5113495bSYour Name 	/* payload and data frame handling */
1696*5113495bSYour Name 	case WIFITX_MPDU_START_E:/* DOWNSTREAM - COMPACTION */
1697*5113495bSYour Name 	{
1698*5113495bSYour Name 		hal_txmon_parse_mpdu_start(tx_tlv, user_id, ppdu_info);
1699*5113495bSYour Name 
1700*5113495bSYour Name 		status = HAL_MON_TX_MPDU_START;
1701*5113495bSYour Name 		SHOW_DEFINED(WIFITX_MPDU_START_E);
1702*5113495bSYour Name 		break;
1703*5113495bSYour Name 	}
1704*5113495bSYour Name 	case WIFITX_MSDU_START_E:/* DOWNSTREAM - COMPACTION */
1705*5113495bSYour Name 	{
1706*5113495bSYour Name 		hal_txmon_parse_msdu_start(tx_tlv, user_id, ppdu_info);
1707*5113495bSYour Name 		/* we expect frame to be 802.11 frame type */
1708*5113495bSYour Name 		status = HAL_MON_TX_MSDU_START;
1709*5113495bSYour Name 		SHOW_DEFINED(WIFITX_MSDU_START_E);
1710*5113495bSYour Name 		break;
1711*5113495bSYour Name 	}
1712*5113495bSYour Name 	case WIFITX_DATA_E:/* DOWNSTREAM */
1713*5113495bSYour Name 	{
1714*5113495bSYour Name 		status = HAL_MON_TX_DATA;
1715*5113495bSYour Name 		/*
1716*5113495bSYour Name 		 * TODO: do we need a conversion api to convert
1717*5113495bSYour Name 		 * user_id from hw to get host user_index
1718*5113495bSYour Name 		 */
1719*5113495bSYour Name 		TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
1720*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info,
1721*5113495bSYour Name 				  buffer) = (void *)status_frag;
1722*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info,
1723*5113495bSYour Name 				  offset) = ((void *)tx_tlv -
1724*5113495bSYour Name 					     (void *)status_frag);
1725*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info,
1726*5113495bSYour Name 				  length) = tlv_len;
1727*5113495bSYour Name 
1728*5113495bSYour Name 		/*
1729*5113495bSYour Name 		 * reference of the status buffer will be held in
1730*5113495bSYour Name 		 * dp_tx_update_ppdu_info_status()
1731*5113495bSYour Name 		 */
1732*5113495bSYour Name 		SHOW_DEFINED(WIFITX_DATA_E);
1733*5113495bSYour Name 		break;
1734*5113495bSYour Name 	}
1735*5113495bSYour Name 	case WIFIMON_BUFFER_ADDR_E:/* DOWNSTREAM */
1736*5113495bSYour Name 	{
1737*5113495bSYour Name 		packet_info = &ppdu_info->packet_info;
1738*5113495bSYour Name 		status = HAL_MON_TX_BUFFER_ADDR;
1739*5113495bSYour Name 		/*
1740*5113495bSYour Name 		 * TODO: do we need a conversion api to convert
1741*5113495bSYour Name 		 * user_id from hw to get host user_index
1742*5113495bSYour Name 		 */
1743*5113495bSYour Name 		TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
1744*5113495bSYour Name 
1745*5113495bSYour Name 		hal_txmon_populate_packet_info_generic_be(tx_tlv, packet_info);
1746*5113495bSYour Name 
1747*5113495bSYour Name 		SHOW_DEFINED(WIFIMON_BUFFER_ADDR_E);
1748*5113495bSYour Name 		break;
1749*5113495bSYour Name 	}
1750*5113495bSYour Name 	case WIFITX_MPDU_END_E:/* DOWNSTREAM */
1751*5113495bSYour Name 	{
1752*5113495bSYour Name 		/* no tlv content */
1753*5113495bSYour Name 		SHOW_DEFINED(WIFITX_MPDU_END_E);
1754*5113495bSYour Name 		break;
1755*5113495bSYour Name 	}
1756*5113495bSYour Name 	case WIFITX_MSDU_END_E:/* DOWNSTREAM */
1757*5113495bSYour Name 	{
1758*5113495bSYour Name 		/* no tlv content */
1759*5113495bSYour Name 		SHOW_DEFINED(WIFITX_MSDU_END_E);
1760*5113495bSYour Name 		break;
1761*5113495bSYour Name 	}
1762*5113495bSYour Name 	case WIFITX_LAST_MPDU_FETCHED_E:/* DOWNSTREAM */
1763*5113495bSYour Name 	{
1764*5113495bSYour Name 		/* no tlv content */
1765*5113495bSYour Name 		SHOW_DEFINED(WIFITX_LAST_MPDU_FETCHED_E);
1766*5113495bSYour Name 		break;
1767*5113495bSYour Name 	}
1768*5113495bSYour Name 	case WIFITX_LAST_MPDU_END_E:/* DOWNSTREAM */
1769*5113495bSYour Name 	{
1770*5113495bSYour Name 		/* no tlv content */
1771*5113495bSYour Name 		SHOW_DEFINED(WIFITX_LAST_MPDU_END_E);
1772*5113495bSYour Name 		break;
1773*5113495bSYour Name 	}
1774*5113495bSYour Name 	case WIFICOEX_TX_REQ_E:/* DOWNSTREAM */
1775*5113495bSYour Name 	{
1776*5113495bSYour Name 		/*
1777*5113495bSYour Name 		 * transmitting power
1778*5113495bSYour Name 		 * minimum transmitting power
1779*5113495bSYour Name 		 * desired nss
1780*5113495bSYour Name 		 * tx chain mask
1781*5113495bSYour Name 		 * desired bw
1782*5113495bSYour Name 		 * duration of transmit and response
1783*5113495bSYour Name 		 *
1784*5113495bSYour Name 		 * since most of the field we are deriving from other tlv
1785*5113495bSYour Name 		 * we don't need to enable this in our tlv.
1786*5113495bSYour Name 		 */
1787*5113495bSYour Name 		SHOW_DEFINED(WIFICOEX_TX_REQ_E);
1788*5113495bSYour Name 		break;
1789*5113495bSYour Name 	}
1790*5113495bSYour Name 	case WIFITX_RAW_OR_NATIVE_FRAME_SETUP_E:/* DOWNSTREAM */
1791*5113495bSYour Name 	{
1792*5113495bSYour Name 		/* user tlv */
1793*5113495bSYour Name 		/*
1794*5113495bSYour Name 		 * All Tx monitor will have 802.11 hdr
1795*5113495bSYour Name 		 * we don't need to enable this TLV
1796*5113495bSYour Name 		 */
1797*5113495bSYour Name 		SHOW_DEFINED(WIFITX_RAW_OR_NATIVE_FRAME_SETUP_E);
1798*5113495bSYour Name 		break;
1799*5113495bSYour Name 	}
1800*5113495bSYour Name 	case WIFINDP_PREAMBLE_DONE_E:/* DOWNSTREAM */
1801*5113495bSYour Name 	{
1802*5113495bSYour Name 		/*
1803*5113495bSYour Name 		 * no tlv content
1804*5113495bSYour Name 		 *
1805*5113495bSYour Name 		 * TLV that indicates to TXPCU that preamble phase for the NDP
1806*5113495bSYour Name 		 * frame transmission is now over
1807*5113495bSYour Name 		 */
1808*5113495bSYour Name 		SHOW_DEFINED(WIFINDP_PREAMBLE_DONE_E);
1809*5113495bSYour Name 		break;
1810*5113495bSYour Name 	}
1811*5113495bSYour Name 	case WIFISCH_CRITICAL_TLV_REFERENCE_E:/* DOWNSTREAM */
1812*5113495bSYour Name 	{
1813*5113495bSYour Name 		/*
1814*5113495bSYour Name 		 * no tlv content
1815*5113495bSYour Name 		 *
1816*5113495bSYour Name 		 * TLV indicates to the SCH that all timing critical TLV
1817*5113495bSYour Name 		 * has been passed on to the transmit path
1818*5113495bSYour Name 		 */
1819*5113495bSYour Name 		SHOW_DEFINED(WIFISCH_CRITICAL_TLV_REFERENCE_E);
1820*5113495bSYour Name 		break;
1821*5113495bSYour Name 	}
1822*5113495bSYour Name 	case WIFITX_LOOPBACK_SETUP_E:/* DOWNSTREAM */
1823*5113495bSYour Name 	{
1824*5113495bSYour Name 		/*
1825*5113495bSYour Name 		 * Loopback specific setup info - not needed for Tx monitor
1826*5113495bSYour Name 		 */
1827*5113495bSYour Name 		SHOW_DEFINED(WIFITX_LOOPBACK_SETUP_E);
1828*5113495bSYour Name 		break;
1829*5113495bSYour Name 	}
1830*5113495bSYour Name 	case WIFITX_FES_SETUP_COMPLETE_E:/* DOWNSTREAM */
1831*5113495bSYour Name 	{
1832*5113495bSYour Name 		/*
1833*5113495bSYour Name 		 * no tlv content
1834*5113495bSYour Name 		 *
1835*5113495bSYour Name 		 * TLV indicates that other modules besides the scheduler can
1836*5113495bSYour Name 		 * now also start generating TLV's
1837*5113495bSYour Name 		 * prevent colliding or generating TLV's out of order
1838*5113495bSYour Name 		 */
1839*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_SETUP_COMPLETE_E);
1840*5113495bSYour Name 		break;
1841*5113495bSYour Name 	}
1842*5113495bSYour Name 	case WIFITQM_MPDU_GLOBAL_START_E:/* DOWNSTREAM */
1843*5113495bSYour Name 	{
1844*5113495bSYour Name 		/*
1845*5113495bSYour Name 		 * no tlv content
1846*5113495bSYour Name 		 *
1847*5113495bSYour Name 		 * TLV indicates to SCH that a burst of MPDU info will
1848*5113495bSYour Name 		 * start to come in over the TLV
1849*5113495bSYour Name 		 */
1850*5113495bSYour Name 		SHOW_DEFINED(WIFITQM_MPDU_GLOBAL_START_E);
1851*5113495bSYour Name 		break;
1852*5113495bSYour Name 	}
1853*5113495bSYour Name 	case WIFITX_WUR_DATA_E:/* DOWNSTREAM */
1854*5113495bSYour Name 	{
1855*5113495bSYour Name 		SHOW_DEFINED(WIFITX_WUR_DATA_E);
1856*5113495bSYour Name 		break;
1857*5113495bSYour Name 	}
1858*5113495bSYour Name 	case WIFISCHEDULER_END_E:/* DOWNSTREAM */
1859*5113495bSYour Name 	{
1860*5113495bSYour Name 		/*
1861*5113495bSYour Name 		 * no tlv content
1862*5113495bSYour Name 		 *
1863*5113495bSYour Name 		 * TLV indicates END of all TLV's within the scheduler TLV
1864*5113495bSYour Name 		 */
1865*5113495bSYour Name 		SHOW_DEFINED(WIFISCHEDULER_END_E);
1866*5113495bSYour Name 		break;
1867*5113495bSYour Name 	}
1868*5113495bSYour Name 
1869*5113495bSYour Name 	/* Upstream tlv */
1870*5113495bSYour Name 	case WIFIPDG_TX_REQ_E:
1871*5113495bSYour Name 	{
1872*5113495bSYour Name 		SHOW_DEFINED(WIFIPDG_TX_REQ_E);
1873*5113495bSYour Name 		break;
1874*5113495bSYour Name 	}
1875*5113495bSYour Name 	case WIFITX_FES_STATUS_START_E:
1876*5113495bSYour Name 	{
1877*5113495bSYour Name 		/*
1878*5113495bSYour Name 		 * TLV indicating that first transmission on the medium
1879*5113495bSYour Name 		 */
1880*5113495bSYour Name 		uint8_t medium_prot_type = 0;
1881*5113495bSYour Name 
1882*5113495bSYour Name 		status = HAL_MON_TX_FES_STATUS_START;
1883*5113495bSYour Name 
1884*5113495bSYour Name 		medium_prot_type = HAL_TX_DESC_GET_64(tx_tlv,
1885*5113495bSYour Name 						      TX_FES_STATUS_START,
1886*5113495bSYour Name 						      MEDIUM_PROT_TYPE);
1887*5113495bSYour Name 
1888*5113495bSYour Name 		ppdu_info = (struct hal_tx_ppdu_info *)prot_ppdu_info;
1889*5113495bSYour Name 		/* update what type of medium protection frame */
1890*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info,
1891*5113495bSYour Name 				  medium_prot_type) = medium_prot_type;
1892*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_STATUS_START_E);
1893*5113495bSYour Name 		break;
1894*5113495bSYour Name 	}
1895*5113495bSYour Name 	case WIFITX_FES_STATUS_PROT_E:/* UPSTREAM - COMPACTION */
1896*5113495bSYour Name 	{
1897*5113495bSYour Name 		hal_txmon_parse_tx_fes_status_prot(tx_tlv, ppdu_info,
1898*5113495bSYour Name 						   tx_status_info);
1899*5113495bSYour Name 
1900*5113495bSYour Name 		status = HAL_MON_TX_FES_STATUS_PROT;
1901*5113495bSYour Name 		TXMON_HAL(ppdu_info, prot_tlv_status) = tlv_tag;
1902*5113495bSYour Name 
1903*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_STATUS_PROT_E);
1904*5113495bSYour Name 		break;
1905*5113495bSYour Name 	}
1906*5113495bSYour Name 	case WIFITX_FES_STATUS_START_PROT_E:
1907*5113495bSYour Name 	{
1908*5113495bSYour Name 		uint64_t tsft_64;
1909*5113495bSYour Name 		uint32_t response_type;
1910*5113495bSYour Name 		status = HAL_MON_TX_FES_STATUS_START_PROT;
1911*5113495bSYour Name 		TXMON_HAL(ppdu_info, prot_tlv_status) = tlv_tag;
1912*5113495bSYour Name 		/* timestamp */
1913*5113495bSYour Name 		tsft_64 = HAL_TX_DESC_GET_64(tx_tlv,
1914*5113495bSYour Name 					     TX_FES_STATUS_START_PROT,
1915*5113495bSYour Name 					     PROT_TIMESTAMP_LOWER_32);
1916*5113495bSYour Name 		tsft_64 |= (HAL_TX_DESC_GET_64(tx_tlv,
1917*5113495bSYour Name 					       TX_FES_STATUS_START_PROT,
1918*5113495bSYour Name 					       PROT_TIMESTAMP_UPPER_32) << 32);
1919*5113495bSYour Name 
1920*5113495bSYour Name 		response_type = HAL_TX_DESC_GET_64(tx_tlv,
1921*5113495bSYour Name 						   TX_FES_STATUS_START_PROT,
1922*5113495bSYour Name 						   RESPONSE_TYPE);
1923*5113495bSYour Name 
1924*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info,
1925*5113495bSYour Name 				  response_type) = response_type;
1926*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, tsft) = tsft_64;
1927*5113495bSYour Name 
1928*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_STATUS_START_PROT_E);
1929*5113495bSYour Name 		break;
1930*5113495bSYour Name 	}
1931*5113495bSYour Name 	case WIFIPROT_TX_END_E:
1932*5113495bSYour Name 	{
1933*5113495bSYour Name 		/*
1934*5113495bSYour Name 		 * no tlv content
1935*5113495bSYour Name 		 *
1936*5113495bSYour Name 		 * generated by TXPCU the moment that protection frame
1937*5113495bSYour Name 		 * transmission has finished on the medium
1938*5113495bSYour Name 		 */
1939*5113495bSYour Name 		SHOW_DEFINED(WIFIPROT_TX_END_E);
1940*5113495bSYour Name 		break;
1941*5113495bSYour Name 	}
1942*5113495bSYour Name 	case WIFITX_FES_STATUS_START_PPDU_E:
1943*5113495bSYour Name 	{
1944*5113495bSYour Name 		uint64_t tsft_64;
1945*5113495bSYour Name 		uint8_t ndp_frame;
1946*5113495bSYour Name 
1947*5113495bSYour Name 		status = HAL_MON_TX_FES_STATUS_START_PPDU;
1948*5113495bSYour Name 		tsft_64 = HAL_TX_DESC_GET_64(tx_tlv,
1949*5113495bSYour Name 					     TX_FES_STATUS_START_PPDU,
1950*5113495bSYour Name 					     PPDU_TIMESTAMP_LOWER_32);
1951*5113495bSYour Name 		tsft_64 |= (HAL_TX_DESC_GET_64(tx_tlv,
1952*5113495bSYour Name 					       TX_FES_STATUS_START_PPDU,
1953*5113495bSYour Name 					       PPDU_TIMESTAMP_UPPER_32) << 32);
1954*5113495bSYour Name 
1955*5113495bSYour Name 		ndp_frame = HAL_TX_DESC_GET_64(tx_tlv,
1956*5113495bSYour Name 					       TX_FES_STATUS_START_PPDU,
1957*5113495bSYour Name 					       NDP_FRAME);
1958*5113495bSYour Name 
1959*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info, ndp_frame) = ndp_frame;
1960*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, tsft) = tsft_64;
1961*5113495bSYour Name 
1962*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_STATUS_START_PPDU_E);
1963*5113495bSYour Name 		break;
1964*5113495bSYour Name 	}
1965*5113495bSYour Name 	case WIFITX_FES_STATUS_USER_PPDU_E:
1966*5113495bSYour Name 	{
1967*5113495bSYour Name 		/* user tlv */
1968*5113495bSYour Name 		uint16_t duration;
1969*5113495bSYour Name 		uint8_t transmitted_tid;
1970*5113495bSYour Name 
1971*5113495bSYour Name 		duration = HAL_TX_DESC_GET_64(tx_tlv,
1972*5113495bSYour Name 					      TX_FES_STATUS_USER_PPDU,
1973*5113495bSYour Name 					      DURATION);
1974*5113495bSYour Name 		transmitted_tid = HAL_TX_DESC_GET_64(tx_tlv,
1975*5113495bSYour Name 						     TX_FES_STATUS_USER_PPDU,
1976*5113495bSYour Name 						     TRANSMITTED_TID);
1977*5113495bSYour Name 
1978*5113495bSYour Name 		TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
1979*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, tid) = transmitted_tid;
1980*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, duration) = duration;
1981*5113495bSYour Name 
1982*5113495bSYour Name 		status = HAL_MON_TX_FES_STATUS_USER_PPDU;
1983*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_STATUS_USER_PPDU_E);
1984*5113495bSYour Name 		break;
1985*5113495bSYour Name 	}
1986*5113495bSYour Name 	case WIFIPPDU_TX_END_E:
1987*5113495bSYour Name 	{
1988*5113495bSYour Name 		/*
1989*5113495bSYour Name 		 * no tlv content
1990*5113495bSYour Name 		 *
1991*5113495bSYour Name 		 * generated by TXPCU the moment that PPDU transmission has
1992*5113495bSYour Name 		 * finished on the medium
1993*5113495bSYour Name 		 */
1994*5113495bSYour Name 		SHOW_DEFINED(WIFIPPDU_TX_END_E);
1995*5113495bSYour Name 		break;
1996*5113495bSYour Name 	}
1997*5113495bSYour Name 
1998*5113495bSYour Name 	case WIFITX_FES_STATUS_USER_RESPONSE_E:
1999*5113495bSYour Name 	{
2000*5113495bSYour Name 		/*
2001*5113495bSYour Name 		 * TLV contains the FES transmit result of the each
2002*5113495bSYour Name 		 * of the MAC users. TLV are forwarded to HWSCH
2003*5113495bSYour Name 		 */
2004*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_STATUS_USER_RESPONSE_E);
2005*5113495bSYour Name 		break;
2006*5113495bSYour Name 	}
2007*5113495bSYour Name 	case WIFITX_FES_STATUS_ACK_OR_BA_E:
2008*5113495bSYour Name 	{
2009*5113495bSYour Name 		/* user tlv */
2010*5113495bSYour Name 		/*
2011*5113495bSYour Name 		 * TLV generated by RXPCU and provide information related to
2012*5113495bSYour Name 		 * the received BA or ACK frame
2013*5113495bSYour Name 		 */
2014*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_STATUS_ACK_OR_BA_E);
2015*5113495bSYour Name 		break;
2016*5113495bSYour Name 	}
2017*5113495bSYour Name 	case WIFITX_FES_STATUS_1K_BA_E:
2018*5113495bSYour Name 	{
2019*5113495bSYour Name 		/* user tlv */
2020*5113495bSYour Name 		/*
2021*5113495bSYour Name 		 * TLV generated by RXPCU and providing information related
2022*5113495bSYour Name 		 * to the received BA frame in case of 512/1024 bitmaps
2023*5113495bSYour Name 		 */
2024*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FES_STATUS_1K_BA_E);
2025*5113495bSYour Name 		break;
2026*5113495bSYour Name 	}
2027*5113495bSYour Name 	case WIFIRECEIVED_RESPONSE_USER_7_0_E:
2028*5113495bSYour Name 	{
2029*5113495bSYour Name 		SHOW_DEFINED(WIFIRECEIVED_RESPONSE_USER_7_0_E);
2030*5113495bSYour Name 		break;
2031*5113495bSYour Name 	}
2032*5113495bSYour Name 	case WIFIRECEIVED_RESPONSE_USER_15_8_E:
2033*5113495bSYour Name 	{
2034*5113495bSYour Name 		SHOW_DEFINED(WIFIRECEIVED_RESPONSE_USER_15_8_E);
2035*5113495bSYour Name 		break;
2036*5113495bSYour Name 	}
2037*5113495bSYour Name 	case WIFIRECEIVED_RESPONSE_USER_23_16_E:
2038*5113495bSYour Name 	{
2039*5113495bSYour Name 		SHOW_DEFINED(WIFIRECEIVED_RESPONSE_USER_23_16_E);
2040*5113495bSYour Name 		break;
2041*5113495bSYour Name 	}
2042*5113495bSYour Name 	case WIFIRECEIVED_RESPONSE_USER_31_24_E:
2043*5113495bSYour Name 	{
2044*5113495bSYour Name 		SHOW_DEFINED(WIFIRECEIVED_RESPONSE_USER_31_24_E);
2045*5113495bSYour Name 		break;
2046*5113495bSYour Name 	}
2047*5113495bSYour Name 	case WIFIRECEIVED_RESPONSE_USER_36_32_E:
2048*5113495bSYour Name 	{
2049*5113495bSYour Name 		/*
2050*5113495bSYour Name 		 * RXPCU generates this TLV when it receives a response frame
2051*5113495bSYour Name 		 * that TXPCU pre-announced it was waiting for and in
2052*5113495bSYour Name 		 * RXPCU_SETUP TLV, TLV generated before the
2053*5113495bSYour Name 		 * RECEIVED_RESPONSE_INFO TLV.
2054*5113495bSYour Name 		 *
2055*5113495bSYour Name 		 * received info user fields are there which is not needed
2056*5113495bSYour Name 		 * for TX monitor
2057*5113495bSYour Name 		 */
2058*5113495bSYour Name 		SHOW_DEFINED(WIFIRECEIVED_RESPONSE_USER_36_32_E);
2059*5113495bSYour Name 		break;
2060*5113495bSYour Name 	}
2061*5113495bSYour Name 
2062*5113495bSYour Name 	case WIFITXPCU_BUFFER_STATUS_E:
2063*5113495bSYour Name 	{
2064*5113495bSYour Name 		SHOW_DEFINED(WIFITXPCU_BUFFER_STATUS_E);
2065*5113495bSYour Name 		break;
2066*5113495bSYour Name 	}
2067*5113495bSYour Name 	case WIFITXPCU_USER_BUFFER_STATUS_E:
2068*5113495bSYour Name 	{
2069*5113495bSYour Name 		/*
2070*5113495bSYour Name 		 * WIFITXPCU_USER_BUFFER_STATUS_E - user tlv
2071*5113495bSYour Name 		 * for TX monitor we aren't interested in this tlv
2072*5113495bSYour Name 		 */
2073*5113495bSYour Name 		SHOW_DEFINED(WIFITXPCU_USER_BUFFER_STATUS_E);
2074*5113495bSYour Name 		break;
2075*5113495bSYour Name 	}
2076*5113495bSYour Name 	case WIFITXDMA_STOP_REQUEST_E:
2077*5113495bSYour Name 	{
2078*5113495bSYour Name 		/*
2079*5113495bSYour Name 		 * no tlv content
2080*5113495bSYour Name 		 *
2081*5113495bSYour Name 		 * TLV is destined to TXDMA and informs TXDMA to stop
2082*5113495bSYour Name 		 * pushing data into the transmit path.
2083*5113495bSYour Name 		 */
2084*5113495bSYour Name 		SHOW_DEFINED(WIFITXDMA_STOP_REQUEST_E);
2085*5113495bSYour Name 		break;
2086*5113495bSYour Name 	}
2087*5113495bSYour Name 	case WIFITX_CBF_INFO_E:
2088*5113495bSYour Name 	{
2089*5113495bSYour Name 		/*
2090*5113495bSYour Name 		 * After NDPA + NDP is received, RXPCU sends the TX_CBF_INFO to
2091*5113495bSYour Name 		 * TXPCU to respond the CBF frame
2092*5113495bSYour Name 		 *
2093*5113495bSYour Name 		 * compressed beamforming pkt doesn't has mac header
2094*5113495bSYour Name 		 * Tx monitor not interested in this pkt.
2095*5113495bSYour Name 		 */
2096*5113495bSYour Name 		SHOW_DEFINED(WIFITX_CBF_INFO_E);
2097*5113495bSYour Name 		break;
2098*5113495bSYour Name 	}
2099*5113495bSYour Name 	case WIFITX_MPDU_COUNT_TRANSFER_END_E:
2100*5113495bSYour Name 	{
2101*5113495bSYour Name 		/*
2102*5113495bSYour Name 		 * no tlv content
2103*5113495bSYour Name 		 *
2104*5113495bSYour Name 		 * TLV indicates that TXPCU has finished generating the
2105*5113495bSYour Name 		 * TQM_UPDATE_TX_MPDU_COUNT TLV for all users
2106*5113495bSYour Name 		 */
2107*5113495bSYour Name 		SHOW_DEFINED(WIFITX_MPDU_COUNT_TRANSFER_END_E);
2108*5113495bSYour Name 		break;
2109*5113495bSYour Name 	}
2110*5113495bSYour Name 	case WIFIPDG_RESPONSE_E:
2111*5113495bSYour Name 	{
2112*5113495bSYour Name 		/*
2113*5113495bSYour Name 		 * most of the feilds are already covered in
2114*5113495bSYour Name 		 * other TLV
2115*5113495bSYour Name 		 * This is generated by TX_PCU to PDG to calculate
2116*5113495bSYour Name 		 * all the PHY header info.
2117*5113495bSYour Name 		 *
2118*5113495bSYour Name 		 * some useful fields like min transmit power,
2119*5113495bSYour Name 		 * rate used for transmitting packet is present.
2120*5113495bSYour Name 		 */
2121*5113495bSYour Name 		SHOW_DEFINED(WIFIPDG_RESPONSE_E);
2122*5113495bSYour Name 		break;
2123*5113495bSYour Name 	}
2124*5113495bSYour Name 	case WIFIPDG_TRIG_RESPONSE_E:
2125*5113495bSYour Name 	{
2126*5113495bSYour Name 		/* no tlv content */
2127*5113495bSYour Name 		SHOW_DEFINED(WIFIPDG_TRIG_RESPONSE_E);
2128*5113495bSYour Name 		break;
2129*5113495bSYour Name 	}
2130*5113495bSYour Name 	case WIFIRECEIVED_TRIGGER_INFO_E:
2131*5113495bSYour Name 	{
2132*5113495bSYour Name 		/*
2133*5113495bSYour Name 		 * TLV generated by RXPCU to inform the scheduler that
2134*5113495bSYour Name 		 * a trigger frame has been received
2135*5113495bSYour Name 		 */
2136*5113495bSYour Name 		SHOW_DEFINED(WIFIRECEIVED_TRIGGER_INFO_E);
2137*5113495bSYour Name 		break;
2138*5113495bSYour Name 	}
2139*5113495bSYour Name 	case WIFIOFDMA_TRIGGER_DETAILS_E:
2140*5113495bSYour Name 	{
2141*5113495bSYour Name 		SHOW_DEFINED(WIFIOFDMA_TRIGGER_DETAILS_E);
2142*5113495bSYour Name 		break;
2143*5113495bSYour Name 	}
2144*5113495bSYour Name 	case WIFIRX_FRAME_BITMAP_ACK_E:
2145*5113495bSYour Name 	{
2146*5113495bSYour Name 		/* user tlv */
2147*5113495bSYour Name 		status = HAL_MON_RX_FRAME_BITMAP_ACK;
2148*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_FRAME_BITMAP_ACK_E);
2149*5113495bSYour Name 		TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
2150*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info, no_bitmap_avail) =
2151*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2152*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2153*5113495bSYour Name 							   NO_BITMAP_AVAILABLE);
2154*5113495bSYour Name 
2155*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info, explicit_ack) =
2156*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2157*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2158*5113495bSYour Name 							   EXPLICIT_ACK);
2159*5113495bSYour Name 		/*
2160*5113495bSYour Name 		 * get mac address, since address is received frame
2161*5113495bSYour Name 		 * change the order and store it
2162*5113495bSYour Name 		 */
2163*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr2[0] =
2164*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2165*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2166*5113495bSYour Name 							   ADDR1_31_0);
2167*5113495bSYour Name 		*(uint16_t *)&tx_status_info->addr2[4] =
2168*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2169*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2170*5113495bSYour Name 							   ADDR1_47_32);
2171*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr1[0] =
2172*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2173*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2174*5113495bSYour Name 							   ADDR2_15_0);
2175*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr1[2] =
2176*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2177*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2178*5113495bSYour Name 							   ADDR2_47_16);
2179*5113495bSYour Name 
2180*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info, explicit_ack_type) =
2181*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv, RX_FRAME_BITMAP_ACK,
2182*5113495bSYour Name 						   EXPLICT_ACK_TYPE);
2183*5113495bSYour Name 
2184*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, tid) =
2185*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2186*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2187*5113495bSYour Name 							   BA_TID);
2188*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, aid) =
2189*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2190*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2191*5113495bSYour Name 							   STA_FULL_AID);
2192*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, start_seq) =
2193*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2194*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2195*5113495bSYour Name 							   BA_TS_SEQ);
2196*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, ba_control) =
2197*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2198*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2199*5113495bSYour Name 							   BA_TS_CTRL);
2200*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, ba_bitmap_sz) =
2201*5113495bSYour Name 					HAL_TX_DESC_GET_64(tx_tlv,
2202*5113495bSYour Name 							   RX_FRAME_BITMAP_ACK,
2203*5113495bSYour Name 							   BA_BITMAP_SIZE);
2204*5113495bSYour Name 
2205*5113495bSYour Name 		/* ba bitmap */
2206*5113495bSYour Name 		qdf_mem_copy(TXMON_HAL_USER(ppdu_info, user_id, ba_bitmap),
2207*5113495bSYour Name 			     &HAL_SET_FLD_OFFSET_64(tx_tlv,
2208*5113495bSYour Name 						    RX_FRAME_BITMAP_ACK,
2209*5113495bSYour Name 						    BA_TS_BITMAP_31_0, 0), 32);
2210*5113495bSYour Name 
2211*5113495bSYour Name 		break;
2212*5113495bSYour Name 	}
2213*5113495bSYour Name 	case WIFIRX_FRAME_1K_BITMAP_ACK_E:
2214*5113495bSYour Name 	{
2215*5113495bSYour Name 		/* user tlv */
2216*5113495bSYour Name 		status = HAL_MON_RX_FRAME_BITMAP_BLOCK_ACK_1K;
2217*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_FRAME_1K_BITMAP_ACK_E);
2218*5113495bSYour Name 		TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
2219*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, ba_bitmap_sz) =
2220*5113495bSYour Name 			(4 + HAL_TX_DESC_GET_64(tx_tlv, RX_FRAME_1K_BITMAP_ACK,
2221*5113495bSYour Name 						BA_BITMAP_SIZE));
2222*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, tid) =
2223*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
2224*5113495bSYour Name 						   RX_FRAME_1K_BITMAP_ACK,
2225*5113495bSYour Name 						   BA_TID);
2226*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, aid) =
2227*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
2228*5113495bSYour Name 						   RX_FRAME_1K_BITMAP_ACK,
2229*5113495bSYour Name 						   STA_FULL_AID);
2230*5113495bSYour Name 		/* get mac address */
2231*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr1[0] =
2232*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
2233*5113495bSYour Name 						   RX_FRAME_1K_BITMAP_ACK,
2234*5113495bSYour Name 						   ADDR1_31_0);
2235*5113495bSYour Name 		*(uint16_t *)&tx_status_info->addr1[4] =
2236*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
2237*5113495bSYour Name 						   RX_FRAME_1K_BITMAP_ACK,
2238*5113495bSYour Name 						   ADDR1_47_32);
2239*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr2[0] =
2240*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
2241*5113495bSYour Name 						   RX_FRAME_1K_BITMAP_ACK,
2242*5113495bSYour Name 						   ADDR2_15_0);
2243*5113495bSYour Name 		*(uint32_t *)&tx_status_info->addr2[2] =
2244*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
2245*5113495bSYour Name 						   RX_FRAME_1K_BITMAP_ACK,
2246*5113495bSYour Name 						   ADDR2_47_16);
2247*5113495bSYour Name 
2248*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, start_seq) =
2249*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
2250*5113495bSYour Name 						   RX_FRAME_1K_BITMAP_ACK,
2251*5113495bSYour Name 						   BA_TS_SEQ);
2252*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, ba_control) =
2253*5113495bSYour Name 				HAL_TX_DESC_GET_64(tx_tlv,
2254*5113495bSYour Name 						   RX_FRAME_1K_BITMAP_ACK,
2255*5113495bSYour Name 						   BA_TS_CTRL);
2256*5113495bSYour Name 		/* memcpy  ba bitmap */
2257*5113495bSYour Name 		qdf_mem_copy(TXMON_HAL_USER(ppdu_info, user_id, ba_bitmap),
2258*5113495bSYour Name 			     &HAL_SET_FLD_OFFSET_64(tx_tlv,
2259*5113495bSYour Name 						    RX_FRAME_1K_BITMAP_ACK,
2260*5113495bSYour Name 						    BA_TS_BITMAP_31_0, 0),
2261*5113495bSYour Name 			     4 << TXMON_HAL_USER(ppdu_info,
2262*5113495bSYour Name 						 user_id, ba_bitmap_sz));
2263*5113495bSYour Name 
2264*5113495bSYour Name 		break;
2265*5113495bSYour Name 	}
2266*5113495bSYour Name 	case WIFIRESPONSE_START_STATUS_E:
2267*5113495bSYour Name 	{
2268*5113495bSYour Name 		/*
2269*5113495bSYour Name 		 * TLV indicates which HW response the TXPCU
2270*5113495bSYour Name 		 * started generating
2271*5113495bSYour Name 		 *
2272*5113495bSYour Name 		 * HW generated frames like
2273*5113495bSYour Name 		 * ACK frame - handled
2274*5113495bSYour Name 		 * CTS frame - handled
2275*5113495bSYour Name 		 * BA frame - handled
2276*5113495bSYour Name 		 * MBA frame - handled
2277*5113495bSYour Name 		 * CBF frame - no frame header
2278*5113495bSYour Name 		 * Trigger response - TODO
2279*5113495bSYour Name 		 * NDP LMR - no frame header
2280*5113495bSYour Name 		 */
2281*5113495bSYour Name 		SHOW_DEFINED(WIFIRESPONSE_START_STATUS_E);
2282*5113495bSYour Name 		break;
2283*5113495bSYour Name 	}
2284*5113495bSYour Name 	case WIFIRX_START_PARAM_E:
2285*5113495bSYour Name 	{
2286*5113495bSYour Name 		/*
2287*5113495bSYour Name 		 * RXPCU send this TLV after PHY RX detected a frame
2288*5113495bSYour Name 		 * in the medium
2289*5113495bSYour Name 		 *
2290*5113495bSYour Name 		 * TX monitor not interested in this TLV
2291*5113495bSYour Name 		 */
2292*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_START_PARAM_E);
2293*5113495bSYour Name 		break;
2294*5113495bSYour Name 	}
2295*5113495bSYour Name 	case WIFIRXPCU_EARLY_RX_INDICATION_E:
2296*5113495bSYour Name 	{
2297*5113495bSYour Name 		/*
2298*5113495bSYour Name 		 * early indication of pkt type and mcs rate
2299*5113495bSYour Name 		 * already captured in other tlv
2300*5113495bSYour Name 		 */
2301*5113495bSYour Name 		SHOW_DEFINED(WIFIRXPCU_EARLY_RX_INDICATION_E);
2302*5113495bSYour Name 		break;
2303*5113495bSYour Name 	}
2304*5113495bSYour Name 	case WIFIRX_PM_INFO_E:
2305*5113495bSYour Name 	{
2306*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_PM_INFO_E);
2307*5113495bSYour Name 		break;
2308*5113495bSYour Name 	}
2309*5113495bSYour Name 
2310*5113495bSYour Name 	/* Active window */
2311*5113495bSYour Name 	case WIFITX_FLUSH_REQ_E:
2312*5113495bSYour Name 	{
2313*5113495bSYour Name 		SHOW_DEFINED(WIFITX_FLUSH_REQ_E);
2314*5113495bSYour Name 		break;
2315*5113495bSYour Name 	}
2316*5113495bSYour Name 	case WIFICOEX_TX_STATUS_E:
2317*5113495bSYour Name 	{
2318*5113495bSYour Name 		/* duration are retrieved from coex tx status */
2319*5113495bSYour Name 		uint16_t duration;
2320*5113495bSYour Name 		uint8_t status_reason;
2321*5113495bSYour Name 
2322*5113495bSYour Name 		status = HAL_MON_COEX_TX_STATUS;
2323*5113495bSYour Name 		duration = HAL_TX_DESC_GET_64(tx_tlv,
2324*5113495bSYour Name 					      COEX_TX_STATUS,
2325*5113495bSYour Name 					      CURRENT_TX_DURATION);
2326*5113495bSYour Name 		status_reason = HAL_TX_DESC_GET_64(tx_tlv,
2327*5113495bSYour Name 						   COEX_TX_STATUS,
2328*5113495bSYour Name 						   TX_STATUS_REASON);
2329*5113495bSYour Name 
2330*5113495bSYour Name 		/* update duration */
2331*5113495bSYour Name 		if (status_reason == COEX_FES_TX_START ||
2332*5113495bSYour Name 		    status_reason == COEX_RESPONSE_TX_START)
2333*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, user_id, duration) = duration;
2334*5113495bSYour Name 
2335*5113495bSYour Name 		SHOW_DEFINED(WIFICOEX_TX_STATUS_E);
2336*5113495bSYour Name 		break;
2337*5113495bSYour Name 	}
2338*5113495bSYour Name 	case WIFIR2R_STATUS_END_E:
2339*5113495bSYour Name 	{
2340*5113495bSYour Name 		SHOW_DEFINED(WIFIR2R_STATUS_END_E);
2341*5113495bSYour Name 		break;
2342*5113495bSYour Name 	}
2343*5113495bSYour Name 	case WIFIRX_PREAMBLE_E:
2344*5113495bSYour Name 	{
2345*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_PREAMBLE_E);
2346*5113495bSYour Name 		break;
2347*5113495bSYour Name 	}
2348*5113495bSYour Name 	case WIFIMACTX_SERVICE_E:
2349*5113495bSYour Name 	{
2350*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_SERVICE_E);
2351*5113495bSYour Name 		break;
2352*5113495bSYour Name 	}
2353*5113495bSYour Name 
2354*5113495bSYour Name 	case WIFIMACTX_U_SIG_EHT_SU_MU_E:
2355*5113495bSYour Name 	{
2356*5113495bSYour Name 		struct hal_mon_usig_hdr *usig = NULL;
2357*5113495bSYour Name 		struct hal_mon_usig_mu *usig_mu = NULL;
2358*5113495bSYour Name 
2359*5113495bSYour Name 		usig = (struct hal_mon_usig_hdr *)tx_tlv;
2360*5113495bSYour Name 		usig_mu = &usig->usig_2.mu;
2361*5113495bSYour Name 
2362*5113495bSYour Name 		hal_txmon_parse_u_sig_hdr(tx_tlv, ppdu_info);
2363*5113495bSYour Name 
2364*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_mask) |=
2365*5113495bSYour Name 			QDF_MON_STATUS_USIG_DISREGARD_KNOWN |
2366*5113495bSYour Name 			QDF_MON_STATUS_USIG_PPDU_TYPE_N_COMP_MODE_KNOWN |
2367*5113495bSYour Name 			QDF_MON_STATUS_USIG_VALIDATE_KNOWN |
2368*5113495bSYour Name 			QDF_MON_STATUS_USIG_MU_VALIDATE1_KNOWN |
2369*5113495bSYour Name 			QDF_MON_STATUS_USIG_MU_PUNCTURE_CH_INFO_KNOWN |
2370*5113495bSYour Name 			QDF_MON_STATUS_USIG_MU_VALIDATE2_KNOWN |
2371*5113495bSYour Name 			QDF_MON_STATUS_USIG_MU_EHT_SIG_MCS_KNOWN |
2372*5113495bSYour Name 			QDF_MON_STATUS_USIG_MU_NUM_EHT_SIG_SYM_KNOWN |
2373*5113495bSYour Name 			QDF_MON_STATUS_USIG_CRC_KNOWN |
2374*5113495bSYour Name 			QDF_MON_STATUS_USIG_TAIL_KNOWN;
2375*5113495bSYour Name 
2376*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2377*5113495bSYour Name 			(0x1F << QDF_MON_STATUS_USIG_DISREGARD_SHIFT);
2378*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2379*5113495bSYour Name 			(0x1 << QDF_MON_STATUS_USIG_MU_VALIDATE1_SHIFT);
2380*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2381*5113495bSYour Name 			(usig_mu->ppdu_type_comp_mode <<
2382*5113495bSYour Name 			 QDF_MON_STATUS_USIG_PPDU_TYPE_N_COMP_MODE_SHIFT);
2383*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2384*5113495bSYour Name 			(0x1 << QDF_MON_STATUS_USIG_VALIDATE_SHIFT);
2385*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2386*5113495bSYour Name 			(usig_mu->punc_ch_info <<
2387*5113495bSYour Name 			 QDF_MON_STATUS_USIG_MU_PUNCTURE_CH_INFO_SHIFT);
2388*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2389*5113495bSYour Name 			(0x1 << QDF_MON_STATUS_USIG_MU_VALIDATE2_SHIFT);
2390*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2391*5113495bSYour Name 			(usig_mu->eht_sig_mcs <<
2392*5113495bSYour Name 			 QDF_MON_STATUS_USIG_MU_EHT_SIG_MCS_SHIFT);
2393*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2394*5113495bSYour Name 			(usig_mu->num_eht_sig_sym <<
2395*5113495bSYour Name 			 QDF_MON_STATUS_USIG_MU_NUM_EHT_SIG_SYM_SHIFT);
2396*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2397*5113495bSYour Name 			(usig_mu->crc << QDF_MON_STATUS_USIG_CRC_SHIFT);
2398*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2399*5113495bSYour Name 			(usig_mu->tail << QDF_MON_STATUS_USIG_TAIL_SHIFT);
2400*5113495bSYour Name 
2401*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_U_SIG_EHT_SU_MU_E);
2402*5113495bSYour Name 		break;
2403*5113495bSYour Name 	}
2404*5113495bSYour Name 	case WIFIMACTX_U_SIG_EHT_TB_E:
2405*5113495bSYour Name 	{
2406*5113495bSYour Name 		struct hal_mon_usig_hdr *usig = NULL;
2407*5113495bSYour Name 		struct hal_mon_usig_tb *usig_tb = NULL;
2408*5113495bSYour Name 
2409*5113495bSYour Name 		usig = (struct hal_mon_usig_hdr *)tx_tlv;
2410*5113495bSYour Name 		usig_tb = &usig->usig_2.tb;
2411*5113495bSYour Name 
2412*5113495bSYour Name 		hal_txmon_parse_u_sig_hdr(tx_tlv, ppdu_info);
2413*5113495bSYour Name 
2414*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_mask) |=
2415*5113495bSYour Name 			QDF_MON_STATUS_USIG_DISREGARD_KNOWN |
2416*5113495bSYour Name 			QDF_MON_STATUS_USIG_PPDU_TYPE_N_COMP_MODE_KNOWN |
2417*5113495bSYour Name 			QDF_MON_STATUS_USIG_VALIDATE_KNOWN |
2418*5113495bSYour Name 			QDF_MON_STATUS_USIG_TB_SPATIAL_REUSE_1_KNOWN |
2419*5113495bSYour Name 			QDF_MON_STATUS_USIG_TB_SPATIAL_REUSE_2_KNOWN |
2420*5113495bSYour Name 			QDF_MON_STATUS_USIG_TB_DISREGARD1_KNOWN |
2421*5113495bSYour Name 			QDF_MON_STATUS_USIG_CRC_KNOWN |
2422*5113495bSYour Name 			QDF_MON_STATUS_USIG_TAIL_KNOWN;
2423*5113495bSYour Name 
2424*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2425*5113495bSYour Name 			(0x3F << QDF_MON_STATUS_USIG_DISREGARD_SHIFT);
2426*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2427*5113495bSYour Name 			(usig_tb->ppdu_type_comp_mode <<
2428*5113495bSYour Name 			 QDF_MON_STATUS_USIG_PPDU_TYPE_N_COMP_MODE_SHIFT);
2429*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2430*5113495bSYour Name 			(0x1 << QDF_MON_STATUS_USIG_VALIDATE_SHIFT);
2431*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2432*5113495bSYour Name 			(usig_tb->spatial_reuse_1 <<
2433*5113495bSYour Name 			 QDF_MON_STATUS_USIG_TB_SPATIAL_REUSE_1_SHIFT);
2434*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2435*5113495bSYour Name 			(usig_tb->spatial_reuse_2 <<
2436*5113495bSYour Name 			 QDF_MON_STATUS_USIG_TB_SPATIAL_REUSE_2_SHIFT);
2437*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2438*5113495bSYour Name 			(0x1F << QDF_MON_STATUS_USIG_TB_DISREGARD1_SHIFT);
2439*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2440*5113495bSYour Name 			(usig_tb->crc << QDF_MON_STATUS_USIG_CRC_SHIFT);
2441*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, usig_value) |=
2442*5113495bSYour Name 			(usig_tb->tail << QDF_MON_STATUS_USIG_TAIL_SHIFT);
2443*5113495bSYour Name 
2444*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_U_SIG_EHT_TB_E);
2445*5113495bSYour Name 		break;
2446*5113495bSYour Name 	}
2447*5113495bSYour Name 	case WIFIMACTX_EHT_SIG_USR_OFDMA_E:
2448*5113495bSYour Name 	{
2449*5113495bSYour Name 		hal_txmon_parse_eht_sig_non_mumimo_user_info(tx_tlv, user_id,
2450*5113495bSYour Name 							     ppdu_info);
2451*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, eht_flags) = 1;
2452*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_EHT_SIG_USR_OFDMA_E);
2453*5113495bSYour Name 		break;
2454*5113495bSYour Name 	}
2455*5113495bSYour Name 	case WIFIMACTX_EHT_SIG_USR_MU_MIMO_E:
2456*5113495bSYour Name 	{
2457*5113495bSYour Name 		hal_txmon_parse_eht_sig_mumimo_user_info(tx_tlv, user_id,
2458*5113495bSYour Name 							 ppdu_info);
2459*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, eht_flags) = 1;
2460*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_EHT_SIG_USR_MU_MIMO_E);
2461*5113495bSYour Name 		break;
2462*5113495bSYour Name 	}
2463*5113495bSYour Name 	case WIFIMACTX_EHT_SIG_USR_SU_E:
2464*5113495bSYour Name 	{
2465*5113495bSYour Name 		hal_txmon_parse_eht_sig_non_mumimo_user_info(tx_tlv, user_id,
2466*5113495bSYour Name 							     ppdu_info);
2467*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, eht_flags) = 1;
2468*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_EHT_SIG_USR_SU_E);
2469*5113495bSYour Name 		/* TODO: no radiotap info available */
2470*5113495bSYour Name 		break;
2471*5113495bSYour Name 	}
2472*5113495bSYour Name 
2473*5113495bSYour Name 	case WIFIMACTX_HE_SIG_A_SU_E:
2474*5113495bSYour Name 	{
2475*5113495bSYour Name 		uint16_t he_mu_flag_1 = 0;
2476*5113495bSYour Name 		uint16_t he_mu_flag_2 = 0;
2477*5113495bSYour Name 		uint16_t num_users = 0;
2478*5113495bSYour Name 		uint8_t mcs_of_sig_b = 0;
2479*5113495bSYour Name 		uint8_t dcm_of_sig_b = 0;
2480*5113495bSYour Name 		uint8_t sig_a_bw = 0;
2481*5113495bSYour Name 		uint8_t i = 0;
2482*5113495bSYour Name 		uint8_t bss_color_id;
2483*5113495bSYour Name 		uint8_t coding;
2484*5113495bSYour Name 		uint8_t stbc;
2485*5113495bSYour Name 		uint8_t a_factor;
2486*5113495bSYour Name 		uint8_t pe_disambiguity;
2487*5113495bSYour Name 		uint8_t txbf;
2488*5113495bSYour Name 		uint8_t txbw;
2489*5113495bSYour Name 		uint8_t txop;
2490*5113495bSYour Name 
2491*5113495bSYour Name 		status = HAL_MON_MACTX_HE_SIG_A_SU;
2492*5113495bSYour Name 		num_users = TXMON_HAL(ppdu_info, num_users);
2493*5113495bSYour Name 
2494*5113495bSYour Name 		mcs_of_sig_b = HAL_TX_DESC_GET_64(tx_tlv,
2495*5113495bSYour Name 						  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2496*5113495bSYour Name 						  TRANSMIT_MCS);
2497*5113495bSYour Name 		dcm_of_sig_b = HAL_TX_DESC_GET_64(tx_tlv,
2498*5113495bSYour Name 						  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2499*5113495bSYour Name 						  DCM);
2500*5113495bSYour Name 		sig_a_bw = HAL_TX_DESC_GET_64(tx_tlv,
2501*5113495bSYour Name 					      MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2502*5113495bSYour Name 					      TRANSMIT_BW);
2503*5113495bSYour Name 
2504*5113495bSYour Name 		bss_color_id = HAL_TX_DESC_GET_64(tx_tlv,
2505*5113495bSYour Name 						  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2506*5113495bSYour Name 						  BSS_COLOR_ID);
2507*5113495bSYour Name 		coding = HAL_TX_DESC_GET_64(tx_tlv,
2508*5113495bSYour Name 					    MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2509*5113495bSYour Name 					    CODING);
2510*5113495bSYour Name 		stbc = HAL_TX_DESC_GET_64(tx_tlv,
2511*5113495bSYour Name 					  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2512*5113495bSYour Name 					  STBC);
2513*5113495bSYour Name 		a_factor = HAL_TX_DESC_GET_64(tx_tlv,
2514*5113495bSYour Name 					      MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2515*5113495bSYour Name 					      PACKET_EXTENSION_A_FACTOR);
2516*5113495bSYour Name 		pe_disambiguity = HAL_TX_DESC_GET_64(tx_tlv,
2517*5113495bSYour Name 						     MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2518*5113495bSYour Name 						     PACKET_EXTENSION_PE_DISAMBIGUITY);
2519*5113495bSYour Name 		txbf = HAL_TX_DESC_GET_64(tx_tlv,
2520*5113495bSYour Name 					  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2521*5113495bSYour Name 					  TXBF);
2522*5113495bSYour Name 		txbw = HAL_TX_DESC_GET_64(tx_tlv,
2523*5113495bSYour Name 					  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2524*5113495bSYour Name 					  TRANSMIT_BW);
2525*5113495bSYour Name 		txop = HAL_TX_DESC_GET_64(tx_tlv,
2526*5113495bSYour Name 					  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
2527*5113495bSYour Name 					  TXOP_DURATION);
2528*5113495bSYour Name 
2529*5113495bSYour Name 		he_mu_flag_1 |= QDF_MON_STATUS_SIG_B_MCS_KNOWN |
2530*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_DCM_KNOWN |
2531*5113495bSYour Name 				QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_KNOWN |
2532*5113495bSYour Name 				QDF_MON_STATUS_CHANNEL_1_RU_KNOWN |
2533*5113495bSYour Name 				QDF_MON_STATUS_CHANNEL_2_RU_KNOWN |
2534*5113495bSYour Name 				QDF_MON_STATUS_CHANNEL_1_CENTER_26_RU_KNOWN;
2535*5113495bSYour Name 
2536*5113495bSYour Name 		/* MCS */
2537*5113495bSYour Name 		he_mu_flag_1 |= mcs_of_sig_b <<
2538*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_MCS_SHIFT;
2539*5113495bSYour Name 		/* DCM */
2540*5113495bSYour Name 		he_mu_flag_1 |= dcm_of_sig_b <<
2541*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_DCM_SHIFT;
2542*5113495bSYour Name 		/* bandwidth */
2543*5113495bSYour Name 		he_mu_flag_2 |= QDF_MON_STATUS_SIG_A_BANDWIDTH_KNOWN;
2544*5113495bSYour Name 		he_mu_flag_2 |= sig_a_bw <<
2545*5113495bSYour Name 				QDF_MON_STATUS_SIG_A_BANDWIDTH_SHIFT;
2546*5113495bSYour Name 
2547*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info,
2548*5113495bSYour Name 				 he_mu_flags) = IS_MULTI_USERS(num_users);
2549*5113495bSYour Name 		for (i = 0; i < num_users; i++) {
2550*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_flags1) |= he_mu_flag_1;
2551*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_flags2) |= he_mu_flag_2;
2552*5113495bSYour Name 		}
2553*5113495bSYour Name 
2554*5113495bSYour Name 		/* HE data 1 */
2555*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data1) |=
2556*5113495bSYour Name 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
2557*5113495bSYour Name 			QDF_MON_STATUS_HE_CODING_KNOWN;
2558*5113495bSYour Name 
2559*5113495bSYour Name 		/* HE data 2 */
2560*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data2) |=
2561*5113495bSYour Name 			QDF_MON_STATUS_TXBF_KNOWN |
2562*5113495bSYour Name 			QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
2563*5113495bSYour Name 			QDF_MON_STATUS_TXOP_KNOWN |
2564*5113495bSYour Name 			QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
2565*5113495bSYour Name 			QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
2566*5113495bSYour Name 
2567*5113495bSYour Name 		/* HE data 3 */
2568*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |=
2569*5113495bSYour Name 			bss_color_id |
2570*5113495bSYour Name 			(!!txbf << QDF_MON_STATUS_BEAM_CHANGE_SHIFT) |
2571*5113495bSYour Name 			(coding << QDF_MON_STATUS_CODING_SHIFT) |
2572*5113495bSYour Name 			(stbc << QDF_MON_STATUS_STBC_SHIFT);
2573*5113495bSYour Name 
2574*5113495bSYour Name 		/* HE data 6 */
2575*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data6) |=
2576*5113495bSYour Name 				(txop << QDF_MON_STATUS_TXOP_SHIFT);
2577*5113495bSYour Name 
2578*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_HE_SIG_A_SU_E);
2579*5113495bSYour Name 		break;
2580*5113495bSYour Name 	}
2581*5113495bSYour Name 	case WIFIMACTX_HE_SIG_A_MU_DL_E:
2582*5113495bSYour Name 	{
2583*5113495bSYour Name 		uint16_t he_mu_flag_1 = 0;
2584*5113495bSYour Name 		uint16_t he_mu_flag_2 = 0;
2585*5113495bSYour Name 		uint16_t num_users = 0;
2586*5113495bSYour Name 		uint8_t bss_color_id;
2587*5113495bSYour Name 		uint8_t txop;
2588*5113495bSYour Name 		uint8_t mcs_of_sig_b = 0;
2589*5113495bSYour Name 		uint8_t dcm_of_sig_b = 0;
2590*5113495bSYour Name 		uint8_t sig_a_bw = 0;
2591*5113495bSYour Name 		uint8_t num_sig_b_symb = 0;
2592*5113495bSYour Name 		uint8_t comp_mode_sig_b = 0;
2593*5113495bSYour Name 		uint8_t punc_bw = 0;
2594*5113495bSYour Name 		uint8_t i = 0;
2595*5113495bSYour Name 
2596*5113495bSYour Name 		status = HAL_MON_MACTX_HE_SIG_A_MU_DL;
2597*5113495bSYour Name 		num_users = TXMON_HAL(ppdu_info, num_users);
2598*5113495bSYour Name 
2599*5113495bSYour Name 		mcs_of_sig_b = HAL_TX_DESC_GET_64(tx_tlv,
2600*5113495bSYour Name 						  MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
2601*5113495bSYour Name 						  MCS_OF_SIG_B);
2602*5113495bSYour Name 		dcm_of_sig_b = HAL_TX_DESC_GET_64(tx_tlv,
2603*5113495bSYour Name 						  MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
2604*5113495bSYour Name 						  DCM_OF_SIG_B);
2605*5113495bSYour Name 		sig_a_bw = HAL_TX_DESC_GET_64(tx_tlv,
2606*5113495bSYour Name 					      MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
2607*5113495bSYour Name 					      TRANSMIT_BW);
2608*5113495bSYour Name 		num_sig_b_symb = HAL_TX_DESC_GET_64(tx_tlv,
2609*5113495bSYour Name 						    MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
2610*5113495bSYour Name 						    NUM_SIG_B_SYMBOLS);
2611*5113495bSYour Name 		comp_mode_sig_b = HAL_TX_DESC_GET_64(tx_tlv,
2612*5113495bSYour Name 						     MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
2613*5113495bSYour Name 						     COMP_MODE_SIG_B);
2614*5113495bSYour Name 		bss_color_id = HAL_TX_DESC_GET_64(tx_tlv,
2615*5113495bSYour Name 						  MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
2616*5113495bSYour Name 						  BSS_COLOR_ID);
2617*5113495bSYour Name 		txop = HAL_TX_DESC_GET_64(tx_tlv,
2618*5113495bSYour Name 					  MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
2619*5113495bSYour Name 					  TXOP_DURATION);
2620*5113495bSYour Name 
2621*5113495bSYour Name 		he_mu_flag_1 |= QDF_MON_STATUS_SIG_B_MCS_KNOWN |
2622*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_DCM_KNOWN |
2623*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_SYM_NUM_KNOWN |
2624*5113495bSYour Name 				QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_KNOWN |
2625*5113495bSYour Name 				QDF_MON_STATUS_CHANNEL_1_RU_KNOWN |
2626*5113495bSYour Name 				QDF_MON_STATUS_CHANNEL_2_RU_KNOWN |
2627*5113495bSYour Name 				QDF_MON_STATUS_CHANNEL_1_CENTER_26_RU_KNOWN |
2628*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_1_KNOWN |
2629*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_SYMBOL_USER_KNOWN;
2630*5113495bSYour Name 
2631*5113495bSYour Name 		/* MCS */
2632*5113495bSYour Name 		he_mu_flag_1 |= mcs_of_sig_b <<
2633*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_MCS_SHIFT;
2634*5113495bSYour Name 		/* DCM */
2635*5113495bSYour Name 		he_mu_flag_1 |= dcm_of_sig_b <<
2636*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_DCM_SHIFT;
2637*5113495bSYour Name 		/* Compression */
2638*5113495bSYour Name 		he_mu_flag_2 |= comp_mode_sig_b <<
2639*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT;
2640*5113495bSYour Name 		/* bandwidth */
2641*5113495bSYour Name 		he_mu_flag_2 |= QDF_MON_STATUS_SIG_A_BANDWIDTH_KNOWN;
2642*5113495bSYour Name 		he_mu_flag_2 |= sig_a_bw <<
2643*5113495bSYour Name 				QDF_MON_STATUS_SIG_A_BANDWIDTH_SHIFT;
2644*5113495bSYour Name 		he_mu_flag_2 |= comp_mode_sig_b <<
2645*5113495bSYour Name 				QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT;
2646*5113495bSYour Name 		/* number of symbol */
2647*5113495bSYour Name 		he_mu_flag_2 |= num_sig_b_symb <<
2648*5113495bSYour Name 				QDF_MON_STATUS_NUM_SIG_B_SYMBOLS_SHIFT;
2649*5113495bSYour Name 		/* puncture bw */
2650*5113495bSYour Name 		he_mu_flag_2 |= QDF_MON_STATUS_SIG_A_PUNC_BANDWIDTH_KNOWN;
2651*5113495bSYour Name 		punc_bw = sig_a_bw;
2652*5113495bSYour Name 		he_mu_flag_2 |=
2653*5113495bSYour Name 			punc_bw << QDF_MON_STATUS_SIG_A_PUNC_BANDWIDTH_SHIFT;
2654*5113495bSYour Name 
2655*5113495bSYour Name 		/* copy per user info to all user */
2656*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info,
2657*5113495bSYour Name 				 he_mu_flags) = IS_MULTI_USERS(num_users);
2658*5113495bSYour Name 		for (i = 0; i < num_users; i++) {
2659*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_flags1) |= he_mu_flag_1;
2660*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_flags2) |= he_mu_flag_2;
2661*5113495bSYour Name 		}
2662*5113495bSYour Name 
2663*5113495bSYour Name 		/* HE data 1 */
2664*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data1) |=
2665*5113495bSYour Name 				QDF_MON_STATUS_HE_BSS_COLOR_KNOWN;
2666*5113495bSYour Name 
2667*5113495bSYour Name 		/* HE data 2 */
2668*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data2) |=
2669*5113495bSYour Name 				QDF_MON_STATUS_TXOP_KNOWN;
2670*5113495bSYour Name 
2671*5113495bSYour Name 		/* HE data 3 */
2672*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |= bss_color_id;
2673*5113495bSYour Name 
2674*5113495bSYour Name 		/* HE data 6 */
2675*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data6) |=
2676*5113495bSYour Name 				(txop << QDF_MON_STATUS_TXOP_SHIFT);
2677*5113495bSYour Name 
2678*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_HE_SIG_A_MU_DL_E);
2679*5113495bSYour Name 		break;
2680*5113495bSYour Name 	}
2681*5113495bSYour Name 	case WIFIMACTX_HE_SIG_A_MU_UL_E:
2682*5113495bSYour Name 	{
2683*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_HE_SIG_A_MU_UL_E);
2684*5113495bSYour Name 		break;
2685*5113495bSYour Name 	}
2686*5113495bSYour Name 	case WIFIMACTX_HE_SIG_B1_MU_E:
2687*5113495bSYour Name 	{
2688*5113495bSYour Name 		status = HAL_MON_MACTX_HE_SIG_B1_MU;
2689*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_HE_SIG_B1_MU_E);
2690*5113495bSYour Name 		break;
2691*5113495bSYour Name 	}
2692*5113495bSYour Name 	case WIFIMACTX_HE_SIG_B2_MU_E:
2693*5113495bSYour Name 	{
2694*5113495bSYour Name 		/* user tlv */
2695*5113495bSYour Name 		uint16_t sta_id = 0;
2696*5113495bSYour Name 		uint16_t sta_spatial_config = 0;
2697*5113495bSYour Name 		uint8_t sta_mcs = 0;
2698*5113495bSYour Name 		uint8_t coding = 0;
2699*5113495bSYour Name 		uint8_t nss = 0;
2700*5113495bSYour Name 		uint8_t user_order = 0;
2701*5113495bSYour Name 
2702*5113495bSYour Name 		status = HAL_MON_MACTX_HE_SIG_B2_MU;
2703*5113495bSYour Name 
2704*5113495bSYour Name 		TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
2705*5113495bSYour Name 
2706*5113495bSYour Name 		sta_id = HAL_TX_DESC_GET_64(tx_tlv,
2707*5113495bSYour Name 					    MACTX_HE_SIG_B2_MU_MACTX_HE_SIG_B2_MU_INFO_DETAILS,
2708*5113495bSYour Name 					    STA_ID);
2709*5113495bSYour Name 		sta_spatial_config = HAL_TX_DESC_GET_64(tx_tlv,
2710*5113495bSYour Name 							MACTX_HE_SIG_B2_MU_MACTX_HE_SIG_B2_MU_INFO_DETAILS,
2711*5113495bSYour Name 							STA_SPATIAL_CONFIG);
2712*5113495bSYour Name 		sta_mcs = HAL_TX_DESC_GET_64(tx_tlv,
2713*5113495bSYour Name 					     MACTX_HE_SIG_B2_MU_MACTX_HE_SIG_B2_MU_INFO_DETAILS,
2714*5113495bSYour Name 					     STA_MCS);
2715*5113495bSYour Name 		coding = HAL_TX_DESC_GET_64(tx_tlv,
2716*5113495bSYour Name 					    MACTX_HE_SIG_B2_MU_MACTX_HE_SIG_B2_MU_INFO_DETAILS,
2717*5113495bSYour Name 					    STA_CODING);
2718*5113495bSYour Name 		nss = HAL_TX_DESC_GET_64(tx_tlv,
2719*5113495bSYour Name 					 MACTX_HE_SIG_B2_MU_MACTX_HE_SIG_B2_MU_INFO_DETAILS,
2720*5113495bSYour Name 					 NSTS) + 1;
2721*5113495bSYour Name 		user_order = HAL_TX_DESC_GET_64(tx_tlv,
2722*5113495bSYour Name 						MACTX_HE_SIG_B2_MU_MACTX_HE_SIG_B2_MU_INFO_DETAILS,
2723*5113495bSYour Name 						USER_ORDER);
2724*5113495bSYour Name 
2725*5113495bSYour Name 		/* HE data 1 */
2726*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data1) |=
2727*5113495bSYour Name 				QDF_MON_STATUS_HE_MCS_KNOWN |
2728*5113495bSYour Name 				QDF_MON_STATUS_HE_CODING_KNOWN;
2729*5113495bSYour Name 		/* HE data 2 */
2730*5113495bSYour Name 
2731*5113495bSYour Name 		/* HE data 3 */
2732*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, mcs) = sta_mcs;
2733*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |=
2734*5113495bSYour Name 				sta_mcs << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
2735*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |=
2736*5113495bSYour Name 				coding << QDF_MON_STATUS_CODING_SHIFT;
2737*5113495bSYour Name 
2738*5113495bSYour Name 		/* HE data 4 */
2739*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data4) |=
2740*5113495bSYour Name 				sta_id << QDF_MON_STATUS_STA_ID_SHIFT;
2741*5113495bSYour Name 
2742*5113495bSYour Name 		/* HE data 5 */
2743*5113495bSYour Name 
2744*5113495bSYour Name 		/* HE data 6 */
2745*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, nss) = nss;
2746*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data6) |= nss;
2747*5113495bSYour Name 
2748*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_HE_SIG_B2_MU_E);
2749*5113495bSYour Name 		break;
2750*5113495bSYour Name 	}
2751*5113495bSYour Name 	case WIFIMACTX_HE_SIG_B2_OFDMA_E:
2752*5113495bSYour Name 	{
2753*5113495bSYour Name 		/* user tlv */
2754*5113495bSYour Name 		uint8_t *he_sig_b2_ofdma_info = NULL;
2755*5113495bSYour Name 		uint16_t sta_id = 0;
2756*5113495bSYour Name 		uint8_t nss = 0;
2757*5113495bSYour Name 		uint8_t txbf = 0;
2758*5113495bSYour Name 		uint8_t sta_mcs = 0;
2759*5113495bSYour Name 		uint8_t sta_dcm = 0;
2760*5113495bSYour Name 		uint8_t coding = 0;
2761*5113495bSYour Name 		uint8_t user_order = 0;
2762*5113495bSYour Name 
2763*5113495bSYour Name 		status = HAL_MON_MACTX_HE_SIG_B2_OFDMA;
2764*5113495bSYour Name 
2765*5113495bSYour Name 		TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
2766*5113495bSYour Name 
2767*5113495bSYour Name 		he_sig_b2_ofdma_info = (uint8_t *)tx_tlv +
2768*5113495bSYour Name 			HAL_OFFSET(MACTX_HE_SIG_B2_OFDMA_MACTX_HE_SIG_B2_OFDMA_INFO_DETAILS,
2769*5113495bSYour Name 				   STA_ID);
2770*5113495bSYour Name 
2771*5113495bSYour Name 		sta_id = HAL_TX_DESC_GET_64(tx_tlv,
2772*5113495bSYour Name 					    MACTX_HE_SIG_B2_OFDMA_MACTX_HE_SIG_B2_OFDMA_INFO_DETAILS,
2773*5113495bSYour Name 					    STA_ID);
2774*5113495bSYour Name 		nss = HAL_TX_DESC_GET_64(tx_tlv,
2775*5113495bSYour Name 					 MACTX_HE_SIG_B2_OFDMA_MACTX_HE_SIG_B2_OFDMA_INFO_DETAILS,
2776*5113495bSYour Name 					 NSTS);
2777*5113495bSYour Name 		txbf = HAL_TX_DESC_GET_64(tx_tlv,
2778*5113495bSYour Name 					  MACTX_HE_SIG_B2_OFDMA_MACTX_HE_SIG_B2_OFDMA_INFO_DETAILS,
2779*5113495bSYour Name 					  TXBF);
2780*5113495bSYour Name 		sta_mcs = HAL_TX_DESC_GET_64(tx_tlv,
2781*5113495bSYour Name 					     MACTX_HE_SIG_B2_OFDMA_MACTX_HE_SIG_B2_OFDMA_INFO_DETAILS,
2782*5113495bSYour Name 					     STA_MCS);
2783*5113495bSYour Name 		sta_dcm = HAL_TX_DESC_GET_64(tx_tlv,
2784*5113495bSYour Name 					     MACTX_HE_SIG_B2_OFDMA_MACTX_HE_SIG_B2_OFDMA_INFO_DETAILS,
2785*5113495bSYour Name 					     STA_DCM);
2786*5113495bSYour Name 		coding = HAL_TX_DESC_GET_64(tx_tlv,
2787*5113495bSYour Name 					    MACTX_HE_SIG_B2_OFDMA_MACTX_HE_SIG_B2_OFDMA_INFO_DETAILS,
2788*5113495bSYour Name 					    STA_CODING);
2789*5113495bSYour Name 		user_order = HAL_TX_DESC_GET_64(tx_tlv,
2790*5113495bSYour Name 						MACTX_HE_SIG_B2_OFDMA_MACTX_HE_SIG_B2_OFDMA_INFO_DETAILS,
2791*5113495bSYour Name 						USER_ORDER);
2792*5113495bSYour Name 
2793*5113495bSYour Name 		/* HE data 1 */
2794*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data1) |=
2795*5113495bSYour Name 				QDF_MON_STATUS_HE_MCS_KNOWN |
2796*5113495bSYour Name 				QDF_MON_STATUS_HE_CODING_KNOWN |
2797*5113495bSYour Name 				QDF_MON_STATUS_HE_DCM_KNOWN;
2798*5113495bSYour Name 		/* HE data 2 */
2799*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data2) |=
2800*5113495bSYour Name 				QDF_MON_STATUS_TXBF_KNOWN;
2801*5113495bSYour Name 
2802*5113495bSYour Name 		/* HE data 3 */
2803*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, mcs) = sta_mcs;
2804*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |=
2805*5113495bSYour Name 				sta_mcs << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
2806*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |=
2807*5113495bSYour Name 				sta_dcm << QDF_MON_STATUS_DCM_SHIFT;
2808*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |=
2809*5113495bSYour Name 				coding << QDF_MON_STATUS_CODING_SHIFT;
2810*5113495bSYour Name 
2811*5113495bSYour Name 		/* HE data 4 */
2812*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data4) |=
2813*5113495bSYour Name 				sta_id << QDF_MON_STATUS_STA_ID_SHIFT;
2814*5113495bSYour Name 
2815*5113495bSYour Name 		/* HE data 5 */
2816*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data5) |=
2817*5113495bSYour Name 				txbf << QDF_MON_STATUS_TXBF_SHIFT;
2818*5113495bSYour Name 
2819*5113495bSYour Name 		/* HE data 6 */
2820*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, nss) = nss;
2821*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id, he_data6) |= nss;
2822*5113495bSYour Name 
2823*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_HE_SIG_B2_OFDMA_E);
2824*5113495bSYour Name 		break;
2825*5113495bSYour Name 	}
2826*5113495bSYour Name 	case WIFIMACTX_L_SIG_A_E:
2827*5113495bSYour Name 	{
2828*5113495bSYour Name 		uint8_t *l_sig_a_info = NULL;
2829*5113495bSYour Name 		uint8_t rate = 0;
2830*5113495bSYour Name 
2831*5113495bSYour Name 		status = HAL_MON_MACTX_L_SIG_A;
2832*5113495bSYour Name 
2833*5113495bSYour Name 		l_sig_a_info = (uint8_t *)tx_tlv +
2834*5113495bSYour Name 			HAL_OFFSET(MACTX_L_SIG_A_MACTX_L_SIG_A_INFO_DETAILS,
2835*5113495bSYour Name 				   RATE);
2836*5113495bSYour Name 		rate = HAL_TX_DESC_GET_64(tx_tlv,
2837*5113495bSYour Name 					  MACTX_L_SIG_A_MACTX_L_SIG_A_INFO_DETAILS,
2838*5113495bSYour Name 					  RATE);
2839*5113495bSYour Name 
2840*5113495bSYour Name 		switch (rate) {
2841*5113495bSYour Name 		case 8:
2842*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11A_RATE_0MCS;
2843*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS0;
2844*5113495bSYour Name 			break;
2845*5113495bSYour Name 		case 9:
2846*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11A_RATE_1MCS;
2847*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS1;
2848*5113495bSYour Name 			break;
2849*5113495bSYour Name 		case 10:
2850*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11A_RATE_2MCS;
2851*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS2;
2852*5113495bSYour Name 			break;
2853*5113495bSYour Name 		case 11:
2854*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11A_RATE_3MCS;
2855*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS3;
2856*5113495bSYour Name 			break;
2857*5113495bSYour Name 		case 12:
2858*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11A_RATE_4MCS;
2859*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS4;
2860*5113495bSYour Name 			break;
2861*5113495bSYour Name 		case 13:
2862*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11A_RATE_5MCS;
2863*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS5;
2864*5113495bSYour Name 			break;
2865*5113495bSYour Name 		case 14:
2866*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11A_RATE_6MCS;
2867*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS6;
2868*5113495bSYour Name 			break;
2869*5113495bSYour Name 		case 15:
2870*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11A_RATE_7MCS;
2871*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS7;
2872*5113495bSYour Name 			break;
2873*5113495bSYour Name 		default:
2874*5113495bSYour Name 			break;
2875*5113495bSYour Name 		}
2876*5113495bSYour Name 
2877*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, ofdm_flag) = 1;
2878*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, reception_type) = HAL_RX_TYPE_SU;
2879*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info,
2880*5113495bSYour Name 				 l_sig_a_info) = *((uint32_t *)l_sig_a_info);
2881*5113495bSYour Name 
2882*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_L_SIG_A_E);
2883*5113495bSYour Name 		break;
2884*5113495bSYour Name 	}
2885*5113495bSYour Name 	case WIFIMACTX_L_SIG_B_E:
2886*5113495bSYour Name 	{
2887*5113495bSYour Name 		uint8_t *l_sig_b_info = NULL;
2888*5113495bSYour Name 		uint8_t rate = 0;
2889*5113495bSYour Name 
2890*5113495bSYour Name 		status = HAL_MON_MACTX_L_SIG_B;
2891*5113495bSYour Name 
2892*5113495bSYour Name 		l_sig_b_info = (uint8_t *)tx_tlv +
2893*5113495bSYour Name 			HAL_OFFSET(MACTX_L_SIG_B_MACTX_L_SIG_B_INFO_DETAILS,
2894*5113495bSYour Name 				   RATE);
2895*5113495bSYour Name 		rate = HAL_TX_DESC_GET_64(tx_tlv,
2896*5113495bSYour Name 					  MACTX_L_SIG_B_MACTX_L_SIG_B_INFO_DETAILS,
2897*5113495bSYour Name 					  RATE);
2898*5113495bSYour Name 
2899*5113495bSYour Name 		switch (rate) {
2900*5113495bSYour Name 		case 1:
2901*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11B_RATE_3MCS;
2902*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS3;
2903*5113495bSYour Name 			break;
2904*5113495bSYour Name 		case 2:
2905*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11B_RATE_2MCS;
2906*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS2;
2907*5113495bSYour Name 			break;
2908*5113495bSYour Name 		case 3:
2909*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11B_RATE_1MCS;
2910*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS1;
2911*5113495bSYour Name 			break;
2912*5113495bSYour Name 		case 4:
2913*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11B_RATE_0MCS;
2914*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS0;
2915*5113495bSYour Name 			break;
2916*5113495bSYour Name 		case 5:
2917*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11B_RATE_6MCS;
2918*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS6;
2919*5113495bSYour Name 			break;
2920*5113495bSYour Name 		case 6:
2921*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11B_RATE_5MCS;
2922*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS5;
2923*5113495bSYour Name 			break;
2924*5113495bSYour Name 		case 7:
2925*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, rate) = HAL_11B_RATE_4MCS;
2926*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = HAL_LEGACY_MCS4;
2927*5113495bSYour Name 			break;
2928*5113495bSYour Name 		default:
2929*5113495bSYour Name 			break;
2930*5113495bSYour Name 		}
2931*5113495bSYour Name 
2932*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, cck_flag) = 1;
2933*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, reception_type) = HAL_RX_TYPE_SU;
2934*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, l_sig_b_info) = *l_sig_b_info;
2935*5113495bSYour Name 
2936*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_L_SIG_B_E);
2937*5113495bSYour Name 		break;
2938*5113495bSYour Name 	}
2939*5113495bSYour Name 	case WIFIMACTX_HT_SIG_E:
2940*5113495bSYour Name 	{
2941*5113495bSYour Name 		uint8_t mcs = 0;
2942*5113495bSYour Name 		uint8_t bw = 0;
2943*5113495bSYour Name 		uint8_t is_stbc = 0;
2944*5113495bSYour Name 		uint8_t coding = 0;
2945*5113495bSYour Name 		uint8_t gi = 0;
2946*5113495bSYour Name 
2947*5113495bSYour Name 		status = HAL_MON_MACTX_HT_SIG;
2948*5113495bSYour Name 		mcs = HAL_TX_DESC_GET_64(tx_tlv, HT_SIG_INFO, MCS);
2949*5113495bSYour Name 		bw = HAL_TX_DESC_GET_64(tx_tlv, HT_SIG_INFO, CBW);
2950*5113495bSYour Name 		is_stbc = HAL_TX_DESC_GET_64(tx_tlv, HT_SIG_INFO, STBC);
2951*5113495bSYour Name 		coding = HAL_TX_DESC_GET_64(tx_tlv, HT_SIG_INFO, FEC_CODING);
2952*5113495bSYour Name 		gi = HAL_TX_DESC_GET_64(tx_tlv, HT_SIG_INFO, SHORT_GI);
2953*5113495bSYour Name 
2954*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, ldpc) =
2955*5113495bSYour Name 				(coding == HAL_SU_MU_CODING_LDPC) ? 1 : 0;
2956*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, ht_mcs) = mcs;
2957*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, bw) = bw;
2958*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, sgi) = gi;
2959*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, is_stbc) = is_stbc;
2960*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, reception_type) = HAL_RX_TYPE_SU;
2961*5113495bSYour Name 
2962*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_HT_SIG_E);
2963*5113495bSYour Name 		break;
2964*5113495bSYour Name 	}
2965*5113495bSYour Name 	case WIFIMACTX_VHT_SIG_A_E:
2966*5113495bSYour Name 	{
2967*5113495bSYour Name 		uint8_t bandwidth = 0;
2968*5113495bSYour Name 		uint8_t is_stbc = 0;
2969*5113495bSYour Name 		uint8_t group_id = 0;
2970*5113495bSYour Name 		uint32_t nss_comb = 0;
2971*5113495bSYour Name 		uint8_t nss_su = 0;
2972*5113495bSYour Name 		uint8_t nss_mu[4] = {0};
2973*5113495bSYour Name 		uint8_t sgi = 0;
2974*5113495bSYour Name 		uint8_t coding = 0;
2975*5113495bSYour Name 		uint8_t mcs = 0;
2976*5113495bSYour Name 		uint8_t beamformed = 0;
2977*5113495bSYour Name 		uint8_t partial_aid = 0;
2978*5113495bSYour Name 
2979*5113495bSYour Name 		status = HAL_MON_MACTX_VHT_SIG_A;
2980*5113495bSYour Name 		bandwidth = HAL_TX_DESC_GET_64(tx_tlv,
2981*5113495bSYour Name 					       MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
2982*5113495bSYour Name 					       BANDWIDTH);
2983*5113495bSYour Name 		is_stbc = HAL_TX_DESC_GET_64(tx_tlv,
2984*5113495bSYour Name 					     MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
2985*5113495bSYour Name 					     STBC);
2986*5113495bSYour Name 		group_id = HAL_TX_DESC_GET_64(tx_tlv,
2987*5113495bSYour Name 					      MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
2988*5113495bSYour Name 					      GROUP_ID);
2989*5113495bSYour Name 		/* nss_comb is su nss, MU nss and partial AID */
2990*5113495bSYour Name 		nss_comb = HAL_TX_DESC_GET_64(tx_tlv,
2991*5113495bSYour Name 					      MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
2992*5113495bSYour Name 					      N_STS);
2993*5113495bSYour Name 		/* if it is SU */
2994*5113495bSYour Name 		nss_su = (nss_comb & 0x7) + 1;
2995*5113495bSYour Name 		/* partial aid - applicable only for SU */
2996*5113495bSYour Name 		partial_aid = (nss_comb >> 3) & 0x1F;
2997*5113495bSYour Name 		/* if it is MU */
2998*5113495bSYour Name 		nss_mu[0] = (nss_comb & 0x7) + 1;
2999*5113495bSYour Name 		nss_mu[1] = ((nss_comb >> 3) & 0x7) + 1;
3000*5113495bSYour Name 		nss_mu[2] = ((nss_comb >> 6) & 0x7) + 1;
3001*5113495bSYour Name 		nss_mu[3] = ((nss_comb >> 9) & 0x7) + 1;
3002*5113495bSYour Name 
3003*5113495bSYour Name 		sgi = HAL_TX_DESC_GET_64(tx_tlv,
3004*5113495bSYour Name 					 MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
3005*5113495bSYour Name 					 GI_SETTING);
3006*5113495bSYour Name 		coding = HAL_TX_DESC_GET_64(tx_tlv,
3007*5113495bSYour Name 					    MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
3008*5113495bSYour Name 					    SU_MU_CODING);
3009*5113495bSYour Name 		mcs = HAL_TX_DESC_GET_64(tx_tlv,
3010*5113495bSYour Name 					 MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
3011*5113495bSYour Name 					 MCS);
3012*5113495bSYour Name 		beamformed = HAL_TX_DESC_GET_64(tx_tlv,
3013*5113495bSYour Name 						MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
3014*5113495bSYour Name 						BEAMFORMED);
3015*5113495bSYour Name 
3016*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, ldpc) =
3017*5113495bSYour Name 			(coding == HAL_SU_MU_CODING_LDPC) ? 1 : 0;
3018*5113495bSYour Name 		TXMON_STATUS_INFO(tx_status_info, sw_frame_group_id) = group_id;
3019*5113495bSYour Name 
3020*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, sgi) = sgi;
3021*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, is_stbc) = is_stbc;
3022*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, bw) = bandwidth;
3023*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, beamformed) = beamformed;
3024*5113495bSYour Name 
3025*5113495bSYour Name 		if (group_id == 0 || group_id == 63) {
3026*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, reception_type) =
3027*5113495bSYour Name 						HAL_RX_TYPE_SU;
3028*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, mcs) = mcs;
3029*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, nss) =
3030*5113495bSYour Name 						nss_su & VHT_SIG_SU_NSS_MASK;
3031*5113495bSYour Name 
3032*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, user_id,
3033*5113495bSYour Name 				       vht_flag_values3[0]) = ((mcs << 4) |
3034*5113495bSYour Name 							       nss_su);
3035*5113495bSYour Name 		} else {
3036*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, reception_type) =
3037*5113495bSYour Name 						HAL_RX_TYPE_MU_MIMO;
3038*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, user_id, mcs) = mcs;
3039*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, user_id, nss) =
3040*5113495bSYour Name 						nss_su & VHT_SIG_SU_NSS_MASK;
3041*5113495bSYour Name 
3042*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, user_id,
3043*5113495bSYour Name 				       vht_flag_values3[0]) = ((mcs << 4) |
3044*5113495bSYour Name 							       nss_su);
3045*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, user_id,
3046*5113495bSYour Name 				       vht_flag_values3[1]) = ((mcs << 4) |
3047*5113495bSYour Name 							       nss_mu[1]);
3048*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, user_id,
3049*5113495bSYour Name 				       vht_flag_values3[2]) = ((mcs << 4) |
3050*5113495bSYour Name 							       nss_mu[2]);
3051*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, user_id,
3052*5113495bSYour Name 				       vht_flag_values3[3]) = ((mcs << 4) |
3053*5113495bSYour Name 							       nss_mu[3]);
3054*5113495bSYour Name 		}
3055*5113495bSYour Name 
3056*5113495bSYour Name 		/* TODO: loop over multiple user */
3057*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id,
3058*5113495bSYour Name 			       vht_flag_values2) = bandwidth;
3059*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id,
3060*5113495bSYour Name 			       vht_flag_values4) = coding;
3061*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id,
3062*5113495bSYour Name 			       vht_flag_values5) = group_id;
3063*5113495bSYour Name 		TXMON_HAL_USER(ppdu_info, user_id,
3064*5113495bSYour Name 			       vht_flag_values6) = partial_aid;
3065*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_VHT_SIG_A_E);
3066*5113495bSYour Name 		break;
3067*5113495bSYour Name 	}
3068*5113495bSYour Name 	case WIFIMACTX_VHT_SIG_B_MU160_E:
3069*5113495bSYour Name 	{
3070*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_VHT_SIG_B_MU160_E);
3071*5113495bSYour Name 		break;
3072*5113495bSYour Name 	}
3073*5113495bSYour Name 	case WIFIMACTX_VHT_SIG_B_MU80_E:
3074*5113495bSYour Name 	{
3075*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_VHT_SIG_B_MU80_E);
3076*5113495bSYour Name 		break;
3077*5113495bSYour Name 	}
3078*5113495bSYour Name 	case WIFIMACTX_VHT_SIG_B_MU40_E:
3079*5113495bSYour Name 	{
3080*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_VHT_SIG_B_MU40_E);
3081*5113495bSYour Name 		break;
3082*5113495bSYour Name 	}
3083*5113495bSYour Name 	case WIFIMACTX_VHT_SIG_B_MU20_E:
3084*5113495bSYour Name 	{
3085*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_VHT_SIG_B_MU20_E);
3086*5113495bSYour Name 		break;
3087*5113495bSYour Name 	}
3088*5113495bSYour Name 	case WIFIMACTX_VHT_SIG_B_SU160_E:
3089*5113495bSYour Name 	{
3090*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_VHT_SIG_B_SU160_E);
3091*5113495bSYour Name 		break;
3092*5113495bSYour Name 	}
3093*5113495bSYour Name 	case WIFIMACTX_VHT_SIG_B_SU80_E:
3094*5113495bSYour Name 	{
3095*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_VHT_SIG_B_SU80_E);
3096*5113495bSYour Name 		break;
3097*5113495bSYour Name 	}
3098*5113495bSYour Name 	case WIFIMACTX_VHT_SIG_B_SU40_E:
3099*5113495bSYour Name 	{
3100*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_VHT_SIG_B_SU40_E);
3101*5113495bSYour Name 		break;
3102*5113495bSYour Name 	}
3103*5113495bSYour Name 	case WIFIMACTX_VHT_SIG_B_SU20_E:
3104*5113495bSYour Name 	{
3105*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_VHT_SIG_B_SU20_E);
3106*5113495bSYour Name 		break;
3107*5113495bSYour Name 	}
3108*5113495bSYour Name 	case WIFIPHYTX_PPDU_HEADER_INFO_REQUEST_E:
3109*5113495bSYour Name 	{
3110*5113495bSYour Name 		SHOW_DEFINED(WIFIPHYTX_PPDU_HEADER_INFO_REQUEST_E);
3111*5113495bSYour Name 		break;
3112*5113495bSYour Name 	}
3113*5113495bSYour Name 	case WIFIMACTX_USER_DESC_PER_USER_E:
3114*5113495bSYour Name 	{
3115*5113495bSYour Name 		hal_txmon_parse_user_desc_per_user(tx_tlv, user_id, ppdu_info);
3116*5113495bSYour Name 
3117*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_USER_DESC_PER_USER_E);
3118*5113495bSYour Name 		break;
3119*5113495bSYour Name 	}
3120*5113495bSYour Name 	case WIFIMACTX_USER_DESC_COMMON_E:
3121*5113495bSYour Name 	{
3122*5113495bSYour Name 		hal_txmon_parse_user_desc_common(tx_tlv, user_id, ppdu_info);
3123*5113495bSYour Name 
3124*5113495bSYour Name 		/* copy per user info to all user */
3125*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_USER_DESC_COMMON_E);
3126*5113495bSYour Name 		break;
3127*5113495bSYour Name 	}
3128*5113495bSYour Name 	case WIFIMACTX_PHY_DESC_E:
3129*5113495bSYour Name 	{
3130*5113495bSYour Name 		/* pkt_type - preamble type */
3131*5113495bSYour Name 		uint32_t pkt_type = 0;
3132*5113495bSYour Name 		uint8_t bandwidth = 0;
3133*5113495bSYour Name 		uint8_t is_stbc = 0;
3134*5113495bSYour Name 		uint8_t is_triggered = 0;
3135*5113495bSYour Name 		uint8_t gi = 0;
3136*5113495bSYour Name 		uint8_t he_ppdu_subtype = 0;
3137*5113495bSYour Name 		uint32_t ltf_size = 0;
3138*5113495bSYour Name 		uint32_t he_data1 = 0;
3139*5113495bSYour Name 		uint32_t he_data2 = 0;
3140*5113495bSYour Name 		uint32_t he_data3 = 0;
3141*5113495bSYour Name 		uint32_t he_data5 = 0;
3142*5113495bSYour Name 		uint16_t he_mu_flag_1 = 0;
3143*5113495bSYour Name 		uint16_t he_mu_flag_2 = 0;
3144*5113495bSYour Name 		uint16_t num_users = 0;
3145*5113495bSYour Name 		uint8_t i = 0;
3146*5113495bSYour Name 
3147*5113495bSYour Name 		SHOW_DEFINED(WIFIMACTX_PHY_DESC_E);
3148*5113495bSYour Name 		status = HAL_MON_MACTX_PHY_DESC;
3149*5113495bSYour Name 
3150*5113495bSYour Name 		num_users = TXMON_HAL(ppdu_info, num_users);
3151*5113495bSYour Name 		pkt_type = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC, PKT_TYPE);
3152*5113495bSYour Name 		is_stbc = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC, STBC);
3153*5113495bSYour Name 		is_triggered = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
3154*5113495bSYour Name 						  TRIGGERED);
3155*5113495bSYour Name 		if (!is_triggered) {
3156*5113495bSYour Name 			bandwidth = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
3157*5113495bSYour Name 						       BANDWIDTH);
3158*5113495bSYour Name 		} else {
3159*5113495bSYour Name 			/*
3160*5113495bSYour Name 			 * is_triggered, bw is minimum of AP pkt bw
3161*5113495bSYour Name 			 * or STA bw
3162*5113495bSYour Name 			 */
3163*5113495bSYour Name 			bandwidth = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
3164*5113495bSYour Name 						       AP_PKT_BW);
3165*5113495bSYour Name 		}
3166*5113495bSYour Name 
3167*5113495bSYour Name 		gi = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
3168*5113495bSYour Name 					CP_SETTING);
3169*5113495bSYour Name 		ltf_size = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC, LTF_SIZE);
3170*5113495bSYour Name 		he_ppdu_subtype = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
3171*5113495bSYour Name 						     HE_PPDU_SUBTYPE);
3172*5113495bSYour Name 
3173*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, preamble_type) = pkt_type;
3174*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, ltf_size) = ltf_size;
3175*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, is_stbc) = is_stbc;
3176*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info, bw) = bandwidth;
3177*5113495bSYour Name 
3178*5113495bSYour Name 		switch (ppdu_info->rx_status.preamble_type) {
3179*5113495bSYour Name 		case TXMON_PKT_TYPE_11N_MM:
3180*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, ht_flags) = 1;
3181*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info,
3182*5113495bSYour Name 					 rtap_flags) |= HT_SGI_PRESENT;
3183*5113495bSYour Name 			break;
3184*5113495bSYour Name 		case TXMON_PKT_TYPE_11AC:
3185*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, vht_flags) = 1;
3186*5113495bSYour Name 			break;
3187*5113495bSYour Name 		case TXMON_PKT_TYPE_11AX:
3188*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, he_flags) = 1;
3189*5113495bSYour Name 			break;
3190*5113495bSYour Name 		default:
3191*5113495bSYour Name 			break;
3192*5113495bSYour Name 		}
3193*5113495bSYour Name 
3194*5113495bSYour Name 		if (!TXMON_HAL_STATUS(ppdu_info, he_flags))
3195*5113495bSYour Name 			break;
3196*5113495bSYour Name 
3197*5113495bSYour Name 		/* update he flags */
3198*5113495bSYour Name 		/* PPDU FORMAT */
3199*5113495bSYour Name 		switch (he_ppdu_subtype) {
3200*5113495bSYour Name 		case TXMON_HE_SUBTYPE_SU:
3201*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, he_data1) |=
3202*5113495bSYour Name 					QDF_MON_STATUS_HE_SU_FORMAT_TYPE;
3203*5113495bSYour Name 			break;
3204*5113495bSYour Name 		case TXMON_HE_SUBTYPE_TRIG:
3205*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, he_data1) |=
3206*5113495bSYour Name 					QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
3207*5113495bSYour Name 			break;
3208*5113495bSYour Name 		case TXMON_HE_SUBTYPE_MU:
3209*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, he_data1) |=
3210*5113495bSYour Name 					QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
3211*5113495bSYour Name 			break;
3212*5113495bSYour Name 		case TXMON_HE_SUBTYPE_EXT_SU:
3213*5113495bSYour Name 			TXMON_HAL_STATUS(ppdu_info, he_data1) |=
3214*5113495bSYour Name 					QDF_MON_STATUS_HE_EXT_SU_FORMAT_TYPE;
3215*5113495bSYour Name 			break;
3216*5113495bSYour Name 		};
3217*5113495bSYour Name 
3218*5113495bSYour Name 		/* STBC */
3219*5113495bSYour Name 		he_data1 |= QDF_MON_STATUS_HE_STBC_KNOWN;
3220*5113495bSYour Name 		he_data3 |= (is_stbc << QDF_MON_STATUS_STBC_SHIFT);
3221*5113495bSYour Name 
3222*5113495bSYour Name 		/* GI */
3223*5113495bSYour Name 		he_data2 |= QDF_MON_STATUS_HE_GI_KNOWN;
3224*5113495bSYour Name 		he_data5 |= (gi << QDF_MON_STATUS_GI_SHIFT);
3225*5113495bSYour Name 
3226*5113495bSYour Name 		/* Data BW and RU allocation */
3227*5113495bSYour Name 		he_data1 |= QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
3228*5113495bSYour Name 		he_data5 = (he_data5 & 0xFFF0) | bandwidth;
3229*5113495bSYour Name 
3230*5113495bSYour Name 		he_data2 |= QDF_MON_STATUS_LTF_SYMBOLS_KNOWN;
3231*5113495bSYour Name 		he_data5 |= ((1 + ltf_size) <<
3232*5113495bSYour Name 			     QDF_MON_STATUS_HE_LTF_SIZE_SHIFT);
3233*5113495bSYour Name 
3234*5113495bSYour Name 		TXMON_HAL_STATUS(ppdu_info,
3235*5113495bSYour Name 				 he_mu_flags) = IS_MULTI_USERS(num_users);
3236*5113495bSYour Name 		/* MAC TX PHY DESC is not a user tlv */
3237*5113495bSYour Name 		for (i = 0; i < num_users; i++) {
3238*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_data1) = he_data1;
3239*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_data2) = he_data2;
3240*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_data3) = he_data3;
3241*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_data5) = he_data5;
3242*5113495bSYour Name 
3243*5113495bSYour Name 			/* HE MU flags */
3244*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_flags1) |= he_mu_flag_1;
3245*5113495bSYour Name 			TXMON_HAL_USER(ppdu_info, i, he_flags2) |= he_mu_flag_2;
3246*5113495bSYour Name 		}
3247*5113495bSYour Name 		break;
3248*5113495bSYour Name 	}
3249*5113495bSYour Name 	case WIFICOEX_RX_STATUS_E:
3250*5113495bSYour Name 	{
3251*5113495bSYour Name 		SHOW_DEFINED(WIFICOEX_RX_STATUS_E);
3252*5113495bSYour Name 		break;
3253*5113495bSYour Name 	}
3254*5113495bSYour Name 	case WIFIRX_PPDU_ACK_REPORT_E:
3255*5113495bSYour Name 	{
3256*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_PPDU_ACK_REPORT_E);
3257*5113495bSYour Name 		break;
3258*5113495bSYour Name 	}
3259*5113495bSYour Name 	case WIFIRX_PPDU_NO_ACK_REPORT_E:
3260*5113495bSYour Name 	{
3261*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_PPDU_NO_ACK_REPORT_E);
3262*5113495bSYour Name 		break;
3263*5113495bSYour Name 	}
3264*5113495bSYour Name 	case WIFITXPCU_PHYTX_OTHER_TRANSMIT_INFO32_E:
3265*5113495bSYour Name 	{
3266*5113495bSYour Name 		SHOW_DEFINED(WIFITXPCU_PHYTX_OTHER_TRANSMIT_INFO32_E);
3267*5113495bSYour Name 		break;
3268*5113495bSYour Name 	}
3269*5113495bSYour Name 	case WIFITXPCU_PHYTX_DEBUG32_E:
3270*5113495bSYour Name 	{
3271*5113495bSYour Name 		SHOW_DEFINED(WIFITXPCU_PHYTX_DEBUG32_E);
3272*5113495bSYour Name 		break;
3273*5113495bSYour Name 	}
3274*5113495bSYour Name 	case WIFITXPCU_PREAMBLE_DONE_E:
3275*5113495bSYour Name 	{
3276*5113495bSYour Name 		SHOW_DEFINED(WIFITXPCU_PREAMBLE_DONE_E);
3277*5113495bSYour Name 		break;
3278*5113495bSYour Name 	}
3279*5113495bSYour Name 	case WIFIRX_PHY_SLEEP_E:
3280*5113495bSYour Name 	{
3281*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_PHY_SLEEP_E);
3282*5113495bSYour Name 		break;
3283*5113495bSYour Name 	}
3284*5113495bSYour Name 	case WIFIRX_FRAME_BITMAP_REQ_E:
3285*5113495bSYour Name 	{
3286*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_FRAME_BITMAP_REQ_E);
3287*5113495bSYour Name 		break;
3288*5113495bSYour Name 	}
3289*5113495bSYour Name 	case WIFIRXPCU_TX_SETUP_CLEAR_E:
3290*5113495bSYour Name 	{
3291*5113495bSYour Name 		SHOW_DEFINED(WIFIRXPCU_TX_SETUP_CLEAR_E);
3292*5113495bSYour Name 		break;
3293*5113495bSYour Name 	}
3294*5113495bSYour Name 	case WIFIRX_TRIG_INFO_E:
3295*5113495bSYour Name 	{
3296*5113495bSYour Name 		SHOW_DEFINED(WIFIRX_TRIG_INFO_E);
3297*5113495bSYour Name 		break;
3298*5113495bSYour Name 	}
3299*5113495bSYour Name 	case WIFIEXPECTED_RESPONSE_E:
3300*5113495bSYour Name 	{
3301*5113495bSYour Name 		SHOW_DEFINED(WIFIEXPECTED_RESPONSE_E);
3302*5113495bSYour Name 		break;
3303*5113495bSYour Name 	}
3304*5113495bSYour Name 	case WIFITRIGGER_RESPONSE_TX_DONE_E:
3305*5113495bSYour Name 	{
3306*5113495bSYour Name 		SHOW_DEFINED(WIFITRIGGER_RESPONSE_TX_DONE_E);
3307*5113495bSYour Name 		break;
3308*5113495bSYour Name 	}
3309*5113495bSYour Name 	case WIFIFW2SW_MON_E:
3310*5113495bSYour Name 	{
3311*5113495bSYour Name 		/* parse fw2sw tlv */
3312*5113495bSYour Name 		hal_txmon_parse_fw2sw(tx_tlv, tlv_user_id, data_status_info);
3313*5113495bSYour Name 		status = HAL_MON_TX_FW2SW;
3314*5113495bSYour Name 		SHOW_DEFINED(WIFIFW2SW_MON_E);
3315*5113495bSYour Name 		break;
3316*5113495bSYour Name 	}
3317*5113495bSYour Name 	}
3318*5113495bSYour Name 
3319*5113495bSYour Name 	return status;
3320*5113495bSYour Name }
3321*5113495bSYour Name #endif /* WLAN_PKT_CAPTURE_TX_2_0 */
3322*5113495bSYour Name 
3323*5113495bSYour Name #ifdef REO_SHARED_QREF_TABLE_EN
hal_reo_shared_qaddr_cache_clear_be(hal_soc_handle_t hal_soc_hdl)3324*5113495bSYour Name static void hal_reo_shared_qaddr_cache_clear_be(hal_soc_handle_t hal_soc_hdl)
3325*5113495bSYour Name {
3326*5113495bSYour Name 	struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
3327*5113495bSYour Name 	uint32_t reg_val = 0;
3328*5113495bSYour Name 
3329*5113495bSYour Name 	/* Set Qdesc clear bit to erase REO internal storage for Qdesc pointers
3330*5113495bSYour Name 	 * of 37 peer/tids
3331*5113495bSYour Name 	 */
3332*5113495bSYour Name 	reg_val = HAL_REG_READ(hal, HWIO_REO_R0_QDESC_ADDR_READ_ADDR(REO_REG_REG_BASE));
3333*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_REO_R0_QDESC_ADDR_READ, CLEAR_QDESC_ARRAY, 1);
3334*5113495bSYour Name 	HAL_REG_WRITE(hal,
3335*5113495bSYour Name 		      HWIO_REO_R0_QDESC_ADDR_READ_ADDR(REO_REG_REG_BASE),
3336*5113495bSYour Name 		      reg_val);
3337*5113495bSYour Name 
3338*5113495bSYour Name 	/* Clear Qdesc clear bit to erase REO internal storage for Qdesc pointers
3339*5113495bSYour Name 	 * of 37 peer/tids
3340*5113495bSYour Name 	 */
3341*5113495bSYour Name 	reg_val &= ~(HAL_SM(HWIO_REO_R0_QDESC_ADDR_READ, CLEAR_QDESC_ARRAY, 1));
3342*5113495bSYour Name 	HAL_REG_WRITE(hal,
3343*5113495bSYour Name 		      HWIO_REO_R0_QDESC_ADDR_READ_ADDR(REO_REG_REG_BASE),
3344*5113495bSYour Name 		      reg_val);
3345*5113495bSYour Name 
3346*5113495bSYour Name 	hal_verbose_debug("hal_soc: %pK :Setting CLEAR_DESC_ARRAY field of"
3347*5113495bSYour Name 			  "WCSS_UMAC_REO_R0_QDESC_ADDR_READ and resetting back"
3348*5113495bSYour Name 			  "to erase stale entries in reo storage: regval:%x", hal, reg_val);
3349*5113495bSYour Name }
3350*5113495bSYour Name 
3351*5113495bSYour Name /* hal_reo_shared_qaddr_write(): Write REO tid queue addr
3352*5113495bSYour Name  * LUT shared by SW and HW at the index given by peer id
3353*5113495bSYour Name  * and tid.
3354*5113495bSYour Name  *
3355*5113495bSYour Name  * @hal_soc: hal soc pointer
3356*5113495bSYour Name  * @reo_qref_addr: pointer to index pointed to be peer_id
3357*5113495bSYour Name  * and tid
3358*5113495bSYour Name  * @tid: tid queue number
3359*5113495bSYour Name  * @hw_qdesc_paddr: reo queue addr
3360*5113495bSYour Name  */
3361*5113495bSYour Name 
hal_reo_shared_qaddr_write_be(hal_soc_handle_t hal_soc_hdl,uint16_t peer_id,int tid,qdf_dma_addr_t hw_qdesc_paddr)3362*5113495bSYour Name static void hal_reo_shared_qaddr_write_be(hal_soc_handle_t hal_soc_hdl,
3363*5113495bSYour Name 					  uint16_t peer_id,
3364*5113495bSYour Name 					  int tid,
3365*5113495bSYour Name 					  qdf_dma_addr_t hw_qdesc_paddr)
3366*5113495bSYour Name {
3367*5113495bSYour Name 	struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
3368*5113495bSYour Name 	struct rx_reo_queue_reference *reo_qref;
3369*5113495bSYour Name 	uint32_t peer_tid_idx;
3370*5113495bSYour Name 
3371*5113495bSYour Name 	/* Plug hw_desc_addr in Host reo queue reference table */
3372*5113495bSYour Name 	if (HAL_PEER_ID_IS_MLO(peer_id)) {
3373*5113495bSYour Name 		peer_tid_idx = ((peer_id - HAL_ML_PEER_ID_START) *
3374*5113495bSYour Name 				DP_MAX_TIDS) + tid;
3375*5113495bSYour Name 		reo_qref = (struct rx_reo_queue_reference *)
3376*5113495bSYour Name 			&hal->reo_qref.mlo_reo_qref_table_vaddr[peer_tid_idx];
3377*5113495bSYour Name 	} else {
3378*5113495bSYour Name 		peer_tid_idx = (peer_id * DP_MAX_TIDS) + tid;
3379*5113495bSYour Name 		reo_qref = (struct rx_reo_queue_reference *)
3380*5113495bSYour Name 			&hal->reo_qref.non_mlo_reo_qref_table_vaddr[peer_tid_idx];
3381*5113495bSYour Name 	}
3382*5113495bSYour Name 	reo_qref->rx_reo_queue_desc_addr_31_0 =
3383*5113495bSYour Name 		hw_qdesc_paddr & 0xffffffff;
3384*5113495bSYour Name 	reo_qref->rx_reo_queue_desc_addr_39_32 =
3385*5113495bSYour Name 		(hw_qdesc_paddr & 0xff00000000) >> 32;
3386*5113495bSYour Name 	if (hw_qdesc_paddr != 0)
3387*5113495bSYour Name 		reo_qref->receive_queue_number = tid;
3388*5113495bSYour Name 	else
3389*5113495bSYour Name 		reo_qref->receive_queue_number = 0;
3390*5113495bSYour Name 
3391*5113495bSYour Name 	hal_reo_shared_qaddr_cache_clear_be(hal_soc_hdl);
3392*5113495bSYour Name 	hal_verbose_debug("hw_qdesc_paddr: %pK, tid: %d, reo_qref:%pK,"
3393*5113495bSYour Name 			  "rx_reo_queue_desc_addr_31_0: %x,"
3394*5113495bSYour Name 			  "rx_reo_queue_desc_addr_39_32: %x",
3395*5113495bSYour Name 			  (void *)hw_qdesc_paddr, tid, reo_qref,
3396*5113495bSYour Name 			  reo_qref->rx_reo_queue_desc_addr_31_0,
3397*5113495bSYour Name 			  reo_qref->rx_reo_queue_desc_addr_39_32);
3398*5113495bSYour Name }
3399*5113495bSYour Name 
3400*5113495bSYour Name #ifdef BIG_ENDIAN_HOST
hal_reo_shared_qaddr_enable(struct hal_soc * hal)3401*5113495bSYour Name static inline void hal_reo_shared_qaddr_enable(struct hal_soc *hal)
3402*5113495bSYour Name {
3403*5113495bSYour Name 	HAL_REG_WRITE(hal, HWIO_REO_R0_QDESC_ADDR_READ_ADDR(REO_REG_REG_BASE),
3404*5113495bSYour Name 		      HAL_SM(HWIO_REO_R0_QDESC_ADDR_READ, GXI_SWAP, 1) |
3405*5113495bSYour Name 		      HAL_SM(HWIO_REO_R0_QDESC_ADDR_READ, LUT_FEATURE_ENABLE, 1));
3406*5113495bSYour Name }
3407*5113495bSYour Name #else
hal_reo_shared_qaddr_enable(struct hal_soc * hal)3408*5113495bSYour Name static inline void hal_reo_shared_qaddr_enable(struct hal_soc *hal)
3409*5113495bSYour Name {
3410*5113495bSYour Name 	HAL_REG_WRITE(hal, HWIO_REO_R0_QDESC_ADDR_READ_ADDR(REO_REG_REG_BASE),
3411*5113495bSYour Name 		      HAL_SM(HWIO_REO_R0_QDESC_ADDR_READ, LUT_FEATURE_ENABLE, 1));
3412*5113495bSYour Name }
3413*5113495bSYour Name #endif
3414*5113495bSYour Name 
3415*5113495bSYour Name /**
3416*5113495bSYour Name  * hal_reo_shared_qaddr_setup_be() - Allocate MLO and Non MLO reo queue
3417*5113495bSYour Name  * reference table shared between SW and HW and initialize in Qdesc Base0
3418*5113495bSYour Name  * base1 registers provided by HW.
3419*5113495bSYour Name  *
3420*5113495bSYour Name  * @hal_soc_hdl: HAL Soc handle
3421*5113495bSYour Name  * @reo_qref: REO queue reference table
3422*5113495bSYour Name  *
3423*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success else a QDF error.
3424*5113495bSYour Name  */
3425*5113495bSYour Name static QDF_STATUS
hal_reo_shared_qaddr_setup_be(hal_soc_handle_t hal_soc_hdl,struct reo_queue_ref_table * reo_qref)3426*5113495bSYour Name hal_reo_shared_qaddr_setup_be(hal_soc_handle_t hal_soc_hdl,
3427*5113495bSYour Name 			      struct reo_queue_ref_table *reo_qref)
3428*5113495bSYour Name {
3429*5113495bSYour Name 	struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
3430*5113495bSYour Name 
3431*5113495bSYour Name 	reo_qref->reo_qref_table_en = 1;
3432*5113495bSYour Name 
3433*5113495bSYour Name 	reo_qref->mlo_reo_qref_table_vaddr =
3434*5113495bSYour Name 		(uint64_t *)qdf_mem_alloc_consistent(
3435*5113495bSYour Name 				hal->qdf_dev, hal->qdf_dev->dev,
3436*5113495bSYour Name 				REO_QUEUE_REF_ML_TABLE_SIZE,
3437*5113495bSYour Name 				&reo_qref->mlo_reo_qref_table_paddr);
3438*5113495bSYour Name 	if (!reo_qref->mlo_reo_qref_table_vaddr)
3439*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
3440*5113495bSYour Name 
3441*5113495bSYour Name 	reo_qref->non_mlo_reo_qref_table_vaddr =
3442*5113495bSYour Name 		(uint64_t *)qdf_mem_alloc_consistent(
3443*5113495bSYour Name 				hal->qdf_dev, hal->qdf_dev->dev,
3444*5113495bSYour Name 				REO_QUEUE_REF_NON_ML_TABLE_SIZE,
3445*5113495bSYour Name 				&reo_qref->non_mlo_reo_qref_table_paddr);
3446*5113495bSYour Name 	if (!reo_qref->non_mlo_reo_qref_table_vaddr) {
3447*5113495bSYour Name 		qdf_mem_free_consistent(
3448*5113495bSYour Name 				hal->qdf_dev, hal->qdf_dev->dev,
3449*5113495bSYour Name 				REO_QUEUE_REF_ML_TABLE_SIZE,
3450*5113495bSYour Name 				reo_qref->mlo_reo_qref_table_vaddr,
3451*5113495bSYour Name 				reo_qref->mlo_reo_qref_table_paddr,
3452*5113495bSYour Name 				0);
3453*5113495bSYour Name 		reo_qref->mlo_reo_qref_table_vaddr = NULL;
3454*5113495bSYour Name 		return QDF_STATUS_E_NOMEM;
3455*5113495bSYour Name 	}
3456*5113495bSYour Name 
3457*5113495bSYour Name 	hal_verbose_debug("MLO table start paddr:%pK,"
3458*5113495bSYour Name 			  "Non-MLO table start paddr:%pK,"
3459*5113495bSYour Name 			  "MLO table start vaddr: %pK,"
3460*5113495bSYour Name 			  "Non MLO table start vaddr: %pK",
3461*5113495bSYour Name 			  (void *)reo_qref->mlo_reo_qref_table_paddr,
3462*5113495bSYour Name 			  (void *)reo_qref->non_mlo_reo_qref_table_paddr,
3463*5113495bSYour Name 			  reo_qref->mlo_reo_qref_table_vaddr,
3464*5113495bSYour Name 			  reo_qref->non_mlo_reo_qref_table_vaddr);
3465*5113495bSYour Name 
3466*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3467*5113495bSYour Name }
3468*5113495bSYour Name 
3469*5113495bSYour Name /**
3470*5113495bSYour Name  * hal_reo_shared_qaddr_init_be() - Zero out REO qref LUT and
3471*5113495bSYour Name  * write start addr of MLO and Non MLO table in HW
3472*5113495bSYour Name  *
3473*5113495bSYour Name  * @hal_soc_hdl: HAL Soc handle
3474*5113495bSYour Name  * @qref_reset: reset qref LUT
3475*5113495bSYour Name  *
3476*5113495bSYour Name  * Return: None
3477*5113495bSYour Name  */
hal_reo_shared_qaddr_init_be(hal_soc_handle_t hal_soc_hdl,int qref_reset)3478*5113495bSYour Name static void hal_reo_shared_qaddr_init_be(hal_soc_handle_t hal_soc_hdl,
3479*5113495bSYour Name 					 int qref_reset)
3480*5113495bSYour Name {
3481*5113495bSYour Name 	struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
3482*5113495bSYour Name 
3483*5113495bSYour Name 	if (qref_reset) {
3484*5113495bSYour Name 		qdf_mem_zero(hal->reo_qref.mlo_reo_qref_table_vaddr,
3485*5113495bSYour Name 			     REO_QUEUE_REF_ML_TABLE_SIZE);
3486*5113495bSYour Name 		qdf_mem_zero(hal->reo_qref.non_mlo_reo_qref_table_vaddr,
3487*5113495bSYour Name 			     REO_QUEUE_REF_NON_ML_TABLE_SIZE);
3488*5113495bSYour Name 	}
3489*5113495bSYour Name 	/* LUT_BASE0 and BASE1 registers expect upper 32bits of LUT base address
3490*5113495bSYour Name 	 * and lower 8 bits to be 0. Shift the physical address by 8 to plug
3491*5113495bSYour Name 	 * upper 32bits only
3492*5113495bSYour Name 	 */
3493*5113495bSYour Name 	HAL_REG_WRITE(hal,
3494*5113495bSYour Name 		      HWIO_REO_R0_QDESC_LUT_BASE0_ADDR_ADDR(REO_REG_REG_BASE),
3495*5113495bSYour Name 		      hal->reo_qref.non_mlo_reo_qref_table_paddr >> 8);
3496*5113495bSYour Name 	HAL_REG_WRITE(hal,
3497*5113495bSYour Name 		      HWIO_REO_R0_QDESC_LUT_BASE1_ADDR_ADDR(REO_REG_REG_BASE),
3498*5113495bSYour Name 		      hal->reo_qref.mlo_reo_qref_table_paddr >> 8);
3499*5113495bSYour Name 	hal_reo_shared_qaddr_enable(hal);
3500*5113495bSYour Name 	HAL_REG_WRITE(hal,
3501*5113495bSYour Name 		      HWIO_REO_R0_QDESC_MAX_SW_PEER_ID_ADDR(REO_REG_REG_BASE),
3502*5113495bSYour Name 		      HAL_MS(HWIO_REO_R0_QDESC, MAX_SW_PEER_ID_MAX_SUPPORTED,
3503*5113495bSYour Name 			     0x1fff));
3504*5113495bSYour Name }
3505*5113495bSYour Name 
3506*5113495bSYour Name /**
3507*5113495bSYour Name  * hal_reo_shared_qaddr_detach_be() - Free MLO and Non MLO reo queue
3508*5113495bSYour Name  * reference table shared between SW and HW
3509*5113495bSYour Name  *
3510*5113495bSYour Name  * @hal_soc_hdl: HAL Soc handle
3511*5113495bSYour Name  *
3512*5113495bSYour Name  * Return: None
3513*5113495bSYour Name  */
hal_reo_shared_qaddr_detach_be(hal_soc_handle_t hal_soc_hdl)3514*5113495bSYour Name static void hal_reo_shared_qaddr_detach_be(hal_soc_handle_t hal_soc_hdl)
3515*5113495bSYour Name {
3516*5113495bSYour Name 	struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
3517*5113495bSYour Name 
3518*5113495bSYour Name 	HAL_REG_WRITE(hal,
3519*5113495bSYour Name 		      HWIO_REO_R0_QDESC_LUT_BASE0_ADDR_ADDR(REO_REG_REG_BASE),
3520*5113495bSYour Name 		      0);
3521*5113495bSYour Name 	HAL_REG_WRITE(hal,
3522*5113495bSYour Name 		      HWIO_REO_R0_QDESC_LUT_BASE1_ADDR_ADDR(REO_REG_REG_BASE),
3523*5113495bSYour Name 		      0);
3524*5113495bSYour Name }
3525*5113495bSYour Name #endif
3526*5113495bSYour Name 
3527*5113495bSYour Name /**
3528*5113495bSYour Name  * hal_tx_vdev_mismatch_routing_set_generic_be() - set vdev mismatch exception routing
3529*5113495bSYour Name  * @hal_soc_hdl: HAL SoC context
3530*5113495bSYour Name  * @config: HAL_TX_VDEV_MISMATCH_TQM_NOTIFY - route via TQM
3531*5113495bSYour Name  *          HAL_TX_VDEV_MISMATCH_FW_NOTIFY - route via FW
3532*5113495bSYour Name  *
3533*5113495bSYour Name  * Return: void
3534*5113495bSYour Name  */
3535*5113495bSYour Name #ifdef HWIO_TCL_R0_CMN_CONFIG_VDEVID_MISMATCH_EXCEPTION_BMSK
3536*5113495bSYour Name static inline void
hal_tx_vdev_mismatch_routing_set_generic_be(hal_soc_handle_t hal_soc_hdl,enum hal_tx_vdev_mismatch_notify config)3537*5113495bSYour Name hal_tx_vdev_mismatch_routing_set_generic_be(hal_soc_handle_t hal_soc_hdl,
3538*5113495bSYour Name 					    enum hal_tx_vdev_mismatch_notify
3539*5113495bSYour Name 					    config)
3540*5113495bSYour Name {
3541*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
3542*5113495bSYour Name 	uint32_t reg_addr, reg_val = 0;
3543*5113495bSYour Name 	uint32_t val = 0;
3544*5113495bSYour Name 
3545*5113495bSYour Name 	reg_addr = HWIO_TCL_R0_CMN_CONFIG_ADDR(MAC_TCL_REG_REG_BASE);
3546*5113495bSYour Name 
3547*5113495bSYour Name 	val = HAL_REG_READ(hal_soc, reg_addr);
3548*5113495bSYour Name 
3549*5113495bSYour Name 	/* reset the corresponding bits in register */
3550*5113495bSYour Name 	val &= (~(HWIO_TCL_R0_CMN_CONFIG_VDEVID_MISMATCH_EXCEPTION_BMSK));
3551*5113495bSYour Name 
3552*5113495bSYour Name 	/* set config value */
3553*5113495bSYour Name 	reg_val = val | (config <<
3554*5113495bSYour Name 			HWIO_TCL_R0_CMN_CONFIG_VDEVID_MISMATCH_EXCEPTION_SHFT);
3555*5113495bSYour Name 
3556*5113495bSYour Name 	HAL_REG_WRITE(hal_soc, reg_addr, reg_val);
3557*5113495bSYour Name }
3558*5113495bSYour Name #else
3559*5113495bSYour Name static inline void
hal_tx_vdev_mismatch_routing_set_generic_be(hal_soc_handle_t hal_soc_hdl,enum hal_tx_vdev_mismatch_notify config)3560*5113495bSYour Name hal_tx_vdev_mismatch_routing_set_generic_be(hal_soc_handle_t hal_soc_hdl,
3561*5113495bSYour Name 					    enum hal_tx_vdev_mismatch_notify
3562*5113495bSYour Name 					    config)
3563*5113495bSYour Name {
3564*5113495bSYour Name }
3565*5113495bSYour Name #endif
3566*5113495bSYour Name 
3567*5113495bSYour Name /**
3568*5113495bSYour Name  * hal_tx_mcast_mlo_reinject_routing_set_generic_be() - set MLO multicast reinject routing
3569*5113495bSYour Name  * @hal_soc_hdl: HAL SoC context
3570*5113495bSYour Name  * @config: HAL_TX_MCAST_MLO_REINJECT_FW_NOTIFY - route via FW
3571*5113495bSYour Name  *          HAL_TX_MCAST_MLO_REINJECT_TQM_NOTIFY - route via TQM
3572*5113495bSYour Name  *
3573*5113495bSYour Name  * Return: void
3574*5113495bSYour Name  */
3575*5113495bSYour Name #if defined(HWIO_TCL_R0_CMN_CONFIG_MCAST_CMN_PN_SN_MLO_REINJECT_ENABLE_BMSK) && \
3576*5113495bSYour Name 	defined(WLAN_MCAST_MLO)
3577*5113495bSYour Name static inline void
hal_tx_mcast_mlo_reinject_routing_set_generic_be(hal_soc_handle_t hal_soc_hdl,enum hal_tx_mcast_mlo_reinject_notify config)3578*5113495bSYour Name hal_tx_mcast_mlo_reinject_routing_set_generic_be(
3579*5113495bSYour Name 				hal_soc_handle_t hal_soc_hdl,
3580*5113495bSYour Name 				enum hal_tx_mcast_mlo_reinject_notify config)
3581*5113495bSYour Name {
3582*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
3583*5113495bSYour Name 	uint32_t reg_addr, reg_val = 0;
3584*5113495bSYour Name 	uint32_t val = 0;
3585*5113495bSYour Name 
3586*5113495bSYour Name 	reg_addr = HWIO_TCL_R0_CMN_CONFIG_ADDR(MAC_TCL_REG_REG_BASE);
3587*5113495bSYour Name 	val = HAL_REG_READ(hal_soc, reg_addr);
3588*5113495bSYour Name 
3589*5113495bSYour Name 	/* reset the corresponding bits in register */
3590*5113495bSYour Name 	val &= (~(HWIO_TCL_R0_CMN_CONFIG_MCAST_CMN_PN_SN_MLO_REINJECT_ENABLE_BMSK));
3591*5113495bSYour Name 
3592*5113495bSYour Name 	/* set config value */
3593*5113495bSYour Name 	reg_val = val | (config << HWIO_TCL_R0_CMN_CONFIG_MCAST_CMN_PN_SN_MLO_REINJECT_ENABLE_SHFT);
3594*5113495bSYour Name 
3595*5113495bSYour Name 	HAL_REG_WRITE(hal_soc, reg_addr, reg_val);
3596*5113495bSYour Name }
3597*5113495bSYour Name #else
3598*5113495bSYour Name static inline void
hal_tx_mcast_mlo_reinject_routing_set_generic_be(hal_soc_handle_t hal_soc_hdl,enum hal_tx_mcast_mlo_reinject_notify config)3599*5113495bSYour Name hal_tx_mcast_mlo_reinject_routing_set_generic_be(
3600*5113495bSYour Name 				hal_soc_handle_t hal_soc_hdl,
3601*5113495bSYour Name 				enum hal_tx_mcast_mlo_reinject_notify config)
3602*5113495bSYour Name {
3603*5113495bSYour Name }
3604*5113495bSYour Name #endif
3605*5113495bSYour Name 
3606*5113495bSYour Name /**
3607*5113495bSYour Name  * hal_get_ba_aging_timeout_be_generic() - Get BA Aging timeout
3608*5113495bSYour Name  *
3609*5113495bSYour Name  * @hal_soc_hdl: Opaque HAL SOC handle
3610*5113495bSYour Name  * @ac: Access category
3611*5113495bSYour Name  * @value: window size to get
3612*5113495bSYour Name  */
3613*5113495bSYour Name 
3614*5113495bSYour Name static inline
hal_get_ba_aging_timeout_be_generic(hal_soc_handle_t hal_soc_hdl,uint8_t ac,uint32_t * value)3615*5113495bSYour Name void hal_get_ba_aging_timeout_be_generic(hal_soc_handle_t hal_soc_hdl,
3616*5113495bSYour Name 					 uint8_t ac, uint32_t *value)
3617*5113495bSYour Name {
3618*5113495bSYour Name 	struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
3619*5113495bSYour Name 
3620*5113495bSYour Name 	switch (ac) {
3621*5113495bSYour Name 	case WME_AC_BE:
3622*5113495bSYour Name 		*value = HAL_REG_READ(soc,
3623*5113495bSYour Name 				      HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(
3624*5113495bSYour Name 				      REO_REG_REG_BASE)) / 1000;
3625*5113495bSYour Name 		break;
3626*5113495bSYour Name 	case WME_AC_BK:
3627*5113495bSYour Name 		*value = HAL_REG_READ(soc,
3628*5113495bSYour Name 				      HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(
3629*5113495bSYour Name 				      REO_REG_REG_BASE)) / 1000;
3630*5113495bSYour Name 		break;
3631*5113495bSYour Name 	case WME_AC_VI:
3632*5113495bSYour Name 		*value = HAL_REG_READ(soc,
3633*5113495bSYour Name 				      HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(
3634*5113495bSYour Name 				      REO_REG_REG_BASE)) / 1000;
3635*5113495bSYour Name 		break;
3636*5113495bSYour Name 	case WME_AC_VO:
3637*5113495bSYour Name 		*value = HAL_REG_READ(soc,
3638*5113495bSYour Name 				      HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(
3639*5113495bSYour Name 				      REO_REG_REG_BASE)) / 1000;
3640*5113495bSYour Name 		break;
3641*5113495bSYour Name 	default:
3642*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
3643*5113495bSYour Name 			  "Invalid AC: %d\n", ac);
3644*5113495bSYour Name 	}
3645*5113495bSYour Name }
3646*5113495bSYour Name 
3647*5113495bSYour Name /**
3648*5113495bSYour Name  * hal_setup_link_idle_list_generic_be - Setup scattered idle list using the
3649*5113495bSYour Name  * buffer list provided
3650*5113495bSYour Name  *
3651*5113495bSYour Name  * @soc: Opaque HAL SOC handle
3652*5113495bSYour Name  * @scatter_bufs_base_paddr: Array of physical base addresses
3653*5113495bSYour Name  * @scatter_bufs_base_vaddr: Array of virtual base addresses
3654*5113495bSYour Name  * @num_scatter_bufs: Number of scatter buffers in the above lists
3655*5113495bSYour Name  * @scatter_buf_size: Size of each scatter buffer
3656*5113495bSYour Name  * @last_buf_end_offset: Offset to the last entry
3657*5113495bSYour Name  * @num_entries: Total entries of all scatter bufs
3658*5113495bSYour Name  *
3659*5113495bSYour Name  * Return: None
3660*5113495bSYour Name  */
3661*5113495bSYour Name static inline void
hal_setup_link_idle_list_generic_be(struct hal_soc * soc,qdf_dma_addr_t scatter_bufs_base_paddr[],void * scatter_bufs_base_vaddr[],uint32_t num_scatter_bufs,uint32_t scatter_buf_size,uint32_t last_buf_end_offset,uint32_t num_entries)3662*5113495bSYour Name hal_setup_link_idle_list_generic_be(struct hal_soc *soc,
3663*5113495bSYour Name 				    qdf_dma_addr_t scatter_bufs_base_paddr[],
3664*5113495bSYour Name 				    void *scatter_bufs_base_vaddr[],
3665*5113495bSYour Name 				    uint32_t num_scatter_bufs,
3666*5113495bSYour Name 				    uint32_t scatter_buf_size,
3667*5113495bSYour Name 				    uint32_t last_buf_end_offset,
3668*5113495bSYour Name 				    uint32_t num_entries)
3669*5113495bSYour Name {
3670*5113495bSYour Name 	int i;
3671*5113495bSYour Name 	uint32_t *prev_buf_link_ptr = NULL;
3672*5113495bSYour Name 	uint32_t reg_scatter_buf_size, reg_tot_scatter_buf_size;
3673*5113495bSYour Name 	uint32_t val;
3674*5113495bSYour Name 
3675*5113495bSYour Name 	/* Link the scatter buffers */
3676*5113495bSYour Name 	for (i = 0; i < num_scatter_bufs; i++) {
3677*5113495bSYour Name 		if (i > 0) {
3678*5113495bSYour Name 			prev_buf_link_ptr[0] =
3679*5113495bSYour Name 				scatter_bufs_base_paddr[i] & 0xffffffff;
3680*5113495bSYour Name 			prev_buf_link_ptr[1] = HAL_SM(
3681*5113495bSYour Name 				HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
3682*5113495bSYour Name 				BASE_ADDRESS_39_32,
3683*5113495bSYour Name 				((uint64_t)(scatter_bufs_base_paddr[i])
3684*5113495bSYour Name 				 >> 32)) | HAL_SM(
3685*5113495bSYour Name 				HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
3686*5113495bSYour Name 				ADDRESS_MATCH_TAG,
3687*5113495bSYour Name 				ADDRESS_MATCH_TAG_VAL);
3688*5113495bSYour Name 		}
3689*5113495bSYour Name 		prev_buf_link_ptr = (uint32_t *)(scatter_bufs_base_vaddr[i] +
3690*5113495bSYour Name 			scatter_buf_size - WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE);
3691*5113495bSYour Name 	}
3692*5113495bSYour Name 
3693*5113495bSYour Name 	/* TBD: Register programming partly based on MLD & the rest based on
3694*5113495bSYour Name 	 * inputs from HW team. Not complete yet.
3695*5113495bSYour Name 	 */
3696*5113495bSYour Name 
3697*5113495bSYour Name 	reg_scatter_buf_size = (scatter_buf_size -
3698*5113495bSYour Name 				WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) / 64;
3699*5113495bSYour Name 	reg_tot_scatter_buf_size = ((scatter_buf_size -
3700*5113495bSYour Name 		WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) * num_scatter_bufs) / 64;
3701*5113495bSYour Name 
3702*5113495bSYour Name 	HAL_REG_WRITE(soc,
3703*5113495bSYour Name 		HWIO_WBM_R0_IDLE_LIST_CONTROL_ADDR(
3704*5113495bSYour Name 		WBM_REG_REG_BASE),
3705*5113495bSYour Name 		HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, SCATTER_BUFFER_SIZE,
3706*5113495bSYour Name 		reg_scatter_buf_size) |
3707*5113495bSYour Name 		HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, LINK_DESC_IDLE_LIST_MODE,
3708*5113495bSYour Name 		0x1));
3709*5113495bSYour Name 
3710*5113495bSYour Name 	HAL_REG_WRITE(soc,
3711*5113495bSYour Name 		HWIO_WBM_R0_IDLE_LIST_SIZE_ADDR(
3712*5113495bSYour Name 		WBM_REG_REG_BASE),
3713*5113495bSYour Name 		HAL_SM(HWIO_WBM_R0_IDLE_LIST_SIZE,
3714*5113495bSYour Name 		SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST,
3715*5113495bSYour Name 		reg_tot_scatter_buf_size));
3716*5113495bSYour Name 
3717*5113495bSYour Name 	HAL_REG_WRITE(soc,
3718*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_LSB_ADDR(
3719*5113495bSYour Name 		WBM_REG_REG_BASE),
3720*5113495bSYour Name 		scatter_bufs_base_paddr[0] & 0xffffffff);
3721*5113495bSYour Name 
3722*5113495bSYour Name 	HAL_REG_WRITE(soc,
3723*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
3724*5113495bSYour Name 		WBM_REG_REG_BASE),
3725*5113495bSYour Name 		((uint64_t)(scatter_bufs_base_paddr[0]) >> 32) &
3726*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_BASE_ADDRESS_39_32_BMSK);
3727*5113495bSYour Name 
3728*5113495bSYour Name 	HAL_REG_WRITE(soc,
3729*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
3730*5113495bSYour Name 		WBM_REG_REG_BASE),
3731*5113495bSYour Name 		HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
3732*5113495bSYour Name 		BASE_ADDRESS_39_32, ((uint64_t)(scatter_bufs_base_paddr[0])
3733*5113495bSYour Name 								>> 32)) |
3734*5113495bSYour Name 		HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
3735*5113495bSYour Name 		ADDRESS_MATCH_TAG, ADDRESS_MATCH_TAG_VAL));
3736*5113495bSYour Name 
3737*5113495bSYour Name 	/* ADDRESS_MATCH_TAG field in the above register is expected to match
3738*5113495bSYour Name 	 * with the upper bits of link pointer. The above write sets this field
3739*5113495bSYour Name 	 * to zero and we are also setting the upper bits of link pointers to
3740*5113495bSYour Name 	 * zero while setting up the link list of scatter buffers above
3741*5113495bSYour Name 	 */
3742*5113495bSYour Name 
3743*5113495bSYour Name 	/* Setup head and tail pointers for the idle list */
3744*5113495bSYour Name 	HAL_REG_WRITE(soc,
3745*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
3746*5113495bSYour Name 		WBM_REG_REG_BASE),
3747*5113495bSYour Name 		scatter_bufs_base_paddr[num_scatter_bufs - 1] & 0xffffffff);
3748*5113495bSYour Name 	HAL_REG_WRITE(soc,
3749*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1_ADDR(
3750*5113495bSYour Name 		WBM_REG_REG_BASE),
3751*5113495bSYour Name 		HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
3752*5113495bSYour Name 		BUFFER_ADDRESS_39_32,
3753*5113495bSYour Name 		((uint64_t)(scatter_bufs_base_paddr[num_scatter_bufs - 1])
3754*5113495bSYour Name 								>> 32)) |
3755*5113495bSYour Name 		HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
3756*5113495bSYour Name 		HEAD_POINTER_OFFSET, last_buf_end_offset >> 2));
3757*5113495bSYour Name 
3758*5113495bSYour Name 	HAL_REG_WRITE(soc,
3759*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
3760*5113495bSYour Name 		WBM_REG_REG_BASE),
3761*5113495bSYour Name 		scatter_bufs_base_paddr[0] & 0xffffffff);
3762*5113495bSYour Name 
3763*5113495bSYour Name 	HAL_REG_WRITE(soc,
3764*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX0_ADDR(
3765*5113495bSYour Name 		WBM_REG_REG_BASE),
3766*5113495bSYour Name 		scatter_bufs_base_paddr[0] & 0xffffffff);
3767*5113495bSYour Name 	HAL_REG_WRITE(soc,
3768*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1_ADDR(
3769*5113495bSYour Name 		WBM_REG_REG_BASE),
3770*5113495bSYour Name 		HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
3771*5113495bSYour Name 		BUFFER_ADDRESS_39_32,
3772*5113495bSYour Name 		((uint64_t)(scatter_bufs_base_paddr[0]) >>
3773*5113495bSYour Name 		32)) | HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
3774*5113495bSYour Name 		TAIL_POINTER_OFFSET, 0));
3775*5113495bSYour Name 
3776*5113495bSYour Name 	HAL_REG_WRITE(soc,
3777*5113495bSYour Name 		HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HP_ADDR(
3778*5113495bSYour Name 		WBM_REG_REG_BASE),
3779*5113495bSYour Name 		2 * num_entries);
3780*5113495bSYour Name 
3781*5113495bSYour Name 	/* Set RING_ID_DISABLE */
3782*5113495bSYour Name 	val = HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, RING_ID_DISABLE, 1);
3783*5113495bSYour Name 
3784*5113495bSYour Name 	/*
3785*5113495bSYour Name 	 * SRNG_ENABLE bit is not available in HWK v1 (QCA8074v1). Hence
3786*5113495bSYour Name 	 * check the presence of the bit before toggling it.
3787*5113495bSYour Name 	 */
3788*5113495bSYour Name #ifdef HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE_BMSK
3789*5113495bSYour Name 	val |= HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, SRNG_ENABLE, 1);
3790*5113495bSYour Name #endif
3791*5113495bSYour Name 	HAL_REG_WRITE(soc,
3792*5113495bSYour Name 		      HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_ADDR(WBM_REG_REG_BASE),
3793*5113495bSYour Name 		      val);
3794*5113495bSYour Name }
3795*5113495bSYour Name 
3796*5113495bSYour Name #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION
3797*5113495bSYour Name #define HAL_WBM_MISC_CONTROL_SPARE_CONTROL_FIELD_BIT15 0x8000
3798*5113495bSYour Name #endif
3799*5113495bSYour Name 
3800*5113495bSYour Name /**
3801*5113495bSYour Name  * hal_cookie_conversion_reg_cfg_generic_be() - set cookie conversion relevant register
3802*5113495bSYour Name  *					for REO/WBM
3803*5113495bSYour Name  * @hal_soc_hdl: HAL soc handle
3804*5113495bSYour Name  * @cc_cfg: structure pointer for HW cookie conversion configuration
3805*5113495bSYour Name  *
3806*5113495bSYour Name  * Return: None
3807*5113495bSYour Name  */
3808*5113495bSYour Name static inline
hal_cookie_conversion_reg_cfg_generic_be(hal_soc_handle_t hal_soc_hdl,struct hal_hw_cc_config * cc_cfg)3809*5113495bSYour Name void hal_cookie_conversion_reg_cfg_generic_be(hal_soc_handle_t hal_soc_hdl,
3810*5113495bSYour Name 					      struct hal_hw_cc_config *cc_cfg)
3811*5113495bSYour Name {
3812*5113495bSYour Name 	uint32_t reg_addr, reg_val = 0;
3813*5113495bSYour Name 	struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
3814*5113495bSYour Name 
3815*5113495bSYour Name 	/* REO CFG */
3816*5113495bSYour Name 	reg_addr = HWIO_REO_R0_SW_COOKIE_CFG0_ADDR(REO_REG_REG_BASE);
3817*5113495bSYour Name 	reg_val = cc_cfg->lut_base_addr_31_0;
3818*5113495bSYour Name 	HAL_REG_WRITE(soc, reg_addr, reg_val);
3819*5113495bSYour Name 
3820*5113495bSYour Name 	reg_addr = HWIO_REO_R0_SW_COOKIE_CFG1_ADDR(REO_REG_REG_BASE);
3821*5113495bSYour Name 	reg_val = 0;
3822*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
3823*5113495bSYour Name 			  SW_COOKIE_CONVERT_GLOBAL_ENABLE,
3824*5113495bSYour Name 			  cc_cfg->cc_global_en);
3825*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
3826*5113495bSYour Name 			  SW_COOKIE_CONVERT_ENABLE,
3827*5113495bSYour Name 			  cc_cfg->cc_global_en);
3828*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
3829*5113495bSYour Name 			  PAGE_ALIGNMENT,
3830*5113495bSYour Name 			  cc_cfg->page_4k_align);
3831*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
3832*5113495bSYour Name 			  COOKIE_OFFSET_MSB,
3833*5113495bSYour Name 			  cc_cfg->cookie_offset_msb);
3834*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
3835*5113495bSYour Name 			  COOKIE_PAGE_MSB,
3836*5113495bSYour Name 			  cc_cfg->cookie_page_msb);
3837*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
3838*5113495bSYour Name 			  CMEM_LUT_BASE_ADDR_39_32,
3839*5113495bSYour Name 			  cc_cfg->lut_base_addr_39_32);
3840*5113495bSYour Name 	HAL_REG_WRITE(soc, reg_addr, reg_val);
3841*5113495bSYour Name 
3842*5113495bSYour Name 	/* WBM CFG */
3843*5113495bSYour Name 	reg_addr = HWIO_WBM_R0_SW_COOKIE_CFG0_ADDR(WBM_REG_REG_BASE);
3844*5113495bSYour Name 	reg_val = cc_cfg->lut_base_addr_31_0;
3845*5113495bSYour Name 	HAL_REG_WRITE(soc, reg_addr, reg_val);
3846*5113495bSYour Name 
3847*5113495bSYour Name 	reg_addr = HWIO_WBM_R0_SW_COOKIE_CFG1_ADDR(WBM_REG_REG_BASE);
3848*5113495bSYour Name 	reg_val = 0;
3849*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
3850*5113495bSYour Name 			  PAGE_ALIGNMENT,
3851*5113495bSYour Name 			  cc_cfg->page_4k_align);
3852*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
3853*5113495bSYour Name 			  COOKIE_OFFSET_MSB,
3854*5113495bSYour Name 			  cc_cfg->cookie_offset_msb);
3855*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
3856*5113495bSYour Name 			  COOKIE_PAGE_MSB,
3857*5113495bSYour Name 			  cc_cfg->cookie_page_msb);
3858*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
3859*5113495bSYour Name 			  CMEM_LUT_BASE_ADDR_39_32,
3860*5113495bSYour Name 			  cc_cfg->lut_base_addr_39_32);
3861*5113495bSYour Name 	HAL_REG_WRITE(soc, reg_addr, reg_val);
3862*5113495bSYour Name 
3863*5113495bSYour Name 	/*
3864*5113495bSYour Name 	 * WCSS_UMAC_WBM_R0_SW_COOKIE_CONVERT_CFG default value is 0x1FE,
3865*5113495bSYour Name 	 */
3866*5113495bSYour Name 	reg_addr = HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG_ADDR(WBM_REG_REG_BASE);
3867*5113495bSYour Name 	reg_val = 0;
3868*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
3869*5113495bSYour Name 			  WBM_COOKIE_CONV_GLOBAL_ENABLE,
3870*5113495bSYour Name 			  cc_cfg->cc_global_en);
3871*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
3872*5113495bSYour Name 			  WBM2SW6_COOKIE_CONVERSION_EN,
3873*5113495bSYour Name 			  cc_cfg->wbm2sw6_cc_en);
3874*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
3875*5113495bSYour Name 			  WBM2SW5_COOKIE_CONVERSION_EN,
3876*5113495bSYour Name 			  cc_cfg->wbm2sw5_cc_en);
3877*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
3878*5113495bSYour Name 			  WBM2SW4_COOKIE_CONVERSION_EN,
3879*5113495bSYour Name 			  cc_cfg->wbm2sw4_cc_en);
3880*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
3881*5113495bSYour Name 			  WBM2SW3_COOKIE_CONVERSION_EN,
3882*5113495bSYour Name 			  cc_cfg->wbm2sw3_cc_en);
3883*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
3884*5113495bSYour Name 			  WBM2SW2_COOKIE_CONVERSION_EN,
3885*5113495bSYour Name 			  cc_cfg->wbm2sw2_cc_en);
3886*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
3887*5113495bSYour Name 			  WBM2SW1_COOKIE_CONVERSION_EN,
3888*5113495bSYour Name 			  cc_cfg->wbm2sw1_cc_en);
3889*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
3890*5113495bSYour Name 			  WBM2SW0_COOKIE_CONVERSION_EN,
3891*5113495bSYour Name 			  cc_cfg->wbm2sw0_cc_en);
3892*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
3893*5113495bSYour Name 			  WBM2FW_COOKIE_CONVERSION_EN,
3894*5113495bSYour Name 			  cc_cfg->wbm2fw_cc_en);
3895*5113495bSYour Name 	HAL_REG_WRITE(soc, reg_addr, reg_val);
3896*5113495bSYour Name 
3897*5113495bSYour Name #ifdef HWIO_WBM_R0_WBM_CFG_2_COOKIE_DEBUG_SEL_BMSK
3898*5113495bSYour Name 	reg_addr = HWIO_WBM_R0_WBM_CFG_2_ADDR(WBM_REG_REG_BASE);
3899*5113495bSYour Name 	reg_val = 0;
3900*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
3901*5113495bSYour Name 			  COOKIE_DEBUG_SEL,
3902*5113495bSYour Name 			  cc_cfg->cc_global_en);
3903*5113495bSYour Name 
3904*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
3905*5113495bSYour Name 			  COOKIE_CONV_INDICATION_EN,
3906*5113495bSYour Name 			  cc_cfg->cc_global_en);
3907*5113495bSYour Name 
3908*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
3909*5113495bSYour Name 			  ERROR_PATH_COOKIE_CONV_EN,
3910*5113495bSYour Name 			  cc_cfg->error_path_cookie_conv_en);
3911*5113495bSYour Name 
3912*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
3913*5113495bSYour Name 			  RELEASE_PATH_COOKIE_CONV_EN,
3914*5113495bSYour Name 			  cc_cfg->release_path_cookie_conv_en);
3915*5113495bSYour Name 
3916*5113495bSYour Name 	HAL_REG_WRITE(soc, reg_addr, reg_val);
3917*5113495bSYour Name #endif
3918*5113495bSYour Name #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION
3919*5113495bSYour Name 	/*
3920*5113495bSYour Name 	 * To enable indication for HW cookie conversion done or not for
3921*5113495bSYour Name 	 * WBM, WCSS_UMAC_WBM_R0_MISC_CONTROL spare_control field 15th
3922*5113495bSYour Name 	 * bit spare_control[15] should be set.
3923*5113495bSYour Name 	 */
3924*5113495bSYour Name 	reg_addr = HWIO_WBM_R0_MISC_CONTROL_ADDR(WBM_REG_REG_BASE);
3925*5113495bSYour Name 	reg_val = HAL_REG_READ(soc, reg_addr);
3926*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_WCSS_UMAC_WBM_R0_MISC_CONTROL,
3927*5113495bSYour Name 			  SPARE_CONTROL,
3928*5113495bSYour Name 			  HAL_WBM_MISC_CONTROL_SPARE_CONTROL_FIELD_BIT15);
3929*5113495bSYour Name 	HAL_REG_WRITE(soc, reg_addr, reg_val);
3930*5113495bSYour Name #endif
3931*5113495bSYour Name }
3932*5113495bSYour Name 
3933*5113495bSYour Name /**
3934*5113495bSYour Name  * hal_set_ba_aging_timeout_be_generic() - Set BA Aging timeout
3935*5113495bSYour Name  * @hal_soc_hdl: Opaque HAL SOC handle
3936*5113495bSYour Name  * @ac: Access category
3937*5113495bSYour Name  * ac: 0 - Background, 1 - Best Effort, 2 - Video, 3 - Voice
3938*5113495bSYour Name  * @value: Input value to set
3939*5113495bSYour Name  */
3940*5113495bSYour Name static inline
hal_set_ba_aging_timeout_be_generic(hal_soc_handle_t hal_soc_hdl,uint8_t ac,uint32_t value)3941*5113495bSYour Name void hal_set_ba_aging_timeout_be_generic(hal_soc_handle_t hal_soc_hdl,
3942*5113495bSYour Name 					 uint8_t ac, uint32_t value)
3943*5113495bSYour Name {
3944*5113495bSYour Name 	struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
3945*5113495bSYour Name 
3946*5113495bSYour Name 	switch (ac) {
3947*5113495bSYour Name 	case WME_AC_BE:
3948*5113495bSYour Name 		HAL_REG_WRITE(soc,
3949*5113495bSYour Name 			      HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(
3950*5113495bSYour Name 			      REO_REG_REG_BASE),
3951*5113495bSYour Name 			      value * 1000);
3952*5113495bSYour Name 		break;
3953*5113495bSYour Name 	case WME_AC_BK:
3954*5113495bSYour Name 		HAL_REG_WRITE(soc,
3955*5113495bSYour Name 			      HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(
3956*5113495bSYour Name 			      REO_REG_REG_BASE),
3957*5113495bSYour Name 			      value * 1000);
3958*5113495bSYour Name 		break;
3959*5113495bSYour Name 	case WME_AC_VI:
3960*5113495bSYour Name 		HAL_REG_WRITE(soc,
3961*5113495bSYour Name 			      HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(
3962*5113495bSYour Name 			      REO_REG_REG_BASE),
3963*5113495bSYour Name 			      value * 1000);
3964*5113495bSYour Name 		break;
3965*5113495bSYour Name 	case WME_AC_VO:
3966*5113495bSYour Name 		HAL_REG_WRITE(soc,
3967*5113495bSYour Name 			      HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(
3968*5113495bSYour Name 			      REO_REG_REG_BASE),
3969*5113495bSYour Name 			      value * 1000);
3970*5113495bSYour Name 		break;
3971*5113495bSYour Name 	default:
3972*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
3973*5113495bSYour Name 			  "Invalid AC: %d\n", ac);
3974*5113495bSYour Name 	}
3975*5113495bSYour Name }
3976*5113495bSYour Name 
3977*5113495bSYour Name /**
3978*5113495bSYour Name  * hal_tx_populate_bank_register_be() - populate the bank register with
3979*5113495bSYour Name  *		the software configs.
3980*5113495bSYour Name  * @hal_soc_hdl: HAL soc handle
3981*5113495bSYour Name  * @config: bank config
3982*5113495bSYour Name  * @bank_id: bank id to be configured
3983*5113495bSYour Name  *
3984*5113495bSYour Name  * Returns: None
3985*5113495bSYour Name  */
3986*5113495bSYour Name #ifdef HWIO_TCL_R0_SW_CONFIG_BANK_n_MCAST_PACKET_CTRL_SHFT
3987*5113495bSYour Name static inline void
hal_tx_populate_bank_register_be(hal_soc_handle_t hal_soc_hdl,union hal_tx_bank_config * config,uint8_t bank_id)3988*5113495bSYour Name hal_tx_populate_bank_register_be(hal_soc_handle_t hal_soc_hdl,
3989*5113495bSYour Name 				 union hal_tx_bank_config *config,
3990*5113495bSYour Name 				 uint8_t bank_id)
3991*5113495bSYour Name {
3992*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
3993*5113495bSYour Name 	uint32_t reg_addr, reg_val = 0;
3994*5113495bSYour Name 
3995*5113495bSYour Name 	reg_addr = HWIO_TCL_R0_SW_CONFIG_BANK_n_ADDR(MAC_TCL_REG_REG_BASE,
3996*5113495bSYour Name 						     bank_id);
3997*5113495bSYour Name 
3998*5113495bSYour Name 	reg_val |= (config->epd << HWIO_TCL_R0_SW_CONFIG_BANK_n_EPD_SHFT);
3999*5113495bSYour Name 	reg_val |= (config->encap_type <<
4000*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_ENCAP_TYPE_SHFT);
4001*5113495bSYour Name 	reg_val |= (config->encrypt_type <<
4002*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_ENCRYPT_TYPE_SHFT);
4003*5113495bSYour Name 	reg_val |= (config->src_buffer_swap <<
4004*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_SRC_BUFFER_SWAP_SHFT);
4005*5113495bSYour Name 	reg_val |= (config->link_meta_swap <<
4006*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_LINK_META_SWAP_SHFT);
4007*5113495bSYour Name 	reg_val |= (config->index_lookup_enable <<
4008*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_INDEX_LOOKUP_ENABLE_SHFT);
4009*5113495bSYour Name 	reg_val |= (config->addrx_en <<
4010*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_ADDRX_EN_SHFT);
4011*5113495bSYour Name 	reg_val |= (config->addry_en <<
4012*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_ADDRY_EN_SHFT);
4013*5113495bSYour Name 	reg_val |= (config->mesh_enable <<
4014*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_MESH_ENABLE_SHFT);
4015*5113495bSYour Name 	reg_val |= (config->vdev_id_check_en <<
4016*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_VDEV_ID_CHECK_EN_SHFT);
4017*5113495bSYour Name 	reg_val |= (config->pmac_id <<
4018*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_PMAC_ID_SHFT);
4019*5113495bSYour Name 	reg_val |= (config->mcast_pkt_ctrl <<
4020*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_MCAST_PACKET_CTRL_SHFT);
4021*5113495bSYour Name 
4022*5113495bSYour Name 	HAL_REG_WRITE(hal_soc, reg_addr, reg_val);
4023*5113495bSYour Name }
4024*5113495bSYour Name #else
4025*5113495bSYour Name static inline void
hal_tx_populate_bank_register_be(hal_soc_handle_t hal_soc_hdl,union hal_tx_bank_config * config,uint8_t bank_id)4026*5113495bSYour Name hal_tx_populate_bank_register_be(hal_soc_handle_t hal_soc_hdl,
4027*5113495bSYour Name 				 union hal_tx_bank_config *config,
4028*5113495bSYour Name 				 uint8_t bank_id)
4029*5113495bSYour Name {
4030*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
4031*5113495bSYour Name 	uint32_t reg_addr, reg_val = 0;
4032*5113495bSYour Name 
4033*5113495bSYour Name 	reg_addr = HWIO_TCL_R0_SW_CONFIG_BANK_n_ADDR(MAC_TCL_REG_REG_BASE,
4034*5113495bSYour Name 						     bank_id);
4035*5113495bSYour Name 
4036*5113495bSYour Name 	reg_val |= (config->epd << HWIO_TCL_R0_SW_CONFIG_BANK_n_EPD_SHFT);
4037*5113495bSYour Name 	reg_val |= (config->encap_type <<
4038*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_ENCAP_TYPE_SHFT);
4039*5113495bSYour Name 	reg_val |= (config->encrypt_type <<
4040*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_ENCRYPT_TYPE_SHFT);
4041*5113495bSYour Name 	reg_val |= (config->src_buffer_swap <<
4042*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_SRC_BUFFER_SWAP_SHFT);
4043*5113495bSYour Name 	reg_val |= (config->link_meta_swap <<
4044*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_LINK_META_SWAP_SHFT);
4045*5113495bSYour Name 	reg_val |= (config->index_lookup_enable <<
4046*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_INDEX_LOOKUP_ENABLE_SHFT);
4047*5113495bSYour Name 	reg_val |= (config->addrx_en <<
4048*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_ADDRX_EN_SHFT);
4049*5113495bSYour Name 	reg_val |= (config->addry_en <<
4050*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_ADDRY_EN_SHFT);
4051*5113495bSYour Name 	reg_val |= (config->mesh_enable <<
4052*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_MESH_ENABLE_SHFT);
4053*5113495bSYour Name 	reg_val |= (config->vdev_id_check_en <<
4054*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_VDEV_ID_CHECK_EN_SHFT);
4055*5113495bSYour Name 	reg_val |= (config->pmac_id <<
4056*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_PMAC_ID_SHFT);
4057*5113495bSYour Name 	reg_val |= (config->dscp_tid_map_id <<
4058*5113495bSYour Name 			HWIO_TCL_R0_SW_CONFIG_BANK_n_DSCP_TID_TABLE_NUM_SHFT);
4059*5113495bSYour Name 
4060*5113495bSYour Name 	HAL_REG_WRITE(hal_soc, reg_addr, reg_val);
4061*5113495bSYour Name }
4062*5113495bSYour Name #endif
4063*5113495bSYour Name 
4064*5113495bSYour Name 
4065*5113495bSYour Name #ifdef HWIO_TCL_R0_VDEV_MCAST_PACKET_CTRL_MAP_n_VAL_SHFT
4066*5113495bSYour Name 
4067*5113495bSYour Name #define HAL_TCL_VDEV_MCAST_PACKET_CTRL_REG_ID(vdev_id) (vdev_id >> 0x4)
4068*5113495bSYour Name #define HAL_TCL_VDEV_MCAST_PACKET_CTRL_INDEX_IN_REG(vdev_id) (vdev_id & 0xF)
4069*5113495bSYour Name #define HAL_TCL_VDEV_MCAST_PACKET_CTRL_MASK 0x3
4070*5113495bSYour Name #define HAL_TCL_VDEV_MCAST_PACKET_CTRL_SHIFT 0x2
4071*5113495bSYour Name 
4072*5113495bSYour Name /**
4073*5113495bSYour Name  * hal_tx_vdev_mcast_ctrl_set_be() - set mcast_ctrl value
4074*5113495bSYour Name  * @hal_soc_hdl: HAL SoC context
4075*5113495bSYour Name  * @vdev_id: vdev identifier
4076*5113495bSYour Name  * @mcast_ctrl_val: mcast ctrl value for this VAP
4077*5113495bSYour Name  *
4078*5113495bSYour Name  * Return: void
4079*5113495bSYour Name  */
4080*5113495bSYour Name static inline void
hal_tx_vdev_mcast_ctrl_set_be(hal_soc_handle_t hal_soc_hdl,uint8_t vdev_id,uint8_t mcast_ctrl_val)4081*5113495bSYour Name hal_tx_vdev_mcast_ctrl_set_be(hal_soc_handle_t hal_soc_hdl,
4082*5113495bSYour Name 			      uint8_t vdev_id, uint8_t mcast_ctrl_val)
4083*5113495bSYour Name {
4084*5113495bSYour Name 	struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
4085*5113495bSYour Name 	uint32_t reg_addr, reg_val = 0;
4086*5113495bSYour Name 	uint32_t val;
4087*5113495bSYour Name 	uint8_t reg_idx = HAL_TCL_VDEV_MCAST_PACKET_CTRL_REG_ID(vdev_id);
4088*5113495bSYour Name 	uint8_t index_in_reg =
4089*5113495bSYour Name 		HAL_TCL_VDEV_MCAST_PACKET_CTRL_INDEX_IN_REG(vdev_id);
4090*5113495bSYour Name 
4091*5113495bSYour Name 	reg_addr =
4092*5113495bSYour Name 	HWIO_TCL_R0_VDEV_MCAST_PACKET_CTRL_MAP_n_ADDR(MAC_TCL_REG_REG_BASE,
4093*5113495bSYour Name 						      reg_idx);
4094*5113495bSYour Name 
4095*5113495bSYour Name 	val = HAL_REG_READ(hal_soc, reg_addr);
4096*5113495bSYour Name 
4097*5113495bSYour Name 	/* mask out other stored value */
4098*5113495bSYour Name 	val &= (~(HAL_TCL_VDEV_MCAST_PACKET_CTRL_MASK <<
4099*5113495bSYour Name 		  (HAL_TCL_VDEV_MCAST_PACKET_CTRL_SHIFT * index_in_reg)));
4100*5113495bSYour Name 
4101*5113495bSYour Name 	reg_val = val |
4102*5113495bSYour Name 		((HAL_TCL_VDEV_MCAST_PACKET_CTRL_MASK & mcast_ctrl_val) <<
4103*5113495bSYour Name 		 (HAL_TCL_VDEV_MCAST_PACKET_CTRL_SHIFT * index_in_reg));
4104*5113495bSYour Name 
4105*5113495bSYour Name 	HAL_REG_WRITE(hal_soc, reg_addr, reg_val);
4106*5113495bSYour Name }
4107*5113495bSYour Name #else
4108*5113495bSYour Name static inline void
hal_tx_vdev_mcast_ctrl_set_be(hal_soc_handle_t hal_soc_hdl,uint8_t vdev_id,uint8_t mcast_ctrl_val)4109*5113495bSYour Name hal_tx_vdev_mcast_ctrl_set_be(hal_soc_handle_t hal_soc_hdl,
4110*5113495bSYour Name 			      uint8_t vdev_id, uint8_t mcast_ctrl_val)
4111*5113495bSYour Name {
4112*5113495bSYour Name }
4113*5113495bSYour Name #endif
4114*5113495bSYour Name 
4115*5113495bSYour Name #endif /* _HAL_BE_GENERIC_API_H_ */
4116