aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2018-09-19 18:37:23 +0000
committerandroid-build-team Robot <android-build-team-robot@google.com>2018-09-19 18:37:23 +0000
commitc89a7e86e87aebcae2c5ef8ff06ad806883795a4 (patch)
tree26f941eca2920e85e5b9cb43f4fb8217d21b3893
parent47e3892341bca92b99820eef35eb19c5632a10aa (diff)
parent24ad2e523b2f6d0550a672d3adbf50399da04373 (diff)
downloadqcom-msm-v4.9-oreo-mr1-1.2-iot-release.tar.gz
Merge cherrypicks of [5061136, 5061195, 5061196, 5061197, 5061198, 5061199, 5062880, 5062881, 5062882] into oc-mr1-1.2-iot-releaseandroid-o-mr1-iot-release-smart-display-r3oreo-mr1-1.2-iot-release
Change-Id: I0bc9c97bd58829decdbb5ae06a9b1e4bae7fbd9a
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h8
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h2
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h3
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c11
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c24
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c141
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c239
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_ocb.c86
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_scan.c13
-rw-r--r--techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_wext.c274
-rw-r--r--techpack/qcacld-2.0/CORE/MAC/inc/sirApi.h2
-rw-r--r--techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c21
-rw-r--r--techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limSmeReqUtils.c38
-rw-r--r--techpack/qcacld-2.0/CORE/MAC/src/pe/sch/schMessage.c6
-rw-r--r--techpack/qcacld-2.0/CORE/SERVICES/COMMON/ieee80211_defines.h4
-rw-r--r--techpack/qcacld-2.0/CORE/SYS/legacy/src/utils/src/parserApi.c10
16 files changed, 474 insertions, 408 deletions
diff --git a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h
index fa218ec8ce38..53b1b95ea2cd 100644
--- a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -725,10 +725,10 @@ enum
#define CFG_QOS_WMM_MODE_MAX (2) //HDD_WMM_NO_QOS
#define CFG_QOS_WMM_MODE_DEFAULT (0) //HDD_WMM_AUTO
-#define CFG_STA_LOCAL_EDCA_FOR_ETSI_NAME "gStaLocalEDCAForETSI"
-#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MIN (0)
-#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MAX (1)
-#define CFG_STA_LOCAL_EDCA_FOR_ETSI_DEFAULT (0)
+#define CFG_STA_LOCAL_EDCA_FOR_ETSI_NAME "gStaLocalEDCAForETSI"
+#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MIN (0)
+#define CFG_STA_LOCAL_EDCA_FOR_ETSI_MAX (1)
+#define CFG_STA_LOCAL_EDCA_FOR_ETSI_DEFAULT (0)
#define CFG_QOS_WMM_80211E_ENABLED_NAME "80211eIsEnabled"
#define CFG_QOS_WMM_80211E_ENABLED_MIN (0)
diff --git a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h
index bcad09c68fe8..c82142be4e2a 100644
--- a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h
+++ b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_main.h
@@ -347,7 +347,6 @@ extern spinlock_t hdd_context_lock;
#define STATS_CONTEXT_MAGIC 0x53544154 //STAT
#define PEER_INFO_CONTEXT_MAGIC 0x52535349 /* PEER_INFO */
#define POWER_CONTEXT_MAGIC 0x504F5752 //POWR
-#define SNR_CONTEXT_MAGIC 0x534E5200 //SNR
#define LINK_CONTEXT_MAGIC 0x4C494E4B //LINKSPEED
#define LINK_STATUS_MAGIC 0x4C4B5354 //LINKSTATUS(LNST)
#define TEMP_CONTEXT_MAGIC 0x74656d70 // TEMP (temperature)
@@ -1413,7 +1412,6 @@ struct hdd_adapter_s
/* State for synchronous OCB requests to WMI */
struct sir_ocb_set_config_response ocb_set_config_resp;
- struct sir_ocb_get_tsf_timer_response ocb_get_tsf_timer_resp;
struct dsrc_radio_chan_stats_ctxt dsrc_chan_stats;
#ifdef WLAN_FEATURE_DSRC
/* MAC addresses used for OCB interfaces */
diff --git a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h
index e01555f79268..5ce50fb63d61 100644
--- a/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h
+++ b/techpack/qcacld-2.0/CORE/HDD/inc/wlan_hdd_wext.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -429,7 +429,6 @@ extern void *mem_alloc_copy_from_user_helper(const void *wrqu_data, size_t len);
extern VOS_STATUS wlan_hdd_get_linkspeed_for_peermac(hdd_adapter_t *pAdapter,
tSirMacAddr macAddress);
void hdd_clearRoamProfileIe( hdd_adapter_t *pAdapter);
-void hdd_GetLink_SpeedCB(tSirLinkSpeedInfo *pLinkSpeed, void *pContext);
VOS_STATUS wlan_hdd_check_ula_done(hdd_adapter_t *pAdapter);
diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c
index aefe48aefcf3..35f41ca44e41 100644
--- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_assoc.c
@@ -5228,10 +5228,19 @@ static tANI_S32 hdd_ProcessGENIE(hdd_adapter_t *pAdapter,
pRsnIe = gen_ie + 2 + 4;
RSNIeLen = gen_ie_len - (2 + 4);
// Unpack the WPA IE
- dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
+ status = dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
pRsnIe,
RSNIeLen,
&dot11WPAIE);
+
+ if (DOT11F_FAILED(status))
+ {
+ hddLog(LOGE,
+ FL("Parse failure in hdd_ProcessGENIE (0x%08x)"),
+ status);
+ return -EINVAL;
+ }
+
// Copy out the encryption and authentication types
hddLog(LOG1, FL("%s: WPA unicast cipher suite count: %d"),
__func__, dot11WPAIE.unicast_cipher_count );
diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c
index cd57b20e1e62..6b2140bc0018 100644
--- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -117,7 +117,7 @@
#define a_mode_rates_size (8)
#define FREQ_BASE_80211G (2407)
#define FREQ_BAND_DIFF_80211G (5)
-#define MAX_SCAN_SSID 10
+#define MAX_SCAN_SSID 16
#define MAX_PENDING_LOG 5
#define MAX_HT_MCS_IDX 8
#define MAX_VHT_MCS_IDX 10
@@ -15988,13 +15988,22 @@ static bool wlan_hdd_get_sap_obss(hdd_adapter_t *pHostapdAdapter)
hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(pHostapdAdapter);
beacon_data_t *beacon = pHostapdAdapter->sessionCtx.ap.beacon;
uint8_t *ie = NULL;
+ uint32_t status;
ie = wlan_hdd_cfg80211_get_ie_ptr(beacon->tail, beacon->tail_len,
WLAN_EID_HT_CAPABILITY);
if (ie && ie[1]) {
vos_mem_copy(ht_cap_ie, &ie[2], DOT11F_IE_HTCAPS_MAX_LEN);
- dot11fUnpackIeHTCaps((tpAniSirGlobal)hdd_ctx->hHal, ht_cap_ie, ie[1],
+ status = dot11fUnpackIeHTCaps((tpAniSirGlobal)hdd_ctx->hHal, ht_cap_ie, ie[1],
&dot11_ht_cap_ie);
+ if (DOT11F_FAILED(status))
+ {
+ hddLog(LOGE,
+ FL("unpack failed for HT Caps status:(0x%08x)"),
+ status);
+ return false;
+ }
+
return dot11_ht_cap_ie.supportedChannelWidthSet;
}
@@ -23954,6 +23963,7 @@ static int wlan_hdd_cfg80211_set_privacy_ibss(
)
{
int status = 0;
+ tANI_U32 ret;
hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter);
eCsrEncryptionType encryptionType = eCSR_ENCRYPT_TYPE_NONE;
hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -23992,10 +24002,18 @@ static int wlan_hdd_cfg80211_set_privacy_ibss(
}
// Unpack the WPA IE
//Skip past the EID byte and length byte - and four byte WiFi OUI
- dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
+ ret = dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
&ie[2+4],
ie[1] - 4,
&dot11WPAIE);
+ if (DOT11F_FAILED(ret))
+ {
+ hddLog(LOGE,
+ FL("unpack failed status:(0x%08x)"),
+ ret);
+ return -EINVAL;
+ }
+
/*Extract the multicast cipher, the encType for unicast
cipher for wpa-none is none*/
encryptionType =
diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c
index 8bfba0aeea62..dfb103690bec 100644
--- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -2957,17 +2957,18 @@ int hdd_softap_unpackIE(
tANI_U8 *pRsnIe;
tANI_U16 RSNIeLen;
+ tANI_U32 status;
if (NULL == halHandle)
{
hddLog(LOGE, FL("Error haHandle returned NULL"));
- return -EINVAL;
+ return VOS_STATUS_E_FAILURE;
}
// Validity checks
if ((gen_ie_len < VOS_MIN(DOT11F_IE_RSN_MIN_LEN, DOT11F_IE_WPA_MIN_LEN)) ||
(gen_ie_len > VOS_MAX(DOT11F_IE_RSN_MAX_LEN, DOT11F_IE_WPA_MAX_LEN)) )
- return -EINVAL;
+ return VOS_STATUS_E_FAILURE;
// Type check
if ( gen_ie[0] == DOT11F_EID_RSN)
{
@@ -2982,10 +2983,18 @@ int hdd_softap_unpackIE(
RSNIeLen = gen_ie_len - 2;
// Unpack the RSN IE
memset(&dot11RSNIE, 0, sizeof(tDot11fIERSN));
- dot11fUnpackIeRSN((tpAniSirGlobal) halHandle,
+ status = dot11fUnpackIeRSN((tpAniSirGlobal) halHandle,
pRsnIe,
RSNIeLen,
&dot11RSNIE);
+ if (DOT11F_FAILED(status))
+ {
+ hddLog(LOGE,
+ FL("unpack failed for RSN IE status:(0x%08x)"),
+ status);
+ return VOS_STATUS_E_FAILURE;
+ }
+
// Copy out the encryption and authentication types
hddLog(LOG1, FL("%s: pairwise cipher suite count: %d"),
__func__, dot11RSNIE.pwise_cipher_suite_count );
@@ -3018,11 +3027,19 @@ int hdd_softap_unpackIE(
RSNIeLen = gen_ie_len - (2 + 4);
// Unpack the WPA IE
memset(&dot11WPAIE, 0, sizeof(tDot11fIEWPA));
- dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
+ status = dot11fUnpackIeWPA((tpAniSirGlobal) halHandle,
pRsnIe,
RSNIeLen,
&dot11WPAIE);
- // Copy out the encryption and authentication types
+ if (DOT11F_FAILED(status))
+ {
+ hddLog(LOGE,
+ FL("unpack failed for WPA IE status:(0x%08x)"),
+ status);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ // Copy out the encryption and authentication types
hddLog(LOG1, FL("%s: WPA unicast cipher suite count: %d"),
__func__, dot11WPAIE.unicast_cipher_count );
hddLog(LOG1, FL("%s: WPA authentication suite count: %d"),
@@ -6361,69 +6378,99 @@ iw_set_ap_genie(struct net_device *dev,
return ret;
}
+struct linkspeed_priv {
+ tSirLinkSpeedInfo linkspeed_info;
+};
+
+static void
+hdd_get_link_speed_cb(tSirLinkSpeedInfo *linkspeed_info, void *cookie)
+{
+ struct hdd_request *request;
+ struct linkspeed_priv *priv;
+
+ if (NULL == linkspeed_info)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Bad param, linkspeed_info [%pK] cookie [%pK]",
+ __func__, linkspeed_info, cookie);
+ return;
+ }
+
+ request = hdd_request_get(cookie);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,"Obsolete request");
+ return;
+ }
+
+ priv = hdd_request_priv(request);
+ priv->linkspeed_info = *linkspeed_info;
+ hdd_request_complete(request);
+ hdd_request_put(request);
+}
VOS_STATUS wlan_hdd_get_linkspeed_for_peermac(hdd_adapter_t *pAdapter,
tSirMacAddr macAddress)
{
eHalStatus hstatus;
- unsigned long rc;
- struct linkspeedContext context;
- tSirLinkSpeedInfo *linkspeed_req;
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+ void *cookie;
+ tSirLinkSpeedInfo *linkspeed_info;
+ int ret;
+ struct hdd_request *request;
+ struct linkspeed_priv *priv;
+ static const struct hdd_request_params params = {
+ .priv_size = sizeof(*priv),
+ .timeout_ms = WLAN_WAIT_TIME_STATS,
+ };
if (NULL == pAdapter)
{
hddLog(VOS_TRACE_LEVEL_ERROR, "%s: pAdapter is NULL", __func__);
return VOS_STATUS_E_FAULT;
}
- linkspeed_req = (tSirLinkSpeedInfo *)vos_mem_malloc(sizeof(*linkspeed_req));
- if (NULL == linkspeed_req)
- {
+
+ request = hdd_request_alloc(&params);
+ if (!request) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s Request Buffer Alloc Fail", __func__);
return VOS_STATUS_E_INVAL;
}
- init_completion(&context.completion);
- context.pAdapter = pAdapter;
- context.magic = LINK_CONTEXT_MAGIC;
-
- vos_mem_copy(linkspeed_req->peer_macaddr, macAddress, sizeof(tSirMacAddr) );
- hstatus = sme_GetLinkSpeed( WLAN_HDD_GET_HAL_CTX(pAdapter),
- linkspeed_req,
- &context,
- hdd_GetLink_SpeedCB);
+ cookie = hdd_request_cookie(request);
+ priv = hdd_request_priv(request);
+
+ linkspeed_info = &priv->linkspeed_info;
+ vos_mem_copy(linkspeed_info->peer_macaddr, macAddress, sizeof(tSirMacAddr) );
+ hstatus = sme_GetLinkSpeed(WLAN_HDD_GET_HAL_CTX(pAdapter),
+ linkspeed_info,
+ cookie,
+ hdd_get_link_speed_cb);
+
if (eHAL_STATUS_SUCCESS != hstatus)
{
hddLog(VOS_TRACE_LEVEL_ERROR,
- "%s: Unable to retrieve statistics for link speed",
- __func__);
- vos_mem_free(linkspeed_req);
+ "%s: Unable to retrieve statistics for link speed, ret(%d)",
+ __func__, hstatus);
+ status = VOS_STATUS_E_INVAL;
+ goto cleanup;
}
- else
- {
- rc = wait_for_completion_timeout(&context.completion,
- msecs_to_jiffies(WLAN_WAIT_TIME_STATS));
- if (!rc) {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- "%s: SME timed out while retrieving link speed",
- __func__);
- }
+ ret = hdd_request_wait_for_response(request);
+ if (!ret) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: SME timed out while retrieving link speed,ret(%d)",
+ __func__, ret);
+ status = VOS_STATUS_E_INVAL;
+ goto cleanup;
}
+ pAdapter->ls_stats.estLinkSpeed = linkspeed_info->estLinkSpeed;
- /* either we never sent a request, we sent a request and received a
- response or we sent a request and timed out. if we never sent a
- request or if we sent a request and got a response, we want to
- clear the magic out of paranoia. if we timed out there is a
- race condition such that the callback function could be
- executing at the same time we are. of primary concern is if the
- callback function had already verified the "magic" but had not
- yet set the completion variable when a timeout occurred. we
- serialize these activities by invalidating the magic while
- holding a shared spinlock which will cause us to block if the
- callback is currently executing */
- spin_lock(&hdd_context_lock);
- context.magic = 0;
- spin_unlock(&hdd_context_lock);
- return VOS_STATUS_SUCCESS;
+cleanup:
+ /*
+ * either we never sent a request, we sent a request and
+ * received a response or we sent a request and timed out.
+ * regardless we are done with the request.
+ */
+ hdd_request_put(request);
+ return status;
}
diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c
index eac72d54ee33..d422846fc903 100644
--- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c
+++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_main.c
@@ -3818,87 +3818,33 @@ void hdd_indicate_mgmt_frame(tSirSmeMgmtFrameInd *frame_ind)
return;
}
-static void hdd_GetLink_statusCB(v_U8_t status, void *pContext)
-{
- struct statsContext *pLinkContext;
- hdd_adapter_t *pAdapter;
-
- if (NULL == pContext) {
- hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Bad pContext [%pK]",
- __func__, pContext);
- return;
- }
-
- pLinkContext = pContext;
- pAdapter = pLinkContext->pAdapter;
-
- spin_lock(&hdd_context_lock);
-
- if ((NULL == pAdapter) || (LINK_STATUS_MAGIC != pLinkContext->magic)) {
- /* the caller presumably timed out so there is nothing we can do */
- spin_unlock(&hdd_context_lock);
- hddLog(VOS_TRACE_LEVEL_WARN,
- "%s: Invalid context, pAdapter [%pK] magic [%08x]",
- __func__, pAdapter, pLinkContext->magic);
- return;
- }
-
- /* context is valid so caller is still waiting */
-
- /* paranoia: invalidate the magic */
- pLinkContext->magic = 0;
-
- /* copy over the status */
- pAdapter->linkStatus = status;
-
- /* notify the caller */
- complete(&pLinkContext->completion);
-
- /* serialization is complete */
- spin_unlock(&hdd_context_lock);
-}
+struct fw_state {
+ bool fw_active;
+};
/**
* hdd_get_fw_state_cb() - validates the context and notifies the caller
- * @callback_context: caller context
+ * @cookie: cookie from the request contest
*
* Return: none
*/
-static void hdd_get_fw_state_cb(void *callback_context)
+static void hdd_get_fw_state_cb(void *cookie)
{
- struct statsContext *context;
- hdd_adapter_t *adapter;
-
- if (NULL == callback_context) {
- hddLog(LOGE, FL("Bad pContext [%pK]"), callback_context);
- return;
- }
-
- context = callback_context;
- adapter = context->pAdapter;
-
- spin_lock(&hdd_context_lock);
+ struct hdd_request *request;
+ struct fw_state *priv;
- if ((NULL == adapter) || (FW_STATUS_MAGIC != context->magic)) {
- /* the caller presumably timed out so there is
- * nothing we can do
- */
- spin_unlock(&hdd_context_lock);
- hddLog(LOGE, FL("Invalid context, Adapter [%pK] magic [%08x]"),
- adapter, context->magic);
+ request = hdd_request_get(cookie);
+ if (!request) {
+ hddLog(LOGE, FL("Obsolete request"));
return;
}
- /* context is valid so caller is still waiting */
-
- /* paranoia: invalidate the magic */
- context->magic = 0;
+ priv = hdd_request_priv(request);
- /* notify the caller */
- complete(&context->completion);
+ priv->fw_active = true;
- /* serialization is complete */
- spin_unlock(&hdd_context_lock);
+ hdd_request_complete(request);
+ hdd_request_put(request);
}
/**
@@ -3915,42 +3861,73 @@ static void hdd_get_fw_state_cb(void *callback_context)
bool wlan_hdd_get_fw_state(hdd_adapter_t *adapter)
{
hdd_context_t *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
- struct statsContext context;
- eHalStatus hstatus = eHAL_STATUS_SUCCESS;
- unsigned long rc;
- bool fw_active = true;
+ eHalStatus hstatus;
+ int ret;
+ void *cookie;
+ struct fw_state *priv;
+ static const struct hdd_request_params params = {
+ .priv_size = sizeof(*priv),
+ .timeout_ms = WLAN_WAIT_TIME_LINK_STATUS,
+ };
+ struct hdd_request *request;
+ bool fw_active;
if (wlan_hdd_validate_context(hdd_ctx) != 0)
return false;
- init_completion(&context.completion);
- context.pAdapter = adapter;
- context.magic = FW_STATUS_MAGIC;
+ request = hdd_request_alloc(&params);
+ if (!request) {
+ hddLog(LOGE, FL("Request allocation failure"));
+ return false;
+ }
+
+ cookie = hdd_request_cookie(request);
+
hstatus = sme_get_fw_state(WLAN_HDD_GET_HAL_CTX(adapter),
hdd_get_fw_state_cb,
- &context);
-
+ cookie);
if (eHAL_STATUS_SUCCESS != hstatus) {
hddLog(LOGE, FL("Unable to retrieve firmware status"));
fw_active = false;
} else {
/* request is sent -- wait for the response */
- rc = wait_for_completion_timeout(&context.completion,
- msecs_to_jiffies(WLAN_WAIT_TIME_LINK_STATUS));
- if (!rc) {
+ ret = hdd_request_wait_for_response(request);
+ if (ret) {
hddLog(LOGE,
FL("SME timed out while retrieving firmware status"));
fw_active = false;
+ } else {
+ priv = hdd_request_priv(request);
+ fw_active = priv->fw_active;
}
}
- spin_lock(&hdd_context_lock);
- context.magic = 0;
- spin_unlock(&hdd_context_lock);
+ hdd_request_put(request);
return fw_active;
}
+struct link_status_priv {
+ uint8_t link_status;
+};
+
+static void hdd_get_link_status_cb(uint8_t status, void *context)
+{
+ struct hdd_request *request;
+ struct link_status_priv *priv;
+
+ request = hdd_request_get(context);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Obsolete request", __func__);
+ return;
+ }
+
+ priv = hdd_request_priv(request);
+ priv->link_status = status;
+ hdd_request_complete(request);
+ hdd_request_put(request);
+}
+
/**
* wlan_hdd_get_link_status() - get link status
* @pAdapter: pointer to the adapter
@@ -3965,50 +3942,68 @@ bool wlan_hdd_get_fw_state(hdd_adapter_t *adapter)
*/
static int wlan_hdd_get_link_status(hdd_adapter_t *pAdapter)
{
- hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
- hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
- struct statsContext context;
- eHalStatus hstatus;
- unsigned long rc;
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+ eHalStatus hstatus;
+ int ret;
+ void *cookie;
+ struct hdd_request *request;
+ struct link_status_priv *priv;
+ static const struct hdd_request_params params = {
+ .priv_size = sizeof(*priv),
+ .timeout_ms = WLAN_WAIT_TIME_LINK_STATUS,
+ };
- if (pHddCtx->isLogpInProgress) {
- hddLog(LOGW, FL("LOGP in Progress. Ignore!!!"));
- return 0;
- }
+ if (pHddCtx->isLogpInProgress) {
+ hddLog(LOGW, FL("LOGP in Progress. Ignore!!!"));
+ return 0;
+ }
- if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
- /* If not associated, then expected link status return value is 0 */
- hddLog(LOG1, FL("Not associated!"));
- return 0;
- }
+ if (eConnectionState_Associated != pHddStaCtx->conn_info.connState) {
+ /* If not associated, then expected link status return value is 0 */
+ hddLog(LOG1, FL("Not associated!"));
+ return 0;
+ }
- init_completion(&context.completion);
- context.pAdapter = pAdapter;
- context.magic = LINK_STATUS_MAGIC;
- hstatus = sme_getLinkStatus(WLAN_HDD_GET_HAL_CTX(pAdapter),
- hdd_GetLink_statusCB,
- &context,
- pAdapter->sessionId);
- if (eHAL_STATUS_SUCCESS != hstatus) {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- "%s: Unable to retrieve link status", __func__);
- /* return a cached value */
- } else {
- /* request is sent -- wait for the response */
- rc = wait_for_completion_timeout(&context.completion,
- msecs_to_jiffies(WLAN_WAIT_TIME_LINK_STATUS));
- if (!rc) {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("SME timed out while retrieving link status"));
- }
- }
+ request = hdd_request_alloc(&params);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, "%s: Request allocation failure",
+ __func__);
+ return 0;
+ }
+ cookie = hdd_request_cookie(request);
- spin_lock(&hdd_context_lock);
- context.magic = 0;
- spin_unlock(&hdd_context_lock);
+ hstatus = sme_getLinkStatus(WLAN_HDD_GET_HAL_CTX(pAdapter),
+ hdd_get_link_status_cb,
+ cookie,
+ pAdapter->sessionId);
+ if (eHAL_STATUS_SUCCESS != hstatus) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Unable to retrieve link status", __func__);
+ /* return a cached value */
+ } else {
+ /* request is sent -- wait for the response */
+ ret = hdd_request_wait_for_response(request);
+ if (ret) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: SME timed out while retrieving link status",
+ __func__);
+ /* return a cached value */
+ } else {
+ /* update the adapter with the fresh results */
+ priv = hdd_request_priv(request);
+ pAdapter->linkStatus = priv->link_status;
+ }
+ }
+ /*
+ * either we never sent a request, we sent a request and
+ * received a response or we sent a request and timed out.
+ * regardless we are done with the request.
+ */
+ hdd_request_put(request);
- /* either callback updated pAdapter stats or it has cached data */
- return pAdapter->linkStatus;
+ /* either callback updated adapter stats or it has cached data */
+ return pAdapter->linkStatus;
}
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_ocb.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_ocb.c
index 51066f89cad8..508d23fa3652 100644
--- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_ocb.c
+++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_ocb.c
@@ -1484,6 +1484,16 @@ int wlan_hdd_cfg80211_ocb_stop_timing_advert(struct wiphy *wiphy,
}
/**
+ * hdd_ocb_get_tsf_timer_priv - private parameters for get tsf timer
+ * @response: response from SME
+ * @status: status of response
+ */
+struct hdd_ocb_get_tsf_timer_priv {
+ struct sir_ocb_get_tsf_timer_response response;
+ int status;
+};
+
+/**
* hdd_ocb_get_tsf_timer_callback() - Callback to get TSF command
* @context_ptr: request context
* @response_ptr: response data
@@ -1491,23 +1501,25 @@ int wlan_hdd_cfg80211_ocb_stop_timing_advert(struct wiphy *wiphy,
static void hdd_ocb_get_tsf_timer_callback(void *context_ptr,
void *response_ptr)
{
- struct hdd_ocb_ctxt *context = context_ptr;
+ struct hdd_request *hdd_request;
+ struct hdd_ocb_get_tsf_timer_priv *priv;
struct sir_ocb_get_tsf_timer_response *response = response_ptr;
- if (!context)
+ hdd_request = hdd_request_get(context_ptr);
+ if (!hdd_request) {
+ hddLog(LOGE, FL("Obsolete request"));
return;
+ }
- spin_lock(&hdd_context_lock);
- if (context->magic == HDD_OCB_MAGIC) {
- if (response) {
- context->adapter->ocb_get_tsf_timer_resp = *response;
- context->status = 0;
- } else {
- context->status = -EINVAL;
- }
- complete(&context->completion_evt);
+ priv = hdd_request_priv(hdd_request);
+ if (response) {
+ priv->response = *response;
+ priv->status = 0;
+ } else {
+ priv->status = -EINVAL;
}
- spin_unlock(&hdd_context_lock);
+ hdd_request_complete(hdd_request);
+ hdd_request_put(hdd_request);
}
/**
@@ -1531,7 +1543,13 @@ __wlan_hdd_cfg80211_ocb_get_tsf_timer(struct wiphy *wiphy,
hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
int rc = -EINVAL;
struct sir_ocb_get_tsf_timer request = {0};
- struct hdd_ocb_ctxt context = {0};
+ void *cookie;
+ struct hdd_request *hdd_request;
+ struct hdd_ocb_get_tsf_timer_priv *priv;
+ static const struct hdd_request_params params = {
+ .priv_size = sizeof(*priv),
+ .timeout_ms = WLAN_WAIT_TIME_OCB_CMD,
+ };
ENTER();
@@ -1554,39 +1572,41 @@ __wlan_hdd_cfg80211_ocb_get_tsf_timer(struct wiphy *wiphy,
}
/* Initialize the callback context */
- init_completion(&context.completion_evt);
- context.adapter = adapter;
- context.magic = HDD_OCB_MAGIC;
+ hdd_request = hdd_request_alloc(&params);
+ if (!hdd_request) {
+ hddLog(LOGE, FL("Request allocation failure"));
+ return -ENOMEM;
+ }
+ cookie = hdd_request_cookie(hdd_request);
request.vdev_id = adapter->sessionId;
/* Call the SME function */
- rc = sme_ocb_get_tsf_timer(hdd_ctx->hHal, &context,
+ rc = sme_ocb_get_tsf_timer(hdd_ctx->hHal, cookie,
hdd_ocb_get_tsf_timer_callback,
&request);
if (rc) {
hddLog(LOGE, FL("Error calling SME function"));
/* Need to convert from eHalStatus to errno. */
- return -EINVAL;
+ rc = -EINVAL;
+ goto end;
}
- rc = wait_for_completion_timeout(&context.completion_evt,
- msecs_to_jiffies(WLAN_WAIT_TIME_OCB_CMD));
- if (rc == 0) {
+ rc = hdd_request_wait_for_response(hdd_request);
+ if (rc) {
hddLog(LOGE, FL("Operation timed out"));
- rc = -ETIMEDOUT;
goto end;
}
- rc = 0;
- if (context.status) {
- hddLog(LOGE, FL("Operation failed: %d"), context.status);
- rc = context.status;
+ priv = hdd_request_priv(hdd_request);
+ rc = priv->status;
+ if (rc) {
+ hddLog(LOGE, FL("Operation failed: %d"), rc);
goto end;
}
/* Allocate the buffer for the response. */
nl_resp = cfg80211_vendor_cmd_alloc_reply_skb(wiphy,
- 2 * sizeof(uint32_t) + NLMSG_HDRLEN);
+ 2 * (NLA_HDRLEN + sizeof(uint32_t)) + NLMSG_HDRLEN);
if (!nl_resp) {
hddLog(LOGE, FL("cfg80211_vendor_cmd_alloc_reply_skb failed"));
@@ -1595,18 +1615,18 @@ __wlan_hdd_cfg80211_ocb_get_tsf_timer(struct wiphy *wiphy,
}
hddLog(LOGE, FL("Got TSF timer response, high=%d, low=%d"),
- adapter->ocb_get_tsf_timer_resp.timer_high,
- adapter->ocb_get_tsf_timer_resp.timer_low);
+ priv->response.timer_high,
+ priv->response.timer_low);
/* Populate the response. */
rc = nla_put_u32(nl_resp,
QCA_WLAN_VENDOR_ATTR_OCB_GET_TSF_RESP_TIMER_HIGH,
- adapter->ocb_get_tsf_timer_resp.timer_high);
+ priv->response.timer_high);
if (rc)
goto end;
rc = nla_put_u32(nl_resp,
QCA_WLAN_VENDOR_ATTR_OCB_GET_TSF_RESP_TIMER_LOW,
- adapter->ocb_get_tsf_timer_resp.timer_low);
+ priv->response.timer_low);
if (rc)
goto end;
@@ -1619,9 +1639,7 @@ __wlan_hdd_cfg80211_ocb_get_tsf_timer(struct wiphy *wiphy,
}
end:
- spin_lock(&hdd_context_lock);
- context.magic = 0;
- spin_unlock(&hdd_context_lock);
+ hdd_request_put(hdd_request);
if (nl_resp)
kfree_skb(nl_resp);
return rc;
diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_scan.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_scan.c
index 73630b9a2e5e..31b0433ac58c 100644
--- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_scan.c
+++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_scan.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -211,6 +211,7 @@ static eHalStatus hdd_IndicateScanResult(hdd_scan_info_t *scanInfo, tCsrScanResu
int error;
char custom[MAX_CUSTOM_LEN];
char *p;
+ tANI_U32 status;
hddLog( LOG1, "hdd_IndicateScanResult " MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(descriptor->bssId));
@@ -339,12 +340,18 @@ static eHalStatus hdd_IndicateScanResult(hdd_scan_info_t *scanInfo, tCsrScanResu
pDot11IEHTCaps = NULL;
- dot11fUnpackBeaconIEs ((tpAniSirGlobal)
+ status = dot11fUnpackBeaconIEs ((tpAniSirGlobal)
hHal, (tANI_U8 *) descriptor->ieFields, ie_length, &dot11BeaconIEs);
+ if (DOT11F_FAILED(status))
+ {
+ hddLog(LOGE,
+ FL("unpack failed for Beacon IE status:(0x%08x)"),
+ status);
+ return eHAL_STATUS_FAILURE;
+ }
pDot11SSID = &dot11BeaconIEs.SSID;
-
if (pDot11SSID->present ) {
last_event = current_event;
vos_mem_zero (&event, sizeof (struct iw_event));
diff --git a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_wext.c b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_wext.c
index f26f08aad6b2..0467982877a3 100644
--- a/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_wext.c
+++ b/techpack/qcacld-2.0/CORE/HDD/src/wlan_hdd_wext.c
@@ -1172,64 +1172,6 @@ hdd_IsAuthTypeRSN( tHalHandle halHandle, eCsrAuthType authType)
return rsnType;
}
-static void hdd_GetSnrCB(tANI_S8 snr, tANI_U32 staId, void *pContext)
-{
- struct statsContext *pStatsContext;
- hdd_adapter_t *pAdapter;
-
- if (ioctl_debug)
- {
- pr_info("%s: snr [%d] STA [%d] pContext [%pK]\n",
- __func__, (int)snr, (int)staId, pContext);
- }
-
- if (NULL == pContext)
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- "%s: Bad param, pContext [%pK]",
- __func__, pContext);
- return;
- }
-
- pStatsContext = pContext;
- pAdapter = pStatsContext->pAdapter;
-
- /* there is a race condition that exists between this callback
- function and the caller since the caller could time out either
- before or while this code is executing. we use a spinlock to
- serialize these actions */
- spin_lock(&hdd_context_lock);
-
- if ((NULL == pAdapter) || (SNR_CONTEXT_MAGIC != pStatsContext->magic))
- {
- /* the caller presumably timed out so there is nothing we can do */
- spin_unlock(&hdd_context_lock);
- hddLog(VOS_TRACE_LEVEL_WARN,
- "%s: Invalid context, pAdapter [%pK] magic [%08x]",
- __func__, pAdapter, pStatsContext->magic);
- if (ioctl_debug)
- {
- pr_info("%s: Invalid context, pAdapter [%pK] magic [%08x]\n",
- __func__, pAdapter, pStatsContext->magic);
- }
- return;
- }
-
- /* context is valid so caller is still waiting */
-
- /* paranoia: invalidate the magic */
- pStatsContext->magic = 0;
-
- /* copy over the snr */
- pAdapter->snr = snr;
-
- /* notify the caller */
- complete(&pStatsContext->completion);
-
- /* serialization is complete */
- spin_unlock(&hdd_context_lock);
-}
-
struct rssi_priv {
v_S7_t rssi;
};
@@ -1363,74 +1305,120 @@ VOS_STATUS wlan_hdd_get_rssi(hdd_adapter_t *pAdapter, v_S7_t *rssi_value)
return VOS_STATUS_SUCCESS;
}
+struct snr_priv {
+ tANI_S8 snr;
+};
+
+/**
+ * hdd_get_snr_cb() - "Get SNR" callback function
+ * @snr: Current SNR of the station
+ * @sta_id: ID of the station
+ * @context: opaque context originally passed to SME. HDD always passes
+ * a cookie for the request context
+ *
+ * Return: None
+ */
+static void hdd_get_snr_cb(tANI_S8 snr, tANI_U32 sta_id, void *context)
+{
+ struct hdd_request *request;
+ struct snr_priv *priv;
+
+ if (ioctl_debug) {
+ pr_info("%s: snr [%d] sta_id [%d] context [%pK]\n",
+ __func__, (int)snr, (int)sta_id, context);
+ }
+
+ request = hdd_request_get(context);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Obsolete request", __func__);
+ return;
+ }
+
+ /* propagate response back to requesting thread */
+ priv = hdd_request_priv(request);
+ priv->snr = snr;
+ hdd_request_complete(request);
+ hdd_request_put(request);
+}
+
+/**
+ * wlan_hdd_get_snr() - Get the current SNR
+ * @pAdapter: adapter upon which the measurement is requested
+ * @snr: pointer to where the SNR should be returned
+ *
+ * Return: VOS_STATUS_SUCCESS on success, VOS_STATUS_E_** on error
+ */
VOS_STATUS wlan_hdd_get_snr(hdd_adapter_t *pAdapter, v_S7_t *snr)
{
- struct statsContext context;
- hdd_context_t *pHddCtx;
- hdd_station_ctx_t *pHddStaCtx;
- eHalStatus hstatus;
- unsigned long rc;
- int valid;
+ hdd_context_t *pHddCtx;
+ hdd_station_ctx_t *pHddStaCtx;
+ eHalStatus hstatus;
+ int valid;
+ int ret;
+ void *cookie;
+ struct hdd_request *request;
+ struct snr_priv *priv;
+ static const struct hdd_request_params params = {
+ .priv_size = sizeof(*priv),
+ .timeout_ms = WLAN_WAIT_TIME_STATS,
+ };
- ENTER();
- if (NULL == pAdapter)
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- "%s: Invalid context, pAdapter", __func__);
- return VOS_STATUS_E_FAULT;
- }
+ ENTER();
- pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
- valid = wlan_hdd_validate_context(pHddCtx);
- if (0 != valid)
- return VOS_STATUS_E_FAULT;
+ if (NULL == pAdapter) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Invalid context, pAdapter", __func__);
+ return VOS_STATUS_E_FAULT;
+ }
- pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
- init_completion(&context.completion);
- context.pAdapter = pAdapter;
- context.magic = SNR_CONTEXT_MAGIC;
+ valid = wlan_hdd_validate_context(pHddCtx);
+ if (0 != valid)
+ return VOS_STATUS_E_FAULT;
- hstatus = sme_GetSnr(pHddCtx->hHal, hdd_GetSnrCB,
- pHddStaCtx->conn_info.staId[ 0 ],
- pHddStaCtx->conn_info.bssId,
- &context);
- if (eHAL_STATUS_SUCCESS != hstatus)
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Unable to retrieve RSSI",
- __func__);
- /* we'll returned a cached value below */
- }
- else
- {
- /* request was sent -- wait for the response */
- rc = wait_for_completion_timeout(&context.completion,
- msecs_to_jiffies(WLAN_WAIT_TIME_STATS));
- if (!rc) {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("SME timed out while retrieving SNR"));
- /* we'll now returned a cached value below */
- }
- }
+ pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
- /* either we never sent a request, we sent a request and received a
- response or we sent a request and timed out. if we never sent a
- request or if we sent a request and got a response, we want to
- clear the magic out of paranoia. if we timed out there is a
- race condition such that the callback function could be
- executing at the same time we are. of primary concern is if the
- callback function had already verified the "magic" but had not
- yet set the completion variable when a timeout occurred. we
- serialize these activities by invalidating the magic while
- holding a shared spinlock which will cause us to block if the
- callback is currently executing */
- spin_lock(&hdd_context_lock);
- context.magic = 0;
- spin_unlock(&hdd_context_lock);
-
- *snr = pAdapter->snr;
- EXIT();
- return VOS_STATUS_SUCCESS;
+ request = hdd_request_alloc(&params);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Request allocation failure", __func__);
+ return VOS_STATUS_E_FAULT;
+ }
+ cookie = hdd_request_cookie(request);
+
+ hstatus = sme_GetSnr(pHddCtx->hHal, hdd_get_snr_cb,
+ pHddStaCtx->conn_info.staId[0],
+ pHddStaCtx->conn_info.bssId, cookie);
+ if (eHAL_STATUS_SUCCESS != hstatus) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: Unable to retrieve SNR", __func__);
+ /* we'll returned a cached value below */
+ } else {
+ /* request was sent -- wait for the response */
+ ret = hdd_request_wait_for_response(request);
+ if (ret) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("SME timed out while retrieving SNR"));
+ /* we'll now returned a cached value below */
+ } else {
+ /* update the adapter with the fresh results */
+ priv = hdd_request_priv(request);
+ pAdapter->snr = priv->snr;
+ }
+ }
+
+ /*
+ * either we never sent a request, we sent a request and
+ * received a response or we sent a request and timed out.
+ * regardless we are done with the request.
+ */
+ hdd_request_put(request);
+
+ *snr = pAdapter->snr;
+ EXIT();
+ return VOS_STATUS_SUCCESS;
}
void hdd_StatisticsCB( void *pStats, void *pContext )
@@ -3450,56 +3438,6 @@ void hdd_tx_per_hit_cb (void *pCallbackContext)
wireless_send_event(pAdapter->dev, IWEVCUSTOM, &wrqu, tx_fail);
}
-void hdd_GetLink_SpeedCB(tSirLinkSpeedInfo *pLinkSpeed, void *pContext)
-{
- struct linkspeedContext *pLinkSpeedContext;
- hdd_adapter_t *pAdapter;
-
- if ((NULL == pLinkSpeed) || (NULL == pContext))
- {
- hddLog(VOS_TRACE_LEVEL_ERROR,
- "%s: Bad param, pLinkSpeed [%pK] pContext [%pK]",
- __func__, pLinkSpeed, pContext);
- return;
- }
- spin_lock(&hdd_context_lock);
- pLinkSpeedContext = pContext;
- pAdapter = pLinkSpeedContext->pAdapter;
-
- /* there is a race condition that exists between this callback
- function and the caller since the caller could time out either
- before or while this code is executing. we use a spinlock to
- serialize these actions */
-
- if ((NULL == pAdapter) || (LINK_CONTEXT_MAGIC != pLinkSpeedContext->magic))
- {
- /* the caller presumably timed out so there is nothing we can do */
- spin_unlock(&hdd_context_lock);
- hddLog(VOS_TRACE_LEVEL_WARN,
- "%s: Invalid context, pAdapter [%pK] magic [%08x]",
- __func__, pAdapter, pLinkSpeedContext->magic);
- if (ioctl_debug)
- {
- pr_info("%s: Invalid context, pAdapter [%pK] magic [%08x]\n",
- __func__, pAdapter, pLinkSpeedContext->magic);
- }
- return;
- }
- /* context is valid so caller is still waiting */
-
- /* paranoia: invalidate the magic */
- pLinkSpeedContext->magic = 0;
-
- /* copy over the stats. do so as a struct copy */
- pAdapter->ls_stats = *pLinkSpeed;
-
- /* notify the caller */
- complete(&pLinkSpeedContext->completion);
-
- /* serialization is complete */
- spin_unlock(&hdd_context_lock);
-}
-
struct class_a_stats {
tCsrGlobalClassAStatsInfo class_a_stats;
};
diff --git a/techpack/qcacld-2.0/CORE/MAC/inc/sirApi.h b/techpack/qcacld-2.0/CORE/MAC/inc/sirApi.h
index 5de9ca4cbbd4..fe665fa392d6 100644
--- a/techpack/qcacld-2.0/CORE/MAC/inc/sirApi.h
+++ b/techpack/qcacld-2.0/CORE/MAC/inc/sirApi.h
@@ -904,7 +904,7 @@ typedef enum eSirLinkTrafficCheck
#define SIR_BG_SCAN_RETURN_CACHED_RESULTS 0x0
#define SIR_BG_SCAN_PURGE_RESUTLS 0x80
#define SIR_BG_SCAN_RETURN_FRESH_RESULTS 0x01
-#define SIR_SCAN_MAX_NUM_SSID 0x0A
+#define SIR_SCAN_MAX_NUM_SSID 0x10
#define SIR_BG_SCAN_RETURN_LFR_CACHED_RESULTS 0x02
#define SIR_BG_SCAN_PURGE_LFR_RESULTS 0x40
diff --git a/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
index 5211d130f6a5..9d4954d6ba92 100644
--- a/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
+++ b/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
@@ -3338,17 +3338,16 @@ limProcessStaMlmAddBssRsp( tpAniSirGlobal pMac, tpSirMsgQ limMsgQ,tpPESession ps
pStaDs->ucUcastSig = pAddBssParams->staContext.ucUcastSig;
pStaDs->ucBcastSig = pAddBssParams->staContext.ucBcastSig;
- //for ETSI, STA should follow AP' country code and judge the country of EU, while we have no valid AP, so need ignore country for ETSI test.
- //if(pMac->roam.configParam.gStaLocalEDCAEnable && vos_is_etsi_europe_country(pMac->scan.countryCodeCurrent))
- if(pMac->roam.configParam.gStaLocalEDCAEnable)
- {
-
- if (schGetParams(pMac, params, true /*local*/) != eSIR_SUCCESS)
- {
- PELOGE(limLog(pMac, LOGE, FL("schGetParams(local) failed"));)
- }
- else
- setSchEdcaParams(pMac, params, psessionEntry);
+ /*
+ * for ETSI, STA should follow AP' country code and judge the
+ * country of EU, while we have no valid AP, so need ignore
+ * country for ETSI test.
+ */
+ if (pMac->roam.configParam.gStaLocalEDCAEnable) {
+ if (schGetParams(pMac, params, true) != eSIR_SUCCESS)
+ PELOGE(limLog(pMac, LOGE, FL("schGetParams(local) failed"));)
+ else
+ setSchEdcaParams(pMac, params, psessionEntry);
}
// Downgrade the EDCA parameters if needed
diff --git a/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limSmeReqUtils.c b/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limSmeReqUtils.c
index c0c86a5a9b30..43c252b681d0 100644
--- a/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limSmeReqUtils.c
+++ b/techpack/qcacld-2.0/CORE/MAC/src/pe/lim/limSmeReqUtils.c
@@ -261,6 +261,7 @@ limSetRSNieWPAiefromSmeStartBSSReqMessage(tpAniSirGlobal pMac,
{
tANI_U8 wpaIndex = 0;
tANI_U32 privacy, val;
+ tANI_U32 status;
if (wlan_cfgGetInt(pMac, WNI_CFG_PRIVACY_ENABLED,
&privacy) != eSIR_SUCCESS)
@@ -331,9 +332,16 @@ limSetRSNieWPAiefromSmeStartBSSReqMessage(tpAniSirGlobal pMac,
limLog(pMac,
LOG1,
FL("Only RSN IE is present"));
- dot11fUnpackIeRSN(pMac,&pRSNie->rsnIEdata[2],
+ status = dot11fUnpackIeRSN(pMac,&pRSNie->rsnIEdata[2],
pRSNie->rsnIEdata[1],
&pSessionEntry->gStartBssRSNIe);
+ if (!DOT11F_SUCCEEDED(status))
+ {
+ limLog(pMac,
+ LOGE,FL("unpack failed for RSN IE (0x%08x)"),
+ status);
+ return false;
+ }
return true;
}
else if ((pRSNie->length == pRSNie->rsnIEdata[1] + 2) &&
@@ -343,9 +351,16 @@ limSetRSNieWPAiefromSmeStartBSSReqMessage(tpAniSirGlobal pMac,
LOG1,
FL("Only WPA IE is present"));
- dot11fUnpackIeWPA(pMac,&pRSNie->rsnIEdata[6],
+ status = dot11fUnpackIeWPA(pMac,&pRSNie->rsnIEdata[6],
pRSNie->rsnIEdata[1] - 4,
&pSessionEntry->gStartBssWPAIe);
+ if (!DOT11F_SUCCEEDED(status))
+ {
+ limLog(pMac,
+ LOGE,FL("unpack failed for WPA IE (0x%08x)"),
+ status);
+ return false;
+ }
return true;
}
@@ -368,13 +383,26 @@ limSetRSNieWPAiefromSmeStartBSSReqMessage(tpAniSirGlobal pMac,
else
{
/* Both RSN and WPA IEs are present */
- dot11fUnpackIeRSN(pMac,&pRSNie->rsnIEdata[2],
+ status = dot11fUnpackIeRSN(pMac,&pRSNie->rsnIEdata[2],
pRSNie->rsnIEdata[1], &pSessionEntry->gStartBssRSNIe);
+ if (!DOT11F_SUCCEEDED(status))
+ {
+ limLog(pMac,
+ LOGE,FL("unpack failed for RSN IE (0x%08x)"),
+ status);
+ return false;
+ }
- dot11fUnpackIeWPA(pMac,&pRSNie->rsnIEdata[wpaIndex + 6],
+ status = dot11fUnpackIeWPA(pMac,&pRSNie->rsnIEdata[wpaIndex + 6],
pRSNie->rsnIEdata[wpaIndex + 1]-4,
&pSessionEntry->gStartBssWPAIe);
-
+ if (!DOT11F_SUCCEEDED(status))
+ {
+ limLog(pMac,
+ LOGE,FL("unpack failed for WPA IE (0x%08x)"),
+ status);
+ return false;
+ }
}
}
else
diff --git a/techpack/qcacld-2.0/CORE/MAC/src/pe/sch/schMessage.c b/techpack/qcacld-2.0/CORE/MAC/src/pe/sch/schMessage.c
index 700825d07844..722013f3ee48 100644
--- a/techpack/qcacld-2.0/CORE/MAC/src/pe/sch/schMessage.c
+++ b/techpack/qcacld-2.0/CORE/MAC/src/pe/sch/schMessage.c
@@ -254,7 +254,11 @@ schGetParams(
tANI_U32 etsi_b[] = {WNI_CFG_EDCA_ETSI_ACBE, WNI_CFG_EDCA_ETSI_ACBK,
WNI_CFG_EDCA_ETSI_ACVI, WNI_CFG_EDCA_ETSI_ACVO};
- if ((wlan_cfgGetStr(pMac, WNI_CFG_COUNTRY_CODE, country_code_str,
+ if(pMac->roam.configParam.gStaLocalEDCAEnable)
+ {
+ val = WNI_CFG_EDCA_PROFILE_ETSI_EUROPE;
+ }
+ else if ((wlan_cfgGetStr(pMac, WNI_CFG_COUNTRY_CODE, country_code_str,
&country_code_len) == eSIR_SUCCESS) &&
vos_is_etsi_europe_country(country_code_str)) {
val = WNI_CFG_EDCA_PROFILE_ETSI_EUROPE;
diff --git a/techpack/qcacld-2.0/CORE/SERVICES/COMMON/ieee80211_defines.h b/techpack/qcacld-2.0/CORE/SERVICES/COMMON/ieee80211_defines.h
index cdd308f3bf02..60561255ce5c 100644
--- a/techpack/qcacld-2.0/CORE/SERVICES/COMMON/ieee80211_defines.h
+++ b/techpack/qcacld-2.0/CORE/SERVICES/COMMON/ieee80211_defines.h
@@ -306,8 +306,8 @@ typedef u_int32_t IEEE80211_SCAN_ID;
#define IEEE80211_SCAN_CHAN_EVENT 0x0400 /* scan chan event for offload architectures */
#define IEEE80211_SCAN_FILTER_PROBE_REQ 0x0800 /* Filter probe requests- applicable only for offload architectures*/
-#define IEEE80211_SCAN_PARAMS_MAX_SSID 10
-#define IEEE80211_SCAN_PARAMS_MAX_BSSID 10
+#define IEEE80211_SCAN_PARAMS_MAX_SSID 16
+#define IEEE80211_SCAN_PARAMS_MAX_BSSID 16
/* flag definitions passed to scan_cancel API */
diff --git a/techpack/qcacld-2.0/CORE/SYS/legacy/src/utils/src/parserApi.c b/techpack/qcacld-2.0/CORE/SYS/legacy/src/utils/src/parserApi.c
index 52f86adbced5..b9103e9182f3 100644
--- a/techpack/qcacld-2.0/CORE/SYS/legacy/src/utils/src/parserApi.c
+++ b/techpack/qcacld-2.0/CORE/SYS/legacy/src/utils/src/parserApi.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -5843,16 +5843,22 @@ tSirRetStatus PopulateDot11fAssocResWscIE(tpAniSirGlobal pMac,
{
tDot11fIEWscAssocReq parsedWscAssocReq = { 0, };
tANI_U8 *wscIe;
+ tANI_U32 status;
wscIe = limGetWscIEPtr(pMac, pRcvdAssocReq->addIE.addIEdata, pRcvdAssocReq->addIE.length);
if(wscIe != NULL)
{
// retreive WSC IE from given AssocReq
- dot11fUnpackIeWscAssocReq( pMac,
+ status = dot11fUnpackIeWscAssocReq( pMac,
wscIe + 2 + 4, // EID, length, OUI
wscIe[ 1 ] - 4, // length without OUI
&parsedWscAssocReq );
+ if (!DOT11F_SUCCEEDED(status))
+ {
+ limLog(pMac, LOGE, FL("Unpack wsc failed status: (0x%08x)"), status);
+ return eSIR_HAL_INPUT_INVALID;
+ }
pDot11f->present = 1;
// version has to be 0x10
pDot11f->Version.present = 1;