diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 3cd71f6e99..1104ebf000 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1503,6 +1503,8 @@ struct cdp_tx_sojourn_stats { * @is_mcast: MCAST or UCAST * @user_pos: user position * @mu_group_id: mu group id + * @ppdu_start_timestamp: 64 bits ppdu start timestamp + * @ppdu_end_timestamp: 64 bits ppdu end timestamp */ struct cdp_delayed_tx_completion_ppdu_user { uint32_t frame_ctrl:16, @@ -1526,6 +1528,8 @@ struct cdp_delayed_tx_completion_ppdu_user { bool is_mcast; uint32_t user_pos; uint32_t mu_group_id; + uint64_t ppdu_start_timestamp; + uint64_t ppdu_end_timestamp; }; /** @@ -1561,6 +1565,7 @@ struct cdp_delayed_tx_completion_ppdu_user { * @dcm: dcm * @ldpc: ldpc * @delayed_ba: delayed ba bit + * @ack_ba_tlv: ack ba recv tlv bit * @ppdu_type: SU/MU_MIMO/MU_OFDMA/MU_MIMO_OFDMA/UL_TRIG/BURST_BCN/UL_BSR_RESP/ * UL_BSR_TRIG/UNKNOWN * @ba_seq_no: Block Ack sequence number @@ -1584,6 +1589,11 @@ struct cdp_delayed_tx_completion_ppdu_user { * @sa_goodput: smart antenna tx feedback info goodput * @current_rate_per: Moving average per * @last_enq_seq: last equeue sequence number + * @mpdu_q: queue of mpdu in a ppdu + * @mpdus: MPDU list based on enqueue sequence bitmap + * @pending_retries: pending MPDUs (retries) + * @tlv_bitmap: per user tlv bitmap + * @skip: tx capture skip flag */ struct cdp_tx_completion_ppdu_user { uint32_t completion_status:8, @@ -1620,7 +1630,8 @@ struct cdp_tx_completion_ppdu_user { gi:4, dcm:1, ldpc:1, - delayed_ba:1; + delayed_ba:1, + ack_ba_tlv:1; uint32_t ba_seq_no; uint32_t ba_bitmap[CDP_BA_256_BIT_MAP_SIZE_DWORDS]; uint32_t start_seq; @@ -1669,6 +1680,12 @@ struct cdp_tx_completion_ppdu_user { */ uint32_t current_rate_per; uint32_t last_enq_seq; + + qdf_nbuf_queue_t mpdu_q; + qdf_nbuf_t *mpdus; + uint32_t pending_retries; + uint32_t tlv_bitmap; + bool skip; }; /** @@ -1713,6 +1730,7 @@ struct cdp_tx_completion_ppdu_user { * @long_retries: long retries * @short_retries: short retries * @completion_status: completion status - OK/Filter/Abort/Timeout + * @usr_idx: user index */ struct cdp_tx_indication_mpdu_info { uint32_t ppdu_id; @@ -1750,6 +1768,7 @@ struct cdp_tx_indication_mpdu_info { mprot_type:3, rts_success:1, rts_failure:1; + uint8_t usr_idx; }; /** @@ -1786,7 +1805,6 @@ struct cdp_tx_mgmt_comp_info { * @vdev_id: VAP Id * @bar_num_users: BA response user count, based on completion common TLV * @num_users: Number of users - * @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 @@ -1813,12 +1831,12 @@ struct cdp_tx_mgmt_comp_info { * @doppler: value for doppler (will be 0 most of the times) * @spatial_reuse: value for spatial reuse used in radiotap HE header * @user: per-User stats (array of per-user structures) - * @mpdu_q: queue of mpdu in a ppdu - * @mpdus: MPDU list based on enqueue sequence bitmap * @bar_ppdu_id: BAR ppdu_id * @bar_tx_duration: BAR tx duration * @bar_ppdu_start_timestamp: BAR start timestamp * @bar_ppdu_end_timestamp: BAR end timestamp + * @tlv_bitmap: tlv_bitmap for the PPDU + * @sched_cmdid: schedule command id */ struct cdp_tx_completion_ppdu { uint32_t ppdu_id; @@ -1827,7 +1845,6 @@ struct cdp_tx_completion_ppdu { uint16_t bar_num_users; uint32_t num_users; uint8_t last_usr_index; - uint32_t pending_retries; uint32_t drop_reason; uint32_t is_flush:1, flow_type:8, @@ -1854,12 +1871,12 @@ struct cdp_tx_completion_ppdu { uint8_t doppler; uint8_t spatial_reuse; struct cdp_tx_completion_ppdu_user user[CDP_MU_MAX_USERS]; - qdf_nbuf_queue_t mpdu_q; - qdf_nbuf_t *mpdus; uint32_t bar_ppdu_id; uint32_t bar_tx_duration; uint32_t bar_ppdu_start_timestamp; uint32_t bar_ppdu_end_timestamp; + uint32_t tlv_bitmap; + uint16_t sched_cmdid; }; /** diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index f8b78536ce..e834bc1193 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -1665,6 +1665,9 @@ struct cdp_cfr_rcc_stats { * @nondata_rx_ru_size: UL ofdma non data ru size counter array * @data_rx_ppdu: data rx ppdu counter * @data_user: data user counter array + * @tx_ppdu_proc: stats counter for tx ppdu processed + * @ack_ba_comes_twice: stats counter for ack_ba_comes twice + * @ppdu_drop: stats counter for ppdu_desc drop once threshold reached */ struct cdp_pdev_stats { struct { @@ -1727,6 +1730,10 @@ struct cdp_pdev_stats { struct cdp_tso_stats tso_stats; struct cdp_cfr_rcc_stats rcc; + + uint64_t tx_ppdu_proc; + uint32_t ack_ba_comes_twice; + uint32_t ppdu_drop; }; #ifdef QCA_ENH_V3_STATS_SUPPORT diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index cf5b71b66f..2de18ed5bf 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -73,7 +73,8 @@ dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap) /* * dp_peer_copy_delay_stats() - copy ppdu stats to peer delayed stats. * @peer: Datapath peer handle - * @ppdu: PPDU Descriptor + * @ppdu: User PPDU Descriptor + * @cur_ppdu_id: PPDU_ID * * Return: None * @@ -83,17 +84,21 @@ dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap) * Ack. To populate peer stats we need successful msdu(data frame). * So we hold the Tx data stats on delayed_ba for stats update. */ -static inline void +static void dp_peer_copy_delay_stats(struct dp_peer *peer, - struct cdp_tx_completion_ppdu_user *ppdu) + struct cdp_tx_completion_ppdu_user *ppdu, + uint32_t cur_ppdu_id) { struct dp_pdev *pdev; struct dp_vdev *vdev; + if (!peer->last_delayed_ba_ppduid || !cur_ppdu_id) + return; + if (peer->last_delayed_ba) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "BA not yet recv for prev delayed ppdu[%d]\n", - peer->last_delayed_ba_ppduid); + "BA not yet recv for prev delayed ppdu[%d] - cur ppdu[%d]", + peer->last_delayed_ba_ppduid, cur_ppdu_id); vdev = peer->vdev; if (vdev) { pdev = vdev->pdev; @@ -2197,6 +2202,8 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, start_tag_buf = tag_buf; ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); + ppdu_desc->ppdu_id = ppdu_info->ppdu_id; + tag_buf = start_tag_buf + HTT_GET_STATS_CMN_INDEX(RING_ID_SCH_CMD_ID); ppdu_info->sched_cmdid = HTT_PPDU_STATS_COMMON_TLV_SCH_CMDID_GET(*tag_buf); @@ -2209,6 +2216,8 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, frame_ctrl = ppdu_desc->frame_ctrl; + ppdu_desc->bar_ppdu_id = ppdu_info->ppdu_id; + switch (frame_type) { case HTT_STATS_FTYPE_TIDQ_DATA_SU: case HTT_STATS_FTYPE_TIDQ_DATA_MU: @@ -2225,7 +2234,6 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, case HTT_STATS_FTYPE_SGEN_MU_BAR: case HTT_STATS_FTYPE_SGEN_BAR: ppdu_desc->frame_type = CDP_PPDU_FTYPE_BAR; - ppdu_desc->bar_ppdu_id = ppdu_info->ppdu_id; break; default: ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL; @@ -2308,6 +2316,7 @@ static void dp_process_ppdu_stats_user_common_tlv( uint8_t curr_user_index = 0; struct dp_peer *peer; struct dp_vdev *vdev; + uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -2319,6 +2328,7 @@ static void dp_process_ppdu_stats_user_common_tlv( dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info); ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); ppdu_desc->vdev_id = HTT_PPDU_STATS_USER_COMMON_TLV_VAP_ID_GET(*tag_buf); @@ -2414,6 +2424,7 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev, struct cdp_tx_completion_ppdu_user *ppdu_user_desc; uint8_t curr_user_index = 0; struct dp_vdev *vdev; + uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -2424,6 +2435,7 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev, dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info); ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); if (peer_id == DP_SCAN_PEER_ID) { vdev = dp_get_vdev_from_soc_vdev_id_wifi3(pdev->soc, @@ -2513,6 +2525,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv( uint16_t peer_id; struct dp_peer *peer; uint32_t size = CDP_BA_64_BIT_MAP_SIZE_DWORDS; + uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -2528,6 +2541,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_64_tlv( curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info); ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); ppdu_desc->vdev_id = peer->vdev->vdev_id; qdf_mem_copy(ppdu_user_desc->mac_addr, peer->mac_addr.raw, QDF_MAC_ADDR_SIZE); @@ -2566,6 +2580,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv( uint16_t peer_id; struct dp_peer *peer; uint32_t size = CDP_BA_256_BIT_MAP_SIZE_DWORDS; + uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -2580,6 +2595,7 @@ static void dp_process_ppdu_stats_enq_mpdu_bitmap_256_tlv( curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info); ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); ppdu_desc->vdev_id = peer->vdev->vdev_id; qdf_mem_copy(ppdu_user_desc->mac_addr, peer->mac_addr.raw, QDF_MAC_ADDR_SIZE); @@ -2617,6 +2633,7 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv( uint8_t bw_iter; htt_ppdu_stats_user_cmpltn_common_tlv *dp_stats_buf = (htt_ppdu_stats_user_cmpltn_common_tlv *)tag_buf; + uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -2630,6 +2647,7 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv( curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info); ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); ppdu_desc->last_usr_index = curr_user_index; ppdu_desc->vdev_id = peer->vdev->vdev_id; qdf_mem_copy(ppdu_user_desc->mac_addr, @@ -2687,10 +2705,10 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv( HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_GET(*tag_buf); /* - * increase successful mpdu counter from - * htt_ppdu_stats_user_cmpltn_common_tlv + * on mpdu success, increase compltn_common_tlv counter */ - ppdu_info->mpdu_compltn_common_tlv += ppdu_user_desc->mpdu_success; + if (ppdu_user_desc->mpdu_success) + ppdu_info->compltn_common_tlv++; /* * MU BAR may send request to n users but we may received ack only from @@ -2749,6 +2767,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv( uint8_t curr_user_index = 0; uint16_t peer_id; struct dp_peer *peer; + uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -2764,6 +2783,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_64_tlv( curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info); ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); ppdu_desc->vdev_id = peer->vdev->vdev_id; qdf_mem_copy(ppdu_user_desc->mac_addr, peer->mac_addr.raw, QDF_MAC_ADDR_SIZE); @@ -2796,6 +2816,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv( uint8_t curr_user_index = 0; uint16_t peer_id; struct dp_peer *peer; + uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -2811,6 +2832,7 @@ static void dp_process_ppdu_stats_user_compltn_ba_bitmap_256_tlv( curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info); ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); ppdu_desc->vdev_id = peer->vdev->vdev_id; qdf_mem_copy(ppdu_user_desc->mac_addr, peer->mac_addr.raw, QDF_MAC_ADDR_SIZE); @@ -2841,6 +2863,7 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv( struct cdp_tx_completion_ppdu *ppdu_desc; struct cdp_tx_completion_ppdu_user *ppdu_user_desc; uint8_t curr_user_index = 0; + uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -2854,6 +2877,15 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv( curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info); ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); + if (!ppdu_user_desc->ack_ba_tlv) { + ppdu_user_desc->ack_ba_tlv = 1; + } else { + pdev->stats.ack_ba_comes_twice++; + dp_peer_unref_del_find_by_id(peer); + return; + } + ppdu_desc->vdev_id = peer->vdev->vdev_id; qdf_mem_copy(ppdu_user_desc->mac_addr, peer->mac_addr.raw, QDF_MAC_ADDR_SIZE); @@ -2878,8 +2910,9 @@ static void dp_process_ppdu_stats_user_compltn_ack_ba_status_tlv( tag_buf++; ppdu_user_desc->success_bytes = *tag_buf; - /* increase successful mpdu counter */ - ppdu_info->mpdu_ack_ba_tlv += ppdu_user_desc->num_mpdu; + /* increase ack ba tlv counter on successful mpdu */ + if (ppdu_user_desc->num_mpdu) + ppdu_info->ack_ba_tlv++; if (ppdu_user_desc->ba_size == 0) { ppdu_user_desc->ba_seq_no = ppdu_user_desc->start_seq; @@ -2906,6 +2939,7 @@ static void dp_process_ppdu_stats_user_common_array_tlv( struct cdp_tx_completion_ppdu_user *ppdu_user_desc; uint8_t curr_user_index = 0; struct htt_tx_ppdu_stats_info *dp_stats_buf; + uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(ppdu_info->nbuf); @@ -2924,6 +2958,7 @@ static void dp_process_ppdu_stats_user_common_array_tlv( curr_user_index = dp_get_ppdu_info_user_index(pdev, peer_id, ppdu_info); ppdu_user_desc = &ppdu_desc->user[curr_user_index]; + ppdu_user_desc->tlv_bitmap |= (1 << tlv_type); ppdu_user_desc->retry_bytes = dp_stats_buf->tx_retry_bytes; ppdu_user_desc->failed_bytes = dp_stats_buf->tx_failed_bytes; @@ -2974,6 +3009,7 @@ dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev, 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->num_users = 1; ppdu_desc->user[0].peer_id = peer_id; ppdu_desc->user[0].tid = tid; @@ -3245,8 +3281,8 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, ppdu_desc = (struct cdp_tx_completion_ppdu *) qdf_nbuf_data(ppdu_info->nbuf); - ppdu_desc->num_users = ppdu_info->last_user; - ppdu_desc->ppdu_id = ppdu_info->ppdu_id; + if (ppdu_desc->frame_type != CDP_PPDU_FTYPE_BAR) + ppdu_desc->ppdu_id = ppdu_info->ppdu_id; tlv_bitmap_expected = HTT_PPDU_DEFAULT_TLV_BITMAP; if (pdev->tx_sniffer_enable || pdev->mcopy_mode || @@ -3289,12 +3325,12 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, * Since ACK_BA_STATUS TLV come from Hardware it is * asynchronous So we need to depend on some tlv to confirm * all tlv is received for a ppdu. - * So we depend on both HTT_PPDU_STATS_COMMON_TLV and + * So we depend on both SCHED_CMD_STATUS_TLV and * ACK_BA_STATUS_TLV. for failure packet we won't get * ACK_BA_STATUS_TLV. */ if (!(ppdu_info->tlv_bitmap & - (1 << HTT_PPDU_STATS_COMMON_TLV)) || + (1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV)) || (!(ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV)) && (ppdu_desc->user[i].completion_status == @@ -3311,7 +3347,9 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, if ((ppdu_desc->user[i].tid < CDP_DATA_TID_MAX || (ppdu_desc->user[i].tid == CDP_DATA_NON_QOS_TID) || (ppdu_desc->htt_frame_type == - HTT_STATS_FTYPE_SGEN_QOS_NULL)) && + HTT_STATS_FTYPE_SGEN_QOS_NULL) || + ((ppdu_desc->frame_type == CDP_PPDU_FTYPE_BAR) && + (ppdu_desc->num_mpdu > 1))) && (ppdu_desc->frame_type != CDP_PPDU_FTYPE_CTRL)) { dp_tx_stats_update(pdev, peer, @@ -3451,7 +3489,13 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id, */ if (pdev->list_depth > HTT_PPDU_DESC_MAX_DEPTH) { ppdu_info = TAILQ_FIRST(&pdev->ppdu_info_list); - dp_ppdu_desc_deliver(pdev, ppdu_info); + TAILQ_REMOVE(&pdev->ppdu_info_list, + ppdu_info, ppdu_info_list_elem); + pdev->list_depth--; + pdev->stats.ppdu_drop++; + qdf_nbuf_free(ppdu_info->nbuf); + ppdu_info->nbuf = NULL; + qdf_mem_free(ppdu_info); } /* @@ -3601,9 +3645,13 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, } if (ppdu_desc->frame_type == CDP_PPDU_FTYPE_DATA && - (ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_COMMON_TLV)) && + (ppdu_info->tlv_bitmap & + (1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV)) && ppdu_desc->delayed_ba) { for (i = 0; i < ppdu_desc->num_users; i++) { + struct cdp_delayed_tx_completion_ppdu_user *delay_ppdu; + uint64_t start_tsf; + uint64_t end_tsf; uint32_t ppdu_id; ppdu_id = ppdu_desc->ppdu_id; @@ -3616,13 +3664,19 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, if (!peer) continue; + delay_ppdu = &peer->delayed_ba_ppdu_stats; + start_tsf = ppdu_desc->ppdu_start_timestamp; + end_tsf = ppdu_desc->ppdu_end_timestamp; /** * save delayed ba user info */ if (ppdu_desc->user[i].delayed_ba) { dp_peer_copy_delay_stats(peer, - &ppdu_desc->user[i]); + &ppdu_desc->user[i], + ppdu_id); peer->last_delayed_ba_ppduid = ppdu_id; + delay_ppdu->ppdu_start_timestamp = start_tsf; + delay_ppdu->ppdu_end_timestamp = end_tsf; } dp_peer_unref_del_find_by_id(peer); } @@ -3633,8 +3687,12 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, * copy the store peer delayed info to BAR status */ if (ppdu_desc->frame_type == CDP_PPDU_FTYPE_BAR && - (ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_COMMON_TLV))) { + (ppdu_info->tlv_bitmap & + (1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV))) { for (i = 0; i < ppdu_desc->bar_num_users; i++) { + struct cdp_delayed_tx_completion_ppdu_user *delay_ppdu; + uint64_t start_tsf; + uint64_t end_tsf; peer = dp_peer_find_by_id(pdev->soc, ppdu_desc->user[i].peer_id); /** @@ -3644,12 +3702,17 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, if (!peer) continue; + delay_ppdu = &peer->delayed_ba_ppdu_stats; + start_tsf = delay_ppdu->ppdu_start_timestamp; + end_tsf = delay_ppdu->ppdu_end_timestamp; + if (peer->last_delayed_ba) { dp_peer_copy_stats_to_bar(peer, &ppdu_desc->user[i]); - ppdu_desc->bar_ppdu_id = ppdu_desc->ppdu_id; ppdu_desc->ppdu_id = peer->last_delayed_ba_ppduid; + ppdu_desc->ppdu_start_timestamp = start_tsf; + ppdu_desc->ppdu_end_timestamp = end_tsf; } dp_peer_unref_del_find_by_id(peer); } @@ -3670,8 +3733,7 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, /* * successful mpdu count should match with both tlv */ - if (ppdu_info->mpdu_compltn_common_tlv != - ppdu_info->mpdu_ack_ba_tlv) + if (ppdu_info->compltn_common_tlv != ppdu_info->ack_ba_tlv) return NULL; } @@ -3679,12 +3741,13 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, * Once all the TLVs for a given PPDU has been processed, * return PPDU status to be delivered to higher layer. * 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 SCHED CMD STATS TLV is the last TLV from the FW for a ppdu. * apart from ACK BA TLV, FW sends other TLV in sequential order. * flush tlv comes separate. */ if ((ppdu_info->tlv_bitmap != 0 && - (ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_COMMON_TLV))) || + (ppdu_info->tlv_bitmap & + (1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV))) || (ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV))) return ppdu_info; diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 5544457854..d8e8638977 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -1606,6 +1606,8 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc, if (dp_peer_find_add_id_to_obj(peer, peer_id)) { /* TBDXXX: assert for now */ QDF_ASSERT(0); + } else { + dp_peer_tid_peer_id_update(peer, peer->peer_ids[0]); } return peer; @@ -2478,37 +2480,6 @@ static void dp_peer_setup_remaining_tids(struct dp_peer *peer) static void dp_peer_setup_remaining_tids(struct dp_peer *peer) {}; #endif -#ifndef WLAN_TX_PKT_CAPTURE_ENH -/* - * dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID - * @peer: Datapath peer - * - */ -static inline void dp_peer_tid_queue_init(struct dp_peer *peer) -{ -} - -/* - * dp_peer_tid_queue_cleanup() – remove ppdu stats queue per TID - * @peer: Datapath peer - * - */ -static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer) -{ -} - -/* - * dp_peer_update_80211_hdr() – dp peer update 80211 hdr - * @vdev: Datapath vdev - * @peer: Datapath peer - * - */ -static inline void -dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer) -{ -} -#endif - /* * dp_peer_tx_init() – Initialize receive TID state * @pdev: Datapath pdev diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index 8b45bbb6c4..d10a59cbe1 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -340,4 +340,47 @@ dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc, void dp_rx_tid_delete_cb(struct dp_soc *soc, void *cb_ctxt, union hal_reo_status *reo_status); + +#ifndef WLAN_TX_PKT_CAPTURE_ENH +/** + * dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID + * @peer: Datapath peer + * + */ +static inline void dp_peer_tid_queue_init(struct dp_peer *peer) +{ +} + +/** + * dp_peer_tid_peer_id_update() – update peer_id to tid structure + * @peer: Datapath peer + * @peer_id: peer_id + * + */ +static inline +void dp_peer_tid_peer_id_update(struct dp_peer *peer, uint16_t peer_id) +{ +} + +/** + * dp_peer_tid_queue_cleanup() – remove ppdu stats queue per TID + * @peer: Datapath peer + * + */ +static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer) +{ +} + +/** + * dp_peer_update_80211_hdr() – dp peer update 80211 hdr + * @vdev: Datapath vdev + * @peer: Datapath peer + * + */ +static inline void +dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer) +{ +} +#endif + #endif /* _DP_PEER_H_ */ diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 770a3ab64c..670ebf4b12 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -5822,8 +5822,12 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev) } DP_PRINT_STATS("BA not received for delayed_ba: %d", pdev->stats.cdp_delayed_ba_not_recev); - DP_PRINT_STATS("tx_ppdu_proc: %llu\n", - pdev->tx_ppdu_proc); + DP_PRINT_STATS("tx_ppdu_proc: %llu", + pdev->stats.tx_ppdu_proc); + DP_PRINT_STATS("ack ba comes twice: %llu", + pdev->stats.ack_ba_comes_twice); + DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu", + pdev->stats.ppdu_drop); for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) { if (!pdev->stats.wdi_event[i]) diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 6d036d80bf..eb2d256d05 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1409,18 +1409,18 @@ struct dp_neighbour_peer { /** * struct ppdu_info - PPDU Status info descriptor - * @ppdu_id - Unique ppduid assigned by firmware for every tx packet - * @sched_cmdid - schedule command id, which will be same in a burst - * @max_ppdu_id - wrap around for ppdu id - * @last_tlv_cnt - Keep track for missing ppdu tlvs - * @last_user - last ppdu processed for user - * @is_ampdu - set if Ampdu aggregate - * @nbuf - ppdu descriptor payload - * @ppdu_desc - ppdu descriptor - * @ppdu_info_list_elem - linked list of ppdu tlvs - * @ppdu_info_queue_elem - Singly linked list (queue) of ppdu tlvs - * @mpdu_compltn_common_tlv - Successful MPDU counter from COMPLTN COMMON tlv - * @mpdu_ack_ba_tlv - Successful MPDU from ACK BA tlv + * @ppdu_id: Unique ppduid assigned by firmware for every tx packet + * @sched_cmdid: schedule command id, which will be same in a burst + * @max_ppdu_id: wrap around for ppdu id + * @last_tlv_cnt: Keep track for missing ppdu tlvs + * @last_user: last ppdu processed for user + * @is_ampdu: set if Ampdu aggregate + * @nbuf: ppdu descriptor payload + * @ppdu_desc: ppdu descriptor + * @ppdu_info_list_elem: linked list of ppdu tlvs + * @ppdu_info_queue_elem: Singly linked list (queue) of ppdu tlvs + * @mpdu_compltn_common_tlv: Successful tlv counter from COMPLTN COMMON tlv + * @mpdu_ack_ba_tlv: Successful tlv counter from ACK BA tlv */ struct ppdu_info { uint32_t ppdu_id; @@ -1442,8 +1442,8 @@ struct ppdu_info { #else TAILQ_ENTRY(ppdu_info) ppdu_info_list_elem; #endif - uint16_t mpdu_compltn_common_tlv; - uint16_t mpdu_ack_ba_tlv; + uint8_t compltn_common_tlv; + uint8_t ack_ba_tlv; }; /** @@ -1840,8 +1840,6 @@ struct dp_pdev { /* tx packet capture enhancement */ enum cdp_tx_enh_capture_mode tx_capture_enabled; struct dp_pdev_tx_capture tx_capture; - /* stats counter for tx ppdu processed */ - uint64_t tx_ppdu_proc; uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/ diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index e29f47f632..223d4987eb 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -3614,7 +3614,7 @@ static void set_default_trace_levels(struct category_info *cinfo) [QDF_MODULE_ID_CMN_MLME] = QDF_TRACE_LEVEL_INFO, [QDF_MODULE_ID_BSSCOLOR] = QDF_TRACE_LEVEL_ERROR, [QDF_MODULE_ID_CFR] = QDF_TRACE_LEVEL_ERROR, - [QDF_MODULE_ID_TX_CAPTURE] = QDF_TRACE_LEVEL_NONE, + [QDF_MODULE_ID_TX_CAPTURE] = QDF_TRACE_LEVEL_FATAL, [QDF_MODULE_ID_INTEROP_ISSUES_AP] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_BLACKLIST_MGR] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_QLD] = QDF_TRACE_LEVEL_ERROR,