|
@@ -2170,6 +2170,10 @@ void dp_peer_update_telemetry_stats(struct dp_soc *soc,
|
|
|
struct dp_mon_peer *mon_peer = NULL;
|
|
|
uint8_t ac;
|
|
|
uint64_t current_time = qdf_get_log_timestamp();
|
|
|
+ uint32_t remn, time_diff, usage;
|
|
|
+ uint16_t usage_per_sec;
|
|
|
+ struct dp_mon_peer_airtime_stats *stat_airtime;
|
|
|
+ struct dp_mon_peer_airtime_consumption *consump;
|
|
|
|
|
|
vdev = peer->vdev;
|
|
|
if (!vdev)
|
|
@@ -2181,29 +2185,57 @@ void dp_peer_update_telemetry_stats(struct dp_soc *soc,
|
|
|
|
|
|
mon_peer = peer->monitor_peer;
|
|
|
if (qdf_likely(mon_peer)) {
|
|
|
+ stat_airtime = &mon_peer->stats.airtime_stats;
|
|
|
+ time_diff = (uint32_t)(current_time -
|
|
|
+ stat_airtime->last_update_time);
|
|
|
for (ac = 0; ac < WME_AC_MAX; ac++) {
|
|
|
- mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].avg_consumption_per_sec =
|
|
|
- (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));
|
|
|
+ consump = &stat_airtime->tx_airtime_consumption[ac];
|
|
|
+ usage = consump->consumption;
|
|
|
+ usage_per_sec = (uint8_t)qdf_do_div((uint64_t)
|
|
|
+ (usage * 100), time_diff);
|
|
|
+ remn = qdf_do_div_rem((uint64_t)
|
|
|
+ (usage * 100), time_diff);
|
|
|
+ if (remn < time_diff / 2) {
|
|
|
+ if (remn && usage_per_sec == 0)
|
|
|
+ usage_per_sec++;
|
|
|
+ } else {
|
|
|
+ if (usage_per_sec < 100)
|
|
|
+ usage_per_sec++;
|
|
|
+ }
|
|
|
+ consump->avg_consumption_per_sec = usage_per_sec;
|
|
|
+ /* Store each peer airtime consumption in pdev
|
|
|
+ * link_airtime to calculate pdev's total airtime
|
|
|
+ * consumption
|
|
|
+ */
|
|
|
+ DP_STATS_INC(pdev,
|
|
|
+ telemetry_stats.link_airtime[ac],
|
|
|
+ consump->consumption);
|
|
|
+ consump->consumption = 0;
|
|
|
+
|
|
|
+ consump = &stat_airtime->rx_airtime_consumption[ac];
|
|
|
+ usage = consump->consumption;
|
|
|
+ usage_per_sec = (uint8_t)qdf_do_div((uint64_t)
|
|
|
+ (usage * 100), time_diff);
|
|
|
+ remn = qdf_do_div_rem((uint64_t)
|
|
|
+ (usage * 100), time_diff);
|
|
|
+ if (remn < time_diff / 2) {
|
|
|
+ if (remn && usage_per_sec == 0)
|
|
|
+ usage_per_sec++;
|
|
|
+ } else {
|
|
|
+ if (usage_per_sec < 100)
|
|
|
+ usage_per_sec++;
|
|
|
+ }
|
|
|
+ consump->avg_consumption_per_sec = usage_per_sec;
|
|
|
/* Store each peer airtime consumption in pdev
|
|
|
* link_airtime to calculate pdev's total airtime
|
|
|
* consumption
|
|
|
*/
|
|
|
- DP_STATS_INC(
|
|
|
- pdev,
|
|
|
- telemetry_stats.link_airtime[ac],
|
|
|
- mon_peer->stats.airtime_stats.tx_airtime_consumption[ac].consumption);
|
|
|
- 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;
|
|
|
+ DP_STATS_INC(pdev,
|
|
|
+ telemetry_stats.link_airtime[ac],
|
|
|
+ consump->consumption);
|
|
|
+ consump->consumption = 0;
|
|
|
}
|
|
|
- mon_peer->stats.airtime_stats.last_update_time = current_time;
|
|
|
+ stat_airtime->last_update_time = current_time;
|
|
|
}
|
|
|
}
|
|
|
|