wlan: Add a new parameter for the new FlexConnect feature

Add a new parameter (flexConnectPowerFactor) which is exposed to the
cfg.ini file (gflexConnectPowerFactor) to adjust how aggressive it enters
power collapse for the new FlexConnect feature.

Change-Id: I687925710411ab94f150c44fefe870fd700f57bc
CRs-fixed: 514125
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 86c934b..ac5412f 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1792,6 +1792,15 @@
 #define CFG_ENABLE_FAST_ROAM_IN_CONCURRENCY_DEFAULT  ( 1 )
 #endif
 
+/*
+ * FlexConnectPowerFactor parameter
+ * Default: Disable (0)
+ */
+#define CFG_FLEX_CONNECT_POWER_FACTOR_NAME          "gFlexConnectPowerFactor"
+#define CFG_FLEX_CONNECT_POWER_FACTOR_MIN           ( 0 )
+#define CFG_FLEX_CONNECT_POWER_FACTOR_MAX           ( 9 )
+#define CFG_FLEX_CONNECT_POWER_FACTOR_DEFAULT       ( 0 )
+
 /*--------------------------------------------------------------------------- 
   Type declarations
   -------------------------------------------------------------------------*/ 
@@ -2173,6 +2182,7 @@
 #endif
    v_BOOL_t                    fEnableAdaptRxDrain;
    v_BOOL_t                    enableOxygenNwk;
