summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorRachit Kankane <rkankane@codeaurora.org>2020-05-11 19:39:12 +0530
committerIsaac Chiou <isaacchiou@google.com>2020-05-27 18:52:26 +0800
commit3727ef88a20e7a7055674428a0de8c92e0a1da9b (patch)
treead1b2bea3a672f1daf4428740b9b1a1c3ab64560 /core
parentfbe1b2e08bee9407069da02c5ec3286bb6fd7046 (diff)
downloadqcacld-3727ef88a20e7a7055674428a0de8c92e0a1da9b.tar.gz
qcacld-3.0: Handle tx_power_level under radio stat
Host driver do receives radio tx power level stats as part of radio stats even though we have different event ID for that. Handling the tx_power_level as part of radio stats only if num_tx_power_level is set. Bug: 155942196 Change-Id: I46aff51c70c444c94c9b10f32b7776ba4a1ca4e8 CRs-Fixed: 2686882
Diffstat (limited to 'core')
-rw-r--r--core/hdd/src/wlan_hdd_stats.c43
1 files changed, 40 insertions, 3 deletions
diff --git a/core/hdd/src/wlan_hdd_stats.c b/core/hdd/src/wlan_hdd_stats.c
index 534b057b67..1947559c0e 100644
--- a/core/hdd/src/wlan_hdd_stats.c
+++ b/core/hdd/src/wlan_hdd_stats.c
@@ -885,15 +885,22 @@ static int hdd_llstats_post_radio_stats(hdd_adapter_t *adapter,
QCA_WLAN_VENDOR_ATTR_LL_STATS_RADIO_NUM_CHANNELS,
radiostat->numChannels)) {
hdd_err("QCA_WLAN_VENDOR_ATTR put fail");
+
goto failure;
}
if (radiostat->total_num_tx_power_levels) {
- if (nla_put(vendor_event,
+ ret =
+ nla_put(vendor_event,
QCA_WLAN_VENDOR_ATTR_LL_STATS_RADIO_TX_TIME_PER_LEVEL,
sizeof(u32) *
radiostat->total_num_tx_power_levels,
- radiostat->tx_time_per_power_level)) {
+ radiostat->tx_time_per_power_level);
+ qdf_mem_free(radiostat->tx_time_per_power_level);
+ radiostat->tx_time_per_power_level = NULL;
+ if (ret) {
+ qdf_mem_free(radiostat->channels);
+ radiostat->channels = NULL;
hdd_err("nla_put fail");
goto failure;
}
@@ -992,7 +999,7 @@ static void hdd_process_ll_stats(tSirLLStatsResults *results,
if (results->paramId & WMI_LINK_STATS_RADIO) {
tpSirWifiRadioStat rs_results, stat_result;
- u64 channel_size = 0;
+ u64 channel_size = 0, pwr_lvl_size = 0;
int i;
stats = qdf_mem_malloc(sizeof(*stats));
if (!stats)
@@ -1011,13 +1018,40 @@ static void hdd_process_ll_stats(tSirLLStatsResults *results,
for (i = 0; i < results->num_radio; i++) {
channel_size = rs_results->numChannels *
sizeof(tSirWifiChannelStats);
+ pwr_lvl_size = sizeof(uint32_t) *
+ rs_results->total_num_tx_power_levels;
+
+ if (rs_results->total_num_tx_power_levels &&
+ rs_results->tx_time_per_power_level) {
+ stat_result->tx_time_per_power_level =
+ qdf_mem_malloc(pwr_lvl_size);
+ if (!stat_result->tx_time_per_power_level) {
+ while (i-- > 0) {
+ stat_result--;
+ qdf_mem_free(stat_result->
+ tx_time_per_power_level);
+ qdf_mem_free(stat_result->
+ channels);
+ }
+ qdf_mem_free(stat_result);
+ qdf_mem_free(stats);
+ goto exit;
+ }
+ qdf_mem_copy(stat_result->tx_time_per_power_level,
+ rs_results->tx_time_per_power_level,
+ pwr_lvl_size);
+ }
if (channel_size) {
stat_result->channels =
qdf_mem_malloc(channel_size);
if (!stat_result->channels) {
+ qdf_mem_free(stat_result->
+ tx_time_per_power_level);
while (i-- > 0) {
stat_result--;
qdf_mem_free(stat_result->
+ tx_time_per_power_level);
+ qdf_mem_free(stat_result->
channels);
}
qdf_mem_free(stats->result);
@@ -1390,6 +1424,9 @@ static void wlan_hdd_handle_ll_stats(hdd_adapter_t *adapter,
for (i = 0; i < num_radio; i++) {
if (radio_stat->numChannels)
qdf_mem_free(radio_stat->channels);
+ if (radio_stat->total_num_tx_power_levels)
+ qdf_mem_free(radio_stat->
+ tx_time_per_power_level);
radio_stat++;
}
return;