qcacmn: Add initial support of EHT and USIG in tx monitor

Modified the code to support EHT and USIG in tx monitor and additional
fix

Change-Id: I1cc58f0787a84a379fb4e2ce4954455e0c6551a2
CRs-Fixed: 3386918
This commit is contained in:
nobelj
2023-02-19 10:50:46 -08:00
committed by Madan Koyyalamudi
parent 16b41427d4
commit 5c911bbaca
2 changed files with 409 additions and 232 deletions

View File

@@ -1166,6 +1166,72 @@ enum hal_ppdu_tlv_category {
}; };
#endif #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 IS_MULTI_USERS(num_users) (!!(0xFFFE & num_users))
#define TXMON_HAL(hal_tx_ppdu_info, field) \ #define TXMON_HAL(hal_tx_ppdu_info, field) \

View File

@@ -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 * hal_txmon_status_get_num_users_generic_be() - api to get num users
* from start of fes window * 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, TXMON_HAL_STATUS(ppdu_info,
ppdu_timestamp) = start_timestamp; ppdu_timestamp) = start_timestamp;
TXMON_HAL(ppdu_info, prot_tlv_status) = tlv_tag;
SHOW_DEFINED(WIFITX_FES_STATUS_PROT_E); SHOW_DEFINED(WIFITX_FES_STATUS_PROT_E);
break; break;
} }
@@ -2450,244 +2791,14 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
} }
case WIFIMACTX_USER_DESC_PER_USER_E: case WIFIMACTX_USER_DESC_PER_USER_E:
{ {
/* user tlv */ hal_txmon_parse_user_desc_per_user(tx_tlv, user_id, ppdu_info);
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;
SHOW_DEFINED(WIFIMACTX_USER_DESC_PER_USER_E); SHOW_DEFINED(WIFIMACTX_USER_DESC_PER_USER_E);
break; break;
} }
case WIFIMACTX_USER_DESC_COMMON_E: case WIFIMACTX_USER_DESC_COMMON_E:
{ {
uint16_t he_mu_flag_1 = 0; hal_txmon_parse_user_desc_common(tx_tlv, user_id, ppdu_info);
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 */ /* copy per user info to all user */
SHOW_DEFINED(WIFIMACTX_USER_DESC_COMMON_E); SHOW_DEFINED(WIFIMACTX_USER_DESC_COMMON_E);