wlan: Active Mode Host Offload. HB and RSSI monitoring.
Feature to support RSSI,HB,ARP, BcnFilter offload to RIVA in Active mode
Change-Id: Id6efe310c8171917599dcd45b7866dfa9d04f71e
CR-Fixed: 430015
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index adc626a..be938bd 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1439,6 +1439,12 @@
#define CFG_ENABLE_LPWR_IMG_TRANSITION_DEFAULT ( 0 )
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+#define CFG_ACTIVEMODE_OFFLOAD_ENABLE "gEnableActiveModeOffload"
+#define CFG_ACTIVEMODE_OFFLOAD_ENABLE_MIN ( 0 )
+#define CFG_ACTIVEMODE_OFFLOAD_ENABLE_MAX ( 1 )
+#define CFG_ACTIVEMODE_OFFLOAD_ENABLE_DEFAULT ( 0 )
+#endif
/*---------------------------------------------------------------------------
Type declarations
-------------------------------------------------------------------------*/
@@ -1755,6 +1761,9 @@
v_BOOL_t fEnableTDLSSupport;
#endif
v_U32_t enableLpwrImgTransition;
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ v_BOOL_t fEnableActiveModeOffload;
+#endif
} hdd_config_t;
/*---------------------------------------------------------------------------
Function declarations and documenation
diff --git a/CORE/HDD/inc/wlan_hdd_power.h b/CORE/HDD/inc/wlan_hdd_power.h
index df654b0..2dfe81d 100644
--- a/CORE/HDD/inc/wlan_hdd_power.h
+++ b/CORE/HDD/inc/wlan_hdd_power.h
@@ -86,5 +86,5 @@
VOS_STATUS hdd_wlan_re_init(void);
void hdd_conf_mcastbcast_filter(hdd_context_t* pHddCtx, v_BOOL_t setfilter);
-VOS_STATUS hdd_conf_hostarpoffload(hdd_context_t* pHddCtx, v_BOOL_t fenable);
+VOS_STATUS hdd_conf_hostarpoffload(hdd_adapter_t* pAdapter, v_BOOL_t fenable);
#endif // if !defined __WLAN_QCT_DRIVER_H
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index de49ab2..17bf72f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -1743,6 +1743,14 @@
CFG_ENABLE_LPWR_IMG_TRANSITION_MIN,
CFG_ENABLE_LPWR_IMG_TRANSITION_MAX ),
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+REG_VARIABLE( CFG_ACTIVEMODE_OFFLOAD_ENABLE, WLAN_PARAM_Integer,
+ hdd_config_t, fEnableActiveModeOffload,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ACTIVEMODE_OFFLOAD_ENABLE_DEFAULT,
+ CFG_ACTIVEMODE_OFFLOAD_ENABLE_MIN,
+ CFG_ACTIVEMODE_OFFLOAD_ENABLE_MAX ),
+#endif
};
/*
diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c
index 191fd18..4a1bb15 100644
--- a/CORE/HDD/src/wlan_hdd_early_suspend.c
+++ b/CORE/HDD/src/wlan_hdd_early_suspend.c
@@ -610,53 +610,17 @@
}
-VOS_STATUS hdd_conf_hostarpoffload(hdd_context_t* pHddCtx, v_BOOL_t fenable)
+VOS_STATUS hdd_conf_hostarpoffload(hdd_adapter_t *pAdapter, v_BOOL_t fenable)
{
struct in_ifaddr **ifap = NULL;
struct in_ifaddr *ifa = NULL;
struct in_device *in_dev;
int i = 0;
- hdd_adapter_t *pAdapter = NULL;
tSirHostOffloadReq offLoadRequest;
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
hddLog(VOS_TRACE_LEVEL_ERROR, "%s: \n", __func__);
-#ifdef WLAN_FEATURE_PACKET_FILTERING
- if (pHddCtx->cfg_ini->isMcAddrListFilter)
- {
- pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_GO);
- if (pAdapter != NULL)
- {
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s: Can't set multicast addr filtering in P2P-GO HDD", __func__);
- return VOS_STATUS_E_FAILURE;
- }
- pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_P2P_CLIENT);
- if (pAdapter == NULL)
- pAdapter = hdd_get_adapter(pHddCtx, WLAN_HDD_INFRA_STATION);
-
- if(pAdapter == NULL)
- {
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: HDD adapter context is Null", __func__);
- return VOS_STATUS_E_FAILURE;
- }
- }
- else
- {
-#endif
- pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_INFRA_STATION);
- if(pAdapter == NULL)
- {
- pAdapter = hdd_get_adapter(pHddCtx,WLAN_HDD_P2P_CLIENT);
- if(pAdapter == NULL)
- {
- VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,"%s: HDD adapter context is Null", __func__);
- return VOS_STATUS_E_FAILURE;
- }
- }
-#ifdef WLAN_FEATURE_PACKET_FILTERING
- }
-#endif
if(fenable)
{
if ((in_dev = __in_dev_get_rtnl(pAdapter->dev)) != NULL)
@@ -805,7 +769,7 @@
(eConnectionState_Associated ==
(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState))
{
- vstatus = hdd_conf_hostarpoffload(pHddCtx, TRUE);
+ vstatus = hdd_conf_hostarpoffload(pAdapter, TRUE);
if (!VOS_IS_STATUS_SUCCESS(vstatus))
{
if(pHddCtx->dynamic_mcbc_filter.enableCfg)
@@ -915,9 +879,10 @@
}
}
-static void hdd_conf_resume_ind(hdd_context_t* pHddCtx, v_U8_t sessionId)
+static void hdd_conf_resume_ind(hdd_adapter_t *pAdapter, v_U8_t sessionId)
{
VOS_STATUS vstatus;
+ hdd_context_t* pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
tpSirWlanResumeParam wlanResumeParam =
vos_mem_malloc(sizeof(tSirWlanResumeParam));
@@ -933,7 +898,7 @@
if(pHddCtx->cfg_ini->fhostArpOffload)
{
- vstatus = hdd_conf_hostarpoffload(pHddCtx, FALSE);
+ vstatus = hdd_conf_hostarpoffload(pAdapter, FALSE);
if (!VOS_IS_STATUS_SUCCESS(vstatus))
{
hddLog(VOS_TRACE_LEVEL_INFO, "%s:Failed to disable ARPOFFLOAD "
@@ -1349,7 +1314,7 @@
if(pHddCtx->hdd_mcastbcast_filter_set == TRUE) {
#ifdef FEATURE_WLAN_INTEGRATED_SOC
- hdd_conf_resume_ind(pHddCtx, pAdapter->sessionId);
+ hdd_conf_resume_ind(pAdapter, pAdapter->sessionId);
#else
hdd_conf_mcastbcast_filter(pHddCtx, FALSE);
pHddCtx->hdd_mcastbcast_filter_set = FALSE;
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 72869e9..a38df92 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -119,6 +119,7 @@
#include "wlan_qct_pal_trace.h"
#endif /* FEATURE_WLAN_INTEGRATED_SOC */
#include "qwlan_version.h"
+#include "wlan_qct_wda.h"
#ifdef MODULE
#define WLAN_MODULE_NAME module_name(THIS_MODULE)
@@ -3321,7 +3322,13 @@
fwFeatCapsMsgSupported = 1;
if (fwFeatCapsMsgSupported)
+ {
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ if(!pHddCtx->cfg_ini->fEnableActiveModeOffload)
+ sme_disableFeatureCapablity(WLANACTIVE_OFFLOAD);
+#endif
sme_featureCapsExchange(pHddCtx->hHal);
+ }
} while (0);
@@ -4569,12 +4576,22 @@
hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
hdd_adapter_t *pAdapter = NULL;
VOS_STATUS status;
+ tVOS_CONCURRENCY_MODE concurrent_state = 0;
#ifdef WLAN_SOFTAP_FEATURE
if (VOS_STA_SAP_MODE == hdd_get_conparam())
return TRUE;
#endif
+ concurrent_state = hdd_get_concurrency_mode();
+
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ if(((concurrent_state == (VOS_STA | VOS_P2P_CLIENT)) ||
+ (concurrent_state == (VOS_STA | VOS_P2P_GO))) &&
+ (IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
+ return TRUE;
+#endif
+
/*loop through all adapters. TBD fix for Concurrency */
status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode );
while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status )
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 67e02bd..bc0f063 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -2249,9 +2249,7 @@
{
ret = -EINVAL;
}
-
- pHddCtx->is_dynamic_channel_range_set = 1;
-
+ pHddCtx->is_dynamic_channel_range_set = 1;
return ret;
}
@@ -4790,7 +4788,7 @@
(eConnectionState_Associated ==
(WLAN_HDD_GET_STATION_CTX_PTR(pAdapter))->conn_info.connState))
{
- vstatus = hdd_conf_hostarpoffload(pHddCtx, TRUE);
+ vstatus = hdd_conf_hostarpoffload(pAdapter, TRUE);
if (!VOS_IS_STATUS_SUCCESS(vstatus))
{
hddLog(VOS_TRACE_LEVEL_INFO,
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index a2b7344..4d05d7a 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -4457,4 +4457,13 @@
#endif /* FEATURE_WLAN_TDLS_INTERNAL */
+typedef struct sSirActiveModeSetBcnFilterReq
+{
+ tANI_U16 messageType;
+ tANI_U16 length;
+ tANI_U8 seesionId;
+} tSirSetActiveModeSetBncFilterReq, *tpSirSetActiveModeSetBncFilterReq;
+
+
+
#endif /* __SIR_API_H */
diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h
index 214ae90..c45e7a0 100644
--- a/CORE/MAC/inc/wniApi.h
+++ b/CORE/MAC/inc/wniApi.h
@@ -357,6 +357,7 @@
eWNI_SME_ADD_TDLS_PEER_IND,
eWNI_SME_DELETE_TDLS_PEER_IND,
#endif
+ eWNI_SME_SET_BCN_FILTER_REQ,
eWNI_SME_MSG_TYPES_END
};
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 58ad53a..70f810f 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -76,6 +76,7 @@
DOT11AC_OPMODE = 4,
TDLS = 6,
P2P_GO_NOA_DECOUPLE_INIT_SCAN = 7,
+ WLANACTIVE_OFFLOAD = 8,
MAX_FEATURE_SUPPORTED = 128,
} placeHolderInCapBitmap;
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index 2317d56..c375646 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -2503,6 +2503,17 @@
PELOG1(limLog(pMac, LOG1, FL("Sending EXIT_BMPS_IND to SME \n"));)
limSendExitBmpsInd(pMac, eSME_MISSED_BEACON_IND_RCVD);
}
+/* ACTIVE_MODE_HB_OFFLOAD */
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ else if(((pMac->pmm.gPmmState == ePMM_STATE_READY) ||
+ (pMac->pmm.gPmmState == ePMM_STATE_BMPS_WAKEUP)) &&
+ (IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
+ {
+ pMac->pmm.inMissedBeaconScenario = TRUE;
+ PELOGE(limLog(pMac, LOGE, FL("Received Heart Beat Failure\n"));)
+ limMissedBeaconInActiveMode(pMac);
+ }
+#endif
else
{
limLog(pMac, LOGE,
diff --git a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
index d71253e..663b983 100644
--- a/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
+++ b/CORE/MAC/src/pe/lim/limLinkMonitoringAlgo.c
@@ -467,9 +467,8 @@
* want to handle heartbeat timeout in the BMPS, because Firmware handles it in BMPS.
* So just return from heartbeatfailure handler
*/
-
- if(!limIsSystemInActiveState(pMac))
- return;
+ if(!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE && (!limIsSystemInActiveState(pMac)))
+ return;
#ifdef FEATURE_WLAN_DIAG_SUPPORT_LIM //FEATURE_WLAN_DIAG_SUPPORT
WLAN_VOS_DIAG_LOG_ALLOC(log_ptr, vos_log_beacon_update_pkt_type, LOG_WLAN_BEACON_UPDATE_C);
diff --git a/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c b/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c
index 65f5d52..3e8009e 100644
--- a/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c
+++ b/CORE/MAC/src/pe/lim/limProcessCfgUpdates.c
@@ -574,7 +574,8 @@
{
if( (pMac->lim.gpSession[sessionId].valid )&&
(eLIM_MLM_LINK_ESTABLISHED_STATE == pMac->lim.gpSession[sessionId].limMlmState) &&
- ( pMac->pmm.gPmmState != ePMM_STATE_BMPS_SLEEP))
+ ( pMac->pmm.gPmmState != ePMM_STATE_BMPS_SLEEP) &&
+ (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
{
limReactivateHeartBeatTimer(pMac, &pMac->lim.gpSession[sessionId]);
}
diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
index d93eed5..d5695ca 100644
--- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
+++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
@@ -59,6 +59,7 @@
#include "limIbssPeerMgmt.h"
#include "schApi.h"
#include "limSession.h"
+#include "limSendMessages.h"
#if defined WLAN_FEATURE_VOWIFI
#include "rrmApi.h"
@@ -1829,8 +1830,22 @@
break;
#endif //TO SUPPORT BT-AMP
-
- limHandleHeartBeatTimeout(pMac);
+ if (limIsSystemInScanState(pMac))
+ {
+ // System is in DFS (Learn) mode
+ // Defer processsing this message
+ if (limDeferMsg(pMac, limMsg) != TX_SUCCESS)
+ {
+ PELOGE(limLog(pMac, LOGE, FL("Unable to Defer message(0x%X) limSmeState %d (prev sme state %d) sysRole %d mlm state %d (prev mlm state %d)\n"),
+ limMsg->type, pMac->lim.gLimSmeState, pMac->lim.gLimPrevSmeState,
+ pMac->lim.gLimSystemRole, pMac->lim.gLimMlmState, pMac->lim.gLimPrevMlmState);)
+ limLogSessionStates(pMac);
+ }
+ }
+ else
+ {
+ limHandleHeartBeatTimeout(pMac);
+ }
break;
case SIR_LIM_PROBE_HB_FAILURE_TIMEOUT:
@@ -2151,7 +2166,23 @@
pmmProcessMessage(pMac, limMsg);
break;
#endif // WLAN_FEATURE_GTK_OFFLOAD
-
+ case eWNI_SME_SET_BCN_FILTER_REQ:
+ {
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ tpPESession psessionEntry;
+ tANI_U8 sessionId = (tANI_U8)limMsg->bodyval ;
+ psessionEntry = &pMac->lim.gpSession[sessionId];
+ if(psessionEntry != NULL && IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)
+ {
+ // sending beacon filtering information down to HAL
+ if (limSendBeaconFilterInfo(pMac, psessionEntry) != eSIR_SUCCESS)
+ {
+ limLog(pMac, LOGE, FL("Fail to send Beacon Filter Info \n"));
+ }
+ }
+#endif
+ }
+ break;
default:
vos_mem_free((v_VOID_t*)limMsg->bodyptr);
limMsg->bodyptr = NULL;
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
index 21f6a15..0df6247 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c
@@ -1227,7 +1227,8 @@
{
if((peFindSessionBySessionId(pMac,i) != NULL) &&
(pMac->lim.gpSession[i].valid == TRUE) &&
- (eLIM_MLM_LINK_ESTABLISHED_STATE == pMac->lim.gpSession[i].limMlmState))
+ (eLIM_MLM_LINK_ESTABLISHED_STATE == pMac->lim.gpSession[i].limMlmState) &&
+ (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
{
limReactivateHeartBeatTimer(pMac, peFindSessionBySessionId(pMac,i));
}
diff --git a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
index 3023a5f..3b81802 100644
--- a/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessMlmRspMessages.c
@@ -2001,7 +2001,12 @@
*/
psessionEntry->staId = pAddStaParams->staIdx;
//if the AssocRsp frame is not acknowledged, then keep alive timer will take care of the state
- limReactivateHeartBeatTimer(pMac, psessionEntry);
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ if(!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)
+#endif
+ {
+ limReactivateHeartBeatTimer(pMac, psessionEntry);
+ }
MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_KEEPALIVE_TIMER));
//assign the sessionId to the timer Object
@@ -3812,7 +3817,7 @@
#ifdef WLAN_FEATURE_P2P
if( psessionEntry->pePersona == VOS_P2P_CLIENT_MODE )
{
- // Activate Join Periodic Probe Req timer
+ // Activate Join Periodic Probe Req timer
if (tx_timer_activate(&pMac->lim.limTimers.gLimPeriodicJoinProbeReqTimer) != TX_SUCCESS)
{
limLog(pMac, LOGP, FL("could not activate Periodic Join req failure timer\n"));
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 89ced2a..0d5092f 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -1211,8 +1211,9 @@
* scan is in progress if the system is in Active mode *
* AND it is not a ROAMING ("background") scan */
if(((ePMM_STATE_BMPS_WAKEUP == pMac->pmm.gPmmState) ||
- (ePMM_STATE_READY == pMac->pmm.gPmmState))
- && (pScanReq->backgroundScanMode != eSIR_ROAMING_SCAN ))
+ (ePMM_STATE_READY == pMac->pmm.gPmmState)) &&
+ (pScanReq->backgroundScanMode != eSIR_ROAMING_SCAN ) &&
+ (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
{
for(i=0;i<pMac->lim.maxBssId;i++)
{
diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.c b/CORE/MAC/src/pe/lim/limTimerUtils.c
index 37f878c..f67a6af 100644
--- a/CORE/MAC/src/pe/lim/limTimerUtils.c
+++ b/CORE/MAC/src/pe/lim/limTimerUtils.c
@@ -1899,6 +1899,10 @@
tANI_U32 val, val1;
MTRACE(macTrace(pMac, TRACE_CODE_TIMER_DEACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ if(IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)
+ return;
+#endif
if (tx_timer_deactivate(&pMac->lim.limTimers.gLimHeartBeatTimer) != TX_SUCCESS)
limLog(pMac, LOGP, FL("Fail to deactivate HeartBeatTimer \n"));
@@ -1941,6 +1945,11 @@
{
PELOG3(limLog(pMac, LOG3, FL("Rxed Heartbeat. Count=%d\n"), psessionEntry->LimRxedBeaconCntDuringHB);)
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ if(IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)
+ return;
+#endif
+
limHeartBeatDeactivateAndChangeTimer(pMac, psessionEntry);
MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
@@ -2064,6 +2073,11 @@
{
v_UINT_t status = TX_TIMER_ERROR;
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ if(IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)
+ return (status);
+#endif
+
if(TX_AIRGO_TMR_SIGNATURE == pMac->lim.limTimers.gLimHeartBeatTimer.tmrSignature)
{
//consider 0 interval a ok case
@@ -2467,3 +2481,47 @@
}
#endif
#endif
+
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+/* ACTIVE_MODE_HB_OFFLOAD */
+/**
+ * limMissedBeaconInActiveMode()
+ *
+ *FUNCTION:
+ * This function handle beacon miss indication from FW
+ * in Active mode.
+ *
+ *LOGIC:
+ *
+ *ASSUMPTIONS:
+ * NA
+ *
+ *NOTE:
+ * NA
+ *
+ * @param param - Msg Type
+ *
+ * @return None
+ */
+void
+limMissedBeaconInActiveMode(void *pMacGlobal)
+{
+ tANI_U32 statusCode;
+ tSirMsgQ msg;
+ tpAniSirGlobal pMac = (tpAniSirGlobal)pMacGlobal;
+
+ // Prepare and post message to LIM Message Queue
+ if(IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)
+ {
+ msg.type = (tANI_U16) SIR_LIM_HEART_BEAT_TIMEOUT;
+ msg.bodyptr = NULL;
+ msg.bodyval = 0;
+ limLog(pMac, LOGE,
+ FL("Heartbeat failure from Riva\n"));
+ if ((statusCode = limPostMsgApi(pMac, &msg)) != eSIR_SUCCESS)
+ limLog(pMac, LOGE,
+ FL("posting message %X to LIM failed, reason=%d\n"),
+ msg.type, statusCode);
+ }
+}
+#endif
diff --git a/CORE/MAC/src/pe/lim/limTimerUtils.h b/CORE/MAC/src/pe/lim/limTimerUtils.h
index 6bfbe22..6788b89 100644
--- a/CORE/MAC/src/pe/lim/limTimerUtils.h
+++ b/CORE/MAC/src/pe/lim/limTimerUtils.h
@@ -141,4 +141,7 @@
void limWPSOverlapTimerHandler(void *pMacGlobal, tANI_U32 param);
#endif
#endif
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+void limMissedBeaconInActiveMode(void *pMacGlobal);
+#endif
#endif /* __LIM_TIMER_UTILS_H */
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index d2d580e..0413d38 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -651,6 +651,8 @@
return "eWNI_PMC_EXIT_BMPS_RSP\n";
case eWNI_PMC_EXIT_BMPS_IND:
return "eWNI_PMC_EXIT_BMPS_IND\n";
+ case eWNI_SME_SET_BCN_FILTER_REQ:
+ return "eWNI_SME_SET_BCN_FILTER_REQ\n";
default:
return "INVALID SME message\n";
}
@@ -6972,7 +6974,7 @@
if (TX_TIMER_VALID(pMac->lim.limTimers.gLimHeartBeatTimer))
{
MTRACE(macTrace(pMac, TRACE_CODE_TIMER_ACTIVATE, psessionEntry->peSessionId, eLIM_HEART_BEAT_TIMER));
- if(limActivateHearBeatTimer(pMac) != TX_SUCCESS)
+ if((limActivateHearBeatTimer(pMac) != TX_SUCCESS) && (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
{
limLog(pMac, LOGP, FL("Could not restart heartbeat timer, doing LOGP"));
return (eSIR_FAILURE);
diff --git a/CORE/MAC/src/pe/pmm/pmmApi.c b/CORE/MAC/src/pe/pmm/pmmApi.c
index d6d0c1e..2a2ad1f 100644
--- a/CORE/MAC/src/pe/pmm/pmmApi.c
+++ b/CORE/MAC/src/pe/pmm/pmmApi.c
@@ -430,12 +430,13 @@
respStatus = eSIR_SME_BMPS_REQ_REJECT;
goto failure;
}
-
+#ifndef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
// sending beacon filtering information down to HAL
if (limSendBeaconFilterInfo(pMac, psessionEntry) != eSIR_SUCCESS)
{
pmmLog(pMac, LOGE, FL("Fail to send Beacon Filter Info \n"));
}
+#endif
#ifdef FEATURE_WLAN_DIAG_SUPPORT
limDiagEventReport(pMac, WLAN_PE_DIAG_ENTER_BMPS_REQ_EVENT, psessionEntry, 0, 0);
@@ -626,7 +627,7 @@
tANI_U32 numBeaconPerRssiAverage = 5;
tANI_U32 bRssiFilterEnable = FALSE;
- if(psessionEntry->currentBssBeaconCnt == 0)
+ if((psessionEntry->currentBssBeaconCnt == 0 && (!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)))
{
PELOGE(pmmLog( pMac, LOGE, FL("Beacon count is zero, can not retrieve the TSF, failing the Enter Bmps Request\n"));)
return eSIR_FAILURE;
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 50a9232..16bba2b 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2144,6 +2144,18 @@
/*---------------------------------------------------------------------------
+ \brief sme_disableActiveModeOffload() - SME interface to disable Active mode Offload capabilitu
+ between in Host.
+
+ \param hHal - HAL handle for device
+
+ \return NONE
+
+---------------------------------------------------------------------------*/
+void sme_disableFeatureCapablity(tANI_U8 feature_index);
+
+/*---------------------------------------------------------------------------
+
\brief sme_GetDefaultCountryCodeFrmNv() - SME interface to get the default
country code
Host and FW.
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index c5e93d8..42effa6 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -8837,7 +8837,18 @@
if( palEqualMemory( pMac->hHdd, &Broadcastaddr, pRsp->peerMacAddr,
sizeof(tSirMacAddr) ) )
{
- result = eCSR_ROAM_RESULT_AUTHENTICATED;
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ if(IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)
+ {
+ tpSirSetActiveModeSetBncFilterReq pMsg;
+ palAllocateMemory(pMac->hHdd, (void **)&pMsg, sizeof(tSirSetActiveModeSetBncFilterReq));
+ pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_SET_BCN_FILTER_REQ);
+ pMsg->length = pal_cpu_to_be16(sizeof( tANI_U8));
+ pMsg->seesionId = sessionId;
+ status = palSendMBMessage(pMac->hHdd, pMsg );
+ }
+#endif
+ result = eCSR_ROAM_RESULT_AUTHENTICATED;
}
else
{
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 8f5157e..28083ae 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -6760,6 +6760,22 @@
WDA_featureCapsExchange(vosContext);
}
+/*---------------------------------------------------------------------------
+
+ \brief sme_disableFeatureCapablity() - SME interface to disable Active mode offload capablity
+ in Host.
+
+ \param hHal - HAL handle for device
+
+ \return NONE
+
+---------------------------------------------------------------------------*/
+void sme_disableFeatureCapablity(tANI_U8 feature_index)
+{
+ WDA_disableCapablityFeature(feature_index);
+}
+
+
/* ---------------------------------------------------------------------------
diff --git a/CORE/TL/src/wlan_qct_tl_hosupport.c b/CORE/TL/src/wlan_qct_tl_hosupport.c
index c6f1bcd..1cc9c5a 100644
--- a/CORE/TL/src/wlan_qct_tl_hosupport.c
+++ b/CORE/TL/src/wlan_qct_tl_hosupport.c
@@ -1140,20 +1140,24 @@
TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"Get RSSI Fail"));
return status;
}
-
- /* If any threshold is not registerd, DO NOTHING! */
- if(0 == tlCtxt->hoSupport.currentHOState.numThreshold)
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ if(!IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE)
+#endif
{
- TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"There is no thresholds pass"));
- }
- else
- {
- /* Handle current RSSI value, region, notification, etc */
- status = WLANTL_HSHandleRSSIChange(pAdapter, currentAvgRSSI);
- if(!VOS_IS_STATUS_SUCCESS(status))
+ /* If any threshold is not registerd, DO NOTHING! */
+ if(0 == tlCtxt->hoSupport.currentHOState.numThreshold)
{
- TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Handle new RSSI fail"));
- return status;
+ TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"There is no thresholds pass"));
+ }
+ else
+ {
+ /* Handle current RSSI value, region, notification, etc */
+ status = WLANTL_HSHandleRSSIChange(pAdapter, currentAvgRSSI);
+ if(!VOS_IS_STATUS_SUCCESS(status))
+ {
+ TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,"Handle new RSSI fail"));
+ return status;
+ }
}
}
@@ -1420,7 +1424,7 @@
WLANTL_HSSerializeTlIndication(pAdapter, WLANTL_HO_THRESHOLD_UP, usrCtxt, crossCBFunction);
}
- if(VOS_TRUE == tlCtxt->isBMPS)
+ if((VOS_TRUE == tlCtxt->isBMPS) || (IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
{
TLLOGE(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"Register into FW, now BMPS"));
/* this function holds the lock across a downstream WDA function call, this is violates some lock
@@ -1578,7 +1582,7 @@
/*Reset the FW notification*/
tlCtxt->hoSupport.currentHOState.fwNotification=0;
- if(VOS_TRUE == tlCtxt->isBMPS)
+ if((VOS_TRUE == tlCtxt->isBMPS) || (IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE))
{
TLLOG1(VOS_TRACE(VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO,"Register into FW, now BMPS"));
/* this function holds the lock across a downstream WDA function call, this is violates some lock
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 46936df..2811c5d 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -130,6 +130,13 @@
#define IS_MCC_SUPPORTED (WDA_IsWcnssWlanReportedVersionGreaterThanOrEqual( 0, 1, 1, 0))
#define IS_FEATURE_SUPPORTED_BY_FW(featEnumValue) (!!WDA_getFwWlanFeatCaps(featEnumValue))
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+#define IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE ((WDA_getFwWlanFeatCaps(WLANACTIVE_OFFLOAD)) & (WDI_getHostWlanFeatCaps(WLANACTIVE_OFFLOAD)))
+#else
+#define IS_ACTIVEMODE_OFFLOAD_FEATURE_ENABLE 0
+#endif
+
+
/*--------------------------------------------------------------------------
Definitions for Data path APIs
--------------------------------------------------------------------------*/
@@ -1993,6 +2000,7 @@
============================================================================*/
void WDA_featureCapsExchange(v_PVOID_t pVosContext);
+void WDA_disableCapablityFeature(tANI_U8 feature_index);
/*==========================================================================
FUNCTION WDA_getHostWlanFeatCaps
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 73c433e..6f8ff8f 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -11742,6 +11742,16 @@
WDI_featureCapsExchangeReq( NULL, pVosContext);
}
+/* FUNCTION WDA_disableCapablityFeature
+ * WDA API to diable Active mode offload in host.
+ */
+void WDA_disableCapablityFeature(tANI_U8 feature_index)
+{
+ VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+ "%s:enter", __func__ );
+ WDI_disableCapablityFeature(feature_index);
+}
+
/* FUNCTION WDA_getHostWlanFeatCaps
* Wrapper for WDI API, that will return if the feature (enum value).passed
* to this API is supported or not in Host
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index db2345c..cc47e02 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -8998,6 +8998,17 @@
);
/**
+ @brief Disable Active mode offload in Host
+
+ @param void
+ @see
+ @return void
+*/
+void
+WDI_disableCapablityFeature(wpt_uint8 feature_index);
+
+
+/**
@brief WDI_getHostWlanFeatCaps
WDI API that returns whether the feature passed to it as enum value in
"placeHolderInCapBitmap" is supported by Host or not. It uses WDI global
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 1628d13..9c5533d 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -94,6 +94,7 @@
#define MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
#define MAC_ADDRESS_STR "%02x:%02x:%02x:%02x:%02x:%02x"
+#define FEATURE_NOT_SUPPORTED 128
#ifdef FEATURE_WLAN_SCAN_PNO
#define WDI_PNO_VERSION_MASK 0x8000
@@ -108,10 +109,22 @@
*/
static placeHolderInCapBitmap supportEnabledFeatures[] =
{MCC, P2P, DOT11AC, SLM_SESSIONIZATION, DOT11AC_OPMODE
+#ifdef WLAN_SOFTAP_VSTA_FEATURE
+ ,SAP32STA
+#else
+ ,FEATURE_NOT_SUPPORTED
+#endif
#ifdef FEATURE_WLAN_TDLS
- ,TDLS
+ ,TDLS
+#else
+ ,FEATURE_NOT_SUPPORTED
#endif
,P2P_GO_NOA_DECOUPLE_INIT_SCAN
+#ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
+ ,WLANACTIVE_OFFLOAD
+#else
+ ,FEATURE_NOT_SUPPORTED
+#endif
};
/*--------------------------------------------------------------------------
@@ -25134,6 +25147,20 @@
}
/**
+ @brief Disable Active mode offload in Host
+
+ @param void
+ @see
+ @return void
+*/
+void
+WDI_disableCapablityFeature(wpt_uint8 feature_index)
+{
+ supportEnabledFeatures[feature_index] = 0;
+ return;
+}
+
+/**
@brief Process Host-FW Capability Exchange Request function
@param pWDICtx: pointer to the WLAN DAL context
diff --git a/Kbuild b/Kbuild
index 1620994..776d22f 100644
--- a/Kbuild
+++ b/Kbuild
@@ -521,7 +521,8 @@
-DWLAN_FEATURE_VOWIFI \
-DWLAN_FEATURE_11AC \
-DWLAN_FEATURE_P2P_DEBUG \
- -DWLAN_ENABLE_AGEIE_ON_SCAN_RESULTS
+ -DWLAN_ENABLE_AGEIE_ON_SCAN_RESULTS \
+ -DWLAN_ACTIVEMODE_OFFLOAD_FEATURE
# there are still pieces of code which are conditional upon these
# need to investigate all of them to see which should also be
diff --git a/firmware_bin/WCNSS_qcom_cfg.ini b/firmware_bin/WCNSS_qcom_cfg.ini
index 2fd3ef3..e701df5 100644
--- a/firmware_bin/WCNSS_qcom_cfg.ini
+++ b/firmware_bin/WCNSS_qcom_cfg.ini
@@ -362,6 +362,9 @@
# 1=enable STBC; 0=disable STBC
gEnableRXSTBC=1
+# Enable Active mode offload
+gEnableActiveModeOffload=0
+
END
# Note: Configuration parser would not read anything past the END marker
diff --git a/riva/inc/wlan_hal_msg.h b/riva/inc/wlan_hal_msg.h
index d4720ff..219a416 100644
--- a/riva/inc/wlan_hal_msg.h
+++ b/riva/inc/wlan_hal_msg.h
@@ -5457,6 +5457,7 @@
SAP32STA = 5,
TDLS = 6,
P2P_GO_NOA_DECOUPLE_INIT_SCAN = 7,
+ WLANACTIVE_OFFLOAD = 8,
MAX_FEATURE_SUPPORTED = 128,
} placeHolderInCapBitmap;