wlan: SAPHT40 2.4GHz:Add OBSS Scan functionality for SAP/P2PGO

Initiate OBSS scan before starting SAP or P2PGO in HT40
mode in case 2.4GHz band.

Change-Id: I3e480249f3f3d74e691850870ea0d5320013412a
CRs-Fixed: 755512
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 6c7db3a..931f498 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -677,6 +677,9 @@
     tANI_BOOLEAN            pmfRequired;
 #endif
 
+#ifdef WLAN_FEATURE_AP_HT40_24G
+    tANI_BOOLEAN            apHT40_24GEnabled;
+#endif
 } tSirSmeStartBssReq, *tpSirSmeStartBssReq;
 
 #define GET_IE_LEN_IN_BSS(lenInBss) ( lenInBss + sizeof(lenInBss) - \
diff --git a/CORE/MAC/inc/sirMacProtDef.h b/CORE/MAC/inc/sirMacProtDef.h
index 4d94072..d2d361d 100644
--- a/CORE/MAC/inc/sirMacProtDef.h
+++ b/CORE/MAC/inc/sirMacProtDef.h
@@ -411,6 +411,7 @@
 #define SIR_MAC_HT_INFO_EID_MIN    0
 #define SIR_MAC_HT_INFO_EID_MAX    255
 #define SIR_MAC_OBSS_SCAN_PARAMETERS_EID 74
+#define SIR_MAC_EXTENDED_CAPABILITIES_EID 127
 
 #ifdef WLAN_FEATURE_11AC
 #define SIR_MAC_VHT_CAPABILITIES_EID   191
diff --git a/CORE/MAC/src/include/parserApi.h b/CORE/MAC/src/include/parserApi.h
index 53e66e0..46174ec 100644
--- a/CORE/MAC/src/include/parserApi.h
+++ b/CORE/MAC/src/include/parserApi.h
@@ -576,6 +576,13 @@
                      tDot11fIEHTInfo *pDot11f,
                      tpPESession      psessionEntry);
 
+#ifdef WLAN_FEATURE_AP_HT40_24G
+tSirRetStatus
+PopulateDot11fOBSSScanParameters(tpAniSirGlobal   pMac,
+                     tDot11fIEOBSSScanParameters *pDot11f,
+                     tpPESession      psessionEntry);
+#endif
+
 void PopulateDot11fIBSSParams(tpAniSirGlobal  pMac,
        tDot11fIEIBSSParams *pDot11f, tpPESession psessionEntry);
 
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 6c34ed2..e5c8413 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -621,6 +621,14 @@
 
         psessionEntry->maxTxPower = cfgGetRegulatoryMaxTransmitPower( pMac, 
             psessionEntry->currentOperChannel );
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+        /*Store Overlapping BSS Scan Parameters IEs to session table */
+        if (pSmeStartBssReq->apHT40_24GEnabled)
+        {
+            limInitOBSSScanParams(pMac, psessionEntry);
+        }
+#endif
         /* Store the dot 11 mode in to the session Table*/
 
         psessionEntry->dot11mode = pSmeStartBssReq->dot11mode;
diff --git a/CORE/MAC/src/pe/lim/limSendManagementFrames.c b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
index 15b6194..c4a6fe0 100644
--- a/CORE/MAC/src/pe/lim/limSendManagementFrames.c
+++ b/CORE/MAC/src/pe/lim/limSendManagementFrames.c
@@ -735,6 +735,20 @@
         PopulateDot11fHTCaps( pMac, psessionEntry, &pFrm->HTCaps );
         PopulateDot11fHTInfo( pMac, &pFrm->HTInfo, psessionEntry );
     }
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+    /* Populate Overlapping BSS Scan Parameters IEs,
+     * when operating in HT40 in 2.4GHz.
+     */
+    if (pMac->roam.configParam.apHT40_24GEnabled)
+    {
+        PopulateDot11fOBSSScanParameters( pMac, &pFrm->OBSSScanParameters,
+                                                             psessionEntry);
+    }
+#endif
+
+    PopulateDot11fExtCap( pMac, &pFrm->ExtCap, psessionEntry);
+
 #ifdef WLAN_FEATURE_11AC
     if(psessionEntry->vhtCapability)
     {
@@ -743,7 +757,6 @@
         PopulateDot11fVHTOperation( pMac, &pFrm->VHTOperation );
         // we do not support multi users yet
         //PopulateDot11fVHTExtBssLoad( pMac, &frm.VHTExtBssLoad );
-        PopulateDot11fExtCap( pMac, &pFrm->ExtCap, psessionEntry);
     }
 #endif
 
@@ -1470,6 +1483,18 @@
             PopulateDot11fHTInfo( pMac, &frm.HTInfo, psessionEntry );
         }
 
+#ifdef WLAN_FEATURE_AP_HT40_24G
+        /* Populate Overlapping BSS Scan Parameters IEs,
+         * when operating in HT40 in 2.4GHz.
+         */
+        if (pMac->roam.configParam.apHT40_24GEnabled)
+        {
+            PopulateDot11fOBSSScanParameters( pMac, &frm.OBSSScanParameters,
+                                                               psessionEntry);
+        }
+#endif
+
+        PopulateDot11fExtCap( pMac, &frm.ExtCap, psessionEntry);
 #ifdef WLAN_FEATURE_11AC
         if( pSta->mlmStaContext.vhtCapability && 
             psessionEntry->vhtCapability )
@@ -1477,7 +1502,6 @@
             limLog( pMac, LOG1, FL("Populate VHT IEs in Assoc Response"));
             PopulateDot11fVHTCaps( pMac, &frm.VHTCaps, eSIR_TRUE );
             PopulateDot11fVHTOperation( pMac, &frm.VHTOperation);
-            PopulateDot11fExtCap( pMac, &frm.ExtCap, psessionEntry);
         }
 #endif
 
diff --git a/CORE/MAC/src/pe/lim/limSerDesUtils.c b/CORE/MAC/src/pe/lim/limSerDesUtils.c
index 2784ebc..ae24ad1 100644
--- a/CORE/MAC/src/pe/lim/limSerDesUtils.c
+++ b/CORE/MAC/src/pe/lim/limSerDesUtils.c
@@ -739,6 +739,11 @@
         len  -= pStartBssReq->extendedRateSet.numRates;
     }
 
+#ifdef WLAN_FEATURE_AP_HT40_24G
+    /* extract apHT40_24GEnabled */
+    pStartBssReq->apHT40_24GEnabled = *pBuf++;
+    len--;
+#endif
     if (len)
     {
         limLog(pMac, LOGW, FL("Extra bytes left in SME_START_BSS_REQ, len=%d"), len);
diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c
index 39600cd..7fa744a 100644
--- a/CORE/MAC/src/pe/lim/limUtils.c
+++ b/CORE/MAC/src/pe/lim/limUtils.c
@@ -8181,6 +8181,19 @@
     }
     psessionEntry->obssHT40ScanParam.OBSSScanPassiveTotalPerChannel =
                                                              cfgValue;
+
+    if (wlan_cfgGetInt(pMac,
+         WNI_CFG_OBSS_HT40_WIDTH_CHANNEL_TRANSITION_DELAY_FACTOR, &cfgValue)
+         != eSIR_SUCCESS)
+    {
+       limLog(pMac, LOGE, FL("Fail to retrieve"
+              "WNI_CFG_OBSS_HT40_WIDTH_CHANNEL_TRANSITION_DELAY_FACTOR value"));
+       return ;
+    }
+    psessionEntry->obssHT40ScanParam.BSSWidthChannelTransitionDelayFactor =
+                                                                   cfgValue;
+
+
     if (wlan_cfgGetInt(pMac, WNI_CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD ,
                        &cfgValue) != eSIR_SUCCESS)
     {
diff --git a/CORE/MAC/src/pe/sch/schBeaconGen.c b/CORE/MAC/src/pe/sch/schBeaconGen.c
index ae3d93e..1dee68f 100644
--- a/CORE/MAC/src/pe/sch/schBeaconGen.c
+++ b/CORE/MAC/src/pe/sch/schBeaconGen.c
@@ -336,6 +336,17 @@
         PopulateDot11fHTCaps( pMac,psessionEntry, &pBcn2->HTCaps );
         PopulateDot11fHTInfo( pMac, &pBcn2->HTInfo, psessionEntry );
     }
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+    if (pMac->roam.configParam.apHT40_24GEnabled)
+    {
+        PopulateDot11fOBSSScanParameters( pMac, &pBcn2->OBSSScanParameters,
+                                                               psessionEntry);
+    }
+#endif
+
+    PopulateDot11fExtCap( pMac, &pBcn2->ExtCap, psessionEntry);
+
 #ifdef WLAN_FEATURE_11AC
     if(psessionEntry->vhtCapability)
     {        
@@ -344,7 +355,6 @@
         PopulateDot11fVHTOperation( pMac, &pBcn2->VHTOperation);
         // we do not support multi users yet
         //PopulateDot11fVHTExtBssLoad( pMac, &bcn2.VHTExtBssLoad);
-        PopulateDot11fExtCap( pMac, &pBcn2->ExtCap, psessionEntry);
         if(psessionEntry->gLimOperatingMode.present)
             PopulateDot11fOperatingMode( pMac, &pBcn2->OperatingMode, psessionEntry );
     }
