diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index 6b4802709b02..7d119bea1877 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -886,6 +886,11 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info) 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 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info) 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 adce1868ff68..ae99a17db99e 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -300,7 +300,7 @@ struct mon_rx_status { #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 @@ struct mon_rx_status { /* 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 @@ struct mon_rx_status { /* 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