From 303ebe9dbf745ef1a72ad41af54e16b7a74e25c2 Mon Sep 17 00:00:00 2001 From: Zhang Qian Date: Thu, 18 May 2017 13:59:07 +0800 Subject: [PATCH] qcacld-3.0: Add mac counters for per-antenna TX/RX stats qcacld-2.0 to qcacld-3.0 propagation New MAC counters are added to count MPDUs received and transferred on each antenna. Change-Id: Ia7fbf7642922f006882619848459192dcfca3c40 CRs-Fixed: 2043156 --- core/hdd/src/wlan_hdd_stats.c | 21 +++++++++++++++++---- core/mac/inc/sir_api.h | 7 +++++++ core/wma/src/wma_utils.c | 21 +++++++++++++++++++-- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/core/hdd/src/wlan_hdd_stats.c b/core/hdd/src/wlan_hdd_stats.c index b29e56b2b474..f96a2e0e6f2c 100644 --- a/core/hdd/src/wlan_hdd_stats.c +++ b/core/hdd/src/wlan_hdd_stats.c @@ -1855,16 +1855,18 @@ static int hdd_populate_wifi_signal_info(struct sir_wifi_peer_signal_stats *peer_signal, struct sk_buff *skb) { - uint32_t i; + uint32_t i, chain_count; struct nlattr *chains, *att; /* There might be no signal info for a peer */ if (!peer_signal) return 0; + chain_count = peer_signal->num_chain < WIFI_MAX_CHAINS ? + peer_signal->num_chain : WIFI_MAX_CHAINS; if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_PEER_ANT_NUM, - WIFI_MAX_CHAINS)) { + chain_count)) { hdd_err("QCA_WLAN_VENDOR_ATTR put fail"); return -EINVAL; } @@ -1876,7 +1878,7 @@ hdd_populate_wifi_signal_info(struct sir_wifi_peer_signal_stats *peer_signal, return -EINVAL; } - for (i = 0; i < WIFI_MAX_CHAINS; i++) { + for (i = 0; i < chain_count; i++) { chains = nla_nest_start(skb, i); if (!chains) { @@ -1884,12 +1886,23 @@ hdd_populate_wifi_signal_info(struct sir_wifi_peer_signal_stats *peer_signal, return -EINVAL; } + hdd_debug("SNR=%d, NF=%d, Rx=%d, Tx=%d", + peer_signal->per_ant_snr[i], + peer_signal->nf[i], + peer_signal->per_ant_rx_mpdus[i], + peer_signal->per_ant_tx_mpdus[i]); if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_ANT_SNR, peer_signal->per_ant_snr[i]) || nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_ANT_NF, - peer_signal->nf[i])) { + peer_signal->nf[i]) || + nla_put_u32(skb, + QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_RX_MPDU, + peer_signal->per_ant_rx_mpdus[i]) || + nla_put_u32(skb, + QCA_WLAN_VENDOR_ATTR_LL_STATS_EXT_TX_MPDU, + peer_signal->per_ant_tx_mpdus[i])) { hdd_err("QCA_WLAN_VENDOR_ATTR put fail"); return -EINVAL; } diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 6e6a0dbfd4a3..bfe2ce0a94f7 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -5225,6 +5225,9 @@ struct sir_wifi_chan_cca_stats { * @peer_id: peer ID * @per_ant_snr: per antenna SNR * @nf: peer background noise + * @per_ant_rx_mpdus: MPDUs received per antenna + * @per_ant_tx_mpdus: MPDUs transferred per antenna + * @num_chain: valid chain count */ struct sir_wifi_peer_signal_stats { uint32_t vdev_id; @@ -5235,6 +5238,10 @@ struct sir_wifi_peer_signal_stats { /* Background noise */ int32_t nf[WIFI_MAX_CHAINS]; + + int32_t per_ant_rx_mpdus[WIFI_MAX_CHAINS]; + int32_t per_ant_tx_mpdus[WIFI_MAX_CHAINS]; + int32_t num_chain; }; #define WIFI_VDEV_NUM 4 diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index 4959f461a71a..7473d75d5462 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -1064,9 +1064,26 @@ static int wma_ll_stats_evt_handler(void *handle, u_int8_t *event, peer_stats[i].vdev_id = wmi_peer_signal->vdev_id; peer_signal = &peer_stats[i].peer_signal_stats; + WMA_LOGD("%d antennas for peer %d", + wmi_peer_signal->num_chains_valid, + wmi_peer_signal->peer_id); if (dst_len <= result_size) { - qdf_mem_copy(peer_signal, - &wmi_peer_signal->vdev_id, dst_len); + peer_signal->vdev_id = wmi_peer_signal->vdev_id; + peer_signal->peer_id = wmi_peer_signal->peer_id; + peer_signal->num_chain = + wmi_peer_signal->num_chains_valid; + qdf_mem_copy(peer_signal->per_ant_snr, + wmi_peer_signal->per_chain_snr, + sizeof(peer_signal->per_ant_snr)); + qdf_mem_copy(peer_signal->nf, + wmi_peer_signal->per_chain_nf, + sizeof(peer_signal->nf)); + qdf_mem_copy(peer_signal->per_ant_rx_mpdus, + wmi_peer_signal->per_antenna_rx_mpdus, + sizeof(peer_signal->per_ant_rx_mpdus)); + qdf_mem_copy(peer_signal->per_ant_tx_mpdus, + wmi_peer_signal->per_antenna_tx_mpdus, + sizeof(peer_signal->per_ant_tx_mpdus)); result_size -= dst_len; } else { WMA_LOGE(FL("Invalid length of PEER signal."));