Эх сурвалжийг харах

qcacmn: Add support for tx monitor HE MU and minor fixes

Add support for,
	a) HE MU radiotap information
	b) Multi sta BA frame generation and
minor fix,
	a) handling timestamp NULL,
	b) update NSS and other field in radiotap

Change-Id: I7a8b95328779f967b9e63ff8048242412ab472b0
CRs-Fixed: 3270361
nobelj 2 жил өмнө
parent
commit
5e42bbc352

+ 7 - 9
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c

@@ -517,9 +517,11 @@ struct dp_tx_ppdu_info *dp_tx_mon_get_ppdu_info(struct dp_pdev *pdev,
 
 	/* assign tx_ppdu_info to monitor pdev for reference */
 	if (type == TX_PROT_PPDU_INFO) {
+		qdf_mem_zero(&tx_mon_be->prot_status_info, sizeof(struct hal_tx_status_info));
 		tx_mon_be->tx_prot_ppdu_info = tx_ppdu_info;
 		TXMON_PPDU_HAL(tx_ppdu_info, is_data) = 0;
 	} else {
+		qdf_mem_zero(&tx_mon_be->data_status_info, sizeof(struct hal_tx_status_info));
 		tx_mon_be->tx_data_ppdu_info = tx_ppdu_info;
 		TXMON_PPDU_HAL(tx_ppdu_info, is_data) = 1;
 	}
@@ -951,6 +953,10 @@ dp_populate_tsft_from_phy_timestamp(struct dp_pdev *pdev,
 		tx_mon_be->last_ppdu_timestamp = ppdu_timestamp;
 	}
 
+	if (!TXMON_PPDU_COM(ppdu_info, tsft) &&
+	    !TXMON_PPDU_COM(ppdu_info, ppdu_timestamp))
+		return QDF_STATUS_E_EMPTY;
+
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -965,11 +971,6 @@ static void
 dp_tx_mon_update_radiotap(struct dp_pdev *pdev,
 			  struct dp_tx_ppdu_info *ppdu_info)
 {
-	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
-	struct dp_mon_pdev_be *mon_pdev_be =
-			dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
-	struct dp_pdev_tx_monitor_be *tx_mon_be =
-			&mon_pdev_be->tx_monitor_be;
 	uint32_t usr_idx = 0;
 	uint32_t num_users = 0;
 
@@ -984,11 +985,8 @@ dp_tx_mon_update_radiotap(struct dp_pdev *pdev,
 				pdev->operating_channel.freq;
 
 	if (QDF_STATUS_SUCCESS !=
-	    dp_populate_tsft_from_phy_timestamp(pdev, ppdu_info)) {
-		/* free the ppdu_info */
-		dp_tx_mon_free_ppdu_info(ppdu_info, tx_mon_be);
+	    dp_populate_tsft_from_phy_timestamp(pdev, ppdu_info))
 		return;
-	}
 
 	for (usr_idx = 0; usr_idx < num_users; usr_idx++) {
 		qdf_nbuf_queue_t *mpdu_q = NULL;

+ 33 - 15
dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c

@@ -335,7 +335,11 @@ dp_tx_mon_generate_cts2self_frm(struct dp_pdev *pdev,
 		return;
 
 	tx_mon_be = &mon_pdev_be->tx_monitor_be;
-	tx_status_info = &tx_mon_be->prot_status_info;
+
+	if (window_flag == INITIATOR_WINDOW)
+		tx_status_info = &tx_mon_be->prot_status_info;
+	else
+		tx_status_info = &tx_mon_be->data_status_info;
 
 	/*
 	 * for radiotap we allocate new skb,
@@ -723,6 +727,7 @@ dp_tx_mon_generate_mu_block_ack_frm(struct dp_pdev *pdev,
 	struct hal_tx_status_info *tx_status_info;
 	struct ieee80211_ctlframe_addr2 *wh_addr2 = NULL;
 	qdf_nbuf_t mpdu_nbuf = NULL;
+	uint16_t ba_control = 0;
 	uint8_t *frm = NULL;
 	uint32_t ba_sz = 0;
 	uint8_t num_users = TXMON_PPDU_HAL(tx_ppdu_info, num_users);
@@ -775,18 +780,30 @@ dp_tx_mon_generate_mu_block_ack_frm(struct dp_pdev *pdev,
 
 	*(u_int16_t *)(&wh_addr2->i_aidordur) = qdf_cpu_to_le16(0x0000);
 
-	qdf_mem_copy(wh_addr2->i_addr2,
-		     TXMON_STATUS_INFO(tx_status_info, addr2),
-		     QDF_MAC_ADDR_SIZE);
-	qdf_mem_copy(wh_addr2->i_addr1,
-		     TXMON_STATUS_INFO(tx_status_info, addr1),
-		     QDF_MAC_ADDR_SIZE);
+	if (window_flag == RESPONSE_WINDOW) {
+		qdf_mem_copy(wh_addr2->i_addr2,
+			     TXMON_STATUS_INFO(tx_status_info, addr2),
+			     QDF_MAC_ADDR_SIZE);
+		if (num_users > 1)
+			qdf_mem_set(wh_addr2->i_addr1, QDF_MAC_ADDR_SIZE, 0xFF);
+		else
+			qdf_mem_copy(wh_addr2->i_addr1,
+				     TXMON_STATUS_INFO(tx_status_info, addr1),
+				     QDF_MAC_ADDR_SIZE);
+	} else {
+		qdf_mem_copy(wh_addr2->i_addr2,
+			     TXMON_STATUS_INFO(tx_status_info, addr1),
+			     QDF_MAC_ADDR_SIZE);
+		qdf_mem_copy(wh_addr2->i_addr1,
+			     TXMON_STATUS_INFO(tx_status_info, addr2),
+			     QDF_MAC_ADDR_SIZE);
+	}
 
 	frm = (uint8_t *)&wh_addr2[1];
 
 	/* BA control */
-	*((uint16_t *)frm) = qdf_cpu_to_le16(TXMON_PPDU_USR(tx_ppdu_info,
-							    0, ba_control));
+	ba_control = 0x0016;
+	*((uint16_t *)frm) = qdf_cpu_to_le16(ba_control);
 	frm += 2;
 
 	for (i = 0; i < num_users; i++) {
@@ -796,8 +813,8 @@ dp_tx_mon_generate_mu_block_ack_frm(struct dp_pdev *pdev,
 					(TXMON_PPDU_USR(tx_ppdu_info, i,
 							aid) & 0x7FF));
 		frm += 2;
-		*((uint16_t *)frm) = TXMON_PPDU_USR(tx_ppdu_info,
-						    i, start_seq) & 0xFFF;
+		*((uint16_t *)frm) = qdf_cpu_to_le16(
+				TXMON_PPDU_USR(tx_ppdu_info, i, start_seq));
 		frm += 2;
 		qdf_mem_copy(frm,
 			     TXMON_PPDU_USR(tx_ppdu_info, i, ba_bitmap),
@@ -813,6 +830,8 @@ dp_tx_mon_generate_mu_block_ack_frm(struct dp_pdev *pdev,
 	/* always enqueue to first active user */
 	dp_tx_mon_enqueue_mpdu_nbuf(pdev, tx_ppdu_info, 0, mpdu_nbuf);
 	TXMON_PPDU_HAL(tx_ppdu_info, is_used) = 1;
+	/* HE MU fields not required for Multi Sta Block ack frame */
+	TXMON_PPDU_COM(tx_ppdu_info, he_mu_flags) = 0;
 }
 
 /**
@@ -936,7 +955,7 @@ dp_tx_mon_generate_block_ack_frm(struct dp_pdev *pdev,
 	frm += 2;
 	*((uint16_t *)frm) = qdf_cpu_to_le16(TXMON_PPDU_USR(tx_ppdu_info,
 							    user_id,
-							    start_seq) & 0xFFF);
+							    start_seq));
 	frm += 2;
 	qdf_mem_copy(frm,
 		     TXMON_PPDU_USR(tx_ppdu_info, user_id, ba_bitmap),
@@ -1164,6 +1183,8 @@ dp_tx_mon_generated_response_frm(struct dp_pdev *pdev,
 	}
 	case TXMON_GEN_RESP_SELFGEN_MBA:
 	{
+		dp_tx_mon_generate_mu_block_ack_frm(pdev, tx_ppdu_info,
+						    RESPONSE_WINDOW);
 		break;
 	}
 	case TXMON_GEN_RESP_SELFGEN_CBF:
@@ -1262,9 +1283,6 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev,
 	}
 	case HAL_MON_RX_FRAME_BITMAP_ACK:
 	{
-		/* this comes for each user */
-		dp_tx_mon_generate_ack_frm(pdev, tx_data_ppdu_info,
-					   INITIATOR_WINDOW);
 		break;
 	}
 	case HAL_MON_RX_FRAME_BITMAP_BLOCK_ACK_256:

+ 11 - 0
hal/wifi3.0/be/hal_be_api_mon.h

@@ -705,6 +705,9 @@ void hal_mon_buff_addr_info_set(hal_soc_handle_t hal_soc_hdl,
 
 #define HAL_INVALID_PPDU_ID    0xFFFFFFFF
 
+#define HAL_MAX_DL_MU_USERS	37
+#define HAL_MAX_RU_INDEX	7
+
 enum hal_tx_tlv_status {
 	HAL_MON_TX_FES_SETUP,
 	HAL_MON_TX_FES_STATUS_END,
@@ -794,6 +797,8 @@ enum txmon_generated_response {
 	TXMON_GEN_RESP_SELFGEN_NDP_LMR
 };
 
+#define IS_MULTI_USERS(num_users)	(!!(0xFFFE & num_users))
+
 #define TXMON_HAL(hal_tx_ppdu_info, field)		\
 			hal_tx_ppdu_info->field
 #define TXMON_HAL_STATUS(hal_tx_ppdu_info, field)	\
@@ -843,9 +848,15 @@ struct hal_tx_status_info {
 		num_users		:8,
 		reserved		:10;
 
+	uint8_t mba_count;
+	uint8_t mba_fake_bitmap_count;
+
 	uint8_t sw_frame_group_id;
 	uint32_t r2r_to_follow;
 
+	uint16_t phy_abort_reason;
+	uint8_t phy_abort_user_number;
+
 	void *buffer;
 	uint32_t offset;
 	uint32_t length;

+ 404 - 92
hal/wifi3.0/be/hal_be_generic_api.h

@@ -398,7 +398,9 @@ hal_txmon_parse_tx_fes_setup(void *tx_tlv,
 	tx_ppdu_info->num_users = tx_fes_setup->number_of_users;
 	if (tx_ppdu_info->num_users == 0)
 		tx_ppdu_info->num_users = 1;
-	tx_ppdu_info->ppdu_id = tx_fes_setup->schedule_id;
+
+	TXMON_HAL(tx_ppdu_info, ppdu_id) = tx_fes_setup->schedule_id;
+	TXMON_HAL_STATUS(tx_ppdu_info, ppdu_id) = tx_fes_setup->schedule_id;
 }
 
 /**
@@ -503,7 +505,9 @@ hal_txmon_parse_tx_fes_setup(void *tx_tlv,
 		num_users = 1;
 
 	tx_ppdu_info->num_users = num_users;
-	tx_ppdu_info->ppdu_id = ppdu_id;
+
+	TXMON_HAL(tx_ppdu_info, ppdu_id) = ppdu_id;
+	TXMON_HAL_STATUS(tx_ppdu_info, ppdu_id) = ppdu_id;
 }
 
 /**
@@ -619,6 +623,63 @@ hal_txmon_parse_mpdu_start(void *tx_tlv, uint8_t user_id,
 }
 #endif
 
+/**
+ * get_ru_offset_from_start_index() - api to get ru offset from ru index
+ *
+ * @ru_size: RU size
+ * @start_idx: Start index
+ *
+ * Return: uint8_t ru allocation offset
+ */
+static inline
+uint8_t get_ru_offset_from_start_index(uint8_t ru_size, uint8_t start_idx)
+{
+	uint8_t ru_alloc_offset[HAL_MAX_DL_MU_USERS][HAL_MAX_RU_INDEX] = {
+		{0, 0, 0, 0, 0, 0, 0},
+		{1, 0, 0, 0, 0, 0, 0},
+		{2, 1, 0, 0, 0, 0, 0},
+		{3, 1, 0, 0, 0, 0, 0},
+		{4, 0, 0, 0, 0, 0, 0},
+		{5, 2, 1, 0, 0, 0, 0},
+		{6, 2, 1, 0, 0, 0, 0},
+		{7, 3, 1, 0, 0, 0, 0},
+		{8, 3, 1, 0, 0, 0, 0},
+		{9, 4, 2, 1, 0, 0, 0},
+		{10, 4, 2, 1, 0, 0, 0},
+		{11, 5, 2, 1, 0, 0, 0},
+		{12, 5, 2, 1, 0, 0, 0},
+		{13, 0, 0, 1, 0, 0, 0},
+		{14, 6, 3, 1, 0, 0, 0},
+		{15, 6, 3, 1, 0, 0, 0},
+		{16, 7, 3, 1, 0, 0, 0},
+		{17, 7, 3, 1, 0, 0, 0},
+		{18, 0, 0, 0, 0, 0, 0},
+		{19, 8, 4, 2, 1, 0, 0},
+		{20, 8, 4, 2, 1, 0, 0},
+		{21, 9, 4, 2, 1, 0, 0},
+		{22, 9, 4, 2, 1, 0, 0},
+		{23, 0, 0, 2, 1, 0, 0},
+		{24, 10, 5, 2, 1, 0, 0},
+		{25, 10, 5, 2, 1, 0, 0},
+		{26, 11, 5, 2, 1, 0, 0},
+		{27, 11, 5, 2, 1, 0, 0},
+		{28, 12, 6, 3, 1, 0, 0},
+		{29, 12, 6, 3, 1, 0, 0},
+		{30, 13, 6, 3, 1, 0, 0},
+		{31, 13, 6, 3, 1, 0, 0},
+		{32, 0, 0, 3, 1, 0, 0},
+		{33, 14, 7, 3, 1, 0, 0},
+		{34, 14, 7, 3, 1, 0, 0},
+		{35, 15, 7, 3, 1, 0, 0},
+		{36, 15, 7, 3, 1, 0, 0},
+	};
+
+	if (start_idx >= HAL_MAX_UL_MU_USERS || ru_size >= HAL_MAX_RU_INDEX)
+		return 0;
+
+	return ru_alloc_offset[start_idx][ru_size];
+}
+
 /**
  * hal_txmon_status_get_num_users_generic_be() - api to get num users
  * from start of fes window
@@ -720,9 +781,6 @@ hal_tx_get_ppdu_info(void *data_info, void *prot_info, uint32_t tlv_tag)
 		   tlv_tag == WIFITX_FES_STATUS_START_PROT_E) {
 		TXMON_HAL(prot_ppdu_info, prot_tlv_status) = tlv_tag;
 		return prot_info;
-	} else {
-		TXMON_HAL(prot_ppdu_info, prot_tlv_status) = tlv_tag;
-		return data_info;
 	}
 
 	return data_info;
@@ -756,7 +814,7 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 
 	tlv_tag = HAL_RX_GET_USER_TLV64_TYPE(tx_tlv_hdr);
 	/* user_id start with 1, decrement by 1 to start from 0 */
-	user_id = HAL_RX_GET_USER_TLV64_USERID(tx_tlv_hdr) - 1;
+	user_id = HAL_RX_GET_USER_TLV64_USERID(tx_tlv_hdr);
 	tlv_len = HAL_RX_GET_USER_TLV64_LEN(tx_tlv_hdr);
 
 	tx_tlv = (uint8_t *)tx_tlv_hdr + HAL_RX_TLV64_HDR_SIZE;
@@ -767,7 +825,7 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 	tx_status_info = (ppdu_info->is_data ? data_status_info :
 			  prot_status_info);
 
-	user_id = user_id > ppdu_info->num_users ? 0 : ppdu_info->num_users;
+	user_id = user_id > ppdu_info->num_users ? 0 : user_id;
 
 	switch (tlv_tag) {
 	/* start of initiator FES window */
@@ -786,6 +844,9 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 		/* initiator PPDU window end */
 		uint32_t ppdu_timestamp_start = 0;
 		uint32_t ppdu_timestamp_end = 0;
+		uint16_t phy_abort_reason = 0;
+		uint8_t phy_abort_is_valid = 0;
+		uint8_t abort_usr_id = 0;
 		uint8_t response_type = 0;
 		uint8_t r2r_end_status_follow = 0;
 
@@ -816,6 +877,25 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 			HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
 					   R2R_END_STATUS_TO_FOLLOW);
 
+		phy_abort_is_valid =
+			HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
+					   PHYTX_ABORT_REQUEST_INFO_VALID);
+
+		if (phy_abort_is_valid) {
+			phy_abort_reason =
+			HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
+					   PHYTX_ABORT_REQUEST_INFO_DETAILS_PHYTX_ABORT_REASON);
+
+			abort_usr_id =
+			HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
+					   PHYTX_ABORT_REQUEST_INFO_DETAILS_USER_NUMBER);
+
+			TXMON_STATUS_INFO(tx_status_info,
+					  phy_abort_reason) = phy_abort_reason;
+			TXMON_STATUS_INFO(tx_status_info,
+					  phy_abort_user_number) = abort_usr_id;
+		}
+
 		TXMON_STATUS_INFO(tx_status_info,
 				  response_type) = response_type;
 		TXMON_STATUS_INFO(tx_status_info,
@@ -893,11 +973,19 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 		uint32_t bandwidth = 0;
 		uint32_t ppdu_timestamp_start = 0;
 		uint32_t ppdu_timestamp_end = 0;
+		uint32_t mba_usr_cnt = 0;
+		uint32_t mba_fake_bitmap_cnt = 0;
 
 		status = HAL_MON_RESPONSE_END_STATUS_INFO;
 		generated_response = HAL_TX_DESC_GET_64(tx_tlv,
 							RESPONSE_END_STATUS,
 							GENERATED_RESPONSE);
+		mba_usr_cnt = HAL_TX_DESC_GET_64(tx_tlv,
+						 RESPONSE_END_STATUS,
+						 MBA_USER_COUNT);
+		mba_fake_bitmap_cnt = HAL_TX_DESC_GET_64(tx_tlv,
+							 RESPONSE_END_STATUS,
+							 MBA_FAKE_BITMAP_COUNT);
 		bandwidth = HAL_TX_DESC_GET_64(tx_tlv, RESPONSE_END_STATUS,
 					       COEX_BASED_TX_BW);
 		/* 32 bits TSF */
@@ -921,6 +1009,10 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 
 		TXMON_STATUS_INFO(tx_status_info,
 				  generated_response) = generated_response;
+		TXMON_STATUS_INFO(tx_status_info, mba_count) = mba_usr_cnt;
+		TXMON_STATUS_INFO(tx_status_info,
+				  mba_fake_bitmap_count) = mba_fake_bitmap_cnt;
+
 		SHOW_DEFINED(WIFIRESPONSE_END_STATUS_E);
 		break;
 	}
@@ -1666,13 +1758,24 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 
 	case WIFIMACTX_HE_SIG_A_SU_E:
 	{
+		uint16_t he_mu_flag_1 = 0;
+		uint16_t he_mu_flag_2 = 0;
+		uint16_t num_users = 0;
 		uint8_t mcs_of_sig_b = 0;
 		uint8_t dcm_of_sig_b = 0;
 		uint8_t sig_a_bw = 0;
-		uint16_t he_mu_flag_1 = 0;
-		uint16_t he_mu_flag_2 = 0;
+		uint8_t i = 0;
+		uint8_t bss_color_id;
+		uint8_t coding;
+		uint8_t stbc;
+		uint8_t a_factor;
+		uint8_t pe_disambiguity;
+		uint8_t txbf;
+		uint8_t txbw;
+		uint8_t txop;
 
 		status = HAL_MON_MACTX_HE_SIG_A_SU;
+		num_users = TXMON_HAL(ppdu_info, num_users);
 
 		mcs_of_sig_b = HAL_TX_DESC_GET_64(tx_tlv,
 						  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
@@ -1684,6 +1787,31 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 					      MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
 					      TRANSMIT_BW);
 
+		bss_color_id = HAL_TX_DESC_GET_64(tx_tlv,
+						  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
+						  BSS_COLOR_ID);
+		coding = HAL_TX_DESC_GET_64(tx_tlv,
+					    MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
+					    CODING);
+		stbc = HAL_TX_DESC_GET_64(tx_tlv,
+					  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
+					  STBC);
+		a_factor = HAL_TX_DESC_GET_64(tx_tlv,
+					      MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
+					      PACKET_EXTENSION_A_FACTOR);
+		pe_disambiguity = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
+						     PACKET_EXTENSION_PE_DISAMBIGUITY);
+		txbf = HAL_TX_DESC_GET_64(tx_tlv,
+					  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
+					  TXBF);
+		txbw = HAL_TX_DESC_GET_64(tx_tlv,
+					  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
+					  TRANSMIT_BW);
+		txop = HAL_TX_DESC_GET_64(tx_tlv,
+					  MACTX_HE_SIG_A_SU_MACTX_HE_SIG_A_SU_INFO_DETAILS,
+					  TXOP_DURATION);
+
 		he_mu_flag_1 |= QDF_MON_STATUS_SIG_B_MCS_KNOWN |
 				QDF_MON_STATUS_SIG_B_DCM_KNOWN |
 				QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_KNOWN |
@@ -1702,24 +1830,58 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 		he_mu_flag_2 |= sig_a_bw <<
 				QDF_MON_STATUS_SIG_A_BANDWIDTH_SHIFT;
 
-		TXMON_HAL_STATUS(ppdu_info, he_flags1) = he_mu_flag_1;
-		TXMON_HAL_STATUS(ppdu_info, he_flags2) = he_mu_flag_2;
+		TXMON_HAL_STATUS(ppdu_info,
+				 he_mu_flags) = IS_MULTI_USERS(num_users);
+		for (i = 0; i < num_users; i++) {
+			TXMON_HAL_USER(ppdu_info, i, he_flags1) |= he_mu_flag_1;
+			TXMON_HAL_USER(ppdu_info, i, he_flags2) |= he_mu_flag_2;
+		}
+
+		/* HE data 1 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data1) |=
+			QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
+			QDF_MON_STATUS_HE_CODING_KNOWN;
+
+		/* HE data 2 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data2) |=
+			QDF_MON_STATUS_TXBF_KNOWN |
+			QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
+			QDF_MON_STATUS_TXOP_KNOWN |
+			QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
+			QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
+
+		/* HE data 3 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |=
+			bss_color_id |
+			(!!txbf << QDF_MON_STATUS_BEAM_CHANGE_SHIFT) |
+			(coding << QDF_MON_STATUS_CODING_SHIFT) |
+			(stbc << QDF_MON_STATUS_STBC_SHIFT);
+
+		/* HE data 6 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data6) |=
+				(txop << QDF_MON_STATUS_TXOP_SHIFT);
 
 		SHOW_DEFINED(WIFIMACTX_HE_SIG_A_SU_E);
 		break;
 	}
 	case WIFIMACTX_HE_SIG_A_MU_DL_E:
 	{
+		uint16_t he_mu_flag_1 = 0;
+		uint16_t he_mu_flag_2 = 0;
+		uint16_t num_users = 0;
+		uint8_t bss_color_id;
+		uint8_t txop;
 		uint8_t mcs_of_sig_b = 0;
 		uint8_t dcm_of_sig_b = 0;
 		uint8_t sig_a_bw = 0;
 		uint8_t num_sig_b_symb = 0;
 		uint8_t comp_mode_sig_b = 0;
 		uint8_t punc_bw = 0;
-		uint16_t he_mu_flag_1 = 0;
-		uint16_t he_mu_flag_2 = 0;
+		uint8_t i = 0;
 
 		status = HAL_MON_MACTX_HE_SIG_A_MU_DL;
+		num_users = TXMON_HAL(ppdu_info, num_users);
+
 		mcs_of_sig_b = HAL_TX_DESC_GET_64(tx_tlv,
 						  MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
 						  MCS_OF_SIG_B);
@@ -1735,6 +1897,12 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 		comp_mode_sig_b = HAL_TX_DESC_GET_64(tx_tlv,
 						     MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
 						     COMP_MODE_SIG_B);
+		bss_color_id = HAL_TX_DESC_GET_64(tx_tlv,
+						  MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
+						  BSS_COLOR_ID);
+		txop = HAL_TX_DESC_GET_64(tx_tlv,
+					  MACTX_HE_SIG_A_MU_DL_MACTX_HE_SIG_A_MU_DL_INFO_DETAILS,
+					  TXOP_DURATION);
 
 		he_mu_flag_1 |= QDF_MON_STATUS_SIG_B_MCS_KNOWN |
 				QDF_MON_STATUS_SIG_B_DCM_KNOWN |
@@ -1771,9 +1939,27 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 			punc_bw << QDF_MON_STATUS_SIG_A_PUNC_BANDWIDTH_SHIFT;
 
 		/* copy per user info to all user */
-		TXMON_HAL_STATUS(ppdu_info, he_mu_flags) = 1;
-		TXMON_HAL_STATUS(ppdu_info, he_flags1) = he_mu_flag_1;
-		TXMON_HAL_STATUS(ppdu_info, he_flags2) = he_mu_flag_2;
+		TXMON_HAL_STATUS(ppdu_info,
+				 he_mu_flags) = IS_MULTI_USERS(num_users);
+		for (i = 0; i < num_users; i++) {
+			TXMON_HAL_USER(ppdu_info, i, he_flags1) |= he_mu_flag_1;
+			TXMON_HAL_USER(ppdu_info, i, he_flags2) |= he_mu_flag_2;
+		}
+
+		/* HE data 1 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data1) |=
+				QDF_MON_STATUS_HE_BSS_COLOR_KNOWN;
+
+		/* HE data 2 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data2) |=
+				QDF_MON_STATUS_TXOP_KNOWN;
+
+		/* HE data 3 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |= bss_color_id;
+
+		/* HE data 6 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data6) |=
+				(txop << QDF_MON_STATUS_TXOP_SHIFT);
 
 		SHOW_DEFINED(WIFIMACTX_HE_SIG_A_MU_DL_E);
 		break;
@@ -1817,7 +2003,7 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 					    STA_CODING);
 		nss = HAL_TX_DESC_GET_64(tx_tlv,
 					 MACTX_HE_SIG_B2_MU_MACTX_HE_SIG_B2_MU_INFO_DETAILS,
-					 NSTS);
+					 NSTS) + 1;
 		user_order = HAL_TX_DESC_GET_64(tx_tlv,
 						MACTX_HE_SIG_B2_MU_MACTX_HE_SIG_B2_MU_INFO_DETAILS,
 						USER_ORDER);
@@ -2211,6 +2397,8 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 	}
 	case WIFIMACTX_USER_DESC_PER_USER_E:
 	{
+		/* user tlv */
+		uint32_t bf = 0;
 		uint32_t psdu_length = 0;
 		uint8_t ru_start_index = 0;
 		uint8_t ru_size = 0;
@@ -2219,12 +2407,16 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 		uint8_t dcm = 0;
 		uint8_t fec_type = 0;
 		uint8_t is_ldpc_extra_symb = 0;
-		uint32_t he_data1 = 0;
-		uint32_t he_data2 = 0;
-		uint32_t he_data3 = 0;
-		uint32_t he_data4 = 0;
-		uint32_t he_data5 = 0;
-		uint32_t he_data6 = 0;
+		uint32_t he_data1 = TXMON_HAL_USER(ppdu_info, user_id,
+						   he_data1);
+		uint32_t he_data2 = TXMON_HAL_USER(ppdu_info, user_id,
+						   he_data2);
+		uint32_t he_data3 = TXMON_HAL_USER(ppdu_info, user_id,
+						   he_data3);
+		uint32_t he_data5 = TXMON_HAL_USER(ppdu_info, user_id,
+						   he_data5);
+		uint32_t he_data6 = TXMON_HAL_USER(ppdu_info, user_id,
+						   he_data6);
 
 		status = HAL_MON_MACTX_USER_DESC_PER_USER;
 
@@ -2238,7 +2430,11 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 						    RU_START_INDEX);
 		ru_size = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
 					     RU_SIZE);
-		nss = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, NSS);
+		bf = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
+					USER_BF_TYPE);
+
+		nss = HAL_TX_DESC_GET_64(tx_tlv,
+					 MACTX_USER_DESC_PER_USER, NSS) + 1;
 		mcs = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, MCS);
 		dcm = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, DCM);
 		fec_type = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER,
