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:

committed by
Madan Koyyalamudi

parent
c50244f2b8
commit
87cf6b8b07
@@ -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
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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_ */
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user