qcacmn: Add HE MU and HE MU Other support

Populate HE-MU and HE-MU-Other fields in the radiotap header.

Change-Id: Iab9b9c47e076007b43b7abeb296ea15f0ec2a2cb
CRs-Fixed: 2191215
diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h
index 6b48027..7d119be 100644
--- a/hal/wifi3.0/hal_api_mon.h
+++ b/hal/wifi3.0/hal_api_mon.h
@@ -886,6 +886,11 @@
 		break;
 	}
 	case WIFIPHYRX_HE_SIG_A_MU_DL_E:
+	{
+		uint8_t *he_sig_a_mu_dl_info = (uint8_t *)rx_tlv +
+			HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_DL_0,
+			HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS);
+
 		ppdu_info->rx_status.he_sig_A1 =
 			*((uint32_t *)((uint8_t *)rx_tlv +
 			HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_DL_0,
@@ -901,41 +906,136 @@
 			HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS)));
 		ppdu_info->rx_status.he_sig_A2_known =
 			QDF_MON_STATUS_HE_SIG_A2_MU_KNOWN_ALL;
+
+		ppdu_info->rx_status.he_mu_flags = 1;
+		ppdu_info->rx_status.he_flags1 =
+			QDF_MON_STATUS_SIG_B_MCS_KNOWN |
+			QDF_MON_STATUS_SIG_B_DCM_KNOWN |
+			QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_1_KNOWN |
+			QDF_MON_STATUS_SIG_B_SYM_NUM_KNOWN |
+			QDF_MON_STATUS_RU_0_KNOWN;
+
+		value = HAL_RX_GET(he_sig_a_mu_dl_info,
+				HE_SIG_A_MU_DL_INFO_0, MCS_OF_SIG_B);
+		ppdu_info->rx_status.he_flags1 |= value;
+		value = HAL_RX_GET(he_sig_a_mu_dl_info,
+				HE_SIG_A_MU_DL_INFO_0, DCM_OF_SIG_B);
+		value = value << QDF_MON_STATUS_DCM_FLAG_1_SHIFT;
+		ppdu_info->rx_status.he_flags1 |= value;
+
+		ppdu_info->rx_status.he_flags2 =
+			QDF_MON_STATUS_BW_KNOWN;
+
+		value = HAL_RX_GET(he_sig_a_mu_dl_info,
+				HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW);
+		ppdu_info->rx_status.he_flags2 |= value;
+		value = HAL_RX_GET(he_sig_a_mu_dl_info,
+				HE_SIG_A_MU_DL_INFO_0, COMP_MODE_SIG_B);
+		value = value << QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT;
+		ppdu_info->rx_status.he_flags2 |= value;
+		value = HAL_RX_GET(he_sig_a_mu_dl_info,
+				HE_SIG_A_MU_DL_INFO_0, NUM_SIG_B_SYMBOLS);
+		value = value - 1;
+		value = value << QDF_MON_STATUS_NUM_SIG_B_SYMBOLS_SHIFT;
+		ppdu_info->rx_status.he_flags2 |= value;
 		break;
+	}
 	case WIFIPHYRX_HE_SIG_B1_MU_E:
 	{
+
 		uint8_t *he_sig_b1_mu_info = (uint8_t *)rx_tlv +
-			*((uint32_t *)((uint8_t *)rx_tlv +
 			HAL_RX_OFFSET(PHYRX_HE_SIG_B1_MU_0,
-			HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS)));
+			HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS);
 
-		ppdu_info->rx_status.he_sig_b_common_RU[0] =
-			HAL_RX_GET(he_sig_b1_mu_info, HE_SIG_B1_MU_INFO_0,
-				RU_ALLOCATION);
-
-		ppdu_info->rx_status.he_sig_b_common_known =
+		ppdu_info->rx_status.he_sig_b_common_known |=
 			QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU0;
 		/* TODO: Check on the availability of other fields in
 		 * sig_b_common
 		 */
+
+		value = HAL_RX_GET(he_sig_b1_mu_info,
+				HE_SIG_B1_MU_INFO_0, RU_ALLOCATION);
+		ppdu_info->rx_status.he_RU[0] = value;
 		break;
 	}
 	case WIFIPHYRX_HE_SIG_B2_MU_E:
