diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 9a0ac5aca631..7e90823e4a40 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1042,6 +1042,8 @@ struct cdp_pdev_stats { * @ba_bitmap: Block Ack bitmap * @start_seqa: Sequence number of first MPDU * @enq_bitmap: Enqueue MPDU bitmap + * @tx_duration: PPDU airtime + * @is_mcast: MCAST or UCAST */ struct cdp_tx_completion_ppdu_user { uint32_t completion_status:8, @@ -1082,6 +1084,8 @@ struct cdp_tx_completion_ppdu_user { uint32_t enq_bitmap[CDP_BA_256_BIT_MAP_SIZE_DWORDS]; uint32_t num_mpdu:9, num_msdu:16; + uint32_t tx_duration; + bool is_mcast; }; /** diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 2ade3d5ce416..1ee13f394615 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -57,12 +57,7 @@ do { \ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer, struct cdp_tx_completion_ppdu_user *ppdu, uint32_t ack_rssi) { - struct dp_pdev *pdev = NULL; - - if (!peer) - return; - - pdev = peer->vdev->pdev; + struct dp_pdev *pdev = peer->vdev->pdev; DP_STATS_INC_PKT(peer, tx.comp_pkt, (ppdu->success_msdus + ppdu->retry_msdus + @@ -1312,7 +1307,6 @@ static uint8_t dp_get_ppdu_info_user_index(struct dp_pdev *pdev, qdf_assert_always(pdev->tx_ppdu_info.last_user <= CDP_MU_MAX_USERS); return pdev->tx_ppdu_info.last_user - 1; } -#endif /* * dp_process_ppdu_stats_common_tlv: Process htt_ppdu_stats_common_tlv @@ -1321,7 +1315,6 @@ static uint8_t dp_get_ppdu_info_user_index(struct dp_pdev *pdev, * * return:void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, uint32_t *tag_buf) { @@ -1352,7 +1345,6 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, ppdu_desc->channel = HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_GET(*tag_buf); ppdu_desc->phy_mode = HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_GET(*tag_buf); } -#endif /* * dp_process_ppdu_stats_user_common_tlv: Process ppdu_stats_user_common @@ -1360,7 +1352,6 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, * * return:void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_stats_user_common_tlv( struct dp_pdev *pdev, uint32_t *tag_buf) { @@ -1387,19 +1378,19 @@ static void dp_process_ppdu_stats_user_common_tlv( tag_buf++; - if (HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_GET(*tag_buf)) + if (HTT_PPDU_STATS_USER_COMMON_TLV_MCAST_GET(*tag_buf)) { + ppdu_user_desc->is_mcast = true; ppdu_user_desc->mpdu_tried_mcast = HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_GET(*tag_buf); - else + } else { ppdu_user_desc->mpdu_tried_ucast = HTT_PPDU_STATS_USER_COMMON_TLV_MPDUS_TRIED_GET(*tag_buf); - +} ppdu_user_desc->qos_ctrl = HTT_PPDU_STATS_USER_COMMON_TLV_QOS_CTRL_GET(*tag_buf); ppdu_user_desc->frame_ctrl = HTT_PPDU_STATS_USER_COMMON_TLV_FRAME_CTRL_GET(*tag_buf); } -#endif /** @@ -1409,7 +1400,6 @@ static void dp_process_ppdu_stats_user_common_tlv( * * return:void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev, uint32_t *tag_buf) { @@ -1436,8 +1426,6 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev, ppdu_user_desc->tid = HTT_PPDU_STATS_USER_RATE_TLV_TID_NUM_GET(*tag_buf); - ppdu_user_desc->peer_id = - HTT_PPDU_STATS_USER_RATE_TLV_SW_PEER_ID_GET(*tag_buf); qdf_mem_copy(ppdu_user_desc->mac_addr, peer->mac_addr.raw, DP_MAC_ADDR_LEN); @@ -1464,17 +1452,15 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev, ppdu_user_desc->ppdu_type = HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_GET(*tag_buf); } -#endif /* * dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv: Process * htt_ppdu_stats_enq_mpdu_bitmap_64_tlv - * soc: DP SOC handle + * pdev: DP PDEV handle * @tag_buf: buffer containing the tlv htt_ppdu_stats_enq_mpdu_bitmap_64_tlv * * return:void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv( struct dp_pdev *pdev, uint32_t *tag_buf) { @@ -1509,7 +1495,6 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv( qdf_mem_copy(&ppdu_user_desc->enq_bitmap, &dp_stats_buf->enq_bitmap, CDP_BA_64_BIT_MAP_SIZE_DWORDS); } -#endif /* * dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv: Process @@ -1519,7 +1504,6 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv( * * return:void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv( struct dp_pdev *pdev, uint32_t *tag_buf) { @@ -1554,7 +1538,6 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv( qdf_mem_copy(&ppdu_user_desc->enq_bitmap, &dp_stats_buf->enq_bitmap, CDP_BA_256_BIT_MAP_SIZE_DWORDS); } -#endif /* * dp_process_ppdu_stats_user_cmpltn_common_tlv: Process @@ -1564,7 +1547,6 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv( * * return:void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_stats_user_cmpltn_common_tlv( struct dp_pdev *pdev, uint32_t *tag_buf) { @@ -1619,17 +1601,15 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv( HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_GET(*tag_buf); } -#endif /* * dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv: Process * htt_ppdu_stats_user_compltn_ba_bitmap_64_tlv - * soc: DP SOC handle + * pdev: DP PDEV handle * @tag_buf: buffer containing the htt_ppdu_stats_user_compltn_ba_bitmap_64_tlv * * return:void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv( struct dp_pdev *pdev, uint32_t *tag_buf) { @@ -1663,17 +1643,15 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv( qdf_mem_copy(&ppdu_user_desc->ba_bitmap, &dp_stats_buf->ba_bitmap, CDP_BA_64_BIT_MAP_SIZE_DWORDS); } -#endif /* * dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv: Process * htt_ppdu_stats_user_compltn_ba_bitmap_256_tlv - * soc: DP SOC handle + * pdev: DP PDEV handle * @tag_buf: buffer containing the htt_ppdu_stats_user_compltn_ba_bitmap_256_tlv * * return:void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv( struct dp_pdev *pdev, uint32_t *tag_buf) { @@ -1707,17 +1685,15 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv( qdf_mem_copy(&ppdu_user_desc->ba_bitmap, &dp_stats_buf->ba_bitmap, CDP_BA_256_BIT_MAP_SIZE_DWORDS); } -#endif /* * dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv: Process * htt_ppdu_stats_user_compltn_ack_ba_status_tlv - * soc: DP SOC handle + * pdev: DP PDE handle * @tag_buf: buffer containing the htt_ppdu_stats_user_compltn_ack_ba_status_tlv * * return:void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv( struct dp_pdev *pdev, uint32_t *tag_buf) { @@ -1751,7 +1727,61 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv( ppdu_user_desc->num_msdu = HTT_PPDU_STATS_USER_CMPLTN_ACK_BA_STATUS_TLV_NUM_MSDU_GET(*tag_buf); } -#endif + +/* + * dp_process_ppdu_stats_user_common_array_tlv: Process + * htt_ppdu_stats_user_common_array_tlv + * pdev: DP PDEV handle + * @tag_buf: buffer containing the htt_ppdu_stats_user_compltn_ack_ba_status_tlv + * + * return:void + */ +static void dp_process_ppdu_stats_user_common_array_tlv(struct dp_pdev *pdev, + uint32_t *tag_buf) +{ + uint32_t peer_id; + struct dp_peer *peer; + struct cdp_tx_completion_ppdu *ppdu_desc; + struct cdp_tx_completion_ppdu_user *ppdu_user_desc; + uint8_t curr_user_index = 0; + struct htt_tx_ppdu_stats_info *dp_stats_buf; + + ppdu_desc = + (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(pdev->tx_ppdu_info.buf); + + tag_buf += 2; + dp_stats_buf = (struct htt_tx_ppdu_stats_info *)tag_buf; + tag_buf += 4; + peer_id = + HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_GET(*tag_buf); + + peer = dp_peer_find_by_id(pdev->soc, peer_id); + + if (!peer) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + "Invalid peer"); + return; + } + + curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id); + + ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + + ppdu_user_desc->success_bytes = dp_stats_buf->tx_success_bytes; + ppdu_user_desc->retry_bytes = dp_stats_buf->tx_retry_bytes; + ppdu_user_desc->failed_bytes = dp_stats_buf->tx_failed_bytes; + + tag_buf++; + ppdu_user_desc->success_msdus = + HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_SUCC_MSDUS_GET(*tag_buf); + ppdu_user_desc->retry_bytes = + HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_RETRY_MSDUS_GET(*tag_buf); + tag_buf++; + ppdu_user_desc->failed_msdus = + HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_FAILED_MSDUS_GET(*tag_buf); + ppdu_user_desc->tx_duration = + HTT_PPDU_STATS_ARRAY_ITEM_TLV_TX_DUR_GET(*tag_buf); +} /** * dp_process_ppdu_tag(): Function to process the PPDU TLVs @@ -1760,7 +1790,6 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv( * * return: void */ -#ifdef FEATURE_PERPKT_INFO static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf, uint32_t tlv_len) { @@ -1799,13 +1828,15 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf, dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv(pdev, tag_buf); break; + case HTT_PPDU_STATS_USR_COMMON_ARRAY_TLV: + dp_process_ppdu_stats_user_common_array_tlv(pdev, + tag_buf); + break; default: break; } } -#endif -#ifdef FEATURE_PERPKT_INFO static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev, qdf_nbuf_t htt_t2h_msg) { @@ -1849,7 +1880,7 @@ static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev, return status; } -#endif +#endif /* FEATURE_PERPKT_INFO */ /** * dp_txrx_ppdu_stats_handler() - Function to process HTT PPDU stats from FW @@ -1890,12 +1921,16 @@ static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc, return; } + qdf_mem_zero(qdf_nbuf_data(pdev->tx_ppdu_info.buf), + sizeof(struct cdp_tx_completion_ppdu)); + if (qdf_nbuf_put_tail(pdev->tx_ppdu_info.buf, sizeof(struct cdp_tx_completion_ppdu)) == NULL) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "No tailroom for HTT PPDU"); return; } + } status = dp_htt_process_tlv(pdev, htt_t2h_msg); @@ -1910,6 +1945,11 @@ static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc, for (i = 0; i < ppdu_desc->num_users; i++) { peer = dp_peer_find_by_id(soc, ppdu_desc->user[i].peer_id); + if (!peer) + continue; + + ppdu_desc->num_mpdu += ppdu_desc->user[i].num_mpdu; + ppdu_desc->num_msdu += ppdu_desc->user[i].num_msdu; dp_tx_stats_update(soc, peer, &ppdu_desc->user[i], ppdu_desc->ack_rssi); }