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;