@@ -613,6 +623,31 @@
                      sizeof(beacon2->HTInfo));
     }
 
+#ifdef WLAN_FEATURE_AP_HT40_24G
+    // Overlapping BSS Scan Parameters IE
+    if (pMac->roam.configParam.apHT40_24GEnabled)
+    {
+        if (beacon2->OBSSScanParameters.present)
+        {
+            SetProbeRspIeBitmap(DefProbeRspIeBitmap,
+                          SIR_MAC_OBSS_SCAN_PARAMETERS_EID);
+            vos_mem_copy((void *)&prb_rsp->OBSSScanParameters,
+                              (void *)&beacon2->OBSSScanParameters,
+                              sizeof(beacon2->OBSSScanParameters));
+        }
+
+        if (beacon2->ExtCap.present)
+        {
+            SetProbeRspIeBitmap(DefProbeRspIeBitmap,
+                        SIR_MAC_EXTENDED_CAPABILITIES_EID);
+            vos_mem_copy((void *)&prb_rsp->ExtCap,
+                              (void *)&beacon2->ExtCap,
+                              sizeof(beacon2->ExtCap));
+
+        }
+    }
+#endif
+
 #ifdef WLAN_FEATURE_11AC
     if(beacon2->VHTCaps.present)
     {
diff --git a/CORE/SAP/src/sapApiLinkCntl.c b/CORE/SAP/src/sapApiLinkCntl.c
index fc56481..04c6538 100644
--- a/CORE/SAP/src/sapApiLinkCntl.c
+++ b/CORE/SAP/src/sapApiLinkCntl.c
@@ -105,95 +105,38 @@
  * -------------------------------------------------------------------------*/
 
 /*==========================================================================
-  FUNCTION    WLANSAP_ScanCallback()
+  FUNCTION    sapSetOperatingChannel()
 
-  DESCRIPTION 
-    Callback for Scan (scan results) Events  
+  DESCRIPTION
+    Set SAP Operating Channel
 
-  DEPENDENCIES 
-    NA. 
+  DEPENDENCIES
+    NA.
 
-  PARAMETERS 
+  PARAMETERS
 
     IN
-    tHalHandle  : tHalHandle passed in with the scan request
     *pContext   : The second context pass in for the caller (sapContext)
-    scanID      : scanID got after the scan
-    status      : Status of scan -success, failure or abort
-   
-  RETURN VALUE
-    The eHalStatus code associated with performing the operation  
+    operChannel : SAP Operating Channel
 
-    eHAL_STATUS_SUCCESS: Success
-  
-  SIDE EFFECTS 
+  RETURN VALUE
+
+  SIDE EFFECTS
 ============================================================================*/
-eHalStatus
-WLANSAP_ScanCallback
-(
-  tHalHandle halHandle, 
-  void *pContext,           /* Opaque SAP handle */
-  v_U32_t scanID, 
-  eCsrScanStatus scanStatus
-)
+
+void sapSetOperatingChannel(ptSapContext psapContext, v_U8_t operChannel)
 {
-    tScanResultHandle pResult = NULL;
-    eHalStatus scanGetResultStatus = eHAL_STATUS_FAILURE;
-    ptSapContext psapContext = (ptSapContext)pContext;
-    void *pTempHddCtx;
-    tWLAN_SAPEvent sapEvent; /* State machine event */
-    v_U8_t operChannel = 0;
     v_U8_t i = 0;
-    VOS_STATUS sapstatus;
     v_U32_t event;
 
-    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
-
-    pTempHddCtx = vos_get_context( VOS_MODULE_ID_HDD,
-                                     psapContext->pvosGCtx);
-    if (NULL == pTempHddCtx)
-    {
-        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
-                   "HDD context is NULL");
-        return eHAL_STATUS_FAILURE;
-    }
-
-    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before switch on scanStatus = %d", __func__, scanStatus);
-
-    switch (scanStatus) 
-    {
-        case eCSR_SCAN_SUCCESS:
-            // sapScanCompleteCallback with eCSR_SCAN_SUCCESS
-            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_SUCCESS", scanStatus);
-
-            // Get scan results, Run channel selection algorithm, select channel and keep in pSapContext->Channel
-            scanGetResultStatus = sme_ScanGetResult(halHandle, 0, NULL, &pResult);
-
-            event = eSAP_MAC_SCAN_COMPLETE;
-
-            if ((scanGetResultStatus != eHAL_STATUS_SUCCESS)&& (scanGetResultStatus != eHAL_STATUS_E_NULL_VALUE))
-            {
-                // No scan results
-                VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, Get scan result failed! ret = %d",
-                                __func__, scanGetResultStatus);
-                break;
-            }
-
-            operChannel = sapSelectChannel(halHandle, psapContext, pResult);
-
-            sme_ScanResultPurge(halHandle, pResult);
-            break;
-
-        default:
-            event = eSAP_CHANNEL_SELECTION_FAILED;
-            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, CSR scanStatus = %s (%d)", __func__, "eCSR_SCAN_ABORT/FAILURE", scanStatus);
-    }
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                FL("SAP Channel : %d"), psapContext->channel);
 
     if (operChannel == SAP_CHANNEL_NOT_SELECTED)
 #ifdef SOFTAP_CHANNEL_RANGE
     {
         VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
-                "%s: No suitable channel selected", __func__);
+                FL("No suitable channel selected"));
 
         if ( eCSR_BAND_ALL ==  psapContext->scanBandPreference ||
                 psapContext->allBandScanned == eSAP_TRUE)
@@ -204,7 +147,7 @@
                  for ( i = 0 ; i < psapContext->numofChannel ; i++)
                  {
                     if (NV_CHANNEL_ENABLE ==
-                        vos_nv_getChannelEnabledState(psapContext->channelList[i]))
+                     vos_nv_getChannelEnabledState(psapContext->channelList[i]))
                     {
                         psapContext->channel = psapContext->channelList[i];
                         break;
@@ -213,8 +156,8 @@
             }
             else
             {
-                /* if the channel list is empty then there is no valid channel in
-                   the selected sub-band so select default channel in the
+                /* if the channel list is empty then there is no valid channel
+                   in the selected sub-band so select default channel in the
                    BAND(2.4GHz) as 2.4 channels are available in all the
                    countries*/
                    psapContext->channel = SAP_DEFAULT_CHANNEL;
@@ -223,8 +166,7 @@
         else
         {
             VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
-                    "%s: Has scan band preference",
-                    __func__);
+                    FL("Has scan band preference"));
             if (eCSR_BAND_24 == psapContext->currentPreferredBand)
                 psapContext->currentPreferredBand = eCSR_BAND_5G;
             else
@@ -244,9 +186,624 @@
       psapContext->channel = operChannel;
     }
 
