diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2017-04-14 10:11:33 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-04-14 10:11:33 -0700 |
| commit | 98e0ac4e34172d70ff142b60f80df96aebb3807d (patch) | |
| tree | d99ec65fb8f61128a058a976396ef1bea1da1cd7 | |
| parent | d267bed292479fb023b8824427643558267f0950 (diff) | |
| parent | 40670bfa32183215f07111796213a79e53869f27 (diff) | |
Merge "qcacld-2.0: Export antenna diversity key parameters to userspace" into wlan-cld2.driver.lnx.1.0-dev
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg80211.h | 14 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg80211.c | 76 | ||||
| -rw-r--r-- | CORE/SERVICES/WMI/wmi_unified_priv.h | 16 |
3 files changed, 105 insertions, 1 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h index b4ddc2e8768b..afc39aed9c30 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg80211.h +++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h @@ -1749,6 +1749,20 @@ enum qca_wlan_vendor_config { QCA_WLAN_VENDOR_ATTR_CONFIG_RX_BLOCKSIZE_PEER_MAC = 35, QCA_WLAN_VENDOR_ATTR_CONFIG_RX_BLOCKSIZE_WINLIMIT = 36, QCA_WLAN_VENDOR_ATTR_CONFIG_SUB20_CHAN_WIDTH = 39, + /* 32-bit unsigned value to set probe period*/ + QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_PROBE_PERIOD = 41, + /* 32-bit unsigned value to set stay period*/ + QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_STAY_PERIOD = 42, + /* 32-bit unsigned value to set snr diff*/ + QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_SNR_DIFF = 43, + /* 32-bit unsigned value to set probe dewll time*/ + QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_PROBE_DWELL_TIME = 44, + /* 32-bit unsigned value to set mgmt snr weight*/ + QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_MGMT_SNR_WEIGHT = 45, + /* 32-bit unsigned value to set data snr weight*/ + QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_DATA_SNR_WEIGHT = 46, + /* 32-bit unsigned value to set ack snr weight*/ + QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_ACK_SNR_WEIGHT = 47, /* keep last */ QCA_WLAN_VENDOR_ATTR_CONFIG_LAST, diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index 238442d87878..2905958e89c6 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -112,6 +112,8 @@ #include "sapApi.h" #include "csrApi.h" +#include "wmi_unified_priv.h" + #define g_mode_rates_size (12) #define a_mode_rates_size (8) #define FREQ_BASE_80211G (2407) @@ -9808,6 +9810,7 @@ static int __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, int access_policy = 0; char vendor_ie[SIR_MAC_MAX_IE_LENGTH + 2]; bool vendor_ie_present = false, access_policy_present = false; + uint32_t ant_div_usrcfg; if (VOS_FTM_MODE == hdd_get_conparam()) { hddLog(LOGE, FL("Command not allowed in FTM mode")); @@ -10267,6 +10270,79 @@ static int __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, hdd_sta_set_sub20_channelwidth(pAdapter, sub20_chan_width); } + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_PROBE_PERIOD] || + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_STAY_PERIOD]) { + + if (!tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_PROBE_PERIOD] || + !tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_STAY_PERIOD]) { + hddLog(LOGE, FL("Both probe and stay period required")); + return -EINVAL; + } + + ant_div_usrcfg = ANT_DIV_SET_PERIOD( + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_PROBE_PERIOD]), + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_STAY_PERIOD])); + hddLog(LOG1, FL("ant div set period: %x"), ant_div_usrcfg); + ret_val = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_ANT_DIV_USRCFG, + ant_div_usrcfg, PDEV_CMD); + if (ret_val) { + hddLog(LOG1, FL("Failed to set ant div period")); + return ret_val; + } + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_SNR_DIFF]) { + ant_div_usrcfg = ANT_DIV_SET_SNR_DIFF( + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_SNR_DIFF])); + hddLog(LOG1, FL("ant div set snr diff: %x"), ant_div_usrcfg); + ret_val = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_ANT_DIV_USRCFG, + ant_div_usrcfg, PDEV_CMD); + if (ret_val) { + hddLog(LOG1, FL("Failed to set ant snr diff")); + return ret_val; + } + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_PROBE_DWELL_TIME]) { + ant_div_usrcfg = ANT_DIV_SET_PROBE_DWELL_TIME( + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_PROBE_DWELL_TIME])); + hddLog(LOG1, FL("ant div set probe dewll time: %x"), ant_div_usrcfg); + ret_val = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_ANT_DIV_USRCFG, + ant_div_usrcfg, PDEV_CMD); + if (ret_val) { + hddLog(LOG1, FL("Failed to set ant div probe dewll time")); + return ret_val; + } + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_MGMT_SNR_WEIGHT] || + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_DATA_SNR_WEIGHT] || + tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_ACK_SNR_WEIGHT]) { + + if (!tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_MGMT_SNR_WEIGHT] || + !tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_DATA_SNR_WEIGHT] || + !tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_ACK_SNR_WEIGHT]) { + hddLog(LOGE, FL("Mgmt snr, data snr and ack snr weight are required")); + return -EINVAL; + } + + ant_div_usrcfg = ANT_DIV_SET_WEIGHT( + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_MGMT_SNR_WEIGHT]), + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_DATA_SNR_WEIGHT]), + nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_ANT_DIV_ACK_SNR_WEIGHT])); + hddLog(LOG1, FL("ant div set weight: %x"), ant_div_usrcfg); + ret_val = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_ANT_DIV_USRCFG, + ant_div_usrcfg, PDEV_CMD); + if (ret_val) { + hddLog(LOG1, FL("Failed to set ant div weight")); + return ret_val; + } + } + return ret_val; } diff --git a/CORE/SERVICES/WMI/wmi_unified_priv.h b/CORE/SERVICES/WMI/wmi_unified_priv.h index 5a43e3fb299d..1a198a18f691 100644 --- a/CORE/SERVICES/WMI/wmi_unified_priv.h +++ b/CORE/SERVICES/WMI/wmi_unified_priv.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -98,4 +98,18 @@ struct wmi_unified { A_BOOL tag_crash_inject; void (*wma_wow_tx_complete_cbk)(ol_scn_t scn_handle); }; + +#define ANT_DIV_SET_PERIOD(probe_period, stay_period) \ + ((1<<26)|((probe_period&0x1fff)<<13)|(stay_period&0x1fff)) + +#define ANT_DIV_SET_SNR_DIFF(snr_diff) \ + ((1<<27)|(snr_diff&0x1fff)) + +#define ANT_DIV_SET_PROBE_DWELL_TIME(probe_dwell_time) \ + ((1<<28)|(probe_dwell_time&0x1fff)) + +#define ANT_DIV_SET_WEIGHT(mgmt_snr_weight, data_snr_weight, ack_snr_weight) \ + ((1<<29)|((mgmt_snr_weight&0xff)<<16)|((data_snr_weight&0xff)<<8)| \ + (ack_snr_weight&0xff)) + #endif |
