summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSelvaraj, Sridhar <sselvara@codeaurora.org>2016-08-31 16:14:15 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2016-09-21 17:07:05 -0700
commit57bb4d03e0817f797aebc79b59197952d683bf56 (patch)
treebf17090ea603d9f002269e41a58977c287d4a8ce
parentf30a6500576f44af626b63cb40764eefc08eaa22 (diff)
qcacld-3.0: Send driver built assoc IE's to FW for LFR3
Currently, host driver adds RRM IE, Power cap IE in reassociation request initiated from driver. In LFR3, these IE's are missing in reassociation request frames initiated by FW. As part of MBO changes, assoc IE's are sent to FW via Roam Scan Offload command as soon as connection successful. Add the above RRM IE and Power Cap IE also while sending assoc IE's to FW via RSO command. For FTM[Fine Time Measurement] cases, RRM IE's are changed dynamically. Hence, send the updated RRM IE with other IE's via RSO/Update_cfg command to FW. Change-Id: Iff5ff961df89d4564a31763257b13811c4f57df4 CRs-Fixed: 1061698
-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;
}