qcacmn: support flush tlv in tx capture

update ppdu desc member based on flush tlv field
to support tx capture feature.

Change-Id: I9c5bc3a1ccce935d6be63556c025997d01fb6d4b
This commit is contained in:
nobelj
2019-12-13 12:59:14 -08:00
committed by nshrivas
parent 182938a5b0
commit 0e00776f45
2 changed files with 42 additions and 18 deletions

View File

@@ -1524,6 +1524,10 @@ struct cdp_tx_mgmt_comp_info {
* @bar_num_users: BA response user count, based on completion common TLV * @bar_num_users: BA response user count, based on completion common TLV
* @num_users: Number of users * @num_users: Number of users
* @pending_retries: pending MPDUs (retries) * @pending_retries: pending MPDUs (retries)
* @drop_reason: drop reason from flush status
* @is_flush: is_flush is set based on flush tlv
* @flow_type: tx flow type from flush status
* @queue_type: queue type from flush status
* @num_mpdu: Number of MPDUs in PPDU * @num_mpdu: Number of MPDUs in PPDU
* @num_msdu: Number of MSDUs in PPDU * @num_msdu: Number of MSDUs in PPDU
* @frame_type: frame SU or MU * @frame_type: frame SU or MU
@@ -1557,6 +1561,10 @@ struct cdp_tx_completion_ppdu {
uint32_t num_users; uint32_t num_users;
uint8_t last_usr_index; uint8_t last_usr_index;
uint32_t pending_retries; uint32_t pending_retries;
uint32_t drop_reason;
uint32_t is_flush:1,
flow_type:8,
queue_type:8;
uint32_t num_mpdu:9, uint32_t num_mpdu:9,
num_msdu:16; num_msdu:16;
uint16_t frame_type; uint16_t frame_type;

View File

@@ -2720,37 +2720,50 @@ static void dp_process_ppdu_stats_user_common_array_tlv(
* htt_ppdu_stats_flush_tlv * htt_ppdu_stats_flush_tlv
* @pdev: DP PDEV handle * @pdev: DP PDEV handle
* @tag_buf: buffer containing the htt_ppdu_stats_flush_tlv * @tag_buf: buffer containing the htt_ppdu_stats_flush_tlv
* @ppdu_info: per ppdu tlv structure
* *
* return:void * return:void
*/ */
static void dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev, static void
uint32_t *tag_buf) dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev,
uint32_t *tag_buf,
struct ppdu_info *ppdu_info)
{ {
struct cdp_tx_completion_ppdu *ppdu_desc;
uint32_t peer_id; uint32_t peer_id;
uint32_t drop_reason;
uint8_t tid; uint8_t tid;
uint32_t num_msdu;
struct dp_peer *peer; struct dp_peer *peer;
tag_buf++; ppdu_desc = (struct cdp_tx_completion_ppdu *)
drop_reason = *tag_buf; qdf_nbuf_data(ppdu_info->nbuf);
ppdu_desc->is_flush = 1;
tag_buf++; tag_buf++;
num_msdu = HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_GET(*tag_buf); ppdu_desc->drop_reason = *tag_buf;
tag_buf++; tag_buf++;
peer_id = ppdu_desc->num_msdu = HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_GET(*tag_buf);
HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_GET(*tag_buf); ppdu_desc->num_mpdu = HTT_PPDU_STATS_FLUSH_TLV_NUM_MPDU_GET(*tag_buf);
ppdu_desc->flow_type = HTT_PPDU_STATS_FLUSH_TLV_FLOW_TYPE_GET(*tag_buf);
tag_buf++;
peer_id = HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_GET(*tag_buf);
tid = HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_GET(*tag_buf);
ppdu_desc->user[0].peer_id = peer_id;
ppdu_desc->user[0].tid = tid;
ppdu_desc->queue_type =
HTT_PPDU_STATS_FLUSH_TLV_QUEUE_TYPE_GET(*tag_buf);
peer = dp_peer_find_by_id(pdev->soc, peer_id); peer = dp_peer_find_by_id(pdev->soc, peer_id);
if (!peer) if (!peer)
return; return;
tid = HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_GET(*tag_buf); if (ppdu_desc->drop_reason == HTT_FLUSH_EXCESS_RETRIES) {
DP_STATS_INC(peer,
if (drop_reason == HTT_FLUSH_EXCESS_RETRIES) { tx.excess_retries_per_ac[TID_TO_WME_AC(tid)],
DP_STATS_INC(peer, tx.excess_retries_per_ac[TID_TO_WME_AC(tid)], ppdu_desc->num_msdu);
num_msdu);
} }
dp_peer_unref_del_find_by_id(peer); dp_peer_unref_del_find_by_id(peer);
@@ -2966,8 +2979,8 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf,
tlv_expected_size = sizeof(htt_ppdu_stats_flush_tlv); tlv_expected_size = sizeof(htt_ppdu_stats_flush_tlv);
tlv_desc = dp_validate_fix_ppdu_tlv(pdev, tag_buf, tlv_desc = dp_validate_fix_ppdu_tlv(pdev, tag_buf,
tlv_expected_size, tlv_len); tlv_expected_size, tlv_len);
dp_process_ppdu_stats_user_compltn_flush_tlv( dp_process_ppdu_stats_user_compltn_flush_tlv(pdev, tlv_desc,
pdev, tlv_desc); ppdu_info);
break; break;
default: default:
break; break;
@@ -3421,9 +3434,12 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev,
* tlv_bitmap_expected can't be available for different frame type. * tlv_bitmap_expected can't be available for different frame type.
* But STATS COMMON TLV is the last TLV from the FW for a ppdu. * But STATS COMMON TLV is the last TLV from the FW for a ppdu.
* apart from ACK BA TLV, FW sends other TLV in sequential order. * apart from ACK BA TLV, FW sends other TLV in sequential order.
* flush tlv comes separate.
*/ */
if (ppdu_info->tlv_bitmap != 0 && if ((ppdu_info->tlv_bitmap != 0 &&
(ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_COMMON_TLV))) (ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_COMMON_TLV))) ||
(ppdu_info->tlv_bitmap &
(1 << HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV)))
return ppdu_info; return ppdu_info;
return NULL; return NULL;