diff options
| author | Selvaraj, Sridhar <sselvara@codeaurora.org> | 2016-08-31 16:14:15 +0530 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-09-21 17:07:05 -0700 |
| commit | 57bb4d03e0817f797aebc79b59197952d683bf56 (patch) | |
| tree | bf17090ea603d9f002269e41a58977c287d4a8ce | |
| parent | f30a6500576f44af626b63cb40764eefc08eaa22 (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.c | 1 | ||||
| -rw-r--r-- | core/sme/inc/csr_neighbor_roam.h | 1 | ||||
| -rw-r--r-- | core/sme/inc/sme_api.h | 3 | ||||
| -rw-r--r-- | core/sme/src/common/sme_api.c | 10 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_roam.c | 83 |
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; } |
