Pārlūkot izejas kodu

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 gadi atpakaļ
vecāks
revīzija
e353194792

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

@@ -1332,6 +1332,11 @@ struct hdd_context_s {
 	 * switch.
 	 * switch.
 	 */
 	 */
 	struct mutex dfs_lock;
 	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;
 	u32 modulated_dtim;
 	u16 stats_avg_factor;
 	u16 stats_avg_factor;
 	u32 guard_time;
 	u32 guard_time;
+	u32 ftm_capab;
 	QDF_STATUS status;
 	QDF_STATUS status;
 
 
 	ENTER_DEV(dev);
 	ENTER_DEV(dev);
@@ -3176,6 +3177,18 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
 		return -EINVAL;
 		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]) {
 	if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MODULATED_DTIM]) {
 		modulated_dtim = nla_get_u32(
 		modulated_dtim = nla_get_u32(
 			tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MODULATED_DTIM]);
 			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_MODULATED_DTIM: modulated dtim
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_STATS_AVG_FACTOR: stats avg. factor
  * @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_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_LAST: last config
  * @QCA_WLAN_VENDOR_ATTR_CONFIG_MAX: max 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_MODULATED_DTIM,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_STATS_AVG_FACTOR,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_STATS_AVG_FACTOR,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_GUARD_TIME,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_GUARD_TIME,
+	QCA_WLAN_VENDOR_ATTR_CONFIG_FINE_TIME_MEASUREMENT,
 	/* keep last */
 	/* keep last */
 	QCA_WLAN_VENDOR_ATTR_CONFIG_LAST,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_LAST,
 	QCA_WLAN_VENDOR_ATTR_CONFIG_MAX =
 	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);
 	hdd_update_tgt_vht_cap(hdd_ctx, &cfg->vht_cap);
 #endif /* #ifdef WLAN_FEATURE_11AC */
 #endif /* #ifdef WLAN_FEATURE_11AC */
 	hdd_ctx->config->fine_time_meas_cap &= cfg->fine_time_measurement_cap;
 	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_info(FL("fine_time_meas_cap: 0x%x"),
 		hdd_ctx->config->fine_time_meas_cap);
 		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;
 	return QDF_STATUS_E_NOSUPPORT;
 }
 }
 #endif
 #endif
+
+void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val);
+
 #endif /* #if !defined( __SME_API_H ) */
 #endif /* #if !defined( __SME_API_H ) */

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

@@ -1347,6 +1347,30 @@ send_plm_start:
 }
 }
 #endif
 #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
    \brief sme_update_config() - Change configurations for all SME moduels