diff --git a/hal/wifi3.0/be/hal_be_api_mon.h b/hal/wifi3.0/be/hal_be_api_mon.h index 16aa786e91..2d861321ef 100644 --- a/hal/wifi3.0/be/hal_be_api_mon.h +++ b/hal/wifi3.0/be/hal_be_api_mon.h @@ -1166,6 +1166,72 @@ enum hal_ppdu_tlv_category { }; #endif +/** + * struct hal_txmon_user_desc_per_user - user desc per user information + * @psdu_length: PSDU length of the user in octet + * @ru_start_index: RU number to which user is assigned + * @ru_size: Size of the RU for that user + * @ofdma_mu_mimo_enabled: mu mimo transmission within the RU + * @nss: Number of spatial stream occupied by the user + * @stream_offset: Stream Offset from which the User occupies the Streams + * @mcs: Modulation Coding Scheme for the User + * @dcm: Indicates whether dual sub-carrier modulation is applied + * @fec_type: Indicates whether it is BCC or LDPC + * @user_bf_type: user beamforming type + * @drop_user_cbf: frame dropped because of CBF FCS failure + * @ldpc_extra_symbol: LDPC encoding process + * @force_extra_symbol: force an extra OFDM symbol + * @reserved: reserved + * @sw_peer_id: user sw peer id + * @per_user_subband_mask: Per user sub band mask + */ +struct hal_txmon_user_desc_per_user { + uint32_t psdu_length; + uint32_t ru_start_index :8, + ru_size :4, + ofdma_mu_mimo_enabled :1, + nss :3, + stream_offset :3, + mcs :4, + dcm :1, + fec_type :1, + user_bf_type :2, + drop_user_cbf :1, + ldpc_extra_symbol :1, + force_extra_symbol :1, + reserved :2; + uint32_t sw_peer_id :16, + per_user_subband_mask :16; +}; + +/** + * struct hal_txmon_usr_desc_common - user desc common information + * @num_users: Number of users + * @ltf_size: LTF size + * @pkt_extn_pe: packet extension duration of the trigger-based PPDU + * @a_factor: packet extension duration of the trigger-based PPDU + * @center_ru_0: Center RU is occupied in the lower 80 MHz band + * @center_ru_1: Center RU is occupied in the upper 80 MHz band + * @num_data_symbols: number of data symbols + * @doppler_indication: doppler indication + * @reserved: reserved + * @ru_channel_0: RU arrangement for band 0 + * @ru_channel_1: RU arrangement for band 1 + */ +struct hal_txmon_usr_desc_common { + uint32_t num_users :6, + ltf_size :2, + pkt_extn_pe :1, + a_factor :2, + center_ru_0 :1, + center_ru_1 :1, + num_data_symbols :16, + doppler_indication :1, + reserved :2; + uint16_t ru_channel_0[8]; + uint16_t ru_channel_1[8]; +}; + #define IS_MULTI_USERS(num_users) (!!(0xFFFE & num_users)) #define TXMON_HAL(hal_tx_ppdu_info, field) \ diff --git a/hal/wifi3.0/be/hal_be_generic_api.h b/hal/wifi3.0/be/hal_be_generic_api.h index f7f826075f..08fd9aa0c3 100644 --- a/hal/wifi3.0/be/hal_be_generic_api.h +++ b/hal/wifi3.0/be/hal_be_generic_api.h @@ -735,6 +735,345 @@ hal_txmon_parse_fw2sw(void *tx_tlv, uint8_t type, }; } +/** + * hal_txmon_populate_he_data_per_user() - populate he data per user + * + * @usr: pointer to hal_txmon_user_desc_per_user + * @user_id: user index + * @ppdu_info: pointer to hal_tx_ppdu_info + * + * Return: void + */ +static inline void +hal_txmon_populate_he_data_per_user(struct hal_txmon_user_desc_per_user *usr, + uint32_t user_id, + struct hal_tx_ppdu_info *ppdu_info) +{ + 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); + + /* populate */ + /* BEAM CHANGE */ + he_data1 |= QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN; + he_data1 |= QDF_MON_STATUS_TXBF_KNOWN; + he_data5 |= (!!usr->user_bf_type << QDF_MON_STATUS_TXBF_SHIFT); + he_data3 |= (!!usr->user_bf_type << 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 |= (usr->mcs << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT); + /* DCM */ + he_data1 |= QDF_MON_STATUS_HE_DCM_KNOWN; + he_data3 |= (usr->dcm << QDF_MON_STATUS_DCM_SHIFT); + /* LDPC EXTRA SYMB */ + he_data1 |= QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN; + he_data3 |= (usr->ldpc_extra_symbol << + QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT); + /* RU offset and RU */ + he_data2 |= QDF_MON_STATUS_RU_ALLOCATION_OFFSET_KNOWN; + he_data2 |= (get_ru_offset_from_start_index(usr->ru_size, + usr->ru_start_index) << + QDF_MON_STATUS_RU_ALLOCATION_SHIFT); + /* Data BW and RU allocation */ + if (usr->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 + usr->ru_size); + } + + he_data6 |= (usr->nss & 0xF); + TXMON_HAL_USER(ppdu_info, user_id, mcs) = usr->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_data5) = he_data5; + TXMON_HAL_USER(ppdu_info, user_id, he_data6) = he_data6; +} + +/** + * hal_txmon_get_user_desc_per_user() - get mactx user desc per user from tlv + * + * @tx_tlv: pointer to mactx_user_desc_per_user tlv + * @usr: pointer to hal_txmon_user_desc_per_user + * + * Return: void + */ +static inline void +hal_txmon_get_user_desc_per_user(void *tx_tlv, + struct hal_txmon_user_desc_per_user *usr) +{ + usr->psdu_length = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, + PSDU_LENGTH); + usr->ru_start_index = HAL_TX_DESC_GET_64(tx_tlv, + MACTX_USER_DESC_PER_USER, + RU_START_INDEX); + usr->ru_size = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, + RU_SIZE); + usr->ofdma_mu_mimo_enabled = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, + OFDMA_MU_MIMO_ENABLED); + usr->nss = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, NSS); + usr->stream_offset = HAL_TX_DESC_GET_64(tx_tlv, + MACTX_USER_DESC_PER_USER, + STREAM_OFFSET); + usr->mcs = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, MCS); + usr->dcm = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, DCM); + usr->fec_type = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, + FEC_TYPE); + usr->user_bf_type = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, + USER_BF_TYPE); + usr->drop_user_cbf = HAL_TX_DESC_GET_64(tx_tlv, + MACTX_USER_DESC_PER_USER, + DROP_USER_CBF); + usr->ldpc_extra_symbol = HAL_TX_DESC_GET_64(tx_tlv, + MACTX_USER_DESC_PER_USER, + LDPC_EXTRA_SYMBOL); + usr->force_extra_symbol = HAL_TX_DESC_GET_64(tx_tlv, + MACTX_USER_DESC_PER_USER, + FORCE_EXTRA_SYMBOL); + usr->sw_peer_id = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, + SW_PEER_ID); +} + +/** + * hal_txmon_parse_user_desc_per_user() - parse mactx user desc per user + * + * @tx_tlv: pointer to mactx_user_desc_per_user tlv + * @user_id: user index + * @ppdu_info: pointer to hal_tx_ppdu_info + * + * Return: void + */ +static inline void +hal_txmon_parse_user_desc_per_user(void *tx_tlv, uint32_t user_id, + struct hal_tx_ppdu_info *ppdu_info) +{ + struct hal_txmon_user_desc_per_user usr_info = {0}; + + hal_txmon_get_user_desc_per_user(tx_tlv, &usr_info); + + /* based on preamble type populate user desc user info */ + if (TXMON_HAL_STATUS(ppdu_info, he_flags)) + hal_txmon_populate_he_data_per_user(&usr_info, + user_id, ppdu_info); +} + +/** + * hal_txmon_get_user_desc_common() - update hal_txmon_usr_desc_common from tlv + * + * @tx_tlv: pointer to mactx_user_desc_common tlv + * @usr_common: pointer to hal_txmon_usr_desc_common + * + * Return: void + */ +static inline void +hal_txmon_get_user_desc_common(void *tx_tlv, + struct hal_txmon_usr_desc_common *usr_common) +{ + usr_common->ltf_size = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, LTF_SIZE); + usr_common->pkt_extn_pe = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + PACKET_EXTENSION_PE_DISAMBIGUITY); + usr_common->a_factor = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + PACKET_EXTENSION_A_FACTOR); + usr_common->center_ru_0 = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, CENTER_RU_0); + usr_common->center_ru_1 = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, CENTER_RU_1); + usr_common->num_data_symbols = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + NUM_DATA_SYMBOLS); + usr_common->doppler_indication = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + DOPPLER_INDICATION); + usr_common->ru_channel_0[0] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_0); + usr_common->ru_channel_0[1] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_1); + usr_common->ru_channel_0[2] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_2); + usr_common->ru_channel_0[3] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND0_3); + usr_common->ru_channel_0[4] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND0_0); + usr_common->ru_channel_0[5] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND0_1); + usr_common->ru_channel_0[6] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND0_2); + usr_common->ru_channel_0[7] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND0_3); + + usr_common->ru_channel_1[0] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_0); + usr_common->ru_channel_1[1] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_1); + usr_common->ru_channel_1[2] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_2); + usr_common->ru_channel_1[3] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_0123_DETAILS_RU_ALLOCATION_BAND1_3); + usr_common->ru_channel_1[4] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND1_0); + usr_common->ru_channel_1[5] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND1_1); + usr_common->ru_channel_1[6] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND1_2); + usr_common->ru_channel_1[7] = + HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_COMMON, + RU_ALLOCATION_4567_DETAILS_RU_ALLOCATION_BAND1_3); +} + +/** + * hal_txmon_populate_he_data_common() - populate he data common information + * + * @usr_common: pointer to hal_txmon_usr_desc_common + * @user_id: user index + * @ppdu_info: pointer to hal_tx_ppdu_info + * + * Return: void + */ +static inline void +hal_txmon_populate_he_data_common(struct hal_txmon_usr_desc_common *usr_common, + uint32_t user_id, + struct hal_tx_ppdu_info *ppdu_info) +{ + /* 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) |= + (usr_common->pkt_extn_pe << + QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT) | + (usr_common->a_factor << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT) | + ((1 + usr_common->ltf_size) << + QDF_MON_STATUS_HE_LTF_SIZE_SHIFT) | + (usr_common->num_data_symbols << + QDF_MON_STATUS_HE_LTF_SYM_SHIFT); + + /* HE data 6 */ + TXMON_HAL_USER(ppdu_info, user_id, + he_data6) |= (usr_common->doppler_indication << + QDF_MON_STATUS_DOPPLER_SHIFT); +} + +/** + * hal_txmon_populate_he_mu_common() - populate he mu common information + * + * @usr_common: pointer to hal_txmon_usr_desc_common + * @user_id: user index + * @ppdu_info: pointer to hal_tx_ppdu_info + * + * Return: void + */ +static inline void +hal_txmon_populate_he_mu_common(struct hal_txmon_usr_desc_common *usr_common, + uint32_t user_id, + struct hal_tx_ppdu_info *ppdu_info) +{ + uint16_t he_mu_flag_1 = 0; + uint16_t he_mu_flag_2 = 0; + uint16_t i = 0; + + he_mu_flag_1 |= (QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_KNOWN | + QDF_MON_STATUS_CHANNEL_1_CENTER_26_RU_KNOWN | + ((usr_common->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 |= ((usr_common->center_ru_1 << + QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_SHIFT) & + QDF_MON_STATUS_CHANNEL_2_CENTER_26_RU_VALUE); + + for (i = 0; i < usr_common->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]) = + usr_common->ru_channel_0[0]; + TXMON_HAL_USER(ppdu_info, i, he_RU[1]) = + usr_common->ru_channel_0[1]; + TXMON_HAL_USER(ppdu_info, i, he_RU[2]) = + usr_common->ru_channel_0[2]; + TXMON_HAL_USER(ppdu_info, i, he_RU[3]) = + usr_common->ru_channel_0[3]; + /* channel 2 */ + TXMON_HAL_USER(ppdu_info, i, he_RU[4]) = + usr_common->ru_channel_1[0]; + TXMON_HAL_USER(ppdu_info, i, he_RU[5]) = + usr_common->ru_channel_1[1]; + TXMON_HAL_USER(ppdu_info, i, he_RU[6]) = + usr_common->ru_channel_1[2]; + TXMON_HAL_USER(ppdu_info, i, he_RU[7]) = + usr_common->ru_channel_1[3]; + } +} + +/** + * hal_txmon_parse_user_desc_common() - parse mactx user desc common tlv + * + * @tx_tlv: pointer to mactx_user_desc_common tlv + * @user_id: user index + * @ppdu_info: pointer to hal_tx_ppdu_info + * + * Return: void + */ +static inline void +hal_txmon_parse_user_desc_common(void *tx_tlv, uint32_t user_id, + struct hal_tx_ppdu_info *ppdu_info) +{ + struct hal_txmon_usr_desc_common usr_common = {0}; + + usr_common.num_users = TXMON_HAL(ppdu_info, num_users); + hal_txmon_get_user_desc_common(tx_tlv, &usr_common); + + TXMON_HAL_STATUS(ppdu_info, + he_mu_flags) = IS_MULTI_USERS(usr_common.num_users); + + switch (TXMON_HAL_STATUS(ppdu_info, preamble_type)) { + case TXMON_PKT_TYPE_11AX: + if (TXMON_HAL_STATUS(ppdu_info, he_flags)) + hal_txmon_populate_he_data_common(&usr_common, + user_id, ppdu_info); + if (TXMON_HAL_STATUS(ppdu_info, he_mu_flags)) + hal_txmon_populate_he_mu_common(&usr_common, + user_id, ppdu_info); + break; + case TXMON_PKT_TYPE_11BE: + break; + } +} + /** * hal_txmon_status_get_num_users_generic_be() - api to get num users * from start of fes window @@ -1330,6 +1669,8 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info, TXMON_HAL_STATUS(ppdu_info, ppdu_timestamp) = start_timestamp; + TXMON_HAL(ppdu_info, prot_tlv_status) = tlv_tag; + SHOW_DEFINED(WIFITX_FES_STATUS_PROT_E); break; } @@ -2450,244 +2791,14 @@ 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; - uint8_t nss = 0; - uint8_t mcs = 0; - uint8_t dcm = 0; - uint8_t fec_type = 0; - uint8_t is_ldpc_extra_symb = 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; - - TXMON_HAL(ppdu_info, cur_usr_idx) = user_id; - - psdu_length = HAL_TX_DESC_GET_64(tx_tlv, - MACTX_USER_DESC_PER_USER, - PSDU_LENGTH); - ru_start_index = HAL_TX_DESC_GET_64(tx_tlv, - MACTX_USER_DESC_PER_USER, - RU_START_INDEX); - ru_size = HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, - RU_SIZE); - 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, - FEC_TYPE); - is_ldpc_extra_symb = - HAL_TX_DESC_GET_64(tx_tlv, MACTX_USER_DESC_PER_USER, - LDPC_EXTRA_SYMBOL); - - if (!TXMON_HAL_STATUS(ppdu_info, he_flags)) - 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); - /* DCM */ - he_data1 |= QDF_MON_STATUS_HE_DCM_KNOWN; - he_data3 |= (dcm << QDF_MON_STATUS_DCM_SHIFT); - /* LDPC EXTRA SYMB */ - he_data1 |= QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN; - he_data3 |= (is_ldpc_extra_symb << - QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT); - /* RU offset and RU */ - he_data2 |= QDF_MON_STATUS_RU_ALLOCATION_OFFSET_KNOWN; - he_data2 |= (get_ru_offset_from_start_index(ru_size, - ru_start_index) << - QDF_MON_STATUS_RU_ALLOCATION_SHIFT); - - /* Data BW and RU allocation */ - 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_data5) = he_data5; - TXMON_HAL_USER(ppdu_info, user_id, he_data6) = he_data6; + hal_txmon_parse_user_desc_per_user(tx_tlv, user_id, ppdu_info); 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]; + hal_txmon_parse_user_desc_common(tx_tlv, user_id, ppdu_info); /* copy per user info to all user */ SHOW_DEFINED(WIFIMACTX_USER_DESC_COMMON_E);