@@ -2251,6 +2447,16 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 			break;
 
 		/* update */
+		/* BEAM CHANGE */
+		he_data1 |= QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN;
+		he_data1 |= QDF_MON_STATUS_TXBF_KNOWN;
+		he_data5 |= (!!bf << QDF_MON_STATUS_TXBF_SHIFT);
+		he_data3 |= (!!bf << QDF_MON_STATUS_BEAM_CHANGE_SHIFT);
+
+		/* UL/DL known */
+		he_data1 |= QDF_MON_STATUS_HE_DL_UL_KNOWN;
+		he_data3 |= (1 << QDF_MON_STATUS_DL_UL_SHIFT);
+
 		/* MCS */
 		he_data1 |= QDF_MON_STATUS_HE_MCS_KNOWN;
 		he_data3 |= (mcs << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT);
@@ -2262,85 +2468,214 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 		he_data3 |= (is_ldpc_extra_symb <<
 			     QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT);
 		/* RU offset and RU */
-		he_data1 |= QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
 		he_data2 |= QDF_MON_STATUS_RU_ALLOCATION_OFFSET_KNOWN;
-		he_data2 |= (ru_start_index <<
+		he_data2 |= (get_ru_offset_from_start_index(ru_size,
+							    ru_start_index) <<
 			     QDF_MON_STATUS_RU_ALLOCATION_SHIFT);
 
 		/* Data BW and RU allocation */
-		he_data1 |= QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
-		he_data5 |= ru_size << 2;
+		if (ru_size < HAL_MAX_RU_INDEX) {
+			/* update bandwidth if it is full bandwidth */
+			he_data1 |= QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
+			he_data5 = (he_data5 & 0xFFF0) | (4 + ru_size);
+		}
 
+		he_data6 |= (nss & 0xF);
 		TXMON_HAL_USER(ppdu_info, user_id, mcs) = mcs;
 
 		/* update stack variable to ppdu_info */
-		TXMON_HAL_USER(ppdu_info, user_id, he_data1) |= he_data1;
-		TXMON_HAL_USER(ppdu_info, user_id, he_data2) |= he_data2;
-		TXMON_HAL_USER(ppdu_info, user_id, he_data3) |= he_data3;
-		TXMON_HAL_USER(ppdu_info, user_id, he_data4) |= he_data4;
-		TXMON_HAL_USER(ppdu_info, user_id, he_data5) |= he_data5;
-		TXMON_HAL_USER(ppdu_info, user_id, he_data6) |= he_data6;
+		TXMON_HAL_USER(ppdu_info, user_id, he_data1) = he_data1;
+		TXMON_HAL_USER(ppdu_info, user_id, he_data2) = he_data2;
+		TXMON_HAL_USER(ppdu_info, user_id, he_data3) = he_data3;
+		TXMON_HAL_USER(ppdu_info, user_id, he_data5) = he_data5;
+		TXMON_HAL_USER(ppdu_info, user_id, he_data6) = he_data6;
 
 		SHOW_DEFINED(WIFIMACTX_USER_DESC_PER_USER_E);
 		break;
 	}
 	case WIFIMACTX_USER_DESC_COMMON_E:
 	{
+		uint16_t he_mu_flag_1 = 0;
+		uint16_t he_mu_flag_2 = 0;
+		uint16_t ru_channel_1[4] = {0};
+		uint16_t ru_channel_2[4] = {0};
+		uint16_t num_users = 0;
+		uint8_t doppler;
+		uint8_t ltf_size;
+		uint8_t num_ltf_symbols;
+		uint8_t pkt_extn_pe;
+		uint8_t a_factor;
+		uint8_t center_ru_0;
+		uint8_t center_ru_1;
+		uint8_t i = 0;
+
+		num_users = TXMON_HAL(ppdu_info, num_users);
+
+		doppler = HAL_TX_DESC_GET_64(tx_tlv,
+					     MACTX_USER_DESC_COMMON,
+					     DOPPLER_INDICATION);
+
+		ltf_size = HAL_TX_DESC_GET_64(tx_tlv,
+					      MACTX_USER_DESC_COMMON,
+					      LTF_SIZE);
+
+		num_ltf_symbols = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_USER_DESC_COMMON,
+						     NUM_DATA_SYMBOLS);
+
+		pkt_extn_pe = HAL_TX_DESC_GET_64(tx_tlv,
+						 MACTX_USER_DESC_COMMON,
+						 PACKET_EXTENSION_PE_DISAMBIGUITY);
+
+		a_factor = HAL_TX_DESC_GET_64(tx_tlv,
+					      MACTX_USER_DESC_COMMON,
+					      PACKET_EXTENSION_A_FACTOR);
+
+		center_ru_0 = HAL_TX_DESC_GET_64(tx_tlv,
+						 MACTX_USER_DESC_COMMON,
+						 CENTER_RU_0);
+
+		center_ru_1 = HAL_TX_DESC_GET_64(tx_tlv,
+						 MACTX_USER_DESC_COMMON,
+						 CENTER_RU_1);
+
+		ru_channel_1[0] = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_USER_DESC_COMMON,
+						     RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_0);
+		ru_channel_1[1] = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_USER_DESC_COMMON,
+						     RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_1);
+		ru_channel_1[2] = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_USER_DESC_COMMON,
+						     RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_2);
+		ru_channel_1[3] = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_USER_DESC_COMMON,
+						     RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_3);
+
+		ru_channel_2[0] = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_USER_DESC_COMMON,
+						     RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_0);
+		ru_channel_2[1] = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_USER_DESC_COMMON,
+						     RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_1);
+		ru_channel_2[2] = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_USER_DESC_COMMON,
+						     RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_2);
+		ru_channel_2[3] = HAL_TX_DESC_GET_64(tx_tlv,
+						     MACTX_USER_DESC_COMMON,
+						     RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_3);
+
+		/* HE data 1 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data1) |=
+					QDF_MON_STATUS_HE_DOPPLER_KNOWN;
+
+		/* HE data 2 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data2) |=
+					QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
+					QDF_MON_STATUS_LTF_SYMBOLS_KNOWN;
+
+		/* HE data 5 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data5) |=
+				(pkt_extn_pe <<
+				 QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT) |
+				(a_factor << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT) |
+				((1 + ltf_size) <<
+				 QDF_MON_STATUS_HE_LTF_SIZE_SHIFT) |
+				(num_ltf_symbols <<
+				 QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
+
+		/* HE data 6 */
+		TXMON_HAL_USER(ppdu_info, user_id, he_data6) |=
+				(doppler << QDF_MON_STATUS_DOPPLER_SHIFT);
+
+		/* number of symbol */
+		he_mu_flag_1 |=
+			(QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_KNOWN |
+			 QDF_MON_STATUS_CHANNEL_1_CENTER_26_RU_KNOWN |
+			 ((center_ru_0 <<
+			   QDF_MON_STATUS_CHANNEL_1_CENTER_26_RU_SHIFT) &
+			  QDF_MON_STATUS_CHANNEL_1_CENTER_26_RU_VALUE));
+
+		he_mu_flag_2 |= ((center_ru_1 <<
+				  QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_SHIFT) &
+				 QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_VALUE);
+
+		TXMON_HAL_STATUS(ppdu_info,
+				 he_mu_flags) = IS_MULTI_USERS(num_users);
+		for (i = 0; i < num_users; i++) {
+			TXMON_HAL_USER(ppdu_info, i, he_flags1) |= he_mu_flag_1;
+			TXMON_HAL_USER(ppdu_info, i, he_flags2) |= he_mu_flag_2;
+
+			/* channel 1 */
+			TXMON_HAL_USER(ppdu_info, i,
+				       he_RU[0]) = ru_channel_1[0];
+			TXMON_HAL_USER(ppdu_info, i,
+				       he_RU[1]) = ru_channel_1[1];
+			TXMON_HAL_USER(ppdu_info, i,
+				       he_RU[2]) = ru_channel_1[2];
+			TXMON_HAL_USER(ppdu_info, i,
+				       he_RU[3]) = ru_channel_1[3];
+			/* channel 2 */
+			TXMON_HAL_USER(ppdu_info, i,
+				       he_RU[4]) = ru_channel_2[0];
+			TXMON_HAL_USER(ppdu_info, i,
+				       he_RU[5]) = ru_channel_2[1];
+			TXMON_HAL_USER(ppdu_info, i,
+				       he_RU[6]) = ru_channel_2[2];
+			TXMON_HAL_USER(ppdu_info, i,
+				       he_RU[7]) = ru_channel_2[3];
+		}
+		/* channel 1 */
+		TXMON_HAL_STATUS(ppdu_info, he_RU[0]) = ru_channel_1[0];
+		TXMON_HAL_STATUS(ppdu_info, he_RU[1]) = ru_channel_1[1];
+		TXMON_HAL_STATUS(ppdu_info, he_RU[2]) = ru_channel_1[2];
+		TXMON_HAL_STATUS(ppdu_info, he_RU[3]) = ru_channel_1[3];
+		/* channel 2 */
+		TXMON_HAL_STATUS(ppdu_info, he_RU[4]) = ru_channel_2[0];
+		TXMON_HAL_STATUS(ppdu_info, he_RU[5]) = ru_channel_2[1];
+		TXMON_HAL_STATUS(ppdu_info, he_RU[6]) = ru_channel_2[2];
+		TXMON_HAL_STATUS(ppdu_info, he_RU[7]) = ru_channel_2[3];
+
+		/* copy per user info to all user */
 		SHOW_DEFINED(WIFIMACTX_USER_DESC_COMMON_E);
 		break;
 	}
 	case WIFIMACTX_PHY_DESC_E:
 	{
-		uint32_t bf_type = 0;
 		/* pkt_type - preamble type */
 		uint32_t pkt_type = 0;
 		uint8_t bandwidth = 0;
-		uint8_t mcs = 0;
 		uint8_t is_stbc = 0;
-		uint8_t nss = 0;
 		uint8_t is_triggered = 0;
 		uint8_t gi = 0;
 		uint8_t he_ppdu_subtype = 0;
 		uint32_t ltf_size = 0;
-		uint32_t ru_start = 0;
 		uint32_t he_data1 = 0;
 		uint32_t he_data2 = 0;
 		uint32_t he_data3 = 0;
-		uint32_t he_data4 = 0;
 		uint32_t he_data5 = 0;
-		uint32_t he_data6 = 0;
 		uint16_t he_mu_flag_1 = 0;
 		uint16_t he_mu_flag_2 = 0;
+		uint16_t num_users = 0;
 		uint8_t i = 0;
 
 		status = HAL_MON_MACTX_PHY_DESC;
 
-		bf_type = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC, BF_TYPE);
+		num_users = TXMON_HAL(ppdu_info, num_users);
 		pkt_type = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC, PKT_TYPE);