+   v_U8_t                      flexConnectPowerFactor;
 } hdd_config_t;
 /*--------------------------------------------------------------------------- 
   Function declarations and documenation
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index abc8651..8ecd2cc 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2349,6 +2349,14 @@
                  CFG_ENABLE_OXYNWK_DEFAULT,
                  CFG_ENABLE_OXYNWK_MIN,
                  CFG_ENABLE_OXYNWK_MAX ),
+
+   REG_VARIABLE( CFG_FLEX_CONNECT_POWER_FACTOR_NAME, WLAN_PARAM_Integer,
+                 hdd_config_t, flexConnectPowerFactor,
+                 VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_MINMAX,
+                 CFG_FLEX_CONNECT_POWER_FACTOR_DEFAULT,
+                 CFG_FLEX_CONNECT_POWER_FACTOR_MIN,
+                 CFG_FLEX_CONNECT_POWER_FACTOR_MAX ),
+
 };
 
 /*
@@ -2730,6 +2738,7 @@
 
   VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gEnableTrafficMonitor] Value = [%u] ", pHddCtx->cfg_ini->enableTrafficMonitor);
   VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gTrafficIdleTimeout] Value = [%u] ", pHddCtx->cfg_ini->trafficIdleTimeout);
+  VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [gFlexConnectPowerFactor] Value = [%u] ", pHddCtx->cfg_ini->flexConnectPowerFactor);
 }
 
 
@@ -3884,6 +3893,16 @@
       fStatus = FALSE;
       hddLog(LOGE, "Could not pass on WNI_CFG_ENABLE_ADAPT_RX_DRAIN to CCM");
    }
+
+   if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_FLEX_CONNECT_POWER_FACTOR,
+                    pConfig->flexConnectPowerFactor, NULL,
+                    eANI_BOOLEAN_FALSE) == eHAL_STATUS_FAILURE)
+   {
+      fStatus = FALSE;
+      hddLog(LOGE, "Failure: Could not pass on "
+             "WNI_CFG_FLEX_CONNECT_POWER_FACTOR to CCM");
+   }
+
    return fStatus;
 }
 
diff --git a/CORE/MAC/inc/wniCfgAp.h b/CORE/MAC/inc/wniCfgAp.h
index a801532..5f29147 100644
--- a/CORE/MAC/inc/wniCfgAp.h
+++ b/CORE/MAC/inc/wniCfgAp.h
@@ -361,6 +361,7 @@
 #define WNI_CFG_TDLS_RX_FRAME_THRESHOLD    301
 #define WNI_CFG_ENABLE_ADAPT_RX_DRAIN    302
 #define WNI_CFG_OXYGEN_NETWORK_DATA    303
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR    304
 
 /*
  * String parameter lengths 
@@ -2531,10 +2532,18 @@
 #define WNI_CFG_OXYGEN_NETWORK_DATA_APMAX    8192
 #define WNI_CFG_OXYGEN_NETWORK_DATA_APDEF    8192
 
-#define CFG_PARAM_MAX_NUM         304
-#define CFG_AP_IBUF_MAX_SIZE      243
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR_STAMIN    0
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR_STAMAX    9
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR_STADEF    0
+
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR_APMIN    0
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR_APMAX    9
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR_APDEF    0
+
+#define CFG_PARAM_MAX_NUM         305
+#define CFG_AP_IBUF_MAX_SIZE      244
 #define CFG_AP_SBUF_MAX_SIZE      3422
-#define CFG_STA_IBUF_MAX_SIZE     238
+#define CFG_STA_IBUF_MAX_SIZE     239
 #define CFG_STA_SBUF_MAX_SIZE     3388
 #define CFG_SEM_MAX_NUM           19
 
diff --git a/CORE/MAC/inc/wniCfgSta.h b/CORE/MAC/inc/wniCfgSta.h
index b769b39..6337928 100644
--- a/CORE/MAC/inc/wniCfgSta.h
+++ b/CORE/MAC/inc/wniCfgSta.h
@@ -355,6 +355,7 @@
 #define WNI_CFG_TDLS_RX_FRAME_THRESHOLD    301
 #define WNI_CFG_ENABLE_ADAPT_RX_DRAIN    302
 #define WNI_CFG_OXYGEN_NETWORK_DATA    303
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR    304
 
 /*
  * String parameter lengths 
@@ -1640,8 +1641,12 @@
 #define WNI_CFG_OXYGEN_NETWORK_DATA_STAMAX    8192
 #define WNI_CFG_OXYGEN_NETWORK_DATA_STADEF    8192
 
-#define CFG_PARAM_MAX_NUM        304
-#define CFG_STA_IBUF_MAX_SIZE    238
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR_STAMIN    0
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR_STAMAX    9
+#define WNI_CFG_FLEX_CONNECT_POWER_FACTOR_STADEF    0
+
+#define CFG_PARAM_MAX_NUM        305
+#define CFG_STA_IBUF_MAX_SIZE    239
 #define CFG_STA_SBUF_MAX_SIZE    3388
 #define CFG_SEM_MAX_NUM          19
 
diff --git a/CORE/MAC/src/cfg/cfgParamName.c b/CORE/MAC/src/cfg/cfgParamName.c
index b63303a..dc7d2d3 100644
--- a/CORE/MAC/src/cfg/cfgParamName.c
+++ b/CORE/MAC/src/cfg/cfgParamName.c
@@ -331,6 +331,8 @@
     (unsigned char *)"TDLS_PUAPSD_INACT_TIME",
     (unsigned char *)"TDLS_RX_FRAME_THRESHOLD",
     (unsigned char *)"ENABLE_ADAPT_RX_DRAIN",
+    (unsigned char *)"OXYGEN_NETWORK_DATA",
+    (unsigned char *)"FLEX_CONNECT_POWER_FACTOR",
 };
 
 
diff --git a/CORE/MAC/src/cfg/cfgUtil/cfg.txt b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
index 504fe58..a76a5c2 100644
--- a/CORE/MAC/src/cfg/cfgUtil/cfg.txt
+++ b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
@@ -4567,3 +4567,16 @@
 V    RW    NP
 SCH
 0    0x2000   0x2000
+
+*
+* FlexConnect Power Factor
+* Default is set to 0 (disable)
+*
+*
+WNI_CFG_FLEX_CONNECT_POWER_FACTOR  I   4   0
+V    RW    NP
+NONE
+0    9     0
+V    RW    NP
+NONE
+0    9     0
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 6a7f0e2..c6b4992 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -1548,6 +1548,21 @@
 
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
                             + sizeof(tHalCfg) + tlvStruct->length) ;
+
+   /* QWLAN_HAL_CFG_FLEX_CONNECT_POWER_FACTOR */
+   tlvStruct->type = QWLAN_HAL_CFG_FLEXCONNECT_POWER_FACTOR;
+   tlvStruct->length = sizeof(tANI_U32);
+   configDataValue = (tANI_U32 *)(tlvStruct + 1);
+   if(wlan_cfgGetInt(pMac, WNI_CFG_FLEX_CONNECT_POWER_FACTOR, configDataValue)
+                                                               != eSIR_SUCCESS)
+   {
+      VOS_TRACE(VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                "Failed to get value for WNI_CFG_FLEX_CONNECT_POWER_FACTOR");
+      goto handle_failure;
+   }
+   tlvStruct = (tHalCfg *)(((tANI_U8 *) tlvStruct
+                            + sizeof(tHalCfg) + tlvStruct->length));
+
    wdiStartParams->usConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
 #ifdef WLAN_DEBUG
    {
diff --git a/firmware_bin/WCNSS_cfg.dat b/firmware_bin/WCNSS_cfg.dat
index 637a869..f3d49df 100755
--- a/firmware_bin/WCNSS_cfg.dat
+++ b/firmware_bin/WCNSS_cfg.dat
Binary files differ
diff --git a/firmware_bin/WCNSS_qcom_cfg.ini b/firmware_bin/WCNSS_qcom_cfg.ini
index d44cc92..dd4ade8 100644
--- a/firmware_bin/WCNSS_qcom_cfg.ini
+++ b/firmware_bin/WCNSS_qcom_cfg.ini
@@ -399,6 +399,10 @@
 # Oxygen network (prop IE for IBSS)
 gEnableOxygenNwk=0
 
+#FlexConnect Power Factor
+#Default is set to 0 (disable)
+gFlexConnectPowerFactor=0
+
 END
 
 # Note: Configuration parser would not read anything past the END marker