qca-wifi: Add rssi_chain support for peer rate stats

Add rssi_chain support for peer rate stats

CRs-Fixed: 2445933
Change-Id: I98a0bb6e17cfc5ef22a36a1fe632b4dbe2c0d02a
This commit is contained in:
Amir Patel
2019-05-17 15:40:53 +05:30
parent 50d89ab4a6
commit bd3e9bb9b3
4 changed files with 182 additions and 67 deletions

View File

@@ -109,6 +109,7 @@ struct wlan_soc_rate_stats_ctx {
uint32_t rxs_cache_hit;
uint32_t txs_cache_miss;
uint32_t rxs_cache_miss;
bool is_lithium;
};
/**

View File

@@ -26,14 +26,19 @@
#define _DP_RATE_STATS_UAPI_
#define WLANSTATS_CACHE_SIZE 10
#define MAX_RSSI_ANT 4
#define MAX_RSSI_HT 4
#define WLANSTATS_MAX_CHAIN_LEGACY 4
#define WLANSTATS_MAX_BW_LEGACY 4
#define WLANSTATS_MAX_CHAIN 8
#define WLANSTATS_MAX_BW 8
#define WLAN_DATA_TID_MAX 8
#define WLAN_MAC_ADDR_LEN 6
#define WLANSTATS_RSSI_OFFSET 8
#define WLANSTATS_RSSI_MASK 0xff
#define WLANSTATS_RSSI_MAX 0x80
#define INVALID_CACHE_IDX (-1)
#define WLANSTATS_PEER_COOKIE_LSB 32
#define WLANSTATS_COOKIE_PLATFORM_OFFSET 0xFFFFFFFF00000000
#define WLANSTATS_COOKIE_PEER_COOKIE_OFFSET 0x00000000FFFFFFFF
#ifndef __KERNEL__
#define qdf_ewma_tx_lag unsigned long
@@ -88,7 +93,7 @@ struct wlan_rx_rate_stats {
uint32_t num_retries;
uint32_t num_sgi;
qdf_ewma_rx_rssi avg_rssi;
qdf_ewma_rx_rssi avg_rssi_ant[MAX_RSSI_ANT][MAX_RSSI_HT];
qdf_ewma_rx_rssi avg_rssi_ant[WLANSTATS_MAX_CHAIN][WLANSTATS_MAX_BW];
};
/*

View File

@@ -29,16 +29,18 @@
static void
wlan_peer_read_ewma_avg_rssi(struct wlan_rx_rate_stats *rx_stats)
{
uint8_t ant, ht, idx;
uint8_t ant, ht, cache_idx;
for (cache_idx = 0; cache_idx < WLANSTATS_CACHE_SIZE; cache_idx++) {
rx_stats->avg_rssi.internal =
qdf_ewma_rx_rssi_read(&rx_stats->avg_rssi);
for (idx = 0; idx < WLANSTATS_CACHE_SIZE; idx++) {
for (ant = 0; ant < MAX_RSSI_ANT; ant++) {
for (ht = 0; ht < MAX_RSSI_HT; ht++)
for (ant = 0; ant < SS_COUNT; ant++) {
for (ht = 0; ht < MAX_BW; ht++) {
rx_stats->avg_rssi_ant[ant][ht].internal =
qdf_ewma_rx_rssi_read(&rx_stats->avg_rssi_ant[ant][ht]);
qdf_ewma_rx_rssi_read(
&rx_stats->avg_rssi_ant[ant][ht]);
}
}
rx_stats += 1;
}
@@ -56,11 +58,21 @@ wlan_peer_flush_rx_rate_stats(struct wlan_soc_rate_stats_ctx *soc_stats_ctx,
return;
rx_stats = &stats_ctx->rx;
buf.cookie = 0;
wlan_peer_read_ewma_avg_rssi(rx_stats->stats);
buf.stats = (struct wlan_rx_rate_stats *)rx_stats->stats;
buf.buf_len = WLANSTATS_CACHE_SIZE * sizeof(struct wlan_rx_rate_stats);
buf.stats_type = DP_PEER_RX_RATE_STATS;
buf.cookie = stats_ctx->peer_cookie;
/* Prepare 64 bit cookie */
/*-------------------|-------------------|
* 32 bit target | 32 bit peer cookie|
*-------------------|-------------------|
*/
buf.cookie = ((((buf.cookie | soc_stats_ctx->is_lithium)
<< WLANSTATS_PEER_COOKIE_LSB) &
WLANSTATS_COOKIE_PLATFORM_OFFSET) |
(((buf.cookie | stats_ctx->peer_cookie) &
WLANSTATS_COOKIE_PEER_COOKIE_OFFSET)));
qdf_mem_copy(buf.peer_mac, stats_ctx->mac_addr, WLAN_MAC_ADDR_LEN);
cdp_peer_flush_rate_stats(soc_stats_ctx->soc,
stats_ctx->pdev, &buf);
@@ -168,12 +180,13 @@ __wlan_peer_update_rx_rate_stats(struct wlan_rx_rate_stats *__rx_stats,
qdf_ewma_rx_rssi_add(&__rx_stats->avg_rssi, cdp_rx_ppdu->rssi);
for (ant = 0; ant < MAX_RSSI_ANT; ant++) {
for (ht = 0; ht < MAX_RSSI_HT; ht++)
for (ant = 0; ant < SS_COUNT; ant++) {
for (ht = 0; ht < MAX_BW; ht++) {
qdf_ewma_rx_rssi_add(&__rx_stats->avg_rssi_ant[ant][ht],
cdp_rx_ppdu->rssi_chain[ant][ht]);
}
}
}
static void
wlan_peer_update_rx_rate_stats(struct wlan_soc_rate_stats_ctx *soc_stats_ctx,
@@ -280,20 +293,20 @@ wlan_peer_update_tx_rate_stats(struct wlan_soc_rate_stats_ctx *soc_stats_ctx,
ppdu_user->cookie;
if (qdf_unlikely(!stats_ctx)) {
qdf_warn("peer rate stats ctx is NULL, investigate");
qdf_warn("peer_mac: " QDF_MAC_ADDR_STR,
qdf_debug("peer rate stats ctx is NULL, investigate");
qdf_debug("peer_mac: " QDF_MAC_ADDR_STR,
QDF_MAC_ADDR_ARRAY(ppdu_user->mac_addr));
continue;
}
if (qdf_unlikely(!ppdu_user->tx_ratekbps || !ppdu_user->rix ||
ppdu_user->rix > DP_RATE_TABLE_SIZE)) {
continue;
}
tx_stats = &stats_ctx->tx;
RATE_STATS_LOCK_ACQUIRE(&tx_stats->lock);
if (qdf_unlikely(!ppdu_user->tx_ratekbps ||
ppdu_user->rix > DP_RATE_TABLE_SIZE)) {
RATE_STATS_LOCK_RELEASE(&tx_stats->lock);
continue;
}
if (qdf_likely(tx_stats->cur_rix == ppdu_user->rix)) {
__tx_stats = &tx_stats->stats[tx_stats->cur_cache_idx];
__wlan_peer_update_tx_rate_stats(__tx_stats, ppdu_user);

View File

@@ -46,8 +46,11 @@ static void dp_peer_rx_rate_stats_print(uint8_t *peer_mac,
{
int i = 0;
struct wlan_rx_rate_stats *rx_stats;
uint8_t is_lithium;
uint8_t chain, max_chain, bw, max_bw;
struct wlan_rx_rate_stats *tmp_rx_stats;;
rx_stats = (struct wlan_rx_rate_stats *)buffer;
rx_stats = tmp_rx_stats = (struct wlan_rx_rate_stats *)buffer;
PRINT("\n......................................");
PRINT("......................................");
PRINT("PEER %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n",
@@ -57,76 +60,169 @@ static void dp_peer_rx_rate_stats_print(uint8_t *peer_mac,
peer_mac[3],
peer_mac[4],
peer_mac[5]);
PRINT("\tpeer cookie: %016llx\n", peer_cookie);
PRINT("\tpeer cookie: %016llx\n", (peer_cookie & 0xFFFFFFFF00000000)
>> WLANSTATS_PEER_COOKIE_LSB);
is_lithium = (peer_cookie & WLANSTATS_COOKIE_PLATFORM_OFFSET)
>> WLANSTATS_PEER_COOKIE_LSB;
if (is_lithium) {
max_chain = 8;
max_bw = 8;
} else {
max_chain = 4;
max_bw = 4;
}
PRINT("\n..............................................");
PRINT("................................");
PRINT("................................................");
PRINT(".................................\n");
PRINT("\tRx statistics:");
PRINT(" %10s | %10s | %10s | %10s | %10s | %10s",
PRINT(" %10s | %10s | %10s | %10s | %10s | %10s|",
"rate",
"rix",
"bytes",
"msdus",
"mpdus",
"ppdus");
PRINT("\t\t%10s | %10s | %10s | %10s | %10s | %10s |",
PRINT(" %10s | %10s | %10s |",
"retries",
"rssi",
"rssi 1 p20",
"rssi 1 e20",
"rssi 1 e40",
"rssi 1 e80");
PRINT(" | %10s | | %10s | %10s | %10s | %10s | %10s",
"rssi 2 p20",
"rssi 2 e20",
"rssi 2 e40",
"rssi 2 e80",
"rssi 3 p20",
"rssi 3 e20");
PRINT(" | %10s | %10s | %10s | %10s | %10s | %10s\n\n\n",
"rssi 3 e40",
"rssi 3 e80",
"rssi 4 p20",
"rssi 4 e20",
"rssi 4 e40",
"rssi 4 e80");
"sgi",
"rssi\n");
for (i = 0; i < WLANSTATS_CACHE_SIZE; i++) {
if (rx_stats->rix != INVALID_CACHE_IDX) {
PRINT(" %10u | %10u | %10u | %10u | %10u |",
PRINT(" %10u | %10u | %10u | %10u | %10u | %10u |",
rx_stats->rate,
rx_stats->rix,
rx_stats->num_bytes,
rx_stats->num_msdus,
rx_stats->num_mpdus);
PRINT(" %10u | %10u | %10u | %10lu | %10lu |",
rx_stats->num_ppdus,
rx_stats->num_mpdus,
rx_stats->num_ppdus);
PRINT(" %10u | %10u | %10u |\n",
rx_stats->num_retries,
rx_stats->num_sgi,
rx_stats->avg_rssi,
rx_stats->avg_rssi_ant[0][0]);
PRINT(" %10lu | %10lu | %10lu | %10lu | %10lu |",
rx_stats->avg_rssi_ant[0][1],
rx_stats->avg_rssi_ant[0][2],
rx_stats->avg_rssi_ant[0][3],
rx_stats->avg_rssi_ant[1][0],
rx_stats->avg_rssi_ant[1][1]);
PRINT(" %10lu | %10lu | %10lu | %10lu | %10lu |",
rx_stats->avg_rssi_ant[1][2],
rx_stats->avg_rssi_ant[1][3],
rx_stats->avg_rssi_ant[2][0],
rx_stats->avg_rssi_ant[2][1],
rx_stats->avg_rssi_ant[2][2]);
PRINT(" %10lu | %10lu | %10lu | %10lu | %10lu\n\n\n",
rx_stats->avg_rssi_ant[2][3],
rx_stats->avg_rssi_ant[3][0],
rx_stats->avg_rssi_ant[3][1],
rx_stats->avg_rssi_ant[3][2],
rx_stats->avg_rssi_ant[3][3]);
rx_stats->avg_rssi);
}
rx_stats = rx_stats + 1;
}
if (is_lithium) {
PRINT("\n %10s | %10s | %10s | %10s | %10s |",
"rate",
"rssi 1 p20",
"rssi 1 e20",
"rssi 1 e40 low20",
"rssi 1 e40 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 1 ext80 low20",
"rssi 1 ext80 low_high20",
"rssi 1 ext80 high_low20",
"rssi 1 ext80 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 2 p20",
"rssi 2 e20",
"rssi 2 e40 low20",
"rssi 2 e40 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 2 ext80 low20",
"rssi 2 ext80 low_high20",
"rssi 2 ext80 high_low20",
"rssi 2 ext80 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 3 p20",
"rssi 3 e20",
"rssi 3 e40 low20",
"rssi 3 e40 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 3 ext80 low20",
"rssi 3 ext80 low_high20",
"rssi 3 ext80 high_low20",
"rssi 3 ext80 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 4 p20",
"rssi 4 e20",
"rssi 4 e40 low20",
"rssi 4 e40 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 4 ext80 low20",
"rssi 4 ext80 low_high20",
"rssi 4 ext80 high_low20",
"rssi 4 ext80 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 5 p20",
"rssi 5 e20",
"rssi 5 e40 low20",
"rssi 5 e40 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 5 ext80 low20",
"rssi 5 ext80 low_high20",
"rssi 5 ext80 high_low20",
"rssi 5 ext80 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 6 p20",
"rssi 6 e20",
"rssi 6 e40 low20",
"rssi 6 e40 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 6 ext80 low20",
"rssi 6 ext80 low_high20",
"rssi 6 ext80 high_low20",
"rssi 6 ext80 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 7 p20",
"rssi 7 e20",
"rssi 7 e40 low20",
"rssi 7 e40 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 7 ext80 low20",
"rssi 7 ext80 low_high20",
"rssi 7 ext80 high_low20",
"rssi 7 ext80 high20");
PRINT("\n | %10s | %10s | %10s | %10s |",
"rssi 8 p20",
"rssi 8 e20",
"rssi 8 e40 low20",
"rssi 8 e40 high20");
PRINT("\n | %10s | %10s | %10s | %10s |\n\n\n",
"rssi 8 ext80 low20",
"rssi 8 ext80 low_high20",
"rssi 8 ext80 high_low20",
"rssi 8 ext80 high20");
} else {
PRINT("\n %10s | %10s | %10s | %10s | %10s |",
"rate",
"rssi 1 p20",
"rssi 1 e20",
"rssi 1 e40",
"rssi 1 e80");
PRINT(" | %10s | %10s | %10s | %10s |",
"rssi 2 p20",
"rssi 2 e20",
"rssi 2 e40",
"rssi 2 e80");
PRINT(" | %10s | %10s | %10s | %10s |",
"rssi 3 p20",
"rssi 3 e20",
"rssi 3 e40",
"rssi 3 e80");
PRINT(" | %10s | %10s | %10s | %10s |\n\n\n",
"rssi 4 p20",
"rssi 4 e20",
"rssi 4 e40",
"rssi 4 e80");
}
for (i = 0; i < WLANSTATS_CACHE_SIZE; i++) {
if (tmp_rx_stats->rix != INVALID_CACHE_IDX) {
printf(" %10u |", tmp_rx_stats->rate);
for (chain = 0; chain < max_chain; chain++) {
for (bw = 0; bw < max_bw; bw++) {
printf(" %10d |",
tmp_rx_stats->avg_rssi_ant[chain][bw]);
}
printf(" \n\t ");
}
PRINT("");
}
tmp_rx_stats = tmp_rx_stats + 1;
}
}
static void