-		ppdu_info->rx_status.he_sig_b_user =
-			*((uint32_t *)((uint8_t *)rx_tlv +
+	{
+		uint8_t *he_sig_b2_mu_info = (uint8_t *)rx_tlv +
 			HAL_RX_OFFSET(PHYRX_HE_SIG_B2_MU_0,
-			HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS)));
-		ppdu_info->rx_status.he_sig_b_user_known =
-			QDF_MON_STATUS_HE_SIG_B_USER_KNOWN_SIG_B_ALL;
+			HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS);
+
+		ppdu_info->rx_status.he_mu_other_flags = 1;
+
+		ppdu_info->rx_status.he_per_user_known =
+			QDF_MON_STATUS_STA_ID_PER_USER_KNOWN |
+			QDF_MON_STATUS_STA_CODING_KNOWN |
+			QDF_MON_STATUS_STA_SPATIAL_CONFIG_KNOWN |
+			QDF_MON_STATUS_STA_MCS_KNOWN;
+
+		value = HAL_RX_GET(he_sig_b2_mu_info,
+				HE_SIG_B2_MU_INFO_0, STA_ID);
+		ppdu_info->rx_status.he_per_user_1 = value;
+		value = HAL_RX_GET(he_sig_b2_mu_info,
+				HE_SIG_B2_MU_INFO_0, STA_SPATIAL_CONFIG);
+		value = value << QDF_MON_STATUS_STA_SPATIAL_SHIFT;
+		ppdu_info->rx_status.he_per_user_1 |= value;
+
+		value = HAL_RX_GET(he_sig_b2_mu_info,
+				HE_SIG_B2_OFDMA_INFO_0, STA_MCS);
+		ppdu_info->rx_status.he_per_user_2 = value;
+		value = HAL_RX_GET(he_sig_b2_mu_info,
+				HE_SIG_B2_OFDMA_INFO_0, STA_CODING);
+		value = value << QDF_MON_STATUS_STA_DCM_SHIFT;
+		ppdu_info->rx_status.he_per_user_2 |= value;
+
 		break;
+	}
 	case WIFIPHYRX_HE_SIG_B2_OFDMA_E:
+	{
+		uint8_t *he_sig_b2_ofdma_info =
+		(uint8_t *)rx_tlv +
+		HAL_RX_OFFSET(PHYRX_HE_SIG_B2_OFDMA_0,
+		HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS);
 		ppdu_info->rx_status.he_sig_b_user =
 			*((uint32_t *)((uint8_t *)rx_tlv +
 			HAL_RX_OFFSET(PHYRX_HE_SIG_B2_OFDMA_0,
 			HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS)));
 		ppdu_info->rx_status.he_sig_b_user_known =
 			QDF_MON_STATUS_HE_SIG_B_USER_KNOWN_SIG_B_ALL;
+
+		ppdu_info->rx_status.he_per_user_known =
+			QDF_MON_STATUS_STA_ID_PER_USER_KNOWN |
+			QDF_MON_STATUS_STA_NSTS_KNOWN |
+			QDF_MON_STATUS_STA_TX_BF_KNOWN |
+			QDF_MON_STATUS_STA_MCS_KNOWN |
+			QDF_MON_STATUS_STA_DCM_KNOWN |
+			QDF_MON_STATUS_STA_CODING_KNOWN;
+
+		value = HAL_RX_GET(he_sig_b2_ofdma_info,
+				HE_SIG_B2_OFDMA_INFO_0, STA_ID);
+		ppdu_info->rx_status.he_per_user_1 = value;
+		value = HAL_RX_GET(he_sig_b2_ofdma_info,
+				HE_SIG_B2_OFDMA_INFO_0, NSTS);
+		value = value << QDF_MON_STATUS_STA_SPATIAL_SHIFT;
+		ppdu_info->rx_status.he_per_user_1 |= value;
+		value = HAL_RX_GET(he_sig_b2_ofdma_info,
+				HE_SIG_B2_OFDMA_INFO_0, TXBF);
+		value = value << QDF_MON_STATUS_TXBF_SHIFT;
+		ppdu_info->rx_status.he_per_user_1 |= value;
+
+		value = HAL_RX_GET(he_sig_b2_ofdma_info,
+				HE_SIG_B2_OFDMA_INFO_0, STA_MCS);
+		ppdu_info->rx_status.he_per_user_2 = value;
+		value = HAL_RX_GET(he_sig_b2_ofdma_info,
+				HE_SIG_B2_OFDMA_INFO_0, STA_DCM);
+		value = value << QDF_MON_STATUS_STA_MCS_SHIFT;
+		ppdu_info->rx_status.he_per_user_2 |= value;
+		value = HAL_RX_GET(he_sig_b2_ofdma_info,
+				HE_SIG_B2_OFDMA_INFO_0, STA_CODING);
+		value = value << QDF_MON_STATUS_STA_DCM_SHIFT;
+		ppdu_info->rx_status.he_per_user_2 |= value;
 		break;
+	}
 	case WIFIPHYRX_RSSI_LEGACY_E:
 	{
 		uint8_t *rssi_info_tlv = (uint8_t *)rx_tlv +
diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h
index adce186..ae99a17 100644
--- a/qdf/inc/qdf_nbuf.h
+++ b/qdf/inc/qdf_nbuf.h
@@ -300,7 +300,7 @@
 #define QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU1	0x00000002
 #define QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU2	0x00000004
 #define QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU3	0x00000008
-#define QDF_MON_STATUS_HE_SIG_B_USER_KNOWN_SIG_B_ALL	0x00fe0000
+#define QDF_MON_STATUS_HE_SIG_B_USER_KNOWN_SIG_B_ALL   0x00fe0000
 #define QDF_MON_STATUS_HE_SIG_A1_HE_FORMAT_SU		0x00000000
 #define QDF_MON_STATUS_HE_SIG_A1_HE_FORMAT_EXT_SU	0x40000000
 #define QDF_MON_STATUS_HE_SIG_A1_HE_FORMAT_MU		0x80000000
@@ -410,15 +410,20 @@
 
 /* HE radiotap HE-MU flags1 */
 #define QDF_MON_STATUS_SIG_B_MCS_KNOWN 0x0010
+#define QDF_MON_STATUS_SIG_B_DCM_KNOWN 0x0040
+#define QDF_MON_STATUS_SIG_B_SYM_NUM_KNOWN 0x8000
+#define QDF_MON_STATUS_RU_0_KNOWN 0x0100
+#define QDF_MON_STATUS_RU_1_KNOWN 0x0200
+#define QDF_MON_STATUS_RU_2_KNOWN 0x0400
+#define QDF_MON_STATUS_RU_3_KNOWN 0x0800
 #define QDF_MON_STATUS_DCM_FLAG_1_SHIFT 5
-#define QDF_MON_STATUS_QDF_KNOWN 0x0040
-#define QDF_MON_STATUS_BW_KNOWN 0x0080
 #define QDF_MON_STATUS_SPATIAL_REUSE_MU_KNOWN 0x0100
 #define QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_1_KNOWN 0x4000
 
 /* HE radiotap HE-MU flags2 */
 #define QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT 3
-#define QDF_MON_STATUS_SYMBOLS_SHIFT 4
+#define QDF_MON_STATUS_BW_KNOWN 0x0004
+#define QDF_MON_STATUS_NUM_SIG_B_SYMBOLS_SHIFT 4
 #define QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_KNOWN 0x0100
 #define QDF_MON_STATUS_NUM_SIG_B_FLAG_2_SHIFT 9
 #define QDF_MON_STATUS_LTF_FLAG_2_SYMBOLS_SHIFT 12
@@ -426,10 +431,16 @@
 
 /* HE radiotap per_user_1 */
 #define QDF_MON_STATUS_STA_SPATIAL_SHIFT 11
+#define QDF_MON_STATUS_TXBF_SHIFT 14
 #define QDF_MON_STATUS_RESERVED_SET_TO_1_SHIFT 19
 #define QDF_MON_STATUS_STA_CODING_SHIFT 20
 
+/* HE radiotap per_user_2 */
+#define QDF_MON_STATUS_STA_MCS_SHIFT 4
+#define QDF_MON_STATUS_STA_DCM_SHIFT 5
+
 /* HE radiotap per user known */
+#define QDF_MON_STATUS_USER_FIELD_POSITION_KNOWN 0x01
 #define QDF_MON_STATUS_STA_ID_PER_USER_KNOWN 0x02
 #define QDF_MON_STATUS_STA_NSTS_KNOWN 0x04
 #define QDF_MON_STATUS_STA_TX_BF_KNOWN 0x08