-
-		mcs = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC, MCS);
 		is_stbc = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC, STBC);
 		is_triggered = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
 						  TRIGGERED);
 		if (!is_triggered) {
-			nss = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
-						 HEAVY_CLIP_NSS);
 			bandwidth = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
 						       BANDWIDTH);
 		} else {
-			nss = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC, NSS);
 			/*
 			 * is_triggered, bw is minimum of AP pkt bw
 			 * or STA bw
 			 */
 			bandwidth = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
 						       AP_PKT_BW);
-			if (pkt_type == TXMON_PKT_TYPE_11AX ||
-			    pkt_type == TXMON_PKT_TYPE_11BE)
-				ru_start =
-					HAL_TX_DESC_GET_64(tx_tlv,
-							   MACTX_PHY_DESC,
-							   RU_SIZE_UPDATED_V2);
 		}
 
 		gi = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
@@ -2349,11 +2684,8 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 		he_ppdu_subtype = HAL_TX_DESC_GET_64(tx_tlv, MACTX_PHY_DESC,
 						     HE_PPDU_SUBTYPE);
 
-		TXMON_HAL_STATUS(ppdu_info, beamformed) = bf_type;
 		TXMON_HAL_STATUS(ppdu_info, preamble_type) = pkt_type;
-		TXMON_HAL_STATUS(ppdu_info, mcs) = mcs;
 		TXMON_HAL_STATUS(ppdu_info, ltf_size) = ltf_size;
