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