xref: /wlan-dirver/qca-wifi-host-cmn/hal/wifi3.0/hal_generic_api.h (revision 8967ce71a84a76351f8ebf239925d47f7c692f7e)
1 /*
2  * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 #ifndef _HAL_GENERIC_API_H_
19 #define _HAL_GENERIC_API_H_
20 
21 #include <hal_rx.h>
22 
23 /**
24  * hal_tx_comp_get_status() - TQM Release reason
25  * @hal_desc: completion ring Tx status
26  *
27  * This function will parse the WBM completion descriptor and populate in
28  * HAL structure
29  *
30  * Return: none
31  */
32 static inline
33 void hal_tx_comp_get_status_generic(void *desc,
34 				    void *ts1,
35 				    struct hal_soc *hal)
36 {
37 	uint8_t rate_stats_valid = 0;
38 	uint32_t rate_stats = 0;
39 	struct hal_tx_completion_status *ts =
40 		(struct hal_tx_completion_status *)ts1;
41 
42 	ts->ppdu_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3,
43 			TQM_STATUS_NUMBER);
44 	ts->ack_frame_rssi = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
45 			ACK_FRAME_RSSI);
46 	ts->first_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, FIRST_MSDU);
47 	ts->last_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, LAST_MSDU);
48 	ts->msdu_part_of_amsdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
49 			MSDU_PART_OF_AMSDU);
50 
51 	ts->peer_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, SW_PEER_ID);
52 	ts->tid = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, TID);
53 	ts->transmit_cnt = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3,
54 			TRANSMIT_COUNT);
55 
56 	rate_stats = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_5,
57 			TX_RATE_STATS);
58 
59 	rate_stats_valid = HAL_TX_MS(TX_RATE_STATS_INFO_0,
60 			TX_RATE_STATS_INFO_VALID, rate_stats);
61 
62 	ts->valid = rate_stats_valid;
63 
64 	if (rate_stats_valid) {
65 		ts->bw = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_BW,
66 				rate_stats);
67 		ts->pkt_type = HAL_TX_MS(TX_RATE_STATS_INFO_0,
68 				TRANSMIT_PKT_TYPE, rate_stats);
69 		ts->stbc = HAL_TX_MS(TX_RATE_STATS_INFO_0,
70 				TRANSMIT_STBC, rate_stats);
71 		ts->ldpc = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_LDPC,
72 				rate_stats);
73 		ts->sgi = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_SGI,
74 				rate_stats);
75 		ts->mcs = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_MCS,
76 				rate_stats);
77 		ts->ofdma = HAL_TX_MS(TX_RATE_STATS_INFO_0, OFDMA_TRANSMISSION,
78 				rate_stats);
79 		ts->tones_in_ru = HAL_TX_MS(TX_RATE_STATS_INFO_0, TONES_IN_RU,
80 				rate_stats);
81 	}
82 
83 	ts->release_src = hal_tx_comp_get_buffer_source(desc);
84 	ts->status = hal_tx_comp_get_release_reason(
85 					desc,
86 					hal_soc_to_hal_soc_handle(hal));
87 
88 	ts->tsf = HAL_TX_DESC_GET(desc, UNIFIED_WBM_RELEASE_RING_6,
89 			TX_RATE_STATS_INFO_TX_RATE_STATS);
90 }
91 
92 /**
93  * hal_tx_desc_set_buf_addr - Fill Buffer Address information in Tx Descriptor
94  * @desc: Handle to Tx Descriptor
95  * @paddr: Physical Address
96  * @pool_id: Return Buffer Manager ID
97  * @desc_id: Descriptor ID
98  * @type: 0 - Address points to a MSDU buffer
99  *		1 - Address points to MSDU extension descriptor
100  *
101  * Return: void
102  */
103 static inline void hal_tx_desc_set_buf_addr_generic(void *desc,
104 		dma_addr_t paddr, uint8_t pool_id,
105 		uint32_t desc_id, uint8_t type)
106 {
107 	/* Set buffer_addr_info.buffer_addr_31_0 */
108 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_0, BUFFER_ADDR_INFO_BUF_ADDR_INFO) =
109 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_0, BUFFER_ADDR_31_0, paddr);
110 
111 	/* Set buffer_addr_info.buffer_addr_39_32 */
112 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
113 			 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
114 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, BUFFER_ADDR_39_32,
115 		       (((uint64_t) paddr) >> 32));
116 
117 	/* Set buffer_addr_info.return_buffer_manager = pool id */
118 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
119 			 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
120 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1,
121 		       RETURN_BUFFER_MANAGER, (pool_id + HAL_WBM_SW0_BM_ID));
122 
123 	/* Set buffer_addr_info.sw_buffer_cookie = desc_id */
124 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
125 			BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
126 		HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, SW_BUFFER_COOKIE, desc_id);
127 
128 	/* Set  Buffer or Ext Descriptor Type */
129 	HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_2,
130 			BUF_OR_EXT_DESC_TYPE) |=
131 		HAL_TX_SM(UNIFIED_TCL_DATA_CMD_2, BUF_OR_EXT_DESC_TYPE, type);
132 }
133 
134 #if defined(QCA_WIFI_QCA6290_11AX_MU_UL) && defined(QCA_WIFI_QCA6290_11AX)
135 /**
136  * hal_rx_handle_other_tlvs() - handle special TLVs like MU_UL
137  * tlv_tag: Taf of the TLVs
138  * rx_tlv: the pointer to the TLVs
139  * @ppdu_info: pointer to ppdu_info
140  *
141  * Return: true if the tlv is handled, false if not
142  */
143 static inline bool
144 hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv,
145 			 struct hal_rx_ppdu_info *ppdu_info)
146 {
147 	uint32_t value;
148 
149 	switch (tlv_tag) {
150 	case WIFIPHYRX_HE_SIG_A_MU_UL_E:
151 	{
152 		uint8_t *he_sig_a_mu_ul_info =
153 			(uint8_t *)rx_tlv +
154 			HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_UL_0,
155 					  HE_SIG_A_MU_UL_INFO_PHYRX_HE_SIG_A_MU_UL_INFO_DETAILS);
156 		ppdu_info->rx_status.he_flags = 1;
157 
158 		value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0,
159 				   FORMAT_INDICATION);
160 		if (value == 0) {
161 			ppdu_info->rx_status.he_data1 =
162 				QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
163 		} else {
164 			 ppdu_info->rx_status.he_data1 =
165 				QDF_MON_STATUS_HE_SU_FORMAT_TYPE;
166 		}
167 
168 		/* data1 */
169 		ppdu_info->rx_status.he_data1 |=
170 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
171 			QDF_MON_STATUS_HE_DL_UL_KNOWN |
172 			QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
173 
174 		/* data2 */
175 		ppdu_info->rx_status.he_data2 |=
176 			QDF_MON_STATUS_TXOP_KNOWN;
177 
178 		/*data3*/
179 		value = HAL_RX_GET(he_sig_a_mu_ul_info,
180 				   HE_SIG_A_MU_UL_INFO_0, BSS_COLOR_ID);
181 		ppdu_info->rx_status.he_data3 = value;
182 		/* 1 for UL and 0 for DL */
183 		value = 1;
184 		value = value << QDF_MON_STATUS_DL_UL_SHIFT;
185 		ppdu_info->rx_status.he_data3 |= value;
186 
187 		/*data4*/
188 		value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0,
189 				   SPATIAL_REUSE);
190 		ppdu_info->rx_status.he_data4 = value;
191 
192 		/*data5*/
193 		value = HAL_RX_GET(he_sig_a_mu_ul_info,
194 				   HE_SIG_A_MU_UL_INFO_0, TRANSMIT_BW);
195 		ppdu_info->rx_status.he_data5 = value;
196 		ppdu_info->rx_status.bw = value;
197 
198 		/*data6*/
199 		value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_1,
200 				   TXOP_DURATION);
201 		value = value << QDF_MON_STATUS_TXOP_SHIFT;
202 		ppdu_info->rx_status.he_data6 |= value;
203 		return true;
204 	}
205 	default:
206 		return false;
207 	}
208 }
209 #else
210 static inline bool
211 hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv,
212 			 struct hal_rx_ppdu_info *ppdu_info)
213 {
214 	return false;
215 }
216 #endif /* QCA_WIFI_QCA6290_11AX_MU_UL && QCA_WIFI_QCA6290_11AX */
217 
218 #if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET) && \
219 defined(RX_PPDU_END_USER_STATS_22_SW_RESPONSE_REFERENCE_PTR_EXT_OFFSET)
220 
221 static inline void
222 hal_rx_handle_mu_ul_info(
223 	void *rx_tlv,
224 	struct mon_rx_user_status *mon_rx_user_status)
225 {
226 	mon_rx_user_status->mu_ul_user_v0_word0 =
227 		HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_11,
228 			   SW_RESPONSE_REFERENCE_PTR);
229 
230 	mon_rx_user_status->mu_ul_user_v0_word1 =
231 		HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_22,
232 			   SW_RESPONSE_REFERENCE_PTR_EXT);
233 }
234 
235 static inline void
236 hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
237 			   struct mon_rx_user_status *mon_rx_user_status)
238 {
239 	uint32_t mpdu_ok_byte_count;
240 	uint32_t mpdu_err_byte_count;
241 
242 	mpdu_ok_byte_count = HAL_RX_GET(rx_tlv,
243 					RX_PPDU_END_USER_STATS_17,
244 					MPDU_OK_BYTE_COUNT);
245 	mpdu_err_byte_count = HAL_RX_GET(rx_tlv,
246 					 RX_PPDU_END_USER_STATS_19,
247 					 MPDU_ERR_BYTE_COUNT);
248 
249 	mon_rx_user_status->mpdu_ok_byte_count = mpdu_ok_byte_count;
250 	mon_rx_user_status->mpdu_err_byte_count = mpdu_err_byte_count;
251 }
252 #else
253 static inline void
254 hal_rx_handle_mu_ul_info(void *rx_tlv,
255 			 struct mon_rx_user_status *mon_rx_user_status)
256 {
257 }
258 
259 static inline void
260 hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
261 			   struct mon_rx_user_status *mon_rx_user_status)
262 {
263 	struct hal_rx_ppdu_info *ppdu_info =
264 			(struct hal_rx_ppdu_info *)ppduinfo;
265 
266 	/* HKV1: doesn't support mpdu byte count */
267 	mon_rx_user_status->mpdu_ok_byte_count = ppdu_info->rx_status.ppdu_len;
268 	mon_rx_user_status->mpdu_err_byte_count = 0;
269 }
270 #endif
271 
272 static inline void
273 hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo,
274 			     struct mon_rx_user_status *mon_rx_user_status)
275 {
276 	struct hal_rx_ppdu_info *ppdu_info =
277 			(struct hal_rx_ppdu_info *)ppduinfo;
278 
279 	mon_rx_user_status->ast_index = ppdu_info->rx_status.ast_index;
280 	mon_rx_user_status->tid = ppdu_info->rx_status.tid;
281 	mon_rx_user_status->tcp_msdu_count =
282 		ppdu_info->rx_status.tcp_msdu_count;
283 	mon_rx_user_status->udp_msdu_count =
284 		ppdu_info->rx_status.udp_msdu_count;
285 	mon_rx_user_status->other_msdu_count =
286 		ppdu_info->rx_status.other_msdu_count;
287 	mon_rx_user_status->frame_control = ppdu_info->rx_status.frame_control;
288 	mon_rx_user_status->frame_control_info_valid =
289 		ppdu_info->rx_status.frame_control_info_valid;
290 	mon_rx_user_status->data_sequence_control_info_valid =
291 		ppdu_info->rx_status.data_sequence_control_info_valid;
292 	mon_rx_user_status->first_data_seq_ctrl =
293 		ppdu_info->rx_status.first_data_seq_ctrl;
294 	mon_rx_user_status->preamble_type = ppdu_info->rx_status.preamble_type;
295 	mon_rx_user_status->ht_flags = ppdu_info->rx_status.ht_flags;
296 	mon_rx_user_status->rtap_flags = ppdu_info->rx_status.rtap_flags;
297 	mon_rx_user_status->vht_flags = ppdu_info->rx_status.vht_flags;
298 	mon_rx_user_status->he_flags = ppdu_info->rx_status.he_flags;
299 	mon_rx_user_status->rs_flags = ppdu_info->rx_status.rs_flags;
300 
301 	mon_rx_user_status->mpdu_cnt_fcs_ok =
302 		ppdu_info->com_info.mpdu_cnt_fcs_ok;
303 	mon_rx_user_status->mpdu_cnt_fcs_err =
304 		ppdu_info->com_info.mpdu_cnt_fcs_err;
305 	qdf_mem_copy(&mon_rx_user_status->mpdu_fcs_ok_bitmap,
306 		     &ppdu_info->com_info.mpdu_fcs_ok_bitmap,
307 		     HAL_RX_NUM_WORDS_PER_PPDU_BITMAP *
308 		     sizeof(ppdu_info->com_info.mpdu_fcs_ok_bitmap[0]));
309 
310 	hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status);
311 }
312 
313 #define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \
314 					ppdu_info, rssi_info_tlv) \
315 	{						\
316 	ppdu_info->rx_status.rssi_chain[chain][0] = \
317 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
318 				   RSSI_PRI20_CHAIN##chain); \
319 	ppdu_info->rx_status.rssi_chain[chain][1] = \
320 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
321 				   RSSI_EXT20_CHAIN##chain); \
322 	ppdu_info->rx_status.rssi_chain[chain][2] = \
323 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
324 				   RSSI_EXT40_LOW20_CHAIN##chain); \
325 	ppdu_info->rx_status.rssi_chain[chain][3] = \
326 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
327 				   RSSI_EXT40_HIGH20_CHAIN##chain); \
328 	ppdu_info->rx_status.rssi_chain[chain][4] = \
329 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
330 				   RSSI_EXT80_LOW20_CHAIN##chain); \
331 	ppdu_info->rx_status.rssi_chain[chain][5] = \
332 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
333 				   RSSI_EXT80_LOW_HIGH20_CHAIN##chain); \
334 	ppdu_info->rx_status.rssi_chain[chain][6] = \
335 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
336 				   RSSI_EXT80_HIGH_LOW20_CHAIN##chain); \
337 	ppdu_info->rx_status.rssi_chain[chain][7] = \
338 			HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
339 				   RSSI_EXT80_HIGH20_CHAIN##chain); \
340 	}						\
341 
342 #define HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) \
343 	{HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(0, 0, 1, ppdu_info, rssi_info_tlv) \
344 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(1, 2, 3, ppdu_info, rssi_info_tlv) \
345 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(2, 4, 5, ppdu_info, rssi_info_tlv) \
346 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(3, 6, 7, ppdu_info, rssi_info_tlv) \
347 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(4, 8, 9, ppdu_info, rssi_info_tlv) \
348 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(5, 10, 11, ppdu_info, rssi_info_tlv) \
349 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(6, 12, 13, ppdu_info, rssi_info_tlv) \
350 	HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(7, 14, 15, ppdu_info, rssi_info_tlv)} \
351 
352 static inline uint32_t
353 hal_rx_update_rssi_chain(struct hal_rx_ppdu_info *ppdu_info,
354 			 uint8_t *rssi_info_tlv)
355 {
356 	HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv)
357 	return 0;
358 }
359 
360 /**
361  * hal_rx_status_get_tlv_info() - process receive info TLV
362  * @rx_tlv_hdr: pointer to TLV header
363  * @ppdu_info: pointer to ppdu_info
364  *
365  * Return: HAL_TLV_STATUS_PPDU_NOT_DONE or HAL_TLV_STATUS_PPDU_DONE from tlv
366  */
367 static inline uint32_t
368 hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo,
369 				   hal_soc_handle_t hal_soc_hdl,
370 				   qdf_nbuf_t nbuf)
371 {
372 	struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
373 	uint32_t tlv_tag, user_id, tlv_len, value;
374 	uint8_t group_id = 0;
375 	uint8_t he_dcm = 0;
376 	uint8_t he_stbc = 0;
377 	uint16_t he_gi = 0;
378 	uint16_t he_ltf = 0;
379 	void *rx_tlv;
380 	bool unhandled = false;
381 	struct mon_rx_user_status *mon_rx_user_status;
382 	struct hal_rx_ppdu_info *ppdu_info =
383 			(struct hal_rx_ppdu_info *)ppduinfo;
384 
385 	tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr);
386 	user_id = HAL_RX_GET_USER_TLV32_USERID(rx_tlv_hdr);
387 	tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr);
388 
389 	rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
390 
391 	qdf_trace_hex_dump(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
392 			   rx_tlv, tlv_len);
393 
394 	switch (tlv_tag) {
395 
396 	case WIFIRX_PPDU_START_E:
397 	{
398 		struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info;
399 
400 		ppdu_info->com_info.ppdu_id =
401 			HAL_RX_GET(rx_tlv, RX_PPDU_START_0,
402 				PHY_PPDU_ID);
403 		/* channel number is set in PHY meta data */
404 		ppdu_info->rx_status.chan_num =
405 			HAL_RX_GET(rx_tlv, RX_PPDU_START_1,
406 				SW_PHY_META_DATA);
407 		ppdu_info->com_info.ppdu_timestamp =
408 			HAL_RX_GET(rx_tlv, RX_PPDU_START_2,
409 				PPDU_START_TIMESTAMP);
410 		ppdu_info->rx_status.ppdu_timestamp =
411 			ppdu_info->com_info.ppdu_timestamp;
412 		ppdu_info->rx_state = HAL_RX_MON_PPDU_START;
413 
414 		/* If last ppdu_id doesn't match new ppdu_id,
415 		 * 1. reset mpdu_cnt
416 		 * 2. update last_ppdu_id with new
417 		 * 3. reset mpdu fcs bitmap
418 		 */
419 		if (com_info->ppdu_id != com_info->last_ppdu_id) {
420 			com_info->mpdu_cnt = 0;
421 			com_info->last_ppdu_id =
422 				com_info->ppdu_id;
423 			com_info->num_users = 0;
424 			qdf_mem_zero(&com_info->mpdu_fcs_ok_bitmap,
425 				     HAL_RX_NUM_WORDS_PER_PPDU_BITMAP *
426 				     sizeof(com_info->mpdu_fcs_ok_bitmap[0]));
427 		}
428 		break;
429 	}
430 
431 	case WIFIRX_PPDU_START_USER_INFO_E:
432 		break;
433 
434 	case WIFIRX_PPDU_END_E:
435 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
436 			"[%s][%d] ppdu_end_e len=%d",
437 				__func__, __LINE__, tlv_len);
438 		/* This is followed by sub-TLVs of PPDU_END */
439 		ppdu_info->rx_state = HAL_RX_MON_PPDU_END;
440 		break;
441 
442 	case WIFIPHYRX_PKT_END_E:
443 		hal_rx_get_rtt_info(hal_soc_hdl, rx_tlv, ppdu_info);
444 		break;
445 
446 	case WIFIRXPCU_PPDU_END_INFO_E:
447 		ppdu_info->rx_status.rx_antenna =
448 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_2, RX_ANTENNA);
449 		ppdu_info->rx_status.tsft =
450 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_1,
451 				WB_TIMESTAMP_UPPER_32);
452 		ppdu_info->rx_status.tsft = (ppdu_info->rx_status.tsft << 32) |
453 			HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_0,
454 				WB_TIMESTAMP_LOWER_32);
455 		ppdu_info->rx_status.duration =
456 			HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_8,
457 				RX_PPDU_DURATION);
458 		hal_rx_get_bb_info(hal_soc_hdl, rx_tlv, ppdu_info);
459 		break;
460 
461 	/*
462 	 * WIFIRX_PPDU_END_USER_STATS_E comes for each user received.
463 	 * for MU, based on num users we see this tlv that many times.
464 	 */
465 	case WIFIRX_PPDU_END_USER_STATS_E:
466 	{
467 		unsigned long tid = 0;
468 		uint16_t seq = 0;
469 
470 		ppdu_info->rx_status.ast_index =
471 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4,
472 						AST_INDEX);
473 
474 		tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12,
475 				RECEIVED_QOS_DATA_TID_BITMAP);
476 		ppdu_info->rx_status.tid = qdf_find_first_bit(&tid, sizeof(tid)*8);
477 
478 		if (ppdu_info->rx_status.tid == (sizeof(tid) * 8))
479 			ppdu_info->rx_status.tid = HAL_TID_INVALID;
480 
481 		ppdu_info->rx_status.tcp_msdu_count =
482 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9,
483 					TCP_MSDU_COUNT) +
484 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
485 					TCP_ACK_MSDU_COUNT);
486 		ppdu_info->rx_status.udp_msdu_count =
487 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9,
488 						UDP_MSDU_COUNT);
489 		ppdu_info->rx_status.other_msdu_count =
490 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
491 					OTHER_MSDU_COUNT);
492 
493 		if (ppdu_info->sw_frame_group_id
494 		    != HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) {
495 			ppdu_info->rx_status.frame_control_info_valid =
496 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
497 					   FRAME_CONTROL_INFO_VALID);
498 
499 			if (ppdu_info->rx_status.frame_control_info_valid)
500 				ppdu_info->rx_status.frame_control =
501 					HAL_RX_GET(rx_tlv,
502 						   RX_PPDU_END_USER_STATS_4,
503 						   FRAME_CONTROL_FIELD);
504 		}
505 
506 		ppdu_info->rx_status.data_sequence_control_info_valid =
507 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
508 				   DATA_SEQUENCE_CONTROL_INFO_VALID);
509 
510 		seq = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_5,
511 				 FIRST_DATA_SEQ_CTRL);
512 		if (ppdu_info->rx_status.data_sequence_control_info_valid)
513 			ppdu_info->rx_status.first_data_seq_ctrl = seq;
514 
515 		ppdu_info->rx_status.preamble_type =
516 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
517 						HT_CONTROL_FIELD_PKT_TYPE);
518 		switch (ppdu_info->rx_status.preamble_type) {
519 		case HAL_RX_PKT_TYPE_11N:
520 			ppdu_info->rx_status.ht_flags = 1;
521 			ppdu_info->rx_status.rtap_flags |= HT_SGI_PRESENT;
522 			break;
523 		case HAL_RX_PKT_TYPE_11AC:
524 			ppdu_info->rx_status.vht_flags = 1;
525 			break;
526 		case HAL_RX_PKT_TYPE_11AX:
527 			ppdu_info->rx_status.he_flags = 1;
528 			break;
529 		default:
530 			break;
531 		}
532 
533 		ppdu_info->com_info.mpdu_cnt_fcs_ok =
534 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
535 					MPDU_CNT_FCS_OK);
536 		ppdu_info->com_info.mpdu_cnt_fcs_err =
537 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2,
538 					MPDU_CNT_FCS_ERR);
539 		if ((ppdu_info->com_info.mpdu_cnt_fcs_ok |
540 			ppdu_info->com_info.mpdu_cnt_fcs_err) > 1)
541 			ppdu_info->rx_status.rs_flags |= IEEE80211_AMPDU_FLAG;
542 		else
543 			ppdu_info->rx_status.rs_flags &=
544 				(~IEEE80211_AMPDU_FLAG);
545 
546 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[0] =
547 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_7,
548 					   FCS_OK_BITMAP_31_0);
549 
550 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[1] =
551 				HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_8,
552 					   FCS_OK_BITMAP_63_32);
553 
554 		if (user_id < HAL_MAX_UL_MU_USERS) {
555 			mon_rx_user_status =
556 				&ppdu_info->rx_user_status[user_id];
557 
558 			hal_rx_handle_mu_ul_info(rx_tlv, mon_rx_user_status);
559 
560 			ppdu_info->com_info.num_users++;
561 
562 			hal_rx_populate_mu_user_info(rx_tlv, ppdu_info,
563 						     mon_rx_user_status);
564 		}
565 		break;
566 	}
567 
568 	case WIFIRX_PPDU_END_USER_STATS_EXT_E:
569 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[2] =
570 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_1,
571 				   FCS_OK_BITMAP_95_64);
572 
573 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[3] =
574 			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_2,
575 				    FCS_OK_BITMAP_127_96);
576 
577 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[4] =
578 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_3,
579 				   FCS_OK_BITMAP_159_128);
580 
581 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[5] =
582 			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_4,
583 				    FCS_OK_BITMAP_191_160);
584 
585 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[6] =
586 			HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_5,
587 				   FCS_OK_BITMAP_223_192);
588 
589 		ppdu_info->com_info.mpdu_fcs_ok_bitmap[7] =
590 			 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_6,
591 				    FCS_OK_BITMAP_255_224);
592 		break;
593 
594 	case WIFIRX_PPDU_END_STATUS_DONE_E:
595 		return HAL_TLV_STATUS_PPDU_DONE;
596 
597 	case WIFIDUMMY_E:
598 		return HAL_TLV_STATUS_BUF_DONE;
599 
600 	case WIFIPHYRX_HT_SIG_E:
601 	{
602 		uint8_t *ht_sig_info = (uint8_t *)rx_tlv +
603 				HAL_RX_OFFSET(UNIFIED_PHYRX_HT_SIG_0,
604 				HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS);
605 		value = HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1,
606 				FEC_CODING);
607 		ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
608 			1 : 0;
609 		ppdu_info->rx_status.mcs = HAL_RX_GET(ht_sig_info,
610 				HT_SIG_INFO_0, MCS);
611 		ppdu_info->rx_status.ht_mcs = ppdu_info->rx_status.mcs;
612 		ppdu_info->rx_status.bw = HAL_RX_GET(ht_sig_info,
613 				HT_SIG_INFO_0, CBW);
614 		ppdu_info->rx_status.sgi = HAL_RX_GET(ht_sig_info,
615 				HT_SIG_INFO_1, SHORT_GI);
616 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
617 		ppdu_info->rx_status.nss = ((ppdu_info->rx_status.mcs) >>
618 				HT_SIG_SU_NSS_SHIFT) + 1;
619 		ppdu_info->rx_status.mcs &= ((1 << HT_SIG_SU_NSS_SHIFT) - 1);
620 		break;
621 	}
622 
623 	case WIFIPHYRX_L_SIG_B_E:
624 	{
625 		uint8_t *l_sig_b_info = (uint8_t *)rx_tlv +
626 				HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_B_0,
627 				L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS);
628 
629 		value = HAL_RX_GET(l_sig_b_info, L_SIG_B_INFO_0, RATE);
630 		ppdu_info->rx_status.l_sig_b_info = *((uint32_t *)l_sig_b_info);
631 		switch (value) {
632 		case 1:
633 			ppdu_info->rx_status.rate = HAL_11B_RATE_3MCS;
634 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3;
635 			break;
636 		case 2:
637 			ppdu_info->rx_status.rate = HAL_11B_RATE_2MCS;
638 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2;
639 			break;
640 		case 3:
641 			ppdu_info->rx_status.rate = HAL_11B_RATE_1MCS;
642 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1;
643 			break;
644 		case 4:
645 			ppdu_info->rx_status.rate = HAL_11B_RATE_0MCS;
646 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0;
647 			break;
648 		case 5:
649 			ppdu_info->rx_status.rate = HAL_11B_RATE_6MCS;
650 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6;
651 			break;
652 		case 6:
653 			ppdu_info->rx_status.rate = HAL_11B_RATE_5MCS;
654 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5;
655 			break;
656 		case 7:
657 			ppdu_info->rx_status.rate = HAL_11B_RATE_4MCS;
658 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4;
659 			break;
660 		default:
661 			break;
662 		}
663 		ppdu_info->rx_status.cck_flag = 1;
664 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
665 	break;
666 	}
667 
668 	case WIFIPHYRX_L_SIG_A_E:
669 	{
670 		uint8_t *l_sig_a_info = (uint8_t *)rx_tlv +
671 				HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_A_0,
672 				L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS);
673 
674 		value = HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, RATE);
675 		ppdu_info->rx_status.l_sig_a_info = *((uint32_t *)l_sig_a_info);
676 		switch (value) {
677 		case 8:
678 			ppdu_info->rx_status.rate = HAL_11A_RATE_0MCS;
679 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0;
680 			break;
681 		case 9:
682 			ppdu_info->rx_status.rate = HAL_11A_RATE_1MCS;
683 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1;
684 			break;
685 		case 10:
686 			ppdu_info->rx_status.rate = HAL_11A_RATE_2MCS;
687 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2;
688 			break;
689 		case 11:
690 			ppdu_info->rx_status.rate = HAL_11A_RATE_3MCS;
691 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3;
692 			break;
693 		case 12:
694 			ppdu_info->rx_status.rate = HAL_11A_RATE_4MCS;
695 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4;
696 			break;
697 		case 13:
698 			ppdu_info->rx_status.rate = HAL_11A_RATE_5MCS;
699 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5;
700 			break;
701 		case 14:
702 			ppdu_info->rx_status.rate = HAL_11A_RATE_6MCS;
703 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6;
704 			break;
705 		case 15:
706 			ppdu_info->rx_status.rate = HAL_11A_RATE_7MCS;
707 			ppdu_info->rx_status.mcs = HAL_LEGACY_MCS7;
708 			break;
709 		default:
710 			break;
711 		}
712 		ppdu_info->rx_status.ofdm_flag = 1;
713 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
714 	break;
715 	}
716 
717 	case WIFIPHYRX_VHT_SIG_A_E:
718 	{
719 		uint8_t *vht_sig_a_info = (uint8_t *)rx_tlv +
720 				HAL_RX_OFFSET(UNIFIED_PHYRX_VHT_SIG_A_0,
721 				VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS);
722 
723 		value = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1,
724 				SU_MU_CODING);
725 		ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
726 			1 : 0;
727 		group_id = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0, GROUP_ID);
728 		ppdu_info->rx_status.vht_flag_values5 = group_id;
729 		ppdu_info->rx_status.mcs = HAL_RX_GET(vht_sig_a_info,
730 				VHT_SIG_A_INFO_1, MCS);
731 		ppdu_info->rx_status.sgi = HAL_RX_GET(vht_sig_a_info,
732 				VHT_SIG_A_INFO_1, GI_SETTING);
733 
734 		switch (hal->target_type) {
735 		case TARGET_TYPE_QCA8074:
736 		case TARGET_TYPE_QCA8074V2:
737 		case TARGET_TYPE_QCA6018:
738 		case TARGET_TYPE_QCN9000:
739 #ifdef QCA_WIFI_QCA6390
740 		case TARGET_TYPE_QCA6390:
741 #endif
742 			ppdu_info->rx_status.is_stbc =
743 				HAL_RX_GET(vht_sig_a_info,
744 					   VHT_SIG_A_INFO_0, STBC);
745 			value =  HAL_RX_GET(vht_sig_a_info,
746 					    VHT_SIG_A_INFO_0, N_STS);
747 			value = value & VHT_SIG_SU_NSS_MASK;
748 			if (ppdu_info->rx_status.is_stbc && (value > 0))
749 				value = ((value + 1) >> 1) - 1;
750 			ppdu_info->rx_status.nss =
751 				((value & VHT_SIG_SU_NSS_MASK) + 1);
752 
753 			break;
754 		case TARGET_TYPE_QCA6290:
755 #if !defined(QCA_WIFI_QCA6290_11AX)
756 			ppdu_info->rx_status.is_stbc =
757 				HAL_RX_GET(vht_sig_a_info,
758 					   VHT_SIG_A_INFO_0, STBC);
759 			value =  HAL_RX_GET(vht_sig_a_info,
760 					    VHT_SIG_A_INFO_0, N_STS);
761 			value = value & VHT_SIG_SU_NSS_MASK;
762 			if (ppdu_info->rx_status.is_stbc && (value > 0))
763 				value = ((value + 1) >> 1) - 1;
764 			ppdu_info->rx_status.nss =
765 				((value & VHT_SIG_SU_NSS_MASK) + 1);
766 #else
767 			ppdu_info->rx_status.nss = 0;
768 #endif
769 			break;
770 		case TARGET_TYPE_QCA6490:
771 			ppdu_info->rx_status.nss = 0;
772 			break;
773 		default:
774 			break;
775 		}
776 		ppdu_info->rx_status.vht_flag_values3[0] =
777 				(((ppdu_info->rx_status.mcs) << 4)
778 				| ppdu_info->rx_status.nss);
779 		ppdu_info->rx_status.bw = HAL_RX_GET(vht_sig_a_info,
780 				VHT_SIG_A_INFO_0, BANDWIDTH);
781 		ppdu_info->rx_status.vht_flag_values2 =
782 			ppdu_info->rx_status.bw;
783 		ppdu_info->rx_status.vht_flag_values4 =
784 			HAL_RX_GET(vht_sig_a_info,
785 				  VHT_SIG_A_INFO_1, SU_MU_CODING);
786 
787 		ppdu_info->rx_status.beamformed = HAL_RX_GET(vht_sig_a_info,
788 				VHT_SIG_A_INFO_1, BEAMFORMED);
789 		if (group_id == 0 || group_id == 63)
790 			ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
791 		else
792 			ppdu_info->rx_status.reception_type =
793 				HAL_RX_TYPE_MU_MIMO;
794 
795 		break;
796 	}
797 	case WIFIPHYRX_HE_SIG_A_SU_E:
798 	{
799 		uint8_t *he_sig_a_su_info = (uint8_t *)rx_tlv +
800 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_SU_0,
801 			HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS);
802 		ppdu_info->rx_status.he_flags = 1;
803 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0,
804 			FORMAT_INDICATION);
805 		if (value == 0) {
806 			ppdu_info->rx_status.he_data1 =
807 				QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
808 		} else {
809 			 ppdu_info->rx_status.he_data1 =
810 				 QDF_MON_STATUS_HE_SU_FORMAT_TYPE;
811 		}
812 
813 		/* data1 */
814 		ppdu_info->rx_status.he_data1 |=
815 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
816 			QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN |
817 			QDF_MON_STATUS_HE_DL_UL_KNOWN |
818 			QDF_MON_STATUS_HE_MCS_KNOWN |
819 			QDF_MON_STATUS_HE_DCM_KNOWN |
820 			QDF_MON_STATUS_HE_CODING_KNOWN |
821 			QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN |
822 			QDF_MON_STATUS_HE_STBC_KNOWN |
823 			QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN |
824 			QDF_MON_STATUS_HE_DOPPLER_KNOWN;
825 
826 		/* data2 */
827 		ppdu_info->rx_status.he_data2 =
828 			QDF_MON_STATUS_HE_GI_KNOWN;
829 		ppdu_info->rx_status.he_data2 |=
830 			QDF_MON_STATUS_TXBF_KNOWN |
831 			QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
832 			QDF_MON_STATUS_TXOP_KNOWN |
833 			QDF_MON_STATUS_LTF_SYMBOLS_KNOWN |
834 			QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
835 			QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
836 
837 		/* data3 */
838 		value = HAL_RX_GET(he_sig_a_su_info,
839 				HE_SIG_A_SU_INFO_0, BSS_COLOR_ID);
840 		ppdu_info->rx_status.he_data3 = value;
841 		value = HAL_RX_GET(he_sig_a_su_info,
842 				HE_SIG_A_SU_INFO_0, BEAM_CHANGE);
843 		value = value << QDF_MON_STATUS_BEAM_CHANGE_SHIFT;
844 		ppdu_info->rx_status.he_data3 |= value;
845 		value = HAL_RX_GET(he_sig_a_su_info,
846 				HE_SIG_A_SU_INFO_0, DL_UL_FLAG);
847 		value = value << QDF_MON_STATUS_DL_UL_SHIFT;
848 		ppdu_info->rx_status.he_data3 |= value;
849 
850 		value = HAL_RX_GET(he_sig_a_su_info,
851 				HE_SIG_A_SU_INFO_0, TRANSMIT_MCS);
852 		ppdu_info->rx_status.mcs = value;
853 		value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
854 		ppdu_info->rx_status.he_data3 |= value;
855 
856 		value = HAL_RX_GET(he_sig_a_su_info,
857 				HE_SIG_A_SU_INFO_0, DCM);
858 		he_dcm = value;
859 		value = value << QDF_MON_STATUS_DCM_SHIFT;
860 		ppdu_info->rx_status.he_data3 |= value;
861 		value = HAL_RX_GET(he_sig_a_su_info,
862 				HE_SIG_A_SU_INFO_1, CODING);
863 		ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
864 			1 : 0;
865 		value = value << QDF_MON_STATUS_CODING_SHIFT;
866 		ppdu_info->rx_status.he_data3 |= value;
867 		value = HAL_RX_GET(he_sig_a_su_info,
868 				HE_SIG_A_SU_INFO_1,
869 				LDPC_EXTRA_SYMBOL);
870 		value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT;
871 		ppdu_info->rx_status.he_data3 |= value;
872 		value = HAL_RX_GET(he_sig_a_su_info,
873 				HE_SIG_A_SU_INFO_1, STBC);
874 		he_stbc = value;
875 		value = value << QDF_MON_STATUS_STBC_SHIFT;
876 		ppdu_info->rx_status.he_data3 |= value;
877 
878 		/* data4 */
879 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0,
880 							SPATIAL_REUSE);
881 		ppdu_info->rx_status.he_data4 = value;
882 
883 		/* data5 */
884 		value = HAL_RX_GET(he_sig_a_su_info,
885 				HE_SIG_A_SU_INFO_0, TRANSMIT_BW);
886 		ppdu_info->rx_status.he_data5 = value;
887 		ppdu_info->rx_status.bw = value;
888 		value = HAL_RX_GET(he_sig_a_su_info,
889 				HE_SIG_A_SU_INFO_0, CP_LTF_SIZE);
890 		switch (value) {
891 		case 0:
892 				he_gi = HE_GI_0_8;
893 				he_ltf = HE_LTF_1_X;
894 				break;
895 		case 1:
896 				he_gi = HE_GI_0_8;
897 				he_ltf = HE_LTF_2_X;
898 				break;
899 		case 2:
900 				he_gi = HE_GI_1_6;
901 				he_ltf = HE_LTF_2_X;
902 				break;
903 		case 3:
904 				if (he_dcm && he_stbc) {
905 					he_gi = HE_GI_0_8;
906 					he_ltf = HE_LTF_4_X;
907 				} else {
908 					he_gi = HE_GI_3_2;
909 					he_ltf = HE_LTF_4_X;
910 				}
911 				break;
912 		}
913 		ppdu_info->rx_status.sgi = he_gi;
914 		value = he_gi << QDF_MON_STATUS_GI_SHIFT;
915 		ppdu_info->rx_status.he_data5 |= value;
916 		value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT;
917 		ppdu_info->rx_status.ltf_size = he_ltf;
918 		ppdu_info->rx_status.he_data5 |= value;
919 
920 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS);
921 		value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
922 		ppdu_info->rx_status.he_data5 |= value;
923 
924 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
925 						PACKET_EXTENSION_A_FACTOR);
926 		value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT;
927 		ppdu_info->rx_status.he_data5 |= value;
928 
929 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, TXBF);
930 		value = value << QDF_MON_STATUS_TXBF_SHIFT;
931 		ppdu_info->rx_status.he_data5 |= value;
932 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
933 					PACKET_EXTENSION_PE_DISAMBIGUITY);
934 		value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT;
935 		ppdu_info->rx_status.he_data5 |= value;
936 
937 		/* data6 */
938 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS);
939 		value++;
940 		ppdu_info->rx_status.nss = value;
941 		ppdu_info->rx_status.he_data6 = value;
942 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
943 							DOPPLER_INDICATION);
944 		value = value << QDF_MON_STATUS_DOPPLER_SHIFT;
945 		ppdu_info->rx_status.he_data6 |= value;
946 		value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
947 							TXOP_DURATION);
948 		value = value << QDF_MON_STATUS_TXOP_SHIFT;
949 		ppdu_info->rx_status.he_data6 |= value;
950 
951 		ppdu_info->rx_status.beamformed = HAL_RX_GET(he_sig_a_su_info,
952 					HE_SIG_A_SU_INFO_1, TXBF);
953 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
954 		break;
955 	}
956 	case WIFIPHYRX_HE_SIG_A_MU_DL_E:
957 	{
958 		uint8_t *he_sig_a_mu_dl_info = (uint8_t *)rx_tlv +
959 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_MU_DL_0,
960 			HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS);
961 
962 		ppdu_info->rx_status.he_mu_flags = 1;
963 
964 		/* HE Flags */
965 		/*data1*/
966 		ppdu_info->rx_status.he_data1 =
967 					QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
968 		ppdu_info->rx_status.he_data1 |=
969 			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
970 			QDF_MON_STATUS_HE_DL_UL_KNOWN |
971 			QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN |
972 			QDF_MON_STATUS_HE_STBC_KNOWN |
973 			QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN |
974 			QDF_MON_STATUS_HE_DOPPLER_KNOWN;
975 
976 		/* data2 */
977 		ppdu_info->rx_status.he_data2 =
978 			QDF_MON_STATUS_HE_GI_KNOWN;
979 		ppdu_info->rx_status.he_data2 |=
980 			QDF_MON_STATUS_LTF_SYMBOLS_KNOWN |
981 			QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
982 			QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
983 			QDF_MON_STATUS_TXOP_KNOWN |
984 			QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
985 
986 		/*data3*/
987 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
988 				HE_SIG_A_MU_DL_INFO_0, BSS_COLOR_ID);
989 		ppdu_info->rx_status.he_data3 = value;
990 
991 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
992 				HE_SIG_A_MU_DL_INFO_0, DL_UL_FLAG);
993 		value = value << QDF_MON_STATUS_DL_UL_SHIFT;
994 		ppdu_info->rx_status.he_data3 |= value;
995 
996 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
997 				HE_SIG_A_MU_DL_INFO_1,
998 				LDPC_EXTRA_SYMBOL);
999 		value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT;
1000 		ppdu_info->rx_status.he_data3 |= value;
1001 
1002 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1003 				HE_SIG_A_MU_DL_INFO_1, STBC);
1004 		he_stbc = value;
1005 		value = value << QDF_MON_STATUS_STBC_SHIFT;
1006 		ppdu_info->rx_status.he_data3 |= value;
1007 
1008 		/*data4*/
1009 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0,
1010 							SPATIAL_REUSE);
1011 		ppdu_info->rx_status.he_data4 = value;
1012 
1013 		/*data5*/
1014 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1015 				HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW);
1016 		ppdu_info->rx_status.he_data5 = value;
1017 		ppdu_info->rx_status.bw = value;
1018 
1019 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1020 				HE_SIG_A_MU_DL_INFO_0, CP_LTF_SIZE);
1021 		switch (value) {
1022 		case 0:
1023 			he_gi = HE_GI_0_8;
1024 			he_ltf = HE_LTF_4_X;
1025 			break;
1026 		case 1:
1027 			he_gi = HE_GI_0_8;
1028 			he_ltf = HE_LTF_2_X;
1029 			break;
1030 		case 2:
1031 			he_gi = HE_GI_1_6;
1032 			he_ltf = HE_LTF_2_X;
1033 			break;
1034 		case 3:
1035 			he_gi = HE_GI_3_2;
1036 			he_ltf = HE_LTF_4_X;
1037 			break;
1038 		}
1039 		ppdu_info->rx_status.sgi = he_gi;
1040 		value = he_gi << QDF_MON_STATUS_GI_SHIFT;
1041 		ppdu_info->rx_status.he_data5 |= value;
1042 
1043 		value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT;
1044 		ppdu_info->rx_status.he_data5 |= value;
1045 
1046 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1047 				   HE_SIG_A_MU_DL_INFO_1, NUM_LTF_SYMBOLS);
1048 		value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
1049 		ppdu_info->rx_status.he_data5 |= value;
1050 
1051 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1052 				   PACKET_EXTENSION_A_FACTOR);
1053 		value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT;
1054 		ppdu_info->rx_status.he_data5 |= value;
1055 
1056 
1057 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1058 				   PACKET_EXTENSION_PE_DISAMBIGUITY);
1059 		value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT;
1060 		ppdu_info->rx_status.he_data5 |= value;
1061 
1062 		/*data6*/
1063 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0,
1064 							DOPPLER_INDICATION);
1065 		value = value << QDF_MON_STATUS_DOPPLER_SHIFT;
1066 		ppdu_info->rx_status.he_data6 |= value;
1067 
1068 		value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1069 							TXOP_DURATION);
1070 		value = value << QDF_MON_STATUS_TXOP_SHIFT;
1071 		ppdu_info->rx_status.he_data6 |= value;
1072 
1073 		/* HE-MU Flags */
1074 		/* HE-MU-flags1 */
1075 		ppdu_info->rx_status.he_flags1 =
1076 			QDF_MON_STATUS_SIG_B_MCS_KNOWN |
1077 			QDF_MON_STATUS_SIG_B_DCM_KNOWN |
1078 			QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_1_KNOWN |
1079 			QDF_MON_STATUS_SIG_B_SYM_NUM_KNOWN |
1080 			QDF_MON_STATUS_RU_0_KNOWN;
1081 
1082 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1083 				HE_SIG_A_MU_DL_INFO_0, MCS_OF_SIG_B);
1084 		ppdu_info->rx_status.he_flags1 |= value;
1085 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1086 				HE_SIG_A_MU_DL_INFO_0, DCM_OF_SIG_B);
1087 		value = value << QDF_MON_STATUS_DCM_FLAG_1_SHIFT;
1088 		ppdu_info->rx_status.he_flags1 |= value;
1089 
1090 		/* HE-MU-flags2 */
1091 		ppdu_info->rx_status.he_flags2 =
1092 			QDF_MON_STATUS_BW_KNOWN;
1093 
1094 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1095 				HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW);
1096 		ppdu_info->rx_status.he_flags2 |= value;
1097 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1098 				HE_SIG_A_MU_DL_INFO_0, COMP_MODE_SIG_B);
1099 		value = value << QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT;
1100 		ppdu_info->rx_status.he_flags2 |= value;
1101 		value = HAL_RX_GET(he_sig_a_mu_dl_info,
1102 				HE_SIG_A_MU_DL_INFO_0, NUM_SIG_B_SYMBOLS);
1103 		value = value - 1;
1104 		value = value << QDF_MON_STATUS_NUM_SIG_B_SYMBOLS_SHIFT;
1105 		ppdu_info->rx_status.he_flags2 |= value;
1106 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
1107 		break;
1108 	}
1109 	case WIFIPHYRX_HE_SIG_B1_MU_E:
1110 	{
1111 
1112 		uint8_t *he_sig_b1_mu_info = (uint8_t *)rx_tlv +
1113 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B1_MU_0,
1114 			HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS);
1115 
1116 		ppdu_info->rx_status.he_sig_b_common_known |=
1117 			QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU0;
1118 		/* TODO: Check on the availability of other fields in
1119 		 * sig_b_common
1120 		 */
1121 
1122 		value = HAL_RX_GET(he_sig_b1_mu_info,
1123 				HE_SIG_B1_MU_INFO_0, RU_ALLOCATION);
1124 		ppdu_info->rx_status.he_RU[0] = value;
1125 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
1126 		break;
1127 	}
1128 	case WIFIPHYRX_HE_SIG_B2_MU_E:
1129 	{
1130 		uint8_t *he_sig_b2_mu_info = (uint8_t *)rx_tlv +
1131 			HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_MU_0,
1132 			HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS);
1133 		/*
1134 		 * Not all "HE" fields can be updated from
1135 		 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E
1136 		 * to populate rest of the "HE" fields for MU scenarios.
1137 		 */
1138 
1139 		/* HE-data1 */
1140 		ppdu_info->rx_status.he_data1 |=
1141 			QDF_MON_STATUS_HE_MCS_KNOWN |
1142 			QDF_MON_STATUS_HE_CODING_KNOWN;
1143 
1144 		/* HE-data2 */
1145 
1146 		/* HE-data3 */
1147 		value = HAL_RX_GET(he_sig_b2_mu_info,
1148 				HE_SIG_B2_MU_INFO_0, STA_MCS);
1149 		ppdu_info->rx_status.mcs = value;
1150 		value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1151 		ppdu_info->rx_status.he_data3 |= value;
1152 
1153 
1154 		value = HAL_RX_GET(he_sig_b2_mu_info,
1155 				HE_SIG_B2_MU_INFO_0, STA_CODING);
1156 		value = value << QDF_MON_STATUS_CODING_SHIFT;
1157 		ppdu_info->rx_status.he_data3 |= value;
1158 
1159 		/* HE-data4 */
1160 		value = HAL_RX_GET(he_sig_b2_mu_info,
1161 				HE_SIG_B2_MU_INFO_0, STA_ID);
1162 		value = value << QDF_MON_STATUS_STA_ID_SHIFT;
1163 		ppdu_info->rx_status.he_data4 |= value;
1164 
1165 		/* HE-data5 */
1166 
1167 		/* HE-data6 */
1168 		value = HAL_RX_GET(he_sig_b2_mu_info,
1169 				   HE_SIG_B2_MU_INFO_0, NSTS);
1170 		/* value n indicates n+1 spatial streams */
1171 		value++;
1172 		ppdu_info->rx_status.nss = value;
1173 		ppdu_info->rx_status.he_data6 |= value;
1174 
1175 		break;
1176 
1177 	}
1178 	case WIFIPHYRX_HE_SIG_B2_OFDMA_E:
1179 	{
1180 		uint8_t *he_sig_b2_ofdma_info =
1181 		(uint8_t *)rx_tlv +
1182 		HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0,
1183 		HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS);
1184 
1185 		/*
1186 		 * Not all "HE" fields can be updated from
1187 		 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E
1188 		 * to populate rest of "HE" fields for MU OFDMA scenarios.
1189 		 */
1190 
1191 		/* HE-data1 */
1192 		ppdu_info->rx_status.he_data1 |=
1193 			QDF_MON_STATUS_HE_MCS_KNOWN |
1194 			QDF_MON_STATUS_HE_DCM_KNOWN |
1195 			QDF_MON_STATUS_HE_CODING_KNOWN;
1196 
1197 		/* HE-data2 */
1198 		ppdu_info->rx_status.he_data2 |=
1199 					QDF_MON_STATUS_TXBF_KNOWN;
1200 
1201 		/* HE-data3 */
1202 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1203 				HE_SIG_B2_OFDMA_INFO_0, STA_MCS);
1204 		ppdu_info->rx_status.mcs = value;
1205 		value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1206 		ppdu_info->rx_status.he_data3 |= value;
1207 
1208 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1209 				HE_SIG_B2_OFDMA_INFO_0, STA_DCM);
1210 		he_dcm = value;
1211 		value = value << QDF_MON_STATUS_DCM_SHIFT;
1212 		ppdu_info->rx_status.he_data3 |= value;
1213 
1214 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1215 				HE_SIG_B2_OFDMA_INFO_0, STA_CODING);
1216 		value = value << QDF_MON_STATUS_CODING_SHIFT;
1217 		ppdu_info->rx_status.he_data3 |= value;
1218 
1219 		/* HE-data4 */
1220 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1221 				HE_SIG_B2_OFDMA_INFO_0, STA_ID);
1222 		value = value << QDF_MON_STATUS_STA_ID_SHIFT;
1223 		ppdu_info->rx_status.he_data4 |= value;
1224 
1225 		/* HE-data5 */
1226 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1227 				   HE_SIG_B2_OFDMA_INFO_0, TXBF);
1228 		value = value << QDF_MON_STATUS_TXBF_SHIFT;
1229 		ppdu_info->rx_status.he_data5 |= value;
1230 
1231 		/* HE-data6 */
1232 		value = HAL_RX_GET(he_sig_b2_ofdma_info,
1233 				   HE_SIG_B2_OFDMA_INFO_0, NSTS);
1234 		/* value n indicates n+1 spatial streams */
1235 		value++;
1236 		ppdu_info->rx_status.nss = value;
1237 		ppdu_info->rx_status.he_data6 |= value;
1238 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA;
1239 		break;
1240 	}
1241 	case WIFIPHYRX_RSSI_LEGACY_E:
1242 	{
1243 		uint8_t reception_type;
1244 		int8_t rssi_value;
1245 		uint8_t *rssi_info_tlv = (uint8_t *)rx_tlv +
1246 			HAL_RX_OFFSET(UNIFIED_PHYRX_RSSI_LEGACY_19,
1247 				RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS);
1248 
1249 		ppdu_info->rx_status.rssi_comb = HAL_RX_GET(rx_tlv,
1250 			PHYRX_RSSI_LEGACY_35, RSSI_COMB);
1251 		ppdu_info->rx_status.bw = hal->ops->hal_rx_get_tlv(rx_tlv);
1252 		ppdu_info->rx_status.he_re = 0;
1253 
1254 		reception_type = HAL_RX_GET(rx_tlv,
1255 					    PHYRX_RSSI_LEGACY_0,
1256 					    RECEPTION_TYPE);
1257 		switch (reception_type) {
1258 		case QDF_RECEPTION_TYPE_ULOFMDA:
1259 			ppdu_info->rx_status.reception_type =
1260 				HAL_RX_TYPE_MU_OFDMA;
1261 			ppdu_info->rx_status.ulofdma_flag = 1;
1262 			ppdu_info->rx_status.he_data1 =
1263 				QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
1264 			break;
1265 		case QDF_RECEPTION_TYPE_ULMIMO:
1266 			ppdu_info->rx_status.reception_type =
1267 				HAL_RX_TYPE_MU_MIMO;
1268 			ppdu_info->rx_status.he_data1 =
1269 				QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
1270 			break;
1271 		default:
1272 			ppdu_info->rx_status.reception_type =
1273 				HAL_RX_TYPE_SU;
1274 			break;
1275 		}
1276 		hal_rx_update_rssi_chain(ppdu_info, rssi_info_tlv);
1277 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1278 					RECEIVE_RSSI_INFO_0, RSSI_PRI20_CHAIN0);
1279 		ppdu_info->rx_status.rssi[0] = rssi_value;
1280 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1281 			  "RSSI_PRI20_CHAIN0: %d\n", rssi_value);
1282 
1283 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1284 					RECEIVE_RSSI_INFO_2, RSSI_PRI20_CHAIN1);
1285 		ppdu_info->rx_status.rssi[1] = rssi_value;
1286 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1287 			  "RSSI_PRI20_CHAIN1: %d\n", rssi_value);
1288 
1289 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1290 					RECEIVE_RSSI_INFO_4, RSSI_PRI20_CHAIN2);
1291 		ppdu_info->rx_status.rssi[2] = rssi_value;
1292 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1293 			  "RSSI_PRI20_CHAIN2: %d\n", rssi_value);
1294 
1295 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1296 					RECEIVE_RSSI_INFO_6, RSSI_PRI20_CHAIN3);
1297 		ppdu_info->rx_status.rssi[3] = rssi_value;
1298 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1299 			  "RSSI_PRI20_CHAIN3: %d\n", rssi_value);
1300 
1301 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1302 					RECEIVE_RSSI_INFO_8, RSSI_PRI20_CHAIN4);
1303 		ppdu_info->rx_status.rssi[4] = rssi_value;
1304 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1305 			  "RSSI_PRI20_CHAIN4: %d\n", rssi_value);
1306 
1307 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1308 					RECEIVE_RSSI_INFO_10,
1309 					RSSI_PRI20_CHAIN5);
1310 		ppdu_info->rx_status.rssi[5] = rssi_value;
1311 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1312 			  "RSSI_PRI20_CHAIN5: %d\n", rssi_value);
1313 
1314 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1315 					RECEIVE_RSSI_INFO_12,
1316 					RSSI_PRI20_CHAIN6);
1317 		ppdu_info->rx_status.rssi[6] = rssi_value;
1318 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1319 			  "RSSI_PRI20_CHAIN6: %d\n", rssi_value);
1320 
1321 		rssi_value = HAL_RX_GET(rssi_info_tlv,
1322 					RECEIVE_RSSI_INFO_14,
1323 					RSSI_PRI20_CHAIN7);
1324 		ppdu_info->rx_status.rssi[7] = rssi_value;
1325 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1326 			  "RSSI_PRI20_CHAIN7: %d\n", rssi_value);
1327 		break;
1328 	}
1329 	case WIFIPHYRX_OTHER_RECEIVE_INFO_E:
1330 		hal_rx_proc_phyrx_other_receive_info_tlv(hal, rx_tlv_hdr,
1331 								ppdu_info);
1332 		break;
1333 	case WIFIRX_HEADER_E:
1334 	{
1335 		struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info;
1336 		uint16_t mpdu_cnt = com_info->mpdu_cnt;
1337 
1338 		if (mpdu_cnt >= HAL_RX_MAX_MPDU) {
1339 			hal_alert("Number of MPDUs per PPDU exceeded");
1340 			break;
1341 		}
1342 		/* Update first_msdu_payload for every mpdu and increment
1343 		 * com_info->mpdu_cnt for every WIFIRX_HEADER_E TLV
1344 		 */
1345 		ppdu_info->ppdu_msdu_info[mpdu_cnt].first_msdu_payload =
1346 			rx_tlv;
1347 		ppdu_info->ppdu_msdu_info[mpdu_cnt].payload_len = tlv_len;
1348 		ppdu_info->ppdu_msdu_info[mpdu_cnt].nbuf = nbuf;
1349 		ppdu_info->msdu_info.first_msdu_payload = rx_tlv;
1350 		ppdu_info->msdu_info.payload_len = tlv_len;
1351 		ppdu_info->user_id = user_id;
1352 		ppdu_info->hdr_len = tlv_len;
1353 		ppdu_info->data = rx_tlv;
1354 		ppdu_info->data += 4;
1355 
1356 		/* for every RX_HEADER TLV increment mpdu_cnt */
1357 		com_info->mpdu_cnt++;
1358 		return HAL_TLV_STATUS_HEADER;
1359 	}
1360 	case WIFIRX_MPDU_START_E:
1361 	{
1362 		uint8_t *rx_mpdu_start =
1363 			(uint8_t *)rx_tlv + HAL_RX_OFFSET(UNIFIED_RX_MPDU_START_0,
1364 					RX_MPDU_INFO_RX_MPDU_INFO_DETAILS);
1365 		uint32_t ppdu_id =
1366 				HAL_RX_GET_PPDU_ID(rx_mpdu_start);
1367 		uint8_t filter_category = 0;
1368 
1369 		ppdu_info->nac_info.fc_valid =
1370 				HAL_RX_GET_FC_VALID(rx_mpdu_start);
1371 
1372 		ppdu_info->nac_info.to_ds_flag =
1373 				HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start);
1374 
1375 		ppdu_info->nac_info.frame_control =
1376 			HAL_RX_GET(rx_mpdu_start,
1377 				   RX_MPDU_INFO_14,
1378 				   MPDU_FRAME_CONTROL_FIELD);
1379 
1380 		ppdu_info->sw_frame_group_id =
1381 			HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start);
1382 
1383 		if (ppdu_info->sw_frame_group_id ==
1384 		    HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) {
1385 			ppdu_info->rx_status.frame_control_info_valid =
1386 				ppdu_info->nac_info.fc_valid;
1387 			ppdu_info->rx_status.frame_control =
1388 				ppdu_info->nac_info.frame_control;
1389 		}
1390 
1391 		ppdu_info->nac_info.mac_addr2_valid =
1392 				HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start);
1393 
1394 		*(uint16_t *)&ppdu_info->nac_info.mac_addr2[0] =
1395 			HAL_RX_GET(rx_mpdu_start,
1396 				   RX_MPDU_INFO_16,
1397 				   MAC_ADDR_AD2_15_0);
1398 
1399 		*(uint32_t *)&ppdu_info->nac_info.mac_addr2[2] =
1400 			HAL_RX_GET(rx_mpdu_start,
1401 				   RX_MPDU_INFO_17,
1402 				   MAC_ADDR_AD2_47_16);
1403 
1404 		if (ppdu_info->rx_status.prev_ppdu_id != ppdu_id) {
1405 			ppdu_info->rx_status.prev_ppdu_id = ppdu_id;
1406 			ppdu_info->rx_status.ppdu_len =
1407 				HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13,
1408 					   MPDU_LENGTH);
1409 		} else {
1410 			ppdu_info->rx_status.ppdu_len +=
1411 				HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13,
1412 				MPDU_LENGTH);
1413 		}
1414 
1415 		filter_category =
1416 				HAL_RX_GET_FILTER_CATEGORY(rx_mpdu_start);
1417 
1418 		if (filter_category == 0)
1419 			ppdu_info->rx_status.rxpcu_filter_pass = 1;
1420 		else if (filter_category == 1)
1421 			ppdu_info->rx_status.monitor_direct_used = 1;
1422 
1423 		ppdu_info->nac_info.mcast_bcast =
1424 			HAL_RX_GET(rx_mpdu_start,
1425 				   RX_MPDU_INFO_13,
1426 				   MCAST_BCAST);
1427 		break;
1428 	}
1429 	case WIFIRX_MPDU_END_E:
1430 		ppdu_info->user_id = user_id;
1431 		ppdu_info->fcs_err =
1432 			HAL_RX_GET(rx_tlv, RX_MPDU_END_1,
1433 				   FCS_ERR);
1434 		return HAL_TLV_STATUS_MPDU_END;
1435 	case WIFIRX_MSDU_END_E:
1436 		if (user_id < HAL_MAX_UL_MU_USERS) {
1437 			ppdu_info->rx_msdu_info[user_id].cce_metadata =
1438 				HAL_RX_MSDU_END_CCE_METADATA_GET(rx_tlv);
1439 			ppdu_info->rx_msdu_info[user_id].fse_metadata =
1440 				HAL_RX_MSDU_END_FSE_METADATA_GET(rx_tlv);
1441 			ppdu_info->rx_msdu_info[user_id].is_flow_idx_timeout =
1442 				HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(rx_tlv);
1443 			ppdu_info->rx_msdu_info[user_id].is_flow_idx_invalid =
1444 				HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(rx_tlv);
1445 			ppdu_info->rx_msdu_info[user_id].flow_idx =
1446 				HAL_RX_MSDU_END_FLOW_IDX_GET(rx_tlv);
1447 		}
1448 		return HAL_TLV_STATUS_MSDU_END;
1449 	case 0:
1450 		return HAL_TLV_STATUS_PPDU_DONE;
1451 
1452 	default:
1453 		if (hal_rx_handle_other_tlvs(tlv_tag, rx_tlv, ppdu_info))
1454 			unhandled = false;
1455 		else
1456 			unhandled = true;
1457 		break;
1458 	}
1459 
1460 	if (!unhandled)
1461 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1462 			  "%s TLV type: %d, TLV len:%d %s",
1463 			  __func__, tlv_tag, tlv_len,
1464 			  unhandled == true ? "unhandled" : "");
1465 
1466 	qdf_trace_hex_dump(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1467 				rx_tlv, tlv_len);
1468 
1469 	return HAL_TLV_STATUS_PPDU_NOT_DONE;
1470 }
1471 
1472 /**
1473  * hal_reo_setup - Initialize HW REO block
1474  *
1475  * @hal_soc: Opaque HAL SOC handle
1476  * @reo_params: parameters needed by HAL for REO config
1477  */
1478 static void hal_reo_setup_generic(struct hal_soc *soc,
1479 				  void *reoparams)
1480 {
1481 	uint32_t reg_val;
1482 	struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams;
1483 
1484 	reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR(
1485 		SEQ_WCSS_UMAC_REO_REG_OFFSET));
1486 
1487 	hal_reo_config(soc, reg_val, reo_params);
1488 	/* Other ring enable bits and REO_ENABLE will be set by FW */
1489 
1490 	/* TODO: Setup destination ring mapping if enabled */
1491 
1492 	/* TODO: Error destination ring setting is left to default.
1493 	 * Default setting is to send all errors to release ring.
1494 	 */
1495 
1496 	HAL_REG_WRITE(soc,
1497 		HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(
1498 		SEQ_WCSS_UMAC_REO_REG_OFFSET),
1499 		HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000);
1500 
1501 	HAL_REG_WRITE(soc,
1502 		HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(
1503 		SEQ_WCSS_UMAC_REO_REG_OFFSET),
1504 		(HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
1505 
1506 	HAL_REG_WRITE(soc,
1507 		HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(
1508 		SEQ_WCSS_UMAC_REO_REG_OFFSET),
1509 		(HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
1510 
1511 	HAL_REG_WRITE(soc,
1512 		HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(
1513 		SEQ_WCSS_UMAC_REO_REG_OFFSET),
1514 		(HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000));
1515 
1516 	/*
1517 	 * When hash based routing is enabled, routing of the rx packet
1518 	 * is done based on the following value: 1 _ _ _ _ The last 4
1519 	 * bits are based on hash[3:0]. This means the possible values
1520 	 * are 0x10 to 0x1f. This value is used to look-up the
1521 	 * ring ID configured in Destination_Ring_Ctrl_IX_* register.
1522 	 * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3
1523 	 * registers need to be configured to set-up the 16 entries to
1524 	 * map the hash values to a ring number. There are 3 bits per
1525 	 * hash entry – which are mapped as follows:
1526 	 * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI),
1527 	 * 7: NOT_USED.
1528 	*/
1529 	if (reo_params->rx_hash_enabled) {
1530 		HAL_REG_WRITE(soc,
1531 			HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
1532 			SEQ_WCSS_UMAC_REO_REG_OFFSET),
1533 			reo_params->remap1);
1534 
1535 		hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x",
1536 			  HAL_REG_READ(soc,
1537 				       HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
1538 				       SEQ_WCSS_UMAC_REO_REG_OFFSET)));
1539 
1540 		HAL_REG_WRITE(soc,
1541 			HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
1542 			SEQ_WCSS_UMAC_REO_REG_OFFSET),
1543 			reo_params->remap2);
1544 
1545 		hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x",
1546 			  HAL_REG_READ(soc,
1547 				       HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
1548 				       SEQ_WCSS_UMAC_REO_REG_OFFSET)));
1549 	}
1550 
1551 
1552 	/* TODO: Check if the following registers shoould be setup by host:
1553 	 * AGING_CONTROL
1554 	 * HIGH_MEMORY_THRESHOLD
1555 	 * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2]
1556 	 * GLOBAL_LINK_DESC_COUNT_CTRL
1557 	 */
1558 }
1559 
1560 /**
1561  * hal_get_hw_hptp_generic()  - Get HW head and tail pointer value for any ring
1562  * @hal_soc: Opaque HAL SOC handle
1563  * @hal_ring: Source ring pointer
1564  * @headp: Head Pointer
1565  * @tailp: Tail Pointer
1566  * @ring: Ring type
1567  *
1568  * Return: Update tail pointer and head pointer in arguments.
1569  */
1570 static inline
1571 void hal_get_hw_hptp_generic(struct hal_soc *hal_soc,
1572 			     hal_ring_handle_t hal_ring_hdl,
1573 			     uint32_t *headp, uint32_t *tailp,
1574 			     uint8_t ring)
1575 {
1576 	struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
1577 	struct hal_hw_srng_config *ring_config;
1578 	enum hal_ring_type ring_type = (enum hal_ring_type)ring;
1579 
1580 	if (!hal_soc  || !srng) {
1581 		QDF_TRACE(QDF_MODULE_ID_HAL, QDF_TRACE_LEVEL_ERROR,
1582 			  "%s: Context is Null", __func__);
1583 		return;
1584 	}
1585 
1586 	ring_config = HAL_SRNG_CONFIG(hal_soc, ring_type);
1587 	if (!ring_config->lmac_ring) {
1588 		if (srng->ring_dir == HAL_SRNG_SRC_RING) {
1589 			*headp = SRNG_SRC_REG_READ(srng, HP);
1590 			*tailp = SRNG_SRC_REG_READ(srng, TP);
1591 		} else {
1592 			*headp = SRNG_DST_REG_READ(srng, HP);
1593 			*tailp = SRNG_DST_REG_READ(srng, TP);
1594 		}
1595 	}
1596 }
1597 
1598 /**
1599  * hal_srng_src_hw_init - Private function to initialize SRNG
1600  * source ring HW
1601  * @hal_soc: HAL SOC handle
1602  * @srng: SRNG ring pointer
1603  */
1604 static inline
1605 void hal_srng_src_hw_init_generic(struct hal_soc *hal,
1606 				  struct hal_srng *srng)
1607 {
1608 	uint32_t reg_val = 0;
1609 	uint64_t tp_addr = 0;
1610 
1611 	hal_debug("hw_init srng %d", srng->ring_id);
1612 
1613 	if (srng->flags & HAL_SRNG_MSI_INTR) {
1614 		SRNG_SRC_REG_WRITE(srng, MSI1_BASE_LSB,
1615 			srng->msi_addr & 0xffffffff);
1616 		reg_val = SRNG_SM(SRNG_SRC_FLD(MSI1_BASE_MSB, ADDR),
1617 			(uint64_t)(srng->msi_addr) >> 32) |
1618 			SRNG_SM(SRNG_SRC_FLD(MSI1_BASE_MSB,
1619 			MSI1_ENABLE), 1);
1620 		SRNG_SRC_REG_WRITE(srng, MSI1_BASE_MSB, reg_val);
1621 		SRNG_SRC_REG_WRITE(srng, MSI1_DATA, srng->msi_data);
1622 	}
1623 
1624 	SRNG_SRC_REG_WRITE(srng, BASE_LSB, srng->ring_base_paddr & 0xffffffff);
1625 	reg_val = SRNG_SM(SRNG_SRC_FLD(BASE_MSB, RING_BASE_ADDR_MSB),
1626 		((uint64_t)(srng->ring_base_paddr) >> 32)) |
1627 		SRNG_SM(SRNG_SRC_FLD(BASE_MSB, RING_SIZE),
1628 		srng->entry_size * srng->num_entries);
1629 	SRNG_SRC_REG_WRITE(srng, BASE_MSB, reg_val);
1630 
1631 	reg_val = SRNG_SM(SRNG_SRC_FLD(ID, ENTRY_SIZE), srng->entry_size);
1632 	SRNG_SRC_REG_WRITE(srng, ID, reg_val);
1633 
1634 	/**
1635 	 * Interrupt setup:
1636 	 * Default interrupt mode is 'pulse'. Need to setup SW_INTERRUPT_MODE
1637 	 * if level mode is required
1638 	 */
1639 	reg_val = 0;
1640 
1641 	/*
1642 	 * WAR - Hawkeye v1 has a hardware bug which requires timer value to be
1643 	 * programmed in terms of 1us resolution instead of 8us resolution as
1644 	 * given in MLD.
1645 	 */
1646 	if (srng->intr_timer_thres_us) {
1647 		reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX0,
1648 			INTERRUPT_TIMER_THRESHOLD),
1649 			srng->intr_timer_thres_us);
1650 		/* For HK v2 this should be (srng->intr_timer_thres_us >> 3) */
1651 	}
1652 
1653 	if (srng->intr_batch_cntr_thres_entries) {
1654 		reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX0,
1655 			BATCH_COUNTER_THRESHOLD),
1656 			srng->intr_batch_cntr_thres_entries *
1657 			srng->entry_size);
1658 	}
1659 	SRNG_SRC_REG_WRITE(srng, CONSUMER_INT_SETUP_IX0, reg_val);
1660 
1661 	reg_val = 0;
1662 	if (srng->flags & HAL_SRNG_LOW_THRES_INTR_ENABLE) {
1663 		reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX1,
1664 			LOW_THRESHOLD), srng->u.src_ring.low_threshold);
1665 	}
1666 
1667 	SRNG_SRC_REG_WRITE(srng, CONSUMER_INT_SETUP_IX1, reg_val);
1668 
1669 	/* As per HW team, TP_ADDR and HP_ADDR for Idle link ring should
1670 	 * remain 0 to avoid some WBM stability issues. Remote head/tail
1671 	 * pointers are not required since this ring is completely managed
1672 	 * by WBM HW
1673 	 */
1674 	reg_val = 0;
1675 	if (srng->ring_id != HAL_SRNG_WBM_IDLE_LINK) {
1676 		tp_addr = (uint64_t)(hal->shadow_rdptr_mem_paddr +
1677 			((unsigned long)(srng->u.src_ring.tp_addr) -
1678 			(unsigned long)(hal->shadow_rdptr_mem_vaddr)));
1679 		SRNG_SRC_REG_WRITE(srng, TP_ADDR_LSB, tp_addr & 0xffffffff);
1680 		SRNG_SRC_REG_WRITE(srng, TP_ADDR_MSB, tp_addr >> 32);
1681 	} else {
1682 		reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, RING_ID_DISABLE), 1);
1683 	}
1684 
1685 	/* Initilaize head and tail pointers to indicate ring is empty */
1686 	SRNG_SRC_REG_WRITE(srng, HP, 0);
1687 	SRNG_SRC_REG_WRITE(srng, TP, 0);
1688 	*(srng->u.src_ring.tp_addr) = 0;
1689 
1690 	reg_val |= ((srng->flags & HAL_SRNG_DATA_TLV_SWAP) ?
1691 			SRNG_SM(SRNG_SRC_FLD(MISC, DATA_TLV_SWAP_BIT), 1) : 0) |
1692 			((srng->flags & HAL_SRNG_RING_PTR_SWAP) ?
1693 			SRNG_SM(SRNG_SRC_FLD(MISC, HOST_FW_SWAP_BIT), 1) : 0) |
1694 			((srng->flags & HAL_SRNG_MSI_SWAP) ?
1695 			SRNG_SM(SRNG_SRC_FLD(MISC, MSI_SWAP_BIT), 1) : 0);
1696 
1697 	/* Loop count is not used for SRC rings */
1698 	reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, LOOPCNT_DISABLE), 1);
1699 
1700 	/*
1701 	 * reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, SRNG_ENABLE), 1);
1702 	 * todo: update fw_api and replace with above line
1703 	 * (when SRNG_ENABLE field for the MISC register is available in fw_api)
1704 	 * (WCSS_UMAC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_MISC)
1705 	 */
1706 	reg_val |= 0x40;
1707 
1708 	SRNG_SRC_REG_WRITE(srng, MISC, reg_val);
1709 }
1710 
1711 /**
1712  * hal_srng_dst_hw_init - Private function to initialize SRNG
1713  * destination ring HW
1714  * @hal_soc: HAL SOC handle
1715  * @srng: SRNG ring pointer
1716  */
1717 static inline
1718 void hal_srng_dst_hw_init_generic(struct hal_soc *hal,
1719 				  struct hal_srng *srng)
1720 {
1721 	uint32_t reg_val = 0;
1722 	uint64_t hp_addr = 0;
1723 
1724 	hal_debug("hw_init srng %d", srng->ring_id);
1725 
1726 	if (srng->flags & HAL_SRNG_MSI_INTR) {
1727 		SRNG_DST_REG_WRITE(srng, MSI1_BASE_LSB,
1728 			srng->msi_addr & 0xffffffff);
1729 		reg_val = SRNG_SM(SRNG_DST_FLD(MSI1_BASE_MSB, ADDR),
1730 			(uint64_t)(srng->msi_addr) >> 32) |
1731 			SRNG_SM(SRNG_DST_FLD(MSI1_BASE_MSB,
1732 			MSI1_ENABLE), 1);
1733 		SRNG_DST_REG_WRITE(srng, MSI1_BASE_MSB, reg_val);
1734 		SRNG_DST_REG_WRITE(srng, MSI1_DATA, srng->msi_data);
1735 	}
1736 
1737 	SRNG_DST_REG_WRITE(srng, BASE_LSB, srng->ring_base_paddr & 0xffffffff);
1738 	reg_val = SRNG_SM(SRNG_DST_FLD(BASE_MSB, RING_BASE_ADDR_MSB),
1739 		((uint64_t)(srng->ring_base_paddr) >> 32)) |
1740 		SRNG_SM(SRNG_DST_FLD(BASE_MSB, RING_SIZE),
1741 		srng->entry_size * srng->num_entries);
1742 	SRNG_DST_REG_WRITE(srng, BASE_MSB, reg_val);
1743 
1744 	reg_val = SRNG_SM(SRNG_DST_FLD(ID, RING_ID), srng->ring_id) |
1745 		SRNG_SM(SRNG_DST_FLD(ID, ENTRY_SIZE), srng->entry_size);
1746 	SRNG_DST_REG_WRITE(srng, ID, reg_val);
1747 
1748 
1749 	/**
1750 	 * Interrupt setup:
1751 	 * Default interrupt mode is 'pulse'. Need to setup SW_INTERRUPT_MODE
1752 	 * if level mode is required
1753 	 */
1754 	reg_val = 0;
1755 	if (srng->intr_timer_thres_us) {
1756 		reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT_SETUP,
1757 			INTERRUPT_TIMER_THRESHOLD),
1758 			srng->intr_timer_thres_us >> 3);
1759 	}
1760 
1761 	if (srng->intr_batch_cntr_thres_entries) {
1762 		reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT_SETUP,
1763 			BATCH_COUNTER_THRESHOLD),
1764 			srng->intr_batch_cntr_thres_entries *
1765 			srng->entry_size);
1766 	}
1767 
1768 	SRNG_DST_REG_WRITE(srng, PRODUCER_INT_SETUP, reg_val);
1769 	hp_addr = (uint64_t)(hal->shadow_rdptr_mem_paddr +
1770 		((unsigned long)(srng->u.dst_ring.hp_addr) -
1771 		(unsigned long)(hal->shadow_rdptr_mem_vaddr)));
1772 	SRNG_DST_REG_WRITE(srng, HP_ADDR_LSB, hp_addr & 0xffffffff);
1773 	SRNG_DST_REG_WRITE(srng, HP_ADDR_MSB, hp_addr >> 32);
1774 
1775 	/* Initilaize head and tail pointers to indicate ring is empty */
1776 	SRNG_DST_REG_WRITE(srng, HP, 0);
1777 	SRNG_DST_REG_WRITE(srng, TP, 0);
1778 	*(srng->u.dst_ring.hp_addr) = 0;
1779 
1780 	reg_val = ((srng->flags & HAL_SRNG_DATA_TLV_SWAP) ?
1781 			SRNG_SM(SRNG_DST_FLD(MISC, DATA_TLV_SWAP_BIT), 1) : 0) |
1782 			((srng->flags & HAL_SRNG_RING_PTR_SWAP) ?
1783 			SRNG_SM(SRNG_DST_FLD(MISC, HOST_FW_SWAP_BIT), 1) : 0) |
1784 			((srng->flags & HAL_SRNG_MSI_SWAP) ?
1785 			SRNG_SM(SRNG_DST_FLD(MISC, MSI_SWAP_BIT), 1) : 0);
1786 
1787 	/*
1788 	 * reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, SRNG_ENABLE), 1);
1789 	 * todo: update fw_api and replace with above line
1790 	 * (when SRNG_ENABLE field for the MISC register is available in fw_api)
1791 	 * (WCSS_UMAC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_MISC)
1792 	 */
1793 	reg_val |= 0x40;
1794 
1795 	SRNG_DST_REG_WRITE(srng, MISC, reg_val);
1796 
1797 }
1798 
1799 #define HAL_RX_WBM_ERR_SRC_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
1800 		(WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_OFFSET >> 2))) & \
1801 		WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_MASK) >> \
1802 		WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_LSB)
1803 
1804 #define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
1805 		(WBM_RELEASE_RING_2_REO_PUSH_REASON_OFFSET >> 2))) & \
1806 		WBM_RELEASE_RING_2_REO_PUSH_REASON_MASK) >> \
1807 		WBM_RELEASE_RING_2_REO_PUSH_REASON_LSB)
1808 
1809 #define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
1810 		(WBM_RELEASE_RING_2_REO_ERROR_CODE_OFFSET >> 2))) & \
1811 		WBM_RELEASE_RING_2_REO_ERROR_CODE_MASK) >> \
1812 		WBM_RELEASE_RING_2_REO_ERROR_CODE_LSB)
1813 
1814 #define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc)	\
1815 	(((*(((uint32_t *) wbm_desc) +			\
1816 	(WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_OFFSET >> 2))) & \
1817 	WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_MASK) >>	\
1818 	WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_LSB)
1819 
1820 #define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc)	\
1821 	(((*(((uint32_t *) wbm_desc) +			\
1822 	(WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_OFFSET >> 2))) & \
1823 	WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_MASK) >>	\
1824 	WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_LSB)
1825 
1826 /**
1827  * hal_rx_wbm_err_info_get_generic(): Retrieves WBM error code and reason and
1828  *	save it to hal_wbm_err_desc_info structure passed by caller
1829  * @wbm_desc: wbm ring descriptor
1830  * @wbm_er_info1: hal_wbm_err_desc_info structure, output parameter.
1831  * Return: void
1832  */
1833 static inline void hal_rx_wbm_err_info_get_generic(void *wbm_desc,
1834 				void *wbm_er_info1)
1835 {
1836 	struct hal_wbm_err_desc_info *wbm_er_info =
1837 		(struct hal_wbm_err_desc_info *)wbm_er_info1;
1838 
1839 	wbm_er_info->wbm_err_src = HAL_RX_WBM_ERR_SRC_GET(wbm_desc);
1840 	wbm_er_info->reo_psh_rsn = HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc);
1841 	wbm_er_info->reo_err_code = HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc);
1842 	wbm_er_info->rxdma_psh_rsn = HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc);
1843 	wbm_er_info->rxdma_err_code = HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc);
1844 }
1845 
1846 /**
1847  * hal_tx_comp_get_release_reason_generic() - TQM Release reason
1848  * @hal_desc: completion ring descriptor pointer
1849  *
1850  * This function will return the type of pointer - buffer or descriptor
1851  *
1852  * Return: buffer type
1853  */
1854 static inline uint8_t hal_tx_comp_get_release_reason_generic(void *hal_desc)
1855 {
1856 	uint32_t comp_desc =
1857 		*(uint32_t *) (((uint8_t *) hal_desc) +
1858 			       WBM_RELEASE_RING_2_TQM_RELEASE_REASON_OFFSET);
1859 
1860 	return (comp_desc & WBM_RELEASE_RING_2_TQM_RELEASE_REASON_MASK) >>
1861 		WBM_RELEASE_RING_2_TQM_RELEASE_REASON_LSB;
1862 }
1863 
1864 /**
1865  * hal_rx_dump_mpdu_start_tlv_generic: dump RX mpdu_start TLV in structured
1866  *			       human readable format.
1867  * @mpdu_start: pointer the rx_attention TLV in pkt.
1868  * @dbg_level: log level.
1869  *
1870  * Return: void
1871  */
1872 static inline void hal_rx_dump_mpdu_start_tlv_generic(void *mpdustart,
1873 						      uint8_t dbg_level)
1874 {
1875 	struct rx_mpdu_start *mpdu_start = (struct rx_mpdu_start *)mpdustart;
1876 	struct rx_mpdu_info *mpdu_info =
1877 		(struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details;
1878 
1879 	hal_verbose_debug(
1880 			  "rx_mpdu_start tlv (1/5) - "
1881 			  "rxpcu_mpdu_filter_in_category: %x "
1882 			  "sw_frame_group_id: %x "
1883 			  "ndp_frame: %x "
1884 			  "phy_err: %x "
1885 			  "phy_err_during_mpdu_header: %x "
1886 			  "protocol_version_err: %x "
1887 			  "ast_based_lookup_valid: %x "
1888 			  "phy_ppdu_id: %x "
1889 			  "ast_index: %x "
1890 			  "sw_peer_id: %x "
1891 			  "mpdu_frame_control_valid: %x "
1892 			  "mpdu_duration_valid: %x "
1893 			  "mac_addr_ad1_valid: %x "
1894 			  "mac_addr_ad2_valid: %x "
1895 			  "mac_addr_ad3_valid: %x "
1896 			  "mac_addr_ad4_valid: %x "
1897 			  "mpdu_sequence_control_valid: %x "
1898 			  "mpdu_qos_control_valid: %x "
1899 			  "mpdu_ht_control_valid: %x "
1900 			  "frame_encryption_info_valid: %x ",
1901 			  mpdu_info->rxpcu_mpdu_filter_in_category,
1902 			  mpdu_info->sw_frame_group_id,
1903 			  mpdu_info->ndp_frame,
1904 			  mpdu_info->phy_err,
1905 			  mpdu_info->phy_err_during_mpdu_header,
1906 			  mpdu_info->protocol_version_err,
1907 			  mpdu_info->ast_based_lookup_valid,
1908 			  mpdu_info->phy_ppdu_id,
1909 			  mpdu_info->ast_index,
1910 			  mpdu_info->sw_peer_id,
1911 			  mpdu_info->mpdu_frame_control_valid,
1912 			  mpdu_info->mpdu_duration_valid,
1913 			  mpdu_info->mac_addr_ad1_valid,
1914 			  mpdu_info->mac_addr_ad2_valid,
1915 			  mpdu_info->mac_addr_ad3_valid,
1916 			  mpdu_info->mac_addr_ad4_valid,
1917 			  mpdu_info->mpdu_sequence_control_valid,
1918 			  mpdu_info->mpdu_qos_control_valid,
1919 			  mpdu_info->mpdu_ht_control_valid,
1920 			  mpdu_info->frame_encryption_info_valid);
1921 
1922 	hal_verbose_debug(
1923 			  "rx_mpdu_start tlv (2/5) - "
1924 			  "fr_ds: %x "
1925 			  "to_ds: %x "
1926 			  "encrypted: %x "
1927 			  "mpdu_retry: %x "
1928 			  "mpdu_sequence_number: %x "
1929 			  "epd_en: %x "
1930 			  "all_frames_shall_be_encrypted: %x "
1931 			  "encrypt_type: %x "
1932 			  "mesh_sta: %x "
1933 			  "bssid_hit: %x "
1934 			  "bssid_number: %x "
1935 			  "tid: %x "
1936 			  "pn_31_0: %x "
1937 			  "pn_63_32: %x "
1938 			  "pn_95_64: %x "
1939 			  "pn_127_96: %x "
1940 			  "peer_meta_data: %x "
1941 			  "rxpt_classify_info.reo_destination_indication: %x "
1942 			  "rxpt_classify_info.use_flow_id_toeplitz_clfy: %x "
1943 			  "rx_reo_queue_desc_addr_31_0: %x ",
1944 			  mpdu_info->fr_ds,
1945 			  mpdu_info->to_ds,
1946 			  mpdu_info->encrypted,
1947 			  mpdu_info->mpdu_retry,
1948 			  mpdu_info->mpdu_sequence_number,
1949 			  mpdu_info->epd_en,
1950 			  mpdu_info->all_frames_shall_be_encrypted,
1951 			  mpdu_info->encrypt_type,
1952 			  mpdu_info->mesh_sta,
1953 			  mpdu_info->bssid_hit,
1954 			  mpdu_info->bssid_number,
1955 			  mpdu_info->tid,
1956 			  mpdu_info->pn_31_0,
1957 			  mpdu_info->pn_63_32,
1958 			  mpdu_info->pn_95_64,
1959 			  mpdu_info->pn_127_96,
1960 			  mpdu_info->peer_meta_data,
1961 			  mpdu_info->rxpt_classify_info_details.reo_destination_indication,
1962 			  mpdu_info->rxpt_classify_info_details.use_flow_id_toeplitz_clfy,
1963 			  mpdu_info->rx_reo_queue_desc_addr_31_0);
1964 
1965 	hal_verbose_debug(
1966 			  "rx_mpdu_start tlv (3/5) - "
1967 			  "rx_reo_queue_desc_addr_39_32: %x "
1968 			  "receive_queue_number: %x "
1969 			  "pre_delim_err_warning: %x "
1970 			  "first_delim_err: %x "
1971 			  "key_id_octet: %x "
1972 			  "new_peer_entry: %x "
1973 			  "decrypt_needed: %x "
1974 			  "decap_type: %x "
1975 			  "rx_insert_vlan_c_tag_padding: %x "
1976 			  "rx_insert_vlan_s_tag_padding: %x "
1977 			  "strip_vlan_c_tag_decap: %x "
1978 			  "strip_vlan_s_tag_decap: %x "
1979 			  "pre_delim_count: %x "
1980 			  "ampdu_flag: %x "
1981 			  "bar_frame: %x "
1982 			  "mpdu_length: %x "
1983 			  "first_mpdu: %x "
1984 			  "mcast_bcast: %x "
1985 			  "ast_index_not_found: %x "
1986 			  "ast_index_timeout: %x ",
1987 			  mpdu_info->rx_reo_queue_desc_addr_39_32,
1988 			  mpdu_info->receive_queue_number,
1989 			  mpdu_info->pre_delim_err_warning,
1990 			  mpdu_info->first_delim_err,
1991 			  mpdu_info->key_id_octet,
1992 			  mpdu_info->new_peer_entry,
1993 			  mpdu_info->decrypt_needed,
1994 			  mpdu_info->decap_type,
1995 			  mpdu_info->rx_insert_vlan_c_tag_padding,
1996 			  mpdu_info->rx_insert_vlan_s_tag_padding,
1997 			  mpdu_info->strip_vlan_c_tag_decap,
1998 			  mpdu_info->strip_vlan_s_tag_decap,
1999 			  mpdu_info->pre_delim_count,
2000 			  mpdu_info->ampdu_flag,
2001 			  mpdu_info->bar_frame,
2002 			  mpdu_info->mpdu_length,
2003 			  mpdu_info->first_mpdu,
2004 			  mpdu_info->mcast_bcast,
2005 			  mpdu_info->ast_index_not_found,
2006 			  mpdu_info->ast_index_timeout);
2007 
2008 	hal_verbose_debug(
2009 			  "rx_mpdu_start tlv (4/5) - "
2010 			  "power_mgmt: %x "
2011 			  "non_qos: %x "
2012 			  "null_data: %x "
2013 			  "mgmt_type: %x "
2014 			  "ctrl_type: %x "
2015 			  "more_data: %x "
2016 			  "eosp: %x "
2017 			  "fragment_flag: %x "
2018 			  "order: %x "
2019 			  "u_apsd_trigger: %x "
2020 			  "encrypt_required: %x "
2021 			  "directed: %x "
2022 			  "mpdu_frame_control_field: %x "
2023 			  "mpdu_duration_field: %x "
2024 			  "mac_addr_ad1_31_0: %x "
2025 			  "mac_addr_ad1_47_32: %x "
2026 			  "mac_addr_ad2_15_0: %x "
2027 			  "mac_addr_ad2_47_16: %x "
2028 			  "mac_addr_ad3_31_0: %x "
2029 			  "mac_addr_ad3_47_32: %x ",
2030 			  mpdu_info->power_mgmt,
2031 			  mpdu_info->non_qos,
2032 			  mpdu_info->null_data,
2033 			  mpdu_info->mgmt_type,
2034 			  mpdu_info->ctrl_type,
2035 			  mpdu_info->more_data,
2036 			  mpdu_info->eosp,
2037 			  mpdu_info->fragment_flag,
2038 			  mpdu_info->order,
2039 			  mpdu_info->u_apsd_trigger,
2040 			  mpdu_info->encrypt_required,
2041 			  mpdu_info->directed,
2042 			  mpdu_info->mpdu_frame_control_field,
2043 			  mpdu_info->mpdu_duration_field,
2044 			  mpdu_info->mac_addr_ad1_31_0,
2045 			  mpdu_info->mac_addr_ad1_47_32,
2046 			  mpdu_info->mac_addr_ad2_15_0,
2047 			  mpdu_info->mac_addr_ad2_47_16,
2048 			  mpdu_info->mac_addr_ad3_31_0,
2049 			  mpdu_info->mac_addr_ad3_47_32);
2050 
2051 	hal_verbose_debug(
2052 			  "rx_mpdu_start tlv (5/5) - "
2053 			  "mpdu_sequence_control_field: %x "
2054 			  "mac_addr_ad4_31_0: %x "
2055 			  "mac_addr_ad4_47_32: %x "
2056 			  "mpdu_qos_control_field: %x "
2057 			  "mpdu_ht_control_field: %x ",
2058 			  mpdu_info->mpdu_sequence_control_field,
2059 			  mpdu_info->mac_addr_ad4_31_0,
2060 			  mpdu_info->mac_addr_ad4_47_32,
2061 			  mpdu_info->mpdu_qos_control_field,
2062 			  mpdu_info->mpdu_ht_control_field);
2063 }
2064 
2065 /**
2066  * hal_tx_desc_set_search_type - Set the search type value
2067  * @desc: Handle to Tx Descriptor
2068  * @search_type: search type
2069  *		     0 – Normal search
2070  *		     1 – Index based address search
2071  *		     2 – Index based flow search
2072  *
2073  * Return: void
2074  */
2075 #ifdef TCL_DATA_CMD_2_SEARCH_TYPE_OFFSET
2076 static void hal_tx_desc_set_search_type_generic(void *desc,
2077 						uint8_t search_type)
2078 {
2079 	HAL_SET_FLD(desc, TCL_DATA_CMD_2, SEARCH_TYPE) |=
2080 		HAL_TX_SM(TCL_DATA_CMD_2, SEARCH_TYPE, search_type);
2081 }
2082 #else
2083 static void hal_tx_desc_set_search_type_generic(void *desc,
2084 						uint8_t search_type)
2085 {
2086 }
2087 
2088 #endif
2089 
2090 /**
2091  * hal_tx_desc_set_search_index - Set the search index value
2092  * @desc: Handle to Tx Descriptor
2093  * @search_index: The index that will be used for index based address or
2094  *                flow search. The field is valid when 'search_type' is
2095  *                1 0r 2
2096  *
2097  * Return: void
2098  */
2099 #ifdef TCL_DATA_CMD_5_SEARCH_INDEX_OFFSET
2100 static void hal_tx_desc_set_search_index_generic(void *desc,
2101 						 uint32_t search_index)
2102 {
2103 	HAL_SET_FLD(desc, TCL_DATA_CMD_5, SEARCH_INDEX) |=
2104 		HAL_TX_SM(TCL_DATA_CMD_5, SEARCH_INDEX, search_index);
2105 }
2106 #else
2107 static void hal_tx_desc_set_search_index_generic(void *desc,
2108 						 uint32_t search_index)
2109 {
2110 }
2111 #endif
2112 
2113 /**
2114  * hal_tx_desc_set_cache_set_num_generic - Set the cache-set-num value
2115  * @desc: Handle to Tx Descriptor
2116  * @cache_num: Cache set number that should be used to cache the index
2117  *                based search results, for address and flow search.
2118  *                This value should be equal to LSB four bits of the hash value
2119  *                of match data, in case of search index points to an entry
2120  *                which may be used in content based search also. The value can
2121  *                be anything when the entry pointed by search index will not be
2122  *                used for content based search.
2123  *
2124  * Return: void
2125  */
2126 #ifdef TCL_DATA_CMD_5_CACHE_SET_NUM_OFFSET
2127 static void hal_tx_desc_set_cache_set_num_generic(void *desc,
2128 						  uint8_t cache_num)
2129 {
2130 	HAL_SET_FLD(desc, TCL_DATA_CMD_5, CACHE_SET_NUM) |=
2131 		HAL_TX_SM(TCL_DATA_CMD_5, CACHE_SET_NUM, cache_num);
2132 }
2133 #else
2134 static void hal_tx_desc_set_cache_set_num_generic(void *desc,
2135 						  uint8_t cache_num)
2136 {
2137 }
2138 #endif
2139 
2140 /**
2141  * hal_tx_set_pcp_tid_map_generic() - Configure default PCP to TID map table
2142  * @soc: HAL SoC context
2143  * @map: PCP-TID mapping table
2144  *
2145  * PCP are mapped to 8 TID values using TID values programmed
2146  * in one set of mapping registers PCP_TID_MAP_<0 to 6>
2147  * The mapping register has TID mapping for 8 PCP values
2148  *
2149  * Return: none
2150  */
2151 static void hal_tx_set_pcp_tid_map_generic(struct hal_soc *soc, uint8_t *map)
2152 {
2153 	uint32_t addr, value;
2154 
2155 	addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR(
2156 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET);
2157 
2158 	value = (map[0] |
2159 		(map[1] << HWIO_TCL_R0_PCP_TID_MAP_PCP_1_SHFT) |
2160 		(map[2] << HWIO_TCL_R0_PCP_TID_MAP_PCP_2_SHFT) |
2161 		(map[3] << HWIO_TCL_R0_PCP_TID_MAP_PCP_3_SHFT) |
2162 		(map[4] << HWIO_TCL_R0_PCP_TID_MAP_PCP_4_SHFT) |
2163 		(map[5] << HWIO_TCL_R0_PCP_TID_MAP_PCP_5_SHFT) |
2164 		(map[6] << HWIO_TCL_R0_PCP_TID_MAP_PCP_6_SHFT) |
2165 		(map[7] << HWIO_TCL_R0_PCP_TID_MAP_PCP_7_SHFT));
2166 
2167 	HAL_REG_WRITE(soc, addr, (value & HWIO_TCL_R0_PCP_TID_MAP_RMSK));
2168 }
2169 
2170 /**
2171  * hal_tx_update_pcp_tid_generic() - Update the pcp tid map table with
2172  *					value received from user-space
2173  * @soc: HAL SoC context
2174  * @pcp: pcp value
2175  * @tid : tid value
2176  *
2177  * Return: void
2178  */
2179 static
2180 void hal_tx_update_pcp_tid_generic(struct hal_soc *soc,
2181 				   uint8_t pcp, uint8_t tid)
2182 {
2183 	uint32_t addr, value, regval;
2184 
2185 	addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR(
2186 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET);
2187 
2188 	value = (uint32_t)tid << (HAL_TX_BITS_PER_TID * pcp);
2189 
2190 	/* Read back previous PCP TID config and update
2191 	 * with new config.
2192 	 */
2193 	regval = HAL_REG_READ(soc, addr);
2194 	regval &= ~(HAL_TX_TID_BITS_MASK << (HAL_TX_BITS_PER_TID * pcp));
2195 	regval |= value;
2196 
2197 	HAL_REG_WRITE(soc, addr,
2198 		      (regval & HWIO_TCL_R0_PCP_TID_MAP_RMSK));
2199 }
2200 
2201 /**
2202  * hal_tx_update_tidmap_prty_generic() - Update the tid map priority
2203  * @soc: HAL SoC context
2204  * @val: priority value
2205  *
2206  * Return: void
2207  */
2208 static
2209 void hal_tx_update_tidmap_prty_generic(struct hal_soc *soc, uint8_t value)
2210 {
2211 	uint32_t addr;
2212 
2213 	addr = HWIO_TCL_R0_TID_MAP_PRTY_ADDR(
2214 				SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET);
2215 
2216 	HAL_REG_WRITE(soc, addr,
2217 		      (value & HWIO_TCL_R0_TID_MAP_PRTY_RMSK));
2218 }
2219 
2220 #endif /* _HAL_GENERIC_API_H_ */
2221