prima: WLAN Driver Release 3.1.7.9

This is the initial release of the Prima WLAN Driver
diff --git a/CORE/MAC/src/pe/sch/schBeaconProcess.c b/CORE/MAC/src/pe/sch/schBeaconProcess.c
new file mode 100644
index 0000000..6d85c12
--- /dev/null
+++ b/CORE/MAC/src/pe/sch/schBeaconProcess.c
@@ -0,0 +1,743 @@
+/*
+ * Copyright (c) 2012, Code Aurora Forum. All rights reserved.
+ *
+ * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+ *
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * Airgo Networks, Inc proprietary. All rights reserved.
+ * This file schBeaconProcess.cc contains beacon processing related
+ * functions
+ *
+ * Author:      Sandesh Goel
+ * Date:        02/25/02
+ * History:-
+ * Date            Modified by    Modification Information
+ * --------------------------------------------------------------------
+ *
+ */
+
+#include "palTypes.h"
+#include "wniCfgAp.h"
+
+#include "cfgApi.h"
+#include "pmmApi.h"
+#include "limApi.h"
+#include "utilsApi.h"
+#include "schDebug.h"
+#include "schApi.h"
+
+#ifdef FEATURE_WLAN_NON_INTEGRATED_SOC
+#include "halCommonApi.h"
+#endif
+
+#include "limUtils.h"
+#include "limSendMessages.h"
+#include "limStaHashApi.h"
+
+#if defined WLAN_FEATURE_VOWIFI
+#include "rrmApi.h"
+#endif
+
+#ifdef FEATURE_WLAN_DIAG_SUPPORT
+#include "vos_diag_core_log.h"
+#endif //FEATURE_WLAN_DIAG_SUPPORT 
+
+/**
+ * Number of bytes of variation in beacon length from the last beacon
+ * to trigger reprogramming of rx delay register
+ */
+#define SCH_BEACON_LEN_DELTA       3
+
+// calculate 2^cw - 1
+#define CW_GET(cw) (((cw) == 0) ? 1 : ((1 << (cw)) - 1))
+
+static void
+ap_beacon_process(
+    tpAniSirGlobal    pMac,
+    tANI_U8*      pRxPacketInfo,
+    tpSchBeaconStruct pBcnStruct,
+    tpUpdateBeaconParams pBeaconParams,
+    tpPESession         psessionEntry)
+{
+    tpSirMacMgmtHdr    pMh = WDA_GET_RX_MAC_HEADER(pRxPacketInfo);
+    tANI_U32           phyMode;
+    tSirRFBand          rfBand = SIR_BAND_UNKNOWN;
+    //Get RF band from psessionEntry
+    rfBand = psessionEntry->limRFBand;
+
+    limGetPhyMode(pMac, &phyMode, psessionEntry);
+
+    if(SIR_BAND_5_GHZ == rfBand)
+    {
+        if (psessionEntry->htCapabality)
+        {
+            if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel)
+            {
+              //11a (non HT) AP  overlaps or
+              //HT AP with HT op mode as mixed overlaps.              
+              //HT AP with HT op mode as overlap legacy overlaps.                            
+              if ((!pBcnStruct->HTInfo.present) ||
+                  (eSIR_HT_OP_MODE_MIXED == pBcnStruct->HTInfo.opMode) ||
+                  (eSIR_HT_OP_MODE_OVERLAP_LEGACY == pBcnStruct->HTInfo.opMode))
+              {
+                   limUpdateOverlapStaParam(pMac, pMh->bssId, &(pMac->lim.gLimOverlap11aParams));
+
+                  if (pMac->lim.gLimOverlap11aParams.numSta &&
+                      !pMac->lim.gLimOverlap11aParams.protectionEnabled)
+                  {
+                      limEnable11aProtection(pMac, true, true, pBeaconParams,psessionEntry);
+                  }
+              }
+              //HT AP with HT20 op mode overlaps.
+              else if(eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT == pBcnStruct->HTInfo.opMode)
+              {
+                  limUpdateOverlapStaParam(pMac, pMh->bssId, &(pMac->lim.gLimOverlapHt20Params));
+
+                  if (pMac->lim.gLimOverlapHt20Params.numSta &&
+                      !pMac->lim.gLimOverlapHt20Params.protectionEnabled)
+                  {
+                      limEnableHT20Protection(pMac, true, true, pBeaconParams,psessionEntry);
+                  }
+              }
+            }
+        }    
+    }
+    else if(SIR_BAND_2_4_GHZ == rfBand)
+    {
+        //We are 11G AP.
+        if ((phyMode == WNI_CFG_PHY_MODE_11G) &&
+              (false == psessionEntry->htCapabality))
+        {
+            if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel)        
+            {
+                if (((!(pBcnStruct->erpPresent)) && 
+                      !(pBcnStruct->HTInfo.present))|| 
+                    //if erp not present then  11B AP overlapping
+                    (pBcnStruct->erpPresent &&
+                    (pBcnStruct->erpIEInfo.useProtection ||
+                    pBcnStruct->erpIEInfo.nonErpPresent)))
+                {
+#ifdef FEATURE_WLAN_CCX
+                    if( psessionEntry->isCCXconnection )
+                    {
+                        VOS_TRACE (VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, 
+                            "%s: [INFOLOG]CCX 11g erpPresent=%d useProtection=%d nonErpPresent=%d\n", __func__,
+                            pBcnStruct->erpPresent,
+                            pBcnStruct->erpIEInfo.useProtection,
+                            pBcnStruct->erpIEInfo.nonErpPresent);
+                    } 
+#endif 
+                    limEnableOverlap11gProtection(pMac, pBeaconParams, pMh,psessionEntry);
+                }
+
+            }
+        }        
+        // handling the case when HT AP has overlapping legacy BSS.
+        else if(psessionEntry->htCapabality)
+        {
+            if (pBcnStruct->channelNumber == psessionEntry->currentOperChannel)
+            {
+              if (pBcnStruct->erpPresent &&
+                    (pBcnStruct->erpIEInfo.useProtection ||
+                    pBcnStruct->erpIEInfo.nonErpPresent))
+              {
+#ifdef FEATURE_WLAN_CCX
+                  if( psessionEntry->isCCXconnection )
+                  {
+                      VOS_TRACE (VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO, 
+                          "%s: [INFOLOG]CCX 11g erpPresent=%d useProtection=%d nonErpPresent=%d\n", __func__,
+                          pBcnStruct->erpPresent,
+                          pBcnStruct->erpIEInfo.useProtection,
+                          pBcnStruct->erpIEInfo.nonErpPresent);
+                  }  
+#endif 
+                  limEnableOverlap11gProtection(pMac, pBeaconParams, pMh,psessionEntry);
+              }
+
+              //11g device overlaps
+              if (pBcnStruct->erpPresent &&
+                  !(pBcnStruct->erpIEInfo.useProtection || 
+                    pBcnStruct->erpIEInfo.nonErpPresent) && !(pBcnStruct->HTInfo.present))
+              {
+#ifdef WLAN_SOFTAP_FEATURE
+                    limUpdateOverlapStaParam(pMac, pMh->bssId, &(psessionEntry->gLimOverlap11gParams));
+
+                  if (psessionEntry->gLimOverlap11gParams.numSta && 
+                      !psessionEntry->gLimOverlap11gParams.protectionEnabled)
+#else
+                   limUpdateOverlapStaParam(pMac, pMh->bssId, &(pMac->lim.gLimOverlap11gParams));
+
+                  if (pMac->lim.gLimOverlap11gParams.numSta &&
+                      !pMac->lim.gLimOverlap11gParams.protectionEnabled)
+#endif
+                  {
+                      limEnableHtProtectionFrom11g(pMac, true, true, pBeaconParams,psessionEntry);
+                  }
+              }
+
+              //ht device overlaps.
+              //here we will check for HT related devices only which might need protection.
+              //check for 11b and 11g is already done in the previous blocks.
+              //so we will not check for HT operating mode as MIXED.
+              if (pBcnStruct->HTInfo.present)
+              {
+                  //if we are not already in mixed mode or legacy mode as HT operating mode
+                  //and received beacon has HT operating mode as legacy
+                  //then we need to enable protection from 11g station. 
+                  //we don't need protection from 11b because if that's needed then our operating
+                  //mode would have already been set to legacy in the previous blocks.
+                  if(eSIR_HT_OP_MODE_OVERLAP_LEGACY == pBcnStruct->HTInfo.opMode)
+                  {
+                      if((eSIR_HT_OP_MODE_MIXED != pMac->lim.gHTOperMode) &&
+                          (eSIR_HT_OP_MODE_OVERLAP_LEGACY != pMac->lim.gHTOperMode))
+                      {
+#ifdef WLAN_SOFTAP_FEATURE
+                          limUpdateOverlapStaParam(pMac, pMh->bssId, &(psessionEntry->gLimOverlap11gParams));
+                          if (psessionEntry->gLimOverlap11gParams.numSta &&
+                              !psessionEntry->gLimOverlap11gParams.protectionEnabled)
+#else
+                          limUpdateOverlapStaParam(pMac, pMh->bssId, &(pMac->lim.gLimOverlap11gParams));
+
+                          if (pMac->lim.gLimOverlap11gParams.numSta &&
+                              !pMac->lim.gLimOverlap11gParams.protectionEnabled)
+#endif
+                          {
+                              limEnableHtProtectionFrom11g(pMac, true, true, pBeaconParams,psessionEntry);
+                          }
+                      }
+                  }           
+                  else if(eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT == pBcnStruct->HTInfo.opMode)
+                  {
+#ifdef WLAN_SOFTAP_FEATURE
+                      limUpdateOverlapStaParam(pMac, pMh->bssId, &(psessionEntry->gLimOverlapHt20Params));
+                      if (psessionEntry->gLimOverlapHt20Params.numSta &&
+                          !psessionEntry->gLimOverlapHt20Params.protectionEnabled)
+#else
+                      limUpdateOverlapStaParam(pMac, pMh->bssId, &(pMac->lim.gLimOverlapHt20Params));
+
+                      if (pMac->lim.gLimOverlapHt20Params.numSta &&
+                          !pMac->lim.gLimOverlapHt20Params.protectionEnabled)
+#endif
+                      {
+                          limEnableHT20Protection(pMac, true, true, pBeaconParams,psessionEntry);
+                      }
+                  }
+              }
+              
+            }
+        }     
+    }
+    pMac->sch.gSchBcnIgnored++;
+}
+// --------------------------------------------------------------------
+
+
+
+
+/**
+ * __schBeaconProcessNoSession
+ *
+ * FUNCTION:
+ * Process the received beacon frame when 
+ *  -- Station is not scanning 
+ *  -- No corresponding session is found
+ *
+ * LOGIC:
+ *        Following scenarios exist when Session Does not exist:
+ *             * IBSS Beacons, when IBSS session already exists with same SSID, 
+ *                but from STA which has not yet joined and has a different BSSID.
+ *                - invoke limHandleIBSScoalescing with the session context of existing IBSS session.
+ *
+ *             * IBSS Beacons when IBSS session does not exist, only Infra or BT-AMP session exists,
+ *                then save the beacon in the scan results and throw it away.
+ *                
+ *             * Infra Beacons
+ *                - beacons received when no session active 
+ *                    should not come here, it should be handled as part of scanning, 
+ *                    else they should not be getting received, should update scan results and drop it if that happens.
+ *                - beacons received when IBSS session active:
+ *                    update scan results and drop it.
+ *                - beacons received when Infra session(STA) is active:
+ *                    update scan results and drop it
+ *                - beacons received when BT-STA session is active:
+ *                    update scan results and drop it.
+ *                - beacons received when Infra/BT-STA  or Infra/IBSS is active.
+ *                    update scan results and drop it.
+ * 
+
+ */
+static void __schBeaconProcessNoSession(tpAniSirGlobal pMac, tpSchBeaconStruct pBeacon,tANI_U8* pRxPacketInfo)
+{
+    tpPESession psessionEntry = NULL;
+ 
+    if(  (psessionEntry = limIsIBSSSessionActive(pMac)) != NULL)
+    {
+        limHandleIBSScoalescing(pMac, pBeacon, pRxPacketInfo, psessionEntry);
+    }
+
+    //If station(STA/BT-STA/BT-AP/IBSS) mode, Always save the beacon in the scan results, if atleast one session is active
+    //schBeaconProcessNoSession will be called only when there is atleast one session active, so not checking 
+    //it again here.
+    limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
+    return;  
+}
+
+
+
+/*
+ * __schBeaconProcessForSession
+ *
+ * FUNCTION:
+ * Process the received beacon frame when 
+ *  -- Station is not scanning 
+ *  -- Corresponding session is found
+ *
+ * LOGIC:
+ *        Following scenarios exist when Session exists
+ *             * IBSS STA receving beacons from IBSS Peers, who are part of IBSS.
+ *                 - call limHandleIBSScoalescing with that session context.
+ *             * Infra STA receving beacons from AP to which it is connected
+ *                 - call schBeaconProcessFromAP with that session's context.
+ *             * BTAMP STA receving beacons from BTAMP AP
+ *                 - call schBeaconProcessFromAP with that session's context.
+ *             * BTAMP AP receiving beacons from BTAMP STA 
+ *               (here need to make sure BTAP creates session entry for BT STA)
+ *                - just update the beacon count for heart beat purposes for now, 
+ *                  for now, don't process the beacon.
+ *             * Infra/IBSS both active and receives IBSS beacon:
+ *                  - call limHandleIBSScoalescing with that session context.
+ *             * Infra/IBSS both active and receives Infra beacon:
+ *                  - call schBeaconProcessFromAP with that session's context.
+ *                     any updates to EDCA parameters will be effective for IBSS as well, 
+ *                     even though no WMM for IBSS ?? Need to figure out how to handle this scenario.
+ *             * Infra/BTSTA both active and receive Infra beacon.
+ *                  - change in EDCA parameters on Infra affect the BTSTA link.
+ *                     Update the same parameters on BT link
+ *              * Infra/BTSTA both active and receive BT-AP beacon.
+ *                 -update beacon cnt for heartbeat
+ *             * Infra/BTAP both active and receive Infra beacon.
+ *                 - BT-AP starts advertising BE parameters from Infra AP, if they get changed.
+ *
+ *             * Infra/BTAP both active and receive BTSTA beacon.
+ *                - update beacon cnt for heartbeat
+ */
+
+static void __schBeaconProcessForSession( tpAniSirGlobal      pMac,
+                                                                     tpSchBeaconStruct   pBeacon,
+                                                                     tANI_U8* pRxPacketInfo,    
+                                                                     tpPESession psessionEntry)
+{
+    tANI_U32                     bi;
+    tANI_U8 bssIdx = 0;
+    //tpSirMacMgmtHdr         pMh = SIR_MAC_BD_TO_MPDUHEADER(pRxPacketInfo);
+    //tANI_U8 bssid[sizeof(tSirMacAddr)];
+    tUpdateBeaconParams beaconParams;
+    tANI_U8 sendProbeReq = FALSE;
+    tpDphHashNode pStaDs = NULL;
+
+
+    beaconParams.paramChangeBitmap = 0;
+
+    if(eLIM_STA_IN_IBSS_ROLE == psessionEntry->limSystemRole )
+    {
+        limHandleIBSScoalescing(pMac, pBeacon,  pRxPacketInfo, psessionEntry);
+    }
+    else if(  (eLIM_STA_ROLE == psessionEntry->limSystemRole) || 
+                  (eLIM_BT_AMP_STA_ROLE == psessionEntry->limSystemRole))
+    {
+        /*
+        *  This handles two cases:
+        *  -- Infra STA receving beacons from AP  
+        *  -- BTAMP_STA receving beacons from BTAMP_AP
+        */
+        
+    
+        //Always save the beacon into LIM's cached scan results
+        limCheckAndAddBssDescription(pMac, pBeacon, pRxPacketInfo, eANI_BOOLEAN_FALSE, eANI_BOOLEAN_FALSE);
+        
+        /**
+               * This is the Beacon received from the AP  we're currently associated with. Check
+               * if there are any changes in AP's capabilities 
+               */
+        if((tANI_U8) pBeacon->channelNumber != psessionEntry->currentOperChannel)
+        {
+            PELOGE(limLog(pMac, LOGE, FL("Channel Change from %d --> %d  - "
+                                         "Ignoring beacon!\n"), 
+                          psessionEntry->currentOperChannel, pBeacon->channelNumber);)
+           goto fail;
+        }
+        limDetectChangeInApCapabilities(pMac, pBeacon, psessionEntry);
+        if(limGetStaHashBssidx(pMac, DPH_STA_HASH_INDEX_PEER, &bssIdx, psessionEntry) != eSIR_SUCCESS)
+            goto fail;
+        beaconParams.bssIdx = bssIdx;
+        palCopyMemory( pMac->hHdd, ( tANI_U8* )&psessionEntry->lastBeaconTimeStamp, ( tANI_U8* )pBeacon->timeStamp, sizeof(tANI_U64) );
+        psessionEntry->lastBeaconDtimCount = pBeacon->tim.dtimCount;
+        psessionEntry->lastBeaconDtimPeriod= pBeacon->tim.dtimPeriod;
+        psessionEntry->currentBssBeaconCnt++;
+
+
+
+        MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[0]);)
+        MTRACE(macTrace(pMac, TRACE_CODE_RX_MGMT_TSF, 0, pBeacon->timeStamp[1]);)
+
+        /* Read beacon interval session Entry */
+        bi = psessionEntry->beaconParams.beaconInterval;
+        if (bi != pBeacon->beaconInterval)
+        {
+           PELOG1(schLog(pMac, LOG1, FL("Beacon interval changed from %d to %d\n"),
+                   pBeacon->beaconInterval, bi);)
+
+            bi = pBeacon->beaconInterval;
+            psessionEntry->beaconParams.beaconInterval = (tANI_U16) bi;
+            beaconParams.paramChangeBitmap |= PARAM_BCN_INTERVAL_CHANGED;
+            beaconParams.beaconInterval = (tANI_U16)bi;
+        }
+
+        if (pBeacon->cfPresent)
+        {
+            cfgSetInt(pMac, WNI_CFG_CFP_PERIOD, pBeacon->cfParamSet.cfpPeriod);
+            limSendCFParams(pMac, bssIdx, pBeacon->cfParamSet.cfpCount, pBeacon->cfParamSet.cfpPeriod);
+        }
+
+        if (pBeacon->timPresent)
+        {
+            cfgSetInt(pMac, WNI_CFG_DTIM_PERIOD, pBeacon->tim.dtimPeriod);
+            //No need to send DTIM Period and Count to HAL/SMAC
+            //SMAC already parses TIM bit.
+        }
+
+        
+        if(pMac->lim.gLimProtectionControl != WNI_CFG_FORCE_POLICY_PROTECTION_DISABLE)
+
+        limDecideStaProtection(pMac, pBeacon, &beaconParams, psessionEntry);
+        if (pBeacon->erpPresent)
+        {
+#ifdef WLAN_SOFTAP_FEATURE
+            if (pBeacon->erpIEInfo.barkerPreambleMode)
+                limEnableShortPreamble(pMac, false, &beaconParams, psessionEntry);
+            else
+                limEnableShortPreamble(pMac, true, &beaconParams, psessionEntry);
+#else
+            if (pBeacon->erpIEInfo.barkerPreambleMode)
+                limEnableShortPreamble(pMac, false, &beaconParams);
+            else
+                limEnableShortPreamble(pMac, true, &beaconParams);
+#endif
+          }
+        limUpdateShortSlot(pMac, pBeacon, &beaconParams,psessionEntry);
+
+        pStaDs = dphGetHashEntry(pMac, DPH_STA_HASH_INDEX_PEER, &psessionEntry->dph.dphHashTable);
+        if ((pBeacon->wmeEdcaPresent && (psessionEntry->limWmeEnabled)) ||
+             (pBeacon->edcaPresent    && (psessionEntry->limQosEnabled)))
+        {
+            if(pBeacon->edcaParams.qosInfo.count != psessionEntry->gLimEdcaParamSetCount)
+            {
+                if (schBeaconEdcaProcess(pMac, &pBeacon->edcaParams, psessionEntry) != eSIR_SUCCESS)
+                    PELOGE(schLog(pMac, LOGE, FL("EDCA parameter processing error\n"));)
+                else if(pStaDs != NULL)
+                {
+                    // If needed, downgrade the EDCA parameters
+                    limSetActiveEdcaParams(pMac, psessionEntry->gLimEdcaParams, psessionEntry); 
+
+                    if (pStaDs->aniPeer == eANI_BOOLEAN_TRUE)
+                        limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_TRUE);
+                    else
+                        limSendEdcaParams(pMac, psessionEntry->gLimEdcaParamsActive, pStaDs->bssId, eANI_BOOLEAN_FALSE);
+                }
+                else
+                    PELOGE(limLog(pMac, LOGE, FL("Self Entry missing in Hash Table\n"));)
+            }
+        }
+        else if( (pBeacon->qosCapabilityPresent && psessionEntry->limQosEnabled) &&
+            (pBeacon->qosCapability.qosInfo.count != psessionEntry->gLimEdcaParamSetCount))
+            sendProbeReq = TRUE;
+    }
+
+    if ( pMac->lim.htCapability && pBeacon->HTInfo.present )
+    {
+        limUpdateStaRunTimeHTSwitchChnlParams( pMac, &pBeacon->HTInfo, bssIdx,psessionEntry);
+    }
+
+#if defined(ANI_PRODUCT_TYPE_CLIENT) || defined(ANI_AP_CLIENT_SDK)
+    if ( (psessionEntry->limSystemRole == eLIM_STA_ROLE) ||(psessionEntry->limSystemRole == eLIM_BT_AMP_STA_ROLE) ||
+          (psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) )
+    {
+        if(pBeacon->quietIEPresent)
+        {
+            limUpdateQuietIEFromBeacon(pMac, &(pBeacon->quietIE), psessionEntry);
+        }
+        else if ((pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_BEGIN) ||
+             (pMac->lim.gLimSpecMgmt.quietState == eLIM_QUIET_RUNNING))
+        {
+            PELOG1(limLog(pMac, LOG1, FL("Received a beacon without Quiet IE\n"));)
+            limCancelDot11hQuiet(pMac, psessionEntry);
+        }
+
+        /* Channel Switch information element updated */
+        if(pBeacon->channelSwitchPresent || 
+            pBeacon->propIEinfo.propChannelSwitchPresent)
+        {
+            limUpdateChannelSwitch(pMac, pBeacon, psessionEntry);
+        }
+        else if (pMac->lim.gLimSpecMgmt.dot11hChanSwState == eLIM_11H_CHANSW_RUNNING)
+        {
+            limCancelDot11hChannelSwitch(pMac, psessionEntry);
+        }   
+    }
+#endif
+
+#if defined FEATURE_WLAN_CCX
+        if( psessionEntry->isCCXconnection )
+        {
+           tPowerdBm  localConstraint = 0, regMax = 0, maxTxPower = 0;
+           if (pBeacon->ccxTxPwr.present)
+           {
+              localConstraint = pBeacon->ccxTxPwr.power_limit;
+              regMax = cfgGetRegulatoryMaxTransmitPower( pMac, psessionEntry->currentOperChannel ); 
+              maxTxPower = limGetMaxTxPower(regMax, localConstraint);
+
+              //If maxTxPower is increased or decreased
+             if( maxTxPower != psessionEntry->maxTxPower )
+             {
+                limLog( pMac, LOG1, "RegMax = %d, lpc = %d, MaxTx = %d", regMax, localConstraint, maxTxPower );
+                limLog( pMac, LOG1, "Local power constraint change..updating new maxTx power to HAL");
+                if( limSendSetMaxTxPowerReq ( pMac, maxTxPower, psessionEntry ) == eHAL_STATUS_SUCCESS )
+                   psessionEntry->maxTxPower = maxTxPower;
+             }
+           }
+        }
+#endif
+
+
+#if defined WLAN_FEATURE_VOWIFI
+        if( pMac->rrm.rrmPEContext.rrmEnable )
+        {
+           tPowerdBm  localConstraint = 0, regMax = 0, maxTxPower = 0;
+           if (pBeacon->powerConstraintPresent && pMac->rrm.rrmPEContext.rrmEnable)
+           {
+              localConstraint = pBeacon->localPowerConstraint.localPowerConstraints;
+           }
+           else
+           {
+              localConstraint = 0;
+           }
+           regMax = cfgGetRegulatoryMaxTransmitPower( pMac, psessionEntry->currentOperChannel ); 
+           maxTxPower = VOS_MIN( regMax , (regMax - localConstraint) );
+           //If maxTxPower is increased or decreased
+           if( maxTxPower != psessionEntry->maxTxPower )
+           {
+#if defined WLAN_VOWIFI_DEBUG
+              limLog( pMac, LOGE, "Regulatory max = %d, local power constraint = %d, max tx = %d", regMax, localConstraint, maxTxPower );
+              limLog( pMac, LOGE, "Local power constraint change..updating mew maxTx power to HAL");
+#endif
+              if( rrmSendSetMaxTxPowerReq ( pMac, maxTxPower, psessionEntry ) == eHAL_STATUS_SUCCESS )
+                 psessionEntry->maxTxPower = maxTxPower;
+
+           }
+        }
+#endif
+
+    // Indicate to LIM that Beacon is received
+
+    if (pBeacon->HTInfo.present)
+        limReceivedHBHandler(pMac, (tANI_U8)pBeacon->HTInfo.primaryChannel, psessionEntry);
+    else
+        limReceivedHBHandler(pMac, (tANI_U8)pBeacon->channelNumber, psessionEntry);
+
+    // I don't know if any additional IE is required here. Currently, not include addIE.
+    if(sendProbeReq)
+        limSendProbeReqMgmtFrame(pMac, &psessionEntry->ssId,
+            psessionEntry->bssId, psessionEntry->currentOperChannel,psessionEntry->selfMacAddr,
+            psessionEntry->dot11mode, 0, NULL);
+
+   PELOG2(schLog(pMac, LOG2, "Received Beacon's SeqNum=%d\n",
+           (pMh->seqControl.seqNumHi << 4) | (pMh->seqControl.seqNumLo));)
+
+    if(beaconParams.paramChangeBitmap)
+    {
+        PELOGW(schLog(pMac, LOGW, FL("Beacon for session[%d] got changed. \n"), psessionEntry->peSessionId);)
+        PELOGW(schLog(pMac, LOGW, FL("sending beacon param change bitmap: 0x%x \n"), beaconParams.paramChangeBitmap);)
+        limSendBeaconParams(pMac, &beaconParams, psessionEntry);
+    }
+
+fail:
+    return;
+
+}
+
+
+
+/**
+ * schBeaconProcess
+ *
+ * FUNCTION:
+ * Process the received beacon frame
+ *
+ * LOGIC:
+  *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param pRxPacketInfo pointer to buffer descriptor
+ * @return None
+ */
+ 
+void schBeaconProcess(tpAniSirGlobal pMac, tANI_U8* pRxPacketInfo, tpPESession psessionEntry)
+{
+    static tSchBeaconStruct beaconStruct;
+    tUpdateBeaconParams beaconParams;
+    tpPESession pAPSession = NULL;
+    beaconParams.paramChangeBitmap = 0;
+
+    pMac->sch.gSchBcnRcvCnt++;
+
+    // Convert the beacon frame into a structure
+    if (sirConvertBeaconFrame2Struct(pMac, (tANI_U8 *) pRxPacketInfo, &beaconStruct)!= eSIR_SUCCESS)
+    {
+        PELOGE(schLog(pMac, LOGE, FL("beacon parsing failed\n"));)
+        pMac->sch.gSchBcnParseErrorCnt++;
+        return;
+    }
+
+    if (beaconStruct.ssidPresent)
+    {
+        beaconStruct.ssId.ssId[beaconStruct.ssId.length] = 0;
+    }
+
+    /*
+    * First process the beacon in the context of any existing AP or BTAP session.
+    * This takes cares of following two scenarios:
+    *  - psessionEntry = NULL:  
+    *      e.g. beacon received from a neighboring BSS, you want to apply the protection settings to BTAP/InfraAP beacons
+    *  - psessionEntry is non NULL: 
+    *      e.g. beacon received is from the INFRA AP to which you are connected on another concurrent link.
+    *      In this case also, we want to apply the protection settings(as advertised by Infra AP) to BTAP beacons
+    * 
+    * 
+    */
+    
+    if((pAPSession = limIsApSessionActive(pMac)) != NULL)
+    {
+        beaconParams.bssIdx = pAPSession->bssIdx;
+#ifdef WLAN_SOFTAP_FEATURE
+        if (pAPSession->gLimProtectionControl != WNI_CFG_FORCE_POLICY_PROTECTION_DISABLE)
+#else
+        if (pMac->lim.gLimProtectionControl != WNI_CFG_FORCE_POLICY_PROTECTION_DISABLE)
+#endif
+            ap_beacon_process(pMac,  pRxPacketInfo, &beaconStruct, &beaconParams, pAPSession);
+
+        if (beaconParams.paramChangeBitmap)
+        {
+            //Update the beacons and apply the new settings to HAL
+            schSetFixedBeaconFields(pMac, pAPSession);
+            PELOG1(schLog(pMac, LOG1, FL("Beacon for PE session[%d] got changed.  \n"), pAPSession->peSessionId);)
+            PELOG1(schLog(pMac, LOG1, FL("sending beacon param change bitmap: 0x%x \n"), beaconParams.paramChangeBitmap);)
+            limSendBeaconParams(pMac, &beaconParams, pAPSession);
+        }
+    }
+
+    /*
+    * Now process the beacon in the context of the BSS which is transmitting the beacons, if one is found
+    */
+    if(psessionEntry == NULL)
+    {
+        __schBeaconProcessNoSession(pMac,   &beaconStruct, pRxPacketInfo );   
+    }
+    else
+    {
+        __schBeaconProcessForSession(pMac,   &beaconStruct, pRxPacketInfo, psessionEntry );   
+    }
+
+}
+
+
+
+
+
+// --------------------------------------------------------------------
+/**
+ * schBeaconEdcaProcess
+ *
+ * FUNCTION:
+ * Process the EDCA parameter set in the received beacon frame
+ *
+ * LOGIC:
+ *
+ * ASSUMPTIONS:
+ *
+ * NOTE:
+ *
+ * @param edca reference to edca parameters in beacon struct
+ * @return success
+ */
+
+tSirRetStatus schBeaconEdcaProcess(tpAniSirGlobal pMac, tSirMacEdcaParamSetIE *edca, tpPESession psessionEntry)
+{
+    tANI_U8 i;
+#ifdef FEATURE_WLAN_DIAG_SUPPORT
+    vos_log_qos_edca_pkt_type *log_ptr = NULL;
+#endif //FEATURE_WLAN_DIAG_SUPPORT 
+
+    PELOG1(schLog(pMac, LOG1, FL("Updating parameter set count: Old %d ---> new %d\n"),
+           psessionEntry->gLimEdcaParamSetCount, edca->qosInfo.count);)
+
+    psessionEntry->gLimEdcaParamSetCount = edca->qosInfo.count;
+    psessionEntry->gLimEdcaParams[EDCA_AC_BE] = edca->acbe;
+    psessionEntry->gLimEdcaParams[EDCA_AC_BK] = edca->acbk;
+    psessionEntry->gLimEdcaParams[EDCA_AC_VI] = edca->acvi;
+    psessionEntry->gLimEdcaParams[EDCA_AC_VO] = edca->acvo;
+//log: LOG_WLAN_QOS_EDCA_C
+#ifdef FEATURE_WLAN_DIAG_SUPPORT
+    WLAN_VOS_DIAG_LOG_ALLOC(log_ptr, vos_log_qos_edca_pkt_type, LOG_WLAN_QOS_EDCA_C);
+    if(log_ptr)
+    {
+       log_ptr->aci_be = psessionEntry->gLimEdcaParams[EDCA_AC_BE].aci.aci;
+       log_ptr->cw_be  = psessionEntry->gLimEdcaParams[EDCA_AC_BE].cw.max << 4 |
+          psessionEntry->gLimEdcaParams[EDCA_AC_BE].cw.min;
+       log_ptr->txoplimit_be = psessionEntry->gLimEdcaParams[EDCA_AC_BE].txoplimit;
+       log_ptr->aci_bk = psessionEntry->gLimEdcaParams[EDCA_AC_BK].aci.aci;
+       log_ptr->cw_bk  = psessionEntry->gLimEdcaParams[EDCA_AC_BK].cw.max << 4 |
+          psessionEntry->gLimEdcaParams[EDCA_AC_BK].cw.min;
+       log_ptr->txoplimit_bk = psessionEntry->gLimEdcaParams[EDCA_AC_BK].txoplimit;
+       log_ptr->aci_vi = psessionEntry->gLimEdcaParams[EDCA_AC_VI].aci.aci;
+       log_ptr->cw_vi  = psessionEntry->gLimEdcaParams[EDCA_AC_VI].cw.max << 4 |
+          psessionEntry->gLimEdcaParams[EDCA_AC_VI].cw.min;
+       log_ptr->txoplimit_vi = psessionEntry->gLimEdcaParams[EDCA_AC_VI].txoplimit;
+       log_ptr->aci_vo = psessionEntry->gLimEdcaParams[EDCA_AC_VO].aci.aci;
+       log_ptr->cw_vo  = psessionEntry->gLimEdcaParams[EDCA_AC_VO].cw.max << 4 |
+          psessionEntry->gLimEdcaParams[EDCA_AC_VO].cw.min;
+       log_ptr->txoplimit_vo = psessionEntry->gLimEdcaParams[EDCA_AC_VO].txoplimit;
+    }
+    WLAN_VOS_DIAG_LOG_REPORT(log_ptr);
+#endif //FEATURE_WLAN_DIAG_SUPPORT
+    PELOG1(schLog(pMac, LOGE, FL("Updating Local EDCA Params(gLimEdcaParams) to: "));)
+    for(i=0; i<MAX_NUM_AC; i++)
+    {
+        PELOG1(schLog(pMac, LOG1, FL("AC[%d]:  AIFSN: %d, ACM %d, CWmin %d, CWmax %d, TxOp %d\n"),
+            i,
+            psessionEntry->gLimEdcaParams[i].aci.aifsn, 
+            psessionEntry->gLimEdcaParams[i].aci.acm,
+            psessionEntry->gLimEdcaParams[i].cw.min,
+            psessionEntry->gLimEdcaParams[i].cw.max,
+            psessionEntry->gLimEdcaParams[i].txoplimit);)
+    }
+
+    return eSIR_SUCCESS;
+}