-		TXMON_HAL_STATUS(ppdu_info, nss) = nss;
 		TXMON_HAL_STATUS(ppdu_info, is_stbc) = is_stbc;
 		TXMON_HAL_STATUS(ppdu_info, bw) = bandwidth;
 
@@ -2397,22 +2729,6 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 			break;
 		};
 
-		/* BEAM CHANGE */
-		he_data1 |= QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN;
-		if (ppdu_info->rx_status.beamformed) {
-			he_data1 |= QDF_MON_STATUS_TXBF_KNOWN;
-			he_data5 |= (1 << QDF_MON_STATUS_TXBF_SHIFT);
-			he_data3 |= (1 << QDF_MON_STATUS_BEAM_CHANGE_SHIFT);
-		}
-
-		/* UL/DL known */
-		he_data1 |= QDF_MON_STATUS_HE_DL_UL_KNOWN;
-		he_data3 |= (1 << QDF_MON_STATUS_DL_UL_SHIFT);
-
-		/* MCS */
-		he_data1 |= QDF_MON_STATUS_HE_MCS_KNOWN;
-		he_data3 |= (mcs << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT);
-
 		/* STBC */
 		he_data1 |= QDF_MON_STATUS_HE_STBC_KNOWN;
 		he_data3 |= (is_stbc << QDF_MON_STATUS_STBC_SHIFT);
@@ -2421,30 +2737,26 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 		he_data2 |= QDF_MON_STATUS_HE_GI_KNOWN;
 		he_data5 |= (gi << QDF_MON_STATUS_GI_SHIFT);
 
-		/* NSS */
-		he_data6 |= (nss << QDF_MON_STATUS_HE_DATA_6_NSS_SHIFT);
-
 		/* Data BW and RU allocation */
 		he_data1 |= QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
-		he_data5 |= bandwidth;
+		he_data5 = (he_data5 & 0xFFF0) | bandwidth;
 
-		/* update stack variable to ppdu_info */
-		TXMON_HAL_STATUS(ppdu_info, he_data1) |= he_data1;
-		TXMON_HAL_STATUS(ppdu_info, he_data2) |= he_data2;
-		TXMON_HAL_STATUS(ppdu_info, he_data3) |= he_data3;
-		TXMON_HAL_STATUS(ppdu_info, he_data4) |= he_data4;
-		TXMON_HAL_STATUS(ppdu_info, he_data5) |= he_data5;
-		TXMON_HAL_STATUS(ppdu_info, he_data6) |= he_data6;
-
-		for (i = 0; i < TXMON_HAL(ppdu_info, num_users); i++) {
-			TXMON_HAL_USER(ppdu_info, i, he_data1) |= he_data1;
-			TXMON_HAL_USER(ppdu_info, i, he_data2) |= he_data2;
-			TXMON_HAL_USER(ppdu_info, i, he_data3) |= he_data3;
-			TXMON_HAL_USER(ppdu_info, i, he_data4) |= he_data4;
-			TXMON_HAL_USER(ppdu_info, i, he_data5) |= he_data5;
-			TXMON_HAL_USER(ppdu_info, i, he_data6) |= he_data6;
-			TXMON_HAL_USER(ppdu_info, i, he_flags1) = he_mu_flag_1;
-			TXMON_HAL_USER(ppdu_info, i, he_flags2) = he_mu_flag_2;
+		he_data2 |= QDF_MON_STATUS_LTF_SYMBOLS_KNOWN;
+		he_data5 |= ((1 + ltf_size) <<
+			     QDF_MON_STATUS_HE_LTF_SIZE_SHIFT);
+
+		TXMON_HAL_STATUS(ppdu_info,
+				 he_mu_flags) = IS_MULTI_USERS(num_users);
+		/* MAC TX PHY DESC is not a user tlv */
+		for (i = 0; i < num_users; i++) {
+			TXMON_HAL_USER(ppdu_info, i, he_data1) = he_data1;
+			TXMON_HAL_USER(ppdu_info, i, he_data2) = he_data2;
+			TXMON_HAL_USER(ppdu_info, i, he_data3) = he_data3;
+			TXMON_HAL_USER(ppdu_info, i, he_data5) = he_data5;
+
+			/* HE MU flags */
+			TXMON_HAL_USER(ppdu_info, i, he_flags1) |= he_mu_flag_1;
+			TXMON_HAL_USER(ppdu_info, i, he_flags2) |= he_mu_flag_2;
 		}
 
 		SHOW_DEFINED(WIFIMACTX_PHY_DESC_E);

+ 5 - 5
qdf/inc/qdf_nbuf.h

@@ -338,8 +338,6 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
  * @ba_bitmap: 256 bit block ack bitmap
  * @mpdu_retry_cnt: Rx mpdu retry count
  * @punctured_pattern: punctured pattern (0 means the band is punctured)
- * @rx_user_status: pointer to mon_rx_user_status, when set update
- * radiotap header will use userinfo from this structure.
  * @usig_common: U-SIG property of received frame
  * @usig_value: U-SIG property of received frame
  * @usig_mask: U-SIG property of received frame
@@ -367,6 +365,8 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
  * @min_nf_dbm: min noise floor in active chains per channel
  * @xbar_config: 4 bytes, used for BB to RF Chain mapping
  * @rssi_dbm_conv_support: Rssi dbm converstion support param
+ * @rx_user_status: pointer to mon_rx_user_status, when set update
+ * radiotap header will use userinfo from this structure.
  */
 struct mon_rx_status {
 	uint64_t tsft;
@@ -439,7 +439,7 @@ struct mon_rx_status {
 	uint8_t he_per_user_known;
 	uint16_t he_flags1;
 	uint16_t he_flags2;
-	uint8_t he_RU[4];
+	uint8_t he_RU[8];
 	uint16_t he_data1;
 	uint16_t he_data2;
 	uint16_t he_data3;
@@ -460,7 +460,6 @@ struct mon_rx_status {
 #ifdef WLAN_FEATURE_11BE
 	uint16_t punctured_pattern;
 #endif
-	struct mon_rx_user_status *rx_user_status;
 	uint32_t usig_common;
 	uint32_t usig_value;
 	uint32_t usig_mask;
@@ -492,6 +491,7 @@ struct mon_rx_status {
 	uint32_t xbar_config;
 	bool rssi_dbm_conv_support;
 #endif
+	struct mon_rx_user_status *rx_user_status;
 };
 
 /**
@@ -584,7 +584,7 @@ struct mon_rx_user_status {
 	uint16_t vht_flag_values6;
 	uint16_t he_flags1;
 	uint16_t he_flags2;
-	uint8_t he_RU[4];
+	uint8_t he_RU[8];
 	uint16_t he_data1;
 	uint16_t he_data2;
 	uint16_t he_data3;