xref: /wlan-driver/qca-wifi-host-cmn/hal/wifi3.0/rh/hal_rh_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_RH_GENERIC_API_H_
21*5113495bSYour Name #define _HAL_RH_GENERIC_API_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include "hal_tx.h"
24*5113495bSYour Name #include "hal_rh_tx.h"
25*5113495bSYour Name #include "hal_rh_rx.h"
26*5113495bSYour Name #include <htt.h>
27*5113495bSYour Name 
28*5113495bSYour Name #ifdef QCA_UNDECODED_METADATA_SUPPORT
29*5113495bSYour Name static inline void
hal_rx_get_phyrx_abort(struct hal_soc * hal,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)30*5113495bSYour Name hal_rx_get_phyrx_abort(struct hal_soc *hal, void *rx_tlv,
31*5113495bSYour Name 		       struct hal_rx_ppdu_info *ppdu_info){
32*5113495bSYour Name 	switch (hal->target_type) {
33*5113495bSYour Name 	case TARGET_TYPE_QCN9000:
34*5113495bSYour Name 		ppdu_info->rx_status.phyrx_abort =
35*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_2,
36*5113495bSYour Name 				   PHYRX_ABORT_REQUEST_INFO_VALID);
37*5113495bSYour Name 		ppdu_info->rx_status.phyrx_abort_reason =
38*5113495bSYour Name 			HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_11,
39*5113495bSYour Name 				   PHYRX_ABORT_REQUEST_INFO_DETAILS_PHYRX_ABORT_REASON);
40*5113495bSYour Name 		break;
41*5113495bSYour Name 	default:
42*5113495bSYour Name 		break;
43*5113495bSYour Name 	}
44*5113495bSYour Name }
45*5113495bSYour Name 
46*5113495bSYour Name static inline void
hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * ht_sig_info)47*5113495bSYour Name hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info *ppdu_info,
48*5113495bSYour Name 		       uint8_t *ht_sig_info)
49*5113495bSYour Name {
50*5113495bSYour Name 	ppdu_info->rx_status.ht_length =
51*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_0, LENGTH);
52*5113495bSYour Name 	ppdu_info->rx_status.smoothing =
53*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, SMOOTHING);
54*5113495bSYour Name 	ppdu_info->rx_status.not_sounding =
55*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, NOT_SOUNDING);
56*5113495bSYour Name 	ppdu_info->rx_status.aggregation =
57*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, AGGREGATION);
58*5113495bSYour Name 	ppdu_info->rx_status.ht_stbc =
59*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, STBC);
60*5113495bSYour Name 	ppdu_info->rx_status.ht_crc =
61*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, CRC);
62*5113495bSYour Name }
63*5113495bSYour Name 
64*5113495bSYour Name static inline void
hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * l_sig_a_info)65*5113495bSYour Name hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info *ppdu_info,
66*5113495bSYour Name 			uint8_t *l_sig_a_info)
67*5113495bSYour Name {
68*5113495bSYour Name 	ppdu_info->rx_status.l_sig_length =
69*5113495bSYour Name 		HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, LENGTH);
70*5113495bSYour Name 	ppdu_info->rx_status.l_sig_a_parity =
71*5113495bSYour Name 		HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, PARITY);
72*5113495bSYour Name 	ppdu_info->rx_status.l_sig_a_pkt_type =
73*5113495bSYour Name 		HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, PKT_TYPE);
74*5113495bSYour Name 	ppdu_info->rx_status.l_sig_a_implicit_sounding =
75*5113495bSYour Name 		HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0,
76*5113495bSYour Name 			   CAPTURED_IMPLICIT_SOUNDING);
77*5113495bSYour Name }
78*5113495bSYour Name 
79*5113495bSYour Name static inline void
hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * vht_sig_a_info)80*5113495bSYour Name hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info *ppdu_info,
81*5113495bSYour Name 			  uint8_t *vht_sig_a_info)
82*5113495bSYour Name {
83*5113495bSYour Name 	ppdu_info->rx_status.vht_no_txop_ps =
84*5113495bSYour Name 		HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0,
85*5113495bSYour Name 			   TXOP_PS_NOT_ALLOWED);
86*5113495bSYour Name 	ppdu_info->rx_status.vht_crc =
87*5113495bSYour Name 		HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1, CRC);
88*5113495bSYour Name }
89*5113495bSYour Name 
90*5113495bSYour Name static inline void
hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * he_sig_a_su_info)91*5113495bSYour Name hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info *ppdu_info,
92*5113495bSYour Name 				uint8_t *he_sig_a_su_info) {
93*5113495bSYour Name 	ppdu_info->rx_status.he_crc =
94*5113495bSYour Name 		HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, CRC);
95*5113495bSYour Name }
96*5113495bSYour Name 
97*5113495bSYour Name static inline void
hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * he_sig_a_mu_dl_info)98*5113495bSYour Name hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info *ppdu_info,
99*5113495bSYour Name 				   uint8_t *he_sig_a_mu_dl_info) {
100*5113495bSYour Name 	ppdu_info->rx_status.he_crc =
101*5113495bSYour Name 		HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1, CRC);
102*5113495bSYour Name }
103*5113495bSYour Name #else
104*5113495bSYour Name static inline void
hal_rx_get_phyrx_abort(struct hal_soc * hal,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)105*5113495bSYour Name hal_rx_get_phyrx_abort(struct hal_soc *hal, void *rx_tlv,
106*5113495bSYour Name 		       struct hal_rx_ppdu_info *ppdu_info)
107*5113495bSYour Name {
108*5113495bSYour Name }
109*5113495bSYour Name 
110*5113495bSYour Name static inline void
hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * ht_sig_info)111*5113495bSYour Name hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info *ppdu_info,
112*5113495bSYour Name 		       uint8_t *ht_sig_info)
113*5113495bSYour Name {
114*5113495bSYour Name }
115*5113495bSYour Name 
116*5113495bSYour Name static inline void
hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * l_sig_a_info)117*5113495bSYour Name hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info *ppdu_info,
118*5113495bSYour Name 			uint8_t *l_sig_a_info)
119*5113495bSYour Name {
120*5113495bSYour Name }
121*5113495bSYour Name 
122*5113495bSYour Name static inline void
hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * vht_sig_a_info)123*5113495bSYour Name hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info *ppdu_info,
124*5113495bSYour Name 			  uint8_t *vht_sig_a_info)
125*5113495bSYour Name {
126*5113495bSYour Name }
127*5113495bSYour Name 
128*5113495bSYour Name static inline void
hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * he_sig_a_su_info)129*5113495bSYour Name hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info *ppdu_info,
130*5113495bSYour Name 				uint8_t *he_sig_a_su_info)
131*5113495bSYour Name {
132*5113495bSYour Name }
133*5113495bSYour Name 
134*5113495bSYour Name static inline void
hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * he_sig_a_mu_dl_info)135*5113495bSYour Name hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info *ppdu_info,
136*5113495bSYour Name 				   uint8_t *he_sig_a_mu_dl_info)
137*5113495bSYour Name {
138*5113495bSYour Name }
139*5113495bSYour Name #endif /* QCA_UNDECODED_METADATA_SUPPORT */
140*5113495bSYour Name 
141*5113495bSYour Name /**
142*5113495bSYour Name  * hal_tx_desc_set_buf_addr_generic_rh - Fill Buffer Address information
143*5113495bSYour Name  *	in Tx Descriptor
144*5113495bSYour Name  * @desc: Handle to Tx Descriptor
145*5113495bSYour Name  * @paddr: Physical Address
146*5113495bSYour Name  * @rbm_id: Return Buffer Manager ID
147*5113495bSYour Name  * @desc_id: Descriptor ID
148*5113495bSYour Name  * @type: 0 - Address points to a MSDU buffer
149*5113495bSYour Name  *		1 - Address points to MSDU extension descriptor
150*5113495bSYour Name  *
151*5113495bSYour Name  * Return: void
152*5113495bSYour Name  */
153*5113495bSYour Name static inline void
hal_tx_desc_set_buf_addr_generic_rh(void * desc,dma_addr_t paddr,uint8_t rbm_id,uint32_t desc_id,uint8_t type)154*5113495bSYour Name hal_tx_desc_set_buf_addr_generic_rh(void *desc, dma_addr_t paddr,
155*5113495bSYour Name 				    uint8_t rbm_id, uint32_t desc_id,
156*5113495bSYour Name 				    uint8_t type)
157*5113495bSYour Name {
158*5113495bSYour Name 	/* Set buffer_addr_info.buffer_addr_31_0 */
159*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_0,
160*5113495bSYour Name 		    BUFFER_ADDR_INFO_BUF_ADDR_INFO) =
161*5113495bSYour Name 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_0, BUFFER_ADDR_31_0, paddr);
162*5113495bSYour Name 
163*5113495bSYour Name 	/* Set buffer_addr_info.buffer_addr_39_32 */
164*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
165*5113495bSYour Name 			 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
166*5113495bSYour Name 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, BUFFER_ADDR_39_32,
167*5113495bSYour Name 		       (((uint64_t)paddr) >> 32));
168*5113495bSYour Name 
169*5113495bSYour Name 	/* Set buffer_addr_info.return_buffer_manager = rbm id */
170*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
171*5113495bSYour Name 			 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
172*5113495bSYour Name 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1,
173*5113495bSYour Name 		       RETURN_BUFFER_MANAGER, rbm_id);
174*5113495bSYour Name 
175*5113495bSYour Name 	/* Set buffer_addr_info.sw_buffer_cookie = desc_id */
176*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
177*5113495bSYour Name 		    BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
178*5113495bSYour Name 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, SW_BUFFER_COOKIE,
179*5113495bSYour Name 			  desc_id);
180*5113495bSYour Name 
181*5113495bSYour Name 	/* Set  Buffer or Ext Descriptor Type */
182*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_2,
183*5113495bSYour Name 		    BUF_OR_EXT_DESC_TYPE) |=
184*5113495bSYour Name 		HAL_TX_SM(UNIFIED_TCL_DATA_CMD_2, BUF_OR_EXT_DESC_TYPE, type);
185*5113495bSYour Name }
186*5113495bSYour Name 
187*5113495bSYour Name #if defined(QCA_WIFI_QCA6290_11AX_MU_UL) && defined(QCA_WIFI_QCA6290_11AX)
188*5113495bSYour Name /**
189*5113495bSYour Name  * hal_rx_handle_other_tlvs() - handle special TLVs like MU_UL
190*5113495bSYour Name  * @tlv_tag: Taf of the TLVs
191*5113495bSYour Name  * @rx_tlv: the pointer to the TLVs
192*5113495bSYour Name  * @ppdu_info: pointer to ppdu_info
193*5113495bSYour Name  *
194*5113495bSYour Name  * Return: true if the tlv is handled, false if not
195*5113495bSYour Name  */
196*5113495bSYour Name static inline bool
hal_rx_handle_other_tlvs(uint32_t tlv_tag,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)197*5113495bSYour Name hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv,
198*5113495bSYour Name 			 struct hal_rx_ppdu_info *ppdu_info)
199*5113495bSYour Name {
200*5113495bSYour Name 	uint32_t value;
201*5113495bSYour Name 
202*5113495bSYour Name 	switch (tlv_tag) {
203*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_A_MU_UL_E:
204*5113495bSYour Name 	{
205*5113495bSYour Name 		uint8_t *he_sig_a_mu_ul_info =
206*5113495bSYour Name 			(uint8_t *)rx_tlv +
207*5113495bSYour Name 			HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_UL_0,
208*5113495bSYour Name 					  HE_SIG_A_MU_UL_INFO_PHYRX_HE_SIG_A_MU_UL_INFO_DETAILS);
209*5113495bSYour Name 		ppdu_info->rx_status.he_flags = 1;
210*5113495bSYour Name 
211*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0,
212*5113495bSYour Name 				   FORMAT_INDICATION);
213*5113495bSYour Name 		if (value == 0) {
214*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
215*5113495bSYour Name 				QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
216*5113495bSYour Name 		} else {
217*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
218*5113495bSYour Name 				QDF_MON_STATUS_HE_SU_FORMAT_TYPE;
219*5113495bSYour Name 		}
220*5113495bSYour Name 
221*5113495bSYour Name 		/* data1 */
222*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
223*5113495bSYour Name 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
224*5113495bSYour Name 			QDF_MON_STATUS_HE_DL_UL_KNOWN |
225*5113495bSYour Name 			QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
226*5113495bSYour Name 
227*5113495bSYour Name 		/* data2 */
228*5113495bSYour Name 		ppdu_info->rx_status.he_data2 |=
229*5113495bSYour Name 			QDF_MON_STATUS_TXOP_KNOWN;
230*5113495bSYour Name 
231*5113495bSYour Name 		/*data3*/
232*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info,
233*5113495bSYour Name 				   HE_SIG_A_MU_UL_INFO_0, BSS_COLOR_ID);
234*5113495bSYour Name 		ppdu_info->rx_status.he_data3 = value;
235*5113495bSYour Name 		/* 1 for UL and 0 for DL */
236*5113495bSYour Name 		value = 1;
237*5113495bSYour Name 		value = value << QDF_MON_STATUS_DL_UL_SHIFT;
238*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
239*5113495bSYour Name 
240*5113495bSYour Name 		/*data4*/
241*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0,
242*5113495bSYour Name 				   SPATIAL_REUSE);
243*5113495bSYour Name 		ppdu_info->rx_status.he_data4 = value;
244*5113495bSYour Name 
245*5113495bSYour Name 		/*data5*/
246*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info,
247*5113495bSYour Name 				   HE_SIG_A_MU_UL_INFO_0, TRANSMIT_BW);
248*5113495bSYour Name 		ppdu_info->rx_status.he_data5 = value;
249*5113495bSYour Name 		ppdu_info->rx_status.bw = value;
250*5113495bSYour Name 
251*5113495bSYour Name 		/*data6*/
252*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_1,
253*5113495bSYour Name 				   TXOP_DURATION);
254*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXOP_SHIFT;
255*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
256*5113495bSYour Name 		return true;
257*5113495bSYour Name 	}
258*5113495bSYour Name 	default:
259*5113495bSYour Name 		return false;
260*5113495bSYour Name 	}
261*5113495bSYour Name }
262*5113495bSYour Name #else
263*5113495bSYour Name static inline bool
hal_rx_handle_other_tlvs(uint32_t tlv_tag,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)264*5113495bSYour Name hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv,
265*5113495bSYour Name 			 struct hal_rx_ppdu_info *ppdu_info)
266*5113495bSYour Name {
267*5113495bSYour Name 	return false;
268*5113495bSYour Name }
269*5113495bSYour Name #endif /* QCA_WIFI_QCA6290_11AX_MU_UL && QCA_WIFI_QCA6290_11AX */
270*5113495bSYour Name 
271*5113495bSYour Name #if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET) && \
272*5113495bSYour Name defined(RX_PPDU_END_USER_STATS_22_SW_RESPONSE_REFERENCE_PTR_EXT_OFFSET)
273*5113495bSYour Name 
274*5113495bSYour Name static inline void
hal_rx_handle_mu_ul_info(void * rx_tlv,struct mon_rx_user_status * mon_rx_user_status)275*5113495bSYour Name hal_rx_handle_mu_ul_info(void *rx_tlv,
276*5113495bSYour Name 			 struct mon_rx_user_status *mon_rx_user_status)
277*5113495bSYour Name {
278*5113495bSYour Name 	mon_rx_user_status->mu_ul_user_v0_word0 =
279*5113495bSYour Name 		HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_11,
280*5113495bSYour Name 			   SW_RESPONSE_REFERENCE_PTR);
281*5113495bSYour Name 
282*5113495bSYour Name 	mon_rx_user_status->mu_ul_user_v0_word1 =
283*5113495bSYour Name 		HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_22,
284*5113495bSYour Name 			   SW_RESPONSE_REFERENCE_PTR_EXT);
285*5113495bSYour Name }
286*5113495bSYour Name 
287*5113495bSYour Name static inline void
hal_rx_populate_byte_count(void * rx_tlv,void * ppduinfo,struct mon_rx_user_status * mon_rx_user_status)288*5113495bSYour Name hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
289*5113495bSYour Name 			   struct mon_rx_user_status *mon_rx_user_status)
290*5113495bSYour Name {
291*5113495bSYour Name 	uint32_t mpdu_ok_byte_count;
292*5113495bSYour Name 	uint32_t mpdu_err_byte_count;
293*5113495bSYour Name 
294*5113495bSYour Name 	mpdu_ok_byte_count = HAL_RX_GET(rx_tlv,
295*5113495bSYour Name 					RX_PPDU_END_USER_STATS_17,
296*5113495bSYour Name 					MPDU_OK_BYTE_COUNT);
297*5113495bSYour Name 	mpdu_err_byte_count = HAL_RX_GET(rx_tlv,
298*5113495bSYour Name 					 RX_PPDU_END_USER_STATS_19,
299*5113495bSYour Name 					 MPDU_ERR_BYTE_COUNT);
300*5113495bSYour Name 
301*5113495bSYour Name 	mon_rx_user_status->mpdu_ok_byte_count = mpdu_ok_byte_count;
302*5113495bSYour Name 	mon_rx_user_status->mpdu_err_byte_count = mpdu_err_byte_count;
303*5113495bSYour Name }
304*5113495bSYour Name #else
305*5113495bSYour Name static inline void
hal_rx_handle_mu_ul_info(void * rx_tlv,struct mon_rx_user_status * mon_rx_user_status)306*5113495bSYour Name hal_rx_handle_mu_ul_info(void *rx_tlv,
307*5113495bSYour Name 			 struct mon_rx_user_status *mon_rx_user_status)
308*5113495bSYour Name {
309*5113495bSYour Name }
310*5113495bSYour Name 
311*5113495bSYour Name static inline void
hal_rx_populate_byte_count(void * rx_tlv,void * ppduinfo,struct mon_rx_user_status * mon_rx_user_status)312*5113495bSYour Name hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
313*5113495bSYour Name 			   struct mon_rx_user_status *mon_rx_user_status)
314*5113495bSYour Name {
315*5113495bSYour Name 	struct hal_rx_ppdu_info *ppdu_info =
316*5113495bSYour Name 			(struct hal_rx_ppdu_info *)ppduinfo;
317*5113495bSYour Name 
318*5113495bSYour Name 	/* HKV1: doesn't support mpdu byte count */
319*5113495bSYour Name 	mon_rx_user_status->mpdu_ok_byte_count = ppdu_info->rx_status.ppdu_len;
320*5113495bSYour Name 	mon_rx_user_status->mpdu_err_byte_count = 0;
321*5113495bSYour Name }
322*5113495bSYour Name #endif
323*5113495bSYour Name 
324*5113495bSYour Name static inline void
hal_rx_populate_mu_user_info(void * rx_tlv,void * ppduinfo,uint32_t user_id,struct mon_rx_user_status * mon_rx_user_status)325*5113495bSYour Name hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, uint32_t user_id,
326*5113495bSYour Name 			     struct mon_rx_user_status *mon_rx_user_status)
327*5113495bSYour Name {
328*5113495bSYour Name 	struct mon_rx_info *mon_rx_info;
329*5113495bSYour Name 	struct mon_rx_user_info *mon_rx_user_info;
330*5113495bSYour Name 	struct hal_rx_ppdu_info *ppdu_info =
331*5113495bSYour Name 			(struct hal_rx_ppdu_info *)ppduinfo;
332*5113495bSYour Name 
333*5113495bSYour Name 	mon_rx_info = &ppdu_info->rx_info;
334*5113495bSYour Name 	mon_rx_user_info = &ppdu_info->rx_user_info[user_id];
335*5113495bSYour Name 	mon_rx_user_info->qos_control_info_valid =
336*5113495bSYour Name 		mon_rx_info->qos_control_info_valid;
337*5113495bSYour Name 	mon_rx_user_info->qos_control =  mon_rx_info->qos_control;
338*5113495bSYour Name 
339*5113495bSYour Name 	mon_rx_user_status->ast_index = ppdu_info->rx_status.ast_index;
340*5113495bSYour Name 	mon_rx_user_status->tid = ppdu_info->rx_status.tid;
341*5113495bSYour Name 	mon_rx_user_status->tcp_msdu_count =
342*5113495bSYour Name 		ppdu_info->rx_status.tcp_msdu_count;
343*5113495bSYour Name 	mon_rx_user_status->udp_msdu_count =
344*5113495bSYour Name 		ppdu_info->rx_status.udp_msdu_count;
345*5113495bSYour Name 	mon_rx_user_status->other_msdu_count =
346*5113495bSYour Name 		ppdu_info->rx_status.other_msdu_count;
347*5113495bSYour Name 	mon_rx_user_status->frame_control = ppdu_info->rx_status.frame_control;
348*5113495bSYour Name 	mon_rx_user_status->frame_control_info_valid =
349*5113495bSYour Name 		ppdu_info->rx_status.frame_control_info_valid;
350*5113495bSYour Name 	mon_rx_user_status->data_sequence_control_info_valid =
351*5113495bSYour Name 		ppdu_info->rx_status.data_sequence_control_info_valid;
352*5113495bSYour Name 	mon_rx_user_status->first_data_seq_ctrl =
353*5113495bSYour Name 		ppdu_info->rx_status.first_data_seq_ctrl;
354*5113495bSYour Name 	mon_rx_user_status->preamble_type = ppdu_info->rx_status.preamble_type;
355*5113495bSYour Name 	mon_rx_user_status->ht_flags = ppdu_info->rx_status.ht_flags;
356*5113495bSYour Name 	mon_rx_user_status->rtap_flags = ppdu_info->rx_status.rtap_flags;
357*5113495bSYour Name 	mon_rx_user_status->vht_flags = ppdu_info->rx_status.vht_flags;
358*5113495bSYour Name 	mon_rx_user_status->he_flags = ppdu_info->rx_status.he_flags;
359*5113495bSYour Name 	mon_rx_user_status->rs_flags = ppdu_info->rx_status.rs_flags;
360*5113495bSYour Name 
361*5113495bSYour Name 	mon_rx_user_status->mpdu_cnt_fcs_ok =
362*5113495bSYour Name 		ppdu_info->com_info.mpdu_cnt_fcs_ok;
363*5113495bSYour Name 	mon_rx_user_status->mpdu_cnt_fcs_err =
364*5113495bSYour Name 		ppdu_info->com_info.mpdu_cnt_fcs_err;
365*5113495bSYour Name 	qdf_mem_copy(&mon_rx_user_status->mpdu_fcs_ok_bitmap,
366*5113495bSYour Name 		     &ppdu_info->com_info.mpdu_fcs_ok_bitmap,
367*5113495bSYour Name 		     HAL_RX_NUM_WORDS_PER_PPDU_BITMAP *
368*5113495bSYour Name 		     sizeof(ppdu_info->com_info.mpdu_fcs_ok_bitmap[0]));
369*5113495bSYour Name 
370*5113495bSYour Name 	hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status);
371*5113495bSYour Name }
372*5113495bSYour Name 
373*5113495bSYour Name #define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \
374*5113495bSYour Name 					ppdu_info, rssi_info_tlv) \
375*5113495bSYour Name 	{						\
376*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][0] = \
377*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
378*5113495bSYour Name 				   RSSI_PRI20_CHAIN##chain); \
379*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][1] = \
380*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
381*5113495bSYour Name 				   RSSI_EXT20_CHAIN##chain); \
382*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][2] = \
383*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
384*5113495bSYour Name 				   RSSI_EXT40_LOW20_CHAIN##chain); \
385*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][3] = \
386*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
387*5113495bSYour Name 				   RSSI_EXT40_HIGH20_CHAIN##chain); \
388*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][4] = \
389*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
390*5113495bSYour Name 				   RSSI_EXT80_LOW20_CHAIN##chain); \
391*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][5] = \
392*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
393*5113495bSYour Name 				   RSSI_EXT80_LOW_HIGH20_CHAIN##chain); \
394*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][6] = \
395*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
396*5113495bSYour Name 				   RSSI_EXT80_HIGH_LOW20_CHAIN##chain); \
397*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][7] = \
398*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
399*5113495bSYour Name 				   RSSI_EXT80_HIGH20_CHAIN##chain); \
400*5113495bSYour Name 	}						\
401*5113495bSYour Name 
402*5113495bSYour Name #define HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) \
403*5113495bSYour Name 	{HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(0, 0, 1, ppdu_info, rssi_info_tlv) \
404*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(1, 2, 3, ppdu_info, rssi_info_tlv) \
405*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(2, 4, 5, ppdu_info, rssi_info_tlv) \
406*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(3, 6, 7, ppdu_info, rssi_info_tlv) \
407*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(4, 8, 9, ppdu_info, rssi_info_tlv) \
408*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(5, 10, 11, ppdu_info, rssi_info_tlv) \
409*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(6, 12, 13, ppdu_info, rssi_info_tlv) \
410*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(7, 14, 15, ppdu_info, rssi_info_tlv)} \
411*5113495bSYour Name 
412*5113495bSYour Name static inline uint32_t
hal_rx_update_rssi_chain(struct hal_rx_ppdu_info * ppdu_info,uint8_t * rssi_info_tlv)413*5113495bSYour Name hal_rx_update_rssi_chain(struct hal_rx_ppdu_info *ppdu_info,
414*5113495bSYour Name 			 uint8_t *rssi_info_tlv)
415*5113495bSYour Name {
416*5113495bSYour Name 	HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv)
417*5113495bSYour Name 	return 0;
418*5113495bSYour Name }
419*5113495bSYour Name 
420*5113495bSYour Name #ifdef WLAN_TX_PKT_CAPTURE_ENH
421*5113495bSYour Name static inline void
hal_get_qos_control(void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)422*5113495bSYour Name hal_get_qos_control(void *rx_tlv,
423*5113495bSYour Name 		    struct hal_rx_ppdu_info *ppdu_info)
424*5113495bSYour Name {
425*5113495bSYour Name 	ppdu_info->rx_info.qos_control_info_valid =
426*5113495bSYour Name 		HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
427*5113495bSYour Name 			   QOS_CONTROL_INFO_VALID);
428*5113495bSYour Name 
429*5113495bSYour Name 	if (ppdu_info->rx_info.qos_control_info_valid)
430*5113495bSYour Name 		ppdu_info->rx_info.qos_control =
431*5113495bSYour Name 			HAL_RX_GET(rx_tlv,
432*5113495bSYour Name 				   RX_PPDU_END_USER_STATS_5,
433*5113495bSYour Name 				   QOS_CONTROL_FIELD);
434*5113495bSYour Name }
435*5113495bSYour Name 
436*5113495bSYour Name static inline void
hal_get_mac_addr1(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)437*5113495bSYour Name hal_get_mac_addr1(uint8_t *rx_mpdu_start,
438*5113495bSYour Name 		  struct hal_rx_ppdu_info *ppdu_info)
439*5113495bSYour Name {
440*5113495bSYour Name 	if ((ppdu_info->sw_frame_group_id
441*5113495bSYour Name 	     == HAL_MPDU_SW_FRAME_GROUP_MGMT_PROBE_REQ) ||
442*5113495bSYour Name 	    (ppdu_info->sw_frame_group_id ==
443*5113495bSYour Name 	     HAL_MPDU_SW_FRAME_GROUP_CTRL_RTS)) {
444*5113495bSYour Name 		ppdu_info->rx_info.mac_addr1_valid =
445*5113495bSYour Name 				HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start);
446*5113495bSYour Name 
447*5113495bSYour Name 		*(uint32_t *)&ppdu_info->rx_info.mac_addr1[0] =
448*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
449*5113495bSYour Name 				   RX_MPDU_INFO_15,
450*5113495bSYour Name 				   MAC_ADDR_AD1_31_0);
451*5113495bSYour Name 		if (ppdu_info->sw_frame_group_id ==
452*5113495bSYour Name 		    HAL_MPDU_SW_FRAME_GROUP_CTRL_RTS) {
453*5113495bSYour Name 			*(uint16_t *)&ppdu_info->rx_info.mac_addr1[4] =
454*5113495bSYour Name 				HAL_RX_GET(rx_mpdu_start,
455*5113495bSYour Name 					   RX_MPDU_INFO_16,
456*5113495bSYour Name 					   MAC_ADDR_AD1_47_32);
457*5113495bSYour Name 		}
458*5113495bSYour Name 	}
459*5113495bSYour Name }
460*5113495bSYour Name #else
461*5113495bSYour Name static inline void
hal_get_qos_control(void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)462*5113495bSYour Name hal_get_qos_control(void *rx_tlv,
463*5113495bSYour Name 		    struct hal_rx_ppdu_info *ppdu_info)
464*5113495bSYour Name {
465*5113495bSYour Name }
466*5113495bSYour Name 
467*5113495bSYour Name static inline void
hal_get_mac_addr1(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)468*5113495bSYour Name hal_get_mac_addr1(uint8_t *rx_mpdu_start,
469*5113495bSYour Name 		  struct hal_rx_ppdu_info *ppdu_info)
470*5113495bSYour Name {
471*5113495bSYour Name }
472*5113495bSYour Name #endif
473*5113495bSYour Name 
474*5113495bSYour Name #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
475*5113495bSYour Name static inline void
hal_update_frame_type_cnt(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)476*5113495bSYour Name hal_update_frame_type_cnt(uint8_t *rx_mpdu_start,
477*5113495bSYour Name 			  struct hal_rx_ppdu_info *ppdu_info)
478*5113495bSYour Name {
479*5113495bSYour Name 	uint16_t frame_ctrl;
480*5113495bSYour Name 	uint8_t fc_type;
481*5113495bSYour Name 
482*5113495bSYour Name 	if (HAL_RX_GET_FC_VALID(rx_mpdu_start)) {
483*5113495bSYour Name 		frame_ctrl = HAL_RX_GET(rx_mpdu_start,
484*5113495bSYour Name 					RX_MPDU_INFO_14,
485*5113495bSYour Name 					MPDU_FRAME_CONTROL_FIELD);
486*5113495bSYour Name 		fc_type = HAL_RX_GET_FRAME_CTRL_TYPE(frame_ctrl);
487*5113495bSYour Name 		if (fc_type == HAL_RX_FRAME_CTRL_TYPE_MGMT)
488*5113495bSYour Name 			ppdu_info->frm_type_info.rx_mgmt_cnt++;
489*5113495bSYour Name 		else if (fc_type == HAL_RX_FRAME_CTRL_TYPE_CTRL)
490*5113495bSYour Name 			ppdu_info->frm_type_info.rx_ctrl_cnt++;
491*5113495bSYour Name 		else if (fc_type == HAL_RX_FRAME_CTRL_TYPE_DATA)
492*5113495bSYour Name 			ppdu_info->frm_type_info.rx_data_cnt++;
493*5113495bSYour Name 	}
494*5113495bSYour Name }
495*5113495bSYour Name #else
496*5113495bSYour Name static inline void
hal_update_frame_type_cnt(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)497*5113495bSYour Name hal_update_frame_type_cnt(uint8_t *rx_mpdu_start,
498*5113495bSYour Name 			  struct hal_rx_ppdu_info *ppdu_info)
499*5113495bSYour Name {
500*5113495bSYour Name }
501*5113495bSYour Name #endif
502*5113495bSYour Name 
503*5113495bSYour Name /**
504*5113495bSYour Name  * hal_rx_status_get_tlv_info_generic_rh() - process receive info TLV
505*5113495bSYour Name  * @rx_tlv_hdr: pointer to TLV header
506*5113495bSYour Name  * @ppduinfo: pointer to ppdu_info
507*5113495bSYour Name  * @hal_soc_hdl: HAL SOC handle
508*5113495bSYour Name  * @nbuf: pkt buffer
509*5113495bSYour Name  *
510*5113495bSYour Name  * Return: HAL_TLV_STATUS_PPDU_NOT_DONE or HAL_TLV_STATUS_PPDU_DONE from tlv
511*5113495bSYour Name  */
512*5113495bSYour Name static inline uint32_t
hal_rx_status_get_tlv_info_generic_rh(void * rx_tlv_hdr,void * ppduinfo,hal_soc_handle_t hal_soc_hdl,qdf_nbuf_t nbuf)513*5113495bSYour Name hal_rx_status_get_tlv_info_generic_rh(void *rx_tlv_hdr, void *ppduinfo,
514*5113495bSYour Name 				      hal_soc_handle_t hal_soc_hdl,
515*5113495bSYour Name 				      qdf_nbuf_t nbuf)
516*5113495bSYour Name {
517*5113495bSYour Name 	struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
518*5113495bSYour Name 	uint32_t tlv_tag, user_id, tlv_len, value;
519*5113495bSYour Name 	uint8_t group_id = 0;
520*5113495bSYour Name 	uint8_t he_dcm = 0;
521*5113495bSYour Name 	uint8_t he_stbc = 0;
522*5113495bSYour Name 	uint16_t he_gi = 0;
523*5113495bSYour Name 	uint16_t he_ltf = 0;
524*5113495bSYour Name 	void *rx_tlv;
525*5113495bSYour Name 	bool unhandled = false;
526*5113495bSYour Name 	struct mon_rx_user_status *mon_rx_user_status;
527*5113495bSYour Name 	struct hal_rx_ppdu_info *ppdu_info =
528*5113495bSYour Name 			(struct hal_rx_ppdu_info *)ppduinfo;
529*5113495bSYour Name 
530*5113495bSYour Name 	tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr);
531*5113495bSYour Name 	user_id = HAL_RX_GET_USER_TLV32_USERID(rx_tlv_hdr);
532*5113495bSYour Name 	tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr);
533*5113495bSYour Name 
534*5113495bSYour Name 	rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
535*5113495bSYour Name 
536*5113495bSYour Name 	qdf_trace_hex_dump(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
537*5113495bSYour Name 			   rx_tlv, tlv_len);
538*5113495bSYour Name 
539*5113495bSYour Name 	switch (tlv_tag) {
540*5113495bSYour Name 	case WIFIRX_PPDU_START_E:
541*5113495bSYour Name 	{
542*5113495bSYour Name 		if (qdf_unlikely(ppdu_info->com_info.last_ppdu_id ==
543*5113495bSYour Name 		    HAL_RX_GET(rx_tlv, RX_PPDU_START_0, PHY_PPDU_ID)))
544*5113495bSYour Name 			hal_err("Matching ppdu_id(%u) detected",
545*5113495bSYour Name 				 ppdu_info->com_info.last_ppdu_id);
546*5113495bSYour Name 
547*5113495bSYour Name 		/* Reset ppdu_info before processing the ppdu */
548*5113495bSYour Name 		qdf_mem_zero(ppdu_info,
549*5113495bSYour Name 			     sizeof(struct hal_rx_ppdu_info));
550*5113495bSYour Name 
551*5113495bSYour Name 		ppdu_info->com_info.last_ppdu_id =
552*5113495bSYour Name 			ppdu_info->com_info.ppdu_id =
553*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_START_0,
554*5113495bSYour Name 					   PHY_PPDU_ID);
555*5113495bSYour Name 
556*5113495bSYour Name 		/* channel number is set in PHY meta data */
557*5113495bSYour Name 		ppdu_info->rx_status.chan_num =
558*5113495bSYour Name 			(HAL_RX_GET(rx_tlv, RX_PPDU_START_1,
559*5113495bSYour Name 				SW_PHY_META_DATA) & 0x0000FFFF);
560*5113495bSYour Name 		ppdu_info->rx_status.chan_freq =
561*5113495bSYour Name 			(HAL_RX_GET(rx_tlv, RX_PPDU_START_1,
562*5113495bSYour Name 				SW_PHY_META_DATA) & 0xFFFF0000) >> 16;
563*5113495bSYour Name 		if (ppdu_info->rx_status.chan_num) {
564*5113495bSYour Name 			ppdu_info->rx_status.chan_freq =
565*5113495bSYour Name 				hal_rx_radiotap_num_to_freq(
566*5113495bSYour Name 				ppdu_info->rx_status.chan_num,
567*5113495bSYour Name 				 ppdu_info->rx_status.chan_freq);
568*5113495bSYour Name 		}
569*5113495bSYour Name 		ppdu_info->com_info.ppdu_timestamp =
570*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_START_2,
571*5113495bSYour Name 				   PPDU_START_TIMESTAMP);
572*5113495bSYour Name 		ppdu_info->rx_status.ppdu_timestamp =
573*5113495bSYour Name 			ppdu_info->com_info.ppdu_timestamp;
574*5113495bSYour Name 		ppdu_info->rx_state = HAL_RX_MON_PPDU_START;
575*5113495bSYour Name 
576*5113495bSYour Name 		break;
577*5113495bSYour Name 	}
578*5113495bSYour Name 
579*5113495bSYour Name 	case WIFIRX_PPDU_START_USER_INFO_E:
580*5113495bSYour Name 		break;
581*5113495bSYour Name 
582*5113495bSYour Name 	case WIFIRX_PPDU_END_E:
583*5113495bSYour Name 		dp_nofl_debug("[%s][%d] ppdu_end_e len=%d",
584*5113495bSYour Name 			      __func__, __LINE__, tlv_len);
585*5113495bSYour Name 		/* This is followed by sub-TLVs of PPDU_END */
586*5113495bSYour Name 		ppdu_info->rx_state = HAL_RX_MON_PPDU_END;
587*5113495bSYour Name 		break;
588*5113495bSYour Name 
589*5113495bSYour Name 	case WIFIPHYRX_PKT_END_E:
590*5113495bSYour Name 		hal_rx_get_rtt_info(hal_soc_hdl, rx_tlv, ppdu_info);
591*5113495bSYour Name 		break;
592*5113495bSYour Name 
593*5113495bSYour Name 	case WIFIRXPCU_PPDU_END_INFO_E:
594*5113495bSYour Name 		ppdu_info->rx_status.rx_antenna =
595*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_2, RX_ANTENNA);
596*5113495bSYour Name 		ppdu_info->rx_status.tsft =
597*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_1,
598*5113495bSYour Name 				   WB_TIMESTAMP_UPPER_32);
599*5113495bSYour Name 		ppdu_info->rx_status.tsft = (ppdu_info->rx_status.tsft << 32) |
600*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_0,
601*5113495bSYour Name 				   WB_TIMESTAMP_LOWER_32);
602*5113495bSYour Name 		ppdu_info->rx_status.duration =
603*5113495bSYour Name 			HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_8,
604*5113495bSYour Name 				   RX_PPDU_DURATION);
605*5113495bSYour Name 		hal_rx_get_bb_info(hal_soc_hdl, rx_tlv, ppdu_info);
606*5113495bSYour Name 		hal_rx_get_phyrx_abort(hal, rx_tlv, ppdu_info);
607*5113495bSYour Name 		break;
608*5113495bSYour Name 
609*5113495bSYour Name 	/*
610*5113495bSYour Name 	 * WIFIRX_PPDU_END_USER_STATS_E comes for each user received.
611*5113495bSYour Name 	 * for MU, based on num users we see this tlv that many times.
612*5113495bSYour Name 	 */
613*5113495bSYour Name 	case WIFIRX_PPDU_END_USER_STATS_E:
614*5113495bSYour Name 	{
615*5113495bSYour Name 		unsigned long tid = 0;
616*5113495bSYour Name 		uint16_t seq = 0;
617*5113495bSYour Name 
618*5113495bSYour Name 		ppdu_info->rx_status.ast_index =
619*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4,
620*5113495bSYour Name 					   AST_INDEX);
621*5113495bSYour Name 
622*5113495bSYour Name 		tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12,
623*5113495bSYour Name 				 RECEIVED_QOS_DATA_TID_BITMAP);
624*5113495bSYour Name 		ppdu_info->rx_status.tid = qdf_find_first_bit(&tid,
625*5113495bSYour Name 							      sizeof(tid) * 8);
626*5113495bSYour Name 
627*5113495bSYour Name 		if (ppdu_info->rx_status.tid == (sizeof(tid) * 8))
628*5113495bSYour Name 			ppdu_info->rx_status.tid = HAL_TID_INVALID;
629*5113495bSYour Name 
630*5113495bSYour Name 		ppdu_info->rx_status.tcp_msdu_count =
631*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9,
632*5113495bSYour Name 				   TCP_MSDU_COUNT) +
633*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
634*5113495bSYour Name 				   TCP_ACK_MSDU_COUNT);
635*5113495bSYour Name 		ppdu_info->rx_status.udp_msdu_count =
636*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9,
637*5113495bSYour Name 				   UDP_MSDU_COUNT);
638*5113495bSYour Name 		ppdu_info->rx_status.other_msdu_count =
639*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
640*5113495bSYour Name 				   OTHER_MSDU_COUNT);
641*5113495bSYour Name 
642*5113495bSYour Name 		if (ppdu_info->sw_frame_group_id
643*5113495bSYour Name 		    != HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) {
644*5113495bSYour Name 			ppdu_info->rx_status.frame_control_info_valid =
645*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
646*5113495bSYour Name 					   FRAME_CONTROL_INFO_VALID);
647*5113495bSYour Name 
648*5113495bSYour Name 			if (ppdu_info->rx_status.frame_control_info_valid)
649*5113495bSYour Name 				ppdu_info->rx_status.frame_control =
650*5113495bSYour Name 					HAL_RX_GET(rx_tlv,
651*5113495bSYour Name 						   RX_PPDU_END_USER_STATS_4,
652*5113495bSYour Name 						   FRAME_CONTROL_FIELD);
653*5113495bSYour Name 
654*5113495bSYour Name 			hal_get_qos_control(rx_tlv, ppdu_info);
655*5113495bSYour Name 		}
656*5113495bSYour Name 
657*5113495bSYour Name 		ppdu_info->rx_status.data_sequence_control_info_valid =
658*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
659*5113495bSYour Name 				   DATA_SEQUENCE_CONTROL_INFO_VALID);
660*5113495bSYour Name 
661*5113495bSYour Name 		seq = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_5,
662*5113495bSYour Name 				 FIRST_DATA_SEQ_CTRL);
663*5113495bSYour Name 		if (ppdu_info->rx_status.data_sequence_control_info_valid)
664*5113495bSYour Name 			ppdu_info->rx_status.first_data_seq_ctrl = seq;
665*5113495bSYour Name 
666*5113495bSYour Name 		ppdu_info->rx_status.preamble_type =
667*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
668*5113495bSYour Name 				   HT_CONTROL_FIELD_PKT_TYPE);
669*5113495bSYour Name 		switch (ppdu_info->rx_status.preamble_type) {
670*5113495bSYour Name 		case HAL_RX_PKT_TYPE_11N:
671*5113495bSYour Name 			ppdu_info->rx_status.ht_flags = 1;
672*5113495bSYour Name 			ppdu_info->rx_status.rtap_flags |= HT_SGI_PRESENT;
673*5113495bSYour Name 			break;
674*5113495bSYour Name 		case HAL_RX_PKT_TYPE_11AC:
675*5113495bSYour Name 			ppdu_info->rx_status.vht_flags = 1;
676*5113495bSYour Name 			break;
677*5113495bSYour Name 		case HAL_RX_PKT_TYPE_11AX:
678*5113495bSYour Name 			ppdu_info->rx_status.he_flags = 1;
679*5113495bSYour Name 			break;
680*5113495bSYour Name 		default:
681*5113495bSYour Name 			break;
682*5113495bSYour Name 		}
683*5113495bSYour Name 
684*5113495bSYour Name 		ppdu_info->com_info.mpdu_cnt_fcs_ok =
685*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
686*5113495bSYour Name 				   MPDU_CNT_FCS_OK);
687*5113495bSYour Name 		ppdu_info->com_info.mpdu_cnt_fcs_err =
688*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2,
689*5113495bSYour Name 				   MPDU_CNT_FCS_ERR);
690*5113495bSYour Name 		if ((ppdu_info->com_info.mpdu_cnt_fcs_ok |
691*5113495bSYour Name 			ppdu_info->com_info.mpdu_cnt_fcs_err) > 1)
692*5113495bSYour Name 			ppdu_info->rx_status.rs_flags |= IEEE80211_AMPDU_FLAG;
693*5113495bSYour Name 		else
694*5113495bSYour Name 			ppdu_info->rx_status.rs_flags &=
695*5113495bSYour Name 				(~IEEE80211_AMPDU_FLAG);
696*5113495bSYour Name 
697*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[0] =
698*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_7,
699*5113495bSYour Name 					   FCS_OK_BITMAP_31_0);
700*5113495bSYour Name 
701*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[1] =
702*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_8,
703*5113495bSYour Name 					   FCS_OK_BITMAP_63_32);
704*5113495bSYour Name 
705*5113495bSYour Name 		if (user_id < HAL_MAX_UL_MU_USERS) {
706*5113495bSYour Name 			mon_rx_user_status =
707*5113495bSYour Name 				&ppdu_info->rx_user_status[user_id];
708*5113495bSYour Name 
709*5113495bSYour Name 			hal_rx_handle_mu_ul_info(rx_tlv, mon_rx_user_status);
710*5113495bSYour Name 
711*5113495bSYour Name 			ppdu_info->com_info.num_users++;
712*5113495bSYour Name 
713*5113495bSYour Name 			hal_rx_populate_mu_user_info(rx_tlv, ppdu_info,
714*5113495bSYour Name 						     user_id,
715*5113495bSYour Name 						     mon_rx_user_status);
716*5113495bSYour Name 		}
717*5113495bSYour Name 		break;
718*5113495bSYour Name 	}
719*5113495bSYour Name 
720*5113495bSYour Name 	case WIFIRX_PPDU_END_USER_STATS_EXT_E:
721*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[2] =
722*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_1,
723*5113495bSYour Name 				   FCS_OK_BITMAP_95_64);
724*5113495bSYour Name 
725*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[3] =
726*5113495bSYour Name 			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_2,
727*5113495bSYour Name 				    FCS_OK_BITMAP_127_96);
728*5113495bSYour Name 
729*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[4] =
730*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_3,
731*5113495bSYour Name 				   FCS_OK_BITMAP_159_128);
732*5113495bSYour Name 
733*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[5] =
734*5113495bSYour Name 			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_4,
735*5113495bSYour Name 				    FCS_OK_BITMAP_191_160);
736*5113495bSYour Name 
737*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[6] =
738*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_5,
739*5113495bSYour Name 				   FCS_OK_BITMAP_223_192);
740*5113495bSYour Name 
741*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[7] =
742*5113495bSYour Name 			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_6,
743*5113495bSYour Name 				    FCS_OK_BITMAP_255_224);
744*5113495bSYour Name 		break;
745*5113495bSYour Name 
746*5113495bSYour Name 	case WIFIRX_PPDU_END_STATUS_DONE_E:
747*5113495bSYour Name 		return HAL_TLV_STATUS_PPDU_DONE;
748*5113495bSYour Name 
749*5113495bSYour Name 	case WIFIDUMMY_E:
750*5113495bSYour Name 		return HAL_TLV_STATUS_BUF_DONE;
751*5113495bSYour Name 
752*5113495bSYour Name 	case WIFIPHYRX_HT_SIG_E:
753*5113495bSYour Name 	{
754*5113495bSYour Name 		uint8_t *ht_sig_info = (uint8_t *)rx_tlv +
755*5113495bSYour Name 				HAL_RX_OFFSET(UNIFIED_PHYRX_HT_SIG_0,
756*5113495bSYour Name 				HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS);
757*5113495bSYour Name 		value = HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1,
758*5113495bSYour Name 				   FEC_CODING);
759*5113495bSYour Name 		ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
760*5113495bSYour Name 			1 : 0;
761*5113495bSYour Name 		ppdu_info->rx_status.mcs = HAL_RX_GET(ht_sig_info,
762*5113495bSYour Name 						      HT_SIG_INFO_0, MCS);
763*5113495bSYour Name 		ppdu_info->rx_status.ht_mcs = ppdu_info->rx_status.mcs;
764*5113495bSYour Name 		ppdu_info->rx_status.bw = HAL_RX_GET(ht_sig_info,
765*5113495bSYour Name 						     HT_SIG_INFO_0, CBW);
766*5113495bSYour Name 		ppdu_info->rx_status.sgi = HAL_RX_GET(ht_sig_info,
767*5113495bSYour Name 						      HT_SIG_INFO_1, SHORT_GI);
768*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
769*5113495bSYour Name 		ppdu_info->rx_status.nss = ((ppdu_info->rx_status.mcs) >>
770*5113495bSYour Name 					    HT_SIG_SU_NSS_SHIFT) + 1;
771*5113495bSYour Name 		ppdu_info->rx_status.mcs &= ((1 << HT_SIG_SU_NSS_SHIFT) - 1);
772*5113495bSYour Name 		hal_rx_get_ht_sig_info(ppdu_info, ht_sig_info);
773*5113495bSYour Name 		break;
774*5113495bSYour Name 	}
775*5113495bSYour Name 
776*5113495bSYour Name 	case WIFIPHYRX_L_SIG_B_E:
777*5113495bSYour Name 	{
778*5113495bSYour Name 		uint8_t *l_sig_b_info = (uint8_t *)rx_tlv +
779*5113495bSYour Name 				HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_B_0,
780*5113495bSYour Name 				L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS);
781*5113495bSYour Name 
782*5113495bSYour Name 		value = HAL_RX_GET(l_sig_b_info, L_SIG_B_INFO_0, RATE);
783*5113495bSYour Name 		ppdu_info->rx_status.l_sig_b_info = *((uint32_t *)l_sig_b_info);
784*5113495bSYour Name 		switch (value) {
785*5113495bSYour Name 		case 1:
786*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_3MCS;
787*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3;
788*5113495bSYour Name 			break;
789*5113495bSYour Name 		case 2:
790*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_2MCS;
791*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2;
792*5113495bSYour Name 			break;
793*5113495bSYour Name 		case 3:
794*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_1MCS;
795*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1;
796*5113495bSYour Name 			break;
797*5113495bSYour Name 		case 4:
798*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_0MCS;
799*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0;
800*5113495bSYour Name 			break;
801*5113495bSYour Name 		case 5:
802*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_6MCS;
803*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6;
804*5113495bSYour Name 			break;
805*5113495bSYour Name 		case 6:
806*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_5MCS;
807*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5;
808*5113495bSYour Name 			break;
809*5113495bSYour Name 		case 7:
810*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_4MCS;
811*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4;
812*5113495bSYour Name 			break;
813*5113495bSYour Name 		default:
814*5113495bSYour Name 			break;
815*5113495bSYour Name 		}
816*5113495bSYour Name 		ppdu_info->rx_status.cck_flag = 1;
817*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
818*5113495bSYour Name 	break;
819*5113495bSYour Name 	}
820*5113495bSYour Name 
821*5113495bSYour Name 	case WIFIPHYRX_L_SIG_A_E:
822*5113495bSYour Name 	{
823*5113495bSYour Name 		uint8_t *l_sig_a_info = (uint8_t *)rx_tlv +
824*5113495bSYour Name 				HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_A_0,
825*5113495bSYour Name 				L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS);
826*5113495bSYour Name 
827*5113495bSYour Name 		value = HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, RATE);
828*5113495bSYour Name 		ppdu_info->rx_status.l_sig_a_info = *((uint32_t *)l_sig_a_info);
829*5113495bSYour Name 		switch (value) {
830*5113495bSYour Name 		case 8:
831*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_0MCS;
832*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0;
833*5113495bSYour Name 			break;
834*5113495bSYour Name 		case 9:
835*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_1MCS;
836*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1;
837*5113495bSYour Name 			break;
838*5113495bSYour Name 		case 10:
839*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_2MCS;
840*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2;
841*5113495bSYour Name 			break;
842*5113495bSYour Name 		case 11:
843*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_3MCS;
844*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3;
845*5113495bSYour Name 			break;
846*5113495bSYour Name 		case 12:
847*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_4MCS;
848*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4;
849*5113495bSYour Name 			break;
850*5113495bSYour Name 		case 13:
851*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_5MCS;
852*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5;
853*5113495bSYour Name 			break;
854*5113495bSYour Name 		case 14:
855*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_6MCS;
856*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6;
857*5113495bSYour Name 			break;
858*5113495bSYour Name 		case 15:
859*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_7MCS;
860*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS7;
861*5113495bSYour Name 			break;
862*5113495bSYour Name 		default:
863*5113495bSYour Name 			break;
864*5113495bSYour Name 		}
865*5113495bSYour Name 		ppdu_info->rx_status.ofdm_flag = 1;
866*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
867*5113495bSYour Name 		hal_rx_get_l_sig_a_info(ppdu_info, l_sig_a_info);
868*5113495bSYour Name 	break;
869*5113495bSYour Name 	}
870*5113495bSYour Name 
871*5113495bSYour Name 	case WIFIPHYRX_VHT_SIG_A_E:
872*5113495bSYour Name 	{
873*5113495bSYour Name 		uint8_t *vht_sig_a_info = (uint8_t *)rx_tlv +
874*5113495bSYour Name 				HAL_RX_OFFSET(UNIFIED_PHYRX_VHT_SIG_A_0,
875*5113495bSYour Name 				VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS);
876*5113495bSYour Name 
877*5113495bSYour Name 		value = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1,
878*5113495bSYour Name 				SU_MU_CODING);
879*5113495bSYour Name 		ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
880*5113495bSYour Name 			1 : 0;
881*5113495bSYour Name 		group_id = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0,
882*5113495bSYour Name 				      GROUP_ID);
883*5113495bSYour Name 		ppdu_info->rx_status.vht_flag_values5 = group_id;
884*5113495bSYour Name 		ppdu_info->rx_status.mcs = HAL_RX_GET(vht_sig_a_info,
885*5113495bSYour Name 				VHT_SIG_A_INFO_1, MCS);
886*5113495bSYour Name 		ppdu_info->rx_status.sgi = HAL_RX_GET(vht_sig_a_info,
887*5113495bSYour Name 				VHT_SIG_A_INFO_1, GI_SETTING);
888*5113495bSYour Name 
889*5113495bSYour Name 		switch (hal->target_type) {
890*5113495bSYour Name 		case TARGET_TYPE_QCA8074:
891*5113495bSYour Name 		case TARGET_TYPE_QCA8074V2:
892*5113495bSYour Name 		case TARGET_TYPE_QCA6018:
893*5113495bSYour Name 		case TARGET_TYPE_QCA5018:
894*5113495bSYour Name 		case TARGET_TYPE_QCN9000:
895*5113495bSYour Name 		case TARGET_TYPE_QCN6122:
896*5113495bSYour Name #ifdef QCA_WIFI_QCA6390
897*5113495bSYour Name 		case TARGET_TYPE_QCA6390:
898*5113495bSYour Name #endif
899*5113495bSYour Name 		case TARGET_TYPE_QCA6490:
900*5113495bSYour Name 			ppdu_info->rx_status.is_stbc =
901*5113495bSYour Name 				HAL_RX_GET(vht_sig_a_info,
902*5113495bSYour Name 					   VHT_SIG_A_INFO_0, STBC);
903*5113495bSYour Name 			value =  HAL_RX_GET(vht_sig_a_info,
904*5113495bSYour Name 					    VHT_SIG_A_INFO_0, N_STS);
905*5113495bSYour Name 			value = value & VHT_SIG_SU_NSS_MASK;
906*5113495bSYour Name 			if (ppdu_info->rx_status.is_stbc && (value > 0))
907*5113495bSYour Name 				value = ((value + 1) >> 1) - 1;
908*5113495bSYour Name 			ppdu_info->rx_status.nss =
909*5113495bSYour Name 				((value & VHT_SIG_SU_NSS_MASK) + 1);
910*5113495bSYour Name 
911*5113495bSYour Name 			break;
912*5113495bSYour Name 		case TARGET_TYPE_QCA6290:
913*5113495bSYour Name #if !defined(QCA_WIFI_QCA6290_11AX)
914*5113495bSYour Name 			ppdu_info->rx_status.is_stbc =
915*5113495bSYour Name 				HAL_RX_GET(vht_sig_a_info,
916*5113495bSYour Name 					   VHT_SIG_A_INFO_0, STBC);
917*5113495bSYour Name 			value =  HAL_RX_GET(vht_sig_a_info,
918*5113495bSYour Name 					    VHT_SIG_A_INFO_0, N_STS);
919*5113495bSYour Name 			value = value & VHT_SIG_SU_NSS_MASK;
920*5113495bSYour Name 			if (ppdu_info->rx_status.is_stbc && (value > 0))
921*5113495bSYour Name 				value = ((value + 1) >> 1) - 1;
922*5113495bSYour Name 			ppdu_info->rx_status.nss =
923*5113495bSYour Name 				((value & VHT_SIG_SU_NSS_MASK) + 1);
924*5113495bSYour Name #else
925*5113495bSYour Name 			ppdu_info->rx_status.nss = 0;
926*5113495bSYour Name #endif
927*5113495bSYour Name 			break;
928*5113495bSYour Name 		case TARGET_TYPE_QCA6750:
929*5113495bSYour Name 			ppdu_info->rx_status.nss = 0;
930*5113495bSYour Name 			break;
931*5113495bSYour Name 		default:
932*5113495bSYour Name 			break;
933*5113495bSYour Name 		}
934*5113495bSYour Name 		ppdu_info->rx_status.vht_flag_values3[0] =
935*5113495bSYour Name 				(((ppdu_info->rx_status.mcs) << 4)
936*5113495bSYour Name 				| ppdu_info->rx_status.nss);
937*5113495bSYour Name 		ppdu_info->rx_status.bw = HAL_RX_GET(vht_sig_a_info,
938*5113495bSYour Name 				VHT_SIG_A_INFO_0, BANDWIDTH);
939*5113495bSYour Name 		ppdu_info->rx_status.vht_flag_values2 =
940*5113495bSYour Name 			ppdu_info->rx_status.bw;
941*5113495bSYour Name 		ppdu_info->rx_status.vht_flag_values4 =
942*5113495bSYour Name 			HAL_RX_GET(vht_sig_a_info,
943*5113495bSYour Name 				   VHT_SIG_A_INFO_1, SU_MU_CODING);
944*5113495bSYour Name 
945*5113495bSYour Name 		ppdu_info->rx_status.beamformed = HAL_RX_GET(vht_sig_a_info,
946*5113495bSYour Name 				VHT_SIG_A_INFO_1, BEAMFORMED);
947*5113495bSYour Name 		if (group_id == 0 || group_id == 63)
948*5113495bSYour Name 			ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
949*5113495bSYour Name 		else
950*5113495bSYour Name 			ppdu_info->rx_status.reception_type =
951*5113495bSYour Name 				HAL_RX_TYPE_MU_MIMO;
952*5113495bSYour Name 
953*5113495bSYour Name 		hal_rx_get_vht_sig_a_info(ppdu_info, vht_sig_a_info);
954*5113495bSYour Name 		break;
955*5113495bSYour Name 	}
956*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_A_SU_E:
957*5113495bSYour Name 	{
958*5113495bSYour Name 		uint8_t *he_sig_a_su_info = (uint8_t *)rx_tlv +
959*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_SU_0,
960*5113495bSYour Name 			HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS);
961*5113495bSYour Name 		ppdu_info->rx_status.he_flags = 1;
962*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0,
963*5113495bSYour Name 				   FORMAT_INDICATION);
964*5113495bSYour Name 		if (value == 0) {
965*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
966*5113495bSYour Name 				QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
967*5113495bSYour Name 		} else {
968*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
969*5113495bSYour Name 				 QDF_MON_STATUS_HE_SU_FORMAT_TYPE;
970*5113495bSYour Name 		}
971*5113495bSYour Name 
972*5113495bSYour Name 		/* data1 */
973*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
974*5113495bSYour Name 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
975*5113495bSYour Name 			QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN |
976*5113495bSYour Name 			QDF_MON_STATUS_HE_DL_UL_KNOWN |
977*5113495bSYour Name 			QDF_MON_STATUS_HE_MCS_KNOWN |
978*5113495bSYour Name 			QDF_MON_STATUS_HE_DCM_KNOWN |
979*5113495bSYour Name 			QDF_MON_STATUS_HE_CODING_KNOWN |
980*5113495bSYour Name 			QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN |
981*5113495bSYour Name 			QDF_MON_STATUS_HE_STBC_KNOWN |
982*5113495bSYour Name 			QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN |
983*5113495bSYour Name 			QDF_MON_STATUS_HE_DOPPLER_KNOWN;
984*5113495bSYour Name 
985*5113495bSYour Name 		/* data2 */
986*5113495bSYour Name 		ppdu_info->rx_status.he_data2 =
987*5113495bSYour Name 			QDF_MON_STATUS_HE_GI_KNOWN;
988*5113495bSYour Name 		ppdu_info->rx_status.he_data2 |=
989*5113495bSYour Name 			QDF_MON_STATUS_TXBF_KNOWN |
990*5113495bSYour Name 			QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
991*5113495bSYour Name 			QDF_MON_STATUS_TXOP_KNOWN |
992*5113495bSYour Name 			QDF_MON_STATUS_LTF_SYMBOLS_KNOWN |
993*5113495bSYour Name 			QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
994*5113495bSYour Name 			QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
995*5113495bSYour Name 
996*5113495bSYour Name 		/* data3 */
997*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
998*5113495bSYour Name 				   HE_SIG_A_SU_INFO_0, BSS_COLOR_ID);
999*5113495bSYour Name 		ppdu_info->rx_status.he_data3 = value;
1000*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1001*5113495bSYour Name 				   HE_SIG_A_SU_INFO_0, BEAM_CHANGE);
1002*5113495bSYour Name 		value = value << QDF_MON_STATUS_BEAM_CHANGE_SHIFT;
1003*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1004*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1005*5113495bSYour Name 				   HE_SIG_A_SU_INFO_0, DL_UL_FLAG);
1006*5113495bSYour Name 		value = value << QDF_MON_STATUS_DL_UL_SHIFT;
1007*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1008*5113495bSYour Name 
1009*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1010*5113495bSYour Name 				   HE_SIG_A_SU_INFO_0, TRANSMIT_MCS);
1011*5113495bSYour Name 		ppdu_info->rx_status.mcs = value;
1012*5113495bSYour Name 		value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1013*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1014*5113495bSYour Name 
1015*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1016*5113495bSYour Name 				   HE_SIG_A_SU_INFO_0, DCM);
1017*5113495bSYour Name 		he_dcm = value;
1018*5113495bSYour Name 		value = value << QDF_MON_STATUS_DCM_SHIFT;
1019*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1020*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1021*5113495bSYour Name 				   HE_SIG_A_SU_INFO_1, CODING);
1022*5113495bSYour Name 		ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
1023*5113495bSYour Name 			1 : 0;
1024*5113495bSYour Name 		value = value << QDF_MON_STATUS_CODING_SHIFT;
1025*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1026*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1027*5113495bSYour Name 				   HE_SIG_A_SU_INFO_1,
1028*5113495bSYour Name 				   LDPC_EXTRA_SYMBOL);
1029*5113495bSYour Name 		value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT;
1030*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1031*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1032*5113495bSYour Name 				   HE_SIG_A_SU_INFO_1, STBC);
1033*5113495bSYour Name 		he_stbc = value;
1034*5113495bSYour Name 		value = value << QDF_MON_STATUS_STBC_SHIFT;
1035*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1036*5113495bSYour Name 
1037*5113495bSYour Name 		/* data4 */
1038*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0,
1039*5113495bSYour Name 				   SPATIAL_REUSE);
1040*5113495bSYour Name 		ppdu_info->rx_status.he_data4 = value;
1041*5113495bSYour Name 
1042*5113495bSYour Name 		/* data5 */
1043*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1044*5113495bSYour Name 				   HE_SIG_A_SU_INFO_0, TRANSMIT_BW);
1045*5113495bSYour Name 		ppdu_info->rx_status.he_data5 = value;
1046*5113495bSYour Name 		ppdu_info->rx_status.bw = value;
1047*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1048*5113495bSYour Name 				   HE_SIG_A_SU_INFO_0, CP_LTF_SIZE);
1049*5113495bSYour Name 		switch (value) {
1050*5113495bSYour Name 		case 0:
1051*5113495bSYour Name 				he_gi = HE_GI_0_8;
1052*5113495bSYour Name 				he_ltf = HE_LTF_1_X;
1053*5113495bSYour Name 				break;
1054*5113495bSYour Name 		case 1:
1055*5113495bSYour Name 				he_gi = HE_GI_0_8;
1056*5113495bSYour Name 				he_ltf = HE_LTF_2_X;
1057*5113495bSYour Name 				break;
1058*5113495bSYour Name 		case 2:
1059*5113495bSYour Name 				he_gi = HE_GI_1_6;
1060*5113495bSYour Name 				he_ltf = HE_LTF_2_X;
1061*5113495bSYour Name 				break;
1062*5113495bSYour Name 		case 3:
1063*5113495bSYour Name 				if (he_dcm && he_stbc) {
1064*5113495bSYour Name 					he_gi = HE_GI_0_8;
1065*5113495bSYour Name 					he_ltf = HE_LTF_4_X;
1066*5113495bSYour Name 				} else {
1067*5113495bSYour Name 					he_gi = HE_GI_3_2;
1068*5113495bSYour Name 					he_ltf = HE_LTF_4_X;
1069*5113495bSYour Name 				}
1070*5113495bSYour Name 				break;
1071*5113495bSYour Name 		}
1072*5113495bSYour Name 		ppdu_info->rx_status.sgi = he_gi;
1073*5113495bSYour Name 		ppdu_info->rx_status.ltf_size = he_ltf;
1074*5113495bSYour Name 		hal_get_radiotap_he_gi_ltf(&he_gi, &he_ltf);
1075*5113495bSYour Name 		value = he_gi << QDF_MON_STATUS_GI_SHIFT;
1076*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1077*5113495bSYour Name 		value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT;
1078*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1079*5113495bSYour Name 
1080*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS);
1081*5113495bSYour Name 		value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
1082*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1083*5113495bSYour Name 
1084*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
1085*5113495bSYour Name 				   PACKET_EXTENSION_A_FACTOR);
1086*5113495bSYour Name 		value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT;
1087*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1088*5113495bSYour Name 
1089*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, TXBF);
1090*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXBF_SHIFT;
1091*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1092*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
1093*5113495bSYour Name 				   PACKET_EXTENSION_PE_DISAMBIGUITY);
1094*5113495bSYour Name 		value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT;
1095*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1096*5113495bSYour Name 
1097*5113495bSYour Name 		/* data6 */
1098*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS);
1099*5113495bSYour Name 		value++;
1100*5113495bSYour Name 		ppdu_info->rx_status.nss = value;
1101*5113495bSYour Name 		ppdu_info->rx_status.he_data6 = value;
1102*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
1103*5113495bSYour Name 				   DOPPLER_INDICATION);
1104*5113495bSYour Name 		value = value << QDF_MON_STATUS_DOPPLER_SHIFT;
1105*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1106*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
1107*5113495bSYour Name 				   TXOP_DURATION);
1108*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXOP_SHIFT;
1109*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1110*5113495bSYour Name 
1111*5113495bSYour Name 		ppdu_info->rx_status.beamformed = HAL_RX_GET(he_sig_a_su_info,
1112*5113495bSYour Name 							     HE_SIG_A_SU_INFO_1, TXBF);
1113*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
1114*5113495bSYour Name 		hal_rx_get_crc_he_sig_a_su_info(ppdu_info, he_sig_a_su_info);
1115*5113495bSYour Name 		break;
1116*5113495bSYour Name 	}
1117*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_A_MU_DL_E:
1118*5113495bSYour Name 	{
1119*5113495bSYour Name 		uint8_t *he_sig_a_mu_dl_info = (uint8_t *)rx_tlv +
1120*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_MU_DL_0,
1121*5113495bSYour Name 			HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS);
1122*5113495bSYour Name 
1123*5113495bSYour Name 		ppdu_info->rx_status.he_mu_flags = 1;
1124*5113495bSYour Name 
1125*5113495bSYour Name 		/* HE Flags */
1126*5113495bSYour Name 		/*data1*/
1127*5113495bSYour Name 		ppdu_info->rx_status.he_data1 =
1128*5113495bSYour Name 					QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
1129*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
1130*5113495bSYour Name 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
1131*5113495bSYour Name 			QDF_MON_STATUS_HE_DL_UL_KNOWN |
1132*5113495bSYour Name 			QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN |
1133*5113495bSYour Name 			QDF_MON_STATUS_HE_STBC_KNOWN |
1134*5113495bSYour Name 			QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN |
1135*5113495bSYour Name 			QDF_MON_STATUS_HE_DOPPLER_KNOWN;
1136*5113495bSYour Name 
1137*5113495bSYour Name 		/* data2 */
1138*5113495bSYour Name 		ppdu_info->rx_status.he_data2 =
1139*5113495bSYour Name 			QDF_MON_STATUS_HE_GI_KNOWN;
1140*5113495bSYour Name 		ppdu_info->rx_status.he_data2 |=
1141*5113495bSYour Name 			QDF_MON_STATUS_LTF_SYMBOLS_KNOWN |
1142*5113495bSYour Name 			QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
1143*5113495bSYour Name 			QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
1144*5113495bSYour Name 			QDF_MON_STATUS_TXOP_KNOWN |
1145*5113495bSYour Name 			QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
1146*5113495bSYour Name 
1147*5113495bSYour Name 		/*data3*/
1148*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1149*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_0, BSS_COLOR_ID);
1150*5113495bSYour Name 		ppdu_info->rx_status.he_data3 = value;
1151*5113495bSYour Name 
1152*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1153*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_0, DL_UL_FLAG);
1154*5113495bSYour Name 		value = value << QDF_MON_STATUS_DL_UL_SHIFT;
1155*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1156*5113495bSYour Name 
1157*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1158*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_1,
1159*5113495bSYour Name 				   LDPC_EXTRA_SYMBOL);
1160*5113495bSYour Name 		value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT;
1161*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1162*5113495bSYour Name 
1163*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1164*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_1, STBC);
1165*5113495bSYour Name 		he_stbc = value;
1166*5113495bSYour Name 		value = value << QDF_MON_STATUS_STBC_SHIFT;
1167*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1168*5113495bSYour Name 
1169*5113495bSYour Name 		/*data4*/
1170*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0,
1171*5113495bSYour Name 				   SPATIAL_REUSE);
1172*5113495bSYour Name 		ppdu_info->rx_status.he_data4 = value;
1173*5113495bSYour Name 
1174*5113495bSYour Name 		/*data5*/
1175*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1176*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW);
1177*5113495bSYour Name 		ppdu_info->rx_status.he_data5 = value;
1178*5113495bSYour Name 		ppdu_info->rx_status.bw = value;
1179*5113495bSYour Name 
1180*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1181*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_0, CP_LTF_SIZE);
1182*5113495bSYour Name 		switch (value) {
1183*5113495bSYour Name 		case 0:
1184*5113495bSYour Name 			he_gi = HE_GI_0_8;
1185*5113495bSYour Name 			he_ltf = HE_LTF_4_X;
1186*5113495bSYour Name 			break;
1187*5113495bSYour Name 		case 1:
1188*5113495bSYour Name 			he_gi = HE_GI_0_8;
1189*5113495bSYour Name 			he_ltf = HE_LTF_2_X;
1190*5113495bSYour Name 			break;
1191*5113495bSYour Name 		case 2:
1192*5113495bSYour Name 			he_gi = HE_GI_1_6;
1193*5113495bSYour Name 			he_ltf = HE_LTF_2_X;
1194*5113495bSYour Name 			break;
1195*5113495bSYour Name 		case 3:
1196*5113495bSYour Name 			he_gi = HE_GI_3_2;
1197*5113495bSYour Name 			he_ltf = HE_LTF_4_X;
1198*5113495bSYour Name 			break;
1199*5113495bSYour Name 		}
1200*5113495bSYour Name 		ppdu_info->rx_status.sgi = he_gi;
1201*5113495bSYour Name 		ppdu_info->rx_status.ltf_size = he_ltf;
1202*5113495bSYour Name 		hal_get_radiotap_he_gi_ltf(&he_gi, &he_ltf);
1203*5113495bSYour Name 		value = he_gi << QDF_MON_STATUS_GI_SHIFT;
1204*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1205*5113495bSYour Name 
1206*5113495bSYour Name 		value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT;
1207*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1208*5113495bSYour Name 
1209*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1210*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_1, NUM_LTF_SYMBOLS);
1211*5113495bSYour Name 		value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
1212*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1213*5113495bSYour Name 
1214*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1215*5113495bSYour Name 				   PACKET_EXTENSION_A_FACTOR);
1216*5113495bSYour Name 		value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT;
1217*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1218*5113495bSYour Name 
1219*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1220*5113495bSYour Name 				   PACKET_EXTENSION_PE_DISAMBIGUITY);
1221*5113495bSYour Name 		value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT;
1222*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1223*5113495bSYour Name 
1224*5113495bSYour Name 		/*data6*/
1225*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0,
1226*5113495bSYour Name 				   DOPPLER_INDICATION);
1227*5113495bSYour Name 		value = value << QDF_MON_STATUS_DOPPLER_SHIFT;
1228*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1229*5113495bSYour Name 
1230*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1231*5113495bSYour Name 				   TXOP_DURATION);
1232*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXOP_SHIFT;
1233*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1234*5113495bSYour Name 
1235*5113495bSYour Name 		/* HE-MU Flags */
1236*5113495bSYour Name 		/* HE-MU-flags1 */
1237*5113495bSYour Name 		ppdu_info->rx_status.he_flags1 =
1238*5113495bSYour Name 			QDF_MON_STATUS_SIG_B_MCS_KNOWN |
1239*5113495bSYour Name 			QDF_MON_STATUS_SIG_B_DCM_KNOWN |
1240*5113495bSYour Name 			QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_1_KNOWN |
1241*5113495bSYour Name 			QDF_MON_STATUS_SIG_B_SYM_NUM_KNOWN |
1242*5113495bSYour Name 			QDF_MON_STATUS_RU_0_KNOWN;
1243*5113495bSYour Name 
1244*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1245*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_0, MCS_OF_SIG_B);
1246*5113495bSYour Name 		ppdu_info->rx_status.he_flags1 |= value;
1247*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1248*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_0, DCM_OF_SIG_B);
1249*5113495bSYour Name 		value = value << QDF_MON_STATUS_DCM_FLAG_1_SHIFT;
1250*5113495bSYour Name 		ppdu_info->rx_status.he_flags1 |= value;
1251*5113495bSYour Name 
1252*5113495bSYour Name 		/* HE-MU-flags2 */
1253*5113495bSYour Name 		ppdu_info->rx_status.he_flags2 =
1254*5113495bSYour Name 			QDF_MON_STATUS_BW_KNOWN;
1255*5113495bSYour Name 
1256*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1257*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW);
1258*5113495bSYour Name 		ppdu_info->rx_status.he_flags2 |= value;
1259*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1260*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_0, COMP_MODE_SIG_B);
1261*5113495bSYour Name 		value = value << QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT;
1262*5113495bSYour Name 		ppdu_info->rx_status.he_flags2 |= value;
1263*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1264*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_0, NUM_SIG_B_SYMBOLS);
1265*5113495bSYour Name 		value = value - 1;
1266*5113495bSYour Name 		value = value << QDF_MON_STATUS_NUM_SIG_B_SYMBOLS_SHIFT;
1267*5113495bSYour Name 		ppdu_info->rx_status.he_flags2 |= value;
1268*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
1269*5113495bSYour Name 		hal_rx_get_crc_he_sig_a_mu_dl_info(ppdu_info,
1270*5113495bSYour Name 						   he_sig_a_mu_dl_info);
1271*5113495bSYour Name 		break;
1272*5113495bSYour Name 	}
1273*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_B1_MU_E:
1274*5113495bSYour Name 	{
1275*5113495bSYour Name 		uint8_t *he_sig_b1_mu_info = (uint8_t *)rx_tlv +
1276*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B1_MU_0,
1277*5113495bSYour Name 			HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS);
1278*5113495bSYour Name 
1279*5113495bSYour Name 		ppdu_info->rx_status.he_sig_b_common_known |=
1280*5113495bSYour Name 			QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU0;
1281*5113495bSYour Name 		/* TODO: Check on the availability of other fields in
1282*5113495bSYour Name 		 * sig_b_common
1283*5113495bSYour Name 		 */
1284*5113495bSYour Name 
1285*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b1_mu_info,
1286*5113495bSYour Name 				   HE_SIG_B1_MU_INFO_0, RU_ALLOCATION);
1287*5113495bSYour Name 		ppdu_info->rx_status.he_RU[0] = value;
1288*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
1289*5113495bSYour Name 		break;
1290*5113495bSYour Name 	}
1291*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_B2_MU_E:
1292*5113495bSYour Name 	{
1293*5113495bSYour Name 		uint8_t *he_sig_b2_mu_info = (uint8_t *)rx_tlv +
1294*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_MU_0,
1295*5113495bSYour Name 			HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS);
1296*5113495bSYour Name 		/*
1297*5113495bSYour Name 		 * Not all "HE" fields can be updated from
1298*5113495bSYour Name 		 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E
1299*5113495bSYour Name 		 * to populate rest of the "HE" fields for MU scenarios.
1300*5113495bSYour Name 		 */
1301*5113495bSYour Name 
1302*5113495bSYour Name 		/* HE-data1 */
1303*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
1304*5113495bSYour Name 			QDF_MON_STATUS_HE_MCS_KNOWN |
1305*5113495bSYour Name 			QDF_MON_STATUS_HE_CODING_KNOWN;
1306*5113495bSYour Name 
1307*5113495bSYour Name 		/* HE-data2 */
1308*5113495bSYour Name 
1309*5113495bSYour Name 		/* HE-data3 */
1310*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_mu_info,
1311*5113495bSYour Name 				   HE_SIG_B2_MU_INFO_0, STA_MCS);
1312*5113495bSYour Name 		ppdu_info->rx_status.mcs = value;
1313*5113495bSYour Name 		value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1314*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1315*5113495bSYour Name 
1316*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_mu_info,
1317*5113495bSYour Name 				   HE_SIG_B2_MU_INFO_0, STA_CODING);
1318*5113495bSYour Name 		value = value << QDF_MON_STATUS_CODING_SHIFT;
1319*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1320*5113495bSYour Name 
1321*5113495bSYour Name 		/* HE-data4 */
1322*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_mu_info,
1323*5113495bSYour Name 				   HE_SIG_B2_MU_INFO_0, STA_ID);
1324*5113495bSYour Name 		value = value << QDF_MON_STATUS_STA_ID_SHIFT;
1325*5113495bSYour Name 		ppdu_info->rx_status.he_data4 |= value;
1326*5113495bSYour Name 
1327*5113495bSYour Name 		/* HE-data5 */
1328*5113495bSYour Name 
1329*5113495bSYour Name 		/* HE-data6 */
1330*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_mu_info,
1331*5113495bSYour Name 				   HE_SIG_B2_MU_INFO_0, NSTS);
1332*5113495bSYour Name 		/* value n indicates n+1 spatial streams */
1333*5113495bSYour Name 		value++;
1334*5113495bSYour Name 		ppdu_info->rx_status.nss = value;
1335*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1336*5113495bSYour Name 
1337*5113495bSYour Name 		break;
1338*5113495bSYour Name 	}
1339*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_B2_OFDMA_E:
1340*5113495bSYour Name 	{
1341*5113495bSYour Name 		uint8_t *he_sig_b2_ofdma_info =
1342*5113495bSYour Name 		(uint8_t *)rx_tlv +
1343*5113495bSYour Name 		HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0,
1344*5113495bSYour Name 		HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS);
1345*5113495bSYour Name 
1346*5113495bSYour Name 		/*
1347*5113495bSYour Name 		 * Not all "HE" fields can be updated from
1348*5113495bSYour Name 		 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E
1349*5113495bSYour Name 		 * to populate rest of "HE" fields for MU OFDMA scenarios.
1350*5113495bSYour Name 		 */
1351*5113495bSYour Name 
1352*5113495bSYour Name 		/* HE-data1 */
1353*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
1354*5113495bSYour Name 			QDF_MON_STATUS_HE_MCS_KNOWN |
1355*5113495bSYour Name 			QDF_MON_STATUS_HE_DCM_KNOWN |
1356*5113495bSYour Name 			QDF_MON_STATUS_HE_CODING_KNOWN;
1357*5113495bSYour Name 
1358*5113495bSYour Name 		/* HE-data2 */
1359*5113495bSYour Name 		ppdu_info->rx_status.he_data2 |=
1360*5113495bSYour Name 					QDF_MON_STATUS_TXBF_KNOWN;
1361*5113495bSYour Name 
1362*5113495bSYour Name 		/* HE-data3 */
1363*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1364*5113495bSYour Name 				   HE_SIG_B2_OFDMA_INFO_0, STA_MCS);
1365*5113495bSYour Name 		ppdu_info->rx_status.mcs = value;
1366*5113495bSYour Name 		value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1367*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1368*5113495bSYour Name 
1369*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1370*5113495bSYour Name 				   HE_SIG_B2_OFDMA_INFO_0, STA_DCM);
1371*5113495bSYour Name 		he_dcm = value;
1372*5113495bSYour Name 		value = value << QDF_MON_STATUS_DCM_SHIFT;
1373*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1374*5113495bSYour Name 
1375*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1376*5113495bSYour Name 				   HE_SIG_B2_OFDMA_INFO_0, STA_CODING);
1377*5113495bSYour Name 		value = value << QDF_MON_STATUS_CODING_SHIFT;
1378*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1379*5113495bSYour Name 
1380*5113495bSYour Name 		/* HE-data4 */
1381*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1382*5113495bSYour Name 				   HE_SIG_B2_OFDMA_INFO_0, STA_ID);
1383*5113495bSYour Name 		value = value << QDF_MON_STATUS_STA_ID_SHIFT;
1384*5113495bSYour Name 		ppdu_info->rx_status.he_data4 |= value;
1385*5113495bSYour Name 
1386*5113495bSYour Name 		/* HE-data5 */
1387*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1388*5113495bSYour Name 				   HE_SIG_B2_OFDMA_INFO_0, TXBF);
1389*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXBF_SHIFT;
1390*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1391*5113495bSYour Name 
1392*5113495bSYour Name 		/* HE-data6 */
1393*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1394*5113495bSYour Name 				   HE_SIG_B2_OFDMA_INFO_0, NSTS);
1395*5113495bSYour Name 		/* value n indicates n+1 spatial streams */
1396*5113495bSYour Name 		value++;
1397*5113495bSYour Name 		ppdu_info->rx_status.nss = value;
1398*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1399*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA;
1400*5113495bSYour Name 		break;
1401*5113495bSYour Name 	}
1402*5113495bSYour Name 	case WIFIPHYRX_RSSI_LEGACY_E:
1403*5113495bSYour Name 	{
1404*5113495bSYour Name 		uint8_t reception_type;
1405*5113495bSYour Name 		int8_t rssi_value;
1406*5113495bSYour Name 		uint8_t *rssi_info_tlv = (uint8_t *)rx_tlv +
1407*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_RSSI_LEGACY_19,
1408*5113495bSYour Name 				      RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS);
1409*5113495bSYour Name 
1410*5113495bSYour Name 		ppdu_info->rx_status.rssi_comb = HAL_RX_GET(rx_tlv,
1411*5113495bSYour Name 			PHYRX_RSSI_LEGACY_35, RSSI_COMB);
1412*5113495bSYour Name 		ppdu_info->rx_status.bw = hal->ops->hal_rx_get_tlv(rx_tlv);
1413*5113495bSYour Name 		ppdu_info->rx_status.he_re = 0;
1414*5113495bSYour Name 
1415*5113495bSYour Name 		reception_type = HAL_RX_GET(rx_tlv,
1416*5113495bSYour Name 					    PHYRX_RSSI_LEGACY_0,
1417*5113495bSYour Name 					    RECEPTION_TYPE);
1418*5113495bSYour Name 		switch (reception_type) {
1419*5113495bSYour Name 		case QDF_RECEPTION_TYPE_ULOFMDA:
1420*5113495bSYour Name 			ppdu_info->rx_status.reception_type =
1421*5113495bSYour Name 				HAL_RX_TYPE_MU_OFDMA;
1422*5113495bSYour Name 			ppdu_info->rx_status.ulofdma_flag = 1;
1423*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
1424*5113495bSYour Name 				QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
1425*5113495bSYour Name 			break;
1426*5113495bSYour Name 		case QDF_RECEPTION_TYPE_ULMIMO:
1427*5113495bSYour Name 			ppdu_info->rx_status.reception_type =
1428*5113495bSYour Name 				HAL_RX_TYPE_MU_MIMO;
1429*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
1430*5113495bSYour Name 				QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
1431*5113495bSYour Name 			break;
1432*5113495bSYour Name 		default:
1433*5113495bSYour Name 			ppdu_info->rx_status.reception_type =
1434*5113495bSYour Name 				HAL_RX_TYPE_SU;
1435*5113495bSYour Name 			break;
1436*5113495bSYour Name 		}
1437*5113495bSYour Name 		hal_rx_update_rssi_chain(ppdu_info, rssi_info_tlv);
1438*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1439*5113495bSYour Name 					RECEIVE_RSSI_INFO_0, RSSI_PRI20_CHAIN0);
1440*5113495bSYour Name 		ppdu_info->rx_status.rssi[0] = rssi_value;
1441*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN0: %d\n", rssi_value);
1442*5113495bSYour Name 
1443*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1444*5113495bSYour Name 					RECEIVE_RSSI_INFO_2, RSSI_PRI20_CHAIN1);
1445*5113495bSYour Name 		ppdu_info->rx_status.rssi[1] = rssi_value;
1446*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN1: %d\n", rssi_value);
1447*5113495bSYour Name 
1448*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1449*5113495bSYour Name 					RECEIVE_RSSI_INFO_4, RSSI_PRI20_CHAIN2);
1450*5113495bSYour Name 		ppdu_info->rx_status.rssi[2] = rssi_value;
1451*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN2: %d\n", rssi_value);
1452*5113495bSYour Name 
1453*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1454*5113495bSYour Name 					RECEIVE_RSSI_INFO_6, RSSI_PRI20_CHAIN3);
1455*5113495bSYour Name 		ppdu_info->rx_status.rssi[3] = rssi_value;
1456*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN3: %d\n", rssi_value);
1457*5113495bSYour Name 
1458*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1459*5113495bSYour Name 					RECEIVE_RSSI_INFO_8, RSSI_PRI20_CHAIN4);
1460*5113495bSYour Name 		ppdu_info->rx_status.rssi[4] = rssi_value;
1461*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN4: %d\n", rssi_value);
1462*5113495bSYour Name 
1463*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1464*5113495bSYour Name 					RECEIVE_RSSI_INFO_10,
1465*5113495bSYour Name 					RSSI_PRI20_CHAIN5);
1466*5113495bSYour Name 		ppdu_info->rx_status.rssi[5] = rssi_value;
1467*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN5: %d\n", rssi_value);
1468*5113495bSYour Name 
1469*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1470*5113495bSYour Name 					RECEIVE_RSSI_INFO_12,
1471*5113495bSYour Name 					RSSI_PRI20_CHAIN6);
1472*5113495bSYour Name 		ppdu_info->rx_status.rssi[6] = rssi_value;
1473*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN6: %d\n", rssi_value);
1474*5113495bSYour Name 
1475*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1476*5113495bSYour Name 					RECEIVE_RSSI_INFO_14,
1477*5113495bSYour Name 					RSSI_PRI20_CHAIN7);
1478*5113495bSYour Name 		ppdu_info->rx_status.rssi[7] = rssi_value;
1479*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN7: %d\n", rssi_value);
1480*5113495bSYour Name 		break;
1481*5113495bSYour Name 	}
1482*5113495bSYour Name 	case WIFIPHYRX_OTHER_RECEIVE_INFO_E:
1483*5113495bSYour Name 		hal_rx_proc_phyrx_other_receive_info_tlv(hal, rx_tlv_hdr,
1484*5113495bSYour Name 							 ppdu_info);
1485*5113495bSYour Name 		break;
1486*5113495bSYour Name 	case WIFIRX_HEADER_E:
1487*5113495bSYour Name 	{
1488*5113495bSYour Name 		struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info;
1489*5113495bSYour Name 
1490*5113495bSYour Name 		if (ppdu_info->fcs_ok_cnt >=
1491*5113495bSYour Name 		    HAL_RX_MAX_MPDU_H_PER_STATUS_BUFFER) {
1492*5113495bSYour Name 			hal_err("Number of MPDUs(%d) per status buff exceeded",
1493*5113495bSYour Name 				ppdu_info->fcs_ok_cnt);
1494*5113495bSYour Name 			break;
1495*5113495bSYour Name 		}
1496*5113495bSYour Name 
1497*5113495bSYour Name 		/* Update first_msdu_payload for every mpdu and increment
1498*5113495bSYour Name 		 * com_info->mpdu_cnt for every WIFIRX_HEADER_E TLV
1499*5113495bSYour Name 		 */
1500*5113495bSYour Name 		ppdu_info->ppdu_msdu_info[ppdu_info->fcs_ok_cnt].first_msdu_payload =
1501*5113495bSYour Name 			rx_tlv;
1502*5113495bSYour Name 		ppdu_info->ppdu_msdu_info[ppdu_info->fcs_ok_cnt].payload_len = tlv_len;
1503*5113495bSYour Name 		ppdu_info->msdu_info.first_msdu_payload = rx_tlv;
1504*5113495bSYour Name 		ppdu_info->msdu_info.payload_len = tlv_len;
1505*5113495bSYour Name 		ppdu_info->user_id = user_id;
1506*5113495bSYour Name 		ppdu_info->hdr_len = tlv_len;
1507*5113495bSYour Name 		ppdu_info->data = rx_tlv;
1508*5113495bSYour Name 		ppdu_info->data += 4;
1509*5113495bSYour Name 
1510*5113495bSYour Name 		/* for every RX_HEADER TLV increment mpdu_cnt */
1511*5113495bSYour Name 		com_info->mpdu_cnt++;
1512*5113495bSYour Name 		return HAL_TLV_STATUS_HEADER;
1513*5113495bSYour Name 	}
1514*5113495bSYour Name 	case WIFIRX_MPDU_START_E:
1515*5113495bSYour Name 	{
1516*5113495bSYour Name 		uint8_t *rx_mpdu_start = (uint8_t *)rx_tlv;
1517*5113495bSYour Name 		uint32_t ppdu_id = HAL_RX_GET_PPDU_ID(rx_mpdu_start);
1518*5113495bSYour Name 		uint8_t filter_category = 0;
1519*5113495bSYour Name 
1520*5113495bSYour Name 		hal_update_frame_type_cnt(rx_mpdu_start, ppdu_info);
1521*5113495bSYour Name 
1522*5113495bSYour Name 		ppdu_info->nac_info.fc_valid =
1523*5113495bSYour Name 				HAL_RX_GET_FC_VALID(rx_mpdu_start);
1524*5113495bSYour Name 
1525*5113495bSYour Name 		ppdu_info->nac_info.to_ds_flag =
1526*5113495bSYour Name 				HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start);
1527*5113495bSYour Name 
1528*5113495bSYour Name 		ppdu_info->nac_info.frame_control =
1529*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
1530*5113495bSYour Name 				   RX_MPDU_INFO_14,
1531*5113495bSYour Name 				   MPDU_FRAME_CONTROL_FIELD);
1532*5113495bSYour Name 
1533*5113495bSYour Name 		ppdu_info->sw_frame_group_id =
1534*5113495bSYour Name 			HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start);
1535*5113495bSYour Name 
1536*5113495bSYour Name 		ppdu_info->rx_user_status[user_id].sw_peer_id =
1537*5113495bSYour Name 			HAL_RX_GET_SW_PEER_ID(rx_mpdu_start);
1538*5113495bSYour Name 
1539*5113495bSYour Name 		if (ppdu_info->sw_frame_group_id ==
1540*5113495bSYour Name 		    HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) {
1541*5113495bSYour Name 			ppdu_info->rx_status.frame_control_info_valid =
1542*5113495bSYour Name 				ppdu_info->nac_info.fc_valid;
1543*5113495bSYour Name 			ppdu_info->rx_status.frame_control =
1544*5113495bSYour Name 				ppdu_info->nac_info.frame_control;
1545*5113495bSYour Name 		}
1546*5113495bSYour Name 
1547*5113495bSYour Name 		hal_get_mac_addr1(rx_mpdu_start,
1548*5113495bSYour Name 				  ppdu_info);
1549*5113495bSYour Name 
1550*5113495bSYour Name 		ppdu_info->nac_info.mac_addr2_valid =
1551*5113495bSYour Name 				HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start);
1552*5113495bSYour Name 
1553*5113495bSYour Name 		*(uint16_t *)&ppdu_info->nac_info.mac_addr2[0] =
1554*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
1555*5113495bSYour Name 				   RX_MPDU_INFO_16,
1556*5113495bSYour Name 				   MAC_ADDR_AD2_15_0);
1557*5113495bSYour Name 
1558*5113495bSYour Name 		*(uint32_t *)&ppdu_info->nac_info.mac_addr2[2] =
1559*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
1560*5113495bSYour Name 				   RX_MPDU_INFO_17,
1561*5113495bSYour Name 				   MAC_ADDR_AD2_47_16);
1562*5113495bSYour Name 
1563*5113495bSYour Name 		if (ppdu_info->rx_status.prev_ppdu_id != ppdu_id) {
1564*5113495bSYour Name 			ppdu_info->rx_status.prev_ppdu_id = ppdu_id;
1565*5113495bSYour Name 			ppdu_info->rx_status.ppdu_len =
1566*5113495bSYour Name 				HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13,
1567*5113495bSYour Name 					   MPDU_LENGTH);
1568*5113495bSYour Name 		} else {
1569*5113495bSYour Name 			ppdu_info->rx_status.ppdu_len +=
1570*5113495bSYour Name 				HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13,
1571*5113495bSYour Name 					   MPDU_LENGTH);
1572*5113495bSYour Name 		}
1573*5113495bSYour Name 
1574*5113495bSYour Name 		filter_category =
1575*5113495bSYour Name 				HAL_RX_GET_FILTER_CATEGORY(rx_mpdu_start);
1576*5113495bSYour Name 
1577*5113495bSYour Name 		if (filter_category == 0)
1578*5113495bSYour Name 			ppdu_info->rx_status.rxpcu_filter_pass = 1;
1579*5113495bSYour Name 		else if (filter_category == 1)
1580*5113495bSYour Name 			ppdu_info->rx_status.monitor_direct_used = 1;
1581*5113495bSYour Name 
1582*5113495bSYour Name 		ppdu_info->nac_info.mcast_bcast =
1583*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
1584*5113495bSYour Name 				   RX_MPDU_INFO_13,
1585*5113495bSYour Name 				   MCAST_BCAST);
1586*5113495bSYour Name 		break;
1587*5113495bSYour Name 	}
1588*5113495bSYour Name 	case WIFIRX_MPDU_END_E:
1589*5113495bSYour Name 		ppdu_info->user_id = user_id;
1590*5113495bSYour Name 		ppdu_info->fcs_err =
1591*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_MPDU_END_1,
1592*5113495bSYour Name 				   FCS_ERR);
1593*5113495bSYour Name 		return HAL_TLV_STATUS_MPDU_END;
1594*5113495bSYour Name 	case WIFIRX_MSDU_END_E:
1595*5113495bSYour Name 		if (user_id < HAL_MAX_UL_MU_USERS) {
1596*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].cce_metadata =
1597*5113495bSYour Name 				HAL_RX_MSDU_END_CCE_METADATA_GET(rx_tlv);
1598*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].fse_metadata =
1599*5113495bSYour Name 				HAL_RX_MSDU_END_FSE_METADATA_GET(rx_tlv);
1600*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].is_flow_idx_timeout =
1601*5113495bSYour Name 				HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(rx_tlv);
1602*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].is_flow_idx_invalid =
1603*5113495bSYour Name 				HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(rx_tlv);
1604*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].flow_idx =
1605*5113495bSYour Name 				HAL_RX_MSDU_END_FLOW_IDX_GET(rx_tlv);
1606*5113495bSYour Name 		}
1607*5113495bSYour Name 		return HAL_TLV_STATUS_MSDU_END;
1608*5113495bSYour Name 	case 0:
1609*5113495bSYour Name 		return HAL_TLV_STATUS_PPDU_DONE;
1610*5113495bSYour Name 
1611*5113495bSYour Name 	default:
1612*5113495bSYour Name 		if (hal_rx_handle_other_tlvs(tlv_tag, rx_tlv, ppdu_info))
1613*5113495bSYour Name 			unhandled = false;
1614*5113495bSYour Name 		else
1615*5113495bSYour Name 			unhandled = true;
1616*5113495bSYour Name 		break;
1617*5113495bSYour Name 	}
1618*5113495bSYour Name 
1619*5113495bSYour Name 	if (!unhandled)
1620*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1621*5113495bSYour Name 			  "%s TLV type: %d, TLV len:%d %s",
1622*5113495bSYour Name 			  __func__, tlv_tag, tlv_len,
1623*5113495bSYour Name 			  unhandled == true ? "unhandled" : "");
1624*5113495bSYour Name 
1625*5113495bSYour Name 	qdf_trace_hex_dump(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1626*5113495bSYour Name 			   rx_tlv, tlv_len);
1627*5113495bSYour Name 
1628*5113495bSYour Name 	return HAL_TLV_STATUS_PPDU_NOT_DONE;
1629*5113495bSYour Name }
1630*5113495bSYour Name 
1631*5113495bSYour Name /**
1632*5113495bSYour Name  * hal_rx_dump_rx_attention_tlv_generic_rh: dump RX attention TLV in structured
1633*5113495bSYour Name  *					    humman readable format.
1634*5113495bSYour Name  * @pkttlvs: pointer to pkttlvs.
1635*5113495bSYour Name  * @dbg_level: log level.
1636*5113495bSYour Name  *
1637*5113495bSYour Name  * Return: void
1638*5113495bSYour Name  */
hal_rx_dump_rx_attention_tlv_generic_rh(void * pkttlvs,uint8_t dbg_level)1639*5113495bSYour Name static inline void hal_rx_dump_rx_attention_tlv_generic_rh(void *pkttlvs,
1640*5113495bSYour Name 							   uint8_t dbg_level)
1641*5113495bSYour Name {
1642*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs;
1643*5113495bSYour Name 	struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
1644*5113495bSYour Name 
1645*5113495bSYour Name 	hal_verbose_debug("rx_attention tlv (1/2) - "
1646*5113495bSYour Name 			  "rxpcu_mpdu_filter_in_category: %x "
1647*5113495bSYour Name 			  "sw_frame_group_id: %x "
1648*5113495bSYour Name 			  "reserved_0: %x "
1649*5113495bSYour Name 			  "phy_ppdu_id: %x "
1650*5113495bSYour Name 			  "first_mpdu : %x "
1651*5113495bSYour Name 			  "reserved_1a: %x "
1652*5113495bSYour Name 			  "mcast_bcast: %x "
1653*5113495bSYour Name 			  "ast_index_not_found: %x "
1654*5113495bSYour Name 			  "ast_index_timeout: %x "
1655*5113495bSYour Name 			  "power_mgmt: %x "
1656*5113495bSYour Name 			  "non_qos: %x "
1657*5113495bSYour Name 			  "null_data: %x "
1658*5113495bSYour Name 			  "mgmt_type: %x "
1659*5113495bSYour Name 			  "ctrl_type: %x "
1660*5113495bSYour Name 			  "more_data: %x "
1661*5113495bSYour Name 			  "eosp: %x "
1662*5113495bSYour Name 			  "a_msdu_error: %x "
1663*5113495bSYour Name 			  "fragment_flag: %x "
1664*5113495bSYour Name 			  "order: %x "
1665*5113495bSYour Name 			  "cce_match: %x "
1666*5113495bSYour Name 			  "overflow_err: %x "
1667*5113495bSYour Name 			  "msdu_length_err: %x "
1668*5113495bSYour Name 			  "tcp_udp_chksum_fail: %x "
1669*5113495bSYour Name 			  "ip_chksum_fail: %x "
1670*5113495bSYour Name 			  "sa_idx_invalid: %x "
1671*5113495bSYour Name 			  "da_idx_invalid: %x "
1672*5113495bSYour Name 			  "reserved_1b: %x "
1673*5113495bSYour Name 			  "rx_in_tx_decrypt_byp: %x ",
1674*5113495bSYour Name 			  rx_attn->rxpcu_mpdu_filter_in_category,
1675*5113495bSYour Name 			  rx_attn->sw_frame_group_id,
1676*5113495bSYour Name 			  rx_attn->reserved_0,
1677*5113495bSYour Name 			  rx_attn->phy_ppdu_id,
1678*5113495bSYour Name 			  rx_attn->first_mpdu,
1679*5113495bSYour Name 			  rx_attn->reserved_1a,
1680*5113495bSYour Name 			  rx_attn->mcast_bcast,
1681*5113495bSYour Name 			  rx_attn->ast_index_not_found,
1682*5113495bSYour Name 			  rx_attn->ast_index_timeout,
1683*5113495bSYour Name 			  rx_attn->power_mgmt,
1684*5113495bSYour Name 			  rx_attn->non_qos,
1685*5113495bSYour Name 			  rx_attn->null_data,
1686*5113495bSYour Name 			  rx_attn->mgmt_type,
1687*5113495bSYour Name 			  rx_attn->ctrl_type,
1688*5113495bSYour Name 			  rx_attn->more_data,
1689*5113495bSYour Name 			  rx_attn->eosp,
1690*5113495bSYour Name 			  rx_attn->a_msdu_error,
1691*5113495bSYour Name 			  rx_attn->fragment_flag,
1692*5113495bSYour Name 			  rx_attn->order,
1693*5113495bSYour Name 			  rx_attn->cce_match,
1694*5113495bSYour Name 			  rx_attn->overflow_err,
1695*5113495bSYour Name 			  rx_attn->msdu_length_err,
1696*5113495bSYour Name 			  rx_attn->tcp_udp_chksum_fail,
1697*5113495bSYour Name 			  rx_attn->ip_chksum_fail,
1698*5113495bSYour Name 			  rx_attn->sa_idx_invalid,
1699*5113495bSYour Name 			  rx_attn->da_idx_invalid,
1700*5113495bSYour Name 			  rx_attn->reserved_1b,
1701*5113495bSYour Name 			  rx_attn->rx_in_tx_decrypt_byp);
1702*5113495bSYour Name 
1703*5113495bSYour Name 	hal_verbose_debug("rx_attention tlv (2/2) - "
1704*5113495bSYour Name 			  "encrypt_required: %x "
1705*5113495bSYour Name 			  "directed: %x "
1706*5113495bSYour Name 			  "buffer_fragment: %x "
1707*5113495bSYour Name 			  "mpdu_length_err: %x "
1708*5113495bSYour Name 			  "tkip_mic_err: %x "
1709*5113495bSYour Name 			  "decrypt_err: %x "
1710*5113495bSYour Name 			  "unencrypted_frame_err: %x "
1711*5113495bSYour Name 			  "fcs_err: %x "
1712*5113495bSYour Name 			  "flow_idx_timeout: %x "
1713*5113495bSYour Name 			  "flow_idx_invalid: %x "
1714*5113495bSYour Name 			  "wifi_parser_error: %x "
1715*5113495bSYour Name 			  "amsdu_parser_error: %x "
1716*5113495bSYour Name 			  "sa_idx_timeout: %x "
1717*5113495bSYour Name 			  "da_idx_timeout: %x "
1718*5113495bSYour Name 			  "msdu_limit_error: %x "
1719*5113495bSYour Name 			  "da_is_valid: %x "
1720*5113495bSYour Name 			  "da_is_mcbc: %x "
1721*5113495bSYour Name 			  "sa_is_valid: %x "
1722*5113495bSYour Name 			  "decrypt_status_code: %x "
1723*5113495bSYour Name 			  "rx_bitmap_not_updated: %x "
1724*5113495bSYour Name 			  "reserved_2: %x "
1725*5113495bSYour Name 			  "msdu_done: %x ",
1726*5113495bSYour Name 			  rx_attn->encrypt_required,
1727*5113495bSYour Name 			  rx_attn->directed,
1728*5113495bSYour Name 			  rx_attn->buffer_fragment,
1729*5113495bSYour Name 			  rx_attn->mpdu_length_err,
1730*5113495bSYour Name 			  rx_attn->tkip_mic_err,
1731*5113495bSYour Name 			  rx_attn->decrypt_err,
1732*5113495bSYour Name 			  rx_attn->unencrypted_frame_err,
1733*5113495bSYour Name 			  rx_attn->fcs_err,
1734*5113495bSYour Name 			  rx_attn->flow_idx_timeout,
1735*5113495bSYour Name 			  rx_attn->flow_idx_invalid,
1736*5113495bSYour Name 			  rx_attn->wifi_parser_error,
1737*5113495bSYour Name 			  rx_attn->amsdu_parser_error,
1738*5113495bSYour Name 			  rx_attn->sa_idx_timeout,
1739*5113495bSYour Name 			  rx_attn->da_idx_timeout,
1740*5113495bSYour Name 			  rx_attn->msdu_limit_error,
1741*5113495bSYour Name 			  rx_attn->da_is_valid,
1742*5113495bSYour Name 			  rx_attn->da_is_mcbc,
1743*5113495bSYour Name 			  rx_attn->sa_is_valid,
1744*5113495bSYour Name 			  rx_attn->decrypt_status_code,
1745*5113495bSYour Name 			  rx_attn->rx_bitmap_not_updated,
1746*5113495bSYour Name 			  rx_attn->reserved_2,
1747*5113495bSYour Name 			  rx_attn->msdu_done);
1748*5113495bSYour Name }
1749*5113495bSYour Name 
1750*5113495bSYour Name /**
1751*5113495bSYour Name  * hal_rx_dump_mpdu_end_tlv_generic_rh: dump RX mpdu_end TLV in structured
1752*5113495bSYour Name  *					human readable format.
1753*5113495bSYour Name  * @pkttlvs: pointer to pkttlvs.
1754*5113495bSYour Name  * @dbg_level: log level.
1755*5113495bSYour Name  *
1756*5113495bSYour Name  * Return: void
1757*5113495bSYour Name  */
hal_rx_dump_mpdu_end_tlv_generic_rh(void * pkttlvs,uint8_t dbg_level)1758*5113495bSYour Name static inline void hal_rx_dump_mpdu_end_tlv_generic_rh(void *pkttlvs,
1759*5113495bSYour Name 						       uint8_t dbg_level)
1760*5113495bSYour Name {
1761*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs;
1762*5113495bSYour Name 	struct rx_mpdu_end *mpdu_end = &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
1763*5113495bSYour Name 
1764*5113495bSYour Name 	hal_verbose_debug("rx_mpdu_end tlv - "
1765*5113495bSYour Name 			  "rxpcu_mpdu_filter_in_category: %x "
1766*5113495bSYour Name 			  "sw_frame_group_id: %x "
1767*5113495bSYour Name 			  "phy_ppdu_id: %x "
1768*5113495bSYour Name 			  "unsup_ktype_short_frame: %x "
1769*5113495bSYour Name 			  "rx_in_tx_decrypt_byp: %x "
1770*5113495bSYour Name 			  "overflow_err: %x "
1771*5113495bSYour Name 			  "mpdu_length_err: %x "
1772*5113495bSYour Name 			  "tkip_mic_err: %x "
1773*5113495bSYour Name 			  "decrypt_err: %x "
1774*5113495bSYour Name 			  "unencrypted_frame_err: %x "
1775*5113495bSYour Name 			  "pn_fields_contain_valid_info: %x "
1776*5113495bSYour Name 			  "fcs_err: %x "
1777*5113495bSYour Name 			  "msdu_length_err: %x "
1778*5113495bSYour Name 			  "rxdma0_destination_ring: %x "
1779*5113495bSYour Name 			  "rxdma1_destination_ring: %x "
1780*5113495bSYour Name 			  "decrypt_status_code: %x "
1781*5113495bSYour Name 			  "rx_bitmap_not_updated: %x ",
1782*5113495bSYour Name 			  mpdu_end->rxpcu_mpdu_filter_in_category,
1783*5113495bSYour Name 			  mpdu_end->sw_frame_group_id,
1784*5113495bSYour Name 			  mpdu_end->phy_ppdu_id,
1785*5113495bSYour Name 			  mpdu_end->unsup_ktype_short_frame,
1786*5113495bSYour Name 			  mpdu_end->rx_in_tx_decrypt_byp,
1787*5113495bSYour Name 			  mpdu_end->overflow_err,
1788*5113495bSYour Name 			  mpdu_end->mpdu_length_err,
1789*5113495bSYour Name 			  mpdu_end->tkip_mic_err,
1790*5113495bSYour Name 			  mpdu_end->decrypt_err,
1791*5113495bSYour Name 			  mpdu_end->unencrypted_frame_err,
1792*5113495bSYour Name 			  mpdu_end->pn_fields_contain_valid_info,
1793*5113495bSYour Name 			  mpdu_end->fcs_err,
1794*5113495bSYour Name 			  mpdu_end->msdu_length_err,
1795*5113495bSYour Name 			  mpdu_end->rxdma0_destination_ring,
1796*5113495bSYour Name 			  mpdu_end->rxdma1_destination_ring,
1797*5113495bSYour Name 			  mpdu_end->decrypt_status_code,
1798*5113495bSYour Name 			  mpdu_end->rx_bitmap_not_updated);
1799*5113495bSYour Name }
1800*5113495bSYour Name 
1801*5113495bSYour Name #ifdef NO_RX_PKT_HDR_TLV
hal_rx_dump_pkt_hdr_tlv_generic_rh(void * pkttlvs,uint8_t dbg_level)1802*5113495bSYour Name static inline void hal_rx_dump_pkt_hdr_tlv_generic_rh(void *pkttlvs,
1803*5113495bSYour Name 						      uint8_t dbg_level)
1804*5113495bSYour Name {
1805*5113495bSYour Name }
1806*5113495bSYour Name #else
1807*5113495bSYour Name /**
1808*5113495bSYour Name  * hal_rx_dump_pkt_hdr_tlv_generic_rh: dump RX pkt header TLV in hex format
1809*5113495bSYour Name  * @pkttlvs: pointer to pkttlvs.
1810*5113495bSYour Name  * @dbg_level: log level.
1811*5113495bSYour Name  *
1812*5113495bSYour Name  * Return: void
1813*5113495bSYour Name  */
hal_rx_dump_pkt_hdr_tlv_generic_rh(void * pkttlvs,uint8_t dbg_level)1814*5113495bSYour Name static inline void hal_rx_dump_pkt_hdr_tlv_generic_rh(void *pkttlvs,
1815*5113495bSYour Name 						      uint8_t dbg_level)
1816*5113495bSYour Name {
1817*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs;
1818*5113495bSYour Name 	struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv;
1819*5113495bSYour Name 
1820*5113495bSYour Name 	hal_verbose_debug("\n---------------\nrx_pkt_hdr_tlv"
1821*5113495bSYour Name 			  "\n---------------\nphy_ppdu_id %d ",
1822*5113495bSYour Name 			  pkt_hdr_tlv->phy_ppdu_id);
1823*5113495bSYour Name 	hal_verbose_hex_dump(pkt_hdr_tlv->rx_pkt_hdr, 128);
1824*5113495bSYour Name }
1825*5113495bSYour Name #endif
1826*5113495bSYour Name 
1827*5113495bSYour Name /**
1828*5113495bSYour Name  * hal_rx_dump_mpdu_start_tlv_generic_rh: dump RX mpdu_start TLV in structured
1829*5113495bSYour Name  *					  human readable format.
1830*5113495bSYour Name  * @pkttlvs: pointer to pkttlvs.
1831*5113495bSYour Name  * @dbg_level: log level.
1832*5113495bSYour Name  *
1833*5113495bSYour Name  * Return: void
1834*5113495bSYour Name  */
hal_rx_dump_mpdu_start_tlv_generic_rh(void * pkttlvs,uint8_t dbg_level)1835*5113495bSYour Name static inline void hal_rx_dump_mpdu_start_tlv_generic_rh(void *pkttlvs,
1836*5113495bSYour Name 							 uint8_t dbg_level)
1837*5113495bSYour Name {
1838*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs;
1839*5113495bSYour Name 	struct rx_mpdu_start *mpdu_start =
1840*5113495bSYour Name 					&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
1841*5113495bSYour Name 	struct rx_mpdu_info *mpdu_info =
1842*5113495bSYour Name 		(struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details;
1843*5113495bSYour Name 
1844*5113495bSYour Name 	hal_verbose_debug(
1845*5113495bSYour Name 			  "rx_mpdu_start tlv (1/5) - "
1846*5113495bSYour Name 			  "rxpcu_mpdu_filter_in_category: %x "
1847*5113495bSYour Name 			  "sw_frame_group_id: %x "
1848*5113495bSYour Name 			  "ndp_frame: %x "
1849*5113495bSYour Name 			  "phy_err: %x "
1850*5113495bSYour Name 			  "phy_err_during_mpdu_header: %x "
1851*5113495bSYour Name 			  "protocol_version_err: %x "
1852*5113495bSYour Name 			  "ast_based_lookup_valid: %x "
1853*5113495bSYour Name 			  "phy_ppdu_id: %x "
1854*5113495bSYour Name 			  "ast_index: %x "
1855*5113495bSYour Name 			  "sw_peer_id: %x "
1856*5113495bSYour Name 			  "mpdu_frame_control_valid: %x "
1857*5113495bSYour Name 			  "mpdu_duration_valid: %x "
1858*5113495bSYour Name 			  "mac_addr_ad1_valid: %x "
1859*5113495bSYour Name 			  "mac_addr_ad2_valid: %x "
1860*5113495bSYour Name 			  "mac_addr_ad3_valid: %x "
1861*5113495bSYour Name 			  "mac_addr_ad4_valid: %x "
1862*5113495bSYour Name 			  "mpdu_sequence_control_valid: %x "
1863*5113495bSYour Name 			  "mpdu_qos_control_valid: %x "
1864*5113495bSYour Name 			  "mpdu_ht_control_valid: %x "
1865*5113495bSYour Name 			  "frame_encryption_info_valid: %x ",
1866*5113495bSYour Name 			  mpdu_info->rxpcu_mpdu_filter_in_category,
1867*5113495bSYour Name 			  mpdu_info->sw_frame_group_id,
1868*5113495bSYour Name 			  mpdu_info->ndp_frame,
1869*5113495bSYour Name 			  mpdu_info->phy_err,
1870*5113495bSYour Name 			  mpdu_info->phy_err_during_mpdu_header,
1871*5113495bSYour Name 			  mpdu_info->protocol_version_err,
1872*5113495bSYour Name 			  mpdu_info->ast_based_lookup_valid,
1873*5113495bSYour Name 			  mpdu_info->phy_ppdu_id,
1874*5113495bSYour Name 			  mpdu_info->ast_index,
1875*5113495bSYour Name 			  mpdu_info->sw_peer_id,
1876*5113495bSYour Name 			  mpdu_info->mpdu_frame_control_valid,
1877*5113495bSYour Name 			  mpdu_info->mpdu_duration_valid,
1878*5113495bSYour Name 			  mpdu_info->mac_addr_ad1_valid,
1879*5113495bSYour Name 			  mpdu_info->mac_addr_ad2_valid,
1880*5113495bSYour Name 			  mpdu_info->mac_addr_ad3_valid,
1881*5113495bSYour Name 			  mpdu_info->mac_addr_ad4_valid,
1882*5113495bSYour Name 			  mpdu_info->mpdu_sequence_control_valid,
1883*5113495bSYour Name 			  mpdu_info->mpdu_qos_control_valid,
1884*5113495bSYour Name 			  mpdu_info->mpdu_ht_control_valid,
1885*5113495bSYour Name 			  mpdu_info->frame_encryption_info_valid);
1886*5113495bSYour Name 
1887*5113495bSYour Name 	hal_verbose_debug(
1888*5113495bSYour Name 			  "rx_mpdu_start tlv (2/5) - "
1889*5113495bSYour Name 			  "fr_ds: %x "
1890*5113495bSYour Name 			  "to_ds: %x "
1891*5113495bSYour Name 			  "encrypted: %x "
1892*5113495bSYour Name 			  "mpdu_retry: %x "
1893*5113495bSYour Name 			  "mpdu_sequence_number: %x "
1894*5113495bSYour Name 			  "epd_en: %x "
1895*5113495bSYour Name 			  "all_frames_shall_be_encrypted: %x "
1896*5113495bSYour Name 			  "encrypt_type: %x "
1897*5113495bSYour Name 			  "bssid_hit: %x "
1898*5113495bSYour Name 			  "bssid_number: %x "
1899*5113495bSYour Name 			  "tid: %x "
1900*5113495bSYour Name 			  "pn_31_0: %x "
1901*5113495bSYour Name 			  "pn_63_32: %x "
1902*5113495bSYour Name 			  "pn_95_64: %x "
1903*5113495bSYour Name 			  "pn_127_96: %x "
1904*5113495bSYour Name 			  "peer_meta_data: %x "
1905*5113495bSYour Name 			  "rxpt_classify_info.reo_destination_indication: %x "
1906*5113495bSYour Name 			  "rxpt_classify_info.use_flow_id_toeplitz_clfy: %x "
1907*5113495bSYour Name 			  "rx_reo_queue_desc_addr_31_0: %x ",
1908*5113495bSYour Name 			  mpdu_info->fr_ds,
1909*5113495bSYour Name 			  mpdu_info->to_ds,
1910*5113495bSYour Name 			  mpdu_info->encrypted,
1911*5113495bSYour Name 			  mpdu_info->mpdu_retry,
1912*5113495bSYour Name 			  mpdu_info->mpdu_sequence_number,
1913*5113495bSYour Name 			  mpdu_info->epd_en,
1914*5113495bSYour Name 			  mpdu_info->all_frames_shall_be_encrypted,
1915*5113495bSYour Name 			  mpdu_info->encrypt_type,
1916*5113495bSYour Name 			  mpdu_info->bssid_hit,
1917*5113495bSYour Name 			  mpdu_info->bssid_number,
1918*5113495bSYour Name 			  mpdu_info->tid,
1919*5113495bSYour Name 			  mpdu_info->pn_31_0,
1920*5113495bSYour Name 			  mpdu_info->pn_63_32,
1921*5113495bSYour Name 			  mpdu_info->pn_95_64,
1922*5113495bSYour Name 			  mpdu_info->pn_127_96,
1923*5113495bSYour Name 			  mpdu_info->peer_meta_data,
1924*5113495bSYour Name 			  mpdu_info->rxpt_classify_info_details.reo_destination_indication,
1925*5113495bSYour Name 			  mpdu_info->rxpt_classify_info_details.use_flow_id_toeplitz_clfy,
1926*5113495bSYour Name 			  mpdu_info->rx_reo_queue_desc_addr_31_0);
1927*5113495bSYour Name 
1928*5113495bSYour Name 	hal_verbose_debug(
1929*5113495bSYour Name 			  "rx_mpdu_start tlv (3/5) - "
1930*5113495bSYour Name 			  "rx_reo_queue_desc_addr_39_32: %x "
1931*5113495bSYour Name 			  "receive_queue_number: %x "
1932*5113495bSYour Name 			  "pre_delim_err_warning: %x "
1933*5113495bSYour Name 			  "first_delim_err: %x "
1934*5113495bSYour Name 			  "key_id_octet: %x "
1935*5113495bSYour Name 			  "new_peer_entry: %x "
1936*5113495bSYour Name 			  "decrypt_needed: %x "
1937*5113495bSYour Name 			  "decap_type: %x "
1938*5113495bSYour Name 			  "rx_insert_vlan_c_tag_padding: %x "
1939*5113495bSYour Name 			  "rx_insert_vlan_s_tag_padding: %x "
1940*5113495bSYour Name 			  "strip_vlan_c_tag_decap: %x "
1941*5113495bSYour Name 			  "strip_vlan_s_tag_decap: %x "
1942*5113495bSYour Name 			  "pre_delim_count: %x "
1943*5113495bSYour Name 			  "ampdu_flag: %x "
1944*5113495bSYour Name 			  "bar_frame: %x "
1945*5113495bSYour Name 			  "mpdu_length: %x "
1946*5113495bSYour Name 			  "first_mpdu: %x "
1947*5113495bSYour Name 			  "mcast_bcast: %x "
1948*5113495bSYour Name 			  "ast_index_not_found: %x "
1949*5113495bSYour Name 			  "ast_index_timeout: %x ",
1950*5113495bSYour Name 			  mpdu_info->rx_reo_queue_desc_addr_39_32,
1951*5113495bSYour Name 			  mpdu_info->receive_queue_number,
1952*5113495bSYour Name 			  mpdu_info->pre_delim_err_warning,
1953*5113495bSYour Name 			  mpdu_info->first_delim_err,
1954*5113495bSYour Name 			  mpdu_info->key_id_octet,
1955*5113495bSYour Name 			  mpdu_info->new_peer_entry,
1956*5113495bSYour Name 			  mpdu_info->decrypt_needed,
1957*5113495bSYour Name 			  mpdu_info->decap_type,
1958*5113495bSYour Name 			  mpdu_info->rx_insert_vlan_c_tag_padding,
1959*5113495bSYour Name 			  mpdu_info->rx_insert_vlan_s_tag_padding,
1960*5113495bSYour Name 			  mpdu_info->strip_vlan_c_tag_decap,
1961*5113495bSYour Name 			  mpdu_info->strip_vlan_s_tag_decap,
1962*5113495bSYour Name 			  mpdu_info->pre_delim_count,
1963*5113495bSYour Name 			  mpdu_info->ampdu_flag,
1964*5113495bSYour Name 			  mpdu_info->bar_frame,
1965*5113495bSYour Name 			  mpdu_info->mpdu_length,
1966*5113495bSYour Name 			  mpdu_info->first_mpdu,
1967*5113495bSYour Name 			  mpdu_info->mcast_bcast,
1968*5113495bSYour Name 			  mpdu_info->ast_index_not_found,
1969*5113495bSYour Name 			  mpdu_info->ast_index_timeout);
1970*5113495bSYour Name 
1971*5113495bSYour Name 	hal_verbose_debug(
1972*5113495bSYour Name 			  "rx_mpdu_start tlv (4/5) - "
1973*5113495bSYour Name 			  "power_mgmt: %x "
1974*5113495bSYour Name 			  "non_qos: %x "
1975*5113495bSYour Name 			  "null_data: %x "
1976*5113495bSYour Name 			  "mgmt_type: %x "
1977*5113495bSYour Name 			  "ctrl_type: %x "
1978*5113495bSYour Name 			  "more_data: %x "
1979*5113495bSYour Name 			  "eosp: %x "
1980*5113495bSYour Name 			  "fragment_flag: %x "
1981*5113495bSYour Name 			  "order: %x "
1982*5113495bSYour Name 			  "u_apsd_trigger: %x "
1983*5113495bSYour Name 			  "encrypt_required: %x "
1984*5113495bSYour Name 			  "directed: %x "
1985*5113495bSYour Name 			  "mpdu_frame_control_field: %x "
1986*5113495bSYour Name 			  "mpdu_duration_field: %x "
1987*5113495bSYour Name 			  "mac_addr_ad1_31_0: %x "
1988*5113495bSYour Name 			  "mac_addr_ad1_47_32: %x "
1989*5113495bSYour Name 			  "mac_addr_ad2_15_0: %x "
1990*5113495bSYour Name 			  "mac_addr_ad2_47_16: %x "
1991*5113495bSYour Name 			  "mac_addr_ad3_31_0: %x "
1992*5113495bSYour Name 			  "mac_addr_ad3_47_32: %x ",
1993*5113495bSYour Name 			  mpdu_info->power_mgmt,
1994*5113495bSYour Name 			  mpdu_info->non_qos,
1995*5113495bSYour Name 			  mpdu_info->null_data,
1996*5113495bSYour Name 			  mpdu_info->mgmt_type,
1997*5113495bSYour Name 			  mpdu_info->ctrl_type,
1998*5113495bSYour Name 			  mpdu_info->more_data,
1999*5113495bSYour Name 			  mpdu_info->eosp,
2000*5113495bSYour Name 			  mpdu_info->fragment_flag,
2001*5113495bSYour Name 			  mpdu_info->order,
2002*5113495bSYour Name 			  mpdu_info->u_apsd_trigger,
2003*5113495bSYour Name 			  mpdu_info->encrypt_required,
2004*5113495bSYour Name 			  mpdu_info->directed,
2005*5113495bSYour Name 			  mpdu_info->mpdu_frame_control_field,
2006*5113495bSYour Name 			  mpdu_info->mpdu_duration_field,
2007*5113495bSYour Name 			  mpdu_info->mac_addr_ad1_31_0,
2008*5113495bSYour Name 			  mpdu_info->mac_addr_ad1_47_32,
2009*5113495bSYour Name 			  mpdu_info->mac_addr_ad2_15_0,
2010*5113495bSYour Name 			  mpdu_info->mac_addr_ad2_47_16,
2011*5113495bSYour Name 			  mpdu_info->mac_addr_ad3_31_0,
2012*5113495bSYour Name 			  mpdu_info->mac_addr_ad3_47_32);
2013*5113495bSYour Name 
2014*5113495bSYour Name 	hal_verbose_debug(
2015*5113495bSYour Name 			  "rx_mpdu_start tlv (5/5) - "
2016*5113495bSYour Name 			  "mpdu_sequence_control_field: %x "
2017*5113495bSYour Name 			  "mac_addr_ad4_31_0: %x "
2018*5113495bSYour Name 			  "mac_addr_ad4_47_32: %x "
2019*5113495bSYour Name 			  "mpdu_qos_control_field: %x "
2020*5113495bSYour Name 			  "mpdu_ht_control_field: %x ",
2021*5113495bSYour Name 			  mpdu_info->mpdu_sequence_control_field,
2022*5113495bSYour Name 			  mpdu_info->mac_addr_ad4_31_0,
2023*5113495bSYour Name 			  mpdu_info->mac_addr_ad4_47_32,
2024*5113495bSYour Name 			  mpdu_info->mpdu_qos_control_field,
2025*5113495bSYour Name 			  mpdu_info->mpdu_ht_control_field);
2026*5113495bSYour Name }
2027*5113495bSYour Name 
2028*5113495bSYour Name static void
hal_tx_set_pcp_tid_map_generic_rh(struct hal_soc * soc,uint8_t * map)2029*5113495bSYour Name hal_tx_set_pcp_tid_map_generic_rh(struct hal_soc *soc, uint8_t *map)
2030*5113495bSYour Name {
2031*5113495bSYour Name }
2032*5113495bSYour Name 
2033*5113495bSYour Name static void
hal_tx_update_pcp_tid_generic_rh(struct hal_soc * soc,uint8_t pcp,uint8_t tid)2034*5113495bSYour Name hal_tx_update_pcp_tid_generic_rh(struct hal_soc *soc,
2035*5113495bSYour Name 				 uint8_t pcp, uint8_t tid)
2036*5113495bSYour Name {
2037*5113495bSYour Name }
2038*5113495bSYour Name 
2039*5113495bSYour Name static void
hal_tx_update_tidmap_prty_generic_rh(struct hal_soc * soc,uint8_t value)2040*5113495bSYour Name hal_tx_update_tidmap_prty_generic_rh(struct hal_soc *soc, uint8_t value)
2041*5113495bSYour Name {
2042*5113495bSYour Name }
2043*5113495bSYour Name 
2044*5113495bSYour Name /**
2045*5113495bSYour Name  * hal_rx_msdu_packet_metadata_get_generic_rh(): API to get the
2046*5113495bSYour Name  * msdu information from rx_msdu_end TLV
2047*5113495bSYour Name  *
2048*5113495bSYour Name  * @buf: pointer to the start of RX PKT TLV headers
2049*5113495bSYour Name  * @pkt_msdu_metadata: pointer to the msdu metadata
2050*5113495bSYour Name  */
2051*5113495bSYour Name static void
hal_rx_msdu_packet_metadata_get_generic_rh(uint8_t * buf,void * pkt_msdu_metadata)2052*5113495bSYour Name hal_rx_msdu_packet_metadata_get_generic_rh(uint8_t *buf,
2053*5113495bSYour Name 					   void *pkt_msdu_metadata)
2054*5113495bSYour Name {
2055*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
2056*5113495bSYour Name 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
2057*5113495bSYour Name 	struct hal_rx_msdu_metadata *msdu_metadata =
2058*5113495bSYour Name 		(struct hal_rx_msdu_metadata *)pkt_msdu_metadata;
2059*5113495bSYour Name 
2060*5113495bSYour Name 	msdu_metadata->l3_hdr_pad =
2061*5113495bSYour Name 		HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end);
2062*5113495bSYour Name 	msdu_metadata->sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end);
2063*5113495bSYour Name 	msdu_metadata->da_idx = HAL_RX_MSDU_END_DA_IDX_GET(msdu_end);
2064*5113495bSYour Name 	msdu_metadata->sa_sw_peer_id =
2065*5113495bSYour Name 		HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
2066*5113495bSYour Name }
2067*5113495bSYour Name 
2068*5113495bSYour Name /**
2069*5113495bSYour Name  * hal_rx_msdu_end_offset_get_generic(): API to get the
2070*5113495bSYour Name  * msdu_end structure offset rx_pkt_tlv structure
2071*5113495bSYour Name  *
2072*5113495bSYour Name  * NOTE: API returns offset of msdu_end TLV from structure
2073*5113495bSYour Name  * rx_pkt_tlvs
2074*5113495bSYour Name  */
hal_rx_msdu_end_offset_get_generic(void)2075*5113495bSYour Name static uint32_t hal_rx_msdu_end_offset_get_generic(void)
2076*5113495bSYour Name {
2077*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(msdu_end_tlv);
2078*5113495bSYour Name }
2079*5113495bSYour Name 
2080*5113495bSYour Name /**
2081*5113495bSYour Name  * hal_rx_attn_offset_get_generic(): API to get the
2082*5113495bSYour Name  * msdu_end structure offset rx_pkt_tlv structure
2083*5113495bSYour Name  *
2084*5113495bSYour Name  * NOTE: API returns offset of attn TLV from structure
2085*5113495bSYour Name  * rx_pkt_tlvs
2086*5113495bSYour Name  */
hal_rx_attn_offset_get_generic(void)2087*5113495bSYour Name static uint32_t hal_rx_attn_offset_get_generic(void)
2088*5113495bSYour Name {
2089*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(attn_tlv);
2090*5113495bSYour Name }
2091*5113495bSYour Name 
2092*5113495bSYour Name /**
2093*5113495bSYour Name  * hal_rx_msdu_start_offset_get_generic(): API to get the
2094*5113495bSYour Name  * msdu_start structure offset rx_pkt_tlv structure
2095*5113495bSYour Name  *
2096*5113495bSYour Name  * NOTE: API returns offset of attn TLV from structure
2097*5113495bSYour Name  * rx_pkt_tlvs
2098*5113495bSYour Name  */
hal_rx_msdu_start_offset_get_generic(void)2099*5113495bSYour Name static uint32_t hal_rx_msdu_start_offset_get_generic(void)
2100*5113495bSYour Name {
2101*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(msdu_start_tlv);
2102*5113495bSYour Name }
2103*5113495bSYour Name 
2104*5113495bSYour Name /**
2105*5113495bSYour Name  * hal_rx_mpdu_start_offset_get_generic(): API to get the
2106*5113495bSYour Name  * mpdu_start structure offset rx_pkt_tlv structure
2107*5113495bSYour Name  *
2108*5113495bSYour Name  * NOTE: API returns offset of attn TLV from structure
2109*5113495bSYour Name  * rx_pkt_tlvs
2110*5113495bSYour Name  */
hal_rx_mpdu_start_offset_get_generic(void)2111*5113495bSYour Name static uint32_t hal_rx_mpdu_start_offset_get_generic(void)
2112*5113495bSYour Name {
2113*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(mpdu_start_tlv);
2114*5113495bSYour Name }
2115*5113495bSYour Name 
2116*5113495bSYour Name /**
2117*5113495bSYour Name  * hal_rx_mpdu_end_offset_get_generic(): API to get the
2118*5113495bSYour Name  * mpdu_end structure offset rx_pkt_tlv structure
2119*5113495bSYour Name  *
2120*5113495bSYour Name  * NOTE: API returns offset of attn TLV from structure
2121*5113495bSYour Name  * rx_pkt_tlvs
2122*5113495bSYour Name  */
hal_rx_mpdu_end_offset_get_generic(void)2123*5113495bSYour Name static uint32_t hal_rx_mpdu_end_offset_get_generic(void)
2124*5113495bSYour Name {
2125*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(mpdu_end_tlv);
2126*5113495bSYour Name }
2127*5113495bSYour Name 
2128*5113495bSYour Name #ifndef NO_RX_PKT_HDR_TLV
hal_rx_pkt_tlv_offset_get_generic(void)2129*5113495bSYour Name static uint32_t hal_rx_pkt_tlv_offset_get_generic(void)
2130*5113495bSYour Name {
2131*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(pkt_hdr_tlv);
2132*5113495bSYour Name }
2133*5113495bSYour Name #endif
2134*5113495bSYour Name 
2135*5113495bSYour Name #ifdef TCL_DATA_CMD_2_SEARCH_TYPE_OFFSET
2136*5113495bSYour Name /**
2137*5113495bSYour Name  * hal_tx_desc_set_search_type_generic_rh - Set the search type value
2138*5113495bSYour Name  * @desc: Handle to Tx Descriptor
2139*5113495bSYour Name  * @search_type: search type
2140*5113495bSYour Name  *		     0 – Normal search
2141*5113495bSYour Name  *		     1 – Index based address search
2142*5113495bSYour Name  *		     2 – Index based flow search
2143*5113495bSYour Name  *
2144*5113495bSYour Name  * Return: void
2145*5113495bSYour Name  */
2146*5113495bSYour Name static inline
hal_tx_desc_set_search_type_generic_rh(void * desc,uint8_t search_type)2147*5113495bSYour Name void hal_tx_desc_set_search_type_generic_rh(void *desc, uint8_t search_type)
2148*5113495bSYour Name {
2149*5113495bSYour Name 	HAL_SET_FLD(desc, TCL_DATA_CMD_2, SEARCH_TYPE) |=
2150*5113495bSYour Name 		HAL_TX_SM(TCL_DATA_CMD_2, SEARCH_TYPE, search_type);
2151*5113495bSYour Name }
2152*5113495bSYour Name #else
2153*5113495bSYour Name static inline
hal_tx_desc_set_search_type_generic_rh(void * desc,uint8_t search_type)2154*5113495bSYour Name void hal_tx_desc_set_search_type_generic_rh(void *desc, uint8_t search_type)
2155*5113495bSYour Name {
2156*5113495bSYour Name }
2157*5113495bSYour Name 
2158*5113495bSYour Name #endif
2159*5113495bSYour Name 
2160*5113495bSYour Name #ifdef TCL_DATA_CMD_5_SEARCH_INDEX_OFFSET
2161*5113495bSYour Name /**
2162*5113495bSYour Name  * hal_tx_desc_set_search_index_generic_rh - Set the search index value
2163*5113495bSYour Name  * @desc: Handle to Tx Descriptor
2164*5113495bSYour Name  * @search_index: The index that will be used for index based address or
2165*5113495bSYour Name  *                flow search. The field is valid when 'search_type' is
2166*5113495bSYour Name  *                1 0r 2
2167*5113495bSYour Name  *
2168*5113495bSYour Name  * Return: void
2169*5113495bSYour Name  */
2170*5113495bSYour Name static inline
hal_tx_desc_set_search_index_generic_rh(void * desc,uint32_t search_index)2171*5113495bSYour Name void hal_tx_desc_set_search_index_generic_rh(void *desc, uint32_t search_index)
2172*5113495bSYour Name {
2173*5113495bSYour Name 	HAL_SET_FLD(desc, TCL_DATA_CMD_5, SEARCH_INDEX) |=
2174*5113495bSYour Name 		HAL_TX_SM(TCL_DATA_CMD_5, SEARCH_INDEX, search_index);
2175*5113495bSYour Name }
2176*5113495bSYour Name #else
2177*5113495bSYour Name static inline
hal_tx_desc_set_search_index_generic_rh(void * desc,uint32_t search_index)2178*5113495bSYour Name void hal_tx_desc_set_search_index_generic_rh(void *desc, uint32_t search_index)
2179*5113495bSYour Name {
2180*5113495bSYour Name }
2181*5113495bSYour Name #endif
2182*5113495bSYour Name 
2183*5113495bSYour Name #ifdef TCL_DATA_CMD_5_CACHE_SET_NUM_OFFSET
2184*5113495bSYour Name /**
2185*5113495bSYour Name  * hal_tx_desc_set_cache_set_num_generic_rh - Set the cache-set-num value
2186*5113495bSYour Name  * @desc: Handle to Tx Descriptor
2187*5113495bSYour Name  * @cache_num: Cache set number that should be used to cache the index
2188*5113495bSYour Name  *                based search results, for address and flow search.
2189*5113495bSYour Name  *                This value should be equal to LSB four bits of the hash value
2190*5113495bSYour Name  *                of match data, in case of search index points to an entry
2191*5113495bSYour Name  *                which may be used in content based search also. The value can
2192*5113495bSYour Name  *                be anything when the entry pointed by search index will not be
2193*5113495bSYour Name  *                used for content based search.
2194*5113495bSYour Name  *
2195*5113495bSYour Name  * Return: void
2196*5113495bSYour Name  */
2197*5113495bSYour Name static inline
hal_tx_desc_set_cache_set_num_generic_rh(void * desc,uint8_t cache_num)2198*5113495bSYour Name void hal_tx_desc_set_cache_set_num_generic_rh(void *desc, uint8_t cache_num)
2199*5113495bSYour Name {
2200*5113495bSYour Name 	HAL_SET_FLD(desc, TCL_DATA_CMD_5, CACHE_SET_NUM) |=
2201*5113495bSYour Name 		HAL_TX_SM(TCL_DATA_CMD_5, CACHE_SET_NUM, cache_num);
2202*5113495bSYour Name }
2203*5113495bSYour Name #else
2204*5113495bSYour Name static inline
hal_tx_desc_set_cache_set_num_generic_rh(void * desc,uint8_t cache_num)2205*5113495bSYour Name void hal_tx_desc_set_cache_set_num_generic_rh(void *desc, uint8_t cache_num)
2206*5113495bSYour Name {
2207*5113495bSYour Name }
2208*5113495bSYour Name #endif
2209*5113495bSYour Name 
2210*5113495bSYour Name #ifdef WLAN_SUPPORT_RX_FISA
2211*5113495bSYour Name /**
2212*5113495bSYour Name  * hal_rx_flow_get_tuple_info_rh() - Setup a flow search entry in HW FST
2213*5113495bSYour Name  * @rx_fst: Pointer to the Rx Flow Search Table
2214*5113495bSYour Name  * @hal_hash: HAL 5 tuple hash
2215*5113495bSYour Name  * @flow_tuple_info: 5-tuple info of the flow returned to the caller
2216*5113495bSYour Name  *
2217*5113495bSYour Name  * Return: Success/Failure
2218*5113495bSYour Name  */
2219*5113495bSYour Name static void *
hal_rx_flow_get_tuple_info_rh(uint8_t * rx_fst,uint32_t hal_hash,uint8_t * flow_tuple_info)2220*5113495bSYour Name hal_rx_flow_get_tuple_info_rh(uint8_t *rx_fst, uint32_t hal_hash,
2221*5113495bSYour Name 			      uint8_t *flow_tuple_info)
2222*5113495bSYour Name {
2223*5113495bSYour Name 	struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst;
2224*5113495bSYour Name 	void *hal_fse = NULL;
2225*5113495bSYour Name 	struct hal_flow_tuple_info *tuple_info
2226*5113495bSYour Name 		= (struct hal_flow_tuple_info *)flow_tuple_info;
2227*5113495bSYour Name 
2228*5113495bSYour Name 	hal_fse = (uint8_t *)fst->base_vaddr +
2229*5113495bSYour Name 		(hal_hash * HAL_RX_FST_ENTRY_SIZE);
2230*5113495bSYour Name 
2231*5113495bSYour Name 	if (!hal_fse || !tuple_info)
2232*5113495bSYour Name 		return NULL;
2233*5113495bSYour Name 
2234*5113495bSYour Name 	if (!HAL_GET_FLD(hal_fse, RX_FLOW_SEARCH_ENTRY_9, VALID))
2235*5113495bSYour Name 		return NULL;
2236*5113495bSYour Name 
2237*5113495bSYour Name 	tuple_info->src_ip_127_96 =
2238*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2239*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_0,
2240*5113495bSYour Name 						      SRC_IP_127_96));
2241*5113495bSYour Name 	tuple_info->src_ip_95_64 =
2242*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2243*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_1,
2244*5113495bSYour Name 						      SRC_IP_95_64));
2245*5113495bSYour Name 	tuple_info->src_ip_63_32 =
2246*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2247*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_2,
2248*5113495bSYour Name 						      SRC_IP_63_32));
2249*5113495bSYour Name 	tuple_info->src_ip_31_0 =
2250*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2251*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_3,
2252*5113495bSYour Name 						      SRC_IP_31_0));
2253*5113495bSYour Name 	tuple_info->dest_ip_127_96 =
2254*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2255*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_4,
2256*5113495bSYour Name 						      DEST_IP_127_96));
2257*5113495bSYour Name 	tuple_info->dest_ip_95_64 =
2258*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2259*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_5,
2260*5113495bSYour Name 						      DEST_IP_95_64));
2261*5113495bSYour Name 	tuple_info->dest_ip_63_32 =
2262*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2263*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_6,
2264*5113495bSYour Name 						      DEST_IP_63_32));
2265*5113495bSYour Name 	tuple_info->dest_ip_31_0 =
2266*5113495bSYour Name 			qdf_ntohl(HAL_GET_FLD(hal_fse,
2267*5113495bSYour Name 					      RX_FLOW_SEARCH_ENTRY_7,
2268*5113495bSYour Name 					      DEST_IP_31_0));
2269*5113495bSYour Name 	tuple_info->dest_port = HAL_GET_FLD(hal_fse,
2270*5113495bSYour Name 					    RX_FLOW_SEARCH_ENTRY_8,
2271*5113495bSYour Name 					    DEST_PORT);
2272*5113495bSYour Name 	tuple_info->src_port = HAL_GET_FLD(hal_fse,
2273*5113495bSYour Name 					   RX_FLOW_SEARCH_ENTRY_8,
2274*5113495bSYour Name 					   SRC_PORT);
2275*5113495bSYour Name 	tuple_info->l4_protocol = HAL_GET_FLD(hal_fse,
2276*5113495bSYour Name 					      RX_FLOW_SEARCH_ENTRY_9,
2277*5113495bSYour Name 					      L4_PROTOCOL);
2278*5113495bSYour Name 
2279*5113495bSYour Name 	return hal_fse;
2280*5113495bSYour Name }
2281*5113495bSYour Name 
2282*5113495bSYour Name /**
2283*5113495bSYour Name  * hal_rx_flow_delete_entry_rh() - Setup a flow search entry in HW FST
2284*5113495bSYour Name  * @rx_fst: Pointer to the Rx Flow Search Table
2285*5113495bSYour Name  * @hal_rx_fse: Pointer to the Rx Flow that is to be deleted from the FST
2286*5113495bSYour Name  *
2287*5113495bSYour Name  * Return: Success/Failure
2288*5113495bSYour Name  */
2289*5113495bSYour Name static QDF_STATUS
hal_rx_flow_delete_entry_rh(uint8_t * rx_fst,void * hal_rx_fse)2290*5113495bSYour Name hal_rx_flow_delete_entry_rh(uint8_t *rx_fst, void *hal_rx_fse)
2291*5113495bSYour Name {
2292*5113495bSYour Name 	uint8_t *fse = (uint8_t *)hal_rx_fse;
2293*5113495bSYour Name 
2294*5113495bSYour Name 	if (!HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, VALID))
2295*5113495bSYour Name 		return QDF_STATUS_E_NOENT;
2296*5113495bSYour Name 
2297*5113495bSYour Name 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, VALID);
2298*5113495bSYour Name 
2299*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2300*5113495bSYour Name }
2301*5113495bSYour Name 
2302*5113495bSYour Name /**
2303*5113495bSYour Name  * hal_rx_fst_get_fse_size_rh() - Retrieve the size of each entry
2304*5113495bSYour Name  *
2305*5113495bSYour Name  * Return: size of each entry/flow in Rx FST
2306*5113495bSYour Name  */
2307*5113495bSYour Name static inline uint32_t
hal_rx_fst_get_fse_size_rh(void)2308*5113495bSYour Name hal_rx_fst_get_fse_size_rh(void)
2309*5113495bSYour Name {
2310*5113495bSYour Name 	return HAL_RX_FST_ENTRY_SIZE;
2311*5113495bSYour Name }
2312*5113495bSYour Name #else
2313*5113495bSYour Name static inline void *
hal_rx_flow_get_tuple_info_rh(uint8_t * rx_fst,uint32_t hal_hash,uint8_t * flow_tuple_info)2314*5113495bSYour Name hal_rx_flow_get_tuple_info_rh(uint8_t *rx_fst, uint32_t hal_hash,
2315*5113495bSYour Name 			      uint8_t *flow_tuple_info)
2316*5113495bSYour Name {
2317*5113495bSYour Name 	return NULL;
2318*5113495bSYour Name }
2319*5113495bSYour Name 
2320*5113495bSYour Name static inline QDF_STATUS
hal_rx_flow_delete_entry_rh(uint8_t * rx_fst,void * hal_rx_fse)2321*5113495bSYour Name hal_rx_flow_delete_entry_rh(uint8_t *rx_fst, void *hal_rx_fse)
2322*5113495bSYour Name {
2323*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2324*5113495bSYour Name }
2325*5113495bSYour Name 
2326*5113495bSYour Name static inline uint32_t
hal_rx_fst_get_fse_size_rh(void)2327*5113495bSYour Name hal_rx_fst_get_fse_size_rh(void)
2328*5113495bSYour Name {
2329*5113495bSYour Name 	return 0;
2330*5113495bSYour Name }
2331*5113495bSYour Name #endif /* WLAN_SUPPORT_RX_FISA */
2332*5113495bSYour Name 
2333*5113495bSYour Name /**
2334*5113495bSYour Name  * hal_rx_get_frame_ctrl_field_rh(): Function to retrieve frame control field
2335*5113495bSYour Name  *
2336*5113495bSYour Name  * @buf: Network buffer
2337*5113495bSYour Name  *
2338*5113495bSYour Name  * Returns: rx more fragment bit
2339*5113495bSYour Name  */
hal_rx_get_frame_ctrl_field_rh(uint8_t * buf)2340*5113495bSYour Name static uint16_t hal_rx_get_frame_ctrl_field_rh(uint8_t *buf)
2341*5113495bSYour Name {
2342*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
2343*5113495bSYour Name 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
2344*5113495bSYour Name 	uint16_t frame_ctrl = 0;
2345*5113495bSYour Name 
2346*5113495bSYour Name 	frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_mpdu_info);
2347*5113495bSYour Name 
2348*5113495bSYour Name 	return frame_ctrl;
2349*5113495bSYour Name }
2350*5113495bSYour Name 
2351*5113495bSYour Name #if defined(WLAN_FEATURE_TSF_UPLINK_DELAY) || defined(WLAN_CONFIG_TX_DELAY)
2352*5113495bSYour Name static inline void
hal_tx_comp_get_buffer_timestamp_rh(void * desc,struct hal_tx_completion_status * ts)2353*5113495bSYour Name hal_tx_comp_get_buffer_timestamp_rh(void *desc,
2354*5113495bSYour Name 				    struct hal_tx_completion_status *ts)
2355*5113495bSYour Name {
2356*5113495bSYour Name 	uint32_t *msg_word = (struct uint32_t *)desc;
2357*5113495bSYour Name 
2358*5113495bSYour Name 	ts->buffer_timestamp =
2359*5113495bSYour Name 		HTT_TX_MSDU_INFO_BUFFER_TIMESTAMP_GET(*(msg_word + 4));
2360*5113495bSYour Name }
2361*5113495bSYour Name #else /* !WLAN_FEATURE_TSF_UPLINK_DELAY || WLAN_CONFIG_TX_DELAY */
2362*5113495bSYour Name static inline void
hal_tx_comp_get_buffer_timestamp_rh(void * desc,struct hal_tx_completion_status * ts)2363*5113495bSYour Name hal_tx_comp_get_buffer_timestamp_rh(void *desc,
2364*5113495bSYour Name 				    struct hal_tx_completion_status *ts)
2365*5113495bSYour Name {
2366*5113495bSYour Name }
2367*5113495bSYour Name #endif /* WLAN_FEATURE_TSF_UPLINK_DELAY || WLAN_CONFIG_TX_DELAY */
2368*5113495bSYour Name 
hal_tx_get_compl_status_rh(uint8_t tx_status)2369*5113495bSYour Name static inline uint8_t hal_tx_get_compl_status_rh(uint8_t tx_status)
2370*5113495bSYour Name {
2371*5113495bSYour Name 	switch (tx_status) {
2372*5113495bSYour Name 	case HTT_TX_MSDU_RELEASE_REASON_FRAME_ACKED:
2373*5113495bSYour Name 		return HAL_TX_TQM_RR_FRAME_ACKED;
2374*5113495bSYour Name 	case HTT_TX_MSDU_RELEASE_REASON_REMOVE_CMD_TX:
2375*5113495bSYour Name 		return HAL_TX_TQM_RR_REM_CMD_TX;
2376*5113495bSYour Name 	case HTT_TX_MSDU_RELEASE_REASON_REMOVE_CMD_NOTX:
2377*5113495bSYour Name 		return HAL_TX_TQM_RR_REM_CMD_NOTX;
2378*5113495bSYour Name 	case HTT_TX_MSDU_RELEASE_REASON_REMOVE_CMD_AGED:
2379*5113495bSYour Name 		return HAL_TX_TQM_RR_REM_CMD_AGED;
2380*5113495bSYour Name 	case HTT_TX_MSDU_RELEASE_FW_REASON1:
2381*5113495bSYour Name 		return HAL_TX_TQM_RR_FW_REASON1;
2382*5113495bSYour Name 	case HTT_TX_MSDU_RELEASE_FW_REASON2:
2383*5113495bSYour Name 		return HAL_TX_TQM_RR_FW_REASON2;
2384*5113495bSYour Name 	case HTT_TX_MSDU_RELEASE_FW_REASON3:
2385*5113495bSYour Name 		return HAL_TX_TQM_RR_FW_REASON3;
2386*5113495bSYour Name 	case HTT_TX_MSDU_RELEASE_REASON_REMOVE_CMD_DISABLEQ:
2387*5113495bSYour Name 		return HAL_TX_TQM_RR_REM_CMD_DISABLE_QUEUE;
2388*5113495bSYour Name 	default:
2389*5113495bSYour Name 		return HAL_TX_TQM_RR_REM_CMD_REM;
2390*5113495bSYour Name 	}
2391*5113495bSYour Name }
2392*5113495bSYour Name 
2393*5113495bSYour Name static inline void
hal_tx_comp_get_status_generic_rh(void * desc,void * ts1,struct hal_soc * hal)2394*5113495bSYour Name hal_tx_comp_get_status_generic_rh(void *desc, void *ts1, struct hal_soc *hal)
2395*5113495bSYour Name {
2396*5113495bSYour Name 	uint8_t tx_status;
2397*5113495bSYour Name 	struct hal_tx_completion_status *ts =
2398*5113495bSYour Name 		(struct hal_tx_completion_status *)ts1;
2399*5113495bSYour Name 	uint32_t *msg_word = (uint32_t *)desc;
2400*5113495bSYour Name 
2401*5113495bSYour Name 	if (HTT_TX_BUFFER_ADDR_INFO_RELEASE_SOURCE_GET(*(msg_word + 1)) ==
2402*5113495bSYour Name 	    HTT_TX_MSDU_RELEASE_SOURCE_FW)
2403*5113495bSYour Name 		ts->release_src = HAL_TX_COMP_RELEASE_SOURCE_FW;
2404*5113495bSYour Name 	else
2405*5113495bSYour Name 		ts->release_src = HAL_TX_COMP_RELEASE_SOURCE_TQM;
2406*5113495bSYour Name 
2407*5113495bSYour Name 	if (HTT_TX_MSDU_INFO_VALID_GET(*(msg_word + 2))) {
2408*5113495bSYour Name 		ts->peer_id = HTT_TX_MSDU_INFO_SW_PEER_ID_GET(*(msg_word + 2));
2409*5113495bSYour Name 		ts->tid = HTT_TX_MSDU_INFO_TID_GET(*(msg_word + 2));
2410*5113495bSYour Name 	} else {
2411*5113495bSYour Name 		ts->peer_id = HTT_INVALID_PEER;
2412*5113495bSYour Name 		ts->tid = HTT_INVALID_TID;
2413*5113495bSYour Name 	}
2414*5113495bSYour Name 	ts->transmit_cnt = HTT_TX_MSDU_INFO_TRANSMIT_CNT_GET(*(msg_word + 2));
2415*5113495bSYour Name 
2416*5113495bSYour Name 	tx_status = HTT_TX_MSDU_INFO_RELEASE_REASON_GET(*(msg_word + 3));
2417*5113495bSYour Name 	ts->status = hal_tx_get_compl_status_rh(tx_status);
2418*5113495bSYour Name 
2419*5113495bSYour Name 	ts->ppdu_id = HTT_TX_MSDU_INFO_TQM_STATUS_NUMBER_GET(*(msg_word + 3));
2420*5113495bSYour Name 
2421*5113495bSYour Name 	ts->ack_frame_rssi =
2422*5113495bSYour Name 		HTT_TX_MSDU_INFO_ACK_FRAME_RSSI_GET(*(msg_word + 4));
2423*5113495bSYour Name 	ts->first_msdu = HTT_TX_MSDU_INFO_FIRST_MSDU_GET(*(msg_word + 4));
2424*5113495bSYour Name 	ts->last_msdu = HTT_TX_MSDU_INFO_LAST_MSDU_GET(*(msg_word + 4));
2425*5113495bSYour Name 	ts->msdu_part_of_amsdu =
2426*5113495bSYour Name 		HTT_TX_MSDU_INFO_MSDU_PART_OF_AMSDU_GET(*(msg_word + 4));
2427*5113495bSYour Name 
2428*5113495bSYour Name 	ts->valid = HTT_TX_RATE_STATS_INFO_VALID_GET(*(msg_word + 5));
2429*5113495bSYour Name 
2430*5113495bSYour Name 	if (ts->valid) {
2431*5113495bSYour Name 		ts->bw = HTT_TX_RATE_STATS_INFO_TRANSMIT_BW_GET(*(msg_word + 5));
2432*5113495bSYour Name 		ts->pkt_type =
2433*5113495bSYour Name 			HTT_TX_RATE_STATS_INFO_TRANSMIT_PKT_TYPE_GET(*(msg_word + 5));
2434*5113495bSYour Name 		ts->stbc = HTT_TX_RATE_STATS_INFO_TRANSMIT_STBC_GET(*(msg_word + 5));
2435*5113495bSYour Name 		ts->ldpc = HTT_TX_RATE_STATS_INFO_TRANSMIT_LDPC_GET(*(msg_word + 5));
2436*5113495bSYour Name 		ts->sgi = HTT_TX_RATE_STATS_INFO_TRANSMIT_SGI_GET(*(msg_word + 5));
2437*5113495bSYour Name 		ts->mcs = HTT_TX_RATE_STATS_INFO_TRANSMIT_MCS_GET(*(msg_word + 5));
2438*5113495bSYour Name 		ts->ofdma =
2439*5113495bSYour Name 			HTT_TX_RATE_STATS_INFO_OFDMA_TRANSMISSION_GET(*(msg_word + 5));
2440*5113495bSYour Name 		ts->tones_in_ru = HTT_TX_RATE_STATS_INFO_TONES_IN_RU_GET(*(msg_word + 5));
2441*5113495bSYour Name 	}
2442*5113495bSYour Name 
2443*5113495bSYour Name 	ts->tsf = HTT_TX_RATE_STATS_INFO_PPDU_TRANSMISSION_TSF_GET(*(msg_word + 6));
2444*5113495bSYour Name 	hal_tx_comp_get_buffer_timestamp_rh(desc, ts);
2445*5113495bSYour Name }
2446*5113495bSYour Name #endif /* _HAL_RH_GENERIC_API_H_ */
2447