diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 5f2e329..48eb155 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -1226,6 +1226,101 @@
          
 }
 
+/* 
+ * FUNCTION: wlan_hdd_select_cbmode
+ * called by wlan_hdd_cfg80211_start_bss() and
+ * This function  selects the cbmode based on primary channel
+ */ 
+static VOS_STATUS wlan_hdd_select_cbmode(hdd_adapter_t *pAdapter,tsap_Config_t *pSapConfig )
+{
+    tSmeConfigParams smeConfig;
+    hdd_context_t  *pHddCtx  = ( hdd_context_t *) pAdapter->pHddCtx;
+    hdd_config_t  *pConfigIni = ((hdd_context_t *)(pAdapter->pHddCtx))->cfg_ini;
+    v_U8_t         channel;
+
+    if(
+#ifdef WLAN_FEATURE_11AC
+      pSapConfig->SapHw_mode != eSAP_DOT11_MODE_11ac &&
+      pSapConfig->SapHw_mode != eSAP_DOT11_MODE_11ac_ONLY &&
+#endif
+      pSapConfig->SapHw_mode != eSAP_DOT11_MODE_11n &&
+      pSapConfig->SapHw_mode != eSAP_DOT11_MODE_11n_ONLY 
+      )
+    {
+        return VOS_STATUS_SUCCESS;
+    }
+
+    if (!pConfigIni->nChannelBondingMode5GHz) {
+        return VOS_STATUS_SUCCESS;
+    }
+
+    channel = pSapConfig->channel;
+    vos_mem_zero(&smeConfig, sizeof (tSmeConfigParams));
+
+    sme_GetConfigParam(pHddCtx->hHal, &smeConfig);
+
+#ifdef WLAN_FEATURE_11AC
+
+    if ( pSapConfig->SapHw_mode == eSAP_DOT11_MODE_11ac || 
+         pSapConfig->SapHw_mode == eSAP_DOT11_MODE_11ac_ONLY )
+    {
+        if ( channel== 36 || channel == 52 || channel == 100 ||
+             channel == 116 || channel == 149 )
+        {
+           smeConfig.csrConfig.channelBondingMode5GHz = 
+                     PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW - 1;
+        }
+        else if ( channel == 40 || channel == 56 || channel == 104 ||
+             channel == 120 || channel == 153 )
+        {
+           smeConfig.csrConfig.channelBondingMode5GHz = 
+                           PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW - 1;
+        }
+        else if ( channel == 44 || channel == 60 || channel == 108 ||
+                  channel == 124 || channel == 157 )
+        {
+           smeConfig.csrConfig.channelBondingMode5GHz = 
+                           PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH -1;
+        }
+        else if ( channel == 48 || channel == 64 || channel == 112 ||
+             channel == 128 || channel == 161 )
+        {
+           smeConfig.csrConfig.channelBondingMode5GHz = 
+                          PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH - 1;
+        }
+        else
+        {
+           smeConfig.csrConfig.channelBondingMode5GHz=0;
+        }
+    }
+#endif
+    if ( pSapConfig->SapHw_mode == eSAP_DOT11_MODE_11n ||
+          pSapConfig->SapHw_mode == eSAP_DOT11_MODE_11n_ONLY )
+    {
+        if ( channel== 40 || channel == 48 || channel == 56 ||
+             channel == 64 || channel == 104 || channel == 112 ||
+             channel == 120 || channel == 128 || channel == 136 ||
+             channel == 144 || channel == 153 || channel == 161 )
+        {
+           smeConfig.csrConfig.channelBondingMode5GHz = 1;
+        }
+        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;
+        }
+        else
+        {
+           smeConfig.csrConfig.channelBondingMode5GHz=0;
+        }
+    }
+    pr_info ("cbmode selected=%ld\n",smeConfig.csrConfig.channelBondingMode5GHz);
+
+    sme_UpdateConfig (pHddCtx->hHal,&smeConfig);
+    return VOS_STATUS_SUCCESS;
+}
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0))
 static int wlan_hdd_cfg80211_start_bss(hdd_adapter_t *pHostapdAdapter,
@@ -1529,7 +1624,8 @@
         pConfig->SapHw_mode = eSAP_DOT11_MODE_11ac;
     }
 #endif
-
+     
+    wlan_hdd_select_cbmode(pHostapdAdapter,pConfig);
     // ht_capab is not what the name conveys,this is used for protection bitmap
     pConfig->ht_capab =
                  (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->apProtection;
