wlan: Dynamic selection of CBmode based on primary channel.

According to the Spec.
1) The valid channels set for 40MHZ are
36+40, 44+48, 52+56, 60+64 and etc.
2) The valid channels set for 80MHZ are
36+40+44+48, 52+56+60+64 and etc.
3) The invalid channels set for 40MHZ are
40+44, 48+52, 56+60, 64+68 and etc.
4) The invalid channels set for 80MHZ are
40+44+48+52, 56+60+64+68 and etc

The problem is for SoftAP and P2P-GO
the driver always follows cb mode
configured in the WCNSS_qcom_cfg.ini
file defined as gChannelBondingMode5GHz.
If the user configures the invalid value
in the gChannelBondingMode5GHz then the
driver blindly follows that which is
causing the problem.

With the dynamic channel bonding selection
the driver looks for the primary channel and
configures the correct cb mode.

Change-Id: I604b1f710915c3f236a1784aa33243b0b5e3251d
CRs-Fixed: 423496, 421901
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;