-    sme_SelectCBMode(halHandle,
-          sapConvertSapPhyModeToCsrPhyMode(psapContext->csrRoamProfile.phyMode),
-          psapContext->channel);
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+               FL("SAP Channel : %d"), psapContext->channel);
+}
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+/*==========================================================================
+  FUNCTION    sapCheckFor20MhzObss()
+
+  DESCRIPTION
+    Check 20 MHz Overlapping BSS
+
+  DEPENDENCIES
+    NA.
+
+  PARAMETERS
+
+    IN
+    channelNumber : Peer BSS Operating Channel
+    tpSirProbeRespBeacon: Pointer to Beacon Struct
+    ptSapContext: Pointer to SAP Context
+
+  RETURN VALUE
+    v_U8_t          : Success - Found OBSS BSS, Fail - zero
+
+  SIDE EFFECTS
+============================================================================*/
+
+eHalStatus sapCheckFor20MhzObss(v_U8_t channelNumber,
+                            tpSirProbeRespBeacon  pBeaconStruct,
+                            ptSapContext psapCtx)
+{
+
+    v_U16_t secondaryChannelOffset;
+    eHalStatus halStatus = eHAL_STATUS_SUCCESS;
+
+    VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+             FL("channelNumber: %d BSS: %s"), channelNumber,
+             pBeaconStruct->ssId.ssId);
+
+    if (channelNumber < psapCtx->affected_start
+      || channelNumber > psapCtx->affected_end)
+    {
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                FL("channelNumber: %d out of Affetced Channel Range: [%d,%d]"),
+                channelNumber, psapCtx->affected_start,
+                psapCtx->affected_end);
+        return halStatus;
+    }
+
+    if (!pBeaconStruct->HTCaps.present)
+    {
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                   FL("Found overlapping legacy BSS: %s on Channel : %d"),
+                   pBeaconStruct->ssId.ssId, channelNumber);
+        halStatus = eHAL_STATUS_FAILURE;
+        return halStatus;
+    }
+
+    if (pBeaconStruct->HTInfo.present)
+    {
+        secondaryChannelOffset = pBeaconStruct->HTInfo.secondaryChannelOffset;
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                   FL("BSS: %s secondaryChannelOffset: %d on Channel : %d"),
+                   pBeaconStruct->ssId.ssId, secondaryChannelOffset,
+                   channelNumber);
+        if (PHY_SINGLE_CHANNEL_CENTERED == secondaryChannelOffset)
+        {
+            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                   FL("Found overlapping 20 MHz HT BSS: %s on Channel : %d"),
+                   pBeaconStruct->ssId.ssId, channelNumber);
+            halStatus = eHAL_STATUS_FAILURE;
+            return halStatus;
+        }
+     }
+     return halStatus;
+}
+
+/*==========================================================================
+  FUNCTION    sapGetPrimarySecondaryChannelOfBss()
+
+  DESCRIPTION
+    Get Primary & Seconary Channel of Overlapping BSS
+
+  DEPENDENCIES
+    NA.
+
+  PARAMETERS
+
+    IN
+    tpSirProbeRespBeacon: Pointer to Beacon Struct
+    pri_chan : Primary Operating Channel
+    sec_chan : Seconary Operating Channel
+
+  RETURN VALUE
+
+  SIDE EFFECTS
+============================================================================*/
+
+void sapGetPrimarySecondaryChannelOfBss(tpSirProbeRespBeacon pBeaconStruct,
+                                        v_U32_t *pri_chan, v_U32_t *sec_chan)
+{
+    v_U16_t secondaryChannelOffset;
+    *pri_chan = 0;
+    *sec_chan = 0;
+
+    if (pBeaconStruct->HTInfo.present)
+    {
+        *pri_chan = pBeaconStruct->HTInfo.primaryChannel;
+        secondaryChannelOffset = pBeaconStruct->HTInfo.secondaryChannelOffset;
+        if (PHY_DOUBLE_CHANNEL_LOW_PRIMARY == secondaryChannelOffset)
+            *sec_chan = *pri_chan + 4;
+        else if (PHY_DOUBLE_CHANNEL_HIGH_PRIMARY == secondaryChannelOffset)
+            *sec_chan = *pri_chan - 4;
+    }
+
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+               FL("BSS Primary & Secondary Channel : %d %d "),
+               *pri_chan, *sec_chan);
+}
+
+/*==========================================================================
+  FUNCTION    sapCheckHT40PairIsAllowed()
+
+  DESCRIPTION
+    Check HT40 Channel Pair is Allowed
+
+  DEPENDENCIES
+    NA.
+
+  PARAMETERS
+
+    IN
+    ptSapContext: Pointer to SAP Context
+
+  RETURN VALUE
+    v_U8_t          : Success - HT40 Allowed in Selected Channale Pair
+                      Fail - HT40 Not Allowed
+
+  SIDE EFFECTS
+============================================================================*/
+
+eHalStatus sapCheckHT40PairIsAllowed(ptSapContext psapCtx)
+{
+    v_U8_t count;
+    v_U8_t fValidChannel = 0;
+    eHalStatus halStatus = eHAL_STATUS_SUCCESS;
+
+    /* Verify that HT40 secondary channel is an allowed 20 MHz
+     * channel */
+    for (count = RF_CHAN_1; count <= RF_CHAN_14; count++)
+    {
+        if ((regChannels[count].enabled)
+         && (rfChannels[count].channelNum == psapCtx->sap_sec_chan))
+        {
+            fValidChannel = TRUE;
+            break;
+        }
+    }
+
+    if (!fValidChannel)
+    {
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                   FL("HT40 In Secondary Channel : %d not allowed"),
+                   psapCtx->sap_sec_chan);
+
+        halStatus = eHAL_STATUS_FAILURE;
+        return halStatus;
+    }
+
+    return halStatus;
+}
+
+/*==========================================================================
+  FUNCTION    sapGet24GOBSSAffectedChannel()
+
+  DESCRIPTION
+    Get OBSS Affected Channel Range
+
+  DEPENDENCIES
+    NA.
+
+  PARAMETERS
+
+    IN
+    tHalHandle  : tHalHandle passed in with Affected Channel
+    ptSapContext: Pointer to SAP Context
+
+  RETURN VALUE
+    v_U8_t          : Success - Able to get AffectedChannel
+                      Fail - Fail to get AffectedChannel
+
+  SIDE EFFECTS
+============================================================================*/
+
+eHalStatus sapGet24GOBSSAffectedChannel(tHalHandle halHandle,
+                                          ptSapContext psapCtx)
+{
+
+    v_U8_t cbMode;
+    v_U32_t pri_freq, sec_freq;
+    v_U32_t affected_start_freq, affected_end_freq;
+    eSapPhyMode sapPhyMode;
+    eHalStatus halStatus;
+
+    pri_freq = vos_chan_to_freq(psapCtx->channel);
+
+    sapPhyMode =
+     sapConvertSapPhyModeToCsrPhyMode(psapCtx->csrRoamProfile.phyMode);
+
+    sme_SelectCBMode(halHandle, sapPhyMode, psapCtx->channel);
+
+    cbMode = sme_GetChannelBondingMode24G(halHandle);
+
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+               FL("Selected Channel bonding : %d"), cbMode);
+
+    if (cbMode == eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY)
+        sec_freq = pri_freq - 20;
+    else if (cbMode == eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY)
+        sec_freq = pri_freq + 20;
+    else
+        sec_freq = eCSR_INI_SINGLE_CHANNEL_CENTERED;
+
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+               FL("Primary Freq : %d MHz Secondary Freq : %d MHz"),
+               pri_freq, sec_freq);
+
+    if (sec_freq)
+    {
+        /* As per 802.11 Std, Section 10.15.3.2 */
+        affected_start_freq = (pri_freq + sec_freq) / 2 - 25;
+        affected_end_freq = (pri_freq + sec_freq) / 2 + 25;
+
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                FL("Affected Start Freq: %d MHz Affected End Freq : %d MHz"),
+                affected_start_freq, affected_end_freq);
+
+        psapCtx->affected_start = vos_freq_to_chan(affected_start_freq);
+
+        /* As there is no channel availabe for 2397 & 2402 Frequency
+         * Hence taking valid channel 1 (Freq 2412) here
+         */
+        if (affected_start_freq < 2412)
+            psapCtx->affected_start = 1;
+
+        psapCtx->affected_end = vos_freq_to_chan(affected_end_freq);
+
+        /* As there is no channel availabe for 2477 & 2482 Frequency
+         * Hence taking lower channel 13 (Freq 2472) here.
+         */
+        if ((2477 == (affected_end_freq)) || (2482 == affected_end_freq))
+        {
+            psapCtx->affected_end = 13;
+        }
+        else if (2487 == affected_end_freq)
+        {
+           /* As there is no channel availabe for 2487 Frequency
+            * Hence taking lower channel 14 (Freq 2484) here.
+            */
+            psapCtx->affected_end = 14;
+        }
+
+        psapCtx->sap_sec_chan = vos_freq_to_chan(sec_freq);
+
+        halStatus = eHAL_STATUS_SUCCESS;
+        return halStatus;
+    }
+    else
+    {
+        psapCtx->affected_start = 0;
+        psapCtx->affected_end = 0;
+        psapCtx->sap_sec_chan = 0;
+        halStatus = eHAL_STATUS_FAILURE;
+        return halStatus;
+    }
+}
+
+/*==========================================================================
+  FUNCTION    sapCheck40Mhz24G
+
+  DESCRIPTION
+  Check HT40 is possible in 2.4GHz mode
+
+  DEPENDENCIES
+    NA.
+
+  PARAMETERS
+
+    IN
+    halHandle       : Pointer to HAL handle
+    ptSapContext    : Pointer to SAP Context
+    pResult         : Pointer to tScanResultHandle
+
+  RETURN VALUE
+    v_U8_t          : Success - HT40 Possible, Fail - zero
+
+  SIDE EFFECTS
+============================================================================*/
+
+eHalStatus sapCheck40Mhz24G(tHalHandle halHandle, ptSapContext psapCtx,
+                                         tScanResultHandle pResult)
+{
+    v_U32_t pri_chan, sec_chan;
+    v_U32_t ieLen = 0;
+    v_U8_t channelNumber = 0;
+    tSirProbeRespBeacon *pBeaconStruct;
+    tCsrScanResultInfo *pScanResult;
+    tpAniSirGlobal  pMac = (tpAniSirGlobal) halHandle;
+    eHalStatus halStatus = eHAL_STATUS_FAILURE;
+
+    if ( (0 == psapCtx->affected_start) && (0 == psapCtx->affected_end)
+       && (0 == psapCtx->sap_sec_chan))
+    {
+        if (eHAL_STATUS_SUCCESS !=
+                 sapGet24GOBSSAffectedChannel(halHandle, psapCtx))
+        {
+            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                FL("Failed to get OBSS Affected Channel Range for Channel: %d"),
+                                psapCtx->channel);
+            return halStatus;
+        }
+    }
+
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+               FL("40 MHz affected channel range: [%d,%d] MHz"),
+               psapCtx->affected_start, psapCtx->affected_end);
+
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+               FL("SAP Primary & Secondary Channel : [%d,%d] MHz"),
+               psapCtx->channel, psapCtx->sap_sec_chan);
+
+    pBeaconStruct = vos_mem_malloc(sizeof(tSirProbeRespBeacon));
+    if ( NULL == pBeaconStruct )
+    {
+        VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                   FL("Unable to allocate memory \n"));
+        return halStatus;
+    }
+
+    /* Check neighboring BSSes from scan result to see whether 40 MHz is
+     * allowed per IEEE Std 802.11-2012, 10.15.3.2 */
+    pScanResult = sme_ScanResultGetFirst(halHandle, pResult);
+
+    while (pScanResult)
+    {
+
+        /* if the Beacon has channel ID, use it other wise we will
+         * rely on the channelIdSelf
+         */
+        if(pScanResult->BssDescriptor.channelId == 0)
+            channelNumber = pScanResult->BssDescriptor.channelIdSelf;
+        else
+            channelNumber = pScanResult->BssDescriptor.channelId;
+
+        if (channelNumber > SIR_11B_CHANNEL_END)
+        {
+            VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                   FL("channelNumber: %d BSS: %s"),
+                   channelNumber,  pBeaconStruct->ssId.ssId);
+            goto NextResult;
+        }
+
+        if ((pScanResult->BssDescriptor.ieFields != NULL))
+        {
+            ieLen = (pScanResult->BssDescriptor.length + sizeof(tANI_U16));
+            ieLen += (sizeof(tANI_U32) - sizeof(tSirBssDescription));
+            vos_mem_set((tANI_U8 *) pBeaconStruct,
+                               sizeof(tSirProbeRespBeacon), 0);
+
+            if ((eSIR_SUCCESS == sirParseBeaconIE(pMac, pBeaconStruct,
+                     (tANI_U8 *)( pScanResult->BssDescriptor.ieFields), ieLen)))
+            {
+                /* SAP Operating channel is not same with other BSS Operating
+                 * channel then check for Peer BSS is HT20 or Legacy AP
+                 */
+                if (psapCtx->channel != channelNumber)
+                {
+                    if (eHAL_STATUS_SUCCESS !=
+                          sapCheckFor20MhzObss(channelNumber, pBeaconStruct,
+                                                                    psapCtx))
+                    {
+                        VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                              FL("Overlapping 20 MHz BSS is found"));
+                        vos_mem_free(pBeaconStruct);
+                        return halStatus;
+                    }
+                }
+
+                sapGetPrimarySecondaryChannelOfBss(pBeaconStruct,
+                                                &pri_chan, &sec_chan);
+
+                /* Check peer BSS Operating channel is not within OBSS affected
+                 * channel range
+                 */
+                if ((pri_chan < psapCtx->affected_start
+                    || pri_chan > psapCtx->affected_end)
+                   && (sec_chan < psapCtx->affected_start
+                    || sec_chan > psapCtx->affected_end))
+                {
+                      goto NextResult; /* not within affected channel range */
+                }
+
+                VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                 FL("Neighboring BSS: %s Primary & Secondary Channel [%d %d]"),
+                 pBeaconStruct->ssId.ssId, pri_chan, sec_chan);
+
+                if (sec_chan)
+                {
+                    /* Peer BSS is HT40 capable then check peer BSS
+                     * primary & secondary channel with SAP
+                     * Primary & Secondary channel.
+                     */
+                    if ((psapCtx->channel !=  pri_chan)
+                       || (psapCtx->sap_sec_chan != sec_chan))
+                    {
+                        VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                                  FL("40 MHz Pri/Sec channel : [%d %d]"
+                                  " missmatch with  BSS: %s"
+                                  " Pri/Sec channel : [%d %d]"),
+                                  psapCtx->channel, psapCtx->sap_sec_chan,
+                                  pBeaconStruct->ssId.ssId, pri_chan, sec_chan);
+                         vos_mem_free(pBeaconStruct);
+                         return halStatus;
+                    }
+                }
+                else
+                {
+                    VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                            FL("Channel: %d Overlapping BSS is found"),
+                            pri_chan);
+                    vos_mem_free(pBeaconStruct);
+                    return halStatus;
+                }
+
+                if (pBeaconStruct->HTCaps.present)
+                {
+                    /* Check Peer BSS HT capablity has 40MHz Intolerant bit */
+                    if (pBeaconStruct->HTCaps.stbcControlFrame)
+                    {
+                        VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                                      FL("Found BSS: %s with 40 MHz"
+                                      "Intolerant is set on Channel : %d"),
+                                      pBeaconStruct->ssId.ssId,
+                                      channelNumber);
+                        vos_mem_free(pBeaconStruct);
+                        return halStatus;
+                    }
+                }
+            }
+            else
+            {
+                VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                          FL("Failed to Parse the Beacon IEs"));
+            }
+        }
+        else
+        {
+            VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                       FL("BSS IEs Failed is NULL in Scan"));
+        }
+
+NextResult:
+        pScanResult = sme_ScanResultGetNext(halHandle, pResult);
+    }
+    vos_mem_free(pBeaconStruct);
+
+    if (psapCtx->sap_sec_chan)
+    {
+        if (eHAL_STATUS_SUCCESS == sapCheckHT40PairIsAllowed(psapCtx))
+        {
+            VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                       FL("Start SAP/P2P GO in HT 40MHz "
+                       "Primary & Secondary Channel: [%d %d]"),
+                       psapCtx->channel, psapCtx->sap_sec_chan);
+            halStatus = eHAL_STATUS_SUCCESS;
+            return halStatus;
+        }
+    }
+
+    return halStatus;
+}
+#endif
+
+/*==========================================================================
+  FUNCTION    WLANSAP_ScanCallback()
+
+  DESCRIPTION
+    Callback for Scan (scan results) Events
+
+  DEPENDENCIES
+    NA.
+
+  PARAMETERS
+
+    IN
+    tHalHandle  : tHalHandle passed in with the scan request
+    *pContext   : The second context pass in for the caller (sapContext)
+    scanID      : scanID got after the scan
+    status      : Status of scan -success, failure or abort
+
+  RETURN VALUE
+    The eHalStatus code associated with performing the operation
+
+    eHAL_STATUS_SUCCESS: Success
+
+  SIDE EFFECTS
+============================================================================*/
+eHalStatus
+WLANSAP_ScanCallback
+(
+  tHalHandle halHandle,
+  void *pContext,           /* Opaque SAP handle */
+  v_U32_t scanID,
+  eCsrScanStatus scanStatus
+)
+{
+    tScanResultHandle pResult = NULL;
+    eHalStatus scanGetResultStatus = eHAL_STATUS_FAILURE;
+    ptSapContext psapContext = (ptSapContext)pContext;
+    void *pTempHddCtx;
+    tWLAN_SAPEvent sapEvent; /* State machine event */
+    v_U8_t operChannel = 0;
+    VOS_STATUS sapstatus;
+    v_U32_t event;
+    eSapPhyMode sapPhyMode;
+
+    /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+    pTempHddCtx = vos_get_context( VOS_MODULE_ID_HDD,
+                                     psapContext->pvosGCtx);
+    if (NULL == pTempHddCtx)
+    {
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
+                   "HDD context is NULL");
+        return eHAL_STATUS_FAILURE;
+    }
+
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+         "In %s, before switch on scanStatus = %d", __func__, scanStatus);
+
+    switch (scanStatus)
+    {
+        case eCSR_SCAN_SUCCESS:
+            // sapScanCompleteCallback with eCSR_SCAN_SUCCESS
+            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+               "In %s, CSR scanStatus = %s (%d)", __func__,
+               "eCSR_SCAN_SUCCESS", scanStatus);
+
+            /* Get scan results, Run channel selection algorithm,
+             * select channel and keep in pSapContext->Channel
+             */
+            scanGetResultStatus = sme_ScanGetResult(halHandle, 0, NULL,
+                                                               &pResult);
+
+            event = eSAP_MAC_SCAN_COMPLETE;
+
+            if ((scanGetResultStatus != eHAL_STATUS_SUCCESS)
+               && (scanGetResultStatus != eHAL_STATUS_E_NULL_VALUE))
+            {
+                // No scan results
+                VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                     "In %s, Get scan result failed! ret = %d",
+                                __func__, scanGetResultStatus);
+                sapSetOperatingChannel(psapContext, operChannel);
+                break;
+            }
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+            if (psapContext->channel == AUTO_CHANNEL_SELECT)
+#endif
+            {
+                operChannel = sapSelectChannel(halHandle, psapContext, pResult);
+                sapSetOperatingChannel(psapContext, operChannel);
+            }
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+            if ((psapContext->channel <= SIR_11B_CHANNEL_END)
+               && (psapContext->channel > 0))
+            {
+                if (eHAL_STATUS_SUCCESS !=
+                         sapCheck40Mhz24G(halHandle, psapContext, pResult))
+                {
+                    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                               FL("Starting SAP into HT20"));
+                    /* Disable Channel Bonding for 2.4GHz */
+                    sme_UpdateChannelBondingMode24G(halHandle,
+                                          PHY_SINGLE_CHANNEL_CENTERED);
+                }
+             }
+#endif
+            sme_ScanResultPurge(halHandle, pResult);
+            break;
+
+        default:
+            event = eSAP_CHANNEL_SELECTION_FAILED;
+            if (psapContext->channel == AUTO_CHANNEL_SELECT)
+                sapSetOperatingChannel(psapContext, operChannel);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                            FL("Starting SAP into HT20"));
+            /* Disable Channel Bonding for 2.4GHz */
+            sme_UpdateChannelBondingMode24G(halHandle,
+                                   PHY_SINGLE_CHANNEL_CENTERED);
+#endif
+            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                 FL("CSR scanStatus = %s (%d)"),
+                 "eCSR_SCAN_ABORT/FAILURE", scanStatus);
+    }
+
+
+    sapPhyMode =
+     sapConvertSapPhyModeToCsrPhyMode(psapContext->csrRoamProfile.phyMode);
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+    if (psapContext->channel > SIR_11B_CHANNEL_END)
+#endif
+        sme_SelectCBMode(halHandle, sapPhyMode, psapContext->channel);
+
 #ifdef SOFTAP_CHANNEL_RANGE
     if(psapContext->channelList != NULL)
     {
@@ -257,7 +814,8 @@
     }
 #endif    
 
