Browse Source

qcacld-3.0: Add support for changing FTM capability during runtime

Add VENDOR subcmd to support changing of Fine Time Measurement
capability
dynamically. This command can be used by user space application to
change
FTM capability. FTM capability set by user space is intersected with
capability set by firmware to compute new capability value.

Change-Id: I5f3a57e66f2c6a9f3fa8acc7e9da8cb23cb766e3
CRs-Fixed: 968594
Krunal Soni 9 years ago
parent
commit
e353194792

+ 5 - 0
core/hdd/inc/wlan_hdd_main.h

@@ -1332,6 +1332,11 @@ struct hdd_context_s {
 	 * switch.
 	 */
 	struct mutex dfs_lock;
+	/*
+	 * place to store FTM capab of target. This allows changing of FTM capab
+	 * at runtime and intersecting it with target capab before updating.
+	 */
+	uint32_t fine_time_meas_cap_target;
 };
 
 /*---------------------------------------------------------------------------

+ 13 - 0
core/hdd/src/wlan_hdd_cfg80211.c

@@ -3154,6 +3154,7 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 	u32 modulated_dtim;
 	u16 stats_avg_factor;
 	u32 guard_time;
+	u32 ftm_capab;
 	QDF_STATUS status;
 
 	ENTER_DEV(dev);
@@ -3176,6 +3177,18 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 		return -EINVAL;
 	}
 
+	if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_FINE_TIME_MEASUREMENT]) {
+		ftm_capab = nla_get_u32(tb[
+			QCA_WLAN_VENDOR_ATTR_CONFIG_FINE_TIME_MEASUREMENT]);
+		hdd_ctx->config->fine_time_meas_cap =
+			hdd_ctx->fine_time_meas_cap_target & ftm_capab;
+		sme_update_fine_time_measurement_capab(hdd_ctx->hHal,
+			hdd_ctx->config->fine_time_meas_cap);
+		hdd_info("FTM capability: user value: 0x%x, target value: 0x%x, final value: 0x%x",
+			 ftm_capab, hdd_ctx->fine_time_meas_cap_target,
+			 hdd_ctx->config->fine_time_meas_cap);
+	}
+
 	if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MODULATED_DTIM]) {
 		modulated_dtim = nla_get_u32(
 			tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MODULATED_DTIM]);

+ 2 - 0
core/hdd/src/wlan_hdd_cfg80211.h

@@ -1998,6 +1998,7 @@ enum qca_wlan_vendor_acs_hw_mode {
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_MODULATED_DTIM: modulated dtim
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_STATS_AVG_FACTOR: stats avg. factor
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_GUARD_TIME: guard time
+ * @QCA_WLAN_VENDOR_ATTR_CONFIG_FINE_TIME_MEASUREMENT: fine time measurement
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_LAST: last config
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_MAX: max config
  */
@@ -2006,6 +2007,7 @@ enum qca_wlan_vendor_config {
 	QCA_WLAN_VENDOR_ATTR_CONFIG_MODULATED_DTIM,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_STATS_AVG_FACTOR,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_GUARD_TIME,
+	QCA_WLAN_VENDOR_ATTR_CONFIG_FINE_TIME_MEASUREMENT,
 	/* keep last */
 	QCA_WLAN_VENDOR_ATTR_CONFIG_LAST,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_MAX =

+ 1 - 0
core/hdd/src/wlan_hdd_main.c

@@ -1330,6 +1330,7 @@ void hdd_update_tgt_cfg(void *context, void *param)
 	hdd_update_tgt_vht_cap(hdd_ctx, &cfg->vht_cap);
 #endif /* #ifdef WLAN_FEATURE_11AC */
 	hdd_ctx->config->fine_time_meas_cap &= cfg->fine_time_measurement_cap;
+	hdd_ctx->fine_time_meas_cap_target = cfg->fine_time_measurement_cap;
 	hdd_info(FL("fine_time_meas_cap: 0x%x"),
 		hdd_ctx->config->fine_time_meas_cap);
 }

+ 3 - 0
core/sme/inc/sme_api.h

@@ -1075,4 +1075,7 @@ static inline QDF_STATUS sme_send_egap_conf_params(uint32_t enable,
 	return QDF_STATUS_E_NOSUPPORT;
 }
 #endif
+
+void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val);
+
 #endif /* #if !defined( __SME_API_H ) */

+ 24 - 0
core/sme/src/common/sme_api.c

@@ -1347,6 +1347,30 @@ send_plm_start:
 }
 #endif
 
+/**
+ * sme_update_fine_time_measurement_capab() - Update the FTM capabitlies from
+ * incoming val
+ * @hal: Handle for Hal layer
+ * @val: New FTM capability value
+ *
+ * Return: None
+ */
+void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val)
+{
+	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+	mac_ctx->fine_time_meas_cap = val;
+
+	if (val == 0) {
+		mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
+		((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
+			rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
+	} else {
+		mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 1;
+		((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
+			rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
+	}
+}
+
 /*--------------------------------------------------------------------------
 
    \brief sme_update_config() - Change configurations for all SME moduels