Selaa lähdekoodia

qcacmn: Add fix for response timestamp and others minor fixes

Added fix,
a. To populate response timestamp from phy timestamp.
b. Based on window type swap address1 and address2 to match the sniffer.
c. For VHT frames, increment 1 to the received nss value.

Change-Id: I68dffadb609d82e2ad2cf433fcee2a76b0be98e7
CRs-Fixed: 3235718
nobelj 3 vuotta sitten
vanhempi
sitoutus
653cfeb7b7

+ 70 - 4
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c

@@ -589,7 +589,6 @@ dp_config_enh_tx_monitor_2_0(struct dp_pdev *pdev, uint8_t val)
 	switch (val) {
 	case TX_MON_BE_DISABLE:
 	{
-		/* TODO: send HTT msg to configure TLV based on mode */
 		tx_mon_be->mode = TX_MON_BE_DISABLE;
 		mon_pdev_be->tx_mon_mode = 0;
 		mon_pdev_be->tx_mon_filter_length = DMA_LENGTH_64B;
@@ -597,9 +596,10 @@ dp_config_enh_tx_monitor_2_0(struct dp_pdev *pdev, uint8_t val)
 	}
 	case TX_MON_BE_FULL_CAPTURE:
 	{
-		/* TODO: send HTT msg to configure TLV based on mode */
 		qdf_mem_zero(&tx_mon_be->stats,
 			     sizeof(struct dp_tx_monitor_drop_stats));
+		tx_mon_be->last_tsft = 0;
+		tx_mon_be->last_ppdu_timestamp = 0;
 		tx_mon_be->mode = TX_MON_BE_FULL_CAPTURE;
 		mon_pdev_be->tx_mon_mode = 1;
 		mon_pdev_be->tx_mon_filter_length = DEFAULT_DMA_LENGTH;
@@ -607,7 +607,6 @@ dp_config_enh_tx_monitor_2_0(struct dp_pdev *pdev, uint8_t val)
 	}
 	case TX_MON_BE_PEER_FILTER:
 	{
-		/* TODO: send HTT msg to configure TLV based on mode */
 		tx_mon_be->mode = TX_MON_BE_PEER_FILTER;
 		mon_pdev_be->tx_mon_mode = 2;
 		mon_pdev_be->tx_mon_filter_length = DMA_LENGTH_256B;
@@ -615,7 +614,6 @@ dp_config_enh_tx_monitor_2_0(struct dp_pdev *pdev, uint8_t val)
 	}
 	default:
 	{
-		/* TODO: do we need to set to disable ? */
 		return QDF_STATUS_E_INVAL;
 	}
 	}
@@ -741,6 +739,62 @@ dp_tx_mon_send_per_usr_mpdu(struct dp_pdev *pdev,
 	}
 }
 
