diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 197ece62d0..582b865314 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -52,7 +52,7 @@ #define MAX_MCS (12 + 1) #define MAX_MCS_11A 8 #define MAX_MCS_11B 7 -#define MAX_MCS_11AC 10 +#define MAX_MCS_11AC 12 /* 1 additional GI is for invalid values */ #define MAX_GI (4 + 1) #define SS_COUNT 8 @@ -849,6 +849,8 @@ struct cdp_rx_stats { uint32_t amsdu_cnt; /* Number of bar received */ uint32_t bar_recv_cnt; + /* RSSI of received signal */ + uint32_t rssi; }; /* Tx ingress Stats */ @@ -1199,7 +1201,11 @@ struct cdp_tx_completion_msdu { * @ppdu_id: PPDU Id * @is_ampdu: mpdu aggregate or non-aggregate? * @num_mpdu: Number of MPDUs in PPDU + * @reserved: Reserved bits for future use * @num_msdu: Number of MSDUs in PPDU + * @udp_msdu_count: Number of UDP MSDUs in PPDU + * @tcp_msdu_count: Number of TCP MSDUs in PPDU + * @other_msdu_count: Number of MSDUs other than UDP and TCP MSDUs in PPDU * @duration: PPDU duration * @tid: TID number * @peer_id: Peer ID @@ -1232,9 +1238,13 @@ struct cdp_tx_completion_msdu { */ struct cdp_rx_indication_ppdu { uint32_t ppdu_id; - uint32_t is_ampdu:1, + uint16_t is_ampdu:1, num_mpdu:9, - num_msdu:16; + reserved:6; + uint32_t num_msdu; + uint16_t udp_msdu_count; + uint16_t tcp_msdu_count; + uint16_t other_msdu_count; uint16_t duration; uint32_t tid:8, peer_id:16; diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 50bc87cd63..c206873104 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -60,6 +60,12 @@ 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 = peer->vdev->pdev; + uint8_t preamble, mcs; + uint16_t num_msdu; + + preamble = ppdu->preamble; + mcs = ppdu->mcs; + num_msdu = ppdu->num_msdu; /* If the peer statistics are already processed as part of * per-MSDU completion handler, do not process these again in per-PPDU @@ -68,12 +74,8 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer, return; DP_STATS_INC_PKT(peer, tx.comp_pkt, - (ppdu->success_msdus + ppdu->retry_msdus + - ppdu->failed_msdus), - ppdu->success_bytes); + num_msdu, ppdu->success_bytes); DP_STATS_INC(peer, tx.tx_failed, ppdu->failed_msdus); - DP_STATS_INC(peer, - tx.pkt_type[ppdu->preamble].mcs_count[ppdu->mcs], 1); DP_STATS_INC(peer, tx.sgi_count[ppdu->gi], 1); DP_STATS_INC(peer, tx.bw[ppdu->bw], 1); DP_STATS_UPD(peer, tx.last_ack_rssi, ack_rssi); @@ -84,6 +86,36 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer, ppdu->success_bytes); DP_STATS_INC(peer, tx.retries, (ppdu->long_retries + ppdu->short_retries)); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + ((mcs >= MAX_MCS_11A) && (preamble == DOT11_A))); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[mcs], num_msdu, + ((mcs < MAX_MCS_11A) && (preamble == DOT11_A))); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + ((mcs >= MAX_MCS_11B) && (preamble == DOT11_B))); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[mcs], num_msdu, + ((mcs < (MAX_MCS_11B)) && (preamble == DOT11_B))); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + ((mcs >= MAX_MCS_11A) && (preamble == DOT11_N))); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[mcs], num_msdu, + ((mcs < MAX_MCS_11A) && (preamble == DOT11_N))); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + ((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC))); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[mcs], num_msdu, + ((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC))); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX))); + DP_STATS_INCC(peer, + tx.pkt_type[preamble].mcs_count[mcs], num_msdu, + ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX))); if (soc->cdp_soc.ol_ops->update_dp_stats) { soc->cdp_soc.ol_ops->update_dp_stats(pdev->osif_pdev, @@ -2004,8 +2036,12 @@ static void dp_txrx_ppdu_stats_handler(struct dp_soc *soc, 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); + + if (ppdu_desc->frame_type == CDP_PPDU_FTYPE_DATA) { + dp_tx_stats_update(soc, peer, + &ppdu_desc->user[i], + ppdu_desc->ack_rssi); + } } dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC, soc, diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 3e58402182..c86dcd1af1 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -170,7 +170,7 @@ static const struct dp_rate_debug dp_rate_string[DOT11_MAX][MAX_MCS] = { {"VHT MCS 8 (256-QAM 3/4) ", MCS_VALID}, {"VHT MCS 9 (256-QAM 5/6) ", MCS_VALID}, {"VHT MCS 10 (1024-QAM 3/4)", MCS_VALID}, - {"VHT MCS 10 (1024-QAM 5/6)", MCS_VALID}, + {"VHT MCS 11 (1024-QAM 5/6)", MCS_VALID}, {"INVALID ", MCS_VALID}, }, { @@ -185,7 +185,7 @@ static const struct dp_rate_debug dp_rate_string[DOT11_MAX][MAX_MCS] = { {"HE MCS 8 (256-QAM 3/4) ", MCS_VALID}, {"HE MCS 9 (256-QAM 5/6) ", MCS_VALID}, {"HE MCS 10 (1024-QAM 3/4)", MCS_VALID}, - {"HE MCS 10 (1024-QAM 5/6)", MCS_VALID}, + {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID}, {"INVALID ", MCS_VALID}, } }; diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 9d992628bd..26d61d4c3f 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -913,21 +913,21 @@ dp_rx_process(struct dp_intr *int_ctx, void *hal_ring, uint32_t quota) struct dp_peer *peer = NULL; struct dp_vdev *vdev = NULL; uint32_t pkt_len; - struct hal_rx_mpdu_desc_info mpdu_desc_info; - struct hal_rx_msdu_desc_info msdu_desc_info; + struct hal_rx_mpdu_desc_info mpdu_desc_info = { 0 }; + struct hal_rx_msdu_desc_info msdu_desc_info = { 0 }; enum hal_reo_error_status error; uint32_t peer_mdata; uint8_t *rx_tlv_hdr; uint32_t rx_bufs_reaped[MAX_PDEV_CNT] = { 0 }; uint32_t sgi, mcs, tid, nss, bw, reception_type, pkt_type; - uint8_t mac_id; + uint8_t mac_id = 0; uint32_t ampdu_flag, amsdu_flag; struct dp_pdev *pdev; struct dp_srng *dp_rxdma_srng; struct rx_desc_pool *rx_desc_pool; struct dp_soc *soc = int_ctx->soc; - uint8_t ring_id; - uint8_t core_id; + uint8_t ring_id = 0; + uint8_t core_id = 0; bool is_first_frag = 0; uint16_t mpdu_len = 0; qdf_nbuf_t head_frag_nbuf = NULL; @@ -949,6 +949,7 @@ dp_rx_process(struct dp_intr *int_ctx, void *hal_ring, uint32_t quota) qdf_assert(hal_soc); hif_pm_runtime_mark_last_busy(soc->osdev->dev); + sgi = mcs = tid = nss = bw = reception_type = pkt_type = 0; if (qdf_unlikely(hal_srng_access_start(hal_soc, hal_ring))) { @@ -1200,8 +1201,6 @@ done: qdf_nbuf_set_rx_cksum(nbuf, &cksum); } - sgi = hal_rx_msdu_start_sgi_get(rx_tlv_hdr); - mcs = hal_rx_msdu_start_rate_mcs_get(rx_tlv_hdr); tid = hal_rx_mpdu_start_tid_get(rx_tlv_hdr); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, @@ -1213,15 +1212,12 @@ done: rx_tlv_hdr); nss = hal_rx_msdu_start_nss_get(rx_tlv_hdr); pkt_type = hal_rx_msdu_start_get_pkt_type(rx_tlv_hdr); - - DP_STATS_INC(vdev->pdev, rx.bw[bw], 1); DP_STATS_INC(vdev->pdev, rx.reception_type[reception_type], 1); DP_STATS_INCC(vdev->pdev, rx.nss[nss], 1, ((reception_type == REPT_MU_MIMO) || (reception_type == REPT_MU_OFDMA_MIMO)) ); - DP_STATS_INC(peer, rx.sgi_count[sgi], 1); DP_STATS_INCC(peer, rx.err.mic_err, 1, hal_rx_mpdu_end_mic_err_get( rx_tlv_hdr)); @@ -1231,50 +1227,58 @@ done: DP_STATS_INC(peer, rx.wme_ac_type[TID_TO_WME_AC(tid)], 1); - DP_STATS_INC(peer, rx.bw[bw], 1); DP_STATS_INC(peer, rx.reception_type[reception_type], 1); - - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, - ((mcs >= MAX_MCS_11A) && (pkt_type - == DOT11_A))); - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[mcs], 1, - ((mcs <= MAX_MCS_11A) && (pkt_type - == DOT11_A))); - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, - ((mcs >= MAX_MCS_11B) - && (pkt_type == DOT11_B))); - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[mcs], 1, - ((mcs <= MAX_MCS_11B) - && (pkt_type == DOT11_B))); - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, - ((mcs >= MAX_MCS_11A) - && (pkt_type == DOT11_N))); - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[mcs], 1, - ((mcs <= MAX_MCS_11A) - && (pkt_type == DOT11_N))); - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, - ((mcs >= MAX_MCS_11AC) - && (pkt_type == DOT11_AC))); - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[mcs], 1, - ((mcs <= MAX_MCS_11AC) - && (pkt_type == DOT11_AC))); - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[MAX_MCS], 1, - ((mcs >= (MAX_MCS-1)) - && (pkt_type == DOT11_AX))); - DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. - mcs_count[mcs], 1, - ((mcs <= (MAX_MCS-1)) - && (pkt_type == DOT11_AX))); + if (soc->process_rx_status) { + ampdu_flag = (mpdu_desc_info.mpdu_flags & + HAL_MPDU_F_AMPDU_FLAG); + sgi = hal_rx_msdu_start_sgi_get(rx_tlv_hdr); + mcs = hal_rx_msdu_start_rate_mcs_get(rx_tlv_hdr); + DP_STATS_INC(peer, rx.bw[bw], 1); + DP_STATS_INC(peer, rx.sgi_count[sgi], 1); + DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag); + DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag)); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[MAX_MCS], 1, + ((mcs >= MAX_MCS_11A) && + (pkt_type == DOT11_A))); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[mcs], 1, + ((mcs < MAX_MCS_11A) && + (pkt_type == DOT11_A))); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[MAX_MCS], 1, + ((mcs >= MAX_MCS_11B) && + (pkt_type == DOT11_B))); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[mcs], 1, + ((mcs < MAX_MCS_11B) && + (pkt_type == DOT11_B))); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[MAX_MCS], 1, + ((mcs >= MAX_MCS_11A) && + (pkt_type == DOT11_N))); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[mcs], 1, + ((mcs < MAX_MCS_11A) && + (pkt_type == DOT11_N))); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[MAX_MCS], 1, + ((mcs >= MAX_MCS_11AC) && + (pkt_type == DOT11_AC))); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[mcs], 1, + ((mcs < MAX_MCS_11AC) && + (pkt_type == DOT11_AC))); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[MAX_MCS], 1, + ((mcs >= (MAX_MCS - 1)) && + (pkt_type == DOT11_AX))); + DP_STATS_INCC(peer, rx.pkt_type[pkt_type]. + mcs_count[mcs], 1, + ((mcs < (MAX_MCS - 1)) && + (pkt_type == DOT11_AX))); + } /* * HW structures call this L3 header padding -- @@ -1449,7 +1453,7 @@ dp_rx_pdev_attach(struct dp_pdev *pdev) qdf_spinlock_create(&soc->rx_desc_mutex[pdev_id]); pdev = soc->pdev_list[pdev_id]; rxdma_srng = pdev->rx_refill_buf_ring; - + soc->process_rx_status = 0; rxdma_entries = rxdma_srng.alloc_size/hal_srng_get_entrysize( soc->hal_soc, RXDMA_BUF); diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index c109ebb8e5..171fbaff5c 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -74,12 +74,18 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_soc *soc, cdp_rx_ppdu->ppdu_id = ppdu_info->com_info.ppdu_id; cdp_rx_ppdu->duration = ppdu_info->rx_status.duration; cdp_rx_ppdu->u.bw = ppdu_info->rx_status.bw; + cdp_rx_ppdu->tcp_msdu_count = ppdu_info->rx_status.tcp_msdu_count; + cdp_rx_ppdu->udp_msdu_count = ppdu_info->rx_status.udp_msdu_count; + cdp_rx_ppdu->other_msdu_count = ppdu_info->rx_status.other_msdu_count; cdp_rx_ppdu->u.nss = ppdu_info->rx_status.nss; cdp_rx_ppdu->u.mcs = ppdu_info->rx_status.mcs; cdp_rx_ppdu->u.preamble = ppdu_info->rx_status.preamble_type; cdp_rx_ppdu->rssi = ppdu_info->rx_status.rssi_comb; cdp_rx_ppdu->timestamp = ppdu_info->com_info.ppdu_timestamp; cdp_rx_ppdu->channel = ppdu_info->rx_status.chan_freq; + cdp_rx_ppdu->num_msdu = (cdp_rx_ppdu->tcp_msdu_count + + cdp_rx_ppdu->udp_msdu_count + + cdp_rx_ppdu->other_msdu_count); } #else static inline void @@ -89,6 +95,77 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_soc *soc, { } #endif +/** + * dp_rx_stats_update() - Update per-peer statistics + * @soc: Datapath SOC handle + * @peer: Datapath peer handle + * @ppdu: PPDU Descriptor + * + * Return: None + */ +#ifdef FEATURE_PERPKT_INFO +static void dp_rx_stats_update(struct dp_soc *soc, struct dp_peer *peer, + struct cdp_rx_indication_ppdu *ppdu) +{ + struct dp_pdev *pdev = NULL; + uint8_t mcs, preamble; + uint16_t num_msdu; + + mcs = ppdu->u.mcs; + preamble = ppdu->u.preamble; + num_msdu = ppdu->num_msdu; + + if (!peer) + return; + + pdev = peer->vdev->pdev; + + 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.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.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))); + 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))); + 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))); + DP_STATS_INCC(peer, + rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + ((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC))); + DP_STATS_INCC(peer, + rx.pkt_type[preamble].mcs_count[mcs], num_msdu, + ((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC))); + DP_STATS_INCC(peer, + rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu, + ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX))); + 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); + + if (soc->cdp_soc.ol_ops->update_dp_stats) { + soc->cdp_soc.ol_ops->update_dp_stats(pdev->osif_pdev, + &peer->stats, ppdu->peer_id, + UPDATE_PEER_STATS); + } +} +#endif /** * dp_rx_handle_ppdu_stats() - Allocate and deliver ppdu stats to cdp layer @@ -117,6 +194,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev, peer = dp_peer_find_by_id(soc, cdp_rx_ppdu->peer_id); if (peer && cdp_rx_ppdu->peer_id != HTT_INVALID_PEER) { + dp_rx_stats_update(soc, peer, cdp_rx_ppdu); dp_wdi_event_handler(WDI_EVENT_RX_PPDU_DESC, soc, ppdu_nbuf, cdp_rx_ppdu->peer_id, WDI_NO_VAL, pdev->pdev_id); diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 1bec57322c..18fa8c81c8 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -1995,14 +1995,15 @@ static void dp_tx_update_peer_stats(struct dp_peer *peer, { struct dp_pdev *pdev = peer->vdev->pdev; struct dp_soc *soc = pdev->soc; + uint8_t mcs, pkt_type; + + mcs = ts->mcs; + pkt_type = ts->pkt_type; - DP_STATS_INC_PKT(peer, tx.comp_pkt, 1, length); if (!ts->release_src == HAL_TX_COMP_RELEASE_SOURCE_TQM) return; - DP_STATS_INCC(peer, tx.tx_failed, 1, - !(ts->status == HAL_TX_TQM_RR_FRAME_ACKED)); DP_STATS_INCC(peer, tx.dropped.age_out, 1, (ts->status == HAL_TX_TQM_RR_REM_CMD_AGED)); @@ -2018,39 +2019,39 @@ static void dp_tx_update_peer_stats(struct dp_peer *peer, if (!ts->status == HAL_TX_TQM_RR_FRAME_ACKED) return; + DP_STATS_INCC(peer, tx.ofdma, 1, ts->ofdma); + DP_STATS_INCC(peer, tx.amsdu_cnt, 1, ts->msdu_part_of_amsdu); - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[MAX_MCS], 1, - ((ts->mcs >= MAX_MCS_11A) && (ts->pkt_type == DOT11_A))); - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[ts->mcs], 1, - ((ts->mcs <= MAX_MCS_11A) && (ts->pkt_type == DOT11_A))); - - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[MAX_MCS], 1, - ((ts->mcs >= MAX_MCS_11B) && (ts->pkt_type == DOT11_B))); - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[ts->mcs], 1, - ((ts->mcs <= MAX_MCS_11B) && (ts->pkt_type == DOT11_B))); - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[MAX_MCS], 1, - ((ts->mcs >= MAX_MCS_11A) && (ts->pkt_type == DOT11_N))); - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[ts->mcs], 1, - ((ts->mcs <= MAX_MCS_11A) && (ts->pkt_type == DOT11_N))); - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[MAX_MCS], 1, - ((ts->mcs >= MAX_MCS_11AC) && (ts->pkt_type == DOT11_AC))); - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[ts->mcs], 1, - ((ts->mcs <= MAX_MCS_11AC) && (ts->pkt_type == DOT11_AC))); - - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[MAX_MCS], 1, - ((ts->mcs >= (MAX_MCS-1)) && (ts->pkt_type == DOT11_AX))); - DP_STATS_INCC(peer, tx.pkt_type[ts->pkt_type].mcs_count[ts->mcs], 1, - ((ts->mcs <= (MAX_MCS-1)) && (ts->pkt_type == DOT11_AX))); + if (!(soc->process_tx_status)) + return; + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + ((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_A))); + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, + ((mcs < (MAX_MCS_11A)) && (pkt_type == DOT11_A))); + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + ((mcs >= MAX_MCS_11B) && (pkt_type == DOT11_B))); + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, + ((mcs < MAX_MCS_11B) && (pkt_type == DOT11_B))); + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + ((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_N))); + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, + ((mcs < MAX_MCS_11A) && (pkt_type == DOT11_N))); + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + ((mcs >= MAX_MCS_11AC) && (pkt_type == DOT11_AC))); + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, + ((mcs < MAX_MCS_11AC) && (pkt_type == DOT11_AC))); + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1, + ((mcs >= (MAX_MCS - 1)) && (pkt_type == DOT11_AX))); + DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1, + ((mcs < (MAX_MCS - 1)) && (pkt_type == DOT11_AX))); DP_STATS_INC(peer, tx.sgi_count[ts->sgi], 1); DP_STATS_INC(peer, tx.bw[ts->bw], 1); DP_STATS_UPD(peer, tx.last_ack_rssi, ts->ack_frame_rssi); DP_STATS_INC(peer, tx.wme_ac_type[TID_TO_WME_AC(ts->tid)], 1); DP_STATS_INCC(peer, tx.stbc, 1, ts->stbc); - DP_STATS_INCC(peer, tx.ofdma, 1, ts->ofdma); DP_STATS_INCC(peer, tx.ldpc, 1, ts->ldpc); DP_STATS_INC_PKT(peer, tx.tx_success, 1, length); - DP_STATS_INCC(peer, tx.amsdu_cnt, 1, ts->msdu_part_of_amsdu); DP_STATS_INCC(peer, tx.retries, 1, ts->transmit_cnt > 1); if (soc->cdp_soc.ol_ops->update_dp_stats) { @@ -2661,7 +2662,7 @@ QDF_STATUS dp_tx_soc_attach(struct dp_soc *soc) * only for NPR EMU, should be removed, once NPR platforms * are stable. */ - soc->process_tx_status = 1; + soc->process_tx_status = 0; QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO, "%s HAL Tx init Success\n", __func__); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 511cb60109..99646a5ae4 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -742,7 +742,7 @@ struct dp_soc { /* Enable processing of Tx completion status words */ bool process_tx_status; - + bool process_rx_status; struct dp_ast_entry *ast_table[WLAN_UMAC_PSOC_MAX_PEERS * 2]; struct { unsigned mask; diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index 31daedf52c..1c31638725 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -521,12 +521,24 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info) ppdu_info->rx_status.mcs = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, MCS); + ppdu_info->rx_status.tcp_msdu_count = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9, + TCP_MSDU_COUNT); + ppdu_info->rx_status.udp_msdu_count = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9, + UDP_MSDU_COUNT); + ppdu_info->rx_status.other_msdu_count = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10, + OTHER_MSDU_COUNT); ppdu_info->rx_status.nss = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, NSS); ppdu_info->rx_status.first_data_seq_ctrl = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, - DATA_SEQUENCE_CONTROL_INFO_VALID); + DATA_SEQUENCE_CONTROL_INFO_VALID); + ppdu_info->rx_status.preamble_type = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, + HT_CONTROL_FIELD_PKT_TYPE); break; } @@ -718,8 +730,6 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info) PHYRX_RSSI_LEGACY_35, RSSI_COMB); ppdu_info->rx_status.bw = HAL_RX_GET(rssi_info_tlv, PHYRX_RSSI_LEGACY_35, RECEIVE_BANDWIDTH); - ppdu_info->rx_status.preamble_type = HAL_RX_GET(rssi_info_tlv, - PHYRX_RSSI_LEGACY_0, RECEPTION_TYPE); ppdu_info->rx_status.he_re = 0; value = HAL_RX_GET(rssi_info_tlv, diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 186dd04b7c..1904ab5bdc 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -179,6 +179,9 @@ struct mon_rx_status { uint8_t nr_ant; uint8_t mcs; uint8_t nss; + uint16_t tcp_msdu_count; + uint16_t udp_msdu_count; + uint16_t other_msdu_count; uint8_t bw; uint8_t vht_flag_values1; uint8_t vht_flag_values2; diff --git a/qdf/linux/src/qdf_debugfs.c b/qdf/linux/src/qdf_debugfs.c index b0118cb00f..24e21c71f8 100644 --- a/qdf/linux/src/qdf_debugfs.c +++ b/qdf/linux/src/qdf_debugfs.c @@ -313,7 +313,7 @@ qdf_dentry_t qdf_debugfs_create_file(const char *name, uint16_t mode, if (IS_ERR_OR_NULL(file)) { QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "%s creation failed %p", name, file); + "%s creation failed 0x%pK", name, file); file = NULL; }