Merge "Wlan: use proper variable to get the BSSID in IBSS"
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 0c789a9..87f3633 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1519,6 +1519,13 @@
#define CFG_OBSS_HT40_SCAN_WIDTH_TRIGGER_INTERVAL_MAX ( 900 )
#define CFG_OBSS_HT40_SCAN_WIDTH_TRIGGER_INTERVAL_DEFAULT ( 200 )
+/* RPS configurations */
+#define CFG_RPS_CPU_MAP_MIN (0)
+#define CFG_RPS_CPU_MAP_MAX (0xff)
+
+#define CFG_RPS_CPU_MAP_NAME "rps_mask"
+#define CFG_RPS_CPU_MAP_DEFAULT (0x00)
+
#define CFG_MULTICAST_HOST_FW_MSGS "gMulticastHostMsgs"
#define CFG_MULTICAST_HOST_FW_MSGS_MIN (0)
#define CFG_MULTICAST_HOST_FW_MSGS_MAX (1)
@@ -3057,6 +3064,7 @@
v_BOOL_t ignorePeerHTopMode;
v_U8_t gOptimizeCAevent;
v_BOOL_t crash_inject_enabled;
+ v_U16_t rps_mask;
} hdd_config_t;
/*---------------------------------------------------------------------------
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 5f5d258..5ba7ffc 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3402,6 +3402,12 @@
CFG_ENABLE_CRASH_INJECT_MIN,
CFG_ENABLE_CRASH_INJECT_MAX),
+ REG_VARIABLE( CFG_RPS_CPU_MAP_NAME, WLAN_PARAM_HexInteger,
+ hdd_config_t, rps_mask,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_RPS_CPU_MAP_DEFAULT,
+ CFG_RPS_CPU_MAP_MIN,
+ CFG_RPS_CPU_MAP_MAX),
};
/*
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index b94bd01..b326850 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -9821,7 +9821,11 @@
rssi = (VOS_MIN ((pBssDesc->rssi + pBssDesc->sinr), 0))*100;
- return cfg80211_inform_bss(wiphy, chan, pBssDesc->bssId,
+ return cfg80211_inform_bss(wiphy, chan,
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ CFG80211_BSS_FTYPE_UNKNOWN,
+#endif
+ pBssDesc->bssId,
le64_to_cpu(*(__le64 *)pBssDesc->timeStamp),
pBssDesc->capabilityInfo,
pBssDesc->beaconInterval, ie, ie_length,
@@ -14900,13 +14904,42 @@
#ifdef FEATURE_WLAN_TDLS
#if TDLS_MGMT_VERSION2
-static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
- u8 *peer, u8 action_code, u8 dialog_token,
- u16 status_code, u32 peer_capability, const u8 *buf, size_t len)
+static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
+ struct net_device *dev,
+ u8 *peer, u8 action_code,
+ u8 dialog_token,
+ u16 status_code, u32 peer_capability,
+ const u8 *buf, size_t len)
+#else /* TDLS_MGMT_VERSION2 */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)) || defined(WITH_BACKPORTS)
+static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
+ struct net_device *dev,
+ const u8 *peer, u8 action_code,
+ u8 dialog_token, u16 status_code,
+ u32 peer_capability, bool initiator,
+ const u8 *buf, size_t len)
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0))
+static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
+ struct net_device *dev,
+ const u8 *peer, u8 action_code,
+ u8 dialog_token, u16 status_code,
+ u32 peer_capability, const u8 *buf,
+ size_t len)
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))
+static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
+ struct net_device *dev,
+ u8 *peer, u8 action_code,
+ u8 dialog_token,
+ u16 status_code, u32 peer_capability,
+ const u8 *buf, size_t len)
#else
-static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
- u8 *peer, u8 action_code, u8 dialog_token,
- u16 status_code, const u8 *buf, size_t len)
+static int __wlan_hdd_cfg80211_tdls_mgmt(struct wiphy *wiphy,
+ struct net_device *dev,
+ u8 *peer, u8 action_code,
+ u8 dialog_token,
+ u16 status_code, const u8 *buf,
+ size_t len)
+#endif
#endif
{
hdd_adapter_t *pAdapter;
@@ -15239,17 +15272,33 @@
{
int ret;
- vos_ssr_protect(__func__);
+ vos_ssr_protect(__func__);
#if TDLS_MGMT_VERSION2
- ret = __wlan_hdd_cfg80211_tdls_mgmt(wiphy, dev, peer, action_code, dialog_token,
- status_code, peer_capability, buf, len);
+ ret = __wlan_hdd_cfg80211_tdls_mgmt(wiphy, dev, peer, action_code,
+ dialog_token, status_code,
+ peer_capability, buf, len);
+#else /* TDLS_MGMT_VERSION2 */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)) || defined(WITH_BACKPORTS)
+ ret = __wlan_hdd_cfg80211_tdls_mgmt(wiphy, dev, peer, action_code,
+ dialog_token, status_code,
+ peer_capability, initiator,
+ buf, len);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 16, 0))
+ ret = __wlan_hdd_cfg80211_tdls_mgmt(wiphy, dev, peer, action_code,
+ dialog_token, status_code,
+ peer_capability, buf, len);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 15, 0))
+ ret = __wlan_hdd_cfg80211_tdls_mgmt(wiphy, dev, peer, action_code,
+ dialog_token, status_code,
+ peer_capability, buf, len);
#else
- ret = __wlan_hdd_cfg80211_tdls_mgmt(wiphy, dev, peer, action_code, dialog_token,
- status_code, buf, len);
+ ret = __wlan_hdd_cfg80211_tdls_mgmt(wiphy, dev, peer, action_code,
+ dialog_token, status_code, buf, len);
#endif
- vos_ssr_unprotect(__func__);
+#endif
+ vos_ssr_unprotect(__func__);
- return ret;
+ return ret;
}
int wlan_hdd_tdls_extctrl_config_peer(hdd_adapter_t *pAdapter,
diff --git a/CORE/HDD/src/wlan_hdd_ftm.c b/CORE/HDD/src/wlan_hdd_ftm.c
index 0e56a65..cbe31d0 100644
--- a/CORE/HDD/src/wlan_hdd_ftm.c
+++ b/CORE/HDD/src/wlan_hdd_ftm.c
@@ -4472,7 +4472,7 @@
status = VOS_STATUS_E_FAILURE;
goto done;
}
- *pTxPwr = ((((pMsgBody->GetTxPowerReport.pwrTemplateIndex & 0x1F) + 4)*50)/100);
+ *pTxPwr = pMsgBody->GetTxPowerReport.pwrTemplateIndex;
done:
@@ -4495,11 +4495,8 @@
static VOS_STATUS wlan_ftm_priv_get_txrate(hdd_adapter_t *pAdapter,char *pTxRate)
{
- uPttMsgs *pMsgBody;
- VOS_STATUS status;
- v_U16_t rate_index,ii;
- long ret;
-
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+ v_U16_t ii;
hdd_context_t *pHddCtx = (hdd_context_t *)pAdapter->pHddCtx;
if (pHddCtx->ftm.ftm_state != WLAN_FTM_STARTED)
@@ -4509,51 +4506,8 @@
return VOS_STATUS_E_FAILURE;
}
- if (NULL == pMsgBuf)
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
- "%s:pMsgBuf is NULL", __func__);
- return VOS_STATUS_E_NOMEM;
- }
- vos_mem_set(pMsgBuf, sizeof(tPttMsgbuffer), 0);
- init_completion(&pHddCtx->ftm.ftm_comp_var);
- pMsgBuf->msgId = PTT_MSG_GET_TX_POWER_REPORT;
- pMsgBuf->msgBodyLength = sizeof(tMsgPttGetTxPowerReport) + PTT_HEADER_LENGTH;
-
- pMsgBody = &pMsgBuf->msgBody;
-
- status = wlan_ftm_postmsg((v_U8_t*)pMsgBuf,pMsgBuf->msgBodyLength);
-
- if (status != VOS_STATUS_SUCCESS)
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
- "%s:wlan_ftm_postmsg failed", __func__);
- status = VOS_STATUS_E_FAILURE;
- goto done;
- }
- ret = wait_for_completion_interruptible_timeout(&pHddCtx->ftm.ftm_comp_var,
- msecs_to_jiffies(WLAN_FTM_COMMAND_TIME_OUT));
- if (0 >= ret )
- {
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- FL("wait on ftm_comp_var failed %ld"), ret);
- }
-
- if (pMsgBuf->msgResponse == PTT_STATUS_SUCCESS) {
-
- rate_index = pMsgBody->GetTxPowerReport.rate;
- }
- else {
- /*Return the default rate*/
- //rate_index = HAL_PHY_RATE_11A_6_MBPS;
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
- "%s: PTT_MSG_GET_TX_POWER_REPORT failed", __func__);
- status = VOS_STATUS_E_FAILURE;
- goto done;
- }
-
for(ii = 0; ii < SIZE_OF_TABLE(rateName_rateIndex_tbl); ii++) {
- if(rateName_rateIndex_tbl[ii].rate_index == rate_index)
+ if(rateName_rateIndex_tbl[ii].rate_index == ftm_status.frameParams.rate)
break;
}
if(ii >= SIZE_OF_TABLE(rateName_rateIndex_tbl))
@@ -4563,8 +4517,8 @@
goto done;
}
strlcpy(pTxRate,rateName_rateIndex_tbl[ii].rate_str, WE_FTM_MAX_STR_LEN);
-done:
+done:
return status;
}
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index f7fb3d2..c74f49d 100755
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -4364,7 +4364,13 @@
int set_value;
/* Move pointer to ahead of TDLSOFFCH*/
value += 26;
- sscanf(value, "%d", &set_value);
+ if (!(sscanf(value, "%d", &set_value))) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ FL("No input identified"));
+ ret = -EINVAL;
+ goto exit;
+ }
+
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: Tdls offchannel offset:%d",
__func__, set_value);
@@ -4380,7 +4386,13 @@
int set_value;
/* Move pointer to ahead of tdlsoffchnmode*/
value += 18;
- sscanf(value, "%d", &set_value);
+ ret = sscanf(value, "%d", &set_value);
+ if (ret != 1) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ FL("No input identified"));
+ ret = -EINVAL;
+ goto exit;
+ }
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: Tdls offchannel mode:%d",
__func__, set_value);
@@ -4395,7 +4407,14 @@
int set_value;
/* Move pointer to ahead of TDLSOFFCH*/
value += 14;
- sscanf(value, "%d", &set_value);
+ ret = sscanf(value, "%d", &set_value);
+ if (ret != 1) {
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "Wrong value is given for hdd_set_tdls_offchannel");
+ ret = -EINVAL;
+ goto exit;
+ }
+
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
"%s: Tdls offchannel num: %d",
__func__, set_value);
@@ -7341,20 +7360,20 @@
ENTER();
- if ( VOS_TRUE == bCloseSession )
- {
- status = hdd_sta_id_hash_detach(pAdapter);
- if (status != VOS_STATUS_SUCCESS)
- hddLog(VOS_TRACE_LEVEL_ERROR,
- FL("sta id hash detach failed"));
- }
-
pScanInfo = &pHddCtx->scan_info;
switch(pAdapter->device_mode)
{
+ case WLAN_HDD_IBSS:
+ if ( VOS_TRUE == bCloseSession )
+ {
+ status = hdd_sta_id_hash_detach(pAdapter);
+ if (status != VOS_STATUS_SUCCESS)
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("sta id hash detach failed"));
+ }
+
case WLAN_HDD_INFRA_STATION:
case WLAN_HDD_P2P_CLIENT:
- case WLAN_HDD_IBSS:
case WLAN_HDD_P2P_DEVICE:
{
hdd_station_ctx_t *pstation = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter);
@@ -7480,6 +7499,14 @@
case WLAN_HDD_SOFTAP:
case WLAN_HDD_P2P_GO:
+ if ( VOS_TRUE == bCloseSession )
+ {
+ status = hdd_sta_id_hash_detach(pAdapter);
+ if (status != VOS_STATUS_SUCCESS)
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("sta id hash detach failed"));
+ }
+
//Any softap specific cleanup here...
if (pAdapter->device_mode == WLAN_HDD_P2P_GO) {
while (pAdapter->is_roc_inprogress) {
@@ -9211,6 +9238,7 @@
struct nlmsghdr *nlh;
tAniMsgHdr *ani_hdr;
int flags = GFP_KERNEL;
+ void *nl_data = NULL;
if (in_interrupt() || irqs_disabled() || in_atomic())
flags = GFP_ATOMIC;
@@ -9238,6 +9266,13 @@
nlh->nlmsg_len = NLMSG_LENGTH((sizeof(tAniMsgHdr)));
skb_put(skb, NLMSG_SPACE(sizeof(tAniMsgHdr)));
break;
+ case WLAN_MSG_RPS_ENABLE_IND:
+ ani_hdr->length = len;
+ nlh->nlmsg_len = NLMSG_LENGTH((sizeof(tAniMsgHdr) + len));
+ nl_data = (char *)ani_hdr + sizeof(tAniMsgHdr);
+ memcpy(nl_data, data, len);
+ skb_put(skb, NLMSG_SPACE(sizeof(tAniMsgHdr) + len));
+ break;
default:
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"Attempt to send unknown nlink message %d", type);
@@ -9560,6 +9595,46 @@
return;
}
+static void hdd_dp_util_send_rps_ind(hdd_context_t *hdd_ctxt)
+{
+ hdd_adapter_t *adapter;
+ hdd_adapter_list_node_t *adapter_node, *next;
+ VOS_STATUS status = VOS_STATUS_SUCCESS;
+ struct wlan_rps_data rps_data;
+ int count;
+
+ if(!hdd_ctxt->cfg_ini->rps_mask)
+ {
+ return;
+ }
+
+ for (count=0; count < WLAN_SVC_IFACE_NUM_QUEUES; count++)
+ {
+ rps_data.cpu_map[count] = hdd_ctxt->cfg_ini->rps_mask;
+ }
+
+ rps_data.num_queues = WLAN_SVC_IFACE_NUM_QUEUES;
+
+ hddLog(LOG1, FL("0x%x 0x%x 0x%x 0x%x 0x%x 0x%x"),
+ rps_data.cpu_map[0], rps_data.cpu_map[1],rps_data.cpu_map[2],
+ rps_data.cpu_map[3], rps_data.cpu_map[4], rps_data.cpu_map[5]);
+
+ status = hdd_get_front_adapter (hdd_ctxt, &adapter_node);
+
+ while (NULL != adapter_node && VOS_STATUS_SUCCESS == status)
+ {
+ adapter = adapter_node->pAdapter;
+ if (NULL != adapter) {
+ strlcpy(rps_data.ifname, adapter->dev->name,
+ sizeof(rps_data.ifname));
+ wlan_hdd_send_svc_nlink_msg(WLAN_MSG_RPS_ENABLE_IND,
+ (void *)&rps_data,sizeof(rps_data));
+ }
+ status = hdd_get_next_adapter (hdd_ctxt, adapter_node, &next);
+ adapter_node = next;
+ }
+}
+
/**---------------------------------------------------------------------------
\brief hdd_wlan_startup() - HDD init function
@@ -10411,6 +10486,7 @@
{
hddLog(VOS_TRACE_LEVEL_INFO, FL("Registered IPv4 notifier"));
}
+ hdd_dp_util_send_rps_ind(pHddCtx);
goto success;
diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c
index 000f929..3119acc 100644
--- a/CORE/HDD/src/wlan_hdd_p2p.c
+++ b/CORE/HDD/src/wlan_hdd_p2p.c
@@ -173,22 +173,28 @@
{
hdd_adapter_t *pAdapter = (hdd_adapter_t*) pCtx;
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
- hdd_remain_on_chan_ctx_t *pRemainChanCtx = cfgState->remain_on_chan_ctx;
+ hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ rem_on_channel_request_type_t req_type;
+
if (pHddCtx == NULL)
{
hddLog(LOGE, "%s: Hdd Context is NULL", __func__);
return eHAL_STATUS_FAILURE;
}
- if (pRemainChanCtx == NULL)
- {
- hddLog( LOGW,
- "%s: No Rem on channel pending for which Rsp is received", __func__);
- return eHAL_STATUS_SUCCESS;
- }
mutex_lock(&pHddCtx->roc_lock);
+
+ pRemainChanCtx = cfgState->remain_on_chan_ctx;
+ if (pRemainChanCtx == NULL)
+ {
+ hddLog( LOGW,
+ "%s: No Rem on channel pending for which Rsp is received", __func__);
+ mutex_unlock(&pHddCtx->roc_lock);
+ return eHAL_STATUS_SUCCESS;
+ }
+
hddLog( VOS_TRACE_LEVEL_INFO,
"Received ROC rsp (request type %d, channel %d, cookie %llu",
pRemainChanCtx->rem_on_chan_request,
@@ -196,7 +202,6 @@
pRemainChanCtx->cookie);
vos_timer_stop(&pRemainChanCtx->hdd_remain_on_chan_timer);
vos_timer_destroy(&pRemainChanCtx->hdd_remain_on_chan_timer);
- mutex_unlock(&pHddCtx->roc_lock);
if ( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request )
{
if( cfgState->buf )
@@ -220,6 +225,8 @@
pAdapter->lastRocTs = vos_timer_get_system_time();
}
+ req_type = pRemainChanCtx->rem_on_chan_request;
+ mutex_unlock(&pHddCtx->roc_lock);
if ( ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode ) ||
( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode ) ||
@@ -227,7 +234,7 @@
)
{
tANI_U8 sessionId = pAdapter->sessionId;
- if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request )
+ if( REMAIN_ON_CHANNEL_REQUEST == req_type )
{
sme_DeregisterMgmtFrame(
hHal, sessionId,
@@ -242,12 +249,15 @@
(SIR_MAC_MGMT_FRAME << 2) | ( SIR_MAC_MGMT_PROBE_REQ << 4),
NULL, 0 );
}
- if (pRemainChanCtx->action_pkt_buff.frame_ptr != NULL
- && pRemainChanCtx->action_pkt_buff.frame_length != 0)
- {
- vos_mem_free(pRemainChanCtx->action_pkt_buff.frame_ptr);
- }
mutex_lock(&pHddCtx->roc_lock);
+ if ( pRemainChanCtx )
+ {
+ if (pRemainChanCtx->action_pkt_buff.frame_ptr != NULL
+ && pRemainChanCtx->action_pkt_buff.frame_length != 0)
+ {
+ vos_mem_free(pRemainChanCtx->action_pkt_buff.frame_ptr);
+ }
+ }
vos_mem_free( pRemainChanCtx );
pRemainChanCtx = NULL;
cfgState->remain_on_chan_ctx = NULL;
@@ -438,7 +448,7 @@
void wlan_hdd_remain_on_chan_timeout(void *data)
{
hdd_adapter_t *pAdapter = (hdd_adapter_t *)data;
- hdd_remain_on_chan_ctx_t *pRemainChanCtx;
+ hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
hdd_cfg80211_state_t *cfgState;
hdd_context_t *pHddCtx;
@@ -449,13 +459,16 @@
}
pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
+ mutex_lock(&pHddCtx->roc_lock);
pRemainChanCtx = cfgState->remain_on_chan_ctx;
+
if (NULL == pRemainChanCtx)
{
hddLog( LOGE, FL("No Remain on channel is pending"));
+ mutex_unlock(&pHddCtx->roc_lock);
return;
}
- mutex_lock(&pHddCtx->roc_lock);
+
if ( TRUE == pRemainChanCtx->hdd_remain_on_chan_cancel_in_progress )
{
mutex_unlock(&pHddCtx->roc_lock);
@@ -497,8 +510,11 @@
v_BOOL_t isGoPresent = VOS_FALSE;
hdd_context_t *pHddCtx;
hdd_cfg80211_state_t *cfgState;
- hdd_remain_on_chan_ctx_t *pRemainChanCtx;
+ hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
rem_on_channel_request_type_t request_type;
+ unsigned int duration;
+ v_U16_t hw_value;
+
int ret = 0;
ENTER();
@@ -521,7 +537,16 @@
"%s: cfgState is not valid ",__func__);
return -EINVAL;
}
+ mutex_lock(&pHddCtx->roc_lock);
pRemainChanCtx = cfgState->remain_on_chan_ctx;
+ if ( pRemainChanCtx == NULL)
+ {
+ mutex_unlock(&pHddCtx->roc_lock);
+ hddLog( LOGE,
+ "%s-%d: pRemainChanCtx is NULL",
+ __func__, __LINE__);
+ return ret;
+ }
request_type = pRemainChanCtx->rem_on_chan_request;
/* Initialize Remain on chan timer */
status = vos_timer_init(&pRemainChanCtx->hdd_remain_on_chan_timer,
@@ -534,9 +559,14 @@
FL("Not able to initalize remain_on_chan timer"));
cfgState->remain_on_chan_ctx = NULL;
vos_mem_free(pRemainChanCtx);
+ mutex_unlock(&pHddCtx->roc_lock);
return -EINVAL;
}
+ duration = pRemainChanCtx->duration;
+ hw_value = pRemainChanCtx->chan.hw_value;
+ mutex_unlock(&pHddCtx->roc_lock);
+
status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
{
@@ -559,15 +589,18 @@
//call sme API to start remain on channel.
if (eHAL_STATUS_SUCCESS != sme_RemainOnChannel(
WLAN_HDD_GET_HAL_CTX(pAdapter), sessionId,
- pRemainChanCtx->chan.hw_value, pRemainChanCtx->duration,
+ hw_value, duration,
wlan_hdd_remain_on_channel_callback, pAdapter,
(tANI_U8)(request_type == REMAIN_ON_CHANNEL_REQUEST)? TRUE:FALSE))
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
FL(" RemainOnChannel returned fail"));
+
+ mutex_lock(&pHddCtx->roc_lock);
cfgState->remain_on_chan_ctx = NULL;
vos_timer_destroy(&pRemainChanCtx->hdd_remain_on_chan_timer);
vos_mem_free (pRemainChanCtx);
+ mutex_unlock(&pHddCtx->roc_lock);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
return -EINVAL;
}
@@ -589,15 +622,17 @@
//call sme API to start remain on channel.
if (VOS_STATUS_SUCCESS != WLANSAP_RemainOnChannel(
(WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
- pRemainChanCtx->chan.hw_value, pRemainChanCtx->duration,
+ hw_value, duration,
wlan_hdd_remain_on_channel_callback, pAdapter ))
{
VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"%s: WLANSAP_RemainOnChannel returned fail", __func__);
+ mutex_lock(&pHddCtx->roc_lock);
cfgState->remain_on_chan_ctx = NULL;
vos_timer_destroy(&pRemainChanCtx->hdd_remain_on_chan_timer);
vos_mem_free (pRemainChanCtx);
+ mutex_unlock(&pHddCtx->roc_lock);
hdd_allow_suspend(WIFI_POWER_EVENT_WAKELOCK_ROC);
return -EINVAL;
}
@@ -689,12 +724,15 @@
return -EBUSY;
}
+ mutex_lock(&pHddCtx->roc_lock);
+
pRemainChanCtx = vos_mem_malloc( sizeof(hdd_remain_on_chan_ctx_t) );
if( NULL == pRemainChanCtx )
{
hddLog(VOS_TRACE_LEVEL_FATAL,
"%s: Not able to allocate memory for Channel context",
__func__);
+ mutex_unlock(&pHddCtx->roc_lock);
return -ENOMEM;
}
@@ -732,6 +770,9 @@
{
if (pRemainChanCtx->duration > HDD_P2P_MAX_ROC_DURATION)
pRemainChanCtx->duration = HDD_P2P_MAX_ROC_DURATION;
+
+ mutex_unlock(&pHddCtx->roc_lock);
+
schedule_delayed_work(&pAdapter->roc_work,
msecs_to_jiffies(pHddCtx->cfg_ini->gP2PListenDeferInterval));
hddLog(VOS_TRACE_LEVEL_INFO, "Defer interval is %hu, pAdapter %p",
@@ -741,6 +782,7 @@
}
}
+ mutex_unlock(&pHddCtx->roc_lock);
status = wlan_hdd_p2p_start_remain_on_channel(pAdapter);
EXIT();
@@ -831,15 +873,23 @@
{
hdd_cfg80211_state_t *cfgState = NULL;
hdd_remain_on_chan_ctx_t* pRemainChanCtx = NULL;
+ hdd_context_t *pHddCtx;
VOS_STATUS status;
if (NULL == pAdapter)
{
hddLog(LOGE, FL("pAdapter is NULL"));
return;
}
+ pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+ if (NULL == pHddCtx)
+ {
+ hddLog(LOGE, FL("pHddCtx is NULL"));
+ return;
+ }
cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
- pRemainChanCtx = cfgState->remain_on_chan_ctx;
pAdapter->startRocTs = vos_timer_get_system_time();
+ mutex_lock(&pHddCtx->roc_lock);
+ pRemainChanCtx = cfgState->remain_on_chan_ctx;
if( pRemainChanCtx != NULL )
{
MTRACE(vos_trace(VOS_MODULE_ID_HDD,
@@ -876,7 +926,13 @@
// Check for cached action frame
if ( pRemainChanCtx->action_pkt_buff.frame_length != 0 )
{
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr,
+ pRemainChanCtx->action_pkt_buff.freq, 0,
+ pRemainChanCtx->action_pkt_buff.frame_ptr,
+ pRemainChanCtx->action_pkt_buff.frame_length,
+ NL80211_RXMGMT_FLAG_ANSWERED);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0))
cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr,
pRemainChanCtx->action_pkt_buff.freq, 0,
pRemainChanCtx->action_pkt_buff.frame_ptr,
@@ -912,6 +968,7 @@
complete(&pAdapter->rem_on_chan_ready_event);
if (TRUE == pRemainChanCtx->is_pending_roc_cancelled)
{
+ mutex_unlock(&pHddCtx->roc_lock);
/* since pRemainChanCtx->is_pending_roc_cancelled is
* set, it means Cancel Reamain on channel command is
* pending because remain on channel event was not
@@ -920,9 +977,14 @@
*/
wlan_hdd_cancel_existing_remain_on_channel(pAdapter);
}
+ else
+ {
+ mutex_unlock(&pHddCtx->roc_lock);
+ }
}
else
{
+ mutex_unlock(&pHddCtx->roc_lock);
hddLog( LOGW, "%s: No Pending Remain on channel Request", __func__);
}
return;
@@ -941,7 +1003,7 @@
#endif
hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter );
- hdd_remain_on_chan_ctx_t *pRemainChanCtx = cfgState->remain_on_chan_ctx;
+ hdd_remain_on_chan_ctx_t *pRemainChanCtx = NULL;
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter );
int status;
u64 cookie_dummy;
@@ -965,6 +1027,7 @@
* Need to check cookie and cancel accordingly
*/
mutex_lock(&pHddCtx->roc_lock);
+ pRemainChanCtx = cfgState->remain_on_chan_ctx;
if( (cfgState->remain_on_chan_ctx == NULL) ||
(cfgState->remain_on_chan_ctx->cookie != cookie) )
{
@@ -1417,13 +1480,12 @@
vos_mem_copy( cfgState->buf, buf, len);
+ mutex_lock(&pHddCtx->roc_lock);
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
if( cfgState->remain_on_chan_ctx )
{
- mutex_lock(&pHddCtx->roc_lock);
cfgState->action_cookie = cfgState->remain_on_chan_ctx->cookie;
*cookie = cfgState->action_cookie;
- mutex_unlock(&pHddCtx->roc_lock);
}
else
{
@@ -1433,6 +1495,7 @@
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38))
}
#endif
+ mutex_unlock(&pHddCtx->roc_lock);
}
if ( (WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
@@ -2526,7 +2589,10 @@
//Indicate Frame Over Normal Interface
hddLog( LOG1, FL("Indicate Frame over NL80211 Interface"));
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0))
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0))
+ cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, freq, 0, pbFrames,
+ nFrameLength, NL80211_RXMGMT_FLAG_ANSWERED);
+#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0))
cfg80211_rx_mgmt(pAdapter->dev->ieee80211_ptr, freq, 0, pbFrames,
nFrameLength, NL80211_RXMGMT_FLAG_ANSWERED, GFP_ATOMIC);
#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0))
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index 747f2a8..962e47f 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -1174,10 +1174,11 @@
"%s: Request firmware for recovery",__func__);
WLANTL_TLDebugMessage(WLANTL_DEBUG_FW_CLEANUP);
}
-
+ mutex_lock(&pHddCtx->roc_lock);
pRemainChanCtx = hdd_get_remain_on_channel_ctx(pHddCtx);
if (!pRemainChanCtx)
{
+ mutex_unlock(&pHddCtx->roc_lock);
if (pAdapter->hdd_stats.hddTxRxStats.continuousTxTimeoutCount >
HDD_TX_STALL_SSR_THRESHOLD)
{
@@ -1191,6 +1192,7 @@
}
else
{
+ mutex_unlock(&pHddCtx->roc_lock);
VOS_TRACE(VOS_MODULE_ID_HDD_DATA, VOS_TRACE_LEVEL_ERROR,
"Remain on channel in progress");
/* The supplicant can retry "P2P Invitation Request" for 120 times
diff --git a/CORE/MAC/src/dph/dphHashTable.c b/CORE/MAC/src/dph/dphHashTable.c
index e6d7dc4..161779d 100644
--- a/CORE/MAC/src/dph/dphHashTable.c
+++ b/CORE/MAC/src/dph/dphHashTable.c
@@ -477,7 +477,7 @@
void
dphPrintMacAddr(tpAniSirGlobal pMac, tANI_U8 addr[], tANI_U32 level)
{
- limLog(pMac, (tANI_U16) level, FL("MAC ADDR = %d:%d:%d:%d:%d:%d"),
+ limLog(pMac, (tANI_U16) level, FL("MAC ADDR = %02x:%02x:%02x:%02x:%02x:%02x"),
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
}
diff --git a/CORE/MAC/src/pe/include/limApi.h b/CORE/MAC/src/pe/include/limApi.h
index 51a910f..5b869d3 100644
--- a/CORE/MAC/src/pe/include/limApi.h
+++ b/CORE/MAC/src/pe/include/limApi.h
@@ -127,6 +127,8 @@
extern void limCleanup(tpAniSirGlobal);
/// Function to post messages to LIM thread
extern tANI_U32 limPostMsgApi(tpAniSirGlobal, tSirMsgQ *);
+tANI_U32 limPostMsgApiHighPri(tpAniSirGlobal, tSirMsgQ *);
+
/**
* Function to process messages posted to LIM thread
* and dispatch to various sub modules within LIM module.
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index 7aba26b..a9abca3 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -1265,6 +1265,35 @@
} /*** end limPostMsgApi() ***/
+/**
+ * limPostMsgApiHighPri()
+ *
+ * FUNCTION:
+ * This function is called from other thread while posting a
+ * message to LIM message Queue gSirLimMsgQ.
+ *
+ * LOGIC:
+ * NA
+ *
+ * ASSUMPTIONS:
+ * NA
+ *
+ * NOTE:
+ * NA
+ *
+ * @param pMac - Pointer to Global MAC structure
+ * @param pMsg - Pointer to the message structure
+ * @return None
+ */
+
+tANI_U32
+limPostMsgApiHighPri(tpAniSirGlobal pMac, tSirMsgQ *pMsg)
+{
+ return vos_mq_post_message_high_pri(VOS_MQ_ID_PE, (vos_msg_t *) pMsg);
+
+
+} /*** end limPostMsgApi() ***/
+
/*--------------------------------------------------------------------------
diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.c b/CORE/MAC/src/pe/lim/limTimerUtils.c
index c007fa3..0ff5c44 100644
--- a/CORE/MAC/src/pe/lim/limTimerUtils.c
+++ b/CORE/MAC/src/pe/lim/limTimerUtils.c
@@ -40,7 +40,7 @@
#include "limAssocUtils.h"
#include "limSecurityUtils.h"
#include "pmmApi.h"
-
+#include "limApi.h"
// default value 5000 ms for background scan period when it is disabled
#define LIM_BACKGROUND_SCAN_PERIOD_DEFAULT_MS 5000
@@ -774,7 +774,7 @@
msg.bodyptr = NULL;
msg.bodyval = 0;
- if ((statusCode = limPostMsgApi(pMac, &msg)) != eSIR_SUCCESS)
+ if ((statusCode = limPostMsgApiHighPri(pMac, &msg)) != eSIR_SUCCESS)
limLog(pMac, LOGE,
FL("posting message %X to LIM failed, reason=%d"),
msg.type, statusCode);
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index c4d13c1..e6f5dc9 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -15369,6 +15369,8 @@
{
tAniGetPEStatsReq *pMsg;
eHalStatus status = eHAL_STATUS_SUCCESS;
+ tSirMsgQ msgQ;
+
pMsg = vos_mem_malloc(sizeof(tAniGetPEStatsReq));
if ( NULL == pMsg )
{
@@ -15376,14 +15378,20 @@
return eHAL_STATUS_FAILURE;
}
// need to initiate a stats request to PE
- pMsg->msgType = pal_cpu_to_be16((tANI_U16)eWNI_SME_GET_STATISTICS_REQ);
+ pMsg->msgType = pal_cpu_to_be16((tANI_U16)WDA_GET_STATISTICS_REQ);
pMsg->msgLen = (tANI_U16)sizeof(tAniGetPEStatsReq);
pMsg->staId = staId;
pMsg->statsMask = statsMask;
- status = palSendMBMessage(pMac->hHdd, pMsg );
+
+ msgQ.type = WDA_GET_STATISTICS_REQ;
+ msgQ.reserved = 0;
+ msgQ.bodyptr = pMsg;
+ msgQ.bodyval = 0;
+ status = wdaPostCtrlMsg(pMac, &msgQ);
if(!HAL_STATUS_SUCCESS(status))
{
smsLog(pMac, LOG1, FL("Failed to send down the stats req "));
+ vos_mem_free(pMsg);
}
return status;
}
diff --git a/CORE/SVC/external/wlan_nlink_common.h b/CORE/SVC/external/wlan_nlink_common.h
index 7baa885..4bd5698 100644
--- a/CORE/SVC/external/wlan_nlink_common.h
+++ b/CORE/SVC/external/wlan_nlink_common.h
@@ -39,7 +39,7 @@
#define WLAN_NLINK_COMMON_H__
#include <linux/netlink.h>
-
+#include <linux/if.h>
/*---------------------------------------------------------------------------
* External Functions
*-------------------------------------------------------------------------*/
@@ -85,6 +85,8 @@
// Special Message Type used by SoftAP, intercepted by send_btc_nlink_msg() and
// replaced by WLAN_STA_ASSOC_DONE_IND
#define WLAN_BTC_SOFTAP_BSS_START 0x11
+#define WLAN_MSG_RPS_ENABLE_IND 0x10A
+#define WLAN_SVC_IFACE_NUM_QUEUES 6
#define WLAN_SVC_SAP_RESTART_IND 0x108
// Event data for WLAN_BTC_QUERY_STATE_RSP & WLAN_STA_ASSOC_DONE_IND
@@ -99,14 +101,20 @@
ANI_NL_MSG_PUMAC = ANI_NL_MSG_BASE + 0x01,// PTT Socket App
ANI_NL_MSG_PTT = ANI_NL_MSG_BASE + 0x07,// Quarky GUI
WLAN_NL_MSG_BTC,
+ WLAN_NL_MSG_SVC = ANI_NL_MSG_BASE + 0x0A,
ANI_NL_MSG_LOG = ANI_NL_MSG_BASE + 0x0C,
- WLAN_NL_MSG_SVC,
ANI_NL_MSG_MAX
} tAniNlModTypes, tWlanNlModTypes;
#define WLAN_NL_MSG_BASE ANI_NL_MSG_BASE
#define WLAN_NL_MSG_MAX ANI_NL_MSG_MAX
+struct wlan_rps_data {
+ char ifname[IFNAMSIZ];
+ uint16_t num_queues;
+ uint16_t cpu_map[WLAN_SVC_IFACE_NUM_QUEUES];
+};
+
//All Netlink messages must contain this header
typedef struct sAniHdr {
unsigned short type;
diff --git a/CORE/VOSS/inc/vos_mq.h b/CORE/VOSS/inc/vos_mq.h
index 7194e35..e82dd00 100644
--- a/CORE/VOSS/inc/vos_mq.h
+++ b/CORE/VOSS/inc/vos_mq.h
@@ -156,6 +156,43 @@
--------------------------------------------------------------------------*/
VOS_STATUS vos_mq_post_message( VOS_MQ_ID msgQueueId, vos_msg_t *message );
+/**--------------------------------------------------------------------------
+ \brief vos_mq_post_message_high_pri() - posts a high priority message to
+ a message queue
+
+ This API allows messages to be posted to the head of a specific message
+ queue. Messages can be posted to the following message queues:
+
+ <ul>
+ <li> SME
+ <li> PE
+ <li> HAL
+ <li> TL
+ </ul>
+
+ \param msgQueueId - identifies the message queue upon which the message
+ will be posted.
+
+ \param message - a pointer to a message buffer. Memory for this message
+ buffer is allocated by the caller and free'd by the vOSS after the
+ message is posted to the message queue. If the consumer of the
+ message needs anything in this message, it needs to copy the contents
+ before returning from the message queue handler.
+
+ \return VOS_STATUS_SUCCESS - the message has been successfully posted
+ to the message queue.
+
+ VOS_STATUS_E_INVAL - The value specified by msgQueueId does not
+ refer to a valid Message Queue Id.
+
+ VOS_STATUS_E_FAULT - message is an invalid pointer.
+
+ VOS_STATUS_E_FAILURE - the message queue handler has reported
+ an unknown failure.
+ --------------------------------------------------------------------------*/
+
+VOS_STATUS vos_mq_post_message_high_pri(VOS_MQ_ID msgQueueId, vos_msg_t *message);
+
/**---------------------------------------------------------------------------
diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c
index 9304923..66ed456 100644
--- a/CORE/VOSS/src/vos_api.c
+++ b/CORE/VOSS/src/vos_api.c
@@ -1995,6 +1995,143 @@
} /* vos_mq_post_message()*/
+/**--------------------------------------------------------------------------
+ \brief vos_mq_post_message_high_pri() - posts a high priority message to
+ a message queue
+
+ This API allows messages to be posted to the head of a specific message
+ queue. Messages can be posted to the following message queues:
+
+ <ul>
+ <li> SME
+ <li> PE
+ <li> HAL
+ <li> TL
+ </ul>
+
+ \param msgQueueId - identifies the message queue upon which the message
+ will be posted.
+
+ \param message - a pointer to a message buffer. Memory for this message
+ buffer is allocated by the caller and free'd by the vOSS after the
+ message is posted to the message queue. If the consumer of the
+ message needs anything in this message, it needs to copy the contents
+ before returning from the message queue handler.
+
+ \return VOS_STATUS_SUCCESS - the message has been successfully posted
+ to the message queue.
+
+ VOS_STATUS_E_INVAL - The value specified by msgQueueId does not
+ refer to a valid Message Queue Id.
+
+ VOS_STATUS_E_FAULT - message is an invalid pointer.
+
+ VOS_STATUS_E_FAILURE - the message queue handler has reported
+ an unknown failure.
+ --------------------------------------------------------------------------*/
+VOS_STATUS vos_mq_post_message_high_pri(VOS_MQ_ID msgQueueId, vos_msg_t *pMsg)
+{
+ pVosMqType pTargetMq = NULL;
+ pVosMsgWrapper pMsgWrapper = NULL;
+
+ if ((gpVosContext == NULL) || (pMsg == NULL))
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: Null params or global vos context is null", __func__);
+ VOS_ASSERT(0);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ switch (msgQueueId)
+ {
+ /// Message Queue ID for messages bound for SME
+ case VOS_MQ_ID_SME:
+ {
+ pTargetMq = &(gpVosContext->vosSched.smeMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for PE
+ case VOS_MQ_ID_PE:
+ {
+ pTargetMq = &(gpVosContext->vosSched.peMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for WDA
+ case VOS_MQ_ID_WDA:
+ {
+ pTargetMq = &(gpVosContext->vosSched.wdaMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for WDI
+ case VOS_MQ_ID_WDI:
+ {
+ pTargetMq = &(gpVosContext->vosSched.wdiMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for TL
+ case VOS_MQ_ID_TL:
+ {
+ pTargetMq = &(gpVosContext->vosSched.tlMcMq);
+ break;
+ }
+
+ /// Message Queue ID for messages bound for the SYS module
+ case VOS_MQ_ID_SYS:
+ {
+ pTargetMq = &(gpVosContext->vosSched.sysMcMq);
+ break;
+ }
+
+ default:
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ ("%s: Trying to queue msg into unknown MC Msg queue ID %d"),
+ __func__, msgQueueId);
+
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ VOS_ASSERT(NULL !=pTargetMq);
+ if (pTargetMq == NULL)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: pTargetMq == NULL", __func__);
+ return VOS_STATUS_E_FAILURE;
+ }
+
+ /*
+ ** Try and get a free Msg wrapper
+ */
+ pMsgWrapper = vos_mq_get(&gpVosContext->freeVosMq);
+
+ if (NULL == pMsgWrapper)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: VOS Core run out of message wrapper", __func__);
+ return VOS_STATUS_E_RESOURCES;
+ }
+
+ /*
+ ** Copy the message now
+ */
+ vos_mem_copy( (v_VOID_t*)pMsgWrapper->pVosMsg,
+ (v_VOID_t*)pMsg, sizeof(vos_msg_t));
+
+ vos_mq_put_front(pTargetMq, pMsgWrapper);
+
+ set_bit(MC_POST_EVENT_MASK, &gpVosContext->vosSched.mcEventFlag);
+ wake_up_interruptible(&gpVosContext->vosSched.mcWaitQueue);
+
+ return VOS_STATUS_SUCCESS;
+
+} /* vos_mq_post_message_high_pri()*/
+
+
+
/**---------------------------------------------------------------------------
\brief vos_tx_mq_serialize() - serialize a message to the Tx execution flow
diff --git a/CORE/VOSS/src/vos_mq.c b/CORE/VOSS/src/vos_mq.c
index b428189..91ed206 100644
--- a/CORE/VOSS/src/vos_mq.c
+++ b/CORE/VOSS/src/vos_mq.c
@@ -163,6 +163,42 @@
} /* vos_mq_put() */
+/*---------------------------------------------------------------------------
+
+ \brief vos_mq_put_front() - Add a message to the head of message queue
+
+ The \a vos_mq_put_front() function add a message to the head of Message queue.
+
+ \param pMq - pointer to the message queue
+
+ \param pMsgWrapper - Msg Wrapper containing the message
+
+ \return None
+
+ \sa vos_mq_put()
+
+---------------------------------------------------------------------------*/
+void vos_mq_put_front(pVosMqType pMq, pVosMsgWrapper pMsgWrapper)
+{
+ unsigned long flags;
+
+ /*
+ ** Some quick sanity check
+ */
+ if ((pMq == NULL) || (pMsgWrapper == NULL)) {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s: NULL pointer passed",__func__);
+ return ;
+ }
+
+ spin_lock_irqsave(&pMq->mqLock, flags);
+
+ list_add(&pMsgWrapper->msgNode, &pMq->mqList);
+
+ spin_unlock_irqrestore(&pMq->mqLock, flags);
+
+} /* vos_mq_put_front() */
+
/*---------------------------------------------------------------------------
diff --git a/CORE/VOSS/src/vos_sched.h b/CORE/VOSS/src/vos_sched.h
index 361f874..c757976 100644
--- a/CORE/VOSS/src/vos_sched.h
+++ b/CORE/VOSS/src/vos_sched.h
@@ -500,6 +500,7 @@
VOS_STATUS vos_mq_init(pVosMqType pMq);
void vos_mq_deinit(pVosMqType pMq);
void vos_mq_put(pVosMqType pMq, pVosMsgWrapper pMsgWrapper);
+void vos_mq_put_front(pVosMqType pMq, pVosMsgWrapper pMsgWrapper);
pVosMsgWrapper vos_mq_get(pVosMqType pMq);
v_BOOL_t vos_is_mq_empty(pVosMqType pMq);
pVosSchedContext get_vos_sched_ctxt(void);
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 89fa89f..dc5bbea 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -6176,8 +6176,8 @@
WDI_GetStatsRspParamsType *wdiGetStatsRsp,
void* pUserData)
{
- tWDA_CbContext *pWDA = (tWDA_CbContext *)pUserData ;
tAniGetPEStatsRsp *pGetPEStatsRspParams;
+ vos_msg_t vosMsg;
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"<------ %s " ,__func__);
@@ -6193,7 +6193,7 @@
return;
}
vos_mem_set(pGetPEStatsRspParams, wdiGetStatsRsp->usMsgLen, 0);
- pGetPEStatsRspParams->msgType = wdiGetStatsRsp->usMsgType;
+ pGetPEStatsRspParams->msgType = eWNI_SME_GET_STATISTICS_RSP;
pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp) +
(wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
@@ -6206,8 +6206,17 @@
vos_mem_copy( pGetPEStatsRspParams + 1,
wdiGetStatsRsp + 1,
wdiGetStatsRsp->usMsgLen - sizeof(WDI_GetStatsRspParamsType));
- /* send response to UMAC*/
- WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP, pGetPEStatsRspParams , 0) ;
+
+ vosMsg.type = eWNI_SME_GET_STATISTICS_RSP;
+ vosMsg.bodyptr = (void *)pGetPEStatsRspParams;
+ vosMsg.bodyval = 0;
+ if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME,
+ (vos_msg_t*)&vosMsg))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: fail to post eWNI_SME_GET_STATISTICS_RSP", __func__);
+ vos_mem_free(pGetPEStatsRspParams);
+ }
return;
}
@@ -6222,6 +6231,8 @@
WDI_Status status = WDI_STATUS_SUCCESS ;
WDI_GetStatsReqParamsType wdiGetStatsParam;
tAniGetPEStatsRsp *pGetPEStatsRspParams;
+ vos_msg_t vosMsg;
+
VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
"------> %s " ,__func__);
wdiGetStatsParam.wdiGetStatsParamsInfo.ucSTAIdx =
@@ -6245,12 +6256,21 @@
vos_mem_free(pGetStatsParams);
return VOS_STATUS_E_NOMEM;
}
- pGetPEStatsRspParams->msgType = WDA_GET_STATISTICS_RSP;
+ pGetPEStatsRspParams->msgType = eWNI_SME_GET_STATISTICS_RSP;
pGetPEStatsRspParams->msgLen = sizeof(tAniGetPEStatsRsp);
pGetPEStatsRspParams->staId = pGetStatsParams->staId;
pGetPEStatsRspParams->rc = eSIR_FAILURE;
- WDA_SendMsg(pWDA, WDA_GET_STATISTICS_RSP,
- (void *)pGetPEStatsRspParams, 0) ;
+
+ vosMsg.type = eWNI_SME_GET_STATISTICS_RSP;
+ vosMsg.bodyptr = (void *)pGetPEStatsRspParams;
+ vosMsg.bodyval = 0;
+ if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_SME,
+ (vos_msg_t*)&vosMsg))
+ {
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+ "%s: fail to post eWNI_SME_GET_STATISTICS_RSP", __func__);
+ vos_mem_free(pGetPEStatsRspParams);
+ }
}
/* Free the request message */
vos_mem_free(pGetStatsParams);
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 05812a1..2d4f7b2 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -16389,7 +16389,7 @@
wdiStatus = WDI_HAL_2_WDI_STATUS(halInitScanRspMsg.initScanRspParams.status);
- if ( pWDICtx->bInBmps )
+ if (pWDICtx->bInBmps && (WDI_STATUS_SUCCESS == wdiStatus))
{
// notify DTS that we are entering Full power
wptStatus = WDTS_SetPowerState(pWDICtx, WDTS_POWER_STATE_FULL, NULL);
@@ -16399,6 +16399,12 @@
WDI_ASSERT(0);
}
}
+ else
+ {
+ WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+ "Error returned WDI_ProcessInitScanRspi:%d BMPS%d",
+ wdiStatus, pWDICtx->bInBmps);
+ }
/*Notify UMAC*/
wdiInitScanRspCb( wdiStatus, pWDICtx->pRspCBUserData);