diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index 0ec8ca1f47..4171ee9a58 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -383,7 +383,7 @@ QDF_STATUS dp_vdev_set_monitor_mode_rings_2_0(struct dp_pdev *pdev, #if defined(QCA_ENHANCED_STATS_SUPPORT) && defined(WLAN_FEATURE_11BE) void -dp_mon_tx_stats_update_2_0(struct dp_peer *peer, +dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer, struct cdp_tx_completion_ppdu_user *ppdu) { uint8_t preamble; @@ -392,38 +392,38 @@ dp_mon_tx_stats_update_2_0(struct dp_peer *peer, preamble = ppdu->preamble; mcs = ppdu->mcs; - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], ppdu->num_msdu, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[mcs], ppdu->num_msdu, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.su_be_ppdu_cnt.mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_SU))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.su_be_ppdu_cnt.mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_SU))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE) && @@ -433,7 +433,7 @@ dp_mon_tx_stats_update_2_0(struct dp_peer *peer, #if defined(QCA_ENHANCED_STATS_SUPPORT) && !defined(WLAN_FEATURE_11BE) void -dp_mon_tx_stats_update_2_0(struct dp_peer *peer, +dp_mon_tx_stats_update_2_0(struct dp_mon_peer *mon_peer, struct cdp_tx_completion_ppdu_user *ppdu) { } diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c index 030210d3ef..c21183ce36 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c @@ -230,7 +230,7 @@ dp_rx_mon_populate_ppdu_usr_info_2_0(struct mon_rx_user_status *rx_user_status, } #ifdef WLAN_FEATURE_11BE -void dp_rx_mon_stats_update_2_0(struct dp_peer *peer, +void dp_rx_mon_stats_update_2_0(struct dp_mon_peer *mon_peer, struct cdp_rx_indication_ppdu *ppdu, struct cdp_rx_stats_ppdu_user *ppdu_user) { @@ -243,32 +243,32 @@ void dp_rx_mon_stats_update_2_0(struct dp_peer *peer, else mcs = ppdu_user->mcs; - DP_STATS_INC(peer, rx.mpdu_retry_cnt, ppdu_user->mpdu_retries); - DP_STATS_INCC(peer, + DP_STATS_INC(mon_peer, rx.mpdu_retry_cnt, ppdu_user->mpdu_retries); + DP_STATS_INCC(mon_peer, rx.su_be_ppdu_cnt.mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu_type == HAL_RX_TYPE_SU))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.su_be_ppdu_cnt.mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu_type == HAL_RX_TYPE_SU))); - DP_STATS_INCC(peer, - rx.rx_mu_be[TXRX_TYPE_MU_OFDMA].mcs_count[MAX_MCS - 1], + DP_STATS_INCC(mon_peer, + rx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu_type == HAL_RX_TYPE_MU_OFDMA))); - DP_STATS_INCC(peer, - rx.rx_mu_be[TXRX_TYPE_MU_OFDMA].mcs_count[mcs], + DP_STATS_INCC(mon_peer, + rx.mu_be_ppdu_cnt[TXRX_TYPE_MU_OFDMA].mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu_type == HAL_RX_TYPE_MU_OFDMA))); - DP_STATS_INCC(peer, - rx.rx_mu_be[TXRX_TYPE_MU_MIMO].mcs_count[MAX_MCS - 1], + DP_STATS_INCC(mon_peer, + rx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu_type == HAL_RX_TYPE_MU_MIMO))); - DP_STATS_INCC(peer, - rx.rx_mu_be[TXRX_TYPE_MU_MIMO].mcs_count[mcs], + DP_STATS_INCC(mon_peer, + rx.mu_be_ppdu_cnt[TXRX_TYPE_MU_MIMO].mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE) && (ppdu_type == HAL_RX_TYPE_MU_MIMO))); @@ -281,11 +281,11 @@ dp_rx_mon_populate_ppdu_info_2_0(struct hal_rx_ppdu_info *hal_ppdu_info, ppdu->punc_bw = hal_ppdu_info->rx_status.punctured_bw; } #else -void dp_rx_mon_stats_update_2_0(struct dp_peer *peer, +void dp_rx_mon_stats_update_2_0(struct dp_mon_peer *mon_peer, struct cdp_rx_indication_ppdu *ppdu, struct cdp_rx_stats_ppdu_user *ppdu_user) { - DP_STATS_INC(peer, rx.mpdu_retry_cnt, ppdu_user->mpdu_retries); + DP_STATS_INC(mon_peer, rx.mpdu_retry_cnt, ppdu_user->mpdu_retries); } void diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h index bf2ca77779..0a995cf4f4 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.h @@ -90,13 +90,13 @@ void dp_rx_mon_process_status_tlv(struct dp_soc *soc, /** * dp_rx_mon_stats_update_2_0 () - update rx stats * - * @peer: peer handle + * @peer: monitor peer handle * @ppdu: Rx PPDU status metadata object * @ppdu_user: Rx PPDU user status metadata object * * Return: Void */ -void dp_rx_mon_stats_update_2_0(struct dp_peer *peer, +void dp_rx_mon_stats_update_2_0(struct dp_mon_peer *mon_peer, struct cdp_rx_indication_ppdu *ppdu, struct cdp_rx_stats_ppdu_user *ppdu_user); diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index ff75808d15..4fb9b98c83 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -1084,34 +1084,49 @@ void dp_pktlogmod_exit(struct dp_pdev *pdev) } #endif /*DP_CON_MON*/ -#ifdef WDI_EVENT_ENABLE +#if defined(WDI_EVENT_ENABLE) && defined(QCA_ENHANCED_STATS_SUPPORT) QDF_STATUS dp_peer_stats_notify(struct dp_pdev *dp_pdev, struct dp_peer *peer) { struct cdp_interface_peer_stats peer_stats_intf; - struct cdp_peer_stats *peer_stats = &peer->stats; + struct dp_mon_peer_stats *mon_peer_stats = NULL; + struct dp_peer *tgt_peer = NULL; + struct dp_txrx_peer *txrx_peer = NULL; - if (!peer->vdev) + if (!peer || !peer->vdev || !peer->monitor_peer) return QDF_STATUS_E_FAULT; + tgt_peer = dp_get_tgt_peer_from_peer(peer); + if (!tgt_peer) + return QDF_STATUS_E_FAULT; + + txrx_peer = tgt_peer->txrx_peer; + if (!txrx_peer) + return QDF_STATUS_E_FAULT; + + mon_peer_stats = &peer->monitor_peer->stats; + qdf_mem_zero(&peer_stats_intf, sizeof(peer_stats_intf)); - if (peer_stats->rx.last_snr != peer_stats->rx.snr) + if (mon_peer_stats->rx.last_snr != mon_peer_stats->rx.snr) peer_stats_intf.rssi_changed = true; - if ((peer_stats->rx.snr && peer_stats_intf.rssi_changed) || - (peer_stats->tx.tx_rate && - peer_stats->tx.tx_rate != peer_stats->tx.last_tx_rate)) { + if ((mon_peer_stats->rx.snr && peer_stats_intf.rssi_changed) || + (mon_peer_stats->tx.tx_rate && + mon_peer_stats->tx.tx_rate != mon_peer_stats->tx.last_tx_rate)) { qdf_mem_copy(peer_stats_intf.peer_mac, peer->mac_addr.raw, QDF_MAC_ADDR_SIZE); peer_stats_intf.vdev_id = peer->vdev->vdev_id; - peer_stats_intf.last_peer_tx_rate = peer_stats->tx.last_tx_rate; - peer_stats_intf.peer_tx_rate = peer_stats->tx.tx_rate; - peer_stats_intf.peer_rssi = peer_stats->rx.snr; - peer_stats_intf.tx_packet_count = peer_stats->tx.ucast.num; - peer_stats_intf.rx_packet_count = peer_stats->rx.to_stack.num; - peer_stats_intf.tx_byte_count = peer_stats->tx.tx_success.bytes; - peer_stats_intf.rx_byte_count = peer_stats->rx.to_stack.bytes; - peer_stats_intf.per = peer_stats->tx.last_per; - peer_stats_intf.ack_rssi = peer_stats->tx.last_ack_rssi; + peer_stats_intf.last_peer_tx_rate = + mon_peer_stats->tx.last_tx_rate; + peer_stats_intf.peer_tx_rate = mon_peer_stats->tx.tx_rate; + peer_stats_intf.peer_rssi = mon_peer_stats->rx.snr; + peer_stats_intf.ack_rssi = mon_peer_stats->tx.last_ack_rssi; + peer_stats_intf.rx_packet_count = txrx_peer->to_stack.num; + peer_stats_intf.rx_byte_count = txrx_peer->to_stack.bytes; + peer_stats_intf.tx_packet_count = + txrx_peer->stats.per_pkt_stats.tx.ucast.num; + peer_stats_intf.tx_byte_count = + txrx_peer->stats.per_pkt_stats.tx.tx_success.bytes; + peer_stats_intf.per = tgt_peer->stats.tx.last_per; peer_stats_intf.free_buff = INVALID_FREE_BUFF; dp_wdi_event_handler(WDI_EVENT_PEER_STATS, dp_pdev->soc, (void *)&peer_stats_intf, 0, @@ -2283,6 +2298,7 @@ dp_tx_rate_stats_update(struct dp_peer *peer, uint32_t rix; uint16_t ratecode = 0; enum PUNCTURED_MODES punc_mode = NO_PUNCTURE; + struct dp_mon_peer *mon_peer = NULL; if (!peer || !ppdu) return; @@ -2290,6 +2306,10 @@ dp_tx_rate_stats_update(struct dp_peer *peer, if (ppdu->completion_status != HTT_PPDU_STATS_USER_STATUS_OK) return; + mon_peer = peer->monitor_peer; + if (!mon_peer) + return; + ratekbps = dp_getrateindex(ppdu->gi, ppdu->mcs, ppdu->nss, @@ -2299,7 +2319,7 @@ dp_tx_rate_stats_update(struct dp_peer *peer, &rix, &ratecode); - DP_STATS_UPD(peer, tx.last_tx_rate, ratekbps); + DP_STATS_UPD(mon_peer, tx.last_tx_rate, ratekbps); if (!ratekbps) return; @@ -2315,16 +2335,16 @@ dp_tx_rate_stats_update(struct dp_peer *peer, ppdu->rix = rix; ppdu->tx_ratekbps = ratekbps; ppdu->tx_ratecode = ratecode; - peer->stats.tx.avg_tx_rate = - dp_ath_rate_lpf(peer->stats.tx.avg_tx_rate, ratekbps); - ppdu_tx_rate = dp_ath_rate_out(peer->stats.tx.avg_tx_rate); - DP_STATS_UPD(peer, tx.rnd_avg_tx_rate, ppdu_tx_rate); + mon_peer->stats.tx.avg_tx_rate = + dp_ath_rate_lpf(mon_peer->stats.tx.avg_tx_rate, ratekbps); + ppdu_tx_rate = dp_ath_rate_out(mon_peer->stats.tx.avg_tx_rate); + DP_STATS_UPD(mon_peer, tx.rnd_avg_tx_rate, ppdu_tx_rate); - peer->stats.tx.bw_info = ppdu->bw; - peer->stats.tx.gi_info = ppdu->gi; - peer->stats.tx.nss_info = ppdu->nss; - peer->stats.tx.mcs_info = ppdu->mcs; - peer->stats.tx.preamble_info = ppdu->preamble; + mon_peer->stats.tx.bw_info = ppdu->bw; + mon_peer->stats.tx.gi_info = ppdu->gi; + mon_peer->stats.tx.nss_info = ppdu->nss; + mon_peer->stats.tx.mcs_info = ppdu->mcs; + mon_peer->stats.tx.preamble_info = ppdu->preamble; if (peer->vdev) { /* * In STA mode: @@ -2345,20 +2365,32 @@ dp_tx_rate_stats_update(struct dp_peer *peer, } #if defined(FEATURE_PERPKT_INFO) && defined(WDI_EVENT_ENABLE) -static inline void dp_send_stats_event(struct dp_pdev *pdev, - struct dp_peer *peer, - u_int16_t peer_id) +void dp_send_stats_event(struct dp_pdev *pdev, struct dp_peer *peer, + uint16_t peer_id) { + struct cdp_interface_peer_stats peer_stats_intf; + struct dp_mon_peer *mon_peer = peer->monitor_peer; + struct dp_txrx_peer *txrx_peer = NULL; + + if (!mon_peer) + return; + + qdf_mem_zero(&peer_stats_intf, + sizeof(struct cdp_interface_peer_stats)); + mon_peer->stats.rx.rx_snr_measured_time = qdf_system_ticks(); + peer_stats_intf.rx_avg_snr = mon_peer->stats.rx.avg_snr; + + txrx_peer = dp_get_txrx_peer(peer); + if (txrx_peer) { + peer_stats_intf.rx_byte_count = txrx_peer->to_stack.bytes; + peer_stats_intf.tx_byte_count = + txrx_peer->stats.per_pkt_stats.tx.tx_success.bytes; + } + dp_wdi_event_handler(WDI_EVENT_UPDATE_DP_STATS, pdev->soc, - &peer->stats, peer_id, + &peer_stats_intf, peer_id, UPDATE_PEER_STATS, pdev->pdev_id); } -#else -static inline void dp_send_stats_event(struct dp_pdev *pdev, - struct dp_peer *peer, - u_int16_t peer_id) -{ -} #endif /* @@ -2482,6 +2514,7 @@ dp_tx_stats_update(struct dp_pdev *pdev, struct dp_peer *peer, uint16_t mpdu_failed; struct dp_mon_ops *mon_ops; enum cdp_ru_index ru_index; + struct dp_mon_peer *mon_peer = NULL; preamble = ppdu->preamble; mcs = ppdu->mcs; @@ -2497,6 +2530,10 @@ dp_tx_stats_update(struct dp_pdev *pdev, struct dp_peer *peer, if (pdev->soc->process_tx_status) return; + mon_peer = peer->monitor_peer; + if (!mon_peer) + return; + if (ppdu->completion_status != HTT_PPDU_STATS_USER_STATUS_OK) { /* * All failed mpdu will be retried, so incrementing @@ -2504,13 +2541,12 @@ dp_tx_stats_update(struct dp_pdev *pdev, struct dp_peer *peer, * ack failure i.e for long retries we get * mpdu failed equal mpdu tried. */ - DP_STATS_INC(peer, tx.retries, mpdu_failed); - DP_STATS_INC(peer, tx.tx_failed, ppdu->failed_msdus); + DP_STATS_INC(mon_peer, tx.retries, mpdu_failed); return; } if (ppdu->is_ppdu_cookie_valid) - DP_STATS_INC(peer, tx.num_ppdu_cookie_valid, 1); + DP_STATS_INC(mon_peer, tx.num_ppdu_cookie_valid, 1); if (ppdu->mu_group_id <= MAX_MU_GROUP_ID && ppdu->ppdu_type != HTT_PPDU_STATS_PPDU_TYPE_SU) { @@ -2518,21 +2554,21 @@ dp_tx_stats_update(struct dp_pdev *pdev, struct dp_peer *peer, QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "mu_group_id out of bound!!\n"); else - DP_STATS_UPD(peer, tx.mu_group_id[ppdu->mu_group_id], + DP_STATS_UPD(mon_peer, tx.mu_group_id[ppdu->mu_group_id], (ppdu->user_pos + 1)); } if (ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_OFDMA || ppdu->ppdu_type == HTT_PPDU_STATS_PPDU_TYPE_MU_MIMO_OFDMA) { - DP_STATS_UPD(peer, tx.ru_tones, ppdu->ru_tones); - DP_STATS_UPD(peer, tx.ru_start, ppdu->ru_start); + DP_STATS_UPD(mon_peer, tx.ru_tones, ppdu->ru_tones); + DP_STATS_UPD(mon_peer, tx.ru_start, ppdu->ru_start); ru_index = dp_get_ru_index_frm_ru_tones(ppdu->ru_tones); if (ru_index != RU_INDEX_MAX) { - DP_STATS_INC(peer, tx.ru_loc[ru_index].num_msdu, + DP_STATS_INC(mon_peer, tx.ru_loc[ru_index].num_msdu, num_msdu); - DP_STATS_INC(peer, tx.ru_loc[ru_index].num_mpdu, + DP_STATS_INC(mon_peer, tx.ru_loc[ru_index].num_mpdu, num_mpdu); - DP_STATS_INC(peer, tx.ru_loc[ru_index].mpdu_tried, + DP_STATS_INC(mon_peer, tx.ru_loc[ru_index].mpdu_tried, mpdu_tried); } } @@ -2543,65 +2579,67 @@ dp_tx_stats_update(struct dp_pdev *pdev, struct dp_peer *peer, * ack failure i.e for long retries we get * mpdu failed equal mpdu tried. */ - DP_STATS_INC(peer, tx.retries, mpdu_failed); - DP_STATS_INC(peer, tx.tx_failed, ppdu->failed_msdus); + DP_STATS_INC(mon_peer, tx.retries, mpdu_failed); - DP_STATS_INC(peer, tx.transmit_type[ppdu->ppdu_type].num_msdu, + DP_STATS_INC(mon_peer, tx.transmit_type[ppdu->ppdu_type].num_msdu, num_msdu); - DP_STATS_INC(peer, tx.transmit_type[ppdu->ppdu_type].num_mpdu, + DP_STATS_INC(mon_peer, tx.transmit_type[ppdu->ppdu_type].num_mpdu, num_mpdu); - DP_STATS_INC(peer, tx.transmit_type[ppdu->ppdu_type].mpdu_tried, + DP_STATS_INC(mon_peer, tx.transmit_type[ppdu->ppdu_type].mpdu_tried, mpdu_tried); - 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_INC(peer, tx.nss[ppdu->nss], num_msdu); + DP_STATS_UPD(mon_peer, tx.tx_rate, ppdu->tx_rate); + DP_STATS_INC(mon_peer, tx.sgi_count[ppdu->gi], num_msdu); + DP_STATS_INC(mon_peer, tx.bw[ppdu->bw], num_msdu); + DP_STATS_INC(mon_peer, tx.nss[ppdu->nss], num_msdu); if (ppdu->tid < CDP_DATA_TID_MAX) - DP_STATS_INC(peer, tx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], + DP_STATS_INC(mon_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_INCC(mon_peer, tx.stbc, num_msdu, ppdu->stbc); + DP_STATS_INCC(mon_peer, tx.ldpc, num_msdu, ppdu->ldpc); if (!(ppdu->is_mcast) && ppdu->ack_rssi_valid) - DP_STATS_UPD(peer, tx.last_ack_rssi, ack_rssi); + DP_STATS_UPD(mon_peer, tx.last_ack_rssi, ack_rssi); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_A))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11A) && (preamble == DOT11_A))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11B) && (preamble == DOT11_B))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < (MAX_MCS_11B)) && (preamble == DOT11_B))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_N))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11A) && (preamble == DOT11_N))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, tx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX))); - DP_STATS_INCC(peer, tx.ampdu_cnt, num_mpdu, ppdu->is_ampdu); - DP_STATS_INCC(peer, tx.non_ampdu_cnt, num_mpdu, !(ppdu->is_ampdu)); - DP_STATS_INCC(peer, tx.pream_punct_cnt, 1, ppdu->pream_punct); + DP_STATS_INCC(mon_peer, tx.ampdu_cnt, num_mpdu, ppdu->is_ampdu); + DP_STATS_INCC(mon_peer, tx.non_ampdu_cnt, num_mpdu, !(ppdu->is_ampdu)); + DP_STATS_INCC(mon_peer, tx.pream_punct_cnt, 1, ppdu->pream_punct); + DP_STATS_INC(mon_peer, tx.tx_ppdus, 1); + DP_STATS_INC(mon_peer, tx.tx_mpdus_success, num_mpdu); + DP_STATS_INC(mon_peer, tx.tx_mpdus_tried, mpdu_tried); mon_ops = dp_mon_ops_get(pdev->soc); if (mon_ops && mon_ops->mon_tx_stats_update) - mon_ops->mon_tx_stats_update(peer, ppdu); + mon_ops->mon_tx_stats_update(mon_peer, ppdu); dp_peer_stats_notify(pdev, peer); @@ -3413,6 +3451,7 @@ dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev, uint8_t tid; struct dp_peer *peer; struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + struct dp_mon_peer *mon_peer = NULL; ppdu_desc = (struct cdp_tx_completion_ppdu *) qdf_nbuf_data(ppdu_info->nbuf); @@ -3443,7 +3482,8 @@ dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev, goto add_ppdu_to_sched_list; if (ppdu_desc->drop_reason == HTT_FLUSH_EXCESS_RETRIES) { - DP_STATS_INC(peer, + mon_peer = peer->monitor_peer; + DP_STATS_INC(mon_peer, tx.excess_retries_per_ac[TID_TO_WME_AC(tid)], ppdu_desc->num_msdu); } diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index d29510fe97..64f274cf9e 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -586,7 +586,7 @@ struct dp_mon_ops { #ifdef QCA_ENHANCED_STATS_SUPPORT void (*mon_filter_setup_enhanced_stats)(struct dp_pdev *pdev); void (*mon_filter_reset_enhanced_stats)(struct dp_pdev *pdev); - void (*mon_tx_stats_update)(struct dp_peer *peer, + void (*mon_tx_stats_update)(struct dp_mon_peer *mon_peer, struct cdp_tx_completion_ppdu_user *ppdu); #endif #ifdef QCA_MCOPY_SUPPORT @@ -648,7 +648,7 @@ struct dp_mon_ops { #endif void (*mon_register_feature_ops)(struct dp_soc *soc); #ifdef QCA_ENHANCED_STATS_SUPPORT - void (*mon_rx_stats_update)(struct dp_peer *peer, + void (*mon_rx_stats_update)(struct dp_mon_peer *mon_peer, struct cdp_rx_indication_ppdu *ppdu, struct cdp_rx_stats_ppdu_user *ppdu_user); void (*mon_rx_populate_ppdu_usr_info)(struct mon_rx_user_status *rx_user_status, @@ -1053,7 +1053,7 @@ dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn) } #endif -#ifdef WDI_EVENT_ENABLE +#if defined(WDI_EVENT_ENABLE) && defined(QCA_ENHANCED_STATS_SUPPORT) QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer); #else static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, @@ -1063,6 +1063,17 @@ static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, } #endif +#if defined(FEATURE_PERPKT_INFO) && defined(WDI_EVENT_ENABLE) +void dp_send_stats_event(struct dp_pdev *pdev, struct dp_peer *peer, + uint16_t peer_id); +#else +static inline +void dp_send_stats_event(struct dp_pdev *pdev, struct dp_peer *peer, + uint16_t peer_id) +{ +} +#endif + #ifndef WLAN_TX_PKT_CAPTURE_ENH /** * dp_tx_ppdu_stats_process - Deferred PPDU stats handler diff --git a/dp/wifi3.0/monitor/dp_rx_mon.c b/dp/wifi3.0/monitor/dp_rx_mon.c index 3fd2f0f5f1..de289a46d7 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon.c +++ b/dp/wifi3.0/monitor/dp_rx_mon.c @@ -647,12 +647,17 @@ static inline void dp_rx_rate_stats_update(struct dp_peer *peer, uint16_t ratecode = 0; struct cdp_rx_stats_ppdu_user *ppdu_user = NULL; enum PUNCTURED_MODES punc_mode = NO_PUNCTURE; + struct dp_mon_peer *mon_peer = NULL; if (!peer || !ppdu) return; + mon_peer = peer->monitor_peer; ppdu_user = &ppdu->user[user]; + if (!mon_peer) + return; + if (ppdu->u.ppdu_type != HAL_RX_TYPE_SU) { if (ppdu_user->nss == 0) nss = 0; @@ -660,12 +665,17 @@ static inline void dp_rx_rate_stats_update(struct dp_peer *peer, nss = ppdu_user->nss - 1; mcs = ppdu_user->mcs; + mon_peer->stats.rx.nss_info = ppdu_user->nss; + mon_peer->stats.rx.mcs_info = ppdu_user->mcs; } else { if (ppdu->u.nss == 0) nss = 0; else nss = ppdu->u.nss - 1; mcs = ppdu->u.mcs; + + mon_peer->stats.rx.nss_info = ppdu->u.nss; + mon_peer->stats.rx.mcs_info = ppdu->u.mcs; } ratekbps = dp_getrateindex(ppdu->u.gi, @@ -685,12 +695,16 @@ static inline void dp_rx_rate_stats_update(struct dp_peer *peer, return; } + mon_peer->stats.rx.bw_info = ppdu->u.bw; + mon_peer->stats.rx.gi_info = ppdu->u.gi; + mon_peer->stats.rx.preamble_info = ppdu->u.preamble; + ppdu->rix = rix; - DP_STATS_UPD(peer, rx.last_rx_rate, ratekbps); - peer->stats.rx.avg_rx_rate = - dp_ath_rate_lpf(peer->stats.rx.avg_rx_rate, ratekbps); - ppdu_rx_rate = dp_ath_rate_out(peer->stats.rx.avg_rx_rate); - DP_STATS_UPD(peer, rx.rnd_avg_rx_rate, ppdu_rx_rate); + DP_STATS_UPD(mon_peer, rx.last_rx_rate, ratekbps); + mon_peer->stats.rx.avg_rx_rate = + dp_ath_rate_lpf(mon_peer->stats.rx.avg_rx_rate, ratekbps); + ppdu_rx_rate = dp_ath_rate_out(mon_peer->stats.rx.avg_rx_rate); + DP_STATS_UPD(mon_peer, rx.rnd_avg_rx_rate, ppdu_rx_rate); ppdu->rx_ratekbps = ratekbps; ppdu->rx_ratecode = ratecode; ppdu_user->rx_ratekbps = ratekbps; @@ -766,10 +780,12 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, uint16_t num_msdu; uint8_t pkt_bw_offset; struct dp_peer *peer; + struct dp_mon_peer *mon_peer; struct cdp_rx_stats_ppdu_user *ppdu_user; uint32_t i; enum cdp_mu_packet_type mu_pkt_type; struct dp_mon_ops *mon_ops; + struct dp_mon_pdev *mon_pdev = NULL; if (pdev) soc = pdev->soc; @@ -779,6 +795,8 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, if (!soc || soc->process_rx_status) return; + mon_pdev = pdev->monitor_pdev; + preamble = ppdu->u.preamble; ppdu_type = ppdu->u.ppdu_type; @@ -789,7 +807,17 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, DP_MOD_ID_RX_PPDU_STATS); if (!peer) - peer = pdev->invalid_peer; + mon_peer = mon_pdev->invalid_mon_peer; + else + mon_peer = peer->monitor_peer; + + if (!mon_peer) { + if (peer) + dp_peer_unref_delete(peer, + DP_MOD_ID_RX_PPDU_STATS); + + continue; + } if ((preamble == DOT11_A) || (preamble == DOT11_B)) ppdu->u.nss = 1; @@ -805,24 +833,24 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, num_msdu = ppdu_user->num_msdu; pkt_bw_offset = dp_get_bw_offset_frm_bw(soc, ppdu->u.bw); - DP_STATS_UPD(peer, rx.snr, (ppdu->rssi + pkt_bw_offset)); + DP_STATS_UPD(mon_peer, rx.snr, (ppdu->rssi + pkt_bw_offset)); - if (peer->stats.rx.avg_snr == CDP_INVALID_SNR) - peer->stats.rx.avg_snr = - CDP_SNR_IN(peer->stats.rx.snr); + if (mon_peer->stats.rx.avg_snr == CDP_INVALID_SNR) + mon_peer->stats.rx.avg_snr = + CDP_SNR_IN(mon_peer->stats.rx.snr); else - CDP_SNR_UPDATE_AVG(peer->stats.rx.avg_snr, - peer->stats.rx.snr); + CDP_SNR_UPDATE_AVG(mon_peer->stats.rx.avg_snr, + mon_peer->stats.rx.snr); if (ppdu_type == HAL_RX_TYPE_SU) { if (nss) { - DP_STATS_INC(peer, rx.nss[nss - 1], num_msdu); - DP_STATS_INC(peer, rx.ppdu_nss[nss - 1], 1); + DP_STATS_INC(mon_peer, rx.nss[nss - 1], num_msdu); + DP_STATS_INC(mon_peer, rx.ppdu_nss[nss - 1], 1); } - DP_STATS_INC(peer, rx.mpdu_cnt_fcs_ok, + DP_STATS_INC(mon_peer, rx.mpdu_cnt_fcs_ok, ppdu_user->mpdu_cnt_fcs_ok); - DP_STATS_INC(peer, rx.mpdu_cnt_fcs_err, + DP_STATS_INC(mon_peer, rx.mpdu_cnt_fcs_err, ppdu_user->mpdu_cnt_fcs_err); } @@ -834,84 +862,84 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, mu_pkt_type = TXRX_TYPE_MU_OFDMA; if (nss) { - DP_STATS_INC(peer, rx.nss[nss - 1], num_msdu); - DP_STATS_INC(peer, + DP_STATS_INC(mon_peer, rx.nss[nss - 1], num_msdu); + DP_STATS_INC(mon_peer, rx.rx_mu[mu_pkt_type].ppdu_nss[nss - 1], 1); } - DP_STATS_INC(peer, + DP_STATS_INC(mon_peer, rx.rx_mu[mu_pkt_type].mpdu_cnt_fcs_ok, ppdu_user->mpdu_cnt_fcs_ok); - DP_STATS_INC(peer, + DP_STATS_INC(mon_peer, rx.rx_mu[mu_pkt_type].mpdu_cnt_fcs_err, ppdu_user->mpdu_cnt_fcs_err); } - 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_INC(peer, rx.reception_type[ppdu->u.ppdu_type], + DP_STATS_INC(mon_peer, rx.sgi_count[ppdu->u.gi], num_msdu); + DP_STATS_INC(mon_peer, rx.bw[ppdu->u.bw], num_msdu); + DP_STATS_INC(mon_peer, rx.reception_type[ppdu->u.ppdu_type], num_msdu); - DP_STATS_INC(peer, rx.ppdu_cnt[ppdu->u.ppdu_type], 1); - DP_STATS_INCC(peer, rx.ampdu_cnt, num_msdu, + DP_STATS_INC(mon_peer, rx.ppdu_cnt[ppdu->u.ppdu_type], 1); + DP_STATS_INCC(mon_peer, rx.ampdu_cnt, num_msdu, ppdu_user->is_ampdu); - DP_STATS_INCC(peer, rx.non_ampdu_cnt, num_msdu, + DP_STATS_INCC(mon_peer, rx.non_ampdu_cnt, num_msdu, !(ppdu_user->is_ampdu)); - DP_STATS_UPD(peer, rx.rx_rate, mcs); - DP_STATS_INCC(peer, + DP_STATS_UPD(mon_peer, rx.rx_rate, mcs); + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_A))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11A) && (preamble == DOT11_A))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11B) && (preamble == DOT11_B))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11B) && (preamble == DOT11_B))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11A) && (preamble == DOT11_N))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11A) && (preamble == DOT11_N))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.pkt_type[preamble].mcs_count[mcs], num_msdu, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.su_ax_ppdu_cnt.mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX) && (ppdu_type == HAL_RX_TYPE_SU))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.su_ax_ppdu_cnt.mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX) && (ppdu_type == HAL_RX_TYPE_SU))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.rx_mu[TXRX_TYPE_MU_OFDMA].ppdu.mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX) && (ppdu_type == HAL_RX_TYPE_MU_OFDMA))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.rx_mu[TXRX_TYPE_MU_OFDMA].ppdu.mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX) && (ppdu_type == HAL_RX_TYPE_MU_OFDMA))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.rx_mu[TXRX_TYPE_MU_MIMO].ppdu.mcs_count[MAX_MCS - 1], 1, ((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX) && (ppdu_type == HAL_RX_TYPE_MU_MIMO))); - DP_STATS_INCC(peer, + DP_STATS_INCC(mon_peer, rx.rx_mu[TXRX_TYPE_MU_MIMO].ppdu.mcs_count[mcs], 1, ((mcs < (MAX_MCS - 1)) && (preamble == DOT11_AX) && @@ -924,27 +952,30 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, ac = TID_TO_WME_AC(ppdu_user->tid); if (ppdu->tid != HAL_TID_INVALID) - DP_STATS_INC(peer, rx.wme_ac_type[ac], num_msdu); + DP_STATS_INC(mon_peer, rx.wme_ac_type[ac], num_msdu); + + DP_STATS_INC(mon_peer, rx.rx_ppdus, 1); + DP_STATS_INC(mon_peer, rx.rx_mpdus, + (ppdu_user->mpdu_cnt_fcs_ok + ppdu_user->mpdu_cnt_fcs_err)); mon_ops = dp_mon_ops_get(soc); if (mon_ops && mon_ops->mon_rx_stats_update) - mon_ops->mon_rx_stats_update(peer, ppdu, ppdu_user); + mon_ops->mon_rx_stats_update(mon_peer, ppdu, ppdu_user); + + if (!peer) + continue; dp_peer_stats_notify(pdev, peer); - DP_STATS_UPD(peer, rx.last_snr, (ppdu->rssi + pkt_bw_offset)); + DP_STATS_UPD(mon_peer, rx.last_snr, + (ppdu->rssi + pkt_bw_offset)); dp_peer_qos_stats_notify(pdev, ppdu_user); - if (peer == pdev->invalid_peer) - continue; if (dp_is_subtype_data(ppdu->frame_ctrl)) dp_rx_rate_stats_update(peer, ppdu, i); -#if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE - dp_wdi_event_handler(WDI_EVENT_UPDATE_DP_STATS, pdev->soc, - &peer->stats, ppdu->peer_id, - UPDATE_PEER_STATS, pdev->pdev_id); -#endif + dp_send_stats_event(pdev, peer, ppdu_user->peer_id); + dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS); } }