+#define PHY_MEDIUM_MHZ	960
+#define PHY_TIMESTAMP_WRAP (0xFFFFFFFF / PHY_MEDIUM_MHZ)
+
+/**
+ * dp_populate_tsft_from_phy_timestamp() - API to get tsft from phy timestamp
+ * @pdev: pdev Handle
+ * @ppdu_info: ppdi_info Handle
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+dp_populate_tsft_from_phy_timestamp(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;
+	uint64_t tsft = 0;
+	uint32_t ppdu_timestamp = 0;
+
+	tsft = TXMON_PPDU_COM(ppdu_info, tsft);
+	ppdu_timestamp = TXMON_PPDU_COM(ppdu_info, ppdu_timestamp);
+
+	if (tsft && ppdu_timestamp) {
+		/* update tsft and ppdu timestamp */
+		tx_mon_be->last_tsft = tsft;
+		tx_mon_be->last_ppdu_timestamp = ppdu_timestamp;
+	} else if (!tx_mon_be->last_ppdu_timestamp || !tx_mon_be->last_tsft) {
+		return QDF_STATUS_E_EMPTY;
+	}
+
+	if (!tsft && ppdu_timestamp) {
+		/* response window */
+		uint32_t cur_usec = ppdu_timestamp / PHY_MEDIUM_MHZ;
+		uint32_t last_usec = (tx_mon_be->last_ppdu_timestamp /
+				      PHY_MEDIUM_MHZ);
+		uint32_t diff = 0;
+
+		if (last_usec < cur_usec) {
+			diff = cur_usec - last_usec;
+			tsft = tx_mon_be->last_tsft + diff;
+		} else {
+			diff = (PHY_TIMESTAMP_WRAP - last_usec) + cur_usec;
+			tsft = tx_mon_be->last_tsft + diff;
+		}
+		TXMON_PPDU_COM(ppdu_info, tsft) = tsft;
+		/* update tsft and ppdu timestamp */
+		tx_mon_be->last_tsft = tsft;
+		tx_mon_be->last_ppdu_timestamp = ppdu_timestamp;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * dp_tx_mon_update_radiotap() - API to update radiotap information
  * @pdev: pdev Handle
@@ -752,6 +806,11 @@ 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;
 
@@ -765,6 +824,13 @@ dp_tx_mon_update_radiotap(struct dp_pdev *pdev,
 		TXMON_PPDU_COM(ppdu_info, chan_freq) =
 				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);
+		return;
+	}
+
 	for (usr_idx = 0; usr_idx < num_users; usr_idx++) {
 		qdf_nbuf_queue_t *mpdu_q = NULL;
 

+ 8 - 0
dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h

@@ -175,6 +175,9 @@ dp_tx_mon_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 
 #define HE_DATA_CNT	6
 
+#define INITIATOR_WINDOW 0
+#define RESPONSE_WINDOW 1
+
 #define FRAME_CONTROL_TYPE_MASK  0x0C
 #define FRAME_CONTROL_TYPE_SHIFT 2
 
@@ -496,6 +499,8 @@ struct dp_txmon_frag_vec {
  * @last_data_ppdu_info: last tx monitor data ppdu info
  * @prot_status_info: protection status info
  * @data_status_info: data status info
+ * @last_tsft: last received tsft
+ * @last_ppdu_timestamp: last received ppdu_timestamp
  * @last_frag_q_idx: last index of frag buffer
  * @cur_frag_q_idx: current index of frag buffer
  * @status_frag_queue: array of status frag queue to hold 64 status buffer
@@ -529,6 +534,9 @@ struct dp_pdev_tx_monitor_be {
 	struct hal_tx_status_info prot_status_info;
 	struct hal_tx_status_info data_status_info;
 
+	uint64_t last_tsft;
+	uint32_t last_ppdu_timestamp;
+
 	uint8_t last_frag_q_idx;
 	uint8_t cur_frag_q_idx;
 	struct dp_txmon_frag_vec frag_q_vec[MAX_STATUS_BUFFER_IN_PPDU];

+ 81 - 43
dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c

@@ -297,12 +297,14 @@ dp_tx_mon_enqueue_mpdu_nbuf(struct dp_pdev *pdev,
  * dp_tx_mon_generate_cts2self_frm() - API to generate cts2self frame
  * @pdev: pdev Handle
  * @tx_ppdu_info: pointer to tx ppdu info structure
+ * @window_flag: frame generated window
  *
  * Return: void
  */
 static void
 dp_tx_mon_generate_cts2self_frm(struct dp_pdev *pdev,
-				struct dp_tx_ppdu_info *tx_ppdu_info)
+				struct dp_tx_ppdu_info *tx_ppdu_info,
+				uint8_t window_flag)
 {
 	/* allocate and populate CTS/ CTS2SELF frame */
 	/* enqueue 802.11 payload to per user mpdu_q */
@@ -348,9 +350,15 @@ dp_tx_mon_generate_cts2self_frm(struct dp_pdev *pdev,
 	wh_min->i_dur[1] = (duration_le & 0xFF00) >> 8;
 	wh_min->i_dur[0] = (duration_le & 0xFF);
 
-	qdf_mem_copy(wh_min->i_addr1,
-		     TXMON_STATUS_INFO(tx_status_info, addr1),
-		     QDF_MAC_ADDR_SIZE);
+	if (window_flag == INITIATOR_WINDOW) {
+		qdf_mem_copy(wh_min->i_addr1,
+			     TXMON_STATUS_INFO(tx_status_info, addr1),
+			     QDF_MAC_ADDR_SIZE);
+	} else {
+		qdf_mem_copy(wh_min->i_addr1,
+			     TXMON_STATUS_INFO(tx_status_info, addr2),
+			     QDF_MAC_ADDR_SIZE);
+	}
 
 	qdf_nbuf_set_pktlen(mpdu_nbuf, sizeof(*wh_min));
 	dp_tx_mon_enqueue_mpdu_nbuf(pdev, tx_ppdu_info, 0, mpdu_nbuf);
@@ -361,12 +369,14 @@ dp_tx_mon_generate_cts2self_frm(struct dp_pdev *pdev,
  * dp_tx_mon_generate_rts_frm() - API to generate rts frame
  * @pdev: pdev Handle
  * @tx_ppdu_info: pointer to tx ppdu info structure
+ * @window_flag: frame generated window
  *
  * Return: void
  */
 static void
 dp_tx_mon_generate_rts_frm(struct dp_pdev *pdev,
-			   struct dp_tx_ppdu_info *tx_ppdu_info)
+			   struct dp_tx_ppdu_info *tx_ppdu_info,
+			   uint8_t window_flag)
 {
 	/* allocate and populate RTS frame */
 	/* enqueue 802.11 payload to per user mpdu_q */
@@ -413,12 +423,22 @@ dp_tx_mon_generate_rts_frm(struct dp_pdev *pdev,
 
 	if (!tx_status_info->protection_addr)
 		tx_status_info = &tx_mon_be->data_status_info;
-	qdf_mem_copy(wh_min->i_addr1,
-		     TXMON_STATUS_INFO(tx_status_info, addr1),
-		     QDF_MAC_ADDR_SIZE);
-	qdf_mem_copy(wh_min->i_addr2,
-		     TXMON_STATUS_INFO(tx_status_info, addr2),
-		     QDF_MAC_ADDR_SIZE);
+
+	if (window_flag == INITIATOR_WINDOW) {
+		qdf_mem_copy(wh_min->i_addr1,
+			     TXMON_STATUS_INFO(tx_status_info, addr1),
+			     QDF_MAC_ADDR_SIZE);
+		qdf_mem_copy(wh_min->i_addr2,
+			     TXMON_STATUS_INFO(tx_status_info, addr2),
+			     QDF_MAC_ADDR_SIZE);
+	} else {
+		qdf_mem_copy(wh_min->i_addr1,
+			     TXMON_STATUS_INFO(tx_status_info, addr2),
+			     QDF_MAC_ADDR_SIZE);
+		qdf_mem_copy(wh_min->i_addr2,
+			     TXMON_STATUS_INFO(tx_status_info, addr1),
+			     QDF_MAC_ADDR_SIZE);
+	}
 
 	qdf_nbuf_set_pktlen(mpdu_nbuf, sizeof(*wh_min));
 	dp_tx_mon_enqueue_mpdu_nbuf(pdev, tx_ppdu_info, 0, mpdu_nbuf);
@@ -429,12 +449,14 @@ dp_tx_mon_generate_rts_frm(struct dp_pdev *pdev,
  * dp_tx_mon_generate_ack_frm() - API to generate ack frame
  * @pdev: pdev Handle
  * @tx_ppdu_info: pointer to tx ppdu info structure
+ * @window_flag: frame generated window
  *
  * Return: void
  */
 static void
 dp_tx_mon_generate_ack_frm(struct dp_pdev *pdev,
-			   struct dp_tx_ppdu_info *tx_ppdu_info)
+			   struct dp_tx_ppdu_info *tx_ppdu_info,
+			   uint8_t window_flag)
 {
 	/* allocate and populate ACK frame */
 	/* enqueue 802.11 payload to per user mpdu_q */
@@ -473,9 +495,17 @@ dp_tx_mon_generate_ack_frm(struct dp_pdev *pdev,
 	wh_addr1->i_fc[1] = 0;
 	wh_addr1->i_fc[0] = (IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
 			     IEEE80211_FC0_SUBTYPE_ACK);
-	qdf_mem_copy(wh_addr1->i_addr1,
-		     TXMON_STATUS_INFO(tx_status_info, addr1),
-		     QDF_MAC_ADDR_SIZE);
+
+	if (window_flag == INITIATOR_WINDOW) {
+		qdf_mem_copy(wh_addr1->i_addr1,
+			     TXMON_STATUS_INFO(tx_status_info, addr1),
+			     QDF_MAC_ADDR_SIZE);
+	} else {
+		qdf_mem_copy(wh_addr1->i_addr1,
+			     TXMON_STATUS_INFO(tx_status_info, addr2),
+			     QDF_MAC_ADDR_SIZE);
+	}
+
 	/* set duration zero for ack frame */
 	*(u_int16_t *)(&wh_addr1->i_dur) = qdf_cpu_to_le16(0x0000);
 
@@ -649,12 +679,14 @@ dp_tx_mon_generate_4addr_qos_null_frm(struct dp_pdev *pdev,
  * dp_tx_mon_generate_mu_block_ack_frm() - API to generate MU block ack frame
  * @pdev: pdev Handle
  * @tx_ppdu_info: pointer to tx ppdu info structure
+ * @window_flag: frame generated window
  *
  * Return: void
  */
 static void
 dp_tx_mon_generate_mu_block_ack_frm(struct dp_pdev *pdev,
-				    struct dp_tx_ppdu_info *tx_ppdu_info)
+				    struct dp_tx_ppdu_info *tx_ppdu_info,
+				    uint8_t window_flag)
 {
 	/* allocate and populate MU block ack frame */
 	/* enqueue 802.11 payload to per user mpdu_q */
@@ -757,12 +789,14 @@ dp_tx_mon_generate_mu_block_ack_frm(struct dp_pdev *pdev,
  * dp_tx_mon_generate_block_ack_frm() - API to generate block ack frame
  * @pdev: pdev Handle
  * @tx_ppdu_info: pointer to tx ppdu info structure
+ * @window_flag: frame generated window
  *
  * Return: void
  */
 static void
 dp_tx_mon_generate_block_ack_frm(struct dp_pdev *pdev,
-				 struct dp_tx_ppdu_info *tx_ppdu_info)
+				 struct dp_tx_ppdu_info *tx_ppdu_info,
+				 uint8_t window_flag)
 {
 	/* allocate and populate block ack frame */
 	/* enqueue 802.11 payload to per user mpdu_q */
@@ -845,12 +879,21 @@ dp_tx_mon_generate_block_ack_frm(struct dp_pdev *pdev,
 	/* duration */
 	*(u_int16_t *)(&wh_addr2->i_aidordur) = qdf_cpu_to_le16(0x0020);
 
-	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) {
+		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);
+	} 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 */
@@ -1009,12 +1052,14 @@ dp_tx_mon_generate_prot_frm(struct dp_pdev *pdev,
 	case TXMON_MEDIUM_RTS_11AC_STATIC_BW:
 	case TXMON_MEDIUM_RTS_11AC_DYNAMIC_BW:
 	{
-		dp_tx_mon_generate_rts_frm(pdev, tx_ppdu_info);
+		dp_tx_mon_generate_rts_frm(pdev, tx_ppdu_info,
+					   INITIATOR_WINDOW);
 		break;
 	}
 	case TXMON_MEDIUM_CTS2SELF:
 	{
-		dp_tx_mon_generate_cts2self_frm(pdev, tx_ppdu_info);
+		dp_tx_mon_generate_cts2self_frm(pdev, tx_ppdu_info,
+						INITIATOR_WINDOW);
 		break;
 	}
 	case TXMON_MEDIUM_QOS_NULL_NO_ACK_3ADDR:
@@ -1132,7 +1177,7 @@ dp_tx_mon_generated_response_frm(struct dp_pdev *pdev,
 						  IEEE80211_FC0_SUBTYPE_SHIFT));
 		TXMON_PPDU_COM(tx_ppdu_info,
 			       frame_control_info_valid) = 1;
-		dp_tx_mon_generate_ack_frm(pdev, tx_ppdu_info);
+		dp_tx_mon_generate_ack_frm(pdev, tx_ppdu_info, RESPONSE_WINDOW);
 		break;
 	}
 	case TXMON_GEN_RESP_SELFGEN_CTS:
@@ -1144,7 +1189,8 @@ dp_tx_mon_generated_response_frm(struct dp_pdev *pdev,
 						  IEEE80211_FC0_SUBTYPE_SHIFT));
 		TXMON_PPDU_COM(tx_ppdu_info,
 			       frame_control_info_valid) = 1;
-		dp_tx_mon_generate_cts2self_frm(pdev, tx_ppdu_info);
+		dp_tx_mon_generate_cts2self_frm(pdev, tx_ppdu_info,
+						RESPONSE_WINDOW);
 		break;
 	}
 	case TXMON_GEN_RESP_SELFGEN_BA:
@@ -1156,7 +1202,8 @@ dp_tx_mon_generated_response_frm(struct dp_pdev *pdev,
 						  IEEE80211_FC0_SUBTYPE_SHIFT));
 		TXMON_PPDU_COM(tx_ppdu_info,
 			       frame_control_info_valid) = 1;
-		dp_tx_mon_generate_block_ack_frm(pdev, tx_ppdu_info);
+		dp_tx_mon_generate_block_ack_frm(pdev, tx_ppdu_info,
+						 RESPONSE_WINDOW);
 		break;
 	}
 	case TXMON_GEN_RESP_SELFGEN_MBA:
@@ -1235,18 +1282,6 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev,
 	}
 	case HAL_MON_RX_RESPONSE_REQUIRED_INFO:
 	{
-		/*
-		 * start of Response window
-		 *
-		 * response window start and follow with
-		 * RTS(sta) - cts(AP)
-		 * BlockAckReq(sta) - BlockAck(AP)
-		 */
-		tx_status_info = &tx_mon_be->data_status_info;
-		if (TXMON_STATUS_INFO(tx_status_info, reception_type) ==
-		    TXMON_RESP_CTS)
-			dp_tx_mon_generate_cts2self_frm(pdev,
-							tx_data_ppdu_info);
 		break;
 	}
 	case HAL_MON_TX_FES_STATUS_START_PROT:
@@ -1272,7 +1307,8 @@ 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);
+		dp_tx_mon_generate_ack_frm(pdev, tx_data_ppdu_info,
+					   INITIATOR_WINDOW);
 		break;
 	}
 	case HAL_MON_RX_FRAME_BITMAP_BLOCK_ACK_256:
@@ -1287,10 +1323,12 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev,
 
 		if (TXMON_PPDU_HAL(tx_data_ppdu_info, num_users))
 			dp_tx_mon_generate_block_ack_frm(pdev,
-							 tx_data_ppdu_info);
+							 tx_data_ppdu_info,
+							 INITIATOR_WINDOW);
 		else
 			dp_tx_mon_generate_mu_block_ack_frm(pdev,
-							    tx_data_ppdu_info);
+							    tx_data_ppdu_info,
+							    INITIATOR_WINDOW);
 
 		break;
 	}