-    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Channel selected = %d", __func__, psapContext->channel);
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+           "In %s, Channel selected = %d", __func__, psapContext->channel);
 
     /* Fill in the event structure */
     sapEvent.event = event;
diff --git a/CORE/SAP/src/sapChSelect.c b/CORE/SAP/src/sapChSelect.c
index 037ccfa..f7111cd 100644
--- a/CORE/SAP/src/sapChSelect.c
+++ b/CORE/SAP/src/sapChSelect.c
@@ -2125,9 +2125,11 @@
     v_U32_t cbMode;
     eChannelWidthInfo chWidth = CHWIDTH_HT20;
 
+#ifdef WLAN_FEATURE_AP_HT40_24G
     if (eSAP_RF_SUBBAND_2_4_GHZ == operatingBand)
         cbMode = sme_GetChannelBondingMode24G(halHandle);
     else
+#endif
         cbMode = sme_GetChannelBondingMode5G(halHandle);
 
     if (phyMode == eSAP_DOT11_MODE_11n ||
diff --git a/CORE/SAP/src/sapFsm.c b/CORE/SAP/src/sapFsm.c
index 403cc2a..1a14950 100644
--- a/CORE/SAP/src/sapFsm.c
+++ b/CORE/SAP/src/sapFsm.c
@@ -65,6 +65,9 @@
  * Include Files
  * -------------------------------------------------------------------------*/
 #include "sapInternal.h"
+#ifdef WLAN_FEATURE_AP_HT40_24G
+#include "csrInsideApi.h"
+#endif
 // Pick up the SME API definitions
 #include "sme_Api.h"
 // Pick up the PMC API definitions
@@ -100,6 +103,13 @@
 static VOS_STATUS sapGetChannelList(ptSapContext sapContext, v_U8_t **channelList,
                                  v_U8_t  *numberOfChannels);
 #endif
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+static VOS_STATUS sapGetChannelListForObss(tHalHandle halHandle,
+                       ptSapContext psapCtx, v_U8_t **channelList,
+                       v_U8_t *numberOfChannels);
+#endif
+
 /*----------------------------------------------------------------------------
  * Externalized Function Definitions
 * -------------------------------------------------------------------------*/
@@ -170,6 +180,7 @@
     tCsrScanRequest scanRequest;/* To be initialised if scan is required */
     v_U32_t    scanRequestID = 0;
     VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+    eSapPhyMode sapPhyMode;
 
 #ifdef SOFTAP_CHANNEL_RANGE
     v_U8_t     *channelList = NULL;
@@ -187,6 +198,9 @@
         return VOS_STATUS_E_FAULT;
     }
 
