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/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;