diff --git a/dp/inc/cdp_txrx_host_stats.h b/dp/inc/cdp_txrx_host_stats.h index 2201794233..26286d9ebb 100644 --- a/dp/inc/cdp_txrx_host_stats.h +++ b/dp/inc/cdp_txrx_host_stats.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -1034,6 +1034,33 @@ static inline QDF_STATUS cdp_get_peer_telemetry_stats( return soc->ops->host_stats_ops->txrx_peer_telemetry_stats( soc, addr, stats); } + +/** + * cdp_get_peer_deter_stats(): function to get peer deterministic stats + * @soc: soc handle + * @addr: peer address + * @stats: pointer to peer telemetry stats + * + * return: status + */ +static inline QDF_STATUS cdp_get_peer_deter_stats( + ol_txrx_soc_handle soc, + uint8_t *addr, + struct cdp_peer_deter_stats *stats) +{ + if (!soc || !soc->ops) { + dp_cdp_debug("Invalid Instance"); + QDF_BUG(0); + return QDF_STATUS_E_FAILURE; + } + + if (!soc->ops->host_stats_ops || + !soc->ops->host_stats_ops->txrx_peer_deter_stats) + return QDF_STATUS_E_FAILURE; + + return soc->ops->host_stats_ops->txrx_peer_deter_stats( + soc, addr, stats); +} #endif /** diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 164df12448..1e8a85b4c2 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -1244,6 +1244,11 @@ struct cdp_host_stats_ops { struct cdp_soc_t *soc, uint8_t *addr, struct cdp_peer_telemetry_stats *stats); + QDF_STATUS + (*txrx_peer_deter_stats)( + struct cdp_soc_t *soc, + uint8_t *addr, + struct cdp_peer_deter_stats *stats); #endif QDF_STATUS (*txrx_get_peer_extd_rate_link_stats) diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index ee29da172b..62c770e882 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -2947,6 +2947,18 @@ struct cdp_peer_rx_deter { uint64_t avg_rate; uint32_t mode_cnt; }; + +/** + * struct cdp_peer_deter_stats- Structure to hold peer deterministic stats + * @dl_det: TX DL deterministic stats + * @ul_det: TX UL deterministic stats + * @rx_det: RX deterministic stats + */ +struct cdp_peer_deter_stats { + 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 /* struct cdp_pdev_stats - pdev stats diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 527f5949fe..cbd0c44cee 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -966,6 +966,12 @@ void dp_monitor_peer_telemetry_stats(struct dp_peer *peer, struct cdp_peer_telemetry_stats *stats) { } + +static inline +void dp_monitor_peer_deter_stats(struct dp_peer *peer, + struct cdp_peer_telemetry_stats *stats) +{ +} #endif /* WLAN_TELEMETRY_STATS_SUPPORT */ #endif /* !WIFI_MONITOR_SUPPORT */ @@ -4221,6 +4227,19 @@ dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, QDF_STATUS dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr, struct cdp_peer_telemetry_stats *stats); + +/* + * dp_get_peer_deter_stats- API to get peer deterministic stats + * @soc_hdl: soc handle + * @addr: peer mac + * @stats: pointer to peer deterministic stats + * + * Return: QDF_STATUS_SUCCESS: Success + * QDF_STATUS_E_FAILURE: Error + */ +QDF_STATUS +dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr, + struct cdp_peer_deter_stats *stats); #endif /* WLAN_TELEMETRY_STATS_SUPPORT */ #ifdef CONNECTIVITY_PKTLOG diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index d54f9182af..c4658cdbc4 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -14202,6 +14202,7 @@ static struct cdp_host_stats_ops dp_ops_host_stats = { #ifdef WLAN_TELEMETRY_STATS_SUPPORT .txrx_pdev_telemetry_stats = dp_get_pdev_telemetry_stats, .txrx_peer_telemetry_stats = dp_get_peer_telemetry_stats, + .txrx_peer_deter_stats = dp_get_peer_deter_stats, #endif .txrx_get_peer_extd_rate_link_stats = dp_get_peer_extd_rate_link_stats, diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index d8e3b3e6a1..ca37a3cad7 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -9286,4 +9286,21 @@ dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr, return QDF_STATUS_SUCCESS; } + +QDF_STATUS +dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr, + struct cdp_peer_deter_stats *stats) +{ + struct dp_soc *soc = (struct dp_soc *)soc_hdl; + struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL, + DP_MOD_ID_MISC); + + if (!peer) + return QDF_STATUS_E_FAILURE; + + dp_monitor_peer_deter_stats(peer, stats); + dp_peer_unref_delete(peer, DP_MOD_ID_MISC); + + return QDF_STATUS_SUCCESS; +} #endif diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 288bf91da7..bf3326d457 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -4452,6 +4452,21 @@ void dp_monitor_peer_telemetry_stats(struct dp_peer *peer, stats->rx_mpdu_total = mon_peer_stats->rx.rx_mpdus; stats->snr = CDP_SNR_OUT(mon_peer_stats->rx.avg_snr); } + +static inline +void dp_monitor_peer_deter_stats(struct dp_peer *peer, + struct cdp_peer_deter_stats *stats) +{ + struct dp_mon_peer_stats *mon_peer_stats = NULL; + struct dp_mon_peer_deterministic *deter_stats; + + if (qdf_unlikely(!peer->monitor_peer)) + return; + + mon_peer_stats = &peer->monitor_peer->stats; + deter_stats = mon_peer_stats->deter_stats; + qdf_mem_copy(stats, deter_stats, sizeof(*stats) * CDP_DATA_TID_MAX); +} #endif /**