+    sapPhyMode =
+      sapConvertSapPhyModeToCsrPhyMode(sapContext->csrRoamProfile.phyMode);
+
     /*If STA-AP concurrency is enabled take the concurrent connected channel first. In other cases wpa_supplicant should take care */
     if (vos_get_concurrency_mode() == VOS_STA_SAP)
     {
@@ -196,9 +210,10 @@
         { /*if a valid channel is returned then use concurrent channel.
                   Else take whatever comes from configuartion*/
             sapContext->channel = channel;
-            sme_SelectCBMode(hHal,
-                             sapConvertSapPhyModeToCsrPhyMode(sapContext->csrRoamProfile.phyMode),
-                             channel);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+            if (sapContext->channel > SIR_11B_CHANNEL_END)
+#endif
+                sme_SelectCBMode(hHal, sapPhyMode, sapContext->channel);
         }
     }
 
@@ -242,7 +257,8 @@
 #endif
         /* Set requestType to Full scan */
 
-        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, calling sme_ScanRequest", __func__);
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+                   FL("Auto Channel Selection Scan"));
 
         halStatus = sme_ScanRequest(hHal,
                             0,//Not used in csrScanRequest
@@ -252,8 +268,11 @@
                             sapContext);//void * pContext scanRequestID filled up
         if (eHAL_STATUS_SUCCESS != halStatus)
         {
-            VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "%s:sme_ScanRequest  fail %d!!!", __func__, halStatus);
-            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "SoftAP Configuring for default channel, Ch= %d", sapContext->channel);
+            VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                  FL("Auto Channel Selection Scan  fail %d!!!"), halStatus);
+            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+                  FL("SoftAP Configuring for default channel, Ch= %d"),
+                  sapContext->channel);
             /* In case of error, switch to default channel */
             sapContext->channel = SAP_DEFAULT_CHANNEL;
 
@@ -272,24 +291,135 @@
         }
         else
         {
-            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, return from sme_ScanRequest, scanRequestID=%d, Ch= %d",
-                   __func__, scanRequestID, sapContext->channel);
+            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+                  FL("Auto Channel Selection Scan Success"
+                     " scanRequestID=%d, Ch= %d"),
+                     scanRequestID, sapContext->channel);
         }
 
     }
     else
     {
-        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, for configured channel, Ch= %d", __func__, sapContext->channel);
-        /* Fill in the event structure */
-        // Eventhough scan was not done, means a user set channel was chosen
-        sapEventInit(sapEvent);
-        /* Handle event */
-        vosStatus = sapFsm(sapContext, sapEvent);
-    }
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+            FL("For configured channel, Ch= %d"), sapContext->channel);
 
-    /* If scan failed, get default channel and advance state machine as success with default channel */
-    /* Have to wait for the call back to be called to get the channel cannot advance state machine here as said above */
-    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before exiting sapGotoChannelSel channel=%d", __func__, sapContext->channel);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+        if (vos_get_concurrency_mode() != VOS_STA_SAP)
+        {
+            if ((sapContext->channel <= SIR_11B_CHANNEL_END)
+              && (sapContext->channel > RF_CHAN_1))
+            {
+                // OBSS Scan for P2P GO/SAP where Auto Channel Selection is Disable
+                vosStatus = sapGetChannelListForObss(hHal, sapContext,
+                                                &channelList, &numOfChannels);
+                if (VOS_STATUS_SUCCESS == vosStatus && channelList != NULL)
+                {
+                    vos_mem_zero(&scanRequest, sizeof(scanRequest));
+
+                    /* Set scanType to Passive scan */
+                    scanRequest.scanType = eSIR_PASSIVE_SCAN;
+
+                    /* Set min and max channel time to zero */
+                    scanRequest.minChnTime = CSR_ACTIVE_MIN_CHANNEL_TIME;
+                    scanRequest.maxChnTime = CSR_ACTIVE_MAX_CHANNEL_TIME;
+
+                    /* Set BSSType to default type */
+                    scanRequest.BSSType = eCSR_BSS_TYPE_ANY;
+
+                    /*Scan the channels in the list*/
+                    scanRequest.ChannelInfo.numOfChannels = numOfChannels;
+                    scanRequest.ChannelInfo.ChannelList = channelList;
+                    scanRequest.requestType = eCSR_SCAN_SOFTAP_CHANNEL_RANGE;
+                    sapContext->channelList = channelList;
+
+                    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                         FL("OBSS Scan for SAP/P2P GO:  Ch= %d"),
+                         sapContext->channel);
+
+                    halStatus = sme_ScanRequest(hHal,
+                                    0,//Not used in csrScanRequest
+                                    &scanRequest,
+                                    &scanRequestID,//, when ID == 0 11D scan/active scan with callback, min-maxChntime set in csrScanRequest()?
+                                    &WLANSAP_ScanCallback,//csrScanCompleteCallback callback,
+                                    sapContext);//void * pContext scanRequestID filled up
+
+                    if (eHAL_STATUS_SUCCESS != halStatus)
+                    {
+                        VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                                  FL("OBSS ScanRequest Fail %d!!!"),
+                                  halStatus);
+                        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                           FL("SoftAP Configuring for default channel, Ch= %d"),
+                           sapContext->channel);
+
+                        if(sapContext->channelList != NULL)
+                        {
+                           vos_mem_free(sapContext->channelList);
+                           sapContext->channelList = NULL;
+                        }
+                        goto disable24GChannelBonding;
+                    }
+                    else
+                    {
+                       VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                          FL("OBSS ScanRequest Success, scanRequestID=%d"
+                          " Ch= %d"), scanRequestID, sapContext->channel);
+                        goto startgo;
+                    }
+                }
+                else
+                {
+                    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                      FL("Failed to Prepare the OBSS Scan channel list"));
+                    goto disable24GChannelBonding;
+                }
+disable24GChannelBonding:
+                VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                  FL("Disable Channel Bonding"));
+                /* Disable Channel Bonding for 2.4GHz */
+                sme_UpdateChannelBondingMode24G(hHal,
+                                 PHY_SINGLE_CHANNEL_CENTERED);
+            }
+            else
+            {
+               VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                      FL("No concurrency & Channel: %d"),
+                      sapContext->channel);
+               goto selectChannelBonding;
+            }
+        }
+        else
+        {
+            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                  FL("With concurrency & Channel: %d"),
+                  sapContext->channel);
+            goto selectChannelBonding;
+        }
+#endif
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+selectChannelBonding:
+            if (sapContext->channel > SIR_11B_CHANNEL_END)
+#endif
+                sme_SelectCBMode(hHal, sapPhyMode, sapContext->channel);
+
+            /* Fill in the event structure */
+            // Eventhough scan was not done, means a user set channel was chosen
+            sapEventInit(sapEvent);
+            /* Handle event */
+            vosStatus = sapFsm(sapContext, sapEvent);
+    }
+#ifdef WLAN_FEATURE_AP_HT40_24G
+startgo:
+#endif
+    /* If scan failed, get default channel and advance state
+     * machine as success with default channel. Have to wait
+     * for the call back to be called to get the channel cannot
+     * advance state machine here as said above */
+
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
+        FL("Before exiting sapGotoChannelSel channel=%d"),
+        sapContext->channel);
 
     return VOS_STATUS_SUCCESS;
 }// sapGotoChannelSel
