diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 2bd4c94f03..ee29da172b 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -2937,6 +2937,16 @@ struct cdp_peer_tx_ul_deter { uint32_t trigger_success; uint32_t trigger_fail; }; + +/** + * struct cdp_peer_rx_deter- Structure to hold peer rx deterministic stats + * @avg_rate: Average RX rate + * @mode_cnt: RX mode count + */ +struct cdp_peer_rx_deter { + uint64_t avg_rate; + uint32_t mode_cnt; +}; #endif /* struct cdp_pdev_stats - pdev stats diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index d40af8202b..288bf91da7 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -916,10 +916,12 @@ struct dp_mon_peer_airtime_stats { * struct dp_mon_peer_deterministic - Monitor peer deterministic stats * @dl_det: Downlink deterministic stats * @ul_det: Uplink deterministic stats + * @rx_det: RX deterministic stats */ struct dp_mon_peer_deterministic { struct cdp_peer_tx_dl_deter dl_det[MSDUQ_INDEX_MAX][TX_MODE_DL_MAX]; struct cdp_peer_tx_ul_deter ul_det[TX_MODE_UL_MAX]; + struct cdp_peer_rx_deter rx_det; }; #endif diff --git a/dp/wifi3.0/monitor/dp_rx_mon.c b/dp/wifi3.0/monitor/dp_rx_mon.c index a50eb998d6..cfd79aebad 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon.c +++ b/dp/wifi3.0/monitor/dp_rx_mon.c @@ -843,6 +843,49 @@ dp_ppdu_desc_user_rx_time_update(struct dp_pdev *pdev, DP_STATS_INC(mon_peer, airtime_stats.rx_airtime_consumption[ac].consumption, user->rx_time_us); } + +/** + * dp_rx_mon_update_user_deter_stats() - Update per-peer deterministic stats + * @pdev: Datapath pdev handle + * @peer: Datapath peer handle + * @ppdu: PPDU Descriptor + * @user: Per user RX stats + * + * Return: None + */ +static inline +void dp_rx_mon_update_user_deter_stats(struct dp_pdev *pdev, + struct dp_peer *peer, + struct cdp_rx_indication_ppdu *ppdu, + struct cdp_rx_stats_ppdu_user *user) +{ + struct dp_mon_peer *mon_peer; + uint8_t tid; + + if (!pdev || !ppdu || !user || !peer) + return; + + if (!dp_is_subtype_data(ppdu->frame_ctrl)) + return; + + if (ppdu->u.ppdu_type != HAL_RX_TYPE_SU) + return; + + mon_peer = peer->monitor_peer; + if (!mon_peer) + return; + + tid = user->tid; + if (tid >= CDP_DATA_TID_MAX) + return; + + DP_STATS_INC(mon_peer, + deter_stats[tid].rx_det.mode_cnt, + 1); + DP_STATS_UPD(mon_peer, + deter_stats[tid].rx_det.avg_rate, + mon_peer->stats.rx.avg_rx_rate); +} #else static inline void dp_ppdu_desc_user_rx_time_update(struct dp_pdev *pdev, @@ -850,6 +893,13 @@ dp_ppdu_desc_user_rx_time_update(struct dp_pdev *pdev, struct cdp_rx_indication_ppdu *ppdu_desc, struct cdp_rx_stats_ppdu_user *user) { } + +static inline +void dp_rx_mon_update_user_deter_stats(struct dp_pdev *pdev, + struct dp_peer *peer, + struct cdp_rx_indication_ppdu *ppdu, + struct cdp_rx_stats_ppdu_user *user) +{ } #endif static void dp_rx_stats_update(struct dp_pdev *pdev, @@ -1063,6 +1113,7 @@ static void dp_rx_stats_update(struct dp_pdev *pdev, dp_send_stats_event(pdev, peer, ppdu_user->peer_id); dp_ppdu_desc_user_rx_time_update(pdev, peer, ppdu, ppdu_user); + dp_rx_mon_update_user_deter_stats(pdev, peer, ppdu, ppdu_user); dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS); } }