TDLS: Introduce optional TDLS Off Channel capability parameter.

This commit provides an option to configure tdls offchannel
capability through ini parameter, gEnableTDLSOffChannel and also
propogates this to the firmware and LIM layer.

Change-Id: Ia19d74c5defa789e053a4240392c87cc4da5bf65
CRs-Fixed: 610536
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 0ad0d2b..0f0a213 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1792,6 +1792,11 @@
 #define CFG_TDLS_EXTERNAL_CONTROL_MIN               (0)
 #define CFG_TDLS_EXTERNAL_CONTROL_MAX               (1)
 #define CFG_TDLS_EXTERNAL_CONTROL_DEFAULT           (0)
+
+#define CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE          "gEnableTDLSOffChannel"
+#define CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE_MIN      (0)
+#define CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE_MAX      (1)
+#define CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE_DEFAULT  (1)
 #endif
 
 #ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
@@ -2420,6 +2425,7 @@
    v_U32_t                     fTDLSPuapsdInactivityTimer;
    v_U32_t                     fTDLSRxFrameThreshold;
    v_BOOL_t                    fTDLSExternalControl;
+   v_U32_t                     fEnableTDLSOffChannel;
 #endif
    v_U32_t                     enableLpwrImgTransition;
 #ifdef WLAN_SOFTAP_VSTA_FEATURE
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 469d1c6..dae2539 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2511,6 +2511,13 @@
               CFG_TDLS_BUFFER_STA_SUPPORT_ENABLE_MIN,
               CFG_TDLS_BUFFER_STA_SUPPORT_ENABLE_MAX ),
 
+REG_VARIABLE( CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE, WLAN_PARAM_Integer,
+              hdd_config_t, fEnableTDLSOffChannel,
+              VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+              CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE_DEFAULT,
+              CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE_MIN,
+              CFG_TDLS_OFF_CHANNEL_SUPPORT_ENABLE_MAX ),
+
 REG_VARIABLE( CFG_TDLS_PUAPSD_INACTIVITY_TIME, WLAN_PARAM_Integer,
               hdd_config_t, fTDLSPuapsdInactivityTimer,
               VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -4470,6 +4477,15 @@
       fStatus = FALSE;
       hddLog(LOGE, "Could not pass on WNI_CFG_TDLS_RX_FRAME_THRESHOLD to CCM");
    }
+
+   if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_TDLS_OFF_CHANNEL_ENABLED,
+                    pConfig->fEnableTDLSOffChannel, NULL,
+                    eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
+   {
+      fStatus = FALSE;
+      hddLog(LOGE, "Could not pass on WNI_CFG_TDLS_BUF_STA_ENABLED to CCM\n");
+   }
+
 #endif
 
    if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_ENABLE_ADAPT_RX_DRAIN,
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index 6e5140d..38375a1 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -671,6 +671,7 @@
 #ifdef FEATURE_WLAN_TDLS
     tANI_U8 gLimTDLSBufStaEnabled;
     tANI_U8 gLimTDLSUapsdMask;
+    tANI_U8 gLimTDLSOffChannelEnabled;
 #endif
 
 
