summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c22
-rw-r--r--CORE/MAC/inc/sirApi.h7
-rw-r--r--CORE/SERVICES/WMA/wma.c22
3 files changed, 45 insertions, 6 deletions
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 05dd0c1dc2d8..5b7efd129ef4 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -6756,16 +6756,18 @@ static int put_wifi_channel_cca_info(struct sir_wifi_chan_cca_stats *cca,
static int put_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 == NULL)
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)) {
hddLog(LOGE, FL("QCA_WLAN_VENDOR_ATTR put fail"));
return -EINVAL;
}
@@ -6777,7 +6779,7 @@ static int put_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 == NULL) {
@@ -6785,12 +6787,24 @@ static int put_wifi_signal_info(struct sir_wifi_peer_signal_stats *peer_signal,
return -EINVAL;
}
+ hddLog(LOG2,
+ FL("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])) {
hddLog(VOS_TRACE_LEVEL_ERROR,
FL("QCA_WLAN_VENDOR_ATTR put fail"));
return -EINVAL;
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index aa7abc3a3d87..5a4c2405da8d 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -6445,6 +6445,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;
@@ -6455,6 +6458,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/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 27528445f64c..92687b95a9a3 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -5813,9 +5813,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_LOGI("%d antennas for peer %d",
+ wmi_peer_signal->num_chains_valid,
+ wmi_peer_signal->peer_id);
if (dst_len <= result_size) {
- vos_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;
+ vos_mem_copy(peer_signal->per_ant_snr,
+ wmi_peer_signal->per_chain_snr,
+ sizeof(peer_signal->per_ant_snr));
+ vos_mem_copy(peer_signal->nf,
+ wmi_peer_signal->per_chain_nf,
+ sizeof(peer_signal->nf));
+ vos_mem_copy(peer_signal->per_ant_rx_mpdus,
+ wmi_peer_signal->per_antenna_rx_mpdus,
+ sizeof(peer_signal->per_ant_rx_mpdus));
+ vos_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."));
@@ -5837,6 +5854,7 @@ static int wma_ll_stats_evt_handler(void *handle, u_int8_t *event,
peer->mac_addr.raw[2], peer->mac_addr.raw[3],
peer->mac_addr.raw[4], peer->mac_addr.raw[5]);
}
+ wmi_peer_signal++;
}
result += peer_num * sizeof(struct sir_wifi_ll_ext_peer_stats);