summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c1
-rw-r--r--core/sme/inc/csr_neighbor_roam.h1
-rw-r--r--core/sme/inc/sme_api.h3
-rw-r--r--core/sme/src/common/sme_api.c10
-rw-r--r--core/sme/src/csr/csr_api_roam.c83
5 files changed, 93 insertions, 5 deletions
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 9c9a38272c0b..bf1b6890e96a 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -3916,6 +3916,7 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy,
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,
+ adapter->sessionId,
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,
diff --git a/core/sme/inc/csr_neighbor_roam.h b/core/sme/inc/csr_neighbor_roam.h
index 260794035e84..582d0572e13b 100644
--- a/core/sme/inc/csr_neighbor_roam.h
+++ b/core/sme/inc/csr_neighbor_roam.h
@@ -321,6 +321,7 @@ void csr_roam_reset_roam_params(tpAniSirGlobal mac_ptr);
#define REASON_ROAM_SCAN_HI_RSSI_DELTA_CHANGED 31
#define REASON_ROAM_SCAN_HI_RSSI_DELAY_CHANGED 32
#define REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED 33
+#define REASON_CONNECT_IES_CHANGED 34
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
QDF_STATUS csr_roam_offload_scan(tpAniSirGlobal pMac, uint8_t sessionId,
diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h
index 12eef22ae8c6..76666d901d8e 100644
--- a/core/sme/inc/sme_api.h
+++ b/core/sme/inc/sme_api.h
@@ -1176,7 +1176,8 @@ static inline QDF_STATUS sme_send_egap_conf_params(uint32_t enable,
}
#endif
-void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val);
+void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id,
+ uint32_t val);
QDF_STATUS sme_ht40_stop_obss_scan(tHalHandle hHal, uint32_t vdev_id);
QDF_STATUS sme_set_fw_test(struct set_fwtest_params *fw_test);
QDF_STATUS sme_set_tsfcb(tHalHandle hHal,
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index 7f8305846b4d..de1a97e981ba 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -1269,12 +1269,13 @@ QDF_STATUS sme_set_reg_info(tHalHandle hHal, uint8_t *apCntryCode)
*
* Return: None
*/
-void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val)
+void sme_update_fine_time_measurement_capab(tHalHandle hal, uint8_t session_id,
+ uint32_t val)
{
tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
mac_ctx->fine_time_meas_cap = val;
- if (val == 0) {
+ if (!val) {
mac_ctx->rrm.rrmPEContext.rrmEnabledCaps.fine_time_meas_rpt = 0;
((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
rrmConfig.rm_capability)->fine_time_meas_rpt = 0;
@@ -1283,6 +1284,11 @@ void sme_update_fine_time_measurement_capab(tHalHandle hal, uint32_t val)
((tpRRMCaps)mac_ctx->rrm.rrmSmeContext.
rrmConfig.rm_capability)->fine_time_meas_rpt = 1;
}
+
+ /* Inform this RRM IE change to FW */
+ csr_roam_offload_scan(mac_ctx, session_id,
+ ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+ REASON_CONNECT_IES_CHANGED);
}
/*--------------------------------------------------------------------------
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index d2f38340b053..5ee911294739 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -17264,6 +17264,82 @@ bool csr_is_RSO_cmd_allowed(tpAniSirGlobal mac_ctx, uint8_t command,
}
/**
+ * csr_append_assoc_ies() - Append specific IE to assoc IE's buffer
+ * @mac_ctx: Pointer to global mac context
+ * @req_buf: Pointer to Roam offload scan request
+ * @ie_id: IE ID to be appended
+ * @ie_len: IE length to be appended
+ * @ie_data: IE data to be appended
+ *
+ * Return: None
+ */
+static void csr_append_assoc_ies(tpAniSirGlobal mac_ctx,
+ tSirRoamOffloadScanReq *req_buf, uint8_t ie_id,
+ uint8_t ie_len, uint8_t *ie_data)
+{
+ tSirAddie *assoc_ie = &req_buf->assoc_ie;
+ if ((SIR_MAC_MAX_ADD_IE_LENGTH - assoc_ie->length) < ie_len) {
+ sms_log(mac_ctx, LOGE, "Appending IE(id:%d) fails", ie_id);
+ return;
+ }
+
+ assoc_ie->addIEdata[assoc_ie->length] = ie_id;
+ assoc_ie->addIEdata[assoc_ie->length + 1] = ie_len;
+ qdf_mem_copy(&assoc_ie->addIEdata[assoc_ie->length + 2],
+ ie_data, ie_len);
+ assoc_ie->length += (ie_len + 2);
+}
+
+/**
+ * csr_update_driver_assoc_ies() - Append driver built IE's to assoc IE's
+ * @mac_ctx: Pointer to global mac structure
+ * @session: pointer to CSR session
+ * @req_buf: Pointer to Roam offload scan request
+ *
+ * Return: None
+ */
+static void csr_update_driver_assoc_ies(tpAniSirGlobal mac_ctx,
+ tCsrRoamSession *session,
+ tSirRoamOffloadScanReq *req_buf)
+{
+ bool power_caps_populated = false;
+ uint32_t csr_11henable = WNI_CFG_11H_ENABLED_STADEF;
+ uint8_t *rrm_cap_ie_data
+ = (uint8_t *) &mac_ctx->rrm.rrmPEContext.rrmEnabledCaps;
+ uint8_t power_cap_ie_data[DOT11F_IE_POWERCAPS_MAX_LEN]
+ = {MIN_TX_PWR_CAP, MAX_TX_PWR_CAP};
+ uint8_t max_tx_pwr_cap
+ = csr_get_cfg_max_tx_power(mac_ctx,
+ session->pConnectBssDesc->channelId);
+
+ if (max_tx_pwr_cap)
+ power_cap_ie_data[1] = max_tx_pwr_cap;
+
+ wlan_cfg_get_int(mac_ctx, WNI_CFG_11H_ENABLED, &csr_11henable);
+
+ if (csr_11henable && csr_is11h_supported(mac_ctx)) {
+ /* Append power cap IE */
+ csr_append_assoc_ies(mac_ctx, req_buf, IEEE80211_ELEMID_PWRCAP,
+ DOT11F_IE_POWERCAPS_MAX_LEN,
+ power_cap_ie_data);
+ power_caps_populated = true;
+ }
+
+ if (mac_ctx->rrm.rrmPEContext.rrmEnable) {
+ /* Append RRM IE */
+ csr_append_assoc_ies(mac_ctx, req_buf, IEEE80211_ELEMID_RRM,
+ DOT11F_IE_RRMENABLEDCAP_MAX_LEN,
+ rrm_cap_ie_data);
+ if (!power_caps_populated)
+ /* Append Power cap IE if not appended already */
+ csr_append_assoc_ies(mac_ctx, req_buf,
+ IEEE80211_ELEMID_PWRCAP,
+ DOT11F_IE_POWERCAPS_MAX_LEN,
+ power_cap_ie_data);
+ }
+}
+
+/**
* csr_roam_offload_scan() - populates roam offload scan request and sends to
* WMA
*
@@ -17457,12 +17533,15 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id,
req_buf->hi_rssi_scan_delay,
req_buf->hi_rssi_scan_rssi_ub);
- if ((command == ROAM_SCAN_OFFLOAD_START) &&
- (reason == REASON_CONNECT)) {
+ if (((command == ROAM_SCAN_OFFLOAD_START) &&
+ (reason == REASON_CONNECT)) ||
+ ((command == ROAM_SCAN_OFFLOAD_UPDATE_CFG) &&
+ (reason == REASON_CONNECT_IES_CHANGED))) {
req_buf->assoc_ie.length = session->nAddIEAssocLength;
qdf_mem_copy(req_buf->assoc_ie.addIEdata,
session->pAddIEAssoc,
session->nAddIEAssocLength);
+ csr_update_driver_assoc_ies(mac_ctx, session, req_buf);
} else {
req_buf->assoc_ie.length = 0;
}