summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-04-14 10:11:33 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-04-14 10:11:33 -0700
commit98e0ac4e34172d70ff142b60f80df96aebb3807d (patch)
treed99ec65fb8f61128a058a976396ef1bea1da1cd7
parentd267bed292479fb023b8824427643558267f0950 (diff)
parent40670bfa32183215f07111796213a79e53869f27 (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.h14
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c76
-rw-r--r--CORE/SERVICES/WMI/wmi_unified_priv.h16
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