xref: /wlan-driver/qca-wifi-host-cmn/hal/wifi3.0/li/hal_li_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_LI_GENERIC_API_H_
21*5113495bSYour Name #define _HAL_LI_GENERIC_API_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include "hal_tx.h"
24*5113495bSYour Name #include "hal_li_tx.h"
25*5113495bSYour Name #include "hal_li_rx.h"
26*5113495bSYour Name 
27*5113495bSYour Name #define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc)	\
28*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(wbm_desc,	\
29*5113495bSYour Name 		WBM_RELEASE_RING_2_REO_PUSH_REASON_OFFSET)),	\
30*5113495bSYour Name 		WBM_RELEASE_RING_2_REO_PUSH_REASON_MASK, \
31*5113495bSYour Name 		WBM_RELEASE_RING_2_REO_PUSH_REASON_LSB))
32*5113495bSYour Name 
33*5113495bSYour Name #define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc)		\
34*5113495bSYour Name 	(_HAL_MS((*_OFFSET_TO_WORD_PTR(wbm_desc,	\
35*5113495bSYour Name 		WBM_RELEASE_RING_2_REO_ERROR_CODE_OFFSET)),	\
36*5113495bSYour Name 		WBM_RELEASE_RING_2_REO_ERROR_CODE_MASK, \
37*5113495bSYour Name 		WBM_RELEASE_RING_2_REO_ERROR_CODE_LSB))
38*5113495bSYour Name 
39*5113495bSYour Name #define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc)	\
40*5113495bSYour Name 	(((*(((uint32_t *)wbm_desc) +			\
41*5113495bSYour Name 	(WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_OFFSET >> 2))) & \
42*5113495bSYour Name 	WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_MASK) >>	\
43*5113495bSYour Name 	WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_LSB)
44*5113495bSYour Name 
45*5113495bSYour Name #define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc)	\
46*5113495bSYour Name 	(((*(((uint32_t *)wbm_desc) +			\
47*5113495bSYour Name 	(WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_OFFSET >> 2))) & \
48*5113495bSYour Name 	WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_MASK) >>	\
49*5113495bSYour Name 	WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_LSB)
50*5113495bSYour Name 
51*5113495bSYour Name /**
52*5113495bSYour Name  * hal_rx_wbm_err_info_get_generic_li() - Retrieves WBM error code and
53*5113495bSYour Name  *	reason and save it to hal_wbm_err_desc_info structure passed
54*5113495bSYour Name  *	by caller
55*5113495bSYour Name  * @wbm_desc: wbm ring descriptor
56*5113495bSYour Name  * @wbm_er_info1: hal_wbm_err_desc_info structure, output parameter.
57*5113495bSYour Name  *
58*5113495bSYour Name  * Return: void
59*5113495bSYour Name  */
60*5113495bSYour Name static inline
hal_rx_wbm_err_info_get_generic_li(void * wbm_desc,void * wbm_er_info1)61*5113495bSYour Name void hal_rx_wbm_err_info_get_generic_li(void *wbm_desc,
62*5113495bSYour Name 					void *wbm_er_info1)
63*5113495bSYour Name {
64*5113495bSYour Name 	struct hal_wbm_err_desc_info *wbm_er_info =
65*5113495bSYour Name 		(struct hal_wbm_err_desc_info *)wbm_er_info1;
66*5113495bSYour Name 
67*5113495bSYour Name 	wbm_er_info->wbm_err_src = HAL_WBM2SW_RELEASE_SRC_GET(wbm_desc);
68*5113495bSYour Name 	wbm_er_info->reo_psh_rsn = HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc);
69*5113495bSYour Name 	wbm_er_info->reo_err_code = HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc);
70*5113495bSYour Name 	wbm_er_info->rxdma_psh_rsn = HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc);
71*5113495bSYour Name 	wbm_er_info->rxdma_err_code = HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc);
72*5113495bSYour Name }
73*5113495bSYour Name 
74*5113495bSYour Name #if defined(WLAN_FEATURE_TSF_AUTO_REPORT) || defined(WLAN_CONFIG_TX_DELAY)
75*5113495bSYour Name static inline void
hal_tx_comp_get_buffer_timestamp_li(void * desc,struct hal_tx_completion_status * ts)76*5113495bSYour Name hal_tx_comp_get_buffer_timestamp_li(void *desc,
77*5113495bSYour Name 				    struct hal_tx_completion_status *ts)
78*5113495bSYour Name {
79*5113495bSYour Name 	ts->buffer_timestamp = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
80*5113495bSYour Name 					       BUFFER_TIMESTAMP);
81*5113495bSYour Name }
82*5113495bSYour Name #else /* !(WLAN_FEATURE_TSF_AUTO_REPORT || WLAN_CONFIG_TX_DELAY) */
83*5113495bSYour Name static inline void
hal_tx_comp_get_buffer_timestamp_li(void * desc,struct hal_tx_completion_status * ts)84*5113495bSYour Name hal_tx_comp_get_buffer_timestamp_li(void *desc,
85*5113495bSYour Name 				    struct hal_tx_completion_status *ts)
86*5113495bSYour Name {
87*5113495bSYour Name }
88*5113495bSYour Name #endif /* WLAN_FEATURE_TSF_AUTO_REPORT || WLAN_CONFIG_TX_DELAY */
89*5113495bSYour Name 
90*5113495bSYour Name #ifdef QCA_UNDECODED_METADATA_SUPPORT
91*5113495bSYour Name static inline void
hal_rx_get_phyrx_abort(struct hal_soc * hal,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)92*5113495bSYour Name hal_rx_get_phyrx_abort(struct hal_soc *hal, void *rx_tlv,
93*5113495bSYour Name 		       struct hal_rx_ppdu_info *ppdu_info){
94*5113495bSYour Name 	switch (hal->target_type) {
95*5113495bSYour Name 	case TARGET_TYPE_QCN9000:
96*5113495bSYour Name 	case TARGET_TYPE_QCN9160:
97*5113495bSYour Name 		ppdu_info->rx_status.phyrx_abort =
98*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_2,
99*5113495bSYour Name 				   PHYRX_ABORT_REQUEST_INFO_VALID);
100*5113495bSYour Name 		ppdu_info->rx_status.phyrx_abort_reason =
101*5113495bSYour Name 			HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_11,
102*5113495bSYour Name 				   PHYRX_ABORT_REQUEST_INFO_DETAILS_PHYRX_ABORT_REASON);
103*5113495bSYour Name 		break;
104*5113495bSYour Name 	default:
105*5113495bSYour Name 		break;
106*5113495bSYour Name 	}
107*5113495bSYour Name }
108*5113495bSYour Name 
109*5113495bSYour Name static inline void
hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * ht_sig_info)110*5113495bSYour Name hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info *ppdu_info,
111*5113495bSYour Name 		       uint8_t *ht_sig_info)
112*5113495bSYour Name {
113*5113495bSYour Name 	ppdu_info->rx_status.ht_length =
114*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_0, LENGTH);
115*5113495bSYour Name 	ppdu_info->rx_status.smoothing =
116*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, SMOOTHING);
117*5113495bSYour Name 	ppdu_info->rx_status.not_sounding =
118*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, NOT_SOUNDING);
119*5113495bSYour Name 	ppdu_info->rx_status.aggregation =
120*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, AGGREGATION);
121*5113495bSYour Name 	ppdu_info->rx_status.ht_stbc =
122*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, STBC);
123*5113495bSYour Name 	ppdu_info->rx_status.ht_crc =
124*5113495bSYour Name 		HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, CRC);
125*5113495bSYour Name }
126*5113495bSYour Name 
127*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)128*5113495bSYour Name hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info *ppdu_info,
129*5113495bSYour Name 			uint8_t *l_sig_a_info)
130*5113495bSYour Name {
131*5113495bSYour Name 	ppdu_info->rx_status.l_sig_length =
132*5113495bSYour Name 		HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, LENGTH);
133*5113495bSYour Name 	ppdu_info->rx_status.l_sig_a_parity =
134*5113495bSYour Name 		HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, PARITY);
135*5113495bSYour Name 	ppdu_info->rx_status.l_sig_a_pkt_type =
136*5113495bSYour Name 		HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, PKT_TYPE);
137*5113495bSYour Name 	ppdu_info->rx_status.l_sig_a_implicit_sounding =
138*5113495bSYour Name 		HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0,
139*5113495bSYour Name 			   CAPTURED_IMPLICIT_SOUNDING);
140*5113495bSYour Name }
141*5113495bSYour Name 
142*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)143*5113495bSYour Name hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info *ppdu_info,
144*5113495bSYour Name 			  uint8_t *vht_sig_a_info)
145*5113495bSYour Name {
146*5113495bSYour Name 	ppdu_info->rx_status.vht_no_txop_ps =
147*5113495bSYour Name 		HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0,
148*5113495bSYour Name 			   TXOP_PS_NOT_ALLOWED);
149*5113495bSYour Name 	ppdu_info->rx_status.vht_crc =
150*5113495bSYour Name 		HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1, CRC);
151*5113495bSYour Name }
152*5113495bSYour Name 
153*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)154*5113495bSYour Name hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info *ppdu_info,
155*5113495bSYour Name 				uint8_t *he_sig_a_su_info) {
156*5113495bSYour Name 	ppdu_info->rx_status.he_crc =
157*5113495bSYour Name 		HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, CRC);
158*5113495bSYour Name }
159*5113495bSYour Name 
160*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)161*5113495bSYour Name hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info *ppdu_info,
162*5113495bSYour Name 				   uint8_t *he_sig_a_mu_dl_info) {
163*5113495bSYour Name 	ppdu_info->rx_status.he_crc =
164*5113495bSYour Name 		HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1, CRC);
165*5113495bSYour Name }
166*5113495bSYour Name #else
167*5113495bSYour Name static inline void
hal_rx_get_phyrx_abort(struct hal_soc * hal,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)168*5113495bSYour Name hal_rx_get_phyrx_abort(struct hal_soc *hal, void *rx_tlv,
169*5113495bSYour Name 		       struct hal_rx_ppdu_info *ppdu_info)
170*5113495bSYour Name {
171*5113495bSYour Name }
172*5113495bSYour Name 
173*5113495bSYour Name static inline void
hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * ht_sig_info)174*5113495bSYour Name hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info *ppdu_info,
175*5113495bSYour Name 		       uint8_t *ht_sig_info)
176*5113495bSYour Name {
177*5113495bSYour Name }
178*5113495bSYour Name 
179*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)180*5113495bSYour Name hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info *ppdu_info,
181*5113495bSYour Name 			uint8_t *l_sig_a_info)
182*5113495bSYour Name {
183*5113495bSYour Name }
184*5113495bSYour Name 
185*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)186*5113495bSYour Name hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info *ppdu_info,
187*5113495bSYour Name 			  uint8_t *vht_sig_a_info)
188*5113495bSYour Name {
189*5113495bSYour Name }
190*5113495bSYour Name 
191*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)192*5113495bSYour Name hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info *ppdu_info,
193*5113495bSYour Name 				uint8_t *he_sig_a_su_info)
194*5113495bSYour Name {
195*5113495bSYour Name }
196*5113495bSYour Name 
197*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)198*5113495bSYour Name hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info *ppdu_info,
199*5113495bSYour Name 				   uint8_t *he_sig_a_mu_dl_info)
200*5113495bSYour Name {
201*5113495bSYour Name }
202*5113495bSYour Name #endif /* QCA_UNDECODED_METADATA_SUPPORT */
203*5113495bSYour Name 
204*5113495bSYour Name /**
205*5113495bSYour Name  * hal_tx_comp_get_status_generic_li() - Get tx completion status
206*5113495bSYour Name  * @desc: tx descriptor
207*5113495bSYour Name  * @ts1: completion ring Tx status
208*5113495bSYour Name  * @hal: hal_soc object
209*5113495bSYour Name  *
210*5113495bSYour Name  * This function will parse the WBM completion descriptor and populate in
211*5113495bSYour Name  * HAL structure
212*5113495bSYour Name  *
213*5113495bSYour Name  * Return: none
214*5113495bSYour Name  */
215*5113495bSYour Name static inline void
hal_tx_comp_get_status_generic_li(void * desc,void * ts1,struct hal_soc * hal)216*5113495bSYour Name hal_tx_comp_get_status_generic_li(void *desc, void *ts1,
217*5113495bSYour Name 				  struct hal_soc *hal)
218*5113495bSYour Name {
219*5113495bSYour Name 	uint8_t rate_stats_valid = 0;
220*5113495bSYour Name 	uint32_t rate_stats = 0;
221*5113495bSYour Name 	struct hal_tx_completion_status *ts =
222*5113495bSYour Name 		(struct hal_tx_completion_status *)ts1;
223*5113495bSYour Name 
224*5113495bSYour Name 	ts->ppdu_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3,
225*5113495bSYour Name 			TQM_STATUS_NUMBER);
226*5113495bSYour Name 	ts->ack_frame_rssi = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
227*5113495bSYour Name 			ACK_FRAME_RSSI);
228*5113495bSYour Name 	ts->first_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, FIRST_MSDU);
229*5113495bSYour Name 	ts->last_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, LAST_MSDU);
230*5113495bSYour Name 	ts->msdu_part_of_amsdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
231*5113495bSYour Name 			MSDU_PART_OF_AMSDU);
232*5113495bSYour Name 
233*5113495bSYour Name 	ts->peer_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, SW_PEER_ID);
234*5113495bSYour Name 	ts->tid = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, TID);
235*5113495bSYour Name 	ts->transmit_cnt = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3,
236*5113495bSYour Name 			TRANSMIT_COUNT);
237*5113495bSYour Name 
238*5113495bSYour Name 	rate_stats = HAL_TX_DESC_GET(desc, HAL_TX_COMP, TX_RATE_STATS);
239*5113495bSYour Name 
240*5113495bSYour Name 	rate_stats_valid = HAL_TX_MS(TX_RATE_STATS_INFO_0,
241*5113495bSYour Name 			TX_RATE_STATS_INFO_VALID, rate_stats);
242*5113495bSYour Name 
243*5113495bSYour Name 	ts->valid = rate_stats_valid;
244*5113495bSYour Name 
245*5113495bSYour Name 	if (rate_stats_valid) {
246*5113495bSYour Name 		ts->bw = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_BW,
247*5113495bSYour Name 				rate_stats);
248*5113495bSYour Name 		ts->pkt_type = HAL_TX_MS(TX_RATE_STATS_INFO_0,
249*5113495bSYour Name 				TRANSMIT_PKT_TYPE, rate_stats);
250*5113495bSYour Name 		ts->stbc = HAL_TX_MS(TX_RATE_STATS_INFO_0,
251*5113495bSYour Name 				TRANSMIT_STBC, rate_stats);
252*5113495bSYour Name 		ts->ldpc = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_LDPC,
253*5113495bSYour Name 				rate_stats);
254*5113495bSYour Name 		ts->sgi = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_SGI,
255*5113495bSYour Name 				rate_stats);
256*5113495bSYour Name 		ts->mcs = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_MCS,
257*5113495bSYour Name 				rate_stats);
258*5113495bSYour Name 		ts->ofdma = HAL_TX_MS(TX_RATE_STATS_INFO_0, OFDMA_TRANSMISSION,
259*5113495bSYour Name 				rate_stats);
260*5113495bSYour Name 		ts->tones_in_ru = HAL_TX_MS(TX_RATE_STATS_INFO_0, TONES_IN_RU,
261*5113495bSYour Name 				rate_stats);
262*5113495bSYour Name 	}
263*5113495bSYour Name 
264*5113495bSYour Name 	ts->release_src = hal_tx_comp_get_buffer_source(
265*5113495bSYour Name 					hal_soc_to_hal_soc_handle(hal),
266*5113495bSYour Name 					desc);
267*5113495bSYour Name 	ts->status = hal_tx_comp_get_release_reason(
268*5113495bSYour Name 					desc,
269*5113495bSYour Name 					hal_soc_to_hal_soc_handle(hal));
270*5113495bSYour Name 
271*5113495bSYour Name 	ts->tsf = HAL_TX_DESC_GET(desc, UNIFIED_WBM_RELEASE_RING_6,
272*5113495bSYour Name 			TX_RATE_STATS_INFO_TX_RATE_STATS);
273*5113495bSYour Name 
274*5113495bSYour Name 	hal_tx_comp_get_buffer_timestamp_li(desc, ts);
275*5113495bSYour Name }
276*5113495bSYour Name 
277*5113495bSYour Name /**
278*5113495bSYour Name  * hal_tx_desc_set_buf_addr_generic_li() - Fill Buffer Address
279*5113495bSYour Name  *                                         information in Tx Descriptor
280*5113495bSYour Name  * @desc: Handle to Tx Descriptor
281*5113495bSYour Name  * @paddr: Physical Address
282*5113495bSYour Name  * @rbm_id: Return Buffer Manager ID
283*5113495bSYour Name  * @desc_id: Descriptor ID
284*5113495bSYour Name  * @type: 0 - Address points to a MSDU buffer
285*5113495bSYour Name  *        1 - Address points to MSDU extension descriptor
286*5113495bSYour Name  *
287*5113495bSYour Name  * Return: void
288*5113495bSYour Name  */
289*5113495bSYour Name static inline void
hal_tx_desc_set_buf_addr_generic_li(void * desc,dma_addr_t paddr,uint8_t rbm_id,uint32_t desc_id,uint8_t type)290*5113495bSYour Name hal_tx_desc_set_buf_addr_generic_li(void *desc, dma_addr_t paddr,
291*5113495bSYour Name 				    uint8_t rbm_id, uint32_t desc_id,
292*5113495bSYour Name 				    uint8_t type)
293*5113495bSYour Name {
294*5113495bSYour Name 	/* Set buffer_addr_info.buffer_addr_31_0 */
295*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_0,
296*5113495bSYour Name 		    BUFFER_ADDR_INFO_BUF_ADDR_INFO) =
297*5113495bSYour Name 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_0, BUFFER_ADDR_31_0, paddr);
298*5113495bSYour Name 
299*5113495bSYour Name 	/* Set buffer_addr_info.buffer_addr_39_32 */
300*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
301*5113495bSYour Name 			 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
302*5113495bSYour Name 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, BUFFER_ADDR_39_32,
303*5113495bSYour Name 		       (((uint64_t)paddr) >> 32));
304*5113495bSYour Name 
305*5113495bSYour Name 	/* Set buffer_addr_info.return_buffer_manager = rbm id */
306*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
307*5113495bSYour Name 			 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
308*5113495bSYour Name 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1,
309*5113495bSYour Name 		       RETURN_BUFFER_MANAGER, rbm_id);
310*5113495bSYour Name 
311*5113495bSYour Name 	/* Set buffer_addr_info.sw_buffer_cookie = desc_id */
312*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
313*5113495bSYour Name 		    BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
314*5113495bSYour Name 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, SW_BUFFER_COOKIE,
315*5113495bSYour Name 			  desc_id);
316*5113495bSYour Name 
317*5113495bSYour Name 	/* Set  Buffer or Ext Descriptor Type */
318*5113495bSYour Name 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_2,
319*5113495bSYour Name 		    BUF_OR_EXT_DESC_TYPE) |=
320*5113495bSYour Name 		HAL_TX_SM(UNIFIED_TCL_DATA_CMD_2, BUF_OR_EXT_DESC_TYPE, type);
321*5113495bSYour Name }
322*5113495bSYour Name 
323*5113495bSYour Name #if defined(QCA_WIFI_QCA6290_11AX_MU_UL) && defined(QCA_WIFI_QCA6290_11AX)
324*5113495bSYour Name /**
325*5113495bSYour Name  * hal_rx_handle_other_tlvs() - handle special TLVs like MU_UL
326*5113495bSYour Name  * @tlv_tag: Tag of the TLVs
327*5113495bSYour Name  * @rx_tlv: the pointer to the TLVs
328*5113495bSYour Name  * @ppdu_info: pointer to ppdu_info
329*5113495bSYour Name  *
330*5113495bSYour Name  * Return: true if the tlv is handled, false if not
331*5113495bSYour Name  */
332*5113495bSYour Name static inline bool
hal_rx_handle_other_tlvs(uint32_t tlv_tag,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)333*5113495bSYour Name hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv,
334*5113495bSYour Name 			 struct hal_rx_ppdu_info *ppdu_info)
335*5113495bSYour Name {
336*5113495bSYour Name 	uint32_t value;
337*5113495bSYour Name 
338*5113495bSYour Name 	switch (tlv_tag) {
339*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_A_MU_UL_E:
340*5113495bSYour Name 	{
341*5113495bSYour Name 		uint8_t *he_sig_a_mu_ul_info =
342*5113495bSYour Name 			(uint8_t *)rx_tlv +
343*5113495bSYour Name 			HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_UL_0,
344*5113495bSYour Name 					  HE_SIG_A_MU_UL_INFO_PHYRX_HE_SIG_A_MU_UL_INFO_DETAILS);
345*5113495bSYour Name 		ppdu_info->rx_status.he_flags = 1;
346*5113495bSYour Name 
347*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0,
348*5113495bSYour Name 				   FORMAT_INDICATION);
349*5113495bSYour Name 		if (value == 0) {
350*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
351*5113495bSYour Name 				QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
352*5113495bSYour Name 		} else {
353*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
354*5113495bSYour Name 				QDF_MON_STATUS_HE_SU_FORMAT_TYPE;
355*5113495bSYour Name 		}
356*5113495bSYour Name 
357*5113495bSYour Name 		/* data1 */
358*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
359*5113495bSYour Name 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
360*5113495bSYour Name 			QDF_MON_STATUS_HE_DL_UL_KNOWN |
361*5113495bSYour Name 			QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
362*5113495bSYour Name 
363*5113495bSYour Name 		/* data2 */
364*5113495bSYour Name 		ppdu_info->rx_status.he_data2 |=
365*5113495bSYour Name 			QDF_MON_STATUS_TXOP_KNOWN;
366*5113495bSYour Name 
367*5113495bSYour Name 		/*data3*/
368*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info,
369*5113495bSYour Name 				   HE_SIG_A_MU_UL_INFO_0, BSS_COLOR_ID);
370*5113495bSYour Name 		ppdu_info->rx_status.he_data3 = value;
371*5113495bSYour Name 		/* 1 for UL and 0 for DL */
372*5113495bSYour Name 		value = 1;
373*5113495bSYour Name 		value = value << QDF_MON_STATUS_DL_UL_SHIFT;
374*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
375*5113495bSYour Name 
376*5113495bSYour Name 		/*data4*/
377*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0,
378*5113495bSYour Name 				   SPATIAL_REUSE);
379*5113495bSYour Name 		ppdu_info->rx_status.he_data4 = value;
380*5113495bSYour Name 
381*5113495bSYour Name 		/*data5*/
382*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info,
383*5113495bSYour Name 				   HE_SIG_A_MU_UL_INFO_0, TRANSMIT_BW);
384*5113495bSYour Name 		ppdu_info->rx_status.he_data5 = value;
385*5113495bSYour Name 		ppdu_info->rx_status.bw = value;
386*5113495bSYour Name 
387*5113495bSYour Name 		/*data6*/
388*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_1,
389*5113495bSYour Name 				   TXOP_DURATION);
390*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXOP_SHIFT;
391*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
392*5113495bSYour Name 		return true;
393*5113495bSYour Name 	}
394*5113495bSYour Name 	default:
395*5113495bSYour Name 		return false;
396*5113495bSYour Name 	}
397*5113495bSYour Name }
398*5113495bSYour Name #else
399*5113495bSYour Name static inline bool
hal_rx_handle_other_tlvs(uint32_t tlv_tag,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)400*5113495bSYour Name hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv,
401*5113495bSYour Name 			 struct hal_rx_ppdu_info *ppdu_info)
402*5113495bSYour Name {
403*5113495bSYour Name 	return false;
404*5113495bSYour Name }
405*5113495bSYour Name #endif /* QCA_WIFI_QCA6290_11AX_MU_UL && QCA_WIFI_QCA6290_11AX */
406*5113495bSYour Name 
407*5113495bSYour Name #if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET) && \
408*5113495bSYour Name defined(RX_PPDU_END_USER_STATS_22_SW_RESPONSE_REFERENCE_PTR_EXT_OFFSET)
409*5113495bSYour Name 
410*5113495bSYour Name static inline void
hal_rx_handle_mu_ul_info(void * rx_tlv,struct mon_rx_user_status * mon_rx_user_status)411*5113495bSYour Name hal_rx_handle_mu_ul_info(void *rx_tlv,
412*5113495bSYour Name 			 struct mon_rx_user_status *mon_rx_user_status)
413*5113495bSYour Name {
414*5113495bSYour Name 	mon_rx_user_status->mu_ul_user_v0_word0 =
415*5113495bSYour Name 		HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_11,
416*5113495bSYour Name 			   SW_RESPONSE_REFERENCE_PTR);
417*5113495bSYour Name 
418*5113495bSYour Name 	mon_rx_user_status->mu_ul_user_v0_word1 =
419*5113495bSYour Name 		HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_22,
420*5113495bSYour Name 			   SW_RESPONSE_REFERENCE_PTR_EXT);
421*5113495bSYour Name }
422*5113495bSYour Name 
423*5113495bSYour Name static inline void
hal_rx_populate_byte_count(void * rx_tlv,void * ppduinfo,struct mon_rx_user_status * mon_rx_user_status)424*5113495bSYour Name hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
425*5113495bSYour Name 			   struct mon_rx_user_status *mon_rx_user_status)
426*5113495bSYour Name {
427*5113495bSYour Name 	uint32_t mpdu_ok_byte_count;
428*5113495bSYour Name 	uint32_t mpdu_err_byte_count;
429*5113495bSYour Name 
430*5113495bSYour Name 	mpdu_ok_byte_count = HAL_RX_GET(rx_tlv,
431*5113495bSYour Name 					RX_PPDU_END_USER_STATS_17,
432*5113495bSYour Name 					MPDU_OK_BYTE_COUNT);
433*5113495bSYour Name 	mpdu_err_byte_count = HAL_RX_GET(rx_tlv,
434*5113495bSYour Name 					 RX_PPDU_END_USER_STATS_19,
435*5113495bSYour Name 					 MPDU_ERR_BYTE_COUNT);
436*5113495bSYour Name 
437*5113495bSYour Name 	mon_rx_user_status->mpdu_ok_byte_count = mpdu_ok_byte_count;
438*5113495bSYour Name 	mon_rx_user_status->mpdu_err_byte_count = mpdu_err_byte_count;
439*5113495bSYour Name }
440*5113495bSYour Name #else
441*5113495bSYour Name static inline void
hal_rx_handle_mu_ul_info(void * rx_tlv,struct mon_rx_user_status * mon_rx_user_status)442*5113495bSYour Name hal_rx_handle_mu_ul_info(void *rx_tlv,
443*5113495bSYour Name 			 struct mon_rx_user_status *mon_rx_user_status)
444*5113495bSYour Name {
445*5113495bSYour Name }
446*5113495bSYour Name 
447*5113495bSYour Name static inline void
hal_rx_populate_byte_count(void * rx_tlv,void * ppduinfo,struct mon_rx_user_status * mon_rx_user_status)448*5113495bSYour Name hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
449*5113495bSYour Name 			   struct mon_rx_user_status *mon_rx_user_status)
450*5113495bSYour Name {
451*5113495bSYour Name 	struct hal_rx_ppdu_info *ppdu_info =
452*5113495bSYour Name 			(struct hal_rx_ppdu_info *)ppduinfo;
453*5113495bSYour Name 
454*5113495bSYour Name 	/* HKV1: doesn't support mpdu byte count */
455*5113495bSYour Name 	mon_rx_user_status->mpdu_ok_byte_count = ppdu_info->rx_status.ppdu_len;
456*5113495bSYour Name 	mon_rx_user_status->mpdu_err_byte_count = 0;
457*5113495bSYour Name }
458*5113495bSYour Name #endif
459*5113495bSYour Name 
460*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)461*5113495bSYour Name hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, uint32_t user_id,
462*5113495bSYour Name 			     struct mon_rx_user_status *mon_rx_user_status)
463*5113495bSYour Name {
464*5113495bSYour Name 	struct mon_rx_info *mon_rx_info;
465*5113495bSYour Name 	struct mon_rx_user_info *mon_rx_user_info;
466*5113495bSYour Name 	struct hal_rx_ppdu_info *ppdu_info =
467*5113495bSYour Name 			(struct hal_rx_ppdu_info *)ppduinfo;
468*5113495bSYour Name 
469*5113495bSYour Name 	mon_rx_info = &ppdu_info->rx_info;
470*5113495bSYour Name 	mon_rx_user_info = &ppdu_info->rx_user_info[user_id];
471*5113495bSYour Name 	mon_rx_user_info->qos_control_info_valid =
472*5113495bSYour Name 		mon_rx_info->qos_control_info_valid;
473*5113495bSYour Name 	mon_rx_user_info->qos_control =  mon_rx_info->qos_control;
474*5113495bSYour Name 
475*5113495bSYour Name 	mon_rx_user_status->ast_index = ppdu_info->rx_status.ast_index;
476*5113495bSYour Name 	mon_rx_user_status->tid = ppdu_info->rx_status.tid;
477*5113495bSYour Name 	mon_rx_user_status->tcp_msdu_count =
478*5113495bSYour Name 		ppdu_info->rx_status.tcp_msdu_count;
479*5113495bSYour Name 	mon_rx_user_status->udp_msdu_count =
480*5113495bSYour Name 		ppdu_info->rx_status.udp_msdu_count;
481*5113495bSYour Name 	mon_rx_user_status->other_msdu_count =
482*5113495bSYour Name 		ppdu_info->rx_status.other_msdu_count;
483*5113495bSYour Name 	mon_rx_user_status->frame_control = ppdu_info->rx_status.frame_control;
484*5113495bSYour Name 	mon_rx_user_status->frame_control_info_valid =
485*5113495bSYour Name 		ppdu_info->rx_status.frame_control_info_valid;
486*5113495bSYour Name 	mon_rx_user_status->data_sequence_control_info_valid =
487*5113495bSYour Name 		ppdu_info->rx_status.data_sequence_control_info_valid;
488*5113495bSYour Name 	mon_rx_user_status->first_data_seq_ctrl =
489*5113495bSYour Name 		ppdu_info->rx_status.first_data_seq_ctrl;
490*5113495bSYour Name 	mon_rx_user_status->preamble_type = ppdu_info->rx_status.preamble_type;
491*5113495bSYour Name 	mon_rx_user_status->ht_flags = ppdu_info->rx_status.ht_flags;
492*5113495bSYour Name 	mon_rx_user_status->rtap_flags = ppdu_info->rx_status.rtap_flags;
493*5113495bSYour Name 	mon_rx_user_status->vht_flags = ppdu_info->rx_status.vht_flags;
494*5113495bSYour Name 	mon_rx_user_status->he_flags = ppdu_info->rx_status.he_flags;
495*5113495bSYour Name 	mon_rx_user_status->rs_flags = ppdu_info->rx_status.rs_flags;
496*5113495bSYour Name 
497*5113495bSYour Name 	mon_rx_user_status->mpdu_cnt_fcs_ok =
498*5113495bSYour Name 		ppdu_info->com_info.mpdu_cnt_fcs_ok;
499*5113495bSYour Name 	mon_rx_user_status->mpdu_cnt_fcs_err =
500*5113495bSYour Name 		ppdu_info->com_info.mpdu_cnt_fcs_err;
501*5113495bSYour Name 	qdf_mem_copy(&mon_rx_user_status->mpdu_fcs_ok_bitmap,
502*5113495bSYour Name 		     &ppdu_info->com_info.mpdu_fcs_ok_bitmap,
503*5113495bSYour Name 		     HAL_RX_NUM_WORDS_PER_PPDU_BITMAP *
504*5113495bSYour Name 		     sizeof(ppdu_info->com_info.mpdu_fcs_ok_bitmap[0]));
505*5113495bSYour Name 
506*5113495bSYour Name 	hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status);
507*5113495bSYour Name }
508*5113495bSYour Name 
509*5113495bSYour Name #define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \
510*5113495bSYour Name 					ppdu_info, rssi_info_tlv) \
511*5113495bSYour Name 	{						\
512*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][0] = \
513*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
514*5113495bSYour Name 				   RSSI_PRI20_CHAIN##chain); \
515*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][1] = \
516*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
517*5113495bSYour Name 				   RSSI_EXT20_CHAIN##chain); \
518*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][2] = \
519*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
520*5113495bSYour Name 				   RSSI_EXT40_LOW20_CHAIN##chain); \
521*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][3] = \
522*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
523*5113495bSYour Name 				   RSSI_EXT40_HIGH20_CHAIN##chain); \
524*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][4] = \
525*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
526*5113495bSYour Name 				   RSSI_EXT80_LOW20_CHAIN##chain); \
527*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][5] = \
528*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
529*5113495bSYour Name 				   RSSI_EXT80_LOW_HIGH20_CHAIN##chain); \
530*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][6] = \
531*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
532*5113495bSYour Name 				   RSSI_EXT80_HIGH_LOW20_CHAIN##chain); \
533*5113495bSYour Name 	ppdu_info->rx_status.rssi_chain[chain][7] = \
534*5113495bSYour Name 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
535*5113495bSYour Name 				   RSSI_EXT80_HIGH20_CHAIN##chain); \
536*5113495bSYour Name 	}						\
537*5113495bSYour Name 
538*5113495bSYour Name #define HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) \
539*5113495bSYour Name 	{HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(0, 0, 1, ppdu_info, rssi_info_tlv) \
540*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(1, 2, 3, ppdu_info, rssi_info_tlv) \
541*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(2, 4, 5, ppdu_info, rssi_info_tlv) \
542*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(3, 6, 7, ppdu_info, rssi_info_tlv) \
543*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(4, 8, 9, ppdu_info, rssi_info_tlv) \
544*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(5, 10, 11, ppdu_info, rssi_info_tlv) \
545*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(6, 12, 13, ppdu_info, rssi_info_tlv) \
546*5113495bSYour Name 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(7, 14, 15, ppdu_info, rssi_info_tlv)} \
547*5113495bSYour Name 
548*5113495bSYour Name static inline uint32_t
hal_rx_update_rssi_chain(struct hal_rx_ppdu_info * ppdu_info,uint8_t * rssi_info_tlv)549*5113495bSYour Name hal_rx_update_rssi_chain(struct hal_rx_ppdu_info *ppdu_info,
550*5113495bSYour Name 			 uint8_t *rssi_info_tlv)
551*5113495bSYour Name {
552*5113495bSYour Name 	HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv)
553*5113495bSYour Name 	return 0;
554*5113495bSYour Name }
555*5113495bSYour Name 
556*5113495bSYour Name #ifdef WLAN_TX_PKT_CAPTURE_ENH
557*5113495bSYour Name static inline void
hal_get_qos_control(void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)558*5113495bSYour Name hal_get_qos_control(void *rx_tlv,
559*5113495bSYour Name 		    struct hal_rx_ppdu_info *ppdu_info)
560*5113495bSYour Name {
561*5113495bSYour Name 	ppdu_info->rx_info.qos_control_info_valid =
562*5113495bSYour Name 		HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
563*5113495bSYour Name 			   QOS_CONTROL_INFO_VALID);
564*5113495bSYour Name 
565*5113495bSYour Name 	if (ppdu_info->rx_info.qos_control_info_valid)
566*5113495bSYour Name 		ppdu_info->rx_info.qos_control =
567*5113495bSYour Name 			HAL_RX_GET(rx_tlv,
568*5113495bSYour Name 				   RX_PPDU_END_USER_STATS_5,
569*5113495bSYour Name 				   QOS_CONTROL_FIELD);
570*5113495bSYour Name }
571*5113495bSYour Name 
572*5113495bSYour Name static inline void
hal_get_mac_addr1(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)573*5113495bSYour Name hal_get_mac_addr1(uint8_t *rx_mpdu_start,
574*5113495bSYour Name 		  struct hal_rx_ppdu_info *ppdu_info)
575*5113495bSYour Name {
576*5113495bSYour Name 	if ((ppdu_info->sw_frame_group_id
577*5113495bSYour Name 	     == HAL_MPDU_SW_FRAME_GROUP_MGMT_PROBE_REQ) ||
578*5113495bSYour Name 	    (ppdu_info->sw_frame_group_id ==
579*5113495bSYour Name 	     HAL_MPDU_SW_FRAME_GROUP_CTRL_RTS)) {
580*5113495bSYour Name 		ppdu_info->rx_info.mac_addr1_valid =
581*5113495bSYour Name 				HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start);
582*5113495bSYour Name 
583*5113495bSYour Name 		*(uint32_t *)&ppdu_info->rx_info.mac_addr1[0] =
584*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
585*5113495bSYour Name 				   RX_MPDU_INFO_15,
586*5113495bSYour Name 				   MAC_ADDR_AD1_31_0);
587*5113495bSYour Name 		if (ppdu_info->sw_frame_group_id ==
588*5113495bSYour Name 		    HAL_MPDU_SW_FRAME_GROUP_CTRL_RTS) {
589*5113495bSYour Name 			*(uint16_t *)&ppdu_info->rx_info.mac_addr1[4] =
590*5113495bSYour Name 				HAL_RX_GET(rx_mpdu_start,
591*5113495bSYour Name 					   RX_MPDU_INFO_16,
592*5113495bSYour Name 					   MAC_ADDR_AD1_47_32);
593*5113495bSYour Name 		}
594*5113495bSYour Name 	}
595*5113495bSYour Name }
596*5113495bSYour Name #else
597*5113495bSYour Name static inline void
hal_get_qos_control(void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)598*5113495bSYour Name hal_get_qos_control(void *rx_tlv,
599*5113495bSYour Name 		    struct hal_rx_ppdu_info *ppdu_info)
600*5113495bSYour Name {
601*5113495bSYour Name }
602*5113495bSYour Name 
603*5113495bSYour Name static inline void
hal_get_mac_addr1(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)604*5113495bSYour Name hal_get_mac_addr1(uint8_t *rx_mpdu_start,
605*5113495bSYour Name 		  struct hal_rx_ppdu_info *ppdu_info)
606*5113495bSYour Name {
607*5113495bSYour Name }
608*5113495bSYour Name #endif
609*5113495bSYour Name 
610*5113495bSYour Name #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS
611*5113495bSYour Name static inline void
hal_update_frame_type_cnt(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)612*5113495bSYour Name hal_update_frame_type_cnt(uint8_t *rx_mpdu_start,
613*5113495bSYour Name 			  struct hal_rx_ppdu_info *ppdu_info)
614*5113495bSYour Name {
615*5113495bSYour Name 	uint16_t frame_ctrl;
616*5113495bSYour Name 	uint8_t fc_type;
617*5113495bSYour Name 
618*5113495bSYour Name 	if (HAL_RX_GET_FC_VALID(rx_mpdu_start)) {
619*5113495bSYour Name 		frame_ctrl = HAL_RX_GET(rx_mpdu_start,
620*5113495bSYour Name 					RX_MPDU_INFO_14,
621*5113495bSYour Name 					MPDU_FRAME_CONTROL_FIELD);
622*5113495bSYour Name 		fc_type = HAL_RX_GET_FRAME_CTRL_TYPE(frame_ctrl);
623*5113495bSYour Name 		if (fc_type == HAL_RX_FRAME_CTRL_TYPE_MGMT)
624*5113495bSYour Name 			ppdu_info->frm_type_info.rx_mgmt_cnt++;
625*5113495bSYour Name 		else if (fc_type == HAL_RX_FRAME_CTRL_TYPE_CTRL)
626*5113495bSYour Name 			ppdu_info->frm_type_info.rx_ctrl_cnt++;
627*5113495bSYour Name 		else if (fc_type == HAL_RX_FRAME_CTRL_TYPE_DATA)
628*5113495bSYour Name 			ppdu_info->frm_type_info.rx_data_cnt++;
629*5113495bSYour Name 	}
630*5113495bSYour Name }
631*5113495bSYour Name #else
632*5113495bSYour Name static inline void
hal_update_frame_type_cnt(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)633*5113495bSYour Name hal_update_frame_type_cnt(uint8_t *rx_mpdu_start,
634*5113495bSYour Name 			  struct hal_rx_ppdu_info *ppdu_info)
635*5113495bSYour Name {
636*5113495bSYour Name }
637*5113495bSYour Name #endif
638*5113495bSYour Name 
639*5113495bSYour Name #ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
640*5113495bSYour Name static inline void
hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info * ppdu_info,uint32_t user_id)641*5113495bSYour Name hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info *ppdu_info,
642*5113495bSYour Name 			       uint32_t user_id)
643*5113495bSYour Name {
644*5113495bSYour Name 	uint16_t fc = ppdu_info->nac_info.frame_control;
645*5113495bSYour Name 
646*5113495bSYour Name 	if (HAL_RX_GET_FRAME_CTRL_TYPE(fc) == HAL_RX_FRAME_CTRL_TYPE_CTRL) {
647*5113495bSYour Name 		if ((fc & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
648*5113495bSYour Name 		    QDF_IEEE80211_FC0_SUBTYPE_VHT_NDP_AN)
649*5113495bSYour Name 			ppdu_info->ctrl_frm_info[user_id].ndpa = 1;
650*5113495bSYour Name 		if ((fc & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
651*5113495bSYour Name 		    QDF_IEEE80211_FC0_SUBTYPE_BAR)
652*5113495bSYour Name 			ppdu_info->ctrl_frm_info[user_id].bar = 1;
653*5113495bSYour Name 	}
654*5113495bSYour Name }
655*5113495bSYour Name #else
656*5113495bSYour Name static inline void
hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info * ppdu_info,uint32_t user_id)657*5113495bSYour Name hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info *ppdu_info,
658*5113495bSYour Name 			       uint32_t user_id)
659*5113495bSYour Name {
660*5113495bSYour Name }
661*5113495bSYour Name #endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */
662*5113495bSYour Name 
663*5113495bSYour Name /**
664*5113495bSYour Name  * hal_rx_status_get_tlv_info_generic_li() - process receive info TLV
665*5113495bSYour Name  * @rx_tlv_hdr: pointer to TLV header
666*5113495bSYour Name  * @ppduinfo: pointer to ppdu_info
667*5113495bSYour Name  * @hal_soc_hdl: hal_soc handle
668*5113495bSYour Name  * @nbuf: pointer the pkt buffer.
669*5113495bSYour Name  *
670*5113495bSYour Name  * Return: HAL_TLV_STATUS_PPDU_NOT_DONE or HAL_TLV_STATUS_PPDU_DONE from tlv
671*5113495bSYour Name  */
672*5113495bSYour Name static inline uint32_t
hal_rx_status_get_tlv_info_generic_li(void * rx_tlv_hdr,void * ppduinfo,hal_soc_handle_t hal_soc_hdl,qdf_nbuf_t nbuf)673*5113495bSYour Name hal_rx_status_get_tlv_info_generic_li(void *rx_tlv_hdr, void *ppduinfo,
674*5113495bSYour Name 				      hal_soc_handle_t hal_soc_hdl,
675*5113495bSYour Name 				      qdf_nbuf_t nbuf)
676*5113495bSYour Name {
677*5113495bSYour Name 	struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
678*5113495bSYour Name 	uint32_t tlv_tag, user_id, tlv_len, value;
679*5113495bSYour Name 	uint8_t group_id = 0;
680*5113495bSYour Name 	uint8_t he_dcm = 0;
681*5113495bSYour Name 	uint8_t he_stbc = 0;
682*5113495bSYour Name 	uint16_t he_gi = 0;
683*5113495bSYour Name 	uint16_t he_ltf = 0;
684*5113495bSYour Name 	void *rx_tlv;
685*5113495bSYour Name 	bool unhandled = false;
686*5113495bSYour Name 	struct mon_rx_user_status *mon_rx_user_status;
687*5113495bSYour Name 	struct hal_rx_ppdu_info *ppdu_info =
688*5113495bSYour Name 			(struct hal_rx_ppdu_info *)ppduinfo;
689*5113495bSYour Name 
690*5113495bSYour Name 	tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr);
691*5113495bSYour Name 	user_id = HAL_RX_GET_USER_TLV32_USERID(rx_tlv_hdr);
692*5113495bSYour Name 	tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr);
693*5113495bSYour Name 
694*5113495bSYour Name 	rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
695*5113495bSYour Name 
696*5113495bSYour Name 	switch (tlv_tag) {
697*5113495bSYour Name 	case WIFIRX_PPDU_START_E:
698*5113495bSYour Name 	{
699*5113495bSYour Name 		if (qdf_unlikely(ppdu_info->com_info.last_ppdu_id ==
700*5113495bSYour Name 		    HAL_RX_GET(rx_tlv, RX_PPDU_START_0, PHY_PPDU_ID)))
701*5113495bSYour Name 			hal_err("Matching ppdu_id(%u) detected",
702*5113495bSYour Name 				 ppdu_info->com_info.last_ppdu_id);
703*5113495bSYour Name 
704*5113495bSYour Name 		/* Reset ppdu_info before processing the ppdu */
705*5113495bSYour Name 		qdf_mem_zero(ppdu_info,
706*5113495bSYour Name 			     sizeof(struct hal_rx_ppdu_info));
707*5113495bSYour Name 
708*5113495bSYour Name 		ppdu_info->com_info.last_ppdu_id =
709*5113495bSYour Name 			ppdu_info->com_info.ppdu_id =
710*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_START_0,
711*5113495bSYour Name 					PHY_PPDU_ID);
712*5113495bSYour Name 
713*5113495bSYour Name 		/* channel number is set in PHY meta data */
714*5113495bSYour Name 		ppdu_info->rx_status.chan_num =
715*5113495bSYour Name 			(HAL_RX_GET(rx_tlv, RX_PPDU_START_1,
716*5113495bSYour Name 				SW_PHY_META_DATA) & 0x0000FFFF);
717*5113495bSYour Name 		ppdu_info->rx_status.chan_freq =
718*5113495bSYour Name 			(HAL_RX_GET(rx_tlv, RX_PPDU_START_1,
719*5113495bSYour Name 				SW_PHY_META_DATA) & 0xFFFF0000) >> 16;
720*5113495bSYour Name 		if (ppdu_info->rx_status.chan_num) {
721*5113495bSYour Name 			ppdu_info->rx_status.chan_freq =
722*5113495bSYour Name 				hal_rx_radiotap_num_to_freq(
723*5113495bSYour Name 				ppdu_info->rx_status.chan_num,
724*5113495bSYour Name 				 ppdu_info->rx_status.chan_freq);
725*5113495bSYour Name 		}
726*5113495bSYour Name 		ppdu_info->com_info.ppdu_timestamp =
727*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_START_2,
728*5113495bSYour Name 				PPDU_START_TIMESTAMP);
729*5113495bSYour Name 		ppdu_info->rx_status.ppdu_timestamp =
730*5113495bSYour Name 			ppdu_info->com_info.ppdu_timestamp;
731*5113495bSYour Name 		ppdu_info->rx_state = HAL_RX_MON_PPDU_START;
732*5113495bSYour Name 
733*5113495bSYour Name 		break;
734*5113495bSYour Name 	}
735*5113495bSYour Name 
736*5113495bSYour Name 	case WIFIRX_PPDU_START_USER_INFO_E:
737*5113495bSYour Name 		break;
738*5113495bSYour Name 
739*5113495bSYour Name 	case WIFIRX_PPDU_END_E:
740*5113495bSYour Name 		dp_nofl_debug("[%s][%d] ppdu_end_e len=%d",
741*5113495bSYour Name 			      __func__, __LINE__, tlv_len);
742*5113495bSYour Name 		/* This is followed by sub-TLVs of PPDU_END */
743*5113495bSYour Name 		ppdu_info->rx_state = HAL_RX_MON_PPDU_END;
744*5113495bSYour Name 		break;
745*5113495bSYour Name 
746*5113495bSYour Name 	case WIFIPHYRX_PKT_END_E:
747*5113495bSYour Name 		hal_rx_get_rtt_info(hal_soc_hdl, rx_tlv, ppdu_info);
748*5113495bSYour Name 		break;
749*5113495bSYour Name 
750*5113495bSYour Name 	case WIFIRXPCU_PPDU_END_INFO_E:
751*5113495bSYour Name 		ppdu_info->rx_status.rx_antenna =
752*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_2, RX_ANTENNA);
753*5113495bSYour Name 		ppdu_info->rx_status.tsft =
754*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_1,
755*5113495bSYour Name 				WB_TIMESTAMP_UPPER_32);
756*5113495bSYour Name 		ppdu_info->rx_status.tsft = (ppdu_info->rx_status.tsft << 32) |
757*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_0,
758*5113495bSYour Name 				WB_TIMESTAMP_LOWER_32);
759*5113495bSYour Name 		ppdu_info->rx_status.duration =
760*5113495bSYour Name 			HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_8,
761*5113495bSYour Name 				RX_PPDU_DURATION);
762*5113495bSYour Name 		hal_rx_get_bb_info(hal_soc_hdl, rx_tlv, ppdu_info);
763*5113495bSYour Name 		hal_rx_get_phyrx_abort(hal, rx_tlv, ppdu_info);
764*5113495bSYour Name 		break;
765*5113495bSYour Name 
766*5113495bSYour Name 	/*
767*5113495bSYour Name 	 * WIFIRX_PPDU_END_USER_STATS_E comes for each user received.
768*5113495bSYour Name 	 * for MU, based on num users we see this tlv that many times.
769*5113495bSYour Name 	 */
770*5113495bSYour Name 	case WIFIRX_PPDU_END_USER_STATS_E:
771*5113495bSYour Name 	{
772*5113495bSYour Name 		unsigned long tid = 0;
773*5113495bSYour Name 		uint16_t seq = 0;
774*5113495bSYour Name 
775*5113495bSYour Name 		ppdu_info->rx_status.ast_index =
776*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4,
777*5113495bSYour Name 						AST_INDEX);
778*5113495bSYour Name 
779*5113495bSYour Name 		tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12,
780*5113495bSYour Name 				RECEIVED_QOS_DATA_TID_BITMAP);
781*5113495bSYour Name 		ppdu_info->rx_status.tid = qdf_find_first_bit(&tid,
782*5113495bSYour Name 							      sizeof(tid) * 8);
783*5113495bSYour Name 
784*5113495bSYour Name 		if (ppdu_info->rx_status.tid == (sizeof(tid) * 8))
785*5113495bSYour Name 			ppdu_info->rx_status.tid = HAL_TID_INVALID;
786*5113495bSYour Name 
787*5113495bSYour Name 		ppdu_info->rx_status.tcp_msdu_count =
788*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9,
789*5113495bSYour Name 					TCP_MSDU_COUNT) +
790*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
791*5113495bSYour Name 					TCP_ACK_MSDU_COUNT);
792*5113495bSYour Name 		ppdu_info->rx_status.udp_msdu_count =
793*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9,
794*5113495bSYour Name 						UDP_MSDU_COUNT);
795*5113495bSYour Name 		ppdu_info->rx_status.other_msdu_count =
796*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
797*5113495bSYour Name 					OTHER_MSDU_COUNT);
798*5113495bSYour Name 
799*5113495bSYour Name 		if (ppdu_info->sw_frame_group_id
800*5113495bSYour Name 		    != HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) {
801*5113495bSYour Name 			ppdu_info->rx_status.frame_control_info_valid =
802*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
803*5113495bSYour Name 					   FRAME_CONTROL_INFO_VALID);
804*5113495bSYour Name 
805*5113495bSYour Name 			if (ppdu_info->rx_status.frame_control_info_valid)
806*5113495bSYour Name 				ppdu_info->rx_status.frame_control =
807*5113495bSYour Name 					HAL_RX_GET(rx_tlv,
808*5113495bSYour Name 						   RX_PPDU_END_USER_STATS_4,
809*5113495bSYour Name 						   FRAME_CONTROL_FIELD);
810*5113495bSYour Name 
811*5113495bSYour Name 			hal_get_qos_control(rx_tlv, ppdu_info);
812*5113495bSYour Name 		}
813*5113495bSYour Name 
814*5113495bSYour Name 		ppdu_info->rx_status.data_sequence_control_info_valid =
815*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
816*5113495bSYour Name 				   DATA_SEQUENCE_CONTROL_INFO_VALID);
817*5113495bSYour Name 
818*5113495bSYour Name 		seq = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_5,
819*5113495bSYour Name 				 FIRST_DATA_SEQ_CTRL);
820*5113495bSYour Name 		if (ppdu_info->rx_status.data_sequence_control_info_valid)
821*5113495bSYour Name 			ppdu_info->rx_status.first_data_seq_ctrl = seq;
822*5113495bSYour Name 
823*5113495bSYour Name 		ppdu_info->rx_status.preamble_type =
824*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
825*5113495bSYour Name 						HT_CONTROL_FIELD_PKT_TYPE);
826*5113495bSYour Name 		switch (ppdu_info->rx_status.preamble_type) {
827*5113495bSYour Name 		case HAL_RX_PKT_TYPE_11N:
828*5113495bSYour Name 			ppdu_info->rx_status.ht_flags = 1;
829*5113495bSYour Name 			ppdu_info->rx_status.rtap_flags |= HT_SGI_PRESENT;
830*5113495bSYour Name 			break;
831*5113495bSYour Name 		case HAL_RX_PKT_TYPE_11AC:
832*5113495bSYour Name 			ppdu_info->rx_status.vht_flags = 1;
833*5113495bSYour Name 			break;
834*5113495bSYour Name 		case HAL_RX_PKT_TYPE_11AX:
835*5113495bSYour Name 			ppdu_info->rx_status.he_flags = 1;
836*5113495bSYour Name 			break;
837*5113495bSYour Name 		default:
838*5113495bSYour Name 			break;
839*5113495bSYour Name 		}
840*5113495bSYour Name 
841*5113495bSYour Name 		ppdu_info->com_info.mpdu_cnt_fcs_ok =
842*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
843*5113495bSYour Name 					MPDU_CNT_FCS_OK);
844*5113495bSYour Name 		ppdu_info->com_info.mpdu_cnt_fcs_err =
845*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2,
846*5113495bSYour Name 					MPDU_CNT_FCS_ERR);
847*5113495bSYour Name 		if ((ppdu_info->com_info.mpdu_cnt_fcs_ok |
848*5113495bSYour Name 			ppdu_info->com_info.mpdu_cnt_fcs_err) > 1)
849*5113495bSYour Name 			ppdu_info->rx_status.rs_flags |= IEEE80211_AMPDU_FLAG;
850*5113495bSYour Name 		else
851*5113495bSYour Name 			ppdu_info->rx_status.rs_flags &=
852*5113495bSYour Name 				(~IEEE80211_AMPDU_FLAG);
853*5113495bSYour Name 
854*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[0] =
855*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_7,
856*5113495bSYour Name 					   FCS_OK_BITMAP_31_0);
857*5113495bSYour Name 
858*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[1] =
859*5113495bSYour Name 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_8,
860*5113495bSYour Name 					   FCS_OK_BITMAP_63_32);
861*5113495bSYour Name 
862*5113495bSYour Name 		if (user_id < HAL_MAX_UL_MU_USERS) {
863*5113495bSYour Name 			mon_rx_user_status =
864*5113495bSYour Name 				&ppdu_info->rx_user_status[user_id];
865*5113495bSYour Name 
866*5113495bSYour Name 			hal_rx_handle_mu_ul_info(rx_tlv, mon_rx_user_status);
867*5113495bSYour Name 
868*5113495bSYour Name 			ppdu_info->com_info.num_users++;
869*5113495bSYour Name 
870*5113495bSYour Name 			hal_rx_populate_mu_user_info(rx_tlv, ppdu_info,
871*5113495bSYour Name 						     user_id,
872*5113495bSYour Name 						     mon_rx_user_status);
873*5113495bSYour Name 		}
874*5113495bSYour Name 		break;
875*5113495bSYour Name 	}
876*5113495bSYour Name 
877*5113495bSYour Name 	case WIFIRX_PPDU_END_USER_STATS_EXT_E:
878*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[2] =
879*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_1,
880*5113495bSYour Name 				   FCS_OK_BITMAP_95_64);
881*5113495bSYour Name 
882*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[3] =
883*5113495bSYour Name 			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_2,
884*5113495bSYour Name 				    FCS_OK_BITMAP_127_96);
885*5113495bSYour Name 
886*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[4] =
887*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_3,
888*5113495bSYour Name 				   FCS_OK_BITMAP_159_128);
889*5113495bSYour Name 
890*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[5] =
891*5113495bSYour Name 			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_4,
892*5113495bSYour Name 				    FCS_OK_BITMAP_191_160);
893*5113495bSYour Name 
894*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[6] =
895*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_5,
896*5113495bSYour Name 				   FCS_OK_BITMAP_223_192);
897*5113495bSYour Name 
898*5113495bSYour Name 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[7] =
899*5113495bSYour Name 			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_6,
900*5113495bSYour Name 				    FCS_OK_BITMAP_255_224);
901*5113495bSYour Name 		break;
902*5113495bSYour Name 
903*5113495bSYour Name 	case WIFIRX_PPDU_END_STATUS_DONE_E:
904*5113495bSYour Name 		return HAL_TLV_STATUS_PPDU_DONE;
905*5113495bSYour Name 
906*5113495bSYour Name 	case WIFIDUMMY_E:
907*5113495bSYour Name 		return HAL_TLV_STATUS_BUF_DONE;
908*5113495bSYour Name 
909*5113495bSYour Name 	case WIFIPHYRX_HT_SIG_E:
910*5113495bSYour Name 	{
911*5113495bSYour Name 		uint8_t *ht_sig_info = (uint8_t *)rx_tlv +
912*5113495bSYour Name 				HAL_RX_OFFSET(UNIFIED_PHYRX_HT_SIG_0,
913*5113495bSYour Name 				HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS);
914*5113495bSYour Name 		value = HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1,
915*5113495bSYour Name 				FEC_CODING);
916*5113495bSYour Name 		ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
917*5113495bSYour Name 			1 : 0;
918*5113495bSYour Name 		ppdu_info->rx_status.mcs = HAL_RX_GET(ht_sig_info,
919*5113495bSYour Name 				HT_SIG_INFO_0, MCS);
920*5113495bSYour Name 		ppdu_info->rx_status.ht_mcs = ppdu_info->rx_status.mcs;
921*5113495bSYour Name 		ppdu_info->rx_status.bw = HAL_RX_GET(ht_sig_info,
922*5113495bSYour Name 				HT_SIG_INFO_0, CBW);
923*5113495bSYour Name 		ppdu_info->rx_status.sgi = HAL_RX_GET(ht_sig_info,
924*5113495bSYour Name 				HT_SIG_INFO_1, SHORT_GI);
925*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
926*5113495bSYour Name 		ppdu_info->rx_status.nss = ((ppdu_info->rx_status.mcs) >>
927*5113495bSYour Name 				HT_SIG_SU_NSS_SHIFT) + 1;
928*5113495bSYour Name 		ppdu_info->rx_status.mcs &= ((1 << HT_SIG_SU_NSS_SHIFT) - 1);
929*5113495bSYour Name 		hal_rx_get_ht_sig_info(ppdu_info, ht_sig_info);
930*5113495bSYour Name 		break;
931*5113495bSYour Name 	}
932*5113495bSYour Name 
933*5113495bSYour Name 	case WIFIPHYRX_L_SIG_B_E:
934*5113495bSYour Name 	{
935*5113495bSYour Name 		uint8_t *l_sig_b_info = (uint8_t *)rx_tlv +
936*5113495bSYour Name 				HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_B_0,
937*5113495bSYour Name 				L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS);
938*5113495bSYour Name 
939*5113495bSYour Name 		value = HAL_RX_GET(l_sig_b_info, L_SIG_B_INFO_0, RATE);
940*5113495bSYour Name 		ppdu_info->rx_status.l_sig_b_info = *((uint32_t *)l_sig_b_info);
941*5113495bSYour Name 		switch (value) {
942*5113495bSYour Name 		case 1:
943*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_3MCS;
944*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3;
945*5113495bSYour Name 			break;
946*5113495bSYour Name 		case 2:
947*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_2MCS;
948*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2;
949*5113495bSYour Name 			break;
950*5113495bSYour Name 		case 3:
951*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_1MCS;
952*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1;
953*5113495bSYour Name 			break;
954*5113495bSYour Name 		case 4:
955*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_0MCS;
956*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0;
957*5113495bSYour Name 			break;
958*5113495bSYour Name 		case 5:
959*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_6MCS;
960*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6;
961*5113495bSYour Name 			break;
962*5113495bSYour Name 		case 6:
963*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_5MCS;
964*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5;
965*5113495bSYour Name 			break;
966*5113495bSYour Name 		case 7:
967*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11B_RATE_4MCS;
968*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4;
969*5113495bSYour Name 			break;
970*5113495bSYour Name 		default:
971*5113495bSYour Name 			break;
972*5113495bSYour Name 		}
973*5113495bSYour Name 		ppdu_info->rx_status.cck_flag = 1;
974*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
975*5113495bSYour Name 	break;
976*5113495bSYour Name 	}
977*5113495bSYour Name 
978*5113495bSYour Name 	case WIFIPHYRX_L_SIG_A_E:
979*5113495bSYour Name 	{
980*5113495bSYour Name 		uint8_t *l_sig_a_info = (uint8_t *)rx_tlv +
981*5113495bSYour Name 				HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_A_0,
982*5113495bSYour Name 				L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS);
983*5113495bSYour Name 
984*5113495bSYour Name 		value = HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, RATE);
985*5113495bSYour Name 		ppdu_info->rx_status.l_sig_a_info = *((uint32_t *)l_sig_a_info);
986*5113495bSYour Name 		switch (value) {
987*5113495bSYour Name 		case 8:
988*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_0MCS;
989*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0;
990*5113495bSYour Name 			break;
991*5113495bSYour Name 		case 9:
992*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_1MCS;
993*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1;
994*5113495bSYour Name 			break;
995*5113495bSYour Name 		case 10:
996*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_2MCS;
997*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2;
998*5113495bSYour Name 			break;
999*5113495bSYour Name 		case 11:
1000*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_3MCS;
1001*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3;
1002*5113495bSYour Name 			break;
1003*5113495bSYour Name 		case 12:
1004*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_4MCS;
1005*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4;
1006*5113495bSYour Name 			break;
1007*5113495bSYour Name 		case 13:
1008*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_5MCS;
1009*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5;
1010*5113495bSYour Name 			break;
1011*5113495bSYour Name 		case 14:
1012*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_6MCS;
1013*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6;
1014*5113495bSYour Name 			break;
1015*5113495bSYour Name 		case 15:
1016*5113495bSYour Name 			ppdu_info->rx_status.rate = HAL_11A_RATE_7MCS;
1017*5113495bSYour Name 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS7;
1018*5113495bSYour Name 			break;
1019*5113495bSYour Name 		default:
1020*5113495bSYour Name 			break;
1021*5113495bSYour Name 		}
1022*5113495bSYour Name 		ppdu_info->rx_status.ofdm_flag = 1;
1023*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
1024*5113495bSYour Name 		hal_rx_get_l_sig_a_info(ppdu_info, l_sig_a_info);
1025*5113495bSYour Name 	break;
1026*5113495bSYour Name 	}
1027*5113495bSYour Name 
1028*5113495bSYour Name 	case WIFIPHYRX_VHT_SIG_A_E:
1029*5113495bSYour Name 	{
1030*5113495bSYour Name 		uint8_t *vht_sig_a_info = (uint8_t *)rx_tlv +
1031*5113495bSYour Name 				HAL_RX_OFFSET(UNIFIED_PHYRX_VHT_SIG_A_0,
1032*5113495bSYour Name 				VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS);
1033*5113495bSYour Name 
1034*5113495bSYour Name 		value = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1,
1035*5113495bSYour Name 				SU_MU_CODING);
1036*5113495bSYour Name 		ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
1037*5113495bSYour Name 			1 : 0;
1038*5113495bSYour Name 		group_id = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0,
1039*5113495bSYour Name 				      GROUP_ID);
1040*5113495bSYour Name 		ppdu_info->rx_status.vht_flag_values5 = group_id;
1041*5113495bSYour Name 		ppdu_info->rx_status.mcs = HAL_RX_GET(vht_sig_a_info,
1042*5113495bSYour Name 				VHT_SIG_A_INFO_1, MCS);
1043*5113495bSYour Name 		ppdu_info->rx_status.sgi = HAL_RX_GET(vht_sig_a_info,
1044*5113495bSYour Name 				VHT_SIG_A_INFO_1, GI_SETTING);
1045*5113495bSYour Name 
1046*5113495bSYour Name 		switch (hal->target_type) {
1047*5113495bSYour Name 		case TARGET_TYPE_QCA8074:
1048*5113495bSYour Name 		case TARGET_TYPE_QCA8074V2:
1049*5113495bSYour Name 		case TARGET_TYPE_QCA6018:
1050*5113495bSYour Name 		case TARGET_TYPE_QCA5018:
1051*5113495bSYour Name 		case TARGET_TYPE_QCN9000:
1052*5113495bSYour Name 		case TARGET_TYPE_QCN6122:
1053*5113495bSYour Name 		case TARGET_TYPE_QCN9160:
1054*5113495bSYour Name #ifdef QCA_WIFI_QCA6390
1055*5113495bSYour Name 		case TARGET_TYPE_QCA6390:
1056*5113495bSYour Name #endif
1057*5113495bSYour Name 		case TARGET_TYPE_QCA6490:
1058*5113495bSYour Name 			ppdu_info->rx_status.is_stbc =
1059*5113495bSYour Name 				HAL_RX_GET(vht_sig_a_info,
1060*5113495bSYour Name 					   VHT_SIG_A_INFO_0, STBC);
1061*5113495bSYour Name 			value =  HAL_RX_GET(vht_sig_a_info,
1062*5113495bSYour Name 					    VHT_SIG_A_INFO_0, N_STS);
1063*5113495bSYour Name 			value = value & VHT_SIG_SU_NSS_MASK;
1064*5113495bSYour Name 			if (ppdu_info->rx_status.is_stbc && (value > 0))
1065*5113495bSYour Name 				value = ((value + 1) >> 1) - 1;
1066*5113495bSYour Name 			ppdu_info->rx_status.nss =
1067*5113495bSYour Name 				((value & VHT_SIG_SU_NSS_MASK) + 1);
1068*5113495bSYour Name 
1069*5113495bSYour Name 			break;
1070*5113495bSYour Name 		case TARGET_TYPE_QCA6290:
1071*5113495bSYour Name #if !defined(QCA_WIFI_QCA6290_11AX)
1072*5113495bSYour Name 			ppdu_info->rx_status.is_stbc =
1073*5113495bSYour Name 				HAL_RX_GET(vht_sig_a_info,
1074*5113495bSYour Name 					   VHT_SIG_A_INFO_0, STBC);
1075*5113495bSYour Name 			value =  HAL_RX_GET(vht_sig_a_info,
1076*5113495bSYour Name 					    VHT_SIG_A_INFO_0, N_STS);
1077*5113495bSYour Name 			value = value & VHT_SIG_SU_NSS_MASK;
1078*5113495bSYour Name 			if (ppdu_info->rx_status.is_stbc && (value > 0))
1079*5113495bSYour Name 				value = ((value + 1) >> 1) - 1;
1080*5113495bSYour Name 			ppdu_info->rx_status.nss =
1081*5113495bSYour Name 				((value & VHT_SIG_SU_NSS_MASK) + 1);
1082*5113495bSYour Name #else
1083*5113495bSYour Name 			ppdu_info->rx_status.nss = 0;
1084*5113495bSYour Name #endif
1085*5113495bSYour Name 			break;
1086*5113495bSYour Name 		case TARGET_TYPE_QCA6750:
1087*5113495bSYour Name 			ppdu_info->rx_status.nss = 0;
1088*5113495bSYour Name 			break;
1089*5113495bSYour Name 		default:
1090*5113495bSYour Name 			break;
1091*5113495bSYour Name 		}
1092*5113495bSYour Name 		ppdu_info->rx_status.vht_flag_values3[0] =
1093*5113495bSYour Name 				(((ppdu_info->rx_status.mcs) << 4)
1094*5113495bSYour Name 				| ppdu_info->rx_status.nss);
1095*5113495bSYour Name 		ppdu_info->rx_status.bw = HAL_RX_GET(vht_sig_a_info,
1096*5113495bSYour Name 				VHT_SIG_A_INFO_0, BANDWIDTH);
1097*5113495bSYour Name 		ppdu_info->rx_status.vht_flag_values2 =
1098*5113495bSYour Name 			ppdu_info->rx_status.bw;
1099*5113495bSYour Name 		ppdu_info->rx_status.vht_flag_values4 =
1100*5113495bSYour Name 			HAL_RX_GET(vht_sig_a_info,
1101*5113495bSYour Name 				  VHT_SIG_A_INFO_1, SU_MU_CODING);
1102*5113495bSYour Name 
1103*5113495bSYour Name 		ppdu_info->rx_status.beamformed = HAL_RX_GET(vht_sig_a_info,
1104*5113495bSYour Name 				VHT_SIG_A_INFO_1, BEAMFORMED);
1105*5113495bSYour Name 		if (group_id == 0 || group_id == 63)
1106*5113495bSYour Name 			ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
1107*5113495bSYour Name 		else
1108*5113495bSYour Name 			ppdu_info->rx_status.reception_type =
1109*5113495bSYour Name 				HAL_RX_TYPE_MU_MIMO;
1110*5113495bSYour Name 
1111*5113495bSYour Name 		hal_rx_get_vht_sig_a_info(ppdu_info, vht_sig_a_info);
1112*5113495bSYour Name 		break;
1113*5113495bSYour Name 	}
1114*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_A_SU_E:
1115*5113495bSYour Name 	{
1116*5113495bSYour Name 		uint8_t *he_sig_a_su_info = (uint8_t *)rx_tlv +
1117*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_SU_0,
1118*5113495bSYour Name 			HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS);
1119*5113495bSYour Name 		ppdu_info->rx_status.he_flags = 1;
1120*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0,
1121*5113495bSYour Name 			FORMAT_INDICATION);
1122*5113495bSYour Name 		if (value == 0) {
1123*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
1124*5113495bSYour Name 				QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
1125*5113495bSYour Name 		} else {
1126*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
1127*5113495bSYour Name 				 QDF_MON_STATUS_HE_SU_FORMAT_TYPE;
1128*5113495bSYour Name 		}
1129*5113495bSYour Name 
1130*5113495bSYour Name 		/* data1 */
1131*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
1132*5113495bSYour Name 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
1133*5113495bSYour Name 			QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN |
1134*5113495bSYour Name 			QDF_MON_STATUS_HE_DL_UL_KNOWN |
1135*5113495bSYour Name 			QDF_MON_STATUS_HE_MCS_KNOWN |
1136*5113495bSYour Name 			QDF_MON_STATUS_HE_DCM_KNOWN |
1137*5113495bSYour Name 			QDF_MON_STATUS_HE_CODING_KNOWN |
1138*5113495bSYour Name 			QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN |
1139*5113495bSYour Name 			QDF_MON_STATUS_HE_STBC_KNOWN |
1140*5113495bSYour Name 			QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN |
1141*5113495bSYour Name 			QDF_MON_STATUS_HE_DOPPLER_KNOWN;
1142*5113495bSYour Name 
1143*5113495bSYour Name 		/* data2 */
1144*5113495bSYour Name 		ppdu_info->rx_status.he_data2 =
1145*5113495bSYour Name 			QDF_MON_STATUS_HE_GI_KNOWN;
1146*5113495bSYour Name 		ppdu_info->rx_status.he_data2 |=
1147*5113495bSYour Name 			QDF_MON_STATUS_TXBF_KNOWN |
1148*5113495bSYour Name 			QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
1149*5113495bSYour Name 			QDF_MON_STATUS_TXOP_KNOWN |
1150*5113495bSYour Name 			QDF_MON_STATUS_LTF_SYMBOLS_KNOWN |
1151*5113495bSYour Name 			QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
1152*5113495bSYour Name 			QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
1153*5113495bSYour Name 
1154*5113495bSYour Name 		/* data3 */
1155*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1156*5113495bSYour Name 				HE_SIG_A_SU_INFO_0, BSS_COLOR_ID);
1157*5113495bSYour Name 		ppdu_info->rx_status.he_data3 = value;
1158*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1159*5113495bSYour Name 				HE_SIG_A_SU_INFO_0, BEAM_CHANGE);
1160*5113495bSYour Name 		value = value << QDF_MON_STATUS_BEAM_CHANGE_SHIFT;
1161*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1162*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1163*5113495bSYour Name 				HE_SIG_A_SU_INFO_0, DL_UL_FLAG);
1164*5113495bSYour Name 		value = value << QDF_MON_STATUS_DL_UL_SHIFT;
1165*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1166*5113495bSYour Name 
1167*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1168*5113495bSYour Name 				HE_SIG_A_SU_INFO_0, TRANSMIT_MCS);
1169*5113495bSYour Name 		ppdu_info->rx_status.mcs = value;
1170*5113495bSYour Name 		value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1171*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1172*5113495bSYour Name 
1173*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1174*5113495bSYour Name 				HE_SIG_A_SU_INFO_0, DCM);
1175*5113495bSYour Name 		he_dcm = value;
1176*5113495bSYour Name 		value = value << QDF_MON_STATUS_DCM_SHIFT;
1177*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1178*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1179*5113495bSYour Name 				HE_SIG_A_SU_INFO_1, CODING);
1180*5113495bSYour Name 		ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
1181*5113495bSYour Name 			1 : 0;
1182*5113495bSYour Name 		value = value << QDF_MON_STATUS_CODING_SHIFT;
1183*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1184*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1185*5113495bSYour Name 				HE_SIG_A_SU_INFO_1,
1186*5113495bSYour Name 				LDPC_EXTRA_SYMBOL);
1187*5113495bSYour Name 		value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT;
1188*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1189*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1190*5113495bSYour Name 				HE_SIG_A_SU_INFO_1, STBC);
1191*5113495bSYour Name 		he_stbc = value;
1192*5113495bSYour Name 		value = value << QDF_MON_STATUS_STBC_SHIFT;
1193*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1194*5113495bSYour Name 
1195*5113495bSYour Name 		/* data4 */
1196*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0,
1197*5113495bSYour Name 							SPATIAL_REUSE);
1198*5113495bSYour Name 		ppdu_info->rx_status.he_data4 = value;
1199*5113495bSYour Name 
1200*5113495bSYour Name 		/* data5 */
1201*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1202*5113495bSYour Name 				HE_SIG_A_SU_INFO_0, TRANSMIT_BW);
1203*5113495bSYour Name 		ppdu_info->rx_status.he_data5 = value;
1204*5113495bSYour Name 		ppdu_info->rx_status.bw = value;
1205*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info,
1206*5113495bSYour Name 				HE_SIG_A_SU_INFO_0, CP_LTF_SIZE);
1207*5113495bSYour Name 		switch (value) {
1208*5113495bSYour Name 		case 0:
1209*5113495bSYour Name 				he_gi = HE_GI_0_8;
1210*5113495bSYour Name 				he_ltf = HE_LTF_1_X;
1211*5113495bSYour Name 				break;
1212*5113495bSYour Name 		case 1:
1213*5113495bSYour Name 				he_gi = HE_GI_0_8;
1214*5113495bSYour Name 				he_ltf = HE_LTF_2_X;
1215*5113495bSYour Name 				break;
1216*5113495bSYour Name 		case 2:
1217*5113495bSYour Name 				he_gi = HE_GI_1_6;
1218*5113495bSYour Name 				he_ltf = HE_LTF_2_X;
1219*5113495bSYour Name 				break;
1220*5113495bSYour Name 		case 3:
1221*5113495bSYour Name 				if (he_dcm && he_stbc) {
1222*5113495bSYour Name 					he_gi = HE_GI_0_8;
1223*5113495bSYour Name 					he_ltf = HE_LTF_4_X;
1224*5113495bSYour Name 				} else {
1225*5113495bSYour Name 					he_gi = HE_GI_3_2;
1226*5113495bSYour Name 					he_ltf = HE_LTF_4_X;
1227*5113495bSYour Name 				}
1228*5113495bSYour Name 				break;
1229*5113495bSYour Name 		}
1230*5113495bSYour Name 		ppdu_info->rx_status.sgi = he_gi;
1231*5113495bSYour Name 		ppdu_info->rx_status.ltf_size = he_ltf;
1232*5113495bSYour Name 		hal_get_radiotap_he_gi_ltf(&he_gi, &he_ltf);
1233*5113495bSYour Name 		value = he_gi << QDF_MON_STATUS_GI_SHIFT;
1234*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1235*5113495bSYour Name 		value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT;
1236*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1237*5113495bSYour Name 
1238*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS);
1239*5113495bSYour Name 		value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
1240*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1241*5113495bSYour Name 
1242*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
1243*5113495bSYour Name 						PACKET_EXTENSION_A_FACTOR);
1244*5113495bSYour Name 		value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT;
1245*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1246*5113495bSYour Name 
1247*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, TXBF);
1248*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXBF_SHIFT;
1249*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1250*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
1251*5113495bSYour Name 					PACKET_EXTENSION_PE_DISAMBIGUITY);
1252*5113495bSYour Name 		value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT;
1253*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1254*5113495bSYour Name 
1255*5113495bSYour Name 		/* data6 */
1256*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS);
1257*5113495bSYour Name 		value++;
1258*5113495bSYour Name 		ppdu_info->rx_status.nss = value;
1259*5113495bSYour Name 		ppdu_info->rx_status.he_data6 = value;
1260*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
1261*5113495bSYour Name 							DOPPLER_INDICATION);
1262*5113495bSYour Name 		value = value << QDF_MON_STATUS_DOPPLER_SHIFT;
1263*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1264*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
1265*5113495bSYour Name 							TXOP_DURATION);
1266*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXOP_SHIFT;
1267*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1268*5113495bSYour Name 
1269*5113495bSYour Name 		ppdu_info->rx_status.beamformed = HAL_RX_GET(he_sig_a_su_info,
1270*5113495bSYour Name 					HE_SIG_A_SU_INFO_1, TXBF);
1271*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
1272*5113495bSYour Name 		hal_rx_get_crc_he_sig_a_su_info(ppdu_info, he_sig_a_su_info);
1273*5113495bSYour Name 		break;
1274*5113495bSYour Name 	}
1275*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_A_MU_DL_E:
1276*5113495bSYour Name 	{
1277*5113495bSYour Name 		uint8_t *he_sig_a_mu_dl_info = (uint8_t *)rx_tlv +
1278*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_MU_DL_0,
1279*5113495bSYour Name 			HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS);
1280*5113495bSYour Name 
1281*5113495bSYour Name 		ppdu_info->rx_status.he_mu_flags = 1;
1282*5113495bSYour Name 
1283*5113495bSYour Name 		/* HE Flags */
1284*5113495bSYour Name 		/*data1*/
1285*5113495bSYour Name 		ppdu_info->rx_status.he_data1 =
1286*5113495bSYour Name 					QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
1287*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
1288*5113495bSYour Name 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
1289*5113495bSYour Name 			QDF_MON_STATUS_HE_DL_UL_KNOWN |
1290*5113495bSYour Name 			QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN |
1291*5113495bSYour Name 			QDF_MON_STATUS_HE_STBC_KNOWN |
1292*5113495bSYour Name 			QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN |
1293*5113495bSYour Name 			QDF_MON_STATUS_HE_DOPPLER_KNOWN;
1294*5113495bSYour Name 
1295*5113495bSYour Name 		/* data2 */
1296*5113495bSYour Name 		ppdu_info->rx_status.he_data2 =
1297*5113495bSYour Name 			QDF_MON_STATUS_HE_GI_KNOWN;
1298*5113495bSYour Name 		ppdu_info->rx_status.he_data2 |=
1299*5113495bSYour Name 			QDF_MON_STATUS_LTF_SYMBOLS_KNOWN |
1300*5113495bSYour Name 			QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
1301*5113495bSYour Name 			QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
1302*5113495bSYour Name 			QDF_MON_STATUS_TXOP_KNOWN |
1303*5113495bSYour Name 			QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
1304*5113495bSYour Name 
1305*5113495bSYour Name 		/*data3*/
1306*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1307*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_0, BSS_COLOR_ID);
1308*5113495bSYour Name 		ppdu_info->rx_status.he_data3 = value;
1309*5113495bSYour Name 
1310*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1311*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_0, DL_UL_FLAG);
1312*5113495bSYour Name 		value = value << QDF_MON_STATUS_DL_UL_SHIFT;
1313*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1314*5113495bSYour Name 
1315*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1316*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_1,
1317*5113495bSYour Name 				LDPC_EXTRA_SYMBOL);
1318*5113495bSYour Name 		value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT;
1319*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1320*5113495bSYour Name 
1321*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1322*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_1, STBC);
1323*5113495bSYour Name 		he_stbc = value;
1324*5113495bSYour Name 		value = value << QDF_MON_STATUS_STBC_SHIFT;
1325*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1326*5113495bSYour Name 
1327*5113495bSYour Name 		/*data4*/
1328*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0,
1329*5113495bSYour Name 							SPATIAL_REUSE);
1330*5113495bSYour Name 		ppdu_info->rx_status.he_data4 = value;
1331*5113495bSYour Name 
1332*5113495bSYour Name 		/*data5*/
1333*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1334*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW);
1335*5113495bSYour Name 		ppdu_info->rx_status.he_data5 = value;
1336*5113495bSYour Name 		ppdu_info->rx_status.bw = value;
1337*5113495bSYour Name 
1338*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1339*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_0, CP_LTF_SIZE);
1340*5113495bSYour Name 		switch (value) {
1341*5113495bSYour Name 		case 0:
1342*5113495bSYour Name 			he_gi = HE_GI_0_8;
1343*5113495bSYour Name 			he_ltf = HE_LTF_4_X;
1344*5113495bSYour Name 			break;
1345*5113495bSYour Name 		case 1:
1346*5113495bSYour Name 			he_gi = HE_GI_0_8;
1347*5113495bSYour Name 			he_ltf = HE_LTF_2_X;
1348*5113495bSYour Name 			break;
1349*5113495bSYour Name 		case 2:
1350*5113495bSYour Name 			he_gi = HE_GI_1_6;
1351*5113495bSYour Name 			he_ltf = HE_LTF_2_X;
1352*5113495bSYour Name 			break;
1353*5113495bSYour Name 		case 3:
1354*5113495bSYour Name 			he_gi = HE_GI_3_2;
1355*5113495bSYour Name 			he_ltf = HE_LTF_4_X;
1356*5113495bSYour Name 			break;
1357*5113495bSYour Name 		}
1358*5113495bSYour Name 		ppdu_info->rx_status.sgi = he_gi;
1359*5113495bSYour Name 		ppdu_info->rx_status.ltf_size = he_ltf;
1360*5113495bSYour Name 		hal_get_radiotap_he_gi_ltf(&he_gi, &he_ltf);
1361*5113495bSYour Name 		value = he_gi << QDF_MON_STATUS_GI_SHIFT;
1362*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1363*5113495bSYour Name 
1364*5113495bSYour Name 		value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT;
1365*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1366*5113495bSYour Name 
1367*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1368*5113495bSYour Name 				   HE_SIG_A_MU_DL_INFO_1, NUM_LTF_SYMBOLS);
1369*5113495bSYour Name 		value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
1370*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1371*5113495bSYour Name 
1372*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1373*5113495bSYour Name 				   PACKET_EXTENSION_A_FACTOR);
1374*5113495bSYour Name 		value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT;
1375*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1376*5113495bSYour Name 
1377*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1378*5113495bSYour Name 				   PACKET_EXTENSION_PE_DISAMBIGUITY);
1379*5113495bSYour Name 		value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT;
1380*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1381*5113495bSYour Name 
1382*5113495bSYour Name 		/*data6*/
1383*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0,
1384*5113495bSYour Name 							DOPPLER_INDICATION);
1385*5113495bSYour Name 		value = value << QDF_MON_STATUS_DOPPLER_SHIFT;
1386*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1387*5113495bSYour Name 
1388*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1389*5113495bSYour Name 							TXOP_DURATION);
1390*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXOP_SHIFT;
1391*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1392*5113495bSYour Name 
1393*5113495bSYour Name 		/* HE-MU Flags */
1394*5113495bSYour Name 		/* HE-MU-flags1 */
1395*5113495bSYour Name 		ppdu_info->rx_status.he_flags1 =
1396*5113495bSYour Name 			QDF_MON_STATUS_SIG_B_MCS_KNOWN |
1397*5113495bSYour Name 			QDF_MON_STATUS_SIG_B_DCM_KNOWN |
1398*5113495bSYour Name 			QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_1_KNOWN |
1399*5113495bSYour Name 			QDF_MON_STATUS_SIG_B_SYM_NUM_KNOWN |
1400*5113495bSYour Name 			QDF_MON_STATUS_RU_0_KNOWN;
1401*5113495bSYour Name 
1402*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1403*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_0, MCS_OF_SIG_B);
1404*5113495bSYour Name 		ppdu_info->rx_status.he_flags1 |= value;
1405*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1406*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_0, DCM_OF_SIG_B);
1407*5113495bSYour Name 		value = value << QDF_MON_STATUS_DCM_FLAG_1_SHIFT;
1408*5113495bSYour Name 		ppdu_info->rx_status.he_flags1 |= value;
1409*5113495bSYour Name 
1410*5113495bSYour Name 		/* HE-MU-flags2 */
1411*5113495bSYour Name 		ppdu_info->rx_status.he_flags2 =
1412*5113495bSYour Name 			QDF_MON_STATUS_BW_KNOWN;
1413*5113495bSYour Name 
1414*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1415*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW);
1416*5113495bSYour Name 		ppdu_info->rx_status.he_flags2 |= value;
1417*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1418*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_0, COMP_MODE_SIG_B);
1419*5113495bSYour Name 		value = value << QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT;
1420*5113495bSYour Name 		ppdu_info->rx_status.he_flags2 |= value;
1421*5113495bSYour Name 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1422*5113495bSYour Name 				HE_SIG_A_MU_DL_INFO_0, NUM_SIG_B_SYMBOLS);
1423*5113495bSYour Name 		value = value - 1;
1424*5113495bSYour Name 		value = value << QDF_MON_STATUS_NUM_SIG_B_SYMBOLS_SHIFT;
1425*5113495bSYour Name 		ppdu_info->rx_status.he_flags2 |= value;
1426*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
1427*5113495bSYour Name 		hal_rx_get_crc_he_sig_a_mu_dl_info(ppdu_info,
1428*5113495bSYour Name 						   he_sig_a_mu_dl_info);
1429*5113495bSYour Name 		break;
1430*5113495bSYour Name 	}
1431*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_B1_MU_E:
1432*5113495bSYour Name 	{
1433*5113495bSYour Name 		uint8_t *he_sig_b1_mu_info = (uint8_t *)rx_tlv +
1434*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B1_MU_0,
1435*5113495bSYour Name 			HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS);
1436*5113495bSYour Name 
1437*5113495bSYour Name 		ppdu_info->rx_status.he_sig_b_common_known |=
1438*5113495bSYour Name 			QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU0;
1439*5113495bSYour Name 		/* TODO: Check on the availability of other fields in
1440*5113495bSYour Name 		 * sig_b_common
1441*5113495bSYour Name 		 */
1442*5113495bSYour Name 
1443*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b1_mu_info,
1444*5113495bSYour Name 				HE_SIG_B1_MU_INFO_0, RU_ALLOCATION);
1445*5113495bSYour Name 		ppdu_info->rx_status.he_RU[0] = value;
1446*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
1447*5113495bSYour Name 		break;
1448*5113495bSYour Name 	}
1449*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_B2_MU_E:
1450*5113495bSYour Name 	{
1451*5113495bSYour Name 		uint8_t *he_sig_b2_mu_info = (uint8_t *)rx_tlv +
1452*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_MU_0,
1453*5113495bSYour Name 			HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS);
1454*5113495bSYour Name 		/*
1455*5113495bSYour Name 		 * Not all "HE" fields can be updated from
1456*5113495bSYour Name 		 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E
1457*5113495bSYour Name 		 * to populate rest of the "HE" fields for MU scenarios.
1458*5113495bSYour Name 		 */
1459*5113495bSYour Name 
1460*5113495bSYour Name 		/* HE-data1 */
1461*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
1462*5113495bSYour Name 			QDF_MON_STATUS_HE_MCS_KNOWN |
1463*5113495bSYour Name 			QDF_MON_STATUS_HE_CODING_KNOWN;
1464*5113495bSYour Name 
1465*5113495bSYour Name 		/* HE-data2 */
1466*5113495bSYour Name 
1467*5113495bSYour Name 		/* HE-data3 */
1468*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_mu_info,
1469*5113495bSYour Name 				HE_SIG_B2_MU_INFO_0, STA_MCS);
1470*5113495bSYour Name 		ppdu_info->rx_status.mcs = value;
1471*5113495bSYour Name 		value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1472*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1473*5113495bSYour Name 
1474*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_mu_info,
1475*5113495bSYour Name 				HE_SIG_B2_MU_INFO_0, STA_CODING);
1476*5113495bSYour Name 		value = value << QDF_MON_STATUS_CODING_SHIFT;
1477*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1478*5113495bSYour Name 
1479*5113495bSYour Name 		/* HE-data4 */
1480*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_mu_info,
1481*5113495bSYour Name 				HE_SIG_B2_MU_INFO_0, STA_ID);
1482*5113495bSYour Name 		value = value << QDF_MON_STATUS_STA_ID_SHIFT;
1483*5113495bSYour Name 		ppdu_info->rx_status.he_data4 |= value;
1484*5113495bSYour Name 
1485*5113495bSYour Name 		/* HE-data5 */
1486*5113495bSYour Name 
1487*5113495bSYour Name 		/* HE-data6 */
1488*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_mu_info,
1489*5113495bSYour Name 				   HE_SIG_B2_MU_INFO_0, NSTS);
1490*5113495bSYour Name 		/* value n indicates n+1 spatial streams */
1491*5113495bSYour Name 		value++;
1492*5113495bSYour Name 		ppdu_info->rx_status.nss = value;
1493*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1494*5113495bSYour Name 
1495*5113495bSYour Name 		break;
1496*5113495bSYour Name 	}
1497*5113495bSYour Name 	case WIFIPHYRX_HE_SIG_B2_OFDMA_E:
1498*5113495bSYour Name 	{
1499*5113495bSYour Name 		uint8_t *he_sig_b2_ofdma_info =
1500*5113495bSYour Name 		(uint8_t *)rx_tlv +
1501*5113495bSYour Name 		HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0,
1502*5113495bSYour Name 		HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS);
1503*5113495bSYour Name 
1504*5113495bSYour Name 		/*
1505*5113495bSYour Name 		 * Not all "HE" fields can be updated from
1506*5113495bSYour Name 		 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E
1507*5113495bSYour Name 		 * to populate rest of "HE" fields for MU OFDMA scenarios.
1508*5113495bSYour Name 		 */
1509*5113495bSYour Name 
1510*5113495bSYour Name 		/* HE-data1 */
1511*5113495bSYour Name 		ppdu_info->rx_status.he_data1 |=
1512*5113495bSYour Name 			QDF_MON_STATUS_HE_MCS_KNOWN |
1513*5113495bSYour Name 			QDF_MON_STATUS_HE_DCM_KNOWN |
1514*5113495bSYour Name 			QDF_MON_STATUS_HE_CODING_KNOWN;
1515*5113495bSYour Name 
1516*5113495bSYour Name 		/* HE-data2 */
1517*5113495bSYour Name 		ppdu_info->rx_status.he_data2 |=
1518*5113495bSYour Name 					QDF_MON_STATUS_TXBF_KNOWN;
1519*5113495bSYour Name 
1520*5113495bSYour Name 		/* HE-data3 */
1521*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1522*5113495bSYour Name 				HE_SIG_B2_OFDMA_INFO_0, STA_MCS);
1523*5113495bSYour Name 		ppdu_info->rx_status.mcs = value;
1524*5113495bSYour Name 		value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1525*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1526*5113495bSYour Name 
1527*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1528*5113495bSYour Name 				HE_SIG_B2_OFDMA_INFO_0, STA_DCM);
1529*5113495bSYour Name 		he_dcm = value;
1530*5113495bSYour Name 		value = value << QDF_MON_STATUS_DCM_SHIFT;
1531*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1532*5113495bSYour Name 
1533*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1534*5113495bSYour Name 				HE_SIG_B2_OFDMA_INFO_0, STA_CODING);
1535*5113495bSYour Name 		value = value << QDF_MON_STATUS_CODING_SHIFT;
1536*5113495bSYour Name 		ppdu_info->rx_status.he_data3 |= value;
1537*5113495bSYour Name 
1538*5113495bSYour Name 		/* HE-data4 */
1539*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1540*5113495bSYour Name 				HE_SIG_B2_OFDMA_INFO_0, STA_ID);
1541*5113495bSYour Name 		value = value << QDF_MON_STATUS_STA_ID_SHIFT;
1542*5113495bSYour Name 		ppdu_info->rx_status.he_data4 |= value;
1543*5113495bSYour Name 
1544*5113495bSYour Name 		/* HE-data5 */
1545*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1546*5113495bSYour Name 				   HE_SIG_B2_OFDMA_INFO_0, TXBF);
1547*5113495bSYour Name 		value = value << QDF_MON_STATUS_TXBF_SHIFT;
1548*5113495bSYour Name 		ppdu_info->rx_status.he_data5 |= value;
1549*5113495bSYour Name 
1550*5113495bSYour Name 		/* HE-data6 */
1551*5113495bSYour Name 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1552*5113495bSYour Name 				   HE_SIG_B2_OFDMA_INFO_0, NSTS);
1553*5113495bSYour Name 		/* value n indicates n+1 spatial streams */
1554*5113495bSYour Name 		value++;
1555*5113495bSYour Name 		ppdu_info->rx_status.nss = value;
1556*5113495bSYour Name 		ppdu_info->rx_status.he_data6 |= value;
1557*5113495bSYour Name 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA;
1558*5113495bSYour Name 		break;
1559*5113495bSYour Name 	}
1560*5113495bSYour Name 	case WIFIPHYRX_RSSI_LEGACY_E:
1561*5113495bSYour Name 	{
1562*5113495bSYour Name 		uint8_t reception_type;
1563*5113495bSYour Name 		int8_t rssi_value;
1564*5113495bSYour Name 		uint8_t *rssi_info_tlv = (uint8_t *)rx_tlv +
1565*5113495bSYour Name 			HAL_RX_OFFSET(UNIFIED_PHYRX_RSSI_LEGACY_19,
1566*5113495bSYour Name 				RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS);
1567*5113495bSYour Name 
1568*5113495bSYour Name 		ppdu_info->rx_status.rssi_comb =
1569*5113495bSYour Name 				hal_rx_phy_legacy_get_rssi(hal_soc_hdl, rx_tlv);
1570*5113495bSYour Name 		ppdu_info->rx_status.bw = hal->ops->hal_rx_get_tlv(rx_tlv);
1571*5113495bSYour Name 		ppdu_info->rx_status.he_re = 0;
1572*5113495bSYour Name 
1573*5113495bSYour Name 		reception_type = HAL_RX_GET(rx_tlv,
1574*5113495bSYour Name 					    PHYRX_RSSI_LEGACY_0,
1575*5113495bSYour Name 					    RECEPTION_TYPE);
1576*5113495bSYour Name 		switch (reception_type) {
1577*5113495bSYour Name 		case QDF_RECEPTION_TYPE_ULOFMDA:
1578*5113495bSYour Name 			ppdu_info->rx_status.reception_type =
1579*5113495bSYour Name 				HAL_RX_TYPE_MU_OFDMA;
1580*5113495bSYour Name 			ppdu_info->rx_status.ulofdma_flag = 1;
1581*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
1582*5113495bSYour Name 				QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
1583*5113495bSYour Name 			break;
1584*5113495bSYour Name 		case QDF_RECEPTION_TYPE_ULMIMO:
1585*5113495bSYour Name 			ppdu_info->rx_status.reception_type =
1586*5113495bSYour Name 				HAL_RX_TYPE_MU_MIMO;
1587*5113495bSYour Name 			ppdu_info->rx_status.he_data1 =
1588*5113495bSYour Name 				QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
1589*5113495bSYour Name 			break;
1590*5113495bSYour Name 		default:
1591*5113495bSYour Name 			ppdu_info->rx_status.reception_type =
1592*5113495bSYour Name 				HAL_RX_TYPE_SU;
1593*5113495bSYour Name 			break;
1594*5113495bSYour Name 		}
1595*5113495bSYour Name 		hal_rx_update_rssi_chain(ppdu_info, rssi_info_tlv);
1596*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1597*5113495bSYour Name 					RECEIVE_RSSI_INFO_0, RSSI_PRI20_CHAIN0);
1598*5113495bSYour Name 		ppdu_info->rx_status.rssi[0] = rssi_value;
1599*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN0: %d\n", rssi_value);
1600*5113495bSYour Name 
1601*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1602*5113495bSYour Name 					RECEIVE_RSSI_INFO_2, RSSI_PRI20_CHAIN1);
1603*5113495bSYour Name 		ppdu_info->rx_status.rssi[1] = rssi_value;
1604*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN1: %d\n", rssi_value);
1605*5113495bSYour Name 
1606*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1607*5113495bSYour Name 					RECEIVE_RSSI_INFO_4, RSSI_PRI20_CHAIN2);
1608*5113495bSYour Name 		ppdu_info->rx_status.rssi[2] = rssi_value;
1609*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN2: %d\n", rssi_value);
1610*5113495bSYour Name 
1611*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1612*5113495bSYour Name 					RECEIVE_RSSI_INFO_6, RSSI_PRI20_CHAIN3);
1613*5113495bSYour Name 		ppdu_info->rx_status.rssi[3] = rssi_value;
1614*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN3: %d\n", rssi_value);
1615*5113495bSYour Name 
1616*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1617*5113495bSYour Name 					RECEIVE_RSSI_INFO_8, RSSI_PRI20_CHAIN4);
1618*5113495bSYour Name 		ppdu_info->rx_status.rssi[4] = rssi_value;
1619*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN4: %d\n", rssi_value);
1620*5113495bSYour Name 
1621*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1622*5113495bSYour Name 					RECEIVE_RSSI_INFO_10,
1623*5113495bSYour Name 					RSSI_PRI20_CHAIN5);
1624*5113495bSYour Name 		ppdu_info->rx_status.rssi[5] = rssi_value;
1625*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN5: %d\n", rssi_value);
1626*5113495bSYour Name 
1627*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1628*5113495bSYour Name 					RECEIVE_RSSI_INFO_12,
1629*5113495bSYour Name 					RSSI_PRI20_CHAIN6);
1630*5113495bSYour Name 		ppdu_info->rx_status.rssi[6] = rssi_value;
1631*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN6: %d\n", rssi_value);
1632*5113495bSYour Name 
1633*5113495bSYour Name 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1634*5113495bSYour Name 					RECEIVE_RSSI_INFO_14,
1635*5113495bSYour Name 					RSSI_PRI20_CHAIN7);
1636*5113495bSYour Name 		ppdu_info->rx_status.rssi[7] = rssi_value;
1637*5113495bSYour Name 		dp_nofl_debug("RSSI_PRI20_CHAIN7: %d\n", rssi_value);
1638*5113495bSYour Name 		break;
1639*5113495bSYour Name 	}
1640*5113495bSYour Name 	case WIFIPHYRX_OTHER_RECEIVE_INFO_E:
1641*5113495bSYour Name 		hal_rx_proc_phyrx_other_receive_info_tlv(hal, rx_tlv_hdr,
1642*5113495bSYour Name 								ppdu_info);
1643*5113495bSYour Name 		break;
1644*5113495bSYour Name 	case WIFIRX_HEADER_E:
1645*5113495bSYour Name 	{
1646*5113495bSYour Name 		struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info;
1647*5113495bSYour Name 
1648*5113495bSYour Name 		if (ppdu_info->fcs_ok_cnt >=
1649*5113495bSYour Name 		    HAL_RX_MAX_MPDU_H_PER_STATUS_BUFFER) {
1650*5113495bSYour Name 			hal_err("Number of MPDUs(%d) per status buff exceeded",
1651*5113495bSYour Name 				ppdu_info->fcs_ok_cnt);
1652*5113495bSYour Name 			break;
1653*5113495bSYour Name 		}
1654*5113495bSYour Name 
1655*5113495bSYour Name 		/* Update first_msdu_payload for every mpdu and increment
1656*5113495bSYour Name 		 * com_info->mpdu_cnt for every WIFIRX_HEADER_E TLV
1657*5113495bSYour Name 		 */
1658*5113495bSYour Name 		ppdu_info->ppdu_msdu_info[ppdu_info->fcs_ok_cnt].first_msdu_payload =
1659*5113495bSYour Name 			rx_tlv;
1660*5113495bSYour Name 		ppdu_info->ppdu_msdu_info[ppdu_info->fcs_ok_cnt].payload_len = tlv_len;
1661*5113495bSYour Name 		ppdu_info->msdu_info.first_msdu_payload = rx_tlv;
1662*5113495bSYour Name 		ppdu_info->msdu_info.payload_len = tlv_len;
1663*5113495bSYour Name 		ppdu_info->user_id = user_id;
1664*5113495bSYour Name 		ppdu_info->hdr_len = tlv_len;
1665*5113495bSYour Name 		ppdu_info->data = rx_tlv;
1666*5113495bSYour Name 		ppdu_info->data += 4;
1667*5113495bSYour Name 
1668*5113495bSYour Name 		/* for every RX_HEADER TLV increment mpdu_cnt */
1669*5113495bSYour Name 		com_info->mpdu_cnt++;
1670*5113495bSYour Name 		return HAL_TLV_STATUS_HEADER;
1671*5113495bSYour Name 	}
1672*5113495bSYour Name 	case WIFIRX_MPDU_START_E:
1673*5113495bSYour Name 	{
1674*5113495bSYour Name 		uint8_t *rx_mpdu_start = (uint8_t *)rx_tlv;
1675*5113495bSYour Name 		uint32_t ppdu_id = HAL_RX_GET_PPDU_ID(rx_mpdu_start);
1676*5113495bSYour Name 		uint8_t filter_category = 0;
1677*5113495bSYour Name 
1678*5113495bSYour Name 		hal_update_frame_type_cnt(rx_mpdu_start, ppdu_info);
1679*5113495bSYour Name 
1680*5113495bSYour Name 		ppdu_info->nac_info.fc_valid =
1681*5113495bSYour Name 				HAL_RX_GET_FC_VALID(rx_mpdu_start);
1682*5113495bSYour Name 
1683*5113495bSYour Name 		ppdu_info->nac_info.to_ds_flag =
1684*5113495bSYour Name 				HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start);
1685*5113495bSYour Name 
1686*5113495bSYour Name 		ppdu_info->nac_info.frame_control =
1687*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
1688*5113495bSYour Name 				   RX_MPDU_INFO_14,
1689*5113495bSYour Name 				   MPDU_FRAME_CONTROL_FIELD);
1690*5113495bSYour Name 
1691*5113495bSYour Name 		ppdu_info->sw_frame_group_id =
1692*5113495bSYour Name 			HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start);
1693*5113495bSYour Name 
1694*5113495bSYour Name 		ppdu_info->rx_user_status[user_id].sw_peer_id =
1695*5113495bSYour Name 			HAL_RX_GET_SW_PEER_ID(rx_mpdu_start);
1696*5113495bSYour Name 
1697*5113495bSYour Name 		hal_update_rx_ctrl_frame_stats(ppdu_info, user_id);
1698*5113495bSYour Name 
1699*5113495bSYour Name 		if (ppdu_info->sw_frame_group_id ==
1700*5113495bSYour Name 		    HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) {
1701*5113495bSYour Name 			ppdu_info->rx_status.frame_control_info_valid =
1702*5113495bSYour Name 				ppdu_info->nac_info.fc_valid;
1703*5113495bSYour Name 			ppdu_info->rx_status.frame_control =
1704*5113495bSYour Name 				ppdu_info->nac_info.frame_control;
1705*5113495bSYour Name 		}
1706*5113495bSYour Name 
1707*5113495bSYour Name 		hal_get_mac_addr1(rx_mpdu_start,
1708*5113495bSYour Name 				  ppdu_info);
1709*5113495bSYour Name 
1710*5113495bSYour Name 		ppdu_info->nac_info.mac_addr2_valid =
1711*5113495bSYour Name 				HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start);
1712*5113495bSYour Name 
1713*5113495bSYour Name 		*(uint16_t *)&ppdu_info->nac_info.mac_addr2[0] =
1714*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
1715*5113495bSYour Name 				   RX_MPDU_INFO_16,
1716*5113495bSYour Name 				   MAC_ADDR_AD2_15_0);
1717*5113495bSYour Name 
1718*5113495bSYour Name 		*(uint32_t *)&ppdu_info->nac_info.mac_addr2[2] =
1719*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
1720*5113495bSYour Name 				   RX_MPDU_INFO_17,
1721*5113495bSYour Name 				   MAC_ADDR_AD2_47_16);
1722*5113495bSYour Name 
1723*5113495bSYour Name 		if (ppdu_info->rx_status.prev_ppdu_id != ppdu_id) {
1724*5113495bSYour Name 			ppdu_info->rx_status.prev_ppdu_id = ppdu_id;
1725*5113495bSYour Name 			ppdu_info->rx_status.ppdu_len =
1726*5113495bSYour Name 				HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13,
1727*5113495bSYour Name 					   MPDU_LENGTH);
1728*5113495bSYour Name 		} else {
1729*5113495bSYour Name 			ppdu_info->rx_status.ppdu_len +=
1730*5113495bSYour Name 				HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13,
1731*5113495bSYour Name 					   MPDU_LENGTH);
1732*5113495bSYour Name 		}
1733*5113495bSYour Name 
1734*5113495bSYour Name 		filter_category =
1735*5113495bSYour Name 				HAL_RX_GET_FILTER_CATEGORY(rx_mpdu_start);
1736*5113495bSYour Name 
1737*5113495bSYour Name 		if (filter_category == 0)
1738*5113495bSYour Name 			ppdu_info->rx_status.rxpcu_filter_pass = 1;
1739*5113495bSYour Name 		else if (filter_category == 1)
1740*5113495bSYour Name 			ppdu_info->rx_status.monitor_direct_used = 1;
1741*5113495bSYour Name 
1742*5113495bSYour Name 		ppdu_info->nac_info.mcast_bcast =
1743*5113495bSYour Name 			HAL_RX_GET(rx_mpdu_start,
1744*5113495bSYour Name 				   RX_MPDU_INFO_13,
1745*5113495bSYour Name 				   MCAST_BCAST);
1746*5113495bSYour Name 		break;
1747*5113495bSYour Name 	}
1748*5113495bSYour Name 	case WIFIRX_MPDU_END_E:
1749*5113495bSYour Name 		ppdu_info->user_id = user_id;
1750*5113495bSYour Name 		ppdu_info->fcs_err =
1751*5113495bSYour Name 			HAL_RX_GET(rx_tlv, RX_MPDU_END_1,
1752*5113495bSYour Name 				   FCS_ERR);
1753*5113495bSYour Name 		return HAL_TLV_STATUS_MPDU_END;
1754*5113495bSYour Name 	case WIFIRX_MSDU_END_E:
1755*5113495bSYour Name 		if (user_id < HAL_MAX_UL_MU_USERS) {
1756*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].cce_metadata =
1757*5113495bSYour Name 				HAL_RX_MSDU_END_CCE_METADATA_GET(rx_tlv);
1758*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].fse_metadata =
1759*5113495bSYour Name 				HAL_RX_MSDU_END_FSE_METADATA_GET(rx_tlv);
1760*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].is_flow_idx_timeout =
1761*5113495bSYour Name 				HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(rx_tlv);
1762*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].is_flow_idx_invalid =
1763*5113495bSYour Name 				HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(rx_tlv);
1764*5113495bSYour Name 			ppdu_info->rx_msdu_info[user_id].flow_idx =
1765*5113495bSYour Name 				HAL_RX_MSDU_END_FLOW_IDX_GET(rx_tlv);
1766*5113495bSYour Name 		}
1767*5113495bSYour Name 		return HAL_TLV_STATUS_MSDU_END;
1768*5113495bSYour Name 	case 0:
1769*5113495bSYour Name 		return HAL_TLV_STATUS_PPDU_DONE;
1770*5113495bSYour Name 
1771*5113495bSYour Name 	default:
1772*5113495bSYour Name 		if (hal_rx_handle_other_tlvs(tlv_tag, rx_tlv, ppdu_info))
1773*5113495bSYour Name 			unhandled = false;
1774*5113495bSYour Name 		else
1775*5113495bSYour Name 			unhandled = true;
1776*5113495bSYour Name 		break;
1777*5113495bSYour Name 	}
1778*5113495bSYour Name 
1779*5113495bSYour Name 	if (!unhandled)
1780*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1781*5113495bSYour Name 			  "%s TLV type: %d, TLV len:%d %s",
1782*5113495bSYour Name 			  __func__, tlv_tag, tlv_len,
1783*5113495bSYour Name 			  unhandled == true ? "unhandled" : "");
1784*5113495bSYour Name 
1785*5113495bSYour Name 	return HAL_TLV_STATUS_PPDU_NOT_DONE;
1786*5113495bSYour Name }
1787*5113495bSYour Name 
1788*5113495bSYour Name /**
1789*5113495bSYour Name  * hal_tx_comp_get_release_reason_generic_li() - TQM Release reason
1790*5113495bSYour Name  * @hal_desc: completion ring descriptor pointer
1791*5113495bSYour Name  *
1792*5113495bSYour Name  * This function will return the type of pointer - buffer or descriptor
1793*5113495bSYour Name  *
1794*5113495bSYour Name  * Return: buffer type
1795*5113495bSYour Name  */
hal_tx_comp_get_release_reason_generic_li(void * hal_desc)1796*5113495bSYour Name static inline uint8_t hal_tx_comp_get_release_reason_generic_li(void *hal_desc)
1797*5113495bSYour Name {
1798*5113495bSYour Name 	uint32_t comp_desc =
1799*5113495bSYour Name 		*(uint32_t *)(((uint8_t *)hal_desc) +
1800*5113495bSYour Name 			       WBM_RELEASE_RING_2_TQM_RELEASE_REASON_OFFSET);
1801*5113495bSYour Name 
1802*5113495bSYour Name 	return (comp_desc & WBM_RELEASE_RING_2_TQM_RELEASE_REASON_MASK) >>
1803*5113495bSYour Name 		WBM_RELEASE_RING_2_TQM_RELEASE_REASON_LSB;
1804*5113495bSYour Name }
1805*5113495bSYour Name 
1806*5113495bSYour Name /**
1807*5113495bSYour Name  * hal_get_wbm_internal_error_generic_li() - is WBM internal error
1808*5113495bSYour Name  * @hal_desc: completion ring descriptor pointer
1809*5113495bSYour Name  *
1810*5113495bSYour Name  * This function will return 0 or 1  - is it WBM internal error or not
1811*5113495bSYour Name  *
1812*5113495bSYour Name  * Return: uint8_t
1813*5113495bSYour Name  */
hal_get_wbm_internal_error_generic_li(void * hal_desc)1814*5113495bSYour Name static inline uint8_t hal_get_wbm_internal_error_generic_li(void *hal_desc)
1815*5113495bSYour Name {
1816*5113495bSYour Name 	uint32_t comp_desc =
1817*5113495bSYour Name 		*(uint32_t *)(((uint8_t *)hal_desc) +
1818*5113495bSYour Name 			      HAL_WBM_INTERNAL_ERROR_OFFSET);
1819*5113495bSYour Name 
1820*5113495bSYour Name 	return (comp_desc & HAL_WBM_INTERNAL_ERROR_MASK) >>
1821*5113495bSYour Name 		HAL_WBM_INTERNAL_ERROR_LSB;
1822*5113495bSYour Name }
1823*5113495bSYour Name 
1824*5113495bSYour Name /**
1825*5113495bSYour Name  * hal_rx_dump_rx_attention_tlv_generic_li() - dump RX attention TLV in
1826*5113495bSYour Name  *					       structured humman readable
1827*5113495bSYour Name  *					       format.
1828*5113495bSYour Name  * @pkttlvs: pointer the pkt tlv struct.
1829*5113495bSYour Name  * @dbg_level: log level.
1830*5113495bSYour Name  *
1831*5113495bSYour Name  * Return: void
1832*5113495bSYour Name  */
1833*5113495bSYour Name static inline
hal_rx_dump_rx_attention_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)1834*5113495bSYour Name void hal_rx_dump_rx_attention_tlv_generic_li(void *pkttlvs,
1835*5113495bSYour Name 					     uint8_t dbg_level)
1836*5113495bSYour Name {
1837*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs;
1838*5113495bSYour Name 	struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
1839*5113495bSYour Name 
1840*5113495bSYour Name 	hal_verbose_debug("rx_attention tlv (1/2) - "
1841*5113495bSYour Name 			  "rxpcu_mpdu_filter_in_category: %x "
1842*5113495bSYour Name 			  "sw_frame_group_id: %x "
1843*5113495bSYour Name 			  "reserved_0: %x "
1844*5113495bSYour Name 			  "phy_ppdu_id: %x "
1845*5113495bSYour Name 			  "first_mpdu : %x "
1846*5113495bSYour Name 			  "reserved_1a: %x "
1847*5113495bSYour Name 			  "mcast_bcast: %x "
1848*5113495bSYour Name 			  "ast_index_not_found: %x "
1849*5113495bSYour Name 			  "ast_index_timeout: %x "
1850*5113495bSYour Name 			  "power_mgmt: %x "
1851*5113495bSYour Name 			  "non_qos: %x "
1852*5113495bSYour Name 			  "null_data: %x "
1853*5113495bSYour Name 			  "mgmt_type: %x "
1854*5113495bSYour Name 			  "ctrl_type: %x "
1855*5113495bSYour Name 			  "more_data: %x "
1856*5113495bSYour Name 			  "eosp: %x "
1857*5113495bSYour Name 			  "a_msdu_error: %x "
1858*5113495bSYour Name 			  "fragment_flag: %x "
1859*5113495bSYour Name 			  "order: %x "
1860*5113495bSYour Name 			  "cce_match: %x "
1861*5113495bSYour Name 			  "overflow_err: %x "
1862*5113495bSYour Name 			  "msdu_length_err: %x "
1863*5113495bSYour Name 			  "tcp_udp_chksum_fail: %x "
1864*5113495bSYour Name 			  "ip_chksum_fail: %x "
1865*5113495bSYour Name 			  "sa_idx_invalid: %x "
1866*5113495bSYour Name 			  "da_idx_invalid: %x "
1867*5113495bSYour Name 			  "reserved_1b: %x "
1868*5113495bSYour Name 			  "rx_in_tx_decrypt_byp: %x ",
1869*5113495bSYour Name 			  rx_attn->rxpcu_mpdu_filter_in_category,
1870*5113495bSYour Name 			  rx_attn->sw_frame_group_id,
1871*5113495bSYour Name 			  rx_attn->reserved_0,
1872*5113495bSYour Name 			  rx_attn->phy_ppdu_id,
1873*5113495bSYour Name 			  rx_attn->first_mpdu,
1874*5113495bSYour Name 			  rx_attn->reserved_1a,
1875*5113495bSYour Name 			  rx_attn->mcast_bcast,
1876*5113495bSYour Name 			  rx_attn->ast_index_not_found,
1877*5113495bSYour Name 			  rx_attn->ast_index_timeout,
1878*5113495bSYour Name 			  rx_attn->power_mgmt,
1879*5113495bSYour Name 			  rx_attn->non_qos,
1880*5113495bSYour Name 			  rx_attn->null_data,
1881*5113495bSYour Name 			  rx_attn->mgmt_type,
1882*5113495bSYour Name 			  rx_attn->ctrl_type,
1883*5113495bSYour Name 			  rx_attn->more_data,
1884*5113495bSYour Name 			  rx_attn->eosp,
1885*5113495bSYour Name 			  rx_attn->a_msdu_error,
1886*5113495bSYour Name 			  rx_attn->fragment_flag,
1887*5113495bSYour Name 			  rx_attn->order,
1888*5113495bSYour Name 			  rx_attn->cce_match,
1889*5113495bSYour Name 			  rx_attn->overflow_err,
1890*5113495bSYour Name 			  rx_attn->msdu_length_err,
1891*5113495bSYour Name 			  rx_attn->tcp_udp_chksum_fail,
1892*5113495bSYour Name 			  rx_attn->ip_chksum_fail,
1893*5113495bSYour Name 			  rx_attn->sa_idx_invalid,
1894*5113495bSYour Name 			  rx_attn->da_idx_invalid,
1895*5113495bSYour Name 			  rx_attn->reserved_1b,
1896*5113495bSYour Name 			  rx_attn->rx_in_tx_decrypt_byp);
1897*5113495bSYour Name 
1898*5113495bSYour Name 	hal_verbose_debug("rx_attention tlv (2/2) - "
1899*5113495bSYour Name 			  "encrypt_required: %x "
1900*5113495bSYour Name 			  "directed: %x "
1901*5113495bSYour Name 			  "buffer_fragment: %x "
1902*5113495bSYour Name 			  "mpdu_length_err: %x "
1903*5113495bSYour Name 			  "tkip_mic_err: %x "
1904*5113495bSYour Name 			  "decrypt_err: %x "
1905*5113495bSYour Name 			  "unencrypted_frame_err: %x "
1906*5113495bSYour Name 			  "fcs_err: %x "
1907*5113495bSYour Name 			  "flow_idx_timeout: %x "
1908*5113495bSYour Name 			  "flow_idx_invalid: %x "
1909*5113495bSYour Name 			  "wifi_parser_error: %x "
1910*5113495bSYour Name 			  "amsdu_parser_error: %x "
1911*5113495bSYour Name 			  "sa_idx_timeout: %x "
1912*5113495bSYour Name 			  "da_idx_timeout: %x "
1913*5113495bSYour Name 			  "msdu_limit_error: %x "
1914*5113495bSYour Name 			  "da_is_valid: %x "
1915*5113495bSYour Name 			  "da_is_mcbc: %x "
1916*5113495bSYour Name 			  "sa_is_valid: %x "
1917*5113495bSYour Name 			  "decrypt_status_code: %x "
1918*5113495bSYour Name 			  "rx_bitmap_not_updated: %x "
1919*5113495bSYour Name 			  "reserved_2: %x "
1920*5113495bSYour Name 			  "msdu_done: %x ",
1921*5113495bSYour Name 			  rx_attn->encrypt_required,
1922*5113495bSYour Name 			  rx_attn->directed,
1923*5113495bSYour Name 			  rx_attn->buffer_fragment,
1924*5113495bSYour Name 			  rx_attn->mpdu_length_err,
1925*5113495bSYour Name 			  rx_attn->tkip_mic_err,
1926*5113495bSYour Name 			  rx_attn->decrypt_err,
1927*5113495bSYour Name 			  rx_attn->unencrypted_frame_err,
1928*5113495bSYour Name 			  rx_attn->fcs_err,
1929*5113495bSYour Name 			  rx_attn->flow_idx_timeout,
1930*5113495bSYour Name 			  rx_attn->flow_idx_invalid,
1931*5113495bSYour Name 			  rx_attn->wifi_parser_error,
1932*5113495bSYour Name 			  rx_attn->amsdu_parser_error,
1933*5113495bSYour Name 			  rx_attn->sa_idx_timeout,
1934*5113495bSYour Name 			  rx_attn->da_idx_timeout,
1935*5113495bSYour Name 			  rx_attn->msdu_limit_error,
1936*5113495bSYour Name 			  rx_attn->da_is_valid,
1937*5113495bSYour Name 			  rx_attn->da_is_mcbc,
1938*5113495bSYour Name 			  rx_attn->sa_is_valid,
1939*5113495bSYour Name 			  rx_attn->decrypt_status_code,
1940*5113495bSYour Name 			  rx_attn->rx_bitmap_not_updated,
1941*5113495bSYour Name 			  rx_attn->reserved_2,
1942*5113495bSYour Name 			  rx_attn->msdu_done);
1943*5113495bSYour Name }
1944*5113495bSYour Name 
1945*5113495bSYour Name /**
1946*5113495bSYour Name  * hal_rx_dump_mpdu_end_tlv_generic_li() - dump RX mpdu_end TLV in structured
1947*5113495bSYour Name  *					   human readable format.
1948*5113495bSYour Name  * @pkttlvs: pointer the pkt tlv struct.
1949*5113495bSYour Name  * @dbg_level: log level.
1950*5113495bSYour Name  *
1951*5113495bSYour Name  * Return: void
1952*5113495bSYour Name  */
1953*5113495bSYour Name static inline
hal_rx_dump_mpdu_end_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)1954*5113495bSYour Name void hal_rx_dump_mpdu_end_tlv_generic_li(void *pkttlvs,
1955*5113495bSYour Name 					 uint8_t dbg_level)
1956*5113495bSYour Name {
1957*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs;
1958*5113495bSYour Name 	struct rx_mpdu_end *mpdu_end = &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
1959*5113495bSYour Name 
1960*5113495bSYour Name 	hal_verbose_debug("rx_mpdu_end tlv - "
1961*5113495bSYour Name 			  "rxpcu_mpdu_filter_in_category: %x "
1962*5113495bSYour Name 			  "sw_frame_group_id: %x "
1963*5113495bSYour Name 			  "phy_ppdu_id: %x "
1964*5113495bSYour Name 			  "unsup_ktype_short_frame: %x "
1965*5113495bSYour Name 			  "rx_in_tx_decrypt_byp: %x "
1966*5113495bSYour Name 			  "overflow_err: %x "
1967*5113495bSYour Name 			  "mpdu_length_err: %x "
1968*5113495bSYour Name 			  "tkip_mic_err: %x "
1969*5113495bSYour Name 			  "decrypt_err: %x "
1970*5113495bSYour Name 			  "unencrypted_frame_err: %x "
1971*5113495bSYour Name 			  "pn_fields_contain_valid_info: %x "
1972*5113495bSYour Name 			  "fcs_err: %x "
1973*5113495bSYour Name 			  "msdu_length_err: %x "
1974*5113495bSYour Name 			  "rxdma0_destination_ring: %x "
1975*5113495bSYour Name 			  "rxdma1_destination_ring: %x "
1976*5113495bSYour Name 			  "decrypt_status_code: %x "
1977*5113495bSYour Name 			  "rx_bitmap_not_updated: %x ",
1978*5113495bSYour Name 			  mpdu_end->rxpcu_mpdu_filter_in_category,
1979*5113495bSYour Name 			  mpdu_end->sw_frame_group_id,
1980*5113495bSYour Name 			  mpdu_end->phy_ppdu_id,
1981*5113495bSYour Name 			  mpdu_end->unsup_ktype_short_frame,
1982*5113495bSYour Name 			  mpdu_end->rx_in_tx_decrypt_byp,
1983*5113495bSYour Name 			  mpdu_end->overflow_err,
1984*5113495bSYour Name 			  mpdu_end->mpdu_length_err,
1985*5113495bSYour Name 			  mpdu_end->tkip_mic_err,
1986*5113495bSYour Name 			  mpdu_end->decrypt_err,
1987*5113495bSYour Name 			  mpdu_end->unencrypted_frame_err,
1988*5113495bSYour Name 			  mpdu_end->pn_fields_contain_valid_info,
1989*5113495bSYour Name 			  mpdu_end->fcs_err,
1990*5113495bSYour Name 			  mpdu_end->msdu_length_err,
1991*5113495bSYour Name 			  mpdu_end->rxdma0_destination_ring,
1992*5113495bSYour Name 			  mpdu_end->rxdma1_destination_ring,
1993*5113495bSYour Name 			  mpdu_end->decrypt_status_code,
1994*5113495bSYour Name 			  mpdu_end->rx_bitmap_not_updated);
1995*5113495bSYour Name }
1996*5113495bSYour Name 
1997*5113495bSYour Name #ifdef NO_RX_PKT_HDR_TLV
1998*5113495bSYour Name static inline
hal_rx_dump_pkt_hdr_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)1999*5113495bSYour Name void hal_rx_dump_pkt_hdr_tlv_generic_li(void *pkttlvs,
2000*5113495bSYour Name 					uint8_t dbg_level)
2001*5113495bSYour Name {
2002*5113495bSYour Name }
2003*5113495bSYour Name #else
2004*5113495bSYour Name /**
2005*5113495bSYour Name  * hal_rx_dump_pkt_hdr_tlv_generic_li() - dump RX pkt header TLV in hex format
2006*5113495bSYour Name  * @pkttlvs: pointer the pkt tlv struct.
2007*5113495bSYour Name  * @dbg_level: log level.
2008*5113495bSYour Name  *
2009*5113495bSYour Name  * Return: void
2010*5113495bSYour Name  */
2011*5113495bSYour Name static inline
hal_rx_dump_pkt_hdr_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)2012*5113495bSYour Name void hal_rx_dump_pkt_hdr_tlv_generic_li(void *pkttlvs,
2013*5113495bSYour Name 					uint8_t dbg_level)
2014*5113495bSYour Name {
2015*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs;
2016*5113495bSYour Name 	struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv;
2017*5113495bSYour Name 
2018*5113495bSYour Name 	hal_verbose_debug("\n---------------\nrx_pkt_hdr_tlv"
2019*5113495bSYour Name 			  "\n---------------\nphy_ppdu_id %d ",
2020*5113495bSYour Name 			  pkt_hdr_tlv->phy_ppdu_id);
2021*5113495bSYour Name 	hal_verbose_hex_dump(pkt_hdr_tlv->rx_pkt_hdr, 128);
2022*5113495bSYour Name }
2023*5113495bSYour Name #endif
2024*5113495bSYour Name 
2025*5113495bSYour Name /**
2026*5113495bSYour Name  * hal_rx_tlv_decrypt_err_get_li() - API to get the Decrypt ERR
2027*5113495bSYour Name  * from rx_mpdu_end TLV
2028*5113495bSYour Name  *
2029*5113495bSYour Name  * @buf: pointer to the start of RX PKT TLV headers
2030*5113495bSYour Name  * Return: uint32_t(decrypt_err)
2031*5113495bSYour Name  */
2032*5113495bSYour Name static inline uint32_t
hal_rx_tlv_decrypt_err_get_li(uint8_t * buf)2033*5113495bSYour Name hal_rx_tlv_decrypt_err_get_li(uint8_t *buf)
2034*5113495bSYour Name {
2035*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
2036*5113495bSYour Name 	struct rx_mpdu_end *mpdu_end =
2037*5113495bSYour Name 		&pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
2038*5113495bSYour Name 	uint32_t decrypt_err;
2039*5113495bSYour Name 
2040*5113495bSYour Name 	decrypt_err = HAL_RX_MPDU_END_DECRYPT_ERR_GET(mpdu_end);
2041*5113495bSYour Name 
2042*5113495bSYour Name 	return decrypt_err;
2043*5113495bSYour Name }
2044*5113495bSYour Name 
2045*5113495bSYour Name /**
2046*5113495bSYour Name  * hal_rx_tlv_mic_err_get_li() - API to get the MIC ERR
2047*5113495bSYour Name  * from rx_mpdu_end TLV
2048*5113495bSYour Name  *
2049*5113495bSYour Name  * @buf: pointer to the start of RX PKT TLV headers
2050*5113495bSYour Name  * Return: uint32_t(mic_err)
2051*5113495bSYour Name  */
2052*5113495bSYour Name static inline uint32_t
hal_rx_tlv_mic_err_get_li(uint8_t * buf)2053*5113495bSYour Name hal_rx_tlv_mic_err_get_li(uint8_t *buf)
2054*5113495bSYour Name {
2055*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
2056*5113495bSYour Name 	struct rx_mpdu_end *mpdu_end =
2057*5113495bSYour Name 		&pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
2058*5113495bSYour Name 	uint32_t mic_err;
2059*5113495bSYour Name 
2060*5113495bSYour Name 	mic_err = HAL_RX_MPDU_END_MIC_ERR_GET(mpdu_end);
2061*5113495bSYour Name 
2062*5113495bSYour Name 	return mic_err;
2063*5113495bSYour Name }
2064*5113495bSYour Name 
2065*5113495bSYour Name static
hal_rx_tlv_get_pkt_capture_flags_li(uint8_t * rx_tlv_pkt_hdr,struct hal_rx_pkt_capture_flags * flags)2066*5113495bSYour Name void hal_rx_tlv_get_pkt_capture_flags_li(uint8_t *rx_tlv_pkt_hdr,
2067*5113495bSYour Name 					 struct hal_rx_pkt_capture_flags *flags)
2068*5113495bSYour Name {
2069*5113495bSYour Name 	struct rx_pkt_tlvs *rx_tlv_hdr = (struct rx_pkt_tlvs *)rx_tlv_pkt_hdr;
2070*5113495bSYour Name 	struct rx_attention *rx_attn = &rx_tlv_hdr->attn_tlv.rx_attn;
2071*5113495bSYour Name 	struct rx_mpdu_start *mpdu_start =
2072*5113495bSYour Name 				&rx_tlv_hdr->mpdu_start_tlv.rx_mpdu_start;
2073*5113495bSYour Name 	struct rx_mpdu_end *mpdu_end = &rx_tlv_hdr->mpdu_end_tlv.rx_mpdu_end;
2074*5113495bSYour Name 	struct rx_msdu_start *msdu_start =
2075*5113495bSYour Name 				&rx_tlv_hdr->msdu_start_tlv.rx_msdu_start;
2076*5113495bSYour Name 
2077*5113495bSYour Name 	flags->encrypt_type = mpdu_start->rx_mpdu_info_details.encrypt_type;
2078*5113495bSYour Name 	flags->fcs_err = mpdu_end->fcs_err;
2079*5113495bSYour Name 	flags->fragment_flag = rx_attn->fragment_flag;
2080*5113495bSYour Name 	flags->chan_freq = HAL_RX_MSDU_START_FREQ_GET(msdu_start);
2081*5113495bSYour Name 	flags->rssi_comb = HAL_RX_MSDU_START_RSSI_GET(msdu_start);
2082*5113495bSYour Name 	flags->tsft = msdu_start->ppdu_start_timestamp;
2083*5113495bSYour Name }
2084*5113495bSYour Name 
2085*5113495bSYour Name static inline bool
hal_rx_mpdu_info_ampdu_flag_get_li(uint8_t * buf)2086*5113495bSYour Name hal_rx_mpdu_info_ampdu_flag_get_li(uint8_t *buf)
2087*5113495bSYour Name {
2088*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
2089*5113495bSYour Name 	struct rx_mpdu_start *mpdu_start =
2090*5113495bSYour Name 				 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
2091*5113495bSYour Name 
2092*5113495bSYour Name 	struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
2093*5113495bSYour Name 	bool ampdu_flag;
2094*5113495bSYour Name 
2095*5113495bSYour Name 	ampdu_flag = HAL_RX_MPDU_INFO_AMPDU_FLAG_GET(mpdu_info);
2096*5113495bSYour Name 
2097*5113495bSYour Name 	return ampdu_flag;
2098*5113495bSYour Name }
2099*5113495bSYour Name 
2100*5113495bSYour Name /**
2101*5113495bSYour Name  * hal_rx_tlv_get_pn_num_li() - Get packet number from RX TLV
2102*5113495bSYour Name  * @buf: rx tlv address
2103*5113495bSYour Name  * @pn_num: buffer to store packet number
2104*5113495bSYour Name  *
2105*5113495bSYour Name  * Return: None
2106*5113495bSYour Name  */
hal_rx_tlv_get_pn_num_li(uint8_t * buf,uint64_t * pn_num)2107*5113495bSYour Name static inline void hal_rx_tlv_get_pn_num_li(uint8_t *buf, uint64_t *pn_num)
2108*5113495bSYour Name {
2109*5113495bSYour Name 	struct rx_pkt_tlvs *rx_pkt_tlv =
2110*5113495bSYour Name 			(struct rx_pkt_tlvs *)buf;
2111*5113495bSYour Name 	struct rx_mpdu_info *rx_mpdu_info_details =
2112*5113495bSYour Name 	 &rx_pkt_tlv->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
2113*5113495bSYour Name 
2114*5113495bSYour Name 	pn_num[0] = rx_mpdu_info_details->pn_31_0;
2115*5113495bSYour Name 	pn_num[0] |=
2116*5113495bSYour Name 		((uint64_t)rx_mpdu_info_details->pn_63_32 << 32);
2117*5113495bSYour Name 	pn_num[1] = rx_mpdu_info_details->pn_95_64;
2118*5113495bSYour Name 	pn_num[1] |=
2119*5113495bSYour Name 		((uint64_t)rx_mpdu_info_details->pn_127_96 << 32);
2120*5113495bSYour Name }
2121*5113495bSYour Name 
2122*5113495bSYour Name /**
2123*5113495bSYour Name  * hal_rx_dump_mpdu_start_tlv_generic_li() - dump RX mpdu_start TLV in
2124*5113495bSYour Name  *			                     structured human readable
2125*5113495bSYour Name  *			                     format.
2126*5113495bSYour Name  * @pkttlvs: pointer to the pkttlvs.
2127*5113495bSYour Name  * @dbg_level: log level.
2128*5113495bSYour Name  *
2129*5113495bSYour Name  * Return: void
2130*5113495bSYour Name  */
2131*5113495bSYour Name static inline
hal_rx_dump_mpdu_start_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)2132*5113495bSYour Name void hal_rx_dump_mpdu_start_tlv_generic_li(void *pkttlvs,
2133*5113495bSYour Name 					   uint8_t dbg_level)
2134*5113495bSYour Name {
2135*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs;
2136*5113495bSYour Name 	struct rx_mpdu_start *mpdu_start =
2137*5113495bSYour Name 					&pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
2138*5113495bSYour Name 	struct rx_mpdu_info *mpdu_info =
2139*5113495bSYour Name 		(struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details;
2140*5113495bSYour Name 
2141*5113495bSYour Name 	hal_verbose_debug(
2142*5113495bSYour Name 			  "rx_mpdu_start tlv (1/5) - "
2143*5113495bSYour Name 			  "rxpcu_mpdu_filter_in_category: %x "
2144*5113495bSYour Name 			  "sw_frame_group_id: %x "
2145*5113495bSYour Name 			  "ndp_frame: %x "
2146*5113495bSYour Name 			  "phy_err: %x "
2147*5113495bSYour Name 			  "phy_err_during_mpdu_header: %x "
2148*5113495bSYour Name 			  "protocol_version_err: %x "
2149*5113495bSYour Name 			  "ast_based_lookup_valid: %x "
2150*5113495bSYour Name 			  "phy_ppdu_id: %x "
2151*5113495bSYour Name 			  "ast_index: %x "
2152*5113495bSYour Name 			  "sw_peer_id: %x "
2153*5113495bSYour Name 			  "mpdu_frame_control_valid: %x "
2154*5113495bSYour Name 			  "mpdu_duration_valid: %x "
2155*5113495bSYour Name 			  "mac_addr_ad1_valid: %x "
2156*5113495bSYour Name 			  "mac_addr_ad2_valid: %x "
2157*5113495bSYour Name 			  "mac_addr_ad3_valid: %x "
2158*5113495bSYour Name 			  "mac_addr_ad4_valid: %x "
2159*5113495bSYour Name 			  "mpdu_sequence_control_valid: %x "
2160*5113495bSYour Name 			  "mpdu_qos_control_valid: %x "
2161*5113495bSYour Name 			  "mpdu_ht_control_valid: %x "
2162*5113495bSYour Name 			  "frame_encryption_info_valid: %x ",
2163*5113495bSYour Name 			  mpdu_info->rxpcu_mpdu_filter_in_category,
2164*5113495bSYour Name 			  mpdu_info->sw_frame_group_id,
2165*5113495bSYour Name 			  mpdu_info->ndp_frame,
2166*5113495bSYour Name 			  mpdu_info->phy_err,
2167*5113495bSYour Name 			  mpdu_info->phy_err_during_mpdu_header,
2168*5113495bSYour Name 			  mpdu_info->protocol_version_err,
2169*5113495bSYour Name 			  mpdu_info->ast_based_lookup_valid,
2170*5113495bSYour Name 			  mpdu_info->phy_ppdu_id,
2171*5113495bSYour Name 			  mpdu_info->ast_index,
2172*5113495bSYour Name 			  mpdu_info->sw_peer_id,
2173*5113495bSYour Name 			  mpdu_info->mpdu_frame_control_valid,
2174*5113495bSYour Name 			  mpdu_info->mpdu_duration_valid,
2175*5113495bSYour Name 			  mpdu_info->mac_addr_ad1_valid,
2176*5113495bSYour Name 			  mpdu_info->mac_addr_ad2_valid,
2177*5113495bSYour Name 			  mpdu_info->mac_addr_ad3_valid,
2178*5113495bSYour Name 			  mpdu_info->mac_addr_ad4_valid,
2179*5113495bSYour Name 			  mpdu_info->mpdu_sequence_control_valid,
2180*5113495bSYour Name 			  mpdu_info->mpdu_qos_control_valid,
2181*5113495bSYour Name 			  mpdu_info->mpdu_ht_control_valid,
2182*5113495bSYour Name 			  mpdu_info->frame_encryption_info_valid);
2183*5113495bSYour Name 
2184*5113495bSYour Name 	hal_verbose_debug(
2185*5113495bSYour Name 			  "rx_mpdu_start tlv (2/5) - "
2186*5113495bSYour Name 			  "fr_ds: %x "
2187*5113495bSYour Name 			  "to_ds: %x "
2188*5113495bSYour Name 			  "encrypted: %x "
2189*5113495bSYour Name 			  "mpdu_retry: %x "
2190*5113495bSYour Name 			  "mpdu_sequence_number: %x "
2191*5113495bSYour Name 			  "epd_en: %x "
2192*5113495bSYour Name 			  "all_frames_shall_be_encrypted: %x "
2193*5113495bSYour Name 			  "encrypt_type: %x "
2194*5113495bSYour Name 			  "mesh_sta: %x "
2195*5113495bSYour Name 			  "bssid_hit: %x "
2196*5113495bSYour Name 			  "bssid_number: %x "
2197*5113495bSYour Name 			  "tid: %x "
2198*5113495bSYour Name 			  "pn_31_0: %x "
2199*5113495bSYour Name 			  "pn_63_32: %x "
2200*5113495bSYour Name 			  "pn_95_64: %x "
2201*5113495bSYour Name 			  "pn_127_96: %x "
2202*5113495bSYour Name 			  "peer_meta_data: %x "
2203*5113495bSYour Name 			  "rxpt_classify_info.reo_destination_indication: %x "
2204*5113495bSYour Name 			  "rxpt_classify_info.use_flow_id_toeplitz_clfy: %x "
2205*5113495bSYour Name 			  "rx_reo_queue_desc_addr_31_0: %x ",
2206*5113495bSYour Name 			  mpdu_info->fr_ds,
2207*5113495bSYour Name 			  mpdu_info->to_ds,
2208*5113495bSYour Name 			  mpdu_info->encrypted,
2209*5113495bSYour Name 			  mpdu_info->mpdu_retry,
2210*5113495bSYour Name 			  mpdu_info->mpdu_sequence_number,
2211*5113495bSYour Name 			  mpdu_info->epd_en,
2212*5113495bSYour Name 			  mpdu_info->all_frames_shall_be_encrypted,
2213*5113495bSYour Name 			  mpdu_info->encrypt_type,
2214*5113495bSYour Name 			  mpdu_info->mesh_sta,
2215*5113495bSYour Name 			  mpdu_info->bssid_hit,
2216*5113495bSYour Name 			  mpdu_info->bssid_number,
2217*5113495bSYour Name 			  mpdu_info->tid,
2218*5113495bSYour Name 			  mpdu_info->pn_31_0,
2219*5113495bSYour Name 			  mpdu_info->pn_63_32,
2220*5113495bSYour Name 			  mpdu_info->pn_95_64,
2221*5113495bSYour Name 			  mpdu_info->pn_127_96,
2222*5113495bSYour Name 			  mpdu_info->peer_meta_data,
2223*5113495bSYour Name 			  mpdu_info->rxpt_classify_info_details.reo_destination_indication,
2224*5113495bSYour Name 			  mpdu_info->rxpt_classify_info_details.use_flow_id_toeplitz_clfy,
2225*5113495bSYour Name 			  mpdu_info->rx_reo_queue_desc_addr_31_0);
2226*5113495bSYour Name 
2227*5113495bSYour Name 	hal_verbose_debug(
2228*5113495bSYour Name 			  "rx_mpdu_start tlv (3/5) - "
2229*5113495bSYour Name 			  "rx_reo_queue_desc_addr_39_32: %x "
2230*5113495bSYour Name 			  "receive_queue_number: %x "
2231*5113495bSYour Name 			  "pre_delim_err_warning: %x "
2232*5113495bSYour Name 			  "first_delim_err: %x "
2233*5113495bSYour Name 			  "key_id_octet: %x "
2234*5113495bSYour Name 			  "new_peer_entry: %x "
2235*5113495bSYour Name 			  "decrypt_needed: %x "
2236*5113495bSYour Name 			  "decap_type: %x "
2237*5113495bSYour Name 			  "rx_insert_vlan_c_tag_padding: %x "
2238*5113495bSYour Name 			  "rx_insert_vlan_s_tag_padding: %x "
2239*5113495bSYour Name 			  "strip_vlan_c_tag_decap: %x "
2240*5113495bSYour Name 			  "strip_vlan_s_tag_decap: %x "
2241*5113495bSYour Name 			  "pre_delim_count: %x "
2242*5113495bSYour Name 			  "ampdu_flag: %x "
2243*5113495bSYour Name 			  "bar_frame: %x "
2244*5113495bSYour Name 			  "mpdu_length: %x "
2245*5113495bSYour Name 			  "first_mpdu: %x "
2246*5113495bSYour Name 			  "mcast_bcast: %x "
2247*5113495bSYour Name 			  "ast_index_not_found: %x "
2248*5113495bSYour Name 			  "ast_index_timeout: %x ",
2249*5113495bSYour Name 			  mpdu_info->rx_reo_queue_desc_addr_39_32,
2250*5113495bSYour Name 			  mpdu_info->receive_queue_number,
2251*5113495bSYour Name 			  mpdu_info->pre_delim_err_warning,
2252*5113495bSYour Name 			  mpdu_info->first_delim_err,
2253*5113495bSYour Name 			  mpdu_info->key_id_octet,
2254*5113495bSYour Name 			  mpdu_info->new_peer_entry,
2255*5113495bSYour Name 			  mpdu_info->decrypt_needed,
2256*5113495bSYour Name 			  mpdu_info->decap_type,
2257*5113495bSYour Name 			  mpdu_info->rx_insert_vlan_c_tag_padding,
2258*5113495bSYour Name 			  mpdu_info->rx_insert_vlan_s_tag_padding,
2259*5113495bSYour Name 			  mpdu_info->strip_vlan_c_tag_decap,
2260*5113495bSYour Name 			  mpdu_info->strip_vlan_s_tag_decap,
2261*5113495bSYour Name 			  mpdu_info->pre_delim_count,
2262*5113495bSYour Name 			  mpdu_info->ampdu_flag,
2263*5113495bSYour Name 			  mpdu_info->bar_frame,
2264*5113495bSYour Name 			  mpdu_info->mpdu_length,
2265*5113495bSYour Name 			  mpdu_info->first_mpdu,
2266*5113495bSYour Name 			  mpdu_info->mcast_bcast,
2267*5113495bSYour Name 			  mpdu_info->ast_index_not_found,
2268*5113495bSYour Name 			  mpdu_info->ast_index_timeout);
2269*5113495bSYour Name 
2270*5113495bSYour Name 	hal_verbose_debug(
2271*5113495bSYour Name 			  "rx_mpdu_start tlv (4/5) - "
2272*5113495bSYour Name 			  "power_mgmt: %x "
2273*5113495bSYour Name 			  "non_qos: %x "
2274*5113495bSYour Name 			  "null_data: %x "
2275*5113495bSYour Name 			  "mgmt_type: %x "
2276*5113495bSYour Name 			  "ctrl_type: %x "
2277*5113495bSYour Name 			  "more_data: %x "
2278*5113495bSYour Name 			  "eosp: %x "
2279*5113495bSYour Name 			  "fragment_flag: %x "
2280*5113495bSYour Name 			  "order: %x "
2281*5113495bSYour Name 			  "u_apsd_trigger: %x "
2282*5113495bSYour Name 			  "encrypt_required: %x "
2283*5113495bSYour Name 			  "directed: %x "
2284*5113495bSYour Name 			  "mpdu_frame_control_field: %x "
2285*5113495bSYour Name 			  "mpdu_duration_field: %x "
2286*5113495bSYour Name 			  "mac_addr_ad1_31_0: %x "
2287*5113495bSYour Name 			  "mac_addr_ad1_47_32: %x "
2288*5113495bSYour Name 			  "mac_addr_ad2_15_0: %x "
2289*5113495bSYour Name 			  "mac_addr_ad2_47_16: %x "
2290*5113495bSYour Name 			  "mac_addr_ad3_31_0: %x "
2291*5113495bSYour Name 			  "mac_addr_ad3_47_32: %x ",
2292*5113495bSYour Name 			  mpdu_info->power_mgmt,
2293*5113495bSYour Name 			  mpdu_info->non_qos,
2294*5113495bSYour Name 			  mpdu_info->null_data,
2295*5113495bSYour Name 			  mpdu_info->mgmt_type,
2296*5113495bSYour Name 			  mpdu_info->ctrl_type,
2297*5113495bSYour Name 			  mpdu_info->more_data,
2298*5113495bSYour Name 			  mpdu_info->eosp,
2299*5113495bSYour Name 			  mpdu_info->fragment_flag,
2300*5113495bSYour Name 			  mpdu_info->order,
2301*5113495bSYour Name 			  mpdu_info->u_apsd_trigger,
2302*5113495bSYour Name 			  mpdu_info->encrypt_required,
2303*5113495bSYour Name 			  mpdu_info->directed,
2304*5113495bSYour Name 			  mpdu_info->mpdu_frame_control_field,
2305*5113495bSYour Name 			  mpdu_info->mpdu_duration_field,
2306*5113495bSYour Name 			  mpdu_info->mac_addr_ad1_31_0,
2307*5113495bSYour Name 			  mpdu_info->mac_addr_ad1_47_32,
2308*5113495bSYour Name 			  mpdu_info->mac_addr_ad2_15_0,
2309*5113495bSYour Name 			  mpdu_info->mac_addr_ad2_47_16,
2310*5113495bSYour Name 			  mpdu_info->mac_addr_ad3_31_0,
2311*5113495bSYour Name 			  mpdu_info->mac_addr_ad3_47_32);
2312*5113495bSYour Name 
2313*5113495bSYour Name 	hal_verbose_debug(
2314*5113495bSYour Name 			  "rx_mpdu_start tlv (5/5) - "
2315*5113495bSYour Name 			  "mpdu_sequence_control_field: %x "
2316*5113495bSYour Name 			  "mac_addr_ad4_31_0: %x "
2317*5113495bSYour Name 			  "mac_addr_ad4_47_32: %x "
2318*5113495bSYour Name 			  "mpdu_qos_control_field: %x "
2319*5113495bSYour Name 			  "mpdu_ht_control_field: %x ",
2320*5113495bSYour Name 			  mpdu_info->mpdu_sequence_control_field,
2321*5113495bSYour Name 			  mpdu_info->mac_addr_ad4_31_0,
2322*5113495bSYour Name 			  mpdu_info->mac_addr_ad4_47_32,
2323*5113495bSYour Name 			  mpdu_info->mpdu_qos_control_field,
2324*5113495bSYour Name 			  mpdu_info->mpdu_ht_control_field);
2325*5113495bSYour Name }
2326*5113495bSYour Name 
2327*5113495bSYour Name /**
2328*5113495bSYour Name  * hal_tx_set_pcp_tid_map_generic_li() - Configure default PCP to TID map table
2329*5113495bSYour Name  * @soc: HAL SoC context
2330*5113495bSYour Name  * @map: PCP-TID mapping table
2331*5113495bSYour Name  *
2332*5113495bSYour Name  * PCP are mapped to 8 TID values using TID values programmed
2333*5113495bSYour Name  * in one set of mapping registers PCP_TID_MAP_<0 to 6>
2334*5113495bSYour Name  * The mapping register has TID mapping for 8 PCP values
2335*5113495bSYour Name  *
2336*5113495bSYour Name  * Return: none
2337*5113495bSYour Name  */
hal_tx_set_pcp_tid_map_generic_li(struct hal_soc * soc,uint8_t * map)2338*5113495bSYour Name static void hal_tx_set_pcp_tid_map_generic_li(struct hal_soc *soc, uint8_t *map)
2339*5113495bSYour Name {
2340*5113495bSYour Name 	uint32_t addr, value;
2341*5113495bSYour Name 
2342*5113495bSYour Name 	addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR(
2343*5113495bSYour Name 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET);
2344*5113495bSYour Name 
2345*5113495bSYour Name 	value = (map[0] |
2346*5113495bSYour Name 		(map[1] << HWIO_TCL_R0_PCP_TID_MAP_PCP_1_SHFT) |
2347*5113495bSYour Name 		(map[2] << HWIO_TCL_R0_PCP_TID_MAP_PCP_2_SHFT) |
2348*5113495bSYour Name 		(map[3] << HWIO_TCL_R0_PCP_TID_MAP_PCP_3_SHFT) |
2349*5113495bSYour Name 		(map[4] << HWIO_TCL_R0_PCP_TID_MAP_PCP_4_SHFT) |
2350*5113495bSYour Name 		(map[5] << HWIO_TCL_R0_PCP_TID_MAP_PCP_5_SHFT) |
2351*5113495bSYour Name 		(map[6] << HWIO_TCL_R0_PCP_TID_MAP_PCP_6_SHFT) |
2352*5113495bSYour Name 		(map[7] << HWIO_TCL_R0_PCP_TID_MAP_PCP_7_SHFT));
2353*5113495bSYour Name 
2354*5113495bSYour Name 	HAL_REG_WRITE(soc, addr, (value & HWIO_TCL_R0_PCP_TID_MAP_RMSK));
2355*5113495bSYour Name }
2356*5113495bSYour Name 
2357*5113495bSYour Name /**
2358*5113495bSYour Name  * hal_tx_update_pcp_tid_generic_li() - Update the pcp tid map table with
2359*5113495bSYour Name  *					value received from user-space
2360*5113495bSYour Name  * @soc: HAL SoC context
2361*5113495bSYour Name  * @pcp: pcp value
2362*5113495bSYour Name  * @tid : tid value
2363*5113495bSYour Name  *
2364*5113495bSYour Name  * Return: void
2365*5113495bSYour Name  */
2366*5113495bSYour Name static void
hal_tx_update_pcp_tid_generic_li(struct hal_soc * soc,uint8_t pcp,uint8_t tid)2367*5113495bSYour Name hal_tx_update_pcp_tid_generic_li(struct hal_soc *soc,
2368*5113495bSYour Name 				 uint8_t pcp, uint8_t tid)
2369*5113495bSYour Name {
2370*5113495bSYour Name 	uint32_t addr, value, regval;
2371*5113495bSYour Name 
2372*5113495bSYour Name 	addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR(
2373*5113495bSYour Name 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET);
2374*5113495bSYour Name 
2375*5113495bSYour Name 	value = (uint32_t)tid << (HAL_TX_BITS_PER_TID * pcp);
2376*5113495bSYour Name 
2377*5113495bSYour Name 	/* Read back previous PCP TID config and update
2378*5113495bSYour Name 	 * with new config.
2379*5113495bSYour Name 	 */
2380*5113495bSYour Name 	regval = HAL_REG_READ(soc, addr);
2381*5113495bSYour Name 	regval &= ~(HAL_TX_TID_BITS_MASK << (HAL_TX_BITS_PER_TID * pcp));
2382*5113495bSYour Name 	regval |= value;
2383*5113495bSYour Name 
2384*5113495bSYour Name 	HAL_REG_WRITE(soc, addr,
2385*5113495bSYour Name 		      (regval & HWIO_TCL_R0_PCP_TID_MAP_RMSK));
2386*5113495bSYour Name }
2387*5113495bSYour Name 
2388*5113495bSYour Name /**
2389*5113495bSYour Name  * hal_tx_update_tidmap_prty_generic_li() - Update the tid map priority
2390*5113495bSYour Name  * @soc: HAL SoC context
2391*5113495bSYour Name  * @value: priority value
2392*5113495bSYour Name  *
2393*5113495bSYour Name  * Return: void
2394*5113495bSYour Name  */
2395*5113495bSYour Name static
hal_tx_update_tidmap_prty_generic_li(struct hal_soc * soc,uint8_t value)2396*5113495bSYour Name void hal_tx_update_tidmap_prty_generic_li(struct hal_soc *soc, uint8_t value)
2397*5113495bSYour Name {
2398*5113495bSYour Name 	uint32_t addr;
2399*5113495bSYour Name 
2400*5113495bSYour Name 	addr = HWIO_TCL_R0_TID_MAP_PRTY_ADDR(
2401*5113495bSYour Name 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET);
2402*5113495bSYour Name 
2403*5113495bSYour Name 	HAL_REG_WRITE(soc, addr,
2404*5113495bSYour Name 		      (value & HWIO_TCL_R0_TID_MAP_PRTY_RMSK));
2405*5113495bSYour Name }
2406*5113495bSYour Name 
2407*5113495bSYour Name /**
2408*5113495bSYour Name  * hal_rx_msdu_packet_metadata_get_generic_li() - API to get the msdu
2409*5113495bSYour Name  *                                                information from
2410*5113495bSYour Name  *                                                rx_msdu_end TLV
2411*5113495bSYour Name  * @buf: pointer to the start of RX PKT TLV headers
2412*5113495bSYour Name  * @pkt_msdu_metadata: pointer to the msdu info structure
2413*5113495bSYour Name  */
2414*5113495bSYour Name static void
hal_rx_msdu_packet_metadata_get_generic_li(uint8_t * buf,void * pkt_msdu_metadata)2415*5113495bSYour Name hal_rx_msdu_packet_metadata_get_generic_li(uint8_t *buf,
2416*5113495bSYour Name 					   void *pkt_msdu_metadata)
2417*5113495bSYour Name {
2418*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
2419*5113495bSYour Name 	struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
2420*5113495bSYour Name 	struct hal_rx_msdu_metadata *msdu_metadata =
2421*5113495bSYour Name 		(struct hal_rx_msdu_metadata *)pkt_msdu_metadata;
2422*5113495bSYour Name 
2423*5113495bSYour Name 	msdu_metadata->l3_hdr_pad =
2424*5113495bSYour Name 		HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end);
2425*5113495bSYour Name 	msdu_metadata->sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end);
2426*5113495bSYour Name 	msdu_metadata->da_idx = HAL_RX_MSDU_END_DA_IDX_GET(msdu_end);
2427*5113495bSYour Name 	msdu_metadata->sa_sw_peer_id =
2428*5113495bSYour Name 		HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end);
2429*5113495bSYour Name }
2430*5113495bSYour Name 
2431*5113495bSYour Name /**
2432*5113495bSYour Name  * hal_rx_msdu_end_offset_get_generic() - API to get the
2433*5113495bSYour Name  * msdu_end structure offset rx_pkt_tlv structure
2434*5113495bSYour Name  *
2435*5113495bSYour Name  * NOTE: API returns offset of msdu_end TLV from structure
2436*5113495bSYour Name  * rx_pkt_tlvs
2437*5113495bSYour Name  */
hal_rx_msdu_end_offset_get_generic(void)2438*5113495bSYour Name static uint32_t hal_rx_msdu_end_offset_get_generic(void)
2439*5113495bSYour Name {
2440*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(msdu_end_tlv);
2441*5113495bSYour Name }
2442*5113495bSYour Name 
2443*5113495bSYour Name /**
2444*5113495bSYour Name  * hal_rx_attn_offset_get_generic() - API to get the
2445*5113495bSYour Name  * msdu_end structure offset rx_pkt_tlv structure
2446*5113495bSYour Name  *
2447*5113495bSYour Name  * NOTE: API returns offset of attn TLV from structure
2448*5113495bSYour Name  * rx_pkt_tlvs
2449*5113495bSYour Name  */
hal_rx_attn_offset_get_generic(void)2450*5113495bSYour Name static uint32_t hal_rx_attn_offset_get_generic(void)
2451*5113495bSYour Name {
2452*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(attn_tlv);
2453*5113495bSYour Name }
2454*5113495bSYour Name 
2455*5113495bSYour Name /**
2456*5113495bSYour Name  * hal_rx_msdu_start_offset_get_generic() - API to get the
2457*5113495bSYour Name  * msdu_start structure offset rx_pkt_tlv structure
2458*5113495bSYour Name  *
2459*5113495bSYour Name  * NOTE: API returns offset of attn TLV from structure
2460*5113495bSYour Name  * rx_pkt_tlvs
2461*5113495bSYour Name  */
hal_rx_msdu_start_offset_get_generic(void)2462*5113495bSYour Name static uint32_t hal_rx_msdu_start_offset_get_generic(void)
2463*5113495bSYour Name {
2464*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(msdu_start_tlv);
2465*5113495bSYour Name }
2466*5113495bSYour Name 
2467*5113495bSYour Name /**
2468*5113495bSYour Name  * hal_rx_mpdu_start_offset_get_generic() - API to get the
2469*5113495bSYour Name  * mpdu_start structure offset rx_pkt_tlv structure
2470*5113495bSYour Name  *
2471*5113495bSYour Name  * NOTE: API returns offset of attn TLV from structure
2472*5113495bSYour Name  * rx_pkt_tlvs
2473*5113495bSYour Name  */
hal_rx_mpdu_start_offset_get_generic(void)2474*5113495bSYour Name static uint32_t hal_rx_mpdu_start_offset_get_generic(void)
2475*5113495bSYour Name {
2476*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(mpdu_start_tlv);
2477*5113495bSYour Name }
2478*5113495bSYour Name 
2479*5113495bSYour Name /**
2480*5113495bSYour Name  * hal_rx_mpdu_end_offset_get_generic() - API to get the
2481*5113495bSYour Name  * mpdu_end structure offset rx_pkt_tlv structure
2482*5113495bSYour Name  *
2483*5113495bSYour Name  * NOTE: API returns offset of attn TLV from structure
2484*5113495bSYour Name  * rx_pkt_tlvs
2485*5113495bSYour Name  */
hal_rx_mpdu_end_offset_get_generic(void)2486*5113495bSYour Name static uint32_t hal_rx_mpdu_end_offset_get_generic(void)
2487*5113495bSYour Name {
2488*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(mpdu_end_tlv);
2489*5113495bSYour Name }
2490*5113495bSYour Name 
2491*5113495bSYour Name #ifndef NO_RX_PKT_HDR_TLV
hal_rx_pkt_tlv_offset_get_generic(void)2492*5113495bSYour Name static uint32_t hal_rx_pkt_tlv_offset_get_generic(void)
2493*5113495bSYour Name {
2494*5113495bSYour Name 	return RX_PKT_TLV_OFFSET(pkt_hdr_tlv);
2495*5113495bSYour Name }
2496*5113495bSYour Name #endif
2497*5113495bSYour Name 
2498*5113495bSYour Name #if defined(QDF_BIG_ENDIAN_MACHINE)
2499*5113495bSYour Name /**
2500*5113495bSYour Name  * hal_setup_reo_swap() - Set the swap flag for big endian machines
2501*5113495bSYour Name  * @soc: HAL soc handle
2502*5113495bSYour Name  *
2503*5113495bSYour Name  * Return: None
2504*5113495bSYour Name  */
hal_setup_reo_swap(struct hal_soc * soc)2505*5113495bSYour Name static inline void hal_setup_reo_swap(struct hal_soc *soc)
2506*5113495bSYour Name {
2507*5113495bSYour Name 	uint32_t reg_val;
2508*5113495bSYour Name 
2509*5113495bSYour Name 	reg_val = HAL_REG_READ(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR(
2510*5113495bSYour Name 		SEQ_WCSS_UMAC_REO_REG_OFFSET));
2511*5113495bSYour Name 
2512*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, WRITE_STRUCT_SWAP, 1);
2513*5113495bSYour Name 	reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, READ_STRUCT_SWAP, 1);
2514*5113495bSYour Name 
2515*5113495bSYour Name 	HAL_REG_WRITE(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR(
2516*5113495bSYour Name 		SEQ_WCSS_UMAC_REO_REG_OFFSET), reg_val);
2517*5113495bSYour Name }
2518*5113495bSYour Name #else
hal_setup_reo_swap(struct hal_soc * soc)2519*5113495bSYour Name static inline void hal_setup_reo_swap(struct hal_soc *soc)
2520*5113495bSYour Name {
2521*5113495bSYour Name }
2522*5113495bSYour Name #endif
2523*5113495bSYour Name 
2524*5113495bSYour Name /**
2525*5113495bSYour Name  * hal_reo_setup_generic_li() - Initialize HW REO block
2526*5113495bSYour Name  * @soc: Opaque HAL SOC handle
2527*5113495bSYour Name  * @reoparams: parameters needed by HAL for REO config
2528*5113495bSYour Name  * @qref_reset: reset qref
2529*5113495bSYour Name  */
2530*5113495bSYour Name static
hal_reo_setup_generic_li(struct hal_soc * soc,void * reoparams,int qref_reset)2531*5113495bSYour Name void hal_reo_setup_generic_li(struct hal_soc *soc, void *reoparams,
2532*5113495bSYour Name 			      int qref_reset)
2533*5113495bSYour Name {
2534*5113495bSYour Name 	uint32_t reg_val;
2535*5113495bSYour Name 	struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams;
2536*5113495bSYour Name 
2537*5113495bSYour Name 	reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR(
2538*5113495bSYour Name 		SEQ_WCSS_UMAC_REO_REG_OFFSET));
2539*5113495bSYour Name 
2540*5113495bSYour Name 	hal_reo_config(soc, reg_val, reo_params);
2541*5113495bSYour Name 	/* Other ring enable bits and REO_ENABLE will be set by FW */
2542*5113495bSYour Name 
2543*5113495bSYour Name 	/* TODO: Setup destination ring mapping if enabled */
2544*5113495bSYour Name 
2545*5113495bSYour Name 	/* TODO: Error destination ring setting is left to default.
2546*5113495bSYour Name 	 * Default setting is to send all errors to release ring.
2547*5113495bSYour Name 	 */
2548*5113495bSYour Name 
2549*5113495bSYour Name 	/* Set the reo descriptor swap bits in case of BIG endian platform */
2550*5113495bSYour Name 	hal_setup_reo_swap(soc);
2551*5113495bSYour Name 
2552*5113495bSYour Name 	HAL_REG_WRITE(soc,
2553*5113495bSYour Name 		      HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(
2554*5113495bSYour Name 		      SEQ_WCSS_UMAC_REO_REG_OFFSET),
2555*5113495bSYour Name 		      HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000);
2556*5113495bSYour Name 
2557*5113495bSYour Name 	HAL_REG_WRITE(soc,
2558*5113495bSYour Name 		      HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(
2559*5113495bSYour Name 		      SEQ_WCSS_UMAC_REO_REG_OFFSET),
2560*5113495bSYour Name 		      (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
2561*5113495bSYour Name 
2562*5113495bSYour Name 	HAL_REG_WRITE(soc,
2563*5113495bSYour Name 		      HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(
2564*5113495bSYour Name 		      SEQ_WCSS_UMAC_REO_REG_OFFSET),
2565*5113495bSYour Name 		      (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
2566*5113495bSYour Name 
2567*5113495bSYour Name 	HAL_REG_WRITE(soc,
2568*5113495bSYour Name 		      HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(
2569*5113495bSYour Name 		      SEQ_WCSS_UMAC_REO_REG_OFFSET),
2570*5113495bSYour Name 		      (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000));
2571*5113495bSYour Name 
2572*5113495bSYour Name 	/*
2573*5113495bSYour Name 	 * When hash based routing is enabled, routing of the rx packet
2574*5113495bSYour Name 	 * is done based on the following value: 1 _ _ _ _ The last 4
2575*5113495bSYour Name 	 * bits are based on hash[3:0]. This means the possible values
2576*5113495bSYour Name 	 * are 0x10 to 0x1f. This value is used to look-up the
2577*5113495bSYour Name 	 * ring ID configured in Destination_Ring_Ctrl_IX_* register.
2578*5113495bSYour Name 	 * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3
2579*5113495bSYour Name 	 * registers need to be configured to set-up the 16 entries to
2580*5113495bSYour Name 	 * map the hash values to a ring number. There are 3 bits per
2581*5113495bSYour Name 	 * hash entry – which are mapped as follows:
2582*5113495bSYour Name 	 * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI),
2583*5113495bSYour Name 	 * 7: NOT_USED.
2584*5113495bSYour Name 	 */
2585*5113495bSYour Name 	if (reo_params->rx_hash_enabled) {
2586*5113495bSYour Name 		if (reo_params->remap0)
2587*5113495bSYour Name 			HAL_REG_WRITE(soc,
2588*5113495bSYour Name 				      HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR(
2589*5113495bSYour Name 				      SEQ_WCSS_UMAC_REO_REG_OFFSET),
2590*5113495bSYour Name 				      reo_params->remap0);
2591*5113495bSYour Name 
2592*5113495bSYour Name 		hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR 0x%x",
2593*5113495bSYour Name 			  HAL_REG_READ(soc,
2594*5113495bSYour Name 				       HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR(
2595*5113495bSYour Name 				       SEQ_WCSS_UMAC_REO_REG_OFFSET)));
2596*5113495bSYour Name 
2597*5113495bSYour Name 		HAL_REG_WRITE(soc,
2598*5113495bSYour Name 			      HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
2599*5113495bSYour Name 			      SEQ_WCSS_UMAC_REO_REG_OFFSET),
2600*5113495bSYour Name 			      reo_params->remap1);
2601*5113495bSYour Name 
2602*5113495bSYour Name 		hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x",
2603*5113495bSYour Name 			  HAL_REG_READ(soc,
2604*5113495bSYour Name 				       HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
2605*5113495bSYour Name 				       SEQ_WCSS_UMAC_REO_REG_OFFSET)));
2606*5113495bSYour Name 
2607*5113495bSYour Name 		HAL_REG_WRITE(soc,
2608*5113495bSYour Name 			      HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
2609*5113495bSYour Name 			      SEQ_WCSS_UMAC_REO_REG_OFFSET),
2610*5113495bSYour Name 			      reo_params->remap2);
2611*5113495bSYour Name 
2612*5113495bSYour Name 		hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x",
2613*5113495bSYour Name 			  HAL_REG_READ(soc,
2614*5113495bSYour Name 				       HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
2615*5113495bSYour Name 				       SEQ_WCSS_UMAC_REO_REG_OFFSET)));
2616*5113495bSYour Name 	}
2617*5113495bSYour Name 
2618*5113495bSYour Name 	/* TODO: Check if the following registers shoould be setup by host:
2619*5113495bSYour Name 	 * AGING_CONTROL
2620*5113495bSYour Name 	 * HIGH_MEMORY_THRESHOLD
2621*5113495bSYour Name 	 * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2]
2622*5113495bSYour Name 	 * GLOBAL_LINK_DESC_COUNT_CTRL
2623*5113495bSYour Name 	 */
2624*5113495bSYour Name }
2625*5113495bSYour Name 
2626*5113495bSYour Name /**
2627*5113495bSYour Name  * hal_setup_link_idle_list_generic_li() - Setup scattered idle list
2628*5113495bSYour Name  *                                         using the buffer list provided
2629*5113495bSYour Name  * @soc: Opaque HAL SOC handle
2630*5113495bSYour Name  * @scatter_bufs_base_paddr: Array of physical base addresses
2631*5113495bSYour Name  * @scatter_bufs_base_vaddr: Array of virtual base addresses
2632*5113495bSYour Name  * @num_scatter_bufs: Number of scatter buffers in the above lists
2633*5113495bSYour Name  * @scatter_buf_size: Size of each scatter buffer
2634*5113495bSYour Name  * @last_buf_end_offset: Offset to the last entry
2635*5113495bSYour Name  * @num_entries: Total entries of all scatter bufs
2636*5113495bSYour Name  *
2637*5113495bSYour Name  * Return: None
2638*5113495bSYour Name  */
2639*5113495bSYour Name static void
hal_setup_link_idle_list_generic_li(struct hal_soc * soc,qdf_dma_addr_t scatter_bufs_base_paddr[],void * scatter_bufs_base_vaddr[],uint32_t num_scatter_bufs,uint32_t scatter_buf_size,uint32_t last_buf_end_offset,uint32_t num_entries)2640*5113495bSYour Name hal_setup_link_idle_list_generic_li(struct hal_soc *soc,
2641*5113495bSYour Name 				    qdf_dma_addr_t scatter_bufs_base_paddr[],
2642*5113495bSYour Name 				    void *scatter_bufs_base_vaddr[],
2643*5113495bSYour Name 				    uint32_t num_scatter_bufs,
2644*5113495bSYour Name 				    uint32_t scatter_buf_size,
2645*5113495bSYour Name 				    uint32_t last_buf_end_offset,
2646*5113495bSYour Name 				    uint32_t num_entries)
2647*5113495bSYour Name {
2648*5113495bSYour Name 	int i;
2649*5113495bSYour Name 	uint32_t *prev_buf_link_ptr = NULL;
2650*5113495bSYour Name 	uint32_t reg_scatter_buf_size, reg_tot_scatter_buf_size;
2651*5113495bSYour Name 	uint32_t val;
2652*5113495bSYour Name 
2653*5113495bSYour Name 	/* Link the scatter buffers */
2654*5113495bSYour Name 	for (i = 0; i < num_scatter_bufs; i++) {
2655*5113495bSYour Name 		if (i > 0) {
2656*5113495bSYour Name 			prev_buf_link_ptr[0] =
2657*5113495bSYour Name 				scatter_bufs_base_paddr[i] & 0xffffffff;
2658*5113495bSYour Name 			prev_buf_link_ptr[1] = HAL_SM(
2659*5113495bSYour Name 				HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
2660*5113495bSYour Name 				BASE_ADDRESS_39_32,
2661*5113495bSYour Name 				((uint64_t)(scatter_bufs_base_paddr[i])
2662*5113495bSYour Name 				 >> 32)) | HAL_SM(
2663*5113495bSYour Name 				HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
2664*5113495bSYour Name 				ADDRESS_MATCH_TAG,
2665*5113495bSYour Name 				ADDRESS_MATCH_TAG_VAL);
2666*5113495bSYour Name 		}
2667*5113495bSYour Name 		prev_buf_link_ptr = (uint32_t *)(scatter_bufs_base_vaddr[i] +
2668*5113495bSYour Name 			scatter_buf_size - WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE);
2669*5113495bSYour Name 	}
2670*5113495bSYour Name 
2671*5113495bSYour Name 	/* TBD: Register programming partly based on MLD & the rest based on
2672*5113495bSYour Name 	 * inputs from HW team. Not complete yet.
2673*5113495bSYour Name 	 */
2674*5113495bSYour Name 
2675*5113495bSYour Name 	reg_scatter_buf_size = (scatter_buf_size -
2676*5113495bSYour Name 				WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) / 64;
2677*5113495bSYour Name 	reg_tot_scatter_buf_size = ((scatter_buf_size -
2678*5113495bSYour Name 		WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) * num_scatter_bufs) / 64;
2679*5113495bSYour Name 
2680*5113495bSYour Name 	HAL_REG_WRITE(soc,
2681*5113495bSYour Name 		      HWIO_WBM_R0_IDLE_LIST_CONTROL_ADDR
2682*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2683*5113495bSYour Name 		      HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL,
2684*5113495bSYour Name 			     SCATTER_BUFFER_SIZE,
2685*5113495bSYour Name 			     reg_scatter_buf_size) |
2686*5113495bSYour Name 		      HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL,
2687*5113495bSYour Name 			     LINK_DESC_IDLE_LIST_MODE, 0x1));
2688*5113495bSYour Name 
2689*5113495bSYour Name 	HAL_REG_WRITE(soc,
2690*5113495bSYour Name 		      HWIO_WBM_R0_IDLE_LIST_SIZE_ADDR
2691*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2692*5113495bSYour Name 		      HAL_SM(HWIO_WBM_R0_IDLE_LIST_SIZE,
2693*5113495bSYour Name 			     SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST,
2694*5113495bSYour Name 			     reg_tot_scatter_buf_size));
2695*5113495bSYour Name 
2696*5113495bSYour Name 	HAL_REG_WRITE(soc,
2697*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_LSB_ADDR
2698*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2699*5113495bSYour Name 		      scatter_bufs_base_paddr[0] & 0xffffffff);
2700*5113495bSYour Name 
2701*5113495bSYour Name 	HAL_REG_WRITE(soc,
2702*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR
2703*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2704*5113495bSYour Name 		      ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32) &
2705*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_BASE_ADDRESS_39_32_BMSK);
2706*5113495bSYour Name 
2707*5113495bSYour Name 	HAL_REG_WRITE(soc,
2708*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR
2709*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2710*5113495bSYour Name 		      HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
2711*5113495bSYour Name 			     BASE_ADDRESS_39_32,
2712*5113495bSYour Name 			     ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32)) |
2713*5113495bSYour Name 		      HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
2714*5113495bSYour Name 			     ADDRESS_MATCH_TAG, ADDRESS_MATCH_TAG_VAL));
2715*5113495bSYour Name 
2716*5113495bSYour Name 	/* ADDRESS_MATCH_TAG field in the above register is expected to match
2717*5113495bSYour Name 	 * with the upper bits of link pointer. The above write sets this field
2718*5113495bSYour Name 	 * to zero and we are also setting the upper bits of link pointers to
2719*5113495bSYour Name 	 * zero while setting up the link list of scatter buffers above
2720*5113495bSYour Name 	 */
2721*5113495bSYour Name 
2722*5113495bSYour Name 	/* Setup head and tail pointers for the idle list */
2723*5113495bSYour Name 	HAL_REG_WRITE(soc,
2724*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR
2725*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2726*5113495bSYour Name 		      scatter_bufs_base_paddr[num_scatter_bufs - 1] &
2727*5113495bSYour Name 		      0xffffffff);
2728*5113495bSYour Name 	HAL_REG_WRITE(soc,
2729*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1_ADDR
2730*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2731*5113495bSYour Name 		      HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
2732*5113495bSYour Name 			     BUFFER_ADDRESS_39_32,
2733*5113495bSYour Name 			     ((uint64_t)(scatter_bufs_base_paddr
2734*5113495bSYour Name 				     [num_scatter_bufs - 1]) >> 32)) |
2735*5113495bSYour Name 		      HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
2736*5113495bSYour Name 			     HEAD_POINTER_OFFSET, last_buf_end_offset >> 2));
2737*5113495bSYour Name 
2738*5113495bSYour Name 	HAL_REG_WRITE(soc,
2739*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR
2740*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2741*5113495bSYour Name 		      scatter_bufs_base_paddr[0] & 0xffffffff);
2742*5113495bSYour Name 
2743*5113495bSYour Name 	HAL_REG_WRITE(soc,
2744*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX0_ADDR
2745*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2746*5113495bSYour Name 		      scatter_bufs_base_paddr[0] & 0xffffffff);
2747*5113495bSYour Name 	HAL_REG_WRITE(soc,
2748*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1_ADDR
2749*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2750*5113495bSYour Name 		      HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
2751*5113495bSYour Name 			     BUFFER_ADDRESS_39_32,
2752*5113495bSYour Name 			     ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32)) |
2753*5113495bSYour Name 		      HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
2754*5113495bSYour Name 			     TAIL_POINTER_OFFSET, 0));
2755*5113495bSYour Name 
2756*5113495bSYour Name 	HAL_REG_WRITE(soc,
2757*5113495bSYour Name 		      HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HP_ADDR
2758*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2 * num_entries);
2759*5113495bSYour Name 
2760*5113495bSYour Name 	/* Set RING_ID_DISABLE */
2761*5113495bSYour Name 	val = HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, RING_ID_DISABLE, 1);
2762*5113495bSYour Name 
2763*5113495bSYour Name 	/*
2764*5113495bSYour Name 	 * SRNG_ENABLE bit is not available in HWK v1 (QCA8074v1). Hence
2765*5113495bSYour Name 	 * check the presence of the bit before toggling it.
2766*5113495bSYour Name 	 */
2767*5113495bSYour Name #ifdef HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE_BMSK
2768*5113495bSYour Name 	val |= HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, SRNG_ENABLE, 1);
2769*5113495bSYour Name #endif
2770*5113495bSYour Name 	HAL_REG_WRITE(soc,
2771*5113495bSYour Name 		      HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_ADDR
2772*5113495bSYour Name 		      (SEQ_WCSS_UMAC_WBM_REG_OFFSET),
2773*5113495bSYour Name 		      val);
2774*5113495bSYour Name }
2775*5113495bSYour Name 
2776*5113495bSYour Name #ifdef TCL_DATA_CMD_2_SEARCH_TYPE_OFFSET
2777*5113495bSYour Name /**
2778*5113495bSYour Name  * hal_tx_desc_set_search_type_generic_li() - Set the search type value
2779*5113495bSYour Name  * @desc: Handle to Tx Descriptor
2780*5113495bSYour Name  * @search_type: search type
2781*5113495bSYour Name  *		     0 – Normal search
2782*5113495bSYour Name  *		     1 – Index based address search
2783*5113495bSYour Name  *		     2 – Index based flow search
2784*5113495bSYour Name  *
2785*5113495bSYour Name  * Return: void
2786*5113495bSYour Name  */
2787*5113495bSYour Name static inline
hal_tx_desc_set_search_type_generic_li(void * desc,uint8_t search_type)2788*5113495bSYour Name void hal_tx_desc_set_search_type_generic_li(void *desc, uint8_t search_type)
2789*5113495bSYour Name {
2790*5113495bSYour Name 	HAL_SET_FLD(desc, TCL_DATA_CMD_2, SEARCH_TYPE) |=
2791*5113495bSYour Name 		HAL_TX_SM(TCL_DATA_CMD_2, SEARCH_TYPE, search_type);
2792*5113495bSYour Name }
2793*5113495bSYour Name #else
2794*5113495bSYour Name static inline
hal_tx_desc_set_search_type_generic_li(void * desc,uint8_t search_type)2795*5113495bSYour Name void hal_tx_desc_set_search_type_generic_li(void *desc, uint8_t search_type)
2796*5113495bSYour Name {
2797*5113495bSYour Name }
2798*5113495bSYour Name 
2799*5113495bSYour Name #endif
2800*5113495bSYour Name 
2801*5113495bSYour Name #ifdef TCL_DATA_CMD_5_SEARCH_INDEX_OFFSET
2802*5113495bSYour Name /**
2803*5113495bSYour Name  * hal_tx_desc_set_search_index_generic_li() - Set the search index value
2804*5113495bSYour Name  * @desc: Handle to Tx Descriptor
2805*5113495bSYour Name  * @search_index: The index that will be used for index based address or
2806*5113495bSYour Name  *                flow search. The field is valid when 'search_type' is
2807*5113495bSYour Name  *                1 0r 2
2808*5113495bSYour Name  *
2809*5113495bSYour Name  * Return: void
2810*5113495bSYour Name  */
2811*5113495bSYour Name static inline
hal_tx_desc_set_search_index_generic_li(void * desc,uint32_t search_index)2812*5113495bSYour Name void hal_tx_desc_set_search_index_generic_li(void *desc, uint32_t search_index)
2813*5113495bSYour Name {
2814*5113495bSYour Name 	HAL_SET_FLD(desc, TCL_DATA_CMD_5, SEARCH_INDEX) |=
2815*5113495bSYour Name 		HAL_TX_SM(TCL_DATA_CMD_5, SEARCH_INDEX, search_index);
2816*5113495bSYour Name }
2817*5113495bSYour Name #else
2818*5113495bSYour Name static inline
hal_tx_desc_set_search_index_generic_li(void * desc,uint32_t search_index)2819*5113495bSYour Name void hal_tx_desc_set_search_index_generic_li(void *desc, uint32_t search_index)
2820*5113495bSYour Name {
2821*5113495bSYour Name }
2822*5113495bSYour Name #endif
2823*5113495bSYour Name 
2824*5113495bSYour Name #ifdef TCL_DATA_CMD_5_CACHE_SET_NUM_OFFSET
2825*5113495bSYour Name /**
2826*5113495bSYour Name  * hal_tx_desc_set_cache_set_num_generic_li() - Set the cache-set-num value
2827*5113495bSYour Name  * @desc: Handle to Tx Descriptor
2828*5113495bSYour Name  * @cache_num: Cache set number that should be used to cache the index
2829*5113495bSYour Name  *                based search results, for address and flow search.
2830*5113495bSYour Name  *                This value should be equal to LSB four bits of the hash value
2831*5113495bSYour Name  *                of match data, in case of search index points to an entry
2832*5113495bSYour Name  *                which may be used in content based search also. The value can
2833*5113495bSYour Name  *                be anything when the entry pointed by search index will not be
2834*5113495bSYour Name  *                used for content based search.
2835*5113495bSYour Name  *
2836*5113495bSYour Name  * Return: void
2837*5113495bSYour Name  */
2838*5113495bSYour Name static inline
hal_tx_desc_set_cache_set_num_generic_li(void * desc,uint8_t cache_num)2839*5113495bSYour Name void hal_tx_desc_set_cache_set_num_generic_li(void *desc, uint8_t cache_num)
2840*5113495bSYour Name {
2841*5113495bSYour Name 	HAL_SET_FLD(desc, TCL_DATA_CMD_5, CACHE_SET_NUM) |=
2842*5113495bSYour Name 		HAL_TX_SM(TCL_DATA_CMD_5, CACHE_SET_NUM, cache_num);
2843*5113495bSYour Name }
2844*5113495bSYour Name #else
2845*5113495bSYour Name static inline
hal_tx_desc_set_cache_set_num_generic_li(void * desc,uint8_t cache_num)2846*5113495bSYour Name void hal_tx_desc_set_cache_set_num_generic_li(void *desc, uint8_t cache_num)
2847*5113495bSYour Name {
2848*5113495bSYour Name }
2849*5113495bSYour Name #endif
2850*5113495bSYour Name 
2851*5113495bSYour Name #ifdef WLAN_SUPPORT_RX_FISA
2852*5113495bSYour Name /**
2853*5113495bSYour Name  * hal_rx_flow_get_tuple_info_li() - Setup a flow search entry in HW FST
2854*5113495bSYour Name  * @rx_fst: Pointer to the Rx Flow Search Table
2855*5113495bSYour Name  * @hal_hash: HAL 5 tuple hash
2856*5113495bSYour Name  * @flow_tuple_info: 5-tuple info of the flow returned to the caller
2857*5113495bSYour Name  *
2858*5113495bSYour Name  * Return: Success/Failure
2859*5113495bSYour Name  */
2860*5113495bSYour Name static void *
hal_rx_flow_get_tuple_info_li(uint8_t * rx_fst,uint32_t hal_hash,uint8_t * flow_tuple_info)2861*5113495bSYour Name hal_rx_flow_get_tuple_info_li(uint8_t *rx_fst, uint32_t hal_hash,
2862*5113495bSYour Name 			      uint8_t *flow_tuple_info)
2863*5113495bSYour Name {
2864*5113495bSYour Name 	struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst;
2865*5113495bSYour Name 	void *hal_fse = NULL;
2866*5113495bSYour Name 	struct hal_flow_tuple_info *tuple_info
2867*5113495bSYour Name 		= (struct hal_flow_tuple_info *)flow_tuple_info;
2868*5113495bSYour Name 
2869*5113495bSYour Name 	hal_fse = (uint8_t *)fst->base_vaddr +
2870*5113495bSYour Name 		(hal_hash * HAL_RX_FST_ENTRY_SIZE);
2871*5113495bSYour Name 
2872*5113495bSYour Name 	if (!hal_fse || !tuple_info)
2873*5113495bSYour Name 		return NULL;
2874*5113495bSYour Name 
2875*5113495bSYour Name 	if (!HAL_GET_FLD(hal_fse, RX_FLOW_SEARCH_ENTRY_9, VALID))
2876*5113495bSYour Name 		return NULL;
2877*5113495bSYour Name 
2878*5113495bSYour Name 	tuple_info->src_ip_127_96 =
2879*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2880*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_0,
2881*5113495bSYour Name 						      SRC_IP_127_96));
2882*5113495bSYour Name 	tuple_info->src_ip_95_64 =
2883*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2884*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_1,
2885*5113495bSYour Name 						      SRC_IP_95_64));
2886*5113495bSYour Name 	tuple_info->src_ip_63_32 =
2887*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2888*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_2,
2889*5113495bSYour Name 						      SRC_IP_63_32));
2890*5113495bSYour Name 	tuple_info->src_ip_31_0 =
2891*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2892*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_3,
2893*5113495bSYour Name 						      SRC_IP_31_0));
2894*5113495bSYour Name 	tuple_info->dest_ip_127_96 =
2895*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2896*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_4,
2897*5113495bSYour Name 						      DEST_IP_127_96));
2898*5113495bSYour Name 	tuple_info->dest_ip_95_64 =
2899*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2900*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_5,
2901*5113495bSYour Name 						      DEST_IP_95_64));
2902*5113495bSYour Name 	tuple_info->dest_ip_63_32 =
2903*5113495bSYour Name 				qdf_ntohl(HAL_GET_FLD(hal_fse,
2904*5113495bSYour Name 						      RX_FLOW_SEARCH_ENTRY_6,
2905*5113495bSYour Name 						      DEST_IP_63_32));
2906*5113495bSYour Name 	tuple_info->dest_ip_31_0 =
2907*5113495bSYour Name 			qdf_ntohl(HAL_GET_FLD(hal_fse,
2908*5113495bSYour Name 					      RX_FLOW_SEARCH_ENTRY_7,
2909*5113495bSYour Name 					      DEST_IP_31_0));
2910*5113495bSYour Name 	tuple_info->dest_port = HAL_GET_FLD(hal_fse,
2911*5113495bSYour Name 					    RX_FLOW_SEARCH_ENTRY_8,
2912*5113495bSYour Name 					    DEST_PORT);
2913*5113495bSYour Name 	tuple_info->src_port = HAL_GET_FLD(hal_fse,
2914*5113495bSYour Name 					   RX_FLOW_SEARCH_ENTRY_8,
2915*5113495bSYour Name 					   SRC_PORT);
2916*5113495bSYour Name 	tuple_info->l4_protocol = HAL_GET_FLD(hal_fse,
2917*5113495bSYour Name 					      RX_FLOW_SEARCH_ENTRY_9,
2918*5113495bSYour Name 					      L4_PROTOCOL);
2919*5113495bSYour Name 
2920*5113495bSYour Name 	return hal_fse;
2921*5113495bSYour Name }
2922*5113495bSYour Name 
2923*5113495bSYour Name /**
2924*5113495bSYour Name  * hal_rx_flow_delete_entry_li() - Setup a flow search entry in HW FST
2925*5113495bSYour Name  * @rx_fst: Pointer to the Rx Flow Search Table
2926*5113495bSYour Name  * @hal_rx_fse: Pointer to the Rx Flow that is to be deleted from the FST
2927*5113495bSYour Name  *
2928*5113495bSYour Name  * Return: Success/Failure
2929*5113495bSYour Name  */
2930*5113495bSYour Name static QDF_STATUS
hal_rx_flow_delete_entry_li(uint8_t * rx_fst,void * hal_rx_fse)2931*5113495bSYour Name hal_rx_flow_delete_entry_li(uint8_t *rx_fst, void *hal_rx_fse)
2932*5113495bSYour Name {
2933*5113495bSYour Name 	uint8_t *fse = (uint8_t *)hal_rx_fse;
2934*5113495bSYour Name 
2935*5113495bSYour Name 	if (!HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, VALID))
2936*5113495bSYour Name 		return QDF_STATUS_E_NOENT;
2937*5113495bSYour Name 
2938*5113495bSYour Name 	HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, VALID);
2939*5113495bSYour Name 
2940*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2941*5113495bSYour Name }
2942*5113495bSYour Name 
2943*5113495bSYour Name /**
2944*5113495bSYour Name  * hal_rx_fst_get_fse_size_li() - Retrieve the size of each entry
2945*5113495bSYour Name  *
2946*5113495bSYour Name  * Return: size of each entry/flow in Rx FST
2947*5113495bSYour Name  */
2948*5113495bSYour Name static inline uint32_t
hal_rx_fst_get_fse_size_li(void)2949*5113495bSYour Name hal_rx_fst_get_fse_size_li(void)
2950*5113495bSYour Name {
2951*5113495bSYour Name 	return HAL_RX_FST_ENTRY_SIZE;
2952*5113495bSYour Name }
2953*5113495bSYour Name #else
2954*5113495bSYour Name static inline void *
hal_rx_flow_get_tuple_info_li(uint8_t * rx_fst,uint32_t hal_hash,uint8_t * flow_tuple_info)2955*5113495bSYour Name hal_rx_flow_get_tuple_info_li(uint8_t *rx_fst, uint32_t hal_hash,
2956*5113495bSYour Name 			      uint8_t *flow_tuple_info)
2957*5113495bSYour Name {
2958*5113495bSYour Name 	return NULL;
2959*5113495bSYour Name }
2960*5113495bSYour Name 
2961*5113495bSYour Name static inline QDF_STATUS
hal_rx_flow_delete_entry_li(uint8_t * rx_fst,void * hal_rx_fse)2962*5113495bSYour Name hal_rx_flow_delete_entry_li(uint8_t *rx_fst, void *hal_rx_fse)
2963*5113495bSYour Name {
2964*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2965*5113495bSYour Name }
2966*5113495bSYour Name 
2967*5113495bSYour Name static inline uint32_t
hal_rx_fst_get_fse_size_li(void)2968*5113495bSYour Name hal_rx_fst_get_fse_size_li(void)
2969*5113495bSYour Name {
2970*5113495bSYour Name 	return 0;
2971*5113495bSYour Name }
2972*5113495bSYour Name #endif /* WLAN_SUPPORT_RX_FISA */
2973*5113495bSYour Name 
2974*5113495bSYour Name /**
2975*5113495bSYour Name  * hal_rx_get_frame_ctrl_field_li() - Function to retrieve frame control field
2976*5113495bSYour Name  * @buf: Network buffer
2977*5113495bSYour Name  *
2978*5113495bSYour Name  * Return: rx more fragment bit
2979*5113495bSYour Name  */
hal_rx_get_frame_ctrl_field_li(uint8_t * buf)2980*5113495bSYour Name static uint16_t hal_rx_get_frame_ctrl_field_li(uint8_t *buf)
2981*5113495bSYour Name {
2982*5113495bSYour Name 	struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
2983*5113495bSYour Name 	struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
2984*5113495bSYour Name 	uint16_t frame_ctrl = 0;
2985*5113495bSYour Name 
2986*5113495bSYour Name 	frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_mpdu_info);
2987*5113495bSYour Name 
2988*5113495bSYour Name 	return frame_ctrl;
2989*5113495bSYour Name }
2990*5113495bSYour Name #endif /* _HAL_LI_GENERIC_API_H_ */
2991