@@ -874,6 +1004,22 @@
                  sapContext->sapsMachine = eSAP_DISCONNECTED;
                  vosStatus = sapSignalHDDevent( sapContext, NULL, eSAP_START_BSS_EVENT, (v_PVOID_t)eSAP_STATUS_FAILURE);
                  vosStatus = sapGotoDisconnected(sapContext);
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+                 /* Reset the OBSS Affected Channel Range */
+                 if ( (0 != sapContext->affected_start)
+                   && (0 != sapContext->affected_end)
+                   && (0 != sapContext->sap_sec_chan) )
+                 {
+                     sapContext->affected_start = 0;
+                     sapContext->affected_end = 0;
+                     sapContext->sap_sec_chan = 0;
+                     VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                         FL("Reset the OBSS Affected Channel Range [%d %d]"),
+                         sapContext->affected_start, sapContext->affected_end);
+
+                 }
+#endif
                  /* Close the SME session*/
 
                  if (eSAP_TRUE == sapContext->isSapSessionOpen)
@@ -910,6 +1056,20 @@
                            __func__, "eSAP_STARTED", "eSAP_DISCONNECTING");
                 sapContext->sapsMachine = eSAP_DISCONNECTING;
                 vosStatus = sapGotoDisconnecting(sapContext);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+                /* Reset the OBSS Affected Channel Range */
+                if ( (0 != sapContext->affected_start)
+                  && (0 != sapContext->affected_end)
+                  && (0 != sapContext->sap_sec_chan) )
+                {
+                    sapContext->affected_start = 0;
+                    sapContext->affected_end = 0;
+                    sapContext->sap_sec_chan = 0;
+                    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                         FL("Reset the OBSS Affected Channel Range [%d %d]"),
+                         sapContext->affected_start, sapContext->affected_end);
+                }
+#endif
             }
             else
             {
@@ -1538,3 +1698,73 @@
     return VOS_STATUS_SUCCESS;
 }
 #endif
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+static VOS_STATUS sapGetChannelListForObss(tHalHandle halHandle,
+                            ptSapContext psapCtx, v_U8_t **channelList,
+                            v_U8_t *numberOfChannels)
+{
+    v_U32_t startChannelNum;
+    v_U32_t endChannelNum;
+    v_U8_t  loopCount;
+    v_U8_t channelCount;
+    v_U8_t *list;
+
+    if (eHAL_STATUS_SUCCESS != sapGet24GOBSSAffectedChannel(halHandle, psapCtx))
+    {
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                   "%s:Not able to Get Affected Channel Range for Channel : %d",
+                    __func__, psapCtx->channel);
+        return VOS_STATUS_E_FAILURE;
+    }
+
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+               "%s: 40 MHz affected channel range: [%d,%d] MHz",
+                    __func__, psapCtx->affected_start, psapCtx->affected_end);
+
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+               "%s: SAP Primary & Secondary Channel : [%d,%d] MHz",
+                    __func__, psapCtx->channel, psapCtx->sap_sec_chan);
+
+    /* Allocate the max number of channel supported */
+    list = (v_U8_t *)vos_mem_malloc(RF_CHAN_14 + 1);
+    if (NULL == list)
+    {
+        VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
+                   "%s: Unable to allocate channel list", __func__);
+        *numberOfChannels = 0;
+        *channelList = NULL;
+        return VOS_STATUS_E_RESOURCES;
+    }
+
+    /*Search for the Active channels in the given range */
+    channelCount = 0;
+    startChannelNum = RF_CHAN_1;
+    endChannelNum = RF_CHAN_14;
+    for( loopCount = startChannelNum; loopCount <= endChannelNum; loopCount++ )
+    {
+        if ((rfChannels[loopCount].channelNum >= psapCtx->affected_start)
+           && (rfChannels[loopCount].channelNum <= psapCtx->affected_end))
+        {
+            VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+               "%s: Channel Number: %d State : %d", __func__,
+               rfChannels[loopCount].channelNum,
+            vos_nv_getChannelEnabledState(rfChannels[loopCount].channelNum));
+            list[channelCount] = rfChannels[loopCount].channelNum;
+            channelCount++;
+        }
+    }
+     /* return the channel list and number of channels to scan*/
+    *numberOfChannels = channelCount;
+    if(channelCount != 0)
+    {
+       *channelList = list;
+    }
+    else
+    {
+       *channelList = NULL;
+        vos_mem_free(list);
+    }
+    return VOS_STATUS_SUCCESS;
+}
+#endif
diff --git a/CORE/SAP/src/sapInternal.h b/CORE/SAP/src/sapInternal.h
index efae8cf..b25c9cb 100644
--- a/CORE/SAP/src/sapInternal.h
+++ b/CORE/SAP/src/sapInternal.h
@@ -260,6 +260,11 @@
     tSapAcsChannelInfo acsBestChannelInfo;
     spinlock_t staInfo_lock; //To protect access to station Info
     hdd_station_info_t aStaInfo[WLAN_MAX_STA_COUNT];
+#ifdef WLAN_FEATURE_AP_HT40_24G
+    v_U8_t            affected_start;
+    v_U8_t            affected_end;
+    v_U8_t            sap_sec_chan;
+#endif
 } *ptSapContext;
 
 
@@ -283,6 +288,32 @@
 /*----------------------------------------------------------------------------
  * Function Declarations and Documentation
  * -------------------------------------------------------------------------*/