diff --git a/CORE/MAC/inc/wniCfgAp.h b/CORE/MAC/inc/wniCfgAp.h
index b21d8c3..7c8557e 100644
--- a/CORE/MAC/inc/wniCfgAp.h
+++ b/CORE/MAC/inc/wniCfgAp.h
@@ -383,6 +383,7 @@
 #define WNI_CFG_OBSS_HT40_SCAN_ACTIVE_TOTAL_PER_CHANNEL    322
 #define WNI_CFG_OBSS_HT40_WIDTH_CHANNEL_TRANSITION_DELAY_FACTOR    323
 #define WNI_CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD    324
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED    325
 
 /*
  * String parameter lengths 
@@ -2734,10 +2735,18 @@
 #define WNI_CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD_APMAX    100
 #define WNI_CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD_APDEF    25
 
-#define CFG_PARAM_MAX_NUM         325
-#define CFG_AP_IBUF_MAX_SIZE      264
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_STAMIN    0
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_STAMAX    1
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_STADEF    0
+
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_APMIN    0
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_APMAX    1
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_APDEF    0
+
+#define CFG_PARAM_MAX_NUM         326
+#define CFG_AP_IBUF_MAX_SIZE      265
 #define CFG_AP_SBUF_MAX_SIZE      3422
-#define CFG_STA_IBUF_MAX_SIZE     259
+#define CFG_STA_IBUF_MAX_SIZE     260
 #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 25b9e26..3f81407 100644
--- a/CORE/MAC/inc/wniCfgSta.h
+++ b/CORE/MAC/inc/wniCfgSta.h
@@ -377,6 +377,7 @@
 #define WNI_CFG_OBSS_HT40_SCAN_ACTIVE_TOTAL_PER_CHANNEL    322
 #define WNI_CFG_OBSS_HT40_WIDTH_CHANNEL_TRANSITION_DELAY_FACTOR    323
 #define WNI_CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD    324
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED    325
 
 /*
  * String parameter lengths 
@@ -1759,8 +1760,12 @@
 #define WNI_CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD_STAMAX    100
 #define WNI_CFG_OBSS_HT40_SCAN_ACTIVITY_THRESHOLD_STADEF    25
 
-#define CFG_PARAM_MAX_NUM        325
-#define CFG_STA_IBUF_MAX_SIZE    259
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_STAMIN    0
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_STAMAX    1
+#define WNI_CFG_TDLS_OFF_CHANNEL_ENABLED_STADEF    0
+
+#define CFG_PARAM_MAX_NUM        326
+#define CFG_STA_IBUF_MAX_SIZE    260
 #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 d75a1e8..aec017a 100644
--- a/CORE/MAC/src/cfg/cfgParamName.c
+++ b/CORE/MAC/src/cfg/cfgParamName.c
@@ -353,6 +353,7 @@
     (unsigned char *)"OBSS_HT40_SCAN_ACTIVE_TOTAL_PER_CHANNEL",
     (unsigned char *)"OBSS_HT40_WIDTH_CHANNEL_TRANSITION_DELAY_FACTOR",
     (unsigned char *)"OBSS_HT40_SCAN_ACTIVITY_THRESHOLD",
+    (unsigned char *)"TDLS_OFF_CHANNEL_ENABLED",
 };
 
 
diff --git a/CORE/MAC/src/cfg/cfgUtil/cfg.txt b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
index 883228c..095d07c 100644
--- a/CORE/MAC/src/cfg/cfgUtil/cfg.txt
+++ b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
@@ -4815,3 +4815,14 @@
 V    RW    NP
 NONE
 0    100    25
+
+*
+* TDLS Off Channel Implementation
+*
+WNI_CFG_TDLS_OFF_CHANNEL_ENABLED I 4 7
+V    RW    NP
+LIM
+0    1     0
+V    RW    NP
+LIM
+0    1     0
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index c9106f9..da397e1 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -640,6 +640,11 @@
        limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
        return eSIR_FAILURE;
    }
+   if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_OFF_CHANNEL_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSOffChannelEnabled) != eSIR_SUCCESS)
+   {
+       limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
+       return eSIR_FAILURE;
+   }
 #endif
    return eSIR_SUCCESS;
 }
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index ebc595a..24d8110 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -1605,6 +1605,20 @@
    }
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
                             + sizeof(tHalCfg) + tlvStruct->length) ;
+   /* QWLAN_HAL_CFG_TDLS_OFF_CHANNEL_CAPABLE */
+   tlvStruct->type = QWLAN_HAL_CFG_TDLS_OFF_CHANNEL_CAPABLE;
+   tlvStruct->length = sizeof(tANI_U32);
+   configDataValue = (tANI_U32 *)(tlvStruct + 1);
+   if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_OFF_CHANNEL_ENABLED,
+   configDataValue ) != eSIR_SUCCESS)
+   {
+   VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+   "Failed to get value for WNI_CFG_TDLS_BUF_STA_ENABLED");
+   goto handle_failure;
+   }
+   tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
+                            + sizeof(tHalCfg) + tlvStruct->length) ;
+
 #endif
 
    /* QWLAN_HAL_CFG_ENABLE_ADAPTIVE_RX_DRAIN  */
diff --git a/firmware_bin/WCNSS_cfg.dat b/firmware_bin/WCNSS_cfg.dat
index b1fea12..5fa1ca1 100644
--- a/firmware_bin/WCNSS_cfg.dat
+++ b/firmware_bin/WCNSS_cfg.dat
Binary files differ