From 396a973271e01aa6ef0415d3865a0de3bde6a2e1 Mon Sep 17 00:00:00 2001 From: stonez Date: Wed, 16 Jan 2019 12:29:16 +0800 Subject: [PATCH] qcacld-3.0: Get evm inforation of each antenna in groups User layer need to get evm info of each groups of antenna. Host first get this info by WMI command and then transfer it to user layer by netlink. Change-Id: I6e15b85962d06718799f91b86f07ddd8762adb5c CRs-Fixed: 2381569 --- core/hdd/src/wlan_hdd_cfg80211.c | 16 ++++++++++++---- core/mac/inc/sir_api.h | 2 ++ core/wma/src/wma_features.c | 25 +++++++++++++++++-------- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 5a142bc98204..7237cbffc0c4 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -11446,6 +11446,7 @@ static int hdd_post_get_chain_rssi_rsp(struct hdd_context *hdd_ctx, skb = cfg80211_vendor_cmd_alloc_reply_skb(hdd_ctx->wiphy, (sizeof(result->chain_rssi) + NLA_HDRLEN) + + (sizeof(result->chain_evm) + NLA_HDRLEN) + (sizeof(result->ant_id) + NLA_HDRLEN) + NLMSG_HDRLEN); @@ -11455,15 +11456,22 @@ static int hdd_post_get_chain_rssi_rsp(struct hdd_context *hdd_ctx, } if (nla_put(skb, QCA_WLAN_VENDOR_ATTR_CHAIN_RSSI, - sizeof(result->chain_rssi), - result->chain_rssi)) { + sizeof(result->chain_rssi), + result->chain_rssi)) { + hdd_err("put fail"); + goto nla_put_failure; + } + + if (nla_put(skb, QCA_WLAN_VENDOR_ATTR_CHAIN_EVM, + sizeof(result->chain_evm), + result->chain_evm)) { hdd_err("put fail"); goto nla_put_failure; } if (nla_put(skb, QCA_WLAN_VENDOR_ATTR_ANTENNA_INFO, - sizeof(result->ant_id), - result->ant_id)) { + sizeof(result->ant_id), + result->ant_id)) { hdd_err("put fail"); goto nla_put_failure; } diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 3843b71dbda7..dace34f03471 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -5989,12 +5989,14 @@ struct sir_rssi_disallow_lst { * struct chain_rssi_result - chain rssi result * num_chains_valid: valid chain num * @chain_rssi: chain rssi result as dBm unit + * @chain_evm: error vector magnitude * @ant_id: antenna id */ #define CHAIN_MAX_NUM 8 struct chain_rssi_result { uint32_t num_chains_valid; uint32_t chain_rssi[CHAIN_MAX_NUM]; + int32_t chain_evm[CHAIN_MAX_NUM]; uint32_t ant_id[CHAIN_MAX_NUM]; }; diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 89d1730111ea..2b3d0d403fc0 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -5535,6 +5535,8 @@ int wma_pdev_div_info_evt_handler(void *handle, u_int8_t *event_buf, return -EINVAL; } + qdf_mem_zero(&chain_rssi_result, sizeof(chain_rssi_result)); + WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->macaddr, macaddr); WMA_LOGD(FL("macaddr: " MAC_ADDRESS_STR), MAC_ADDR_ARRAY(macaddr)); @@ -5542,25 +5544,32 @@ int wma_pdev_div_info_evt_handler(void *handle, u_int8_t *event_buf, chain_rssi_result.num_chains_valid = event->num_chains_valid; qdf_mem_copy(chain_rssi_result.chain_rssi, event->chain_rssi, - sizeof(event->chain_rssi)); - for (i = 0; i < event->num_chains_valid; i++) { - WMA_LOGD(FL("chain_rssi: %d, ant_id: %d"), - event->chain_rssi[i], event->ant_id[i]); + sizeof(event->chain_rssi)); + + qdf_mem_copy(chain_rssi_result.chain_evm, event->chain_evm, + sizeof(event->chain_evm)); + + qdf_mem_copy(chain_rssi_result.ant_id, event->ant_id, + sizeof(event->ant_id)); + + for (i = 0; i < chain_rssi_result.num_chains_valid; i++) { + WMA_LOGD(FL("chain_rssi: %d, chain_evm: %d,ant_id: %d"), + chain_rssi_result.chain_rssi[i], + chain_rssi_result.chain_evm[i], + chain_rssi_result.ant_id[i]); + if (!wmi_service_enabled(wma->wmi_handle, wmi_service_hw_db2dbm_support)) { if (chain_rssi_result.chain_rssi[i] != WMA_INVALID_PER_CHAIN_SNR) chain_rssi_result.chain_rssi[i] += - WMA_TGT_NOISE_FLOOR_DBM; + WMA_TGT_NOISE_FLOOR_DBM; else chain_rssi_result.chain_rssi[i] = WMA_INVALID_PER_CHAIN_RSSI; } } - qdf_mem_copy(chain_rssi_result.ant_id, event->ant_id, - sizeof(event->ant_id)); - pmac->sme.get_chain_rssi_cb(pmac->sme.get_chain_rssi_context, &chain_rssi_result);