qcacmn: tx monitor populate basic tlv
tx monitor populate basic tlv data. Change-Id: I346b5da00b967fb9717009a153e8f8db239494ef CRs-Fixed: 3204929
This commit is contained in:

committed by
Madan Koyyalamudi

parent
5ec471e872
commit
69a8a9c767
@@ -511,6 +511,37 @@ hal_txmon_parse_pcu_ppdu_setup_init(void *tx_tlv,
|
||||
struct hal_tx_status_info *data_status_info,
|
||||
struct hal_tx_status_info *prot_status_info)
|
||||
{
|
||||
prot_status_info->protection_addr =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, PCU_PPDU_SETUP_INIT,
|
||||
USE_ADDRESS_FIELDS_FOR_PROTECTION);
|
||||
/* protection frame address 1 */
|
||||
*(uint32_t *)&prot_status_info->addr1[0] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, PCU_PPDU_SETUP_INIT,
|
||||
PROTECTION_FRAME_AD1_31_0);
|
||||
*(uint32_t *)&prot_status_info->addr1[4] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, PCU_PPDU_SETUP_INIT,
|
||||
PROTECTION_FRAME_AD1_47_32);
|
||||
/* protection frame address 2 */
|
||||
*(uint32_t *)&prot_status_info->addr2[0] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, PCU_PPDU_SETUP_INIT,
|
||||
PROTECTION_FRAME_AD2_15_0);
|
||||
*(uint32_t *)&prot_status_info->addr2[2] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, PCU_PPDU_SETUP_INIT,
|
||||
PROTECTION_FRAME_AD2_47_16);
|
||||
/* protection frame address 3 */
|
||||
*(uint32_t *)&prot_status_info->addr3[0] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, PCU_PPDU_SETUP_INIT,
|
||||
PROTECTION_FRAME_AD3_31_0);
|
||||
*(uint32_t *)&prot_status_info->addr3[4] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, PCU_PPDU_SETUP_INIT,
|
||||
PROTECTION_FRAME_AD3_47_32);
|
||||
/* protection frame address 4 */
|
||||
*(uint32_t *)&prot_status_info->addr4[0] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, PCU_PPDU_SETUP_INIT,
|
||||
PROTECTION_FRAME_AD4_15_0);
|
||||
*(uint32_t *)&prot_status_info->addr4[2] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, PCU_PPDU_SETUP_INIT,
|
||||
PROTECTION_FRAME_AD4_47_16);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -529,6 +560,16 @@ hal_txmon_parse_peer_entry(void *tx_tlv,
|
||||
struct hal_tx_ppdu_info *tx_ppdu_info,
|
||||
struct hal_tx_status_info *tx_status_info)
|
||||
{
|
||||
*(uint32_t *)&tx_status_info->addr1[0] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_PEER_ENTRY, MAC_ADDR_A_31_0);
|
||||
*(uint32_t *)&tx_status_info->addr1[4] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_PEER_ENTRY, MAC_ADDR_A_47_32);
|
||||
*(uint32_t *)&tx_status_info->addr2[0] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_PEER_ENTRY, MAC_ADDR_B_15_0);
|
||||
*(uint32_t *)&tx_status_info->addr2[2] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_PEER_ENTRY, MAC_ADDR_B_47_16);
|
||||
TXMON_HAL_USER(tx_ppdu_info, user_id, sw_peer_id) =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_PEER_ENTRY, SW_PEER_ID);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -543,6 +584,10 @@ static inline void
|
||||
hal_txmon_parse_queue_exten(void *tx_tlv,
|
||||
struct hal_tx_ppdu_info *tx_ppdu_info)
|
||||
{
|
||||
TXMON_HAL_STATUS(tx_ppdu_info, frame_control) =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_QUEUE_EXTENSION,
|
||||
FRAME_CTL);
|
||||
TXMON_HAL_STATUS(tx_ppdu_info, frame_control_info_valid) = true;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -558,6 +603,10 @@ static inline void
|
||||
hal_txmon_parse_mpdu_start(void *tx_tlv, uint8_t user_id,
|
||||
struct hal_tx_ppdu_info *tx_ppdu_info)
|
||||
{
|
||||
TXMON_HAL_USER(tx_ppdu_info, user_id,
|
||||
start_seq) = HAL_TX_DESC_GET_64(tx_tlv, TX_MPDU_START,
|
||||
MPDU_SEQUENCE_NUMBER);
|
||||
TXMON_HAL(tx_ppdu_info, cur_usr_idx) = user_id;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -780,14 +829,104 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
|
||||
case WIFITX_FES_STATUS_END_E:/* UPSTREAM */
|
||||
{
|
||||
/* initiator PPDU window end */
|
||||
uint32_t ppdu_timestamp_start = 0;
|
||||
uint32_t ppdu_timestamp_end = 0;
|
||||
uint8_t response_type = 0;
|
||||
uint8_t r2r_end_status_follow = 0;
|
||||
|
||||
status = HAL_MON_TX_FES_STATUS_END;
|
||||
|
||||
ppdu_timestamp_start =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
|
||||
START_OF_FRAME_TIMESTAMP_15_0) |
|
||||
(HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
|
||||
START_OF_FRAME_TIMESTAMP_31_16) <<
|
||||
HAL_TX_LSB(TX_FES_STATUS_END,
|
||||
START_OF_FRAME_TIMESTAMP_31_16));
|
||||
ppdu_timestamp_end =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
|
||||
END_OF_FRAME_TIMESTAMP_15_0) |
|
||||
(HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
|
||||
END_OF_FRAME_TIMESTAMP_31_16) <<
|
||||
HAL_TX_LSB(TX_FES_STATUS_END,
|
||||
END_OF_FRAME_TIMESTAMP_31_16));
|
||||
|
||||
response_type = HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
|
||||
RESPONSE_TYPE);
|
||||
/*
|
||||
* r2r end status follow to inform whether to look for
|
||||
* rx_response_required_info
|
||||
*/
|
||||
r2r_end_status_follow =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_END,
|
||||
R2R_END_STATUS_TO_FOLLOW);
|
||||
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
response_type) = response_type;
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
r2r_to_follow) = r2r_end_status_follow;
|
||||
|
||||
/* update phy timestamp to ppdu timestamp */
|
||||
TXMON_HAL_STATUS(ppdu_info,
|
||||
ppdu_timestamp) = ppdu_timestamp_start;
|
||||
|
||||
SHOW_DEFINED(WIFITX_FES_STATUS_END_E);
|
||||
break;
|
||||
}
|
||||
/* response window open */
|
||||
case WIFIRX_RESPONSE_REQUIRED_INFO_E:/* UPSTREAM */
|
||||
{
|
||||
/* response PPDU window start */
|
||||
uint32_t ppdu_id = 0;
|
||||
uint8_t reception_type = 0;
|
||||
uint8_t response_sta_count = 0;
|
||||
|
||||
status = HAL_MON_RX_RESPONSE_REQUIRED_INFO;
|
||||
|
||||
ppdu_id = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
RX_RESPONSE_REQUIRED_INFO,
|
||||
PHY_PPDU_ID);
|
||||
reception_type =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, RX_RESPONSE_REQUIRED_INFO,
|
||||
SU_OR_UPLINK_MU_RECEPTION);
|
||||
response_sta_count =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, RX_RESPONSE_REQUIRED_INFO,
|
||||
RESPONSE_STA_COUNT);
|
||||
|
||||
/* get mac address */
|
||||
*(uint32_t *)&tx_status_info->addr1[0] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv,
|
||||
RX_RESPONSE_REQUIRED_INFO,
|
||||
ADDR1_31_0);
|
||||
*(uint32_t *)&tx_status_info->addr1[4] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv,
|
||||
RX_RESPONSE_REQUIRED_INFO,
|
||||
ADDR1_47_32);
|
||||
*(uint32_t *)&tx_status_info->addr2[0] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv,
|
||||
RX_RESPONSE_REQUIRED_INFO,
|
||||
ADDR2_15_0);
|
||||
*(uint32_t *)&tx_status_info->addr2[2] =
|
||||
HAL_TX_DESC_GET_64(tx_tlv,
|
||||
RX_RESPONSE_REQUIRED_INFO,
|
||||
ADDR2_47_16);
|
||||
|
||||
TXMON_HAL(ppdu_info, ppdu_id) = ppdu_id;
|
||||
TXMON_HAL_STATUS(ppdu_info, ppdu_id) = ppdu_id;
|
||||
|
||||
if (response_sta_count == 0)
|
||||
response_sta_count = 1;
|
||||
TXMON_HAL(ppdu_info, num_users) = response_sta_count;
|
||||
|
||||
if (reception_type)
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
transmission_type) =
|
||||
TXMON_SU_TRANSMISSION;
|
||||
else
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
transmission_type) =
|
||||
TXMON_MU_TRANSMISSION;
|
||||
|
||||
SHOW_DEFINED(WIFIRX_RESPONSE_REQUIRED_INFO_E);
|
||||
break;
|
||||
}
|
||||
@@ -795,7 +934,38 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
|
||||
case WIFIRESPONSE_END_STATUS_E:/* UPSTREAM */
|
||||
{
|
||||
/* response PPDU window end */
|
||||
uint8_t generated_response = 0;
|
||||
uint32_t bandwidth = 0;
|
||||
uint32_t ppdu_timestamp_start = 0;
|
||||
uint32_t ppdu_timestamp_end = 0;
|
||||
|
||||
status = HAL_MON_RESPONSE_END_STATUS_INFO;
|
||||
generated_response = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
RESPONSE_END_STATUS,
|
||||
GENERATED_RESPONSE);
|
||||
bandwidth = HAL_TX_DESC_GET_64(tx_tlv, RESPONSE_END_STATUS,
|
||||
COEX_BASED_TX_BW);
|
||||
/* 32 bits TSF */
|
||||
ppdu_timestamp_start =
|
||||
(HAL_TX_DESC_GET_64(tx_tlv, RESPONSE_END_STATUS,
|
||||
START_OF_FRAME_TIMESTAMP_15_0) |
|
||||
(HAL_TX_DESC_GET_64(tx_tlv, RESPONSE_END_STATUS,
|
||||
START_OF_FRAME_TIMESTAMP_31_16) <<
|
||||
16));
|
||||
ppdu_timestamp_end =
|
||||
(HAL_TX_DESC_GET_64(tx_tlv, RESPONSE_END_STATUS,
|
||||
END_OF_FRAME_TIMESTAMP_15_0) |
|
||||
(HAL_TX_DESC_GET_64(tx_tlv, RESPONSE_END_STATUS,
|
||||
END_OF_FRAME_TIMESTAMP_31_16) <<
|
||||
16));
|
||||
|
||||
TXMON_HAL_STATUS(ppdu_info, bw) = bandwidth;
|
||||
/* update phy timestamp to ppdu timestamp */
|
||||
TXMON_HAL_STATUS(ppdu_info,
|
||||
ppdu_timestamp) = ppdu_timestamp_start;
|
||||
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
generated_response) = generated_response;
|
||||
SHOW_DEFINED(WIFIRESPONSE_END_STATUS_E);
|
||||
break;
|
||||
}
|
||||
@@ -849,6 +1019,20 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
|
||||
}
|
||||
case WIFITX_DATA_E:/* DOWNSTREAM */
|
||||
{
|
||||
status = HAL_MON_TX_DATA;
|
||||
/*
|
||||
* TODO: do we need a conversion api to convert
|
||||
* user_id from hw to get host user_index
|
||||
*/
|
||||
TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
buffer) = (void *)status_frag;
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
offset) = ((void *)tx_tlv -
|
||||
(void *)status_frag);
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
length) = tlv_len;
|
||||
|
||||
/*
|
||||
* reference of the status buffer will be held in
|
||||
* dp_tx_update_ppdu_info_status()
|
||||
@@ -857,13 +1041,23 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
|
||||
SHOW_DEFINED(WIFITX_DATA_E);
|
||||
break;
|
||||
}
|
||||
case WIFIMON_BUFFER_ADDR_E:
|
||||
case WIFIMON_BUFFER_ADDR_E:/* DOWNSTREAM */
|
||||
{
|
||||
frag_buf = hal_txmon_get_buffer_addr_generic_be(tx_tlv, NULL);
|
||||
if (frag_buf)
|
||||
qdf_frag_free(frag_buf);
|
||||
frag_buf = NULL;
|
||||
struct hal_mon_buf_addr_status buf_status = {0};
|
||||
|
||||
status = HAL_MON_TX_BUFFER_ADDR;
|
||||
/*
|
||||
* TODO: do we need a conversion api to convert
|
||||
* user_id from hw to get host user_index
|
||||
*/
|
||||
TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
|
||||
frag_buf = hal_txmon_get_buffer_addr_generic_be(tx_tlv,
|
||||
&buf_status);
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
buffer) = (void *)frag_buf;
|
||||
TXMON_STATUS_INFO(tx_status_info, offset) = 0;
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
length) = buf_status.dma_length;
|
||||
|
||||
SHOW_DEFINED(WIFIMON_BUFFER_ADDR_E);
|
||||
break;
|
||||
@@ -998,24 +1192,75 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
|
||||
/*
|
||||
* TLV indicating that first transmission on the medium
|
||||
*/
|
||||
uint8_t medium_prot_type = 0;
|
||||
|
||||
status = HAL_MON_TX_FES_STATUS_START;
|
||||
|
||||
medium_prot_type = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_START,
|
||||
MEDIUM_PROT_TYPE);
|
||||
|
||||
ppdu_info = (struct hal_tx_ppdu_info *)prot_ppdu_info;
|
||||
/* update what type of medium protection frame */
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
medium_prot_type) = medium_prot_type;
|
||||
SHOW_DEFINED(WIFITX_FES_STATUS_START_E);
|
||||
break;
|
||||
}
|
||||
case WIFITX_FES_STATUS_PROT_E:
|
||||
{
|
||||
uint32_t start_timestamp = 0;
|
||||
uint32_t end_timestamp = 0;
|
||||
|
||||
/*
|
||||
* generated by TXPCU to indicate the result of having
|
||||
* received of the expected protection frame
|
||||
*/
|
||||
|
||||
status = HAL_MON_TX_FES_STATUS_PROT;
|
||||
start_timestamp =
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_PROT,
|
||||
START_OF_FRAME_TIMESTAMP_15_0);
|
||||
start_timestamp |=
|
||||
(HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_PROT,
|
||||
START_OF_FRAME_TIMESTAMP_31_16) <<
|
||||
15);
|
||||
end_timestamp = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_PROT,
|
||||
END_OF_FRAME_TIMESTAMP_15_0);
|
||||
end_timestamp |=
|
||||
HAL_TX_DESC_GET_64(tx_tlv, TX_FES_STATUS_PROT,
|
||||
END_OF_FRAME_TIMESTAMP_31_16) << 15;
|
||||
|
||||
/* ppdu timestamp as phy timestamp */
|
||||
TXMON_HAL_STATUS(ppdu_info,
|
||||
ppdu_timestamp) = start_timestamp;
|
||||
|
||||
SHOW_DEFINED(WIFITX_FES_STATUS_PROT_E);
|
||||
break;
|
||||
}
|
||||
case WIFITX_FES_STATUS_START_PROT_E:
|
||||
{
|
||||
uint64_t tsft_64;
|
||||
uint32_t response_type;
|
||||
status = HAL_MON_TX_FES_STATUS_START_PROT;
|
||||
TXMON_HAL(ppdu_info, prot_tlv_status) = tlv_tag;
|
||||
/* timestamp */
|
||||
tsft_64 = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_START_PROT,
|
||||
PROT_TIMESTAMP_LOWER_32);
|
||||
tsft_64 |= (HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_START_PROT,
|
||||
PROT_TIMESTAMP_UPPER_32) << 32);
|
||||
|
||||
response_type = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_START_PROT,
|
||||
RESPONSE_TYPE);
|
||||
|
||||
TXMON_STATUS_INFO(tx_status_info,
|
||||
response_type) = response_type;
|
||||
TXMON_HAL_STATUS(ppdu_info, tsft) = tsft_64;
|
||||
|
||||
SHOW_DEFINED(WIFITX_FES_STATUS_START_PROT_E);
|
||||
break;
|
||||
}
|
||||
@@ -1032,13 +1277,44 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
|
||||
}
|
||||
case WIFITX_FES_STATUS_START_PPDU_E:
|
||||
{
|
||||
uint64_t tsft_64;
|
||||
uint8_t ndp_frame;
|
||||
|
||||
status = HAL_MON_TX_FES_STATUS_START_PPDU;
|
||||
tsft_64 = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_START_PPDU,
|
||||
PPDU_TIMESTAMP_LOWER_32);
|
||||
tsft_64 |= (HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_START_PPDU,
|
||||
PPDU_TIMESTAMP_UPPER_32) << 32);
|
||||
|
||||
ndp_frame = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_START_PPDU,
|
||||
NDP_FRAME);
|
||||
|
||||
TXMON_STATUS_INFO(tx_status_info, ndp_frame) = ndp_frame;
|
||||
TXMON_HAL_STATUS(ppdu_info, tsft) = tsft_64;
|
||||
|
||||
SHOW_DEFINED(WIFITX_FES_STATUS_START_PPDU_E);
|
||||
break;
|
||||
}
|
||||
case WIFITX_FES_STATUS_USER_PPDU_E:
|
||||
{
|
||||
/* user tlv */
|
||||
uint16_t duration;
|
||||
uint8_t transmitted_tid;
|
||||
|
||||
duration = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_USER_PPDU,
|
||||
DURATION);
|
||||
transmitted_tid = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
TX_FES_STATUS_USER_PPDU,
|
||||
TRANSMITTED_TID);
|
||||
|
||||
TXMON_HAL(ppdu_info, cur_usr_idx) = user_id;
|
||||
TXMON_HAL_USER(ppdu_info, user_id, tid) = transmitted_tid;
|
||||
TXMON_HAL_USER(ppdu_info, user_id, duration) = duration;
|
||||
|
||||
status = HAL_MON_TX_FES_STATUS_USER_PPDU;
|
||||
SHOW_DEFINED(WIFITX_FES_STATUS_USER_PPDU_E);
|
||||
break;
|
||||
@@ -1268,7 +1544,22 @@ hal_txmon_status_parse_tlv_generic_be(void *data_ppdu_info,
|
||||
case WIFICOEX_TX_STATUS_E:
|
||||
{
|
||||
/* duration are retrieved from coex tx status */
|
||||
uint16_t duration;
|
||||
uint8_t status_reason;
|
||||
|
||||
status = HAL_MON_COEX_TX_STATUS;
|
||||
duration = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
COEX_TX_STATUS,
|
||||
CURRENT_TX_DURATION);
|
||||
status_reason = HAL_TX_DESC_GET_64(tx_tlv,
|
||||
COEX_TX_STATUS,
|
||||
TX_STATUS_REASON);
|
||||
|
||||
/* update duration */
|
||||
if (status_reason == COEX_FES_TX_START ||
|
||||
status_reason == COEX_RESPONSE_TX_START)
|
||||
TXMON_HAL_USER(ppdu_info, user_id, duration) = duration;
|
||||
|
||||
SHOW_DEFINED(WIFICOEX_TX_STATUS_E);
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user