qcacmn: Accumulate tx and rx airtime consumption stats separately

Accumulate tx and rx airtime consumption stats separately.

Change-Id: I1196ec83d94f73ee35a77a935d5820783e239154
CRs-Fixed: 3388165
This commit is contained in:
Himanshu Batra
2023-01-11 11:15:46 +05:30
committed by Madan Koyyalamudi
parent c50244f2b8
commit 87cf6b8b07
7 changed files with 124 additions and 34 deletions

View File

@@ -274,4 +274,34 @@ cdp_set_params_rssi_dbm_conversion(ol_txrx_soc_handle soc,
(soc, params); (soc, params);
} }
#endif #endif
#ifdef WLAN_TELEMETRY_STATS_SUPPORT
/*
* cdp_update_pdev_mon_telemetry_airtime_stats() - update telemetry airtime
* stats in monitor pdev
*
*@soc: dp soc handle
*@pdev_id: pdev id
*
* This API is used to update telemetry airtime stats in monitor pdev
*
* Return: Success if stats are updated, else failure
*/
static inline QDF_STATUS
cdp_update_pdev_mon_telemetry_airtime_stats(ol_txrx_soc_handle soc,
uint8_t pdev_id)
{
if (!soc || !soc->ops) {
dp_cdp_debug("Invalid Instance");
return QDF_STATUS_E_FAILURE;
}
if (!soc->ops->mon_ops ||
!soc->ops->mon_ops->txrx_update_pdev_mon_telemetry_airtime_stats)
return QDF_STATUS_E_FAILURE;
return soc->ops->mon_ops->txrx_update_pdev_mon_telemetry_airtime_stats(
soc, pdev_id);
}
#endif
#endif #endif

View File

@@ -972,6 +972,8 @@ struct cdp_me_ops {
* @config_full_mon_mode: configure full monitor mode * @config_full_mon_mode: configure full monitor mode
* @txrx_enable_mon_reap_timer: Enable/Disable reap timer of monitor status ring * @txrx_enable_mon_reap_timer: Enable/Disable reap timer of monitor status ring
* @txrx_get_lite_mon_legacy_feature_enabled: returns the legacy filter enabled * @txrx_get_lite_mon_legacy_feature_enabled: returns the legacy filter enabled
* @txrx_update_pdev_mon_telemetry_airtime_stats: update telemetry airtime
* stats in monitor pdev
*/ */
struct cdp_mon_ops { struct cdp_mon_ops {
@@ -1047,6 +1049,13 @@ struct cdp_mon_ops {
QDF_STATUS (*txrx_set_mon_pdev_params_rssi_dbm_conv) QDF_STATUS (*txrx_set_mon_pdev_params_rssi_dbm_conv)
(struct cdp_soc_t *soc, (struct cdp_soc_t *soc,
struct cdp_rssi_db2dbm_param_dp *params); struct cdp_rssi_db2dbm_param_dp *params);
#ifdef WLAN_TELEMETRY_STATS_SUPPORT
/*To update telemetry airtime stats in monitor pdev */
QDF_STATUS (*txrx_update_pdev_mon_telemetry_airtime_stats)
(struct cdp_soc_t *soc,
uint8_t pdev_id);
#endif
}; };
struct cdp_host_stats_ops { struct cdp_host_stats_ops {

View File

@@ -2841,7 +2841,8 @@ struct cdp_pdev_telemetry_stats {
* @tx_mpdu_total: Total tx mpdus * @tx_mpdu_total: Total tx mpdus
* @rx_mpdu_retried: Rx mpdus retried * @rx_mpdu_retried: Rx mpdus retried
* @rx_mpdu_total: Total rx mpdus * @rx_mpdu_total: Total rx mpdus
* @airtime_consumption: airtime consumption of that peer * @tx_airtime_consumption: tx airtime consumption of that peer
* @rx_airtime_consumption: rx airtime consumption of that peer
* @snr: peer average snr * @snr: peer average snr
*/ */
struct cdp_peer_telemetry_stats { struct cdp_peer_telemetry_stats {
@@ -2849,7 +2850,8 @@ struct cdp_peer_telemetry_stats {
uint32_t tx_mpdu_total; uint32_t tx_mpdu_total;
uint32_t rx_mpdu_retried; uint32_t rx_mpdu_retried;
uint32_t rx_mpdu_total; uint32_t rx_mpdu_total;
uint8_t airtime_consumption[WME_AC_MAX]; uint16_t tx_airtime_consumption[WME_AC_MAX];
uint16_t rx_airtime_consumption[WME_AC_MAX];
uint8_t snr; uint8_t snr;
}; };
#endif #endif

View File

@@ -1565,6 +1565,10 @@ struct cdp_mon_ops dp_ops_mon_2_0 = {
#endif #endif
.txrx_set_mon_pdev_params_rssi_dbm_conv = .txrx_set_mon_pdev_params_rssi_dbm_conv =
dp_mon_pdev_params_rssi_dbm_conv, dp_mon_pdev_params_rssi_dbm_conv,
#ifdef WLAN_TELEMETRY_STATS_SUPPORT
.txrx_update_pdev_mon_telemetry_airtime_stats =
dp_pdev_update_telemetry_airtime_stats,
#endif
}; };
#ifdef QCA_MONITOR_OPS_PER_SOC_SUPPORT #ifdef QCA_MONITOR_OPS_PER_SOC_SUPPORT

View File

@@ -2276,7 +2276,7 @@ QDF_STATUS dp_rx_populate_cbf_hdr(struct dp_soc *soc,
#ifdef ATH_SUPPORT_EXT_STAT #ifdef ATH_SUPPORT_EXT_STAT
#ifdef WLAN_TELEMETRY_STATS_SUPPORT #ifdef WLAN_TELEMETRY_STATS_SUPPORT
/** /**
* dp_pdev_clear_link_airtime_stats() - clear pdev airtime stats for given peer * dp_pdev_clear_link_airtime_stats() - clear airtime stats for given pdev
* @pdev: DP PDEV handle * @pdev: DP PDEV handle
*/ */
static inline static inline
@@ -2290,15 +2290,20 @@ void dp_pdev_clear_link_airtime_stats(struct dp_pdev *pdev)
/** /**
* dp_peer_update_telemetry_stats() - update peer telemetry stats * dp_peer_update_telemetry_stats() - update peer telemetry stats
* @soc: Datapath soc
* @peer: Datapath peer * @peer: Datapath peer
* @arg: argument to callback function
*/ */
static inline static inline
void dp_peer_update_telemetry_stats(struct dp_peer *peer) void dp_peer_update_telemetry_stats(struct dp_soc *soc,
struct dp_peer *peer,
void *arg)
{ {
struct dp_pdev *pdev; struct dp_pdev *pdev;
struct dp_vdev *vdev; struct dp_vdev *vdev;
struct dp_mon_peer *mon_peer = NULL; struct dp_mon_peer *mon_peer = NULL;
uint8_t ac; uint8_t ac;
uint64_t current_time = qdf_get_log_timestamp();
vdev = peer->vdev; vdev = peer->vdev;
if (!vdev) if (!vdev)
@@ -2311,8 +2316,13 @@ void dp_peer_update_telemetry_stats(struct dp_peer *peer)
mon_peer = peer->monitor_peer; mon_peer = peer->monitor_peer;
if (qdf_likely(mon_peer)) { if (qdf_likely(mon_peer)) {
for (ac = 0; ac < WME_AC_MAX; ac++) { for (ac = 0; ac < WME_AC_MAX; ac++) {
mon_peer->stats.airtime_consumption[ac].avg_consumption_per_sec = mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].avg_consumption_per_sec =
mon_peer->stats.airtime_consumption[ac].consumption; (uint8_t)qdf_do_div((uint64_t)(mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].consumption * 100),
(uint32_t)(current_time - mon_peer->stats.airtime_stats.last_update_time));
mon_peer->stats.airtime_stats.rx_airtime_consumption[ac].avg_consumption_per_sec =
(uint8_t)qdf_do_div((uint64_t)(mon_peer->stats.airtime_stats.rx_airtime_consumption[ac].consumption * 100),
(uint32_t)(current_time - mon_peer->stats.airtime_stats.last_update_time));
mon_peer->stats.airtime_stats.last_update_time = current_time;
/* Store each peer airtime consumption in pdev /* Store each peer airtime consumption in pdev
* link_airtime to calculate pdev's total airtime * link_airtime to calculate pdev's total airtime
* consumption * consumption
@@ -2320,19 +2330,35 @@ void dp_peer_update_telemetry_stats(struct dp_peer *peer)
DP_STATS_INC( DP_STATS_INC(
pdev, pdev,
telemetry_stats.link_airtime[ac], telemetry_stats.link_airtime[ac],
mon_peer->stats.airtime_consumption[ac].consumption); mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].consumption);
mon_peer->stats.airtime_consumption[ac].consumption = 0; DP_STATS_INC(
pdev,
telemetry_stats.link_airtime[ac],
mon_peer->stats.airtime_stats.rx_airtime_consumption[ac].consumption);
mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].consumption = 0;
mon_peer->stats.airtime_stats.rx_airtime_consumption[ac].consumption = 0;
} }
} }
} }
#else
static inline
void dp_pdev_clear_link_airtime_stats(struct dp_pdev *pdev)
{ }
static inline QDF_STATUS dp_pdev_update_telemetry_airtime_stats(struct cdp_soc_t *soc,
void dp_peer_update_telemetry_stats(struct dp_peer *peer) uint8_t pdev_id)
{ } {
struct dp_pdev *pdev =
dp_get_pdev_from_soc_pdev_id_wifi3(cdp_soc_t_to_dp_soc(soc),
pdev_id);
if (!pdev)
return QDF_STATUS_E_FAILURE;
/* Clear current airtime stats as the below API will increment the stats
* for all peers on top of current value
*/
dp_pdev_clear_link_airtime_stats(pdev);
dp_pdev_iterate_peer(pdev, dp_peer_update_telemetry_stats, NULL,
DP_MOD_ID_CDP);
return QDF_STATUS_SUCCESS;
}
#endif #endif
/** /**
@@ -2351,8 +2377,6 @@ dp_peer_cal_clients_stats_update(struct dp_soc *soc,
struct dp_peer *tgt_peer = NULL; struct dp_peer *tgt_peer = NULL;
struct dp_txrx_peer *txrx_peer = NULL; struct dp_txrx_peer *txrx_peer = NULL;
dp_peer_update_telemetry_stats(peer);
if (!dp_peer_is_primary_link_peer(peer)) if (!dp_peer_is_primary_link_peer(peer))
return; return;
@@ -2381,8 +2405,6 @@ dp_peer_cal_clients_stats_update(struct dp_soc *soc,
struct dp_peer *tgt_peer = NULL; struct dp_peer *tgt_peer = NULL;
struct dp_txrx_peer *txrx_peer = NULL; struct dp_txrx_peer *txrx_peer = NULL;
dp_peer_update_telemetry_stats(peer);
if (!dp_peer_is_primary_link_peer(peer)) if (!dp_peer_is_primary_link_peer(peer))
return; return;
@@ -2410,10 +2432,6 @@ static void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl)
{ {
struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl; struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl;
/* Clear current airtime stats as the below API will increment the stats
* for all peers on top of current value
*/
dp_pdev_clear_link_airtime_stats(pdev);
dp_pdev_iterate_peer(pdev, dp_peer_cal_clients_stats_update, NULL, dp_pdev_iterate_peer(pdev, dp_peer_cal_clients_stats_update, NULL,
DP_MOD_ID_CDP); DP_MOD_ID_CDP);
} }
@@ -4368,7 +4386,7 @@ void dp_ppdu_desc_user_airtime_consumption_update(
return; return;
ac = TID_TO_WME_AC(user->tid); ac = TID_TO_WME_AC(user->tid);
DP_STATS_INC(mon_peer, airtime_consumption[ac].consumption, DP_STATS_INC(mon_peer, airtime_stats.tx_airtime_consumption[ac].consumption,
user->phy_tx_time_us); user->phy_tx_time_us);
} }
#else #else

View File

@@ -897,7 +897,19 @@ struct dp_mon_soc {
#ifdef WLAN_TELEMETRY_STATS_SUPPORT #ifdef WLAN_TELEMETRY_STATS_SUPPORT
struct dp_mon_peer_airtime_consumption { struct dp_mon_peer_airtime_consumption {
uint32_t consumption; uint32_t consumption;
uint32_t avg_consumption_per_sec; uint16_t avg_consumption_per_sec;
};
/**
* struct dp_mon_peer_airtime_stats - Monitor peer airtime stats
* @tx_airtime_consumption: tx artime consumption of peer
* @rx_airtime_consumption: rx airtime consumption of peer
* @last_update_time: Time when last avergae of airtime is done
*/
struct dp_mon_peer_airtime_stats {
struct dp_mon_peer_airtime_consumption tx_airtime_consumption[WME_AC_MAX];
struct dp_mon_peer_airtime_consumption rx_airtime_consumption[WME_AC_MAX];
uint64_t last_update_time;
}; };
#endif #endif
@@ -905,14 +917,14 @@ struct dp_mon_peer_airtime_consumption {
* struct dp_mon_peer_stats - Monitor peer stats * struct dp_mon_peer_stats - Monitor peer stats
* @tx: tx stats * @tx: tx stats
* @rx: rx stats * @rx: rx stats
* @airtime_consumption: airtime consumption per access category * @airtime_stats: mon peer airtime stats
*/ */
struct dp_mon_peer_stats { struct dp_mon_peer_stats {
#ifdef QCA_ENHANCED_STATS_SUPPORT #ifdef QCA_ENHANCED_STATS_SUPPORT
dp_mon_peer_tx_stats tx; dp_mon_peer_tx_stats tx;
dp_mon_peer_rx_stats rx; dp_mon_peer_rx_stats rx;
#ifdef WLAN_TELEMETRY_STATS_SUPPORT #ifdef WLAN_TELEMETRY_STATS_SUPPORT
struct dp_mon_peer_airtime_consumption airtime_consumption[WME_AC_MAX]; struct dp_mon_peer_airtime_stats airtime_stats;
#endif #endif
#endif #endif
}; };
@@ -4415,12 +4427,10 @@ void dp_monitor_peer_telemetry_stats(struct dp_peer *peer,
mon_peer_stats = &peer->monitor_peer->stats; mon_peer_stats = &peer->monitor_peer->stats;
for (ac = 0; ac < WME_AC_MAX; ac++) { for (ac = 0; ac < WME_AC_MAX; ac++) {
/* consumption is in micro seconds, convert it to seconds and stats->tx_airtime_consumption[ac] =
* then calculate %age per sec mon_peer_stats->airtime_stats.tx_airtime_consumption[ac].avg_consumption_per_sec;
*/ stats->rx_airtime_consumption[ac] =
stats->airtime_consumption[ac] = mon_peer_stats->airtime_stats.rx_airtime_consumption[ac].avg_consumption_per_sec;
((mon_peer_stats->airtime_consumption[ac].avg_consumption_per_sec * 100) /
(1000000));
} }
stats->tx_mpdu_retried = mon_peer_stats->tx.retries; stats->tx_mpdu_retried = mon_peer_stats->tx.retries;
stats->tx_mpdu_total = mon_peer_stats->tx.tx_mpdus_tried; stats->tx_mpdu_total = mon_peer_stats->tx.tx_mpdus_tried;
@@ -4500,4 +4510,21 @@ dp_mon_rx_print_advanced_stats(struct dp_soc *soc,
} }
return monitor_ops->mon_rx_print_advanced_stats(soc, pdev); return monitor_ops->mon_rx_print_advanced_stats(soc, pdev);
} }
#ifdef WLAN_TELEMETRY_STATS_SUPPORT
/*
* dp_update_pdev_mon_telemetry_airtime_stats() - update telemetry airtime
* stats in monitor pdev
*
*@soc: dp soc handle
*@pdev_id: pdev id
*
* This API is used to update telemetry airtime stats in monitor pdev
*
* Return: Success if stats are updated, else failure
*/
QDF_STATUS dp_pdev_update_telemetry_airtime_stats(struct cdp_soc_t *soc,
uint8_t pdev_id);
#endif
#endif /* _DP_MON_H_ */ #endif /* _DP_MON_H_ */

View File

@@ -840,7 +840,7 @@ dp_ppdu_desc_user_rx_time_update(struct dp_pdev *pdev,
return; return;
ac = TID_TO_WME_AC(user->tid); ac = TID_TO_WME_AC(user->tid);
DP_STATS_INC(mon_peer, airtime_consumption[ac].consumption, DP_STATS_INC(mon_peer, airtime_stats.rx_airtime_consumption[ac].consumption,
user->rx_time_us); user->rx_time_us);
} }
#else #else