diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index defebd0ff5..e92ddbf77d 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -767,6 +767,8 @@ struct cdp_tx_stats { uint32_t non_amsdu_cnt; /* Number of MSDUs part of AMSDU*/ uint32_t amsdu_cnt; + /* Tx Rate */ + uint32_t tx_rate; /* RSSI of last packet */ uint32_t last_ack_rssi; @@ -783,6 +785,9 @@ struct cdp_tx_stats { /* Packet Count for different bandwidths */ uint32_t bw[MAX_BW]; + /* Excess Retry Count */ + uint32_t excess_retries[WME_AC_MAX]; + /* Wireless Multimedia type Count */ uint32_t wme_ac_type[WME_AC_MAX]; @@ -860,6 +865,8 @@ struct cdp_rx_stats { uint32_t bar_recv_cnt; /* RSSI of received signal */ uint32_t rssi; + /*Rx rate */ + uint32_t rx_rate; }; /* Tx ingress Stats */ @@ -1074,8 +1081,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 + * @tx_rate: Transmission Rate */ struct cdp_tx_completion_ppdu_user { uint32_t completion_status:8, @@ -1119,6 +1126,7 @@ struct cdp_tx_completion_ppdu_user { uint32_t tx_duration; uint16_t ru_tones; bool is_mcast; + uint32_t tx_rate; }; /** @@ -1131,6 +1139,7 @@ struct cdp_tx_completion_ppdu_user { * @num_msdu: Number of MSDUs in PPDU * @channel: Channel informartion * @ack_rssi: RSSI value of last ack packet (units=dB above noise floor) + * @tx_duration: PPDU airtime * @ppdu_start_timestamp: TSF at PPDU start * @ppdu_end_timestamp: TSF at PPDU end * @ack_timestamp: TSF at the reception of ACK @@ -1146,6 +1155,7 @@ struct cdp_tx_completion_ppdu { uint16_t channel; uint16_t phy_mode; uint32_t ack_rssi; + uint32_t tx_duration; uint32_t ppdu_start_timestamp; uint32_t ppdu_end_timestamp; uint32_t ack_timestamp; diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index c4cb061e81..45bfa0bbcc 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -74,16 +74,28 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer, return; DP_STATS_INC_PKT(peer, tx.comp_pkt, - num_msdu, ppdu->success_bytes); + num_msdu, (ppdu->success_bytes + + ppdu->retry_bytes + ppdu->failed_bytes)); DP_STATS_INC(peer, tx.tx_failed, ppdu->failed_msdus); - DP_STATS_INC(peer, tx.sgi_count[ppdu->gi], 1); - DP_STATS_INC(peer, tx.bw[ppdu->bw], 1); + DP_STATS_UPD(peer, tx.tx_rate, ppdu->tx_rate); + DP_STATS_INC(peer, tx.sgi_count[ppdu->gi], num_msdu); + DP_STATS_INC(peer, tx.bw[ppdu->bw], num_msdu); DP_STATS_UPD(peer, tx.last_ack_rssi, ack_rssi); - DP_STATS_INC(peer, tx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], 1); - DP_STATS_INC(peer, tx.stbc, ppdu->stbc); - DP_STATS_INC(peer, tx.ldpc, ppdu->ldpc); + DP_STATS_INC(peer, tx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], num_msdu); + DP_STATS_INCC(peer, tx.stbc, num_msdu, ppdu->stbc); + DP_STATS_INCC(peer, tx.ldpc, num_msdu, ppdu->ldpc); DP_STATS_INC_PKT(peer, tx.tx_success, ppdu->success_msdus, ppdu->success_bytes); + if (ppdu->is_mcast) { + DP_STATS_INC_PKT(peer, tx.mcast, num_msdu, (ppdu->success_bytes + + ppdu->retry_bytes + + ppdu->failed_bytes)); + } else { + DP_STATS_INC_PKT(peer, tx.ucast, num_msdu, (ppdu->success_bytes + + ppdu->retry_bytes + + ppdu->failed_bytes)); + } + DP_STATS_INC(peer, tx.retries, (ppdu->long_retries + ppdu->short_retries)); DP_STATS_INCC(peer, @@ -1381,9 +1393,13 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, else ppdu_desc->frame_type = CDP_PPDU_FTYPE_CTRL; - ppdu_desc->ppdu_start_timestamp = dp_stats_buf->ppdu_start_tstmp_us; - ppdu_desc->ppdu_end_timestamp = dp_stats_buf->ppdu_sch_end_tstmp_us; - tag_buf += 6; + tag_buf += 2; + ppdu_desc->tx_duration = *tag_buf; + tag_buf += 3; + ppdu_desc->ppdu_start_timestamp = *tag_buf; + ppdu_desc->ppdu_end_timestamp = 0; /*TODO: value to be provided by FW */ + tag_buf++; + freq = HTT_PPDU_STATS_COMMON_TLV_CHAN_MHZ_GET(*tag_buf); if (freq != ppdu_desc->channel) { soc = pdev->soc; @@ -1392,6 +1408,7 @@ static void dp_process_ppdu_stats_common_tlv(struct dp_pdev *pdev, pdev->operating_channel = soc->cdp_soc.ol_ops->freq_to_channel(pdev->osif_pdev, freq); } + ppdu_desc->phy_mode = HTT_PPDU_STATS_COMMON_TLV_PHY_MODE_GET(*tag_buf); } @@ -1493,6 +1510,7 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev, HTT_PPDU_STATS_USER_RATE_TLV_PPDU_TYPE_GET(*tag_buf); tag_buf++; + ppdu_user_desc->tx_rate = *tag_buf; ppdu_user_desc->ltf_size = HTT_PPDU_STATS_USER_RATE_TLV_LTF_SIZE_GET(*tag_buf); @@ -1656,6 +1674,8 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv( ppdu_user_desc->short_retries = HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_SHORT_RETRY_GET(*tag_buf); + ppdu_user_desc->retry_msdus = + ppdu_user_desc->long_retries + ppdu_user_desc->short_retries; ppdu_user_desc->is_ampdu = HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_IS_AMPDU_GET(*tag_buf); @@ -1786,6 +1806,12 @@ 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); + + ppdu_user_desc->success_msdus = ppdu_user_desc->num_msdu; + + tag_buf += 2; + ppdu_user_desc->success_bytes = *tag_buf; + } /* @@ -1809,9 +1835,9 @@ static void dp_process_ppdu_stats_user_common_array_tlv(struct dp_pdev *pdev, ppdu_desc = (struct cdp_tx_completion_ppdu *)qdf_nbuf_data(pdev->tx_ppdu_info.buf); - tag_buf += 2; + tag_buf++; dp_stats_buf = (struct htt_tx_ppdu_stats_info *)tag_buf; - tag_buf += 4; + tag_buf += 3; peer_id = HTT_PPDU_STATS_ARRAY_ITEM_TLV_PEERID_GET(*tag_buf); @@ -1827,11 +1853,11 @@ static void dp_process_ppdu_stats_user_common_array_tlv(struct dp_pdev *pdev, 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 = @@ -1839,8 +1865,45 @@ static void dp_process_ppdu_stats_user_common_array_tlv(struct dp_pdev *pdev, 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_stats_flush_tlv: Process + * htt_ppdu_stats_flush_tlv + * @pdev: DP PDEV handle + * @tag_buf: buffer containing the htt_ppdu_stats_flush_tlv + * + * return:void + */ +static void dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev, + uint32_t *tag_buf) +{ + uint32_t peer_id; + uint32_t drop_reason; + uint8_t tid; + uint32_t num_msdu; + struct dp_peer *peer; + + tag_buf++; + drop_reason = *tag_buf; + + tag_buf++; + num_msdu = HTT_PPDU_STATS_FLUSH_TLV_NUM_MSDU_GET(*tag_buf); + + tag_buf++; + peer_id = + HTT_PPDU_STATS_FLUSH_TLV_SW_PEER_ID_GET(*tag_buf); + + peer = dp_peer_find_by_id(pdev->soc, peer_id); + if (!peer) + return; + + tid = HTT_PPDU_STATS_FLUSH_TLV_TID_NUM_GET(*tag_buf); + + if (drop_reason == HTT_FLUSH_EXCESS_RETRIES) { + DP_STATS_INC(peer, tx.excess_retries[TID_TO_WME_AC(tid)], + num_msdu); + } } /* @@ -1890,7 +1953,6 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf, uint32_t tlv_len) { uint32_t tlv_type = HTT_STATS_TLV_TAG_GET(*tag_buf); - switch (tlv_type) { case HTT_PPDU_STATS_COMMON_TLV: dp_process_ppdu_stats_common_tlv(pdev, tag_buf); @@ -1928,6 +1990,10 @@ static void dp_process_ppdu_tag(struct dp_pdev *pdev, uint32_t *tag_buf, dp_process_ppdu_stats_user_common_array_tlv(pdev, tag_buf); break; + case HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV: + dp_process_ppdu_stats_user_compltn_flush_tlv(pdev, + tag_buf); + break; case HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV: dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(pdev, tag_buf, tlv_len); @@ -1955,16 +2021,11 @@ static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev, ppdu_id = HTT_T2H_PPDU_STATS_PPDU_ID_GET(*msg_word); msg_word = msg_word + 3; - while (length > 0) { tlv_buf = (uint8_t *)msg_word; tlv_type = HTT_STATS_TLV_TAG_GET(*msg_word); tlv_length = HTT_STATS_TLV_LENGTH_GET(*msg_word); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "HTT PPDU Tag %d, Length %d", tlv_type, - tlv_length); - if (tlv_length == 0) break; @@ -1974,10 +2035,10 @@ static QDF_STATUS dp_htt_process_tlv(struct dp_pdev *pdev, tlv_length += HTT_TLV_HDR_LEN; dp_process_ppdu_tag(pdev, msg_word, tlv_length); + msg_word = (uint32_t *)((uint8_t *)tlv_buf + tlv_length); length -= (tlv_length); } - return status; } #endif /* FEATURE_PERPKT_INFO */ diff --git a/dp/wifi3.0/dp_rx_mon_dest.c b/dp/wifi3.0/dp_rx_mon_dest.c index 931d010ad6..abc4b8f8fe 100644 --- a/dp/wifi3.0/dp_rx_mon_dest.c +++ b/dp/wifi3.0/dp_rx_mon_dest.c @@ -341,7 +341,6 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc, /* The nbuf has been pulled just beyond the status and points to the * payload */ - msdu_orig = head_msdu; rx_desc = qdf_nbuf_data(msdu_orig); diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index ff3b5ed828..5997042791 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -123,28 +123,29 @@ static void dp_rx_stats_update(struct dp_soc *soc, struct dp_peer *peer, if (soc->process_rx_status) return; DP_STATS_UPD(peer, rx.rssi, ppdu->rssi); - DP_STATS_INC(peer, rx.sgi_count[ppdu->u.gi], 1); + DP_STATS_INC(peer, rx.sgi_count[ppdu->u.gi], num_msdu); DP_STATS_INC(peer, rx.bw[ppdu->u.bw], num_msdu); - DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ppdu->is_ampdu); - DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ppdu->is_ampdu)); + DP_STATS_INCC(peer, rx.ampdu_cnt, num_msdu, ppdu->is_ampdu); + DP_STATS_INCC(peer, rx.non_ampdu_cnt, num_msdu, !(ppdu->is_ampdu)); + DP_STATS_UPD(peer, rx.rx_rate, mcs); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_A))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, - ((mcs < MAX_MCS_11A) && (preamble == DOT11_A))); + ((mcs < MAX_MCS_11A) && (preamble == DOT11_A))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, ((mcs >= MAX_MCS_11B) && (preamble == DOT11_B))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, - ((mcs < MAX_MCS_11B) && (preamble == DOT11_B))); + ((mcs < MAX_MCS_11B) && (preamble == DOT11_B))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_N))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, - ((mcs < MAX_MCS_11A) && (preamble == DOT11_N))); + ((mcs < MAX_MCS_11A) && (preamble == DOT11_N))); DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, ((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC))); @@ -157,7 +158,7 @@ static void dp_rx_stats_update(struct dp_soc *soc, struct dp_peer *peer, DP_STATS_INCC(peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX))); - DP_STATS_INC(peer, rx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], 1); + DP_STATS_INC(peer, rx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], num_msdu); if (soc->cdp_soc.ol_ops->update_dp_stats) { soc->cdp_soc.ol_ops->update_dp_stats(pdev->osif_pdev, diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index cdf42b5773..9a6943783a 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -2329,10 +2329,7 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc, peer = dp_peer_find_by_id(soc, ts.peer_id); length = qdf_nbuf_len(desc->nbuf); - /* Process Tx status in descriptor */ - if (soc->process_tx_status || - (desc->vdev && desc->vdev->mesh_vdev)) - dp_tx_comp_process_tx_status(desc, length); + dp_tx_comp_process_tx_status(desc, length); dp_tx_comp_free_buf(soc, desc); @@ -2464,7 +2461,7 @@ uint32_t dp_tx_comp_handler(struct dp_soc *soc, void *hal_srng, uint32_t quota) /* Collect hw completion contents */ hal_tx_comp_desc_sync(tx_comp_hal_desc, - &tx_desc->comp, soc->process_tx_status); + &tx_desc->comp, 1); } diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 04f6ef5053..1be0e04beb 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -49,6 +49,7 @@ #include "hal_rx.h" #define MAX_BW 4 +#define MAX_RETRIES 4 #define MAX_RECEPTION_TYPES 4 #define REPT_MU_MIMO 1 #define REPT_MU_OFDMA_MIMO 3