+#ifdef WLAN_FEATURE_AP_HT40_24G
+/*==========================================================================
+
+  FUNCTION    sapGet24GOBSSAffectedChannel()
+
+  DESCRIPTION
+    Get OBSS Affected Channel no for SAP
+
+  DEPENDENCIES
+    NA.
+
+  PARAMETERS
+
+    IN
+    tHalHandle:  the tHalHandle passed in with the scan request
+    ptSapContext: Pointer to SAP context
+
+  RETURN VALUE
+
+  SIDE EFFECTS
+
+============================================================================*/
+
+eHalStatus sapGet24GOBSSAffectedChannel(tHalHandle halHandle,
+                                                ptSapContext psapCtx);
+#endif
 
 /*==========================================================================
 
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 165ad30..728b8a1 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -198,6 +198,23 @@
     eCSR_SCAN_ABORT_DUE_TO_BAND_CHANGE, //Scan aborted due to band change
 }eCsrAbortReason;
 
+typedef enum
+{
+   eCSR_INI_SINGLE_CHANNEL_CENTERED = 0,
+   eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY,
+   eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY,
+#ifdef WLAN_FEATURE_11AC
+   eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED,
+   eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED,
+   eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED,
+   eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW,
+   eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW,
+   eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH,
+   eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH,
+#endif
+   eCSR_INI_CHANNEL_BONDING_STATE_MAX
+}eIniChanBondState;
+
 #define CSR_SCAN_TIME_DEFAULT       0
 #define CSR_VALUE_IGNORED           0xFFFFFFFF
 #define CSR_RSN_PMKID_SIZE          16
@@ -1156,6 +1173,10 @@
     tANI_BOOLEAN sendDeauthBeforeCon;
 
     eCsrBand  scanBandPreference;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+    tANI_BOOLEAN apHT40_24GEnabled;
+    tANI_U32 channelBondingAPMode24GHz; // Use for SAP/P2P GO 2.4GHz channel Bonding
+#endif
 }tCsrConfigParam;
 
 //Tush
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index cd60bad..c2064d5 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -671,6 +671,10 @@
     tANI_U8 allowDFSChannelRoam;
     tANI_BOOLEAN initialScanSkipDFSCh;
     tANI_BOOLEAN sendDeauthBeforeCon;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+    tANI_BOOLEAN apHT40_24GEnabled;
+    tANI_U32 channelBondingAPMode24GHz; // Use for SAP/P2P GO 2.4GHz channel Bonding
+#endif
 }tCsrConfig;
 
 typedef struct tagCsrChannelPowerInfo
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 2e2d6b5..9e5e058 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3472,6 +3472,10 @@
 
 tANI_U32 sme_GetChannelBondingMode5G(tHalHandle hHal);
 tANI_U32 sme_GetChannelBondingMode24G(tHalHandle hHal);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+void sme_UpdateChannelBondingMode24G(tHalHandle hHal,
+                                      tANI_U8 cbMode);
+#endif
 
 void sme_disable_dfs_channel(tHalHandle hHal, bool disable_dfs);
 
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 0381792..839ab2a 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -1518,45 +1518,46 @@
    ePhyChanBondState phyCbState;
    switch (cbIniValue) {
       // secondary none
-      case 0:
+      case eCSR_INI_SINGLE_CHANNEL_CENTERED:
         phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
         break;
       // secondary LOW
-      case 1:
+      case eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY:
         phyCbState = PHY_DOUBLE_CHANNEL_HIGH_PRIMARY;
         break;
       // secondary HIGH
-      case 2:
+      case eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY:
         phyCbState = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
         break;
 #ifdef WLAN_FEATURE_11AC
-      case 3:
-        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED; 
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
+        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
         break;
-      case 4:
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
         phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
         break;
-      case 5:
-        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
-        break; 
-      case 6:
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
+        phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
+        break;
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
         phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
         break;
-      case 7:
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
         phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
-        break; 
-      case 8:
+        break;
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
         phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
         break;
-      case 9:
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
         phyCbState = PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
-        break; 
-#endif 
+        break;
+#endif
       default:
         // If an invalid value is passed, disable CHANNEL BONDING
         phyCbState = PHY_SINGLE_CHANNEL_CENTERED;
         break;
    }
+
    return phyCbState;
 }
 
@@ -1567,44 +1568,45 @@
    switch (phyCbState) {
       // secondary none
       case PHY_SINGLE_CHANNEL_CENTERED:
-        cbIniValue = 0;
+        cbIniValue = eCSR_INI_SINGLE_CHANNEL_CENTERED;
         break;
       // secondary LOW
       case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
-        cbIniValue = 1;
+        cbIniValue = eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
         break;
       // secondary HIGH
       case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
-        cbIniValue = 2;
+        cbIniValue = eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
         break;
 #ifdef WLAN_FEATURE_11AC
       case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED:
-        cbIniValue = 3;
+        cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED;
         break;
       case PHY_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED:
-        cbIniValue = 4;
+        cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_CENTERED_40MHZ_CENTERED;
         break;
       case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED:
-        cbIniValue = 5;
+        cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_CENTERED;
         break;
       case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
-        cbIniValue = 6;
+        cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
         break;
       case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
-        cbIniValue = 7;
+        cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
         break;
       case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
-        cbIniValue = 8;
+        cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
         break;
       case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
-        cbIniValue = 9;
+        cbIniValue = eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
         break;
 #endif
       default:
         // return some invalid value
-        cbIniValue = 10;
+        cbIniValue = eCSR_INI_CHANNEL_BONDING_STATE_MAX;
         break;
    }
+
    return cbIniValue;
 }
 
@@ -1637,6 +1639,9 @@
         {
             smsLog( pMac, LOGW, "Invalid CB value from ini in 5GHz band %d, CB DISABLED", pParam->channelBondingMode5GHz);
         }
+#ifdef WLAN_FEATURE_AP_HT40_24G
+        pMac->roam.configParam.channelBondingAPMode24GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingAPMode24GHz);
+#endif
         pMac->roam.configParam.channelBondingMode5GHz = csrConvertCBIniValueToPhyCBState(pParam->channelBondingMode5GHz);
         pMac->roam.configParam.RTSThreshold = pParam->RTSThreshold;
         pMac->roam.configParam.phyMode = pParam->phyMode;
@@ -1886,6 +1891,10 @@
                                pParam->isCoalesingInIBSSAllowed;
         pMac->roam.configParam.allowDFSChannelRoam = pParam->allowDFSChannelRoam;
         pMac->roam.configParam.sendDeauthBeforeCon = pParam->sendDeauthBeforeCon;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+        pMac->roam.configParam.apHT40_24GEnabled = pParam->apHT40_24GEnabled;
+#endif
+
     }
     
     return status;
@@ -1903,6 +1912,9 @@
         pParam->Is11dSupportEnabledOriginal = pMac->roam.configParam.Is11dSupportEnabledOriginal;
         pParam->Is11hSupportEnabled = pMac->roam.configParam.Is11hSupportEnabled;
         pParam->channelBondingMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode24GHz);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+        pParam->channelBondingAPMode24GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingAPMode24GHz);
+#endif
         pParam->channelBondingMode5GHz = csrConvertPhyCBStateToIniValue(pMac->roam.configParam.channelBondingMode5GHz);
         pParam->RTSThreshold = pMac->roam.configParam.RTSThreshold;
         pParam->phyMode = pMac->roam.configParam.phyMode;
@@ -2028,6 +2040,9 @@
                                     pMac->roam.configParam.allowDFSChannelRoam;
         pParam->sendDeauthBeforeCon = pMac->roam.configParam.sendDeauthBeforeCon;
         csrSetChannels(pMac, pParam);
+#ifdef WLAN_FEATURE_AP_HT40_24G
+        pParam->apHT40_24GEnabled = pMac->roam.configParam.apHT40_24GEnabled;
+#endif
 
         status = eHAL_STATUS_SUCCESS;
     }
@@ -12015,10 +12030,14 @@
         {
             if(CSR_IS_CHANNEL_24GHZ(Channel) )
             {
-                /* TODO- SAP: HT40 Support in SAP 2.4Ghz mode is not enabled.
-                    so channel bonding in 2.4Ghz is configured as 20MHZ
-                    irrespective of the 'channelBondingMode24GHz' Parameter */
+#ifdef WLAN_FEATURE_AP_HT40_24G
+                if (CSR_IS_INFRA_AP(pProfile))
+                    cbMode = pMac->roam.configParam.channelBondingAPMode24GHz;
+                else
+                    cbMode = PHY_SINGLE_CHANNEL_CENTERED;
+#else
                 cbMode = PHY_SINGLE_CHANNEL_CENTERED;
+#endif
             }
             else
             {
@@ -14206,6 +14225,9 @@
                          pParam->extendedRateSet.numRates);
             pBuf += pParam->extendedRateSet.numRates;
         }
+#ifdef WLAN_FEATURE_AP_HT40_24G
+        *pBuf++ = (tANI_U8)pMac->roam.configParam.apHT40_24GEnabled;
+#endif
 
         msgLen = (tANI_U16)(sizeof(tANI_U32 ) + (pBuf - wTmpBuf)); //msg_header + msg
         pMsg->length = pal_cpu_to_be16(msgLen);
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index ca03f57..33ab1c1 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -2968,6 +2968,7 @@
     return smeConfig.csrConfig.channelBondingMode5GHz;
 }
 
+#ifdef WLAN_FEATURE_AP_HT40_24G
 /* ---------------------------------------------------------------------------
     \fn sme_GetChannelBondingMode24G
     \brief get the channel bonding mode for 2.4G band
@@ -2981,9 +2982,35 @@
 
     sme_GetConfigParam(pMac, &smeConfig);
 
-    return smeConfig.csrConfig.channelBondingMode24GHz;
+    return smeConfig.csrConfig.channelBondingAPMode24GHz;
 }
 
+/* ---------------------------------------------------------------------------
+    \fn sme_UpdateChannelBondingMode24G
+    \brief update the channel bonding mode for 2.4G band
+    \param hHal - HAL handle
+    \param cbMode - channel bonding mode
+    \return
+  ---------------------------------------------------------------------------*/
+void sme_UpdateChannelBondingMode24G(tHalHandle hHal, tANI_U8 cbMode)
+{
+    tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+    tSmeConfigParams  smeConfig;
+
+    vos_mem_zero(&smeConfig, sizeof (tSmeConfigParams));
+    sme_GetConfigParam(pMac, &smeConfig);
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                   FL("Previous Channel Bonding : = %d"),
+                   smeConfig.csrConfig.channelBondingAPMode24GHz);
+
+    smeConfig.csrConfig.channelBondingAPMode24GHz = cbMode;
+    sme_UpdateConfig(hHal, &smeConfig);
+    VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
+                   FL("New Channel Bonding : = %d"),
+                   sme_GetChannelBondingMode24G(hHal));
+    return;
+}
+#endif
 
 /* ---------------------------------------------------------------------------
     \fn sme_RoamConnect
@@ -10251,6 +10278,36 @@
 }
 
 /*
+ * SME API to stringify bonding mode. (hostapd convention)
+ */
+
+static const char* sme_CBMode2String( tANI_U32 mode)
+{
+   switch (mode)
+   {
+      case eCSR_INI_SINGLE_CHANNEL_CENTERED:
+         return "HT20";
+      case eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY:
+         return "HT40-"; /* lower secondary channel */
+      case eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY:
+         return "HT40+"; /* upper secondary channel */
+#ifdef WLAN_FEATURE_11AC
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
+         return "VHT80+40+"; /* upper secondary channels */
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
+         return "VHT80+40-"; /* 1 lower and 2 upper secondary channels */
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
+         return "VHT80-40+"; /* 2 lower and 1 upper secondary channels */
+      case eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
+         return "VHT80-40-"; /* lower secondary channels */
+#endif
+      default:
+         VOS_ASSERT(0);
+         return "Unknown";
+   }
+}
+
+/*
  * SME API to determine the channel bonding mode
  */
 VOS_STATUS sme_SelectCBMode(tHalHandle hHal, eCsrPhyMode eCsrPhyMode, tANI_U8 channel)
@@ -10275,8 +10332,15 @@
       return VOS_STATUS_SUCCESS;
    }
 
+   sme_GetConfigParam(pMac, &smeConfig);
+
    /* If channel bonding mode is not required */
+#ifdef WLAN_FEATURE_AP_HT40_24G
+   if ( !pMac->roam.configParam.channelBondingMode5GHz
+      && !smeConfig.csrConfig.apHT40_24GEnabled ) {
+#else
    if ( !pMac->roam.configParam.channelBondingMode5GHz ) {
+#endif
       return VOS_STATUS_SUCCESS;
    }
 
@@ -10291,30 +10355,46 @@
             channel == 116 || channel == 149 )
       {
          smeConfig.csrConfig.channelBondingMode5GHz =
-            PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW - 1;
+            eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW;
       }
       else if ( channel == 40 || channel == 56 || channel == 104 ||
             channel == 120 || channel == 153 )
       {
          smeConfig.csrConfig.channelBondingMode5GHz =
-            PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW - 1;
+            eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW;
       }
       else if ( channel == 44 || channel == 60 || channel == 108 ||
             channel == 124 || channel == 157 )
       {
          smeConfig.csrConfig.channelBondingMode5GHz =
-            PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH -1;
+            eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH;
       }
       else if ( channel == 48 || channel == 64 || channel == 112 ||
             channel == 128 || channel == 144 || channel == 161 )
       {
          smeConfig.csrConfig.channelBondingMode5GHz =
-            PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH - 1;
+            eCSR_INI_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH;
       }
       else if ( channel == 165 )
       {
-         smeConfig.csrConfig.channelBondingMode5GHz = 0;
+         smeConfig.csrConfig.channelBondingMode5GHz =
+            eCSR_INI_SINGLE_CHANNEL_CENTERED;
       }
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+      if (smeConfig.csrConfig.apHT40_24GEnabled)
+      {
+          if (channel >= 1 && channel <= 7)
+             smeConfig.csrConfig.channelBondingAPMode24GHz =
+                eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
+          else if (channel >= 8 && channel <= 13)
+             smeConfig.csrConfig.channelBondingAPMode24GHz =
+                eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
+          else if (channel ==14)
+             smeConfig.csrConfig.channelBondingAPMode24GHz =
+                eCSR_INI_SINGLE_CHANNEL_CENTERED;
+      }
+#endif
    }
 #endif
 
@@ -10326,19 +10406,37 @@
             channel == 120 || channel == 128 || channel == 136 ||
             channel == 144 || channel == 153 || channel == 161 )
       {
-         smeConfig.csrConfig.channelBondingMode5GHz = 1;
+         smeConfig.csrConfig.channelBondingMode5GHz =
+                eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
       }
       else if ( channel== 36 || channel == 44 || channel == 52 ||
             channel == 60 || channel == 100 || channel == 108 ||
             channel == 116 || channel == 124 || channel == 132 ||
             channel == 140 || channel == 149 || channel == 157 )
       {
-         smeConfig.csrConfig.channelBondingMode5GHz = 2;
+         smeConfig.csrConfig.channelBondingMode5GHz =
+                eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
       }
       else if ( channel == 165 )
       {
-         smeConfig.csrConfig.channelBondingMode5GHz = 0;
+         smeConfig.csrConfig.channelBondingMode5GHz =
+                eCSR_INI_SINGLE_CHANNEL_CENTERED;
       }
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+      if (smeConfig.csrConfig.apHT40_24GEnabled)
+      {
+          if (channel >= 1 && channel <= 7)
+             smeConfig.csrConfig.channelBondingAPMode24GHz =
+                eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
+          else if (channel >= 8 && channel <= 13)
+             smeConfig.csrConfig.channelBondingAPMode24GHz =
+                eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
+          else if (channel ==14)
+             smeConfig.csrConfig.channelBondingAPMode24GHz =
+                eCSR_INI_SINGLE_CHANNEL_CENTERED;
+      }
+#endif
    }
 
    /*
@@ -10352,10 +10450,27 @@
          eCSR_DOT11_MODE_abg == eCsrPhyMode)
    {
       smeConfig.csrConfig.channelBondingMode5GHz = 0;
+#ifdef WLAN_FEATURE_AP_HT40_24G
+   } else if ( eCSR_DOT11_MODE_11g_ONLY == eCsrPhyMode)
+      smeConfig.csrConfig.channelBondingAPMode24GHz =
+         eCSR_INI_SINGLE_CHANNEL_CENTERED;
+#else
    }
+#endif
 
+#ifdef WLAN_FEATURE_AP_HT40_24G
+   VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+         FL("%s cbmode selected=%d bonding mode:%s"),
+         (channel <= 14) ? "2G" : "5G",
+         (channel <= 14) ? smeConfig.csrConfig.channelBondingAPMode24GHz :
+                        smeConfig.csrConfig.channelBondingMode5GHz,
+         (channel <= 14) ?
+         sme_CBMode2String(smeConfig.csrConfig.channelBondingAPMode24GHz) :
+         sme_CBMode2String(smeConfig.csrConfig.channelBondingMode5GHz));
+#else
    VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_WARN,
-         "cbmode selected=%d", smeConfig.csrConfig.channelBondingMode5GHz);
+       "cbmode selected=%d", smeConfig.csrConfig.channelBondingMode5GHz);
+#endif
 
    sme_UpdateConfig (pMac, &smeConfig);
    return VOS_STATUS_SUCCESS;
diff --git a/CORE/SYS/legacy/src/utils/src/parserApi.c b/CORE/SYS/legacy/src/utils/src/parserApi.c
index ed5a726..daaabf3 100644
--- a/CORE/SYS/legacy/src/utils/src/parserApi.c
+++ b/CORE/SYS/legacy/src/utils/src/parserApi.c
@@ -961,6 +961,39 @@
     return eSIR_SUCCESS;
 }
 
+#ifdef WLAN_FEATURE_AP_HT40_24G
+tSirRetStatus
+PopulateDot11fOBSSScanParameters(tpAniSirGlobal pMac,
+                                 tDot11fIEOBSSScanParameters *pDot11f,
+                                 tpPESession psessionEntry)
+{
+    pDot11f->present = 1;
+
+    pDot11f->obssScanPassiveDwell =
+          psessionEntry->obssHT40ScanParam.OBSSScanPassiveDwellTime;
+
+    pDot11f->obssScanActiveDwell =
+          psessionEntry->obssHT40ScanParam.OBSSScanActiveDwellTime;
+
+    pDot11f->bssChannelWidthTriggerScanInterval =
+          psessionEntry->obssHT40ScanParam.BSSChannelWidthTriggerScanInterval;
+
+    pDot11f->obssScanPassiveTotalPerChannel =
+          psessionEntry->obssHT40ScanParam.OBSSScanPassiveTotalPerChannel;
+
+    pDot11f->obssScanActiveTotalPerChannel =
+          psessionEntry->obssHT40ScanParam.OBSSScanActiveTotalPerChannel;
+
+    pDot11f->bssWidthChannelTransitionDelayFactor =
+          psessionEntry->obssHT40ScanParam.BSSWidthChannelTransitionDelayFactor;
+
+    pDot11f->obssScanActivityThreshold =
+          psessionEntry->obssHT40ScanParam.OBSSScanActivityThreshold;
+
+    return eSIR_SUCCESS;
+}
+#endif
+
 tSirRetStatus
 PopulateDot11fExtCap(tpAniSirGlobal      pMac,
                            tDot11fIEExtCap  *pDot11f,
@@ -983,7 +1016,12 @@
                          eSIR_SUCCESS)
             PELOGE(limLog(pMac, LOGE, FL("could not retrieve "
                                          "24G Chan bond Length \n"));)
+
+#ifdef WLAN_FEATURE_AP_HT40_24G
+       if (TRUE == val || pMac->roam.configParam.apHT40_24GEnabled)
+#else
        if (TRUE == val)
+#endif
        {
            pDot11f->bssCoexistMgmtSupport = 1;
            pDot11f->present = 1;