Merge "wlan: Fix to pass appropriate buffer length to unpack RSN IE" into wlan-driver.lnx.1.0
diff --git a/CORE/HDD/inc/wlan_hdd_cfg80211.h b/CORE/HDD/inc/wlan_hdd_cfg80211.h
index 7d47327..369477b 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg80211.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg80211.h
@@ -121,6 +121,9 @@
#define NUM_RADIOS 0x1
#endif /* WLAN_FEATURE_LINK_LAYER_STATS */
+#define WOWL_PTRN_MAX_SIZE 128
+#define WOWL_PTRN_MASK_MAX_SIZE 16
+#define WOWL_MAX_PTRNS_ALLOWED 16
typedef struct {
u8 element_id;
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index fbdf0c9..2e3b606 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -347,7 +347,6 @@
#define STATS_CONTEXT_MAGIC 0x53544154 //STAT
#define RSSI_CONTEXT_MAGIC 0x52535349 //RSSI
#define POWER_CONTEXT_MAGIC 0x504F5752 //POWR
-#define SNR_CONTEXT_MAGIC 0x534E5200 //SNR
#define BCN_MISS_RATE_CONTEXT_MAGIC 0x513F5753
#define FW_STATS_CONTEXT_MAGIC 0x5022474E //FW STATS
#define GET_FRAME_LOG_MAGIC 0x464c4f47 //FLOG
@@ -1776,6 +1775,7 @@
*/
vos_timer_t tx_rx_trafficTmr;
v_U8_t drvr_miracast;
+ bool is_vowifi_enabled;
v_U8_t issplitscan_enabled;
v_U8_t isTdlsScanCoexistence;
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index b1ccb19..e92b5b7 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -459,6 +459,15 @@
};
#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) || defined(WITH_BACKPORTS)
+static const struct wiphy_wowlan_support wowlan_support_cfg80211_init = {
+ .flags = WIPHY_WOWLAN_MAGIC_PKT,
+ .n_patterns = WOWL_MAX_PTRNS_ALLOWED,
+ .pattern_min_len = 1,
+ .pattern_max_len = WOWL_PTRN_MAX_SIZE,
+};
+#endif
+
static struct cfg80211_ops wlan_hdd_cfg80211_ops;
/* Data rate 100KBPS based on IE Index */
@@ -9019,6 +9028,14 @@
wiphy->flags |= WIPHY_FLAG_DISABLE_BEACON_HINTS;
#endif
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,11,0)) || defined(WITH_BACKPORTS)
+ wiphy->wowlan = &wowlan_support_cfg80211_init;
+#else
+ wiphy->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT;
+ wiphy->wowlan.n_patterns = WOWL_MAX_PTRNS_ALLOWED;
+ wiphy->wowlan.pattern_min_len = 1;
+ wiphy->wowlan.pattern_max_len = WOWL_PTRN_MAX_SIZE;
+#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 20c34af..9856f96 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -1727,6 +1727,11 @@
if (eSAP_STOP_BSS_EVENT == sapEvent)
vos_event_set(&pHostapdState->vosEvent);
+ if (hdd_is_any_session_connected(pHddCtx) == VOS_STATUS_E_FAILURE) {
+ hdd_enable_bmps_imps(pHddCtx);
+ sme_request_imps(pHddCtx->hHal);
+ }
+
/* notify userspace that the BSS has stopped */
memset(&we_custom_event, '\0', sizeof(we_custom_event));
memcpy(&we_custom_event, stopBssEvent, event_len);
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 07e1a34..784eb77 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -878,13 +878,28 @@
{
tANI_U8 sta_chan;
+ if (!hdd_ctx->cfg_ini) {
+ hddLog(LOGE, "cfg_ini got NULL");
+ return;
+ }
+
sta_chan = hdd_get_operating_channel(hdd_ctx, WLAN_HDD_INFRA_STATION);
- if (CSR_IS_CHANNEL_24GHZ(sta_chan))
+ if (CSR_IS_CHANNEL_24GHZ(sta_chan)) {
sme_set_vowifi_mode(hdd_ctx->hHal, enable);
- else
+ if (enable && hdd_ctx->cfg_ini->dynSplitscan) {
+ hdd_ctx->is_vowifi_enabled = true;
+ hdd_ctx->issplitscan_enabled = TRUE;
+ sme_enable_disable_split_scan(hdd_ctx->hHal,
+ hdd_ctx->cfg_ini->nNumStaChanCombinedConc,
+ hdd_ctx->cfg_ini->nNumP2PChanCombinedConc);
+ } else {
+ hdd_ctx->is_vowifi_enabled = false;
+ }
+ } else {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"VoWiFi command rejected as not connected in 2.4GHz");
+ }
}
/* Function header left blank Intentionally */
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index 0b47a91..d159b9c 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -1275,6 +1275,7 @@
struct net_device *dev = wdev->netdev;
#endif
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR( dev );
+ hdd_adapter_t *pGoAdapter;
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
@@ -1443,6 +1444,14 @@
{
home_ch = pAdapter->sessionCtx.station.conn_info.operationChannel;
}
+ else
+ {
+ pGoAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_GO);
+ if (pGoAdapter && test_bit(SOFTAP_BSS_STARTED,
+ &pGoAdapter->event_flags))
+ home_ch = pGoAdapter->sessionCtx.ap.operatingChannel;
+ }
+
//If GO adapter exists and operating on same frequency
//then we will not request remain on channel
if (ieee80211_frequency_to_channel(chan->center_freq) == home_ch)
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index f643e30..3fadfa5 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -3007,7 +3007,7 @@
cfg_param->txRxThresholdForSplitScan) ||
(pAdapter->hdd_stats.hddTxRxStats.pkt_rx_count >
cfg_param->txRxThresholdForSplitScan) ||
- pHddCtx->drvr_miracast ||
+ pHddCtx->drvr_miracast || pHddCtx->is_vowifi_enabled ||
(WLAN_HDD_P2P_GO == pAdapter->device_mode))
{
pAdapter->hdd_stats.hddTxRxStats.pkt_tx_count = 0;
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 9459131..0e69ae2 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -105,6 +105,7 @@
#include "vos_utils.h"
#include "sapInternal.h"
+#include "wlan_hdd_request_manager.h"
#ifdef CONFIG_HAS_EARLYSUSPEND
extern void hdd_suspend_wlan(struct early_suspend *wlan_suspend);
@@ -972,62 +973,35 @@
spin_unlock(&hdd_context_lock);
}
-static void hdd_GetSnrCB(tANI_S8 snr, tANI_U32 staId, void *pContext)
+struct snr_priv {
+ int8_t 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 staId, void *context)
{
- struct statsContext *pStatsContext;
- hdd_adapter_t *pAdapter;
+ struct hdd_request *request;
+ struct snr_priv *priv;
- if (ioctl_debug)
- {
- pr_info("%s: snr [%d] STA [%d] pContext [%pK]\n",
- __func__, (int)snr, (int)staId, pContext);
- }
+ request = hdd_request_get(context);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Obsolete request"));
+ return;
+ }
- 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);
+ /* propagate response back to requesting thread */
+ priv = hdd_request_priv(request);
+ priv->snr = snr;
+ hdd_request_complete(request);
+ hdd_request_put(request);
}
VOS_STATUS wlan_hdd_get_rssi(hdd_adapter_t *pAdapter, v_S7_t *rssi_value)
@@ -1179,12 +1153,17 @@
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;
- long lrc;
- 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();
@@ -1197,8 +1176,8 @@
pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
- valid = wlan_hdd_validate_context(pHddCtx);
- if (0 != valid)
+ ret = wlan_hdd_validate_context(pHddCtx);
+ if (0 != ret)
{
return VOS_STATUS_E_FAULT;
}
@@ -1210,14 +1189,17 @@
return VOS_STATUS_E_FAULT;
}
- init_completion(&context.completion);
- context.pAdapter = pAdapter;
- context.magic = SNR_CONTEXT_MAGIC;
+ request = hdd_request_alloc(¶ms);
+ if (!request) {
+ hddLog(VOS_TRACE_LEVEL_ERROR, FL("Request allocation failure"));
+ return VOS_STATUS_E_FAULT;
+ }
+ cookie = hdd_request_cookie(request);
- hstatus = sme_GetSnr(pHddCtx->hHal, hdd_GetSnrCB,
+ hstatus = sme_GetSnr(pHddCtx->hHal, hdd_get_snr_cb,
pHddStaCtx->conn_info.staId[ 0 ],
pHddStaCtx->conn_info.bssId,
- &context);
+ cookie);
if (eHAL_STATUS_SUCCESS != hstatus)
{
hddLog(VOS_TRACE_LEVEL_ERROR,"%s: Unable to retrieve RSSI",
@@ -1227,30 +1209,24 @@
else
{
/* request was sent -- wait for the response */
- lrc = wait_for_completion_timeout(&context.completion,
- msecs_to_jiffies(WLAN_WAIT_TIME_STATS));
- if (lrc <= 0)
- {
- hddLog(VOS_TRACE_LEVEL_ERROR, "%s: SME %s while retrieving SNR",
- __func__, (0 == lrc) ? "timeout" : "interrupt");
- /* we'll now returned a cached value below */
- }
+ 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. 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);
+ /*
+ * 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;
diff --git a/CORE/HDD/src/wlan_hdd_wowl.c b/CORE/HDD/src/wlan_hdd_wowl.c
index 846024b..73268c5 100644
--- a/CORE/HDD/src/wlan_hdd_wowl.c
+++ b/CORE/HDD/src/wlan_hdd_wowl.c
@@ -43,9 +43,6 @@
* Preprocessor Definitions and Constants
* -------------------------------------------------------------------------*/
-#define WOWL_PTRN_MAX_SIZE 128
-#define WOWL_PTRN_MASK_MAX_SIZE 16
-#define WOWL_MAX_PTRNS_ALLOWED 16
#define WOWL_INTER_PTRN_TOKENIZER ';'
#define WOWL_INTRA_PTRN_TOKENIZER ':'
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 5b93620..ad1a547 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -700,8 +700,6 @@
#define SIR_HAL_SET_MAX_TX_POWER_PER_BAND_REQ \
(SIR_HAL_ITC_MSG_TYPES_BEGIN + 229)
-#define SIR_HAL_SET_MAX_TX_POWER_PER_BAND_RSP \
- (SIR_HAL_ITC_MSG_TYPES_BEGIN + 230)
#define SIR_HAL_BCN_MISS_RATE_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 231)
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index af86449..96ee524 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -8721,6 +8721,7 @@
pNode, &pNext );
pNode = pNext;
pNext = NULL;
+ tmp_tx_context = NULL;
}
else
{
@@ -8730,7 +8731,7 @@
}
}
- if (!tmp_tx_context) {
+ if (!pNode) {
limLog(pMac, LOGE, FL("context is NULL"));
return eHAL_STATUS_SUCCESS;
}
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index d253a9f..0d4ee2c 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -4066,4 +4066,12 @@
return csrConvertCBIniValueToPhyCBState(cb_ini_value);
}
+/**
+ * sme_request_imps() - Send IMPS request
+ * @hal: hal context
+ *
+ * Return: void
+ */
+void sme_request_imps(tHalHandle hal);
+
#endif //#if !defined( __SME_API_H )
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index b0de3d8..81ae6b8 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -15274,3 +15274,10 @@
session = CSR_GET_SESSION(mac_ctx, session_id);
return session->connect_req_start_time;
}
+
+void sme_request_imps(tHalHandle hal)
+{
+ tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+
+ csrScanStartIdleScan(mac_ctx);
+}
diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c
index 5c72c14..c90dbaf 100644
--- a/CORE/SYS/legacy/src/utils/src/macTrace.c
+++ b/CORE/SYS/legacy/src/utils/src/macTrace.c
@@ -786,7 +786,6 @@
#endif //SUPPORT_BEACON_FILTER
CASE_RETURN_STRING(WDA_SET_MAX_TX_POWER_REQ);
CASE_RETURN_STRING(WDA_SET_MAX_TX_POWER_RSP);
- CASE_RETURN_STRING(WDA_SET_MAX_TX_POWER_PER_BAND_RSP);
CASE_RETURN_STRING(WDA_SET_MAX_TX_POWER_PER_BAND_REQ);
CASE_RETURN_STRING(WDA_SEND_MSG_COMPLETE);
CASE_RETURN_STRING(WDA_SET_HOST_OFFLOAD);
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 69a48fd..dda8b04 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1144,8 +1144,6 @@
#define WDA_SET_MAX_TX_POWER_PER_BAND_REQ \
SIR_HAL_SET_MAX_TX_POWER_PER_BAND_REQ
-#define WDA_SET_MAX_TX_POWER_PER_BAND_RSP \
- SIR_HAL_SET_MAX_TX_POWER_PER_BAND_RSP
#define WDA_SEND_MSG_COMPLETE SIR_HAL_SEND_MSG_COMPLETE
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 882dc14..6124bd4 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -8855,8 +8855,6 @@
void* pUserData)
{
tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
- tWDA_CbContext *pWDA = NULL;
- tMaxTxPowerPerBandParams *pMxTxPwrPerBandParams = NULL;
VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"<------ %s ", __func__);
@@ -8867,38 +8865,14 @@
VOS_ASSERT(0);
return ;
}
- pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
- if (NULL == pWDA)
- {
- VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
- "%s:pWDA is NULL", __func__);
- vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
- vos_mem_free(pWdaParams->wdaMsgParam);
- vos_mem_free(pWdaParams);
- VOS_ASSERT(0);
- return ;
- }
- pMxTxPwrPerBandParams = (tMaxTxPowerPerBandParams*)pWdaParams->wdaMsgParam;
- if ( NULL == pMxTxPwrPerBandParams )
- {
- VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
- "%s: pMxTxPwrPerBandParams received NULL ", __func__);
- VOS_ASSERT(0);
- vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
- vos_mem_free(pWdaParams);
- return;
- }
-
- /*need to free memory for the pointers used in the
- WDA Process.Set Max Tx Power Req function*/
+ /*
+ * Need to free memory for the pointers used in the WDA Process.Set Max Tx
+ * Power Req function
+ */
vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams->wdaMsgParam);
vos_mem_free(pWdaParams);
- pMxTxPwrPerBandParams->power = pwdiSetMaxTxPowerPerBandRsp->ucPower;
-
- /* send response to UMAC*/
- WDA_SendMsg(pWDA, WDA_SET_MAX_TX_POWER_PER_BAND_RSP,
- pMxTxPwrPerBandParams, 0);
return;
}
@@ -8956,12 +8930,10 @@
"Failure in SET MAX TX Power REQ Params WDI API,"
" free all the memory");
vos_mem_free(pWdaParams->wdaWdiApiMsgParam);
+ vos_mem_free(pWdaParams->wdaMsgParam);
vos_mem_free(pWdaParams);
- /* send response to UMAC*/
- WDA_SendMsg(pWDA,
- WDA_SET_MAX_TX_POWER_PER_BAND_RSP,
- MaxTxPowerPerBandParams, 0);
}
+
return CONVERT_WDI2VOS_STATUS(status);
}