qcacmn: Add support for link airtime usage telemetry

Add support for link airtime usage telemetry.

Change-Id: I8b796f14d55d56051fb05af255e612e4655db990
CRs-Fixed: 3281355
This commit is contained in:
Himanshu Batra
2022-09-01 17:37:28 +05:30
committad av Madan Koyyalamudi
förälder 6a5ab907c1
incheckning f147732272
4 ändrade filer med 44 tillägg och 20 borttagningar

Visa fil

@@ -2051,6 +2051,18 @@ QDF_STATUS dp_rx_populate_cbf_hdr(struct dp_soc *soc,
#ifdef ATH_SUPPORT_EXT_STAT
#ifdef WLAN_TELEMETRY_STATS_SUPPORT
/* dp_pdev_clear_link_airtime_stats- clear pdev airtime stats for current index
* @peer : Datapath peer
*/
static inline
void dp_pdev_clear_link_airtime_stats(struct dp_pdev *pdev)
{
uint8_t ac;
for (ac = 0; ac < WME_AC_MAX; ac++)
pdev->stats.telemetry_stats.link_airtime[ac] = 0;
}
/* dp_peer_update_telemetry_stats- update peer telemetry stats
* @peer : Datapath peer
*/
@@ -2060,7 +2072,7 @@ void dp_peer_update_telemetry_stats(struct dp_peer *peer)
struct dp_pdev *pdev;
struct dp_vdev *vdev;
struct dp_mon_peer *mon_peer = NULL;
uint8_t idx, ac;
uint8_t ac;
vdev = peer->vdev;
if (!vdev)
@@ -2077,18 +2089,25 @@ void dp_peer_update_telemetry_stats(struct dp_peer *peer)
DP_STATS_INC(pdev, telemetry_stats.tx_mpdu_total,
mon_peer->stats.tx.tx_mpdus_tried);
for (ac = 0; ac < WME_AC_MAX; ac++) {
idx = mon_peer->stats.airtime_consumption[ac].avg_consumption.idx;
mon_peer->stats.airtime_consumption[ac].avg_consumption.avg_consumption_per_sec[idx] =
mon_peer->stats.airtime_consumption[ac].avg_consumption_per_sec =
mon_peer->stats.airtime_consumption[ac].consumption;
/* 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_consumption[ac].consumption);
mon_peer->stats.airtime_consumption[ac].consumption = 0;
mon_peer->stats.airtime_consumption[ac].avg_consumption.idx++;
if (mon_peer->stats.airtime_consumption[ac].avg_consumption.idx ==
MAX_CONSUMPTION_TIME)
mon_peer->stats.airtime_consumption[ac].avg_consumption.idx = 0;
}
}
}
#else
static inline
void dp_pdev_clear_link_airtime_stats(struct dp_pdev *pdev)
{ }
static inline
void dp_peer_update_telemetry_stats(struct dp_peer *peer)
{ }
@@ -2167,6 +2186,10 @@ static void dp_iterate_update_peer_list(struct cdp_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_MOD_ID_CDP);
}

Visa fil

@@ -885,13 +885,9 @@ struct dp_mon_soc {
};
#ifdef WLAN_TELEMETRY_STATS_SUPPORT
#define MAX_CONSUMPTION_TIME 5 /* in sec */
struct dp_mon_peer_airtime_consumption {
uint32_t consumption;
struct {
uint32_t avg_consumption_per_sec[MAX_CONSUMPTION_TIME];
uint8_t idx;
} avg_consumption;
uint32_t avg_consumption_per_sec;
};
#endif
@@ -4239,23 +4235,19 @@ void dp_monitor_peer_telemetry_stats(struct dp_peer *peer,
struct cdp_peer_telemetry_stats *stats)
{
struct dp_mon_peer_stats *mon_peer_stats = NULL;
uint8_t idx = 0, ac;
uint32_t consumption = 0;
uint8_t ac;
if (qdf_unlikely(!peer->monitor_peer))
return;
mon_peer_stats = &peer->monitor_peer->stats;
for (ac = 0; ac < WME_AC_MAX; ac++) {
consumption = 0;
for (idx = 0; idx < MAX_CONSUMPTION_TIME; idx++)
consumption +=
mon_peer_stats->airtime_consumption[ac].avg_consumption.avg_consumption_per_sec[idx];
/* consumption is in micro seconds, convert it to seconds and
* then calculate %age per 5 sec
* then calculate %age per sec
*/
stats->airtime_consumption[ac] =
((consumption * 100) / (MAX_CONSUMPTION_TIME * 1000000));
((mon_peer_stats->airtime_consumption[ac].avg_consumption_per_sec * 100) /
(1000000));
}
stats->tx_mpdu_retried = mon_peer_stats->tx.retries;
stats->tx_mpdu_total = mon_peer_stats->tx.tx_mpdus_tried;