+ 27 - 13
hal/wifi3.0/be/hal_be_generic_api.h

@@ -2090,14 +2090,14 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 					      MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
 					      N_STS);
 		/* if it is SU */
-		nss_su = nss_comb & 0x7;
+		nss_su = (nss_comb & 0x7) + 1;
 		/* partial aid - applicable only for SU */
 		partial_aid = (nss_comb >> 3) & 0x1F;
 		/* if it is MU */
-		nss_mu[0] = nss_comb & 0x7;
-		nss_mu[1] = (nss_comb >> 3) & 0x7;
-		nss_mu[2] = (nss_comb >> 6) & 0x7;
-		nss_mu[3] = (nss_comb >> 9) & 0x7;
+		nss_mu[0] = (nss_comb & 0x7) + 1;
+		nss_mu[1] = ((nss_comb >> 3) & 0x7) + 1;
+		nss_mu[2] = ((nss_comb >> 6) & 0x7) + 1;
+		nss_mu[3] = ((nss_comb >> 9) & 0x7) + 1;
 
 		sgi = HAL_TX_DESC_GET_64(tx_tlv,
 					 MACTX_VHT_SIG_A_MACTX_VHT_SIG_A_INFO_DETAILS,
@@ -2127,25 +2127,34 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 			TXMON_HAL_STATUS(ppdu_info, mcs) = mcs;
 			TXMON_HAL_STATUS(ppdu_info, nss) =
 						nss_su & VHT_SIG_SU_NSS_MASK;
+
+			TXMON_HAL_USER(ppdu_info, user_id,
+				       vht_flag_values3[0]) = ((mcs << 4) |
+							       nss_su);
 		} else {
 			TXMON_HAL_STATUS(ppdu_info, reception_type) =
 						HAL_RX_TYPE_MU_MIMO;
 			TXMON_HAL_USER(ppdu_info, user_id, mcs) = mcs;
 			TXMON_HAL_USER(ppdu_info, user_id, nss) =
 						nss_su & VHT_SIG_SU_NSS_MASK;
+
+			TXMON_HAL_USER(ppdu_info, user_id,
+				       vht_flag_values3[0]) = ((mcs << 4) |
+							       nss_su);
+			TXMON_HAL_USER(ppdu_info, user_id,
+				       vht_flag_values3[1]) = ((mcs << 4) |
+							       nss_mu[1]);
+			TXMON_HAL_USER(ppdu_info, user_id,
+				       vht_flag_values3[2]) = ((mcs << 4) |
+							       nss_mu[2]);
+			TXMON_HAL_USER(ppdu_info, user_id,
+				       vht_flag_values3[3]) = ((mcs << 4) |
+							       nss_mu[3]);
 		}
 
 		/* TODO: loop over multiple user */
 		TXMON_HAL_USER(ppdu_info, user_id,
 			       vht_flag_values2) = bandwidth;
-		TXMON_HAL_USER(ppdu_info, user_id,
-			       vht_flag_values3[0]) = (mcs << 4) | nss_su;
-		TXMON_HAL_USER(ppdu_info, user_id,
-			       vht_flag_values3[1]) = (mcs << 4) | nss_mu[1];
-		TXMON_HAL_USER(ppdu_info, user_id,
-			       vht_flag_values3[2]) = (mcs << 4) | nss_mu[2];
-		TXMON_HAL_USER(ppdu_info, user_id,
-			       vht_flag_values3[3]) = (mcs << 4) | nss_mu[3];
 		TXMON_HAL_USER(ppdu_info, user_id,
 			       vht_flag_values4) = coding;
 		TXMON_HAL_USER(ppdu_info, user_id,
@@ -2501,6 +2510,11 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
 		SHOW_DEFINED(WIFITRIGGER_RESPONSE_TX_DONE_E);
 		break;
 	}
+	case WIFIFW2SW_MON_E:
+	{
+		SHOW_DEFINED(WIFIFW2SW_MON_E);
+		break;
+	}
 	}
 
 	return status;