TDLS : Host Changes supporting PUAPSD implementation.

This commit has the host changes to support the PUAPSD
implementation in the firmware.

Change-Id: I60a33f8067ea316d5179374cf6ec41400ceabbf2
CRs-fixed: 488980
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 6b0ed89..24e76d1 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1646,6 +1646,26 @@
 #define CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN        ( -120 )
 #define CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX        ( 0 )
 #define CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_DEFAULT    ( -75 )
+
+#define CFG_TDLS_QOS_WMM_UAPSD_MASK_NAME            "gTDLSUapsdMask" // ACs to setup U-APSD for TDLS Sta
+#define CFG_TDLS_QOS_WMM_UAPSD_MASK_MIN             (0)
+#define CFG_TDLS_QOS_WMM_UAPSD_MASK_MAX             (15)
+#define CFG_TDLS_QOS_WMM_UAPSD_MASK_DEFAULT         (0)
+
+#define CFG_TDLS_BUFFER_STA_SUPPORT_ENABLE          "gEnableTDLSBufferSta"
+#define CFG_TDLS_BUFFER_STA_SUPPORT_ENABLE_MIN      (0)
+#define CFG_TDLS_BUFFER_STA_SUPPORT_ENABLE_MAX      (1)
+#define CFG_TDLS_BUFFER_STA_SUPPORT_ENABLE_DEFAULT  (1)
+
+#define CFG_TDLS_PUAPSD_INACTIVITY_TIME             "gTDLSPuapsdInactivityTime"
+#define CFG_TDLS_PUAPSD_INACTIVITY_TIME_MIN         (0)
+#define CFG_TDLS_PUAPSD_INACTIVITY_TIME_MAX         (10)
+#define CFG_TDLS_PUAPSD_INACTIVITY_TIME_DEFAULT     (0)
+
+#define CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD          "gTDLSPuapsdRxFrameThreshold"
+#define CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_MIN      (10)
+#define CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_MAX      (20)
+#define CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_DEFAULT  (10)
 #endif
 
 #ifdef WLAN_ACTIVEMODE_OFFLOAD_FEATURE
@@ -2108,6 +2128,10 @@
    v_U32_t                     fTDLSRSSIHysteresis;
    v_S31_t                     fTDLSRSSITriggerThreshold;
    v_S31_t                     fTDLSRSSITeardownThreshold;
+   v_U32_t                     fTDLSUapsdMask;    // what ACs to setup U-APSD for TDLS
+   v_U32_t                     fEnableTDLSBufferSta;
+   v_U32_t                     fTDLSPuapsdInactivityTimer;
+   v_U32_t                     fTDLSRxFrameThreshold;
 #endif
    v_U32_t                     enableLpwrImgTransition;
 #ifdef WLAN_SOFTAP_VSTA_FEATURE
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h
index 7a9440a..698d5e5 100644
--- a/CORE/HDD/inc/wlan_hdd_main.h
+++ b/CORE/HDD/inc/wlan_hdd_main.h
@@ -127,6 +127,9 @@
 /** Maximum time(ms) to wait for tdls del sta to complete **/
 #define WAIT_TIME_TDLS_DEL_STA      1500
 
+/** Maximum time(ms) to wait for Link Establish Req to complete **/
+#define WAIT_TIME_TDLS_LINK_ESTABLISH_REQ      1500
+
 /** Maximum time(ms) to wait for tdls mgmt to complete **/
 #define WAIT_TIME_TDLS_MGMT         11000
 
@@ -760,6 +763,7 @@
    struct completion tdls_add_station_comp;
    struct completion tdls_del_station_comp;
    struct completion tdls_mgmt_comp;
+   struct completion tdls_link_establish_req_comp;
    eHalStatus tdlsAddStaStatus;
 #endif
    /* Track whether the linkup handling is needed  */
diff --git a/CORE/HDD/inc/wlan_hdd_tdls.h b/CORE/HDD/inc/wlan_hdd_tdls.h
index f461757..d067bca 100644
--- a/CORE/HDD/inc/wlan_hdd_tdls.h
+++ b/CORE/HDD/inc/wlan_hdd_tdls.h
@@ -159,6 +159,9 @@
     tANI_U16    discovery_attempt;
     tANI_U16    tx_pkt;
     tANI_U16    rx_pkt;
+    tANI_U8     uapsdQueues;
+    tANI_U8     maxSp;
+    tANI_U8     isBufSta;
     vos_timer_t     peerIdleTimer;
     vos_timer_t     initiatorWaitTimeoutTimer;
 } hddTdlsPeer_t;
@@ -188,6 +191,8 @@
 
 hddTdlsPeer_t *wlan_hdd_tdls_find_all_peer(hdd_context_t *pHddCtx, u8 *mac);
 
+int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter, u8 *mac,
+                                            tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams);
 hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, u8 *mac);
 
 int wlan_hdd_tdls_set_cap(hdd_adapter_t *pAdapter, u8* mac, tTDLSCapType cap);
@@ -198,6 +203,12 @@
 
 int wlan_hdd_tdls_recv_discovery_resp(hdd_adapter_t *pAdapter, u8 *mac);
 
+int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
+                                u8 *mac,
+                                tANI_U8 uapsdQueues,
+                                tANI_U8 maxSp,
+                                tANI_BOOLEAN isBufSta);
+
 int wlan_hdd_tdls_set_rssi(hdd_adapter_t *pAdapter, u8 *mac, tANI_S8 rxRssi);
 
 int wlan_hdd_tdls_set_responder(hdd_adapter_t *pAdapter, u8 *mac, tANI_U8 responder);
diff --git a/CORE/HDD/inc/wlan_hdd_wmm.h b/CORE/HDD/inc/wlan_hdd_wmm.h
index a51a4b6..fecb6b8 100644
--- a/CORE/HDD/inc/wlan_hdd_wmm.h
+++ b/CORE/HDD/inc/wlan_hdd_wmm.h
@@ -1,46 +1,23 @@
 /*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * Copyright (c) 2012, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * */
+  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+  *
+  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+  *
+  *
+  * Permission to use, copy, modify, and/or distribute this software for
+  * any purpose with or without fee is hereby granted, provided that the
+  * above copyright notice and this permission notice appear in all
+  * copies.
+  *
+  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+  * PERFORMANCE OF THIS SOFTWARE.
+*/
 #ifndef _WLAN_HDD_WMM_H
 #define _WLAN_HDD_WMM_H
 /*============================================================================
@@ -65,9 +42,9 @@
   The remaining functions are utility functions for information hiding.
 
 
-               Copyright (c) 2008-9 QUALCOMM Incorporated.
+               Copyright (c) 2008-9 Qualcomm Technologies, Inc.
                All Rights Reserved.
-               Qualcomm Confidential and Proprietary
+               Qualcomm Technologies Confidential and Proprietary
 ============================================================================*/
 /* $Header$ */
 
@@ -140,6 +117,12 @@
 
 } hdd_wmm_user_mode_t;
 
+// UAPSD Mask bits
+// (Bit0:VO; Bit1:VI; Bit2:BK; Bit3:BE all other bits are ignored)
+#define HDD_AC_VO 0x1
+#define HDD_AC_VI 0x2
+#define HDD_AC_BK 0x4
+#define HDD_AC_BE 0x8
 
 /*! @brief WMM Qos instance control block
 */
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 742c32f..81162c9 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -2115,6 +2115,7 @@
       roamResult == eCSR_ROAM_RESULT_TEARDOWN_TDLS_PEER_IND ? "DEL_TDLS_PEER_IND" :
       roamResult == eCSR_ROAM_RESULT_DELETE_ALL_TDLS_PEER_IND? "DEL_ALL_TDLS_PEER_IND" :
       roamResult == eCSR_ROAM_RESULT_UPDATE_TDLS_PEER? "UPDATE_TDLS_PEER" :
+      roamResult == eCSR_ROAM_RESULT_LINK_ESTABLISH_REQ_RSP? "LINK_ESTABLISH_REQ_RSP" :
 #ifdef FEATURE_WLAN_TDLS_OXYGEN_DISAPPEAR_AP
       roamResult == eCSR_ROAM_RESULT_TDLS_DISAPPEAR_AP_IND? "DISAPPEAR_AP_DEREG_STA" :
 #endif
@@ -2207,6 +2208,16 @@
             complete(&pAdapter->tdls_add_station_comp);
             break;
         }
+        case eCSR_ROAM_RESULT_LINK_ESTABLISH_REQ_RSP:
+        {
+            if (eSIR_SME_SUCCESS != pRoamInfo->statusCode)
+            {
+                VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+                     "%s: Link Establish Request failed. %d", __func__, pRoamInfo->statusCode);
+            }
+            complete(&pAdapter->tdls_link_establish_req_comp);
+            break;
+        }
         case eCSR_ROAM_RESULT_DELETE_TDLS_PEER:
         {
             hddTdlsPeer_t *curr_peer;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index 98fc710..688207f 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -2134,6 +2134,34 @@
               CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_DEFAULT,
               CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MIN,
               CFG_TDLS_RSSI_TEARDOWN_THRESHOLD_MAX ),
+
+REG_VARIABLE( CFG_TDLS_QOS_WMM_UAPSD_MASK_NAME , WLAN_PARAM_HexInteger,
+                 hdd_config_t, fTDLSUapsdMask,
+                 VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+                 CFG_TDLS_QOS_WMM_UAPSD_MASK_DEFAULT,
+                 CFG_TDLS_QOS_WMM_UAPSD_MASK_MIN,
+                 CFG_TDLS_QOS_WMM_UAPSD_MASK_MAX ),
+
+REG_VARIABLE( CFG_TDLS_BUFFER_STA_SUPPORT_ENABLE, WLAN_PARAM_Integer,
+              hdd_config_t, fEnableTDLSBufferSta,
+              VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+              CFG_TDLS_BUFFER_STA_SUPPORT_ENABLE_DEFAULT,
+              CFG_TDLS_BUFFER_STA_SUPPORT_ENABLE_MIN,
+              CFG_TDLS_BUFFER_STA_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,
+              CFG_TDLS_PUAPSD_INACTIVITY_TIME_DEFAULT,
+              CFG_TDLS_PUAPSD_INACTIVITY_TIME_MIN,
+              CFG_TDLS_PUAPSD_INACTIVITY_TIME_MAX ),
+
+REG_VARIABLE( CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD, WLAN_PARAM_Integer,
+              hdd_config_t, fTDLSRxFrameThreshold,
+              VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+              CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_DEFAULT,
+              CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_MIN,
+              CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_MAX ),
 #endif
 
 #ifdef WLAN_SOFTAP_VSTA_FEATURE
@@ -3777,6 +3805,34 @@
       hddLog(LOGE, "Could not pass on WNI_CFG_MAX_MEDIUM_TIME to CCM");
    }
 
+#ifdef FEATURE_WLAN_TDLS
+
+   if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK, pConfig->fTDLSUapsdMask,
+      NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
+   {
+      fStatus = FALSE;
+      hddLog(LOGE, "Could not pass on WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK to CCM\n");
+   }
+   if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_TDLS_BUF_STA_ENABLED, pConfig->fEnableTDLSBufferSta,
+      NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
+   {
+      fStatus = FALSE;
+      hddLog(LOGE, "Could not pass on WNI_CFG_TDLS_BUF_STA_ENABLED to CCM\n");
+   }
+   if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_TDLS_PUAPSD_INACT_TIME, pConfig->fTDLSPuapsdInactivityTimer,
+      NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
+   {
+      fStatus = FALSE;
+      hddLog(LOGE, "Could not pass on WNI_CFG_TDLS_PUAPSD_INACT_TIME to CCM\n");
+   }
+   if (ccmCfgSetInt(pHddCtx->hHal, WNI_CFG_TDLS_RX_FRAME_THRESHOLD, pConfig->fTDLSRxFrameThreshold,
+      NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
+   {
+      fStatus = FALSE;
+      hddLog(LOGE, "Could not pass on WNI_CFG_TDLS_RX_FRAME_THRESHOLD to CCM\n");
+   }
+#endif
+
    return fStatus;
 }
 
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index f474e8c..9564479 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -83,6 +83,7 @@
 #include <qc_sap_ioctl.h>
 #ifdef FEATURE_WLAN_TDLS
 #include "wlan_hdd_tdls.h"
+#include "wlan_hdd_wmm.h"
 #endif
 #include "wlan_nv.h"
 
@@ -3043,13 +3044,13 @@
                     isBufSta = 1;
                 }
             }
-            //status = wlan_hdd_tdls_set_peer_caps( mac, params->uapsd_queues,
-            //                                      params->max_sp, isBufSta);
-            //if (VOS_STATUS_SUCCESS != status) {
-            //    VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
-            //              "%s: wlan_hdd_tdls_set_peer_caps failed!", __func__);
-            //    return -EINVAL;
-            //}
+            status = wlan_hdd_tdls_set_peer_caps( pAdapter, mac, params->uapsd_queues,
+                                                  params->max_sp, isBufSta);
+            if (VOS_STATUS_SUCCESS != status) {
+                VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+                          "%s: wlan_hdd_tdls_set_peer_caps failed!", __func__);
+                return -EINVAL;
+            }
             status = wlan_hdd_tdls_add_station(wiphy, dev, mac, 1, &StaParams);
 
             if (VOS_STATUS_SUCCESS != status) {
@@ -7586,6 +7587,7 @@
         case NL80211_TDLS_ENABLE_LINK:
             {
                 VOS_STATUS status;
+                tCsrTdlsLinkEstablishParams tdlsLinkEstablishParams;
 
                 if (!TDLS_STA_INDEX_VALID(pTdlsPeer->staId))
                 {
@@ -7597,6 +7599,26 @@
 
                 if (eTDLS_LINK_CONNECTED != pTdlsPeer->link_status)
                 {
+                    if (0 != wlan_hdd_tdls_get_link_establish_params(pAdapter, peer,&tdlsLinkEstablishParams)) {
+                         return -EINVAL;
+                    }
+                    INIT_COMPLETION(pAdapter->tdls_link_establish_req_comp);
+
+                    sme_SendTdlsLinkEstablishParams(WLAN_HDD_GET_HAL_CTX(pAdapter),
+                                                    pAdapter->sessionId, peer, &tdlsLinkEstablishParams);
+                    /* Send TDLS peer UAPSD capabilities to the firmware and
+                     * register with the TL on after the response for this operation
+                     * is received .
+                     */
+                    status = wait_for_completion_interruptible_timeout(&pAdapter->tdls_link_establish_req_comp,
+                              msecs_to_jiffies(WAIT_TIME_TDLS_LINK_ESTABLISH_REQ));
+                    if (status <= 0)
+                    {
+                        VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+                                  "%s: Link Establish Request Faled Status %ld",
+                                  __func__, status);
+                        return -EINVAL;
+                    }
                     wlan_hdd_tdls_set_peer_link_status(pTdlsPeer, eTDLS_LINK_CONNECTED);
                     /* Mark TDLS client Authenticated .*/
                     status = WLANTL_ChangeSTAState( pHddCtx->pvosContext,
@@ -7619,6 +7641,68 @@
                         wlan_hdd_tdls_increment_peer_count(pAdapter);
                     }
                     wlan_hdd_tdls_check_bmps(pAdapter);
+
+                    /* Update TL about the UAPSD masks , to route the packets to firmware */
+                    if ( TRUE == pHddCtx->cfg_ini->fEnableTDLSBufferSta &&
+                        pHddCtx->cfg_ini->fTDLSUapsdMask & HDD_AC_VO )
+                    {
+                        status = WLANTL_EnableUAPSDForAC( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+                                                          pTdlsPeer->staId,
+                                                          WLANTL_AC_VO,
+                                                          7,
+                                                          7,
+                                                          0,
+                                                          0,
+                                                          WLANTL_BI_DIR );
+
+                        VOS_ASSERT( VOS_IS_STATUS_SUCCESS( status ));
+                    }
+
+                    if ( TRUE == pHddCtx->cfg_ini->fEnableTDLSBufferSta &&
+                        pHddCtx->cfg_ini->fTDLSUapsdMask & HDD_AC_VI )
+                    {
+                       status = WLANTL_EnableUAPSDForAC( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+                                                         pTdlsPeer->staId,
+                                                         WLANTL_AC_VI,
+                                                         5,
+                                                         5,
+                                                         0,
+                                                         0,
+                                                         WLANTL_BI_DIR );
+
+                       VOS_ASSERT( VOS_IS_STATUS_SUCCESS( status ));
+                    }
+
+                    if ( TRUE == pHddCtx->cfg_ini->fEnableTDLSBufferSta &&
+                        pHddCtx->cfg_ini->fTDLSUapsdMask & HDD_AC_BK )
+                    {
+                       status = WLANTL_EnableUAPSDForAC( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+                                                         pTdlsPeer->staId,
+                                                         WLANTL_AC_BK,
+                                                         2,
+                                                         2,
+                                                         0,
+                                                         0,
+                                                         WLANTL_BI_DIR );
+
+                       VOS_ASSERT( VOS_IS_STATUS_SUCCESS( status ));
+                    }
+
+                    if ( TRUE == pHddCtx->cfg_ini->fEnableTDLSBufferSta &&
+                        pHddCtx->cfg_ini->fTDLSUapsdMask & HDD_AC_BE )
+                    {
+                       status = WLANTL_EnableUAPSDForAC( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
+                                                         pTdlsPeer->staId,
+                                                         WLANTL_AC_BE,
+                                                         3,
+                                                         3,
+                                                         0,
+                                                         0,
+                                                         WLANTL_BI_DIR );
+
+                       VOS_ASSERT( VOS_IS_STATUS_SUCCESS( status ));
+                    }
+
                 }
 
             }
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 04aa401..033bce8 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -3071,6 +3071,7 @@
       init_completion(&pAdapter->tdls_add_station_comp);
       init_completion(&pAdapter->tdls_del_station_comp);
       init_completion(&pAdapter->tdls_mgmt_comp);
+      init_completion(&pAdapter->tdls_link_establish_req_comp);
 #endif
       init_completion(&pHddCtx->mc_sus_event_var);
       init_completion(&pHddCtx->tx_sus_event_var);
diff --git a/CORE/HDD/src/wlan_hdd_tdls.c b/CORE/HDD/src/wlan_hdd_tdls.c
index 6e3519c..0ab884a 100644
--- a/CORE/HDD/src/wlan_hdd_tdls.c
+++ b/CORE/HDD/src/wlan_hdd_tdls.c
@@ -904,6 +904,40 @@
     return 0;
 }
 
+int wlan_hdd_tdls_set_peer_caps(hdd_adapter_t *pAdapter,
+                                u8 *mac,
+                                tANI_U8 uapsdQueues,
+                                tANI_U8 maxSp,
+                                tANI_BOOLEAN isBufSta)
+{
+    hddTdlsPeer_t *curr_peer;
+
+    curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
+    if (curr_peer == NULL)
+        return -1;
+
+    curr_peer->uapsdQueues = uapsdQueues;
+    curr_peer->maxSp = maxSp;
+    curr_peer->isBufSta = isBufSta;
+    return 0;
+}
+
+int wlan_hdd_tdls_get_link_establish_params(hdd_adapter_t *pAdapter, u8 *mac,
+                                            tCsrTdlsLinkEstablishParams* tdlsLinkEstablishParams)
+{
+    hddTdlsPeer_t *curr_peer;
+
+    curr_peer = wlan_hdd_tdls_get_peer(pAdapter, mac);
+    if (curr_peer == NULL)
+        return -1;
+
+    tdlsLinkEstablishParams->isResponder = curr_peer->is_responder;
+    tdlsLinkEstablishParams->uapsdQueues = curr_peer->uapsdQueues;
+    tdlsLinkEstablishParams->maxSp = curr_peer->maxSp;
+    tdlsLinkEstablishParams->isBufSta = curr_peer->isBufSta;
+    return 0;
+}
+
 int wlan_hdd_tdls_set_rssi(hdd_adapter_t *pAdapter, u8 *mac, tANI_S8 rxRssi)
 {
     hddTdlsPeer_t *curr_peer;
diff --git a/CORE/HDD/src/wlan_hdd_wmm.c b/CORE/HDD/src/wlan_hdd_wmm.c
index b9faa76..40f59f8 100644
--- a/CORE/HDD/src/wlan_hdd_wmm.c
+++ b/CORE/HDD/src/wlan_hdd_wmm.c
@@ -100,13 +100,6 @@
 #endif
 
 
-// UAPSD Mask bits
-// (Bit0:VO; Bit1:VI; Bit2:BK; Bit3:BE all other bits are ignored)
-#define HDD_AC_VO 0x1
-#define HDD_AC_VI 0x2
-#define HDD_AC_BK 0x4
-#define HDD_AC_BE 0x8
-
 #define WLAN_HDD_MAX_DSCP 0x3f
 
 static sme_QosWmmUpType hddWmmDscpToUpMap[WLAN_HDD_MAX_DSCP+1];
diff --git a/CORE/MAC/inc/aniGlobal.h b/CORE/MAC/inc/aniGlobal.h
index fd78b7a..1c6aba9 100644
--- a/CORE/MAC/inc/aniGlobal.h
+++ b/CORE/MAC/inc/aniGlobal.h
@@ -664,6 +664,8 @@
     tLimAdmitPolicyInfo admitPolicyInfo;
     vos_lock_t lkPeGlobalLock;
     tANI_U8 disableLDPCWithTxbfAP;
+    tANI_U8 gLimTDLSBufStaEnabled;
+    tANI_U8 gLimTDLSUapsdMask;
 
 
 
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 8d324c6..0dfddd0 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -2319,6 +2319,14 @@
    tANI_U32      bssIdx;
 } tSirP2PNoaStart, *tpSirP2PNoaStart;
 
+typedef struct sSirTdlsInd
+{
+   tANI_U16      status;
+   tANI_U16      assocId;
+   tANI_U16      staIdx;
+   tANI_U16      reasonCode;
+} tSirTdlsInd, *tpSirTdlsInd;
+
 typedef struct sSirP2PNoaAttr
 {
 #ifdef ANI_BIG_BYTE_ENDIAN
@@ -3877,6 +3885,33 @@
     tANI_U8                bcastSig;
     eTdlsAddOper           tdlsAddOper;
 } tSirTdlsAddStaRsp ;
+
+/* TDLS Request struct SME-->PE */
+typedef struct
+{
+    tANI_U16            messageType;   // eWNI_SME_TDLS_LINK_ESTABLISH_REQ
+    tANI_U16            length;
+    tANI_U8             sessionId;     // Session ID
+    tANI_U16            transactionId; // Transaction ID for cmd
+    tANI_U8             uapsdQueues;   // Peer's uapsd Queues Information
+    tANI_U8             maxSp;         // Peer's Supported Maximum Service Period
+    tANI_U8             isBufSta;      // Does Peer Support as Buffer Station.
+    tANI_U8             isResponder;   // Is Peer a responder.
+    tSirMacAddr         bssid;         // For multi-session, for PE to locate peSession ID
+    tSirMacAddr         peerMac;
+}tSirTdlsLinkEstablishReq, *tpSirTdlsLinkEstablishReq;
+
+/* TDLS Request struct SME-->PE */
+typedef struct
+{
+    tANI_U16            messageType;   // eWNI_SME_TDLS_LINK_ESTABLISH_RSP
+    tANI_U16            length;
+    tANI_U8             sessionId;     // Session ID
+    tANI_U16            transactionId; // Transaction ID for cmd
+    tSirResultCodes        statusCode;
+    tSirMacAddr            peerMac;
+}tSirTdlsLinkEstablishReqRsp, *tpSirTdlsLinkEstablishReqRsp;
+
 /* TDLS Request struct SME-->PE */
 typedef struct sSirTdlsDelStaReq
 {
diff --git a/CORE/MAC/inc/wniApi.h b/CORE/MAC/inc/wniApi.h
index 8c1ca67..129b8d7 100644
--- a/CORE/MAC/inc/wniApi.h
+++ b/CORE/MAC/inc/wniApi.h
@@ -347,6 +347,8 @@
 #ifdef FEATURE_WLAN_TDLS_OXYGEN_DISAPPEAR_AP
     eWNI_SME_TDLS_AP_DISAPPEAR_IND,
 #endif
+    eWNI_SME_TDLS_LINK_ESTABLISH_REQ,
+    eWNI_SME_TDLS_LINK_ESTABLISH_RSP,
 #endif
     //NOTE: If you are planning to add more mesages, please make sure that 
     //SIR_LIM_ITC_MSG_TYPES_BEGIN is moved appropriately. It is set as
diff --git a/CORE/MAC/inc/wniCfgAp.h b/CORE/MAC/inc/wniCfgAp.h
index 615ff73..59897b0 100644
--- a/CORE/MAC/inc/wniCfgAp.h
+++ b/CORE/MAC/inc/wniCfgAp.h
@@ -1,4 +1,5 @@
 /*
+<<<<<<< HEAD:CORE/MAC/inc/wniCfgAp.h
  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
@@ -41,10 +42,13 @@
 
 /*
  * Copyright (C) 2007-2009 QUALCOMM Incorporated. All rights reserved. Proprietary and Confidential.
+=======
+ * Copyright (C) 2007-2009 Qualcomm Technologies, Inc. All rights reserved. Proprietary and Confidential.
+>>>>>>> 5f03499... TDLS : Host Changes supporting PUAPSD implementation.:prima/CORE/MAC/inc/wniCfgAp.h
  */
 
 /*
- * DO NOT EDIT - This file is generated automatically
+ * DO NOT EDIT - This file is generated automaticlly
  */
 
 /*
@@ -360,6 +364,10 @@
 #define WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED    295
 #define WNI_CFG_DISABLE_LDPC_WITH_TXBF_AP    296
 #define WNI_CFG_AP_LINK_MONITOR_TIMEOUT    297
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK    298
+#define WNI_CFG_TDLS_BUF_STA_ENABLED    299
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME    300
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD    301
 
 /*
  * String parameter lengths 
@@ -2486,10 +2494,42 @@
 #define WNI_CFG_AP_LINK_MONITOR_TIMEOUT_APMAX    255
 #define WNI_CFG_AP_LINK_MONITOR_TIMEOUT_APDEF    3
 
-#define CFG_PARAM_MAX_NUM         298
-#define CFG_AP_IBUF_MAX_SIZE      237
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK_STAMIN    0
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK_STAMAX    15
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK_STADEF    0
+
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK_APMIN    0
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK_APMAX    15
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK_APDEF    0
+
+#define WNI_CFG_TDLS_BUF_STA_ENABLED_STAMIN    0
+#define WNI_CFG_TDLS_BUF_STA_ENABLED_STAMAX    1
+#define WNI_CFG_TDLS_BUF_STA_ENABLED_STADEF    0
+
+#define WNI_CFG_TDLS_BUF_STA_ENABLED_APMIN    0
+#define WNI_CFG_TDLS_BUF_STA_ENABLED_APMAX    1
+#define WNI_CFG_TDLS_BUF_STA_ENABLED_APDEF    0
+
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME_STAMIN    0
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME_STAMAX    10
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME_STADEF    0
+
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME_APMIN    0
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME_APMAX    10
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME_APDEF    0
+
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_STAMIN    10
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_STAMAX    20
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_STADEF    10
+
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_APMIN    10
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_APMAX    20
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_APDEF    10
+
+#define CFG_PARAM_MAX_NUM         302
+#define CFG_AP_IBUF_MAX_SIZE      241
 #define CFG_AP_SBUF_MAX_SIZE      3422
-#define CFG_STA_IBUF_MAX_SIZE     232
+#define CFG_STA_IBUF_MAX_SIZE     236
 #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 4d1e31a..3a9dbec 100644
--- a/CORE/MAC/inc/wniCfgSta.h
+++ b/CORE/MAC/inc/wniCfgSta.h
@@ -1,4 +1,5 @@
 /*
+<<<<<<< HEAD:CORE/MAC/inc/wniCfgSta.h
  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
  *
  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
@@ -41,10 +42,13 @@
 
 /*
  * Copyright (C) 2007-2009 QUALCOMM Incorporated. All rights reserved. Proprietary and Confidential.
+=======
+ * Copyright (C) 2007-2009 Qualcomm Technologies, Inc. All rights reserved. Proprietary and Confidential.
+>>>>>>> 5f03499... TDLS : Host Changes supporting PUAPSD implementation.:prima/CORE/MAC/inc/wniCfgSta.h
  */
 
 /*
- * DO NOT EDIT - This file is generated automatically
+ * DO NOT EDIT - This file is generated automaticlly
  */
 
 /*
@@ -354,6 +358,10 @@
 #define WNI_CFG_ENABLE_MCC_ADAPTIVE_SCHED    295
 #define WNI_CFG_DISABLE_LDPC_WITH_TXBF_AP    296
 #define WNI_CFG_AP_LINK_MONITOR_TIMEOUT    297
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK    298
+#define WNI_CFG_TDLS_BUF_STA_ENABLED    299
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME    300
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD    301
 
 /*
  * String parameter lengths 
@@ -1615,8 +1623,24 @@
 #define WNI_CFG_AP_LINK_MONITOR_TIMEOUT_STAMAX    255
 #define WNI_CFG_AP_LINK_MONITOR_TIMEOUT_STADEF    3
 
-#define CFG_PARAM_MAX_NUM        298
-#define CFG_STA_IBUF_MAX_SIZE    232
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK_STAMIN    0
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK_STAMAX    15
+#define WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK_STADEF    0
+
+#define WNI_CFG_TDLS_BUF_STA_ENABLED_STAMIN    0
+#define WNI_CFG_TDLS_BUF_STA_ENABLED_STAMAX    1
+#define WNI_CFG_TDLS_BUF_STA_ENABLED_STADEF    0
+
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME_STAMIN    0
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME_STAMAX    10
+#define WNI_CFG_TDLS_PUAPSD_INACT_TIME_STADEF    0
+
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_STAMIN    10
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_STAMAX    20
+#define WNI_CFG_TDLS_RX_FRAME_THRESHOLD_STADEF    10
+
+#define CFG_PARAM_MAX_NUM        302
+#define CFG_STA_IBUF_MAX_SIZE    236
 #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 c0db1a0..e75f729 100644
--- a/CORE/MAC/src/cfg/cfgParamName.c
+++ b/CORE/MAC/src/cfg/cfgParamName.c
@@ -1,50 +1,25 @@
 /*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
+  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+  *
+  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+  *
+  *
+  * Permission to use, copy, modify, and/or distribute this software for
+  * any purpose with or without fee is hereby granted, provided that the
+  * above copyright notice and this permission notice appear in all
+  * copies.
+  *
+  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+  * PERFORMANCE OF THIS SOFTWARE.
+*/
 /*
- * Copyright (c) 2012, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * Copyright (C) 2007-2009 QUALCOMM Incorporated. All rights reserved. Proprietary and Confidential.
- */
-
-/*
- * DO NOT EDIT - This file is generated automatically
+ * DO NOT EDIT - This file is generated automaticlly
  */
 
 /*
@@ -53,303 +28,308 @@
 #include "cfgPriv.h"
 
 unsigned char *gCfgParamName[] = {
-    (unsigned char *)"STA_ID",
-    (unsigned char *)"CF_POLLABLE",
-    (unsigned char *)"CFP_PERIOD",
-    (unsigned char *)"CFP_MAX_DURATION",
-    (unsigned char *)"SSID",
-    (unsigned char *)"BEACON_INTERVAL",
-    (unsigned char *)"DTIM_PERIOD",
-    (unsigned char *)"WEP_KEY_LENGTH",
-    (unsigned char *)"WEP_DEFAULT_KEY_1",
-    (unsigned char *)"WEP_DEFAULT_KEY_2",
-    (unsigned char *)"WEP_DEFAULT_KEY_3",
-    (unsigned char *)"WEP_DEFAULT_KEY_4",
-    (unsigned char *)"WEP_DEFAULT_KEYID",
-    (unsigned char *)"EXCLUDE_UNENCRYPTED",
-    (unsigned char *)"RTS_THRESHOLD",
-    (unsigned char *)"SHORT_RETRY_LIMIT",
-    (unsigned char *)"LONG_RETRY_LIMIT",
-    (unsigned char *)"FRAGMENTATION_THRESHOLD",
-    (unsigned char *)"ACTIVE_MINIMUM_CHANNEL_TIME",
-    (unsigned char *)"ACTIVE_MAXIMUM_CHANNEL_TIME",
-    (unsigned char *)"PASSIVE_MINIMUM_CHANNEL_TIME",
-    (unsigned char *)"PASSIVE_MAXIMUM_CHANNEL_TIME",
-    (unsigned char *)"JOIN_FAILURE_TIMEOUT",
-    (unsigned char *)"AUTHENTICATE_FAILURE_TIMEOUT",
-    (unsigned char *)"AUTHENTICATE_RSP_TIMEOUT",
-    (unsigned char *)"ASSOCIATION_FAILURE_TIMEOUT",
-    (unsigned char *)"REASSOCIATION_FAILURE_TIMEOUT",
-    (unsigned char *)"RA_PERIODICITY_TIMEOUT_IN_PS",
-    (unsigned char *)"PS_ENABLE_BCN_FILTER",
-    (unsigned char *)"PS_ENABLE_HEART_BEAT",
-    (unsigned char *)"PS_ENABLE_RSSI_MONITOR",
-    (unsigned char *)"PS_DATA_INACTIVITY_TIMEOUT",
-    (unsigned char *)"RF_SETTLING_TIME_CLK",
-    (unsigned char *)"SUPPORTED_RATES_11B",
-    (unsigned char *)"SUPPORTED_RATES_11A",
-    (unsigned char *)"PHY_MODE",
-    (unsigned char *)"DOT11_MODE",
-    (unsigned char *)"OPERATIONAL_RATE_SET",
-    (unsigned char *)"EXTENDED_OPERATIONAL_RATE_SET",
-    (unsigned char *)"PROPRIETARY_OPERATIONAL_RATE_SET",
-    (unsigned char *)"BSSID",
-    (unsigned char *)"LISTEN_INTERVAL",
-    (unsigned char *)"VALID_CHANNEL_LIST",
-    (unsigned char *)"CURRENT_CHANNEL",
-    (unsigned char *)"DEFAULT_RATE_INDEX_5GHZ",
-    (unsigned char *)"DEFAULT_RATE_INDEX_24GHZ",
-    (unsigned char *)"RATE_ADAPTATION_TYPE",
-    (unsigned char *)"FIXED_RATE",
-    (unsigned char *)"FIXED_RATE_MULTICAST_24GHZ",
-    (unsigned char *)"FIXED_RATE_MULTICAST_5GHZ",
-    (unsigned char *)"RETRYRATE_POLICY",
-    (unsigned char *)"RETRYRATE_SECONDARY",
-    (unsigned char *)"RETRYRATE_TERTIARY",
-    (unsigned char *)"APSD_ENABLED",
-    (unsigned char *)"SHARED_KEY_AUTH_ENABLE",
-    (unsigned char *)"OPEN_SYSTEM_AUTH_ENABLE",
-    (unsigned char *)"AUTHENTICATION_TYPE",
-    (unsigned char *)"CF_POLL_REQUEST",
-    (unsigned char *)"PRIVACY_ENABLED",
-    (unsigned char *)"SHORT_PREAMBLE",
-    (unsigned char *)"SHORT_SLOT_TIME",
-    (unsigned char *)"ACCEPT_SHORT_SLOT_ASSOC_ONLY",
-    (unsigned char *)"QOS_ENABLED",
-    (unsigned char *)"HCF_ENABLED",
-    (unsigned char *)"RSN_ENABLED",
-    (unsigned char *)"BACKGROUND_SCAN_PERIOD",
-    (unsigned char *)"MAX_NUM_PRE_AUTH",
-    (unsigned char *)"PREAUTH_CLNUP_TIMEOUT",
-    (unsigned char *)"RELEASE_AID_TIMEOUT",
-    (unsigned char *)"HEART_BEAT_THRESHOLD",
-    (unsigned char *)"PROBE_AFTER_HB_FAIL_TIMEOUT",
-    (unsigned char *)"MANUFACTURER_OUI",
-    (unsigned char *)"MANUFACTURER_NAME",
-    (unsigned char *)"MODEL_NUMBER",
-    (unsigned char *)"MODEL_NAME",
-    (unsigned char *)"MANUFACTURER_PRODUCT_NAME",
-    (unsigned char *)"MANUFACTURER_PRODUCT_VERSION",
-    (unsigned char *)"11D_ENABLED",
-    (unsigned char *)"MAX_TX_POWER_2_4",
-    (unsigned char *)"MAX_TX_POWER_5",
-    (unsigned char *)"NETWORK_DENSITY",
-    (unsigned char *)"ADAPTIVE_THRESHOLD_ALGORITHM",
-    (unsigned char *)"CURRENT_TX_ANTENNA",
-    (unsigned char *)"CURRENT_RX_ANTENNA",
-    (unsigned char *)"CURRENT_TX_POWER_LEVEL",
-    (unsigned char *)"POWER_STATE_PER_CHAIN",
-    (unsigned char *)"NEW_BSS_FOUND_IND",
-    (unsigned char *)"PROPRIETARY_ANI_FEATURES_ENABLED",
-    (unsigned char *)"PROPRIETARY_RATES_ENABLED",
-    (unsigned char *)"AP_NODE_NAME",
-    (unsigned char *)"COUNTRY_CODE",
-    (unsigned char *)"11H_ENABLED",
-    (unsigned char *)"WT_CNF_TIMEOUT",
-    (unsigned char *)"KEEPALIVE_TIMEOUT",
-    (unsigned char *)"PROXIMITY",
-    (unsigned char *)"LOG_LEVEL",
-    (unsigned char *)"OLBC_DETECT_TIMEOUT",
-    (unsigned char *)"PROTECTION_ENABLED",
-    (unsigned char *)"11G_PROTECTION_ALWAYS",
-    (unsigned char *)"FORCE_POLICY_PROTECTION",
-    (unsigned char *)"11G_SHORT_PREAMBLE_ENABLED",
-    (unsigned char *)"11G_SHORT_SLOT_TIME_ENABLED",
-    (unsigned char *)"CAL_PERIOD",
-    (unsigned char *)"STATS_PERIOD",
-    (unsigned char *)"CAL_CONTROL",
-    (unsigned char *)"11G_ONLY_POLICY",
-    (unsigned char *)"PACKET_CLASSIFICATION",
-    (unsigned char *)"WME_ENABLED",
-    (unsigned char *)"ADDTS_RSP_TIMEOUT",
-    (unsigned char *)"MAX_SP_LENGTH",
-    (unsigned char *)"KEEP_ALIVE_STA_LIMIT_THRESHOLD",
-    (unsigned char *)"SEND_SINGLE_SSID_ALWAYS",
-    (unsigned char *)"WSM_ENABLED",
-    (unsigned char *)"PROP_CAPABILITY",
-    (unsigned char *)"EDCA_PROFILE",
-    (unsigned char *)"EDCA_ANI_ACBK_LOCAL",
-    (unsigned char *)"EDCA_ANI_ACBE_LOCAL",
-    (unsigned char *)"EDCA_ANI_ACVI_LOCAL",
-    (unsigned char *)"EDCA_ANI_ACVO_LOCAL",
-    (unsigned char *)"EDCA_ANI_ACBK",
-    (unsigned char *)"EDCA_ANI_ACBE",
-    (unsigned char *)"EDCA_ANI_ACVI",
-    (unsigned char *)"EDCA_ANI_ACVO",
-    (unsigned char *)"EDCA_WME_ACBK_LOCAL",
-    (unsigned char *)"EDCA_WME_ACBE_LOCAL",
-    (unsigned char *)"EDCA_WME_ACVI_LOCAL",
-    (unsigned char *)"EDCA_WME_ACVO_LOCAL",
-    (unsigned char *)"EDCA_WME_ACBK",
-    (unsigned char *)"EDCA_WME_ACBE",
-    (unsigned char *)"EDCA_WME_ACVI",
-    (unsigned char *)"EDCA_WME_ACVO",
-    (unsigned char *)"EDCA_TIT_DEMO_ACBK_LOCAL",
-    (unsigned char *)"EDCA_TIT_DEMO_ACBE_LOCAL",
-    (unsigned char *)"EDCA_TIT_DEMO_ACVI_LOCAL",
-    (unsigned char *)"EDCA_TIT_DEMO_ACVO_LOCAL",
-    (unsigned char *)"EDCA_TIT_DEMO_ACBK",
-    (unsigned char *)"EDCA_TIT_DEMO_ACBE",
-    (unsigned char *)"EDCA_TIT_DEMO_ACVI",
-    (unsigned char *)"EDCA_TIT_DEMO_ACVO",
-    (unsigned char *)"RDET_FLAG",
-    (unsigned char *)"RADAR_CHANNEL_LIST",
-    (unsigned char *)"LOCAL_POWER_CONSTRAINT",
-    (unsigned char *)"ADMIT_POLICY",
-    (unsigned char *)"ADMIT_BWFACTOR",
-    (unsigned char *)"MAX_CONSECUTIVE_BACKGROUND_SCAN_FAILURE",
-    (unsigned char *)"CHANNEL_BONDING_MODE",
-    (unsigned char *)"CB_SECONDARY_CHANNEL_STATE",
-    (unsigned char *)"DYNAMIC_THRESHOLD_ZERO",
-    (unsigned char *)"DYNAMIC_THRESHOLD_ONE",
-    (unsigned char *)"DYNAMIC_THRESHOLD_TWO",
-    (unsigned char *)"TRIG_STA_BK_SCAN",
-    (unsigned char *)"DYNAMIC_PROFILE_SWITCHING",
-    (unsigned char *)"SCAN_CONTROL_LIST",
-    (unsigned char *)"MIMO_ENABLED",
-    (unsigned char *)"BLOCK_ACK_ENABLED",
-    (unsigned char *)"BA_ACTIVITY_CHECK_TIMEOUT",
-    (unsigned char *)"HT_RX_STBC",
-    (unsigned char *)"HT_CAP_INFO",
-    (unsigned char *)"HT_AMPDU_PARAMS",
-    (unsigned char *)"SUPPORTED_MCS_SET",
-    (unsigned char *)"EXT_HT_CAP_INFO",
-    (unsigned char *)"TX_BF_CAP",
-    (unsigned char *)"AS_CAP",
-    (unsigned char *)"HT_INFO_FIELD1",
-    (unsigned char *)"HT_INFO_FIELD2",
-    (unsigned char *)"HT_INFO_FIELD3",
-    (unsigned char *)"BASIC_MCS_SET",
-    (unsigned char *)"CURRENT_MCS_SET",
-    (unsigned char *)"GREENFIELD_CAPABILITY",
-    (unsigned char *)"VHT_MAX_MPDU_LENGTH",
-    (unsigned char *)"VHT_SUPPORTED_CHAN_WIDTH_SET",
-    (unsigned char *)"VHT_LDPC_CODING_CAP",
-    (unsigned char *)"VHT_SHORT_GI_80MHZ",
-    (unsigned char *)"VHT_SHORT_GI_160_AND_80_PLUS_80MHZ",
-    (unsigned char *)"VHT_TXSTBC",
-    (unsigned char *)"VHT_RXSTBC",
-    (unsigned char *)"VHT_SU_BEAMFORMER_CAP",
-    (unsigned char *)"VHT_SU_BEAMFORMEE_CAP",
-    (unsigned char *)"VHT_CSN_BEAMFORMEE_ANT_SUPPORTED",
-    (unsigned char *)"VHT_NUM_SOUNDING_DIMENSIONS",
-    (unsigned char *)"VHT_MU_BEAMFORMER_CAP",
-    (unsigned char *)"VHT_MU_BEAMFORMEE_CAP",
-    (unsigned char *)"VHT_TXOP_PS",
-    (unsigned char *)"VHT_HTC_VHTC_CAP",
-    (unsigned char *)"VHT_AMPDU_LEN_EXPONENT",
-    (unsigned char *)"VHT_LINK_ADAPTATION_CAP",
-    (unsigned char *)"VHT_RX_ANT_PATTERN",
-    (unsigned char *)"VHT_TX_ANT_PATTERN",
-    (unsigned char *)"VHT_RX_MCS_MAP",
-    (unsigned char *)"VHT_TX_MCS_MAP",
-    (unsigned char *)"VHT_RX_HIGHEST_SUPPORTED_DATA_RATE",
-    (unsigned char *)"VHT_TX_HIGHEST_SUPPORTED_DATA_RATE",
-    (unsigned char *)"VHT_CHANNEL_WIDTH",
-    (unsigned char *)"VHT_CHANNEL_CENTER_FREQ_SEGMENT1",
-    (unsigned char *)"VHT_CHANNEL_CENTER_FREQ_SEGMENT2",
-    (unsigned char *)"VHT_BASIC_MCS_SET",
-    (unsigned char *)"VHT_MU_MIMO_CAP_STA_COUNT",
-    (unsigned char *)"VHT_SS_UNDER_UTIL",
-    (unsigned char *)"VHT_40MHZ_UTILIZATION",
-    (unsigned char *)"VHT_80MHZ_UTILIZATION",
-    (unsigned char *)"VHT_160MHZ_UTILIZATION",
-    (unsigned char *)"MAX_AMSDU_LENGTH",
-    (unsigned char *)"MPDU_DENSITY",
-    (unsigned char *)"NUM_BUFF_ADVERT",
-    (unsigned char *)"MAX_RX_AMPDU_FACTOR",
-    (unsigned char *)"SHORT_GI_20MHZ",
-    (unsigned char *)"SHORT_GI_40MHZ",
-    (unsigned char *)"RIFS_ENABLED",
-    (unsigned char *)"MAX_PS_POLL",
-    (unsigned char *)"NUM_BEACON_PER_RSSI_AVERAGE",
-    (unsigned char *)"RSSI_FILTER_PERIOD",
-    (unsigned char *)"MIN_RSSI_THRESHOLD",
-    (unsigned char *)"NTH_BEACON_FILTER",
-    (unsigned char *)"BROADCAST_FRAME_FILTER_ENABLE",
-    (unsigned char *)"SCAN_IN_POWERSAVE",
-    (unsigned char *)"IGNORE_DTIM",
-    (unsigned char *)"WOWLAN_UCAST_PATTERN_FILTER_ENABLE",
-    (unsigned char *)"WOWLAN_CHANNEL_SWITCH_ENABLE",
-    (unsigned char *)"WOWLAN_DEAUTH_ENABLE",
-    (unsigned char *)"WOWLAN_DISASSOC_ENABLE",
-    (unsigned char *)"WOWLAN_MAX_MISSED_BEACON",
-    (unsigned char *)"WOWLAN_MAX_SLEEP_PERIOD",
-    (unsigned char *)"BA_TIMEOUT",
-    (unsigned char *)"BA_THRESHOLD_HIGH",
-    (unsigned char *)"MAX_BA_BUFFERS",
-    (unsigned char *)"MAX_BA_SESSIONS",
-    (unsigned char *)"BA_AUTO_SETUP",
-    (unsigned char *)"ADDBA_REQ_DECLINE",
-    (unsigned char *)"BG_SCAN_CHANNEL_LIST",
-    (unsigned char *)"MAX_MEDIUM_TIME",
-    (unsigned char *)"MAX_MPDUS_IN_AMPDU",
-    (unsigned char *)"IBSS_AUTO_BSSID",
-    (unsigned char *)"PROBE_REQ_ADDNIE_FLAG",
-    (unsigned char *)"PROBE_REQ_ADDNIE_DATA",
-    (unsigned char *)"PROBE_RSP_ADDNIE_FLAG",
-    (unsigned char *)"PROBE_RSP_ADDNIE_DATA1",
-    (unsigned char *)"PROBE_RSP_ADDNIE_DATA2",
-    (unsigned char *)"PROBE_RSP_ADDNIE_DATA3",
-    (unsigned char *)"ASSOC_RSP_ADDNIE_FLAG",
-    (unsigned char *)"ASSOC_RSP_ADDNIE_DATA",
-    (unsigned char *)"PROBE_REQ_ADDNP2PIE_FLAG",
-    (unsigned char *)"PROBE_REQ_ADDNP2PIE_DATA",
-    (unsigned char *)"PROBE_RSP_BCN_ADDNIE_FLAG",
-    (unsigned char *)"PROBE_RSP_BCN_ADDNIE_DATA",
-    (unsigned char *)"WPS_ENABLE",
-    (unsigned char *)"WPS_STATE",
-    (unsigned char *)"WPS_PROBE_REQ_FLAG",
-    (unsigned char *)"WPS_VERSION",
-    (unsigned char *)"WPS_REQUEST_TYPE",
-    (unsigned char *)"WPS_CFG_METHOD",
-    (unsigned char *)"WPS_UUID",
-    (unsigned char *)"WPS_PRIMARY_DEVICE_CATEGORY",
-    (unsigned char *)"WPS_PIMARY_DEVICE_OUI",
-    (unsigned char *)"WPS_DEVICE_SUB_CATEGORY",
-    (unsigned char *)"WPS_ASSOCIATION_STATE",
-    (unsigned char *)"WPS_CONFIGURATION_ERROR",
-    (unsigned char *)"WPS_DEVICE_PASSWORD_ID",
-    (unsigned char *)"WPS_ASSOC_METHOD",
-    (unsigned char *)"LOW_GAIN_OVERRIDE",
-    (unsigned char *)"ENABLE_PHY_AGC_LISTEN_MODE",
-    (unsigned char *)"RPE_POLLING_THRESHOLD",
-    (unsigned char *)"RPE_AGING_THRESHOLD_FOR_AC0_REG",
-    (unsigned char *)"RPE_AGING_THRESHOLD_FOR_AC1_REG",
-    (unsigned char *)"RPE_AGING_THRESHOLD_FOR_AC2_REG",
-    (unsigned char *)"RPE_AGING_THRESHOLD_FOR_AC3_REG",
-    (unsigned char *)"NO_OF_ONCHIP_REORDER_SESSIONS",
-    (unsigned char *)"SINGLE_TID_RC",
-    (unsigned char *)"RRM_ENABLED",
-    (unsigned char *)"RRM_OPERATING_CHAN_MAX",
-    (unsigned char *)"RRM_NON_OPERATING_CHAN_MAX",
-    (unsigned char *)"TX_PWR_CTRL_ENABLE",
-    (unsigned char *)"MCAST_BCAST_FILTER_SETTING",
-    (unsigned char *)"BTC_DHCP_BT_SLOTS_TO_BLOCK",
-    (unsigned char *)"DYNAMIC_PS_POLL_VALUE",
-    (unsigned char *)"PS_NULLDATA_AP_RESP_TIMEOUT",
-    (unsigned char *)"TELE_BCN_WAKEUP_EN",
-    (unsigned char *)"TELE_BCN_TRANS_LI",
-    (unsigned char *)"TELE_BCN_TRANS_LI_IDLE_BCNS",
-    (unsigned char *)"TELE_BCN_MAX_LI",
-    (unsigned char *)"TELE_BCN_MAX_LI_IDLE_BCNS",
-    (unsigned char *)"BTC_A2DP_DHCP_BT_SUB_INTERVALS",
-    (unsigned char *)"INFRA_STA_KEEP_ALIVE_PERIOD",
-    (unsigned char *)"ASSOC_STA_LIMIT",
-    (unsigned char *)"SAP_CHANNEL_SELECT_START_CHANNEL",
-    (unsigned char *)"SAP_CHANNEL_SELECT_END_CHANNEL",
-    (unsigned char *)"SAP_CHANNEL_SELECT_OPERATING_BAND",
-    (unsigned char *)"AP_DATA_AVAIL_POLL_PERIOD",
-    (unsigned char *)"ENABLE_CLOSE_LOOP",
-    (unsigned char *)"ENABLE_LTE_COEX",
-    (unsigned char *)"AP_KEEP_ALIVE_TIMEOUT",
-    (unsigned char *)"GO_KEEP_ALIVE_TIMEOUT",
-    (unsigned char *)"ENABLE_MC_ADDR_LIST",
-    (unsigned char *)"ENABLE_UC_FILTER",
-    (unsigned char *)"ENABLE_LPWR_IMG_TRANSITION",
-    (unsigned char *)"ENABLE_MCC_ADAPTIVE_SCHED",
-    (unsigned char *)"DISABLE_LDPC_WITH_TXBF_AP",
-    (unsigned char *)"AP_LINK_MONITOR_TIMEOUT",
+	(unsigned char *)"STA_ID",
+	(unsigned char *)"CF_POLLABLE",
+	(unsigned char *)"CFP_PERIOD",
+	(unsigned char *)"CFP_MAX_DURATION",
+	(unsigned char *)"SSID",
+	(unsigned char *)"BEACON_INTERVAL",
+	(unsigned char *)"DTIM_PERIOD",
+	(unsigned char *)"WEP_KEY_LENGTH",
+	(unsigned char *)"WEP_DEFAULT_KEY_1",
+	(unsigned char *)"WEP_DEFAULT_KEY_2",
+	(unsigned char *)"WEP_DEFAULT_KEY_3",
+	(unsigned char *)"WEP_DEFAULT_KEY_4",
+	(unsigned char *)"WEP_DEFAULT_KEYID",
+	(unsigned char *)"EXCLUDE_UNENCRYPTED",
+	(unsigned char *)"RTS_THRESHOLD",
+	(unsigned char *)"SHORT_RETRY_LIMIT",
+	(unsigned char *)"LONG_RETRY_LIMIT",
+	(unsigned char *)"FRAGMENTATION_THRESHOLD",
+	(unsigned char *)"ACTIVE_MINIMUM_CHANNEL_TIME",
+	(unsigned char *)"ACTIVE_MAXIMUM_CHANNEL_TIME",
+	(unsigned char *)"PASSIVE_MINIMUM_CHANNEL_TIME",
+	(unsigned char *)"PASSIVE_MAXIMUM_CHANNEL_TIME",
+	(unsigned char *)"JOIN_FAILURE_TIMEOUT",
+	(unsigned char *)"AUTHENTICATE_FAILURE_TIMEOUT",
+	(unsigned char *)"AUTHENTICATE_RSP_TIMEOUT",
+	(unsigned char *)"ASSOCIATION_FAILURE_TIMEOUT",
+	(unsigned char *)"REASSOCIATION_FAILURE_TIMEOUT",
+	(unsigned char *)"RA_PERIODICITY_TIMEOUT_IN_PS",
+	(unsigned char *)"PS_ENABLE_BCN_FILTER",
+	(unsigned char *)"PS_ENABLE_HEART_BEAT",
+	(unsigned char *)"PS_ENABLE_RSSI_MONITOR",
+	(unsigned char *)"PS_DATA_INACTIVITY_TIMEOUT",
+	(unsigned char *)"RF_SETTLING_TIME_CLK",
+	(unsigned char *)"SUPPORTED_RATES_11B",
+	(unsigned char *)"SUPPORTED_RATES_11A",
+	(unsigned char *)"PHY_MODE",
+	(unsigned char *)"DOT11_MODE",
+	(unsigned char *)"OPERATIONAL_RATE_SET",
+	(unsigned char *)"EXTENDED_OPERATIONAL_RATE_SET",
+	(unsigned char *)"PROPRIETARY_OPERATIONAL_RATE_SET",
+	(unsigned char *)"BSSID",
+	(unsigned char *)"LISTEN_INTERVAL",
+	(unsigned char *)"VALID_CHANNEL_LIST",
+	(unsigned char *)"CURRENT_CHANNEL",
+	(unsigned char *)"DEFAULT_RATE_INDEX_5GHZ",
+	(unsigned char *)"DEFAULT_RATE_INDEX_24GHZ",
+	(unsigned char *)"RATE_ADAPTATION_TYPE",
+	(unsigned char *)"FIXED_RATE",
+	(unsigned char *)"FIXED_RATE_MULTICAST_24GHZ",
+	(unsigned char *)"FIXED_RATE_MULTICAST_5GHZ",
+	(unsigned char *)"RETRYRATE_POLICY",
+	(unsigned char *)"RETRYRATE_SECONDARY",
+	(unsigned char *)"RETRYRATE_TERTIARY",
+	(unsigned char *)"APSD_ENABLED",
+	(unsigned char *)"SHARED_KEY_AUTH_ENABLE",
+	(unsigned char *)"OPEN_SYSTEM_AUTH_ENABLE",
+	(unsigned char *)"AUTHENTICATION_TYPE",
+	(unsigned char *)"CF_POLL_REQUEST",
+	(unsigned char *)"PRIVACY_ENABLED",
+	(unsigned char *)"SHORT_PREAMBLE",
+	(unsigned char *)"SHORT_SLOT_TIME",
+	(unsigned char *)"ACCEPT_SHORT_SLOT_ASSOC_ONLY",
+	(unsigned char *)"QOS_ENABLED",
+	(unsigned char *)"HCF_ENABLED",
+	(unsigned char *)"RSN_ENABLED",
+	(unsigned char *)"BACKGROUND_SCAN_PERIOD",
+	(unsigned char *)"MAX_NUM_PRE_AUTH",
+	(unsigned char *)"PREAUTH_CLNUP_TIMEOUT",
+	(unsigned char *)"RELEASE_AID_TIMEOUT",
+	(unsigned char *)"HEART_BEAT_THRESHOLD",
+	(unsigned char *)"PROBE_AFTER_HB_FAIL_TIMEOUT",
+	(unsigned char *)"MANUFACTURER_OUI",
+	(unsigned char *)"MANUFACTURER_NAME",
+	(unsigned char *)"MODEL_NUMBER",
+	(unsigned char *)"MODEL_NAME",
+	(unsigned char *)"MANUFACTURER_PRODUCT_NAME",
+	(unsigned char *)"MANUFACTURER_PRODUCT_VERSION",
+	(unsigned char *)"11D_ENABLED",
+	(unsigned char *)"MAX_TX_POWER_2_4",
+	(unsigned char *)"MAX_TX_POWER_5",
+	(unsigned char *)"NETWORK_DENSITY",
+	(unsigned char *)"ADAPTIVE_THRESHOLD_ALGORITHM",
+	(unsigned char *)"CURRENT_TX_ANTENNA",
+	(unsigned char *)"CURRENT_RX_ANTENNA",
+	(unsigned char *)"CURRENT_TX_POWER_LEVEL",
+	(unsigned char *)"POWER_STATE_PER_CHAIN",
+	(unsigned char *)"NEW_BSS_FOUND_IND",
+	(unsigned char *)"PROPRIETARY_ANI_FEATURES_ENABLED",
+	(unsigned char *)"PROPRIETARY_RATES_ENABLED",
+	(unsigned char *)"AP_NODE_NAME",
+	(unsigned char *)"COUNTRY_CODE",
+	(unsigned char *)"11H_ENABLED",
+	(unsigned char *)"WT_CNF_TIMEOUT",
+	(unsigned char *)"KEEPALIVE_TIMEOUT",
+	(unsigned char *)"PROXIMITY",
+	(unsigned char *)"LOG_LEVEL",
+	(unsigned char *)"OLBC_DETECT_TIMEOUT",
+	(unsigned char *)"PROTECTION_ENABLED",
+	(unsigned char *)"11G_PROTECTION_ALWAYS",
+	(unsigned char *)"FORCE_POLICY_PROTECTION",
+	(unsigned char *)"11G_SHORT_PREAMBLE_ENABLED",
+	(unsigned char *)"11G_SHORT_SLOT_TIME_ENABLED",
+	(unsigned char *)"CAL_PERIOD",
+	(unsigned char *)"STATS_PERIOD",
+	(unsigned char *)"CAL_CONTROL",
+	(unsigned char *)"11G_ONLY_POLICY",
+	(unsigned char *)"PACKET_CLASSIFICATION",
+	(unsigned char *)"WME_ENABLED",
+	(unsigned char *)"ADDTS_RSP_TIMEOUT",
+	(unsigned char *)"MAX_SP_LENGTH",
+	(unsigned char *)"KEEP_ALIVE_STA_LIMIT_THRESHOLD",
+	(unsigned char *)"SEND_SINGLE_SSID_ALWAYS",
+	(unsigned char *)"WSM_ENABLED",
+	(unsigned char *)"PROP_CAPABILITY",
+	(unsigned char *)"EDCA_PROFILE",
+	(unsigned char *)"EDCA_ANI_ACBK_LOCAL",
+	(unsigned char *)"EDCA_ANI_ACBE_LOCAL",
+	(unsigned char *)"EDCA_ANI_ACVI_LOCAL",
+	(unsigned char *)"EDCA_ANI_ACVO_LOCAL",
+	(unsigned char *)"EDCA_ANI_ACBK",
+	(unsigned char *)"EDCA_ANI_ACBE",
+	(unsigned char *)"EDCA_ANI_ACVI",
+	(unsigned char *)"EDCA_ANI_ACVO",
+	(unsigned char *)"EDCA_WME_ACBK_LOCAL",
+	(unsigned char *)"EDCA_WME_ACBE_LOCAL",
+	(unsigned char *)"EDCA_WME_ACVI_LOCAL",
+	(unsigned char *)"EDCA_WME_ACVO_LOCAL",
+	(unsigned char *)"EDCA_WME_ACBK",
+	(unsigned char *)"EDCA_WME_ACBE",
+	(unsigned char *)"EDCA_WME_ACVI",
+	(unsigned char *)"EDCA_WME_ACVO",
+	(unsigned char *)"EDCA_TIT_DEMO_ACBK_LOCAL",
+	(unsigned char *)"EDCA_TIT_DEMO_ACBE_LOCAL",
+	(unsigned char *)"EDCA_TIT_DEMO_ACVI_LOCAL",
+	(unsigned char *)"EDCA_TIT_DEMO_ACVO_LOCAL",
+	(unsigned char *)"EDCA_TIT_DEMO_ACBK",
+	(unsigned char *)"EDCA_TIT_DEMO_ACBE",
+	(unsigned char *)"EDCA_TIT_DEMO_ACVI",
+	(unsigned char *)"EDCA_TIT_DEMO_ACVO",
+	(unsigned char *)"RDET_FLAG",
+	(unsigned char *)"RADAR_CHANNEL_LIST",
+	(unsigned char *)"LOCAL_POWER_CONSTRAINT",
+	(unsigned char *)"ADMIT_POLICY",
+	(unsigned char *)"ADMIT_BWFACTOR",
+	(unsigned char *)"MAX_CONSECUTIVE_BACKGROUND_SCAN_FAILURE",
+	(unsigned char *)"CHANNEL_BONDING_MODE",
+	(unsigned char *)"CB_SECONDARY_CHANNEL_STATE",
+	(unsigned char *)"DYNAMIC_THRESHOLD_ZERO",
+	(unsigned char *)"DYNAMIC_THRESHOLD_ONE",
+	(unsigned char *)"DYNAMIC_THRESHOLD_TWO",
+	(unsigned char *)"TRIG_STA_BK_SCAN",
+	(unsigned char *)"DYNAMIC_PROFILE_SWITCHING",
+	(unsigned char *)"SCAN_CONTROL_LIST",
+	(unsigned char *)"MIMO_ENABLED",
+	(unsigned char *)"BLOCK_ACK_ENABLED",
+	(unsigned char *)"BA_ACTIVITY_CHECK_TIMEOUT",
+	(unsigned char *)"HT_RX_STBC",
+	(unsigned char *)"HT_CAP_INFO",
+	(unsigned char *)"HT_AMPDU_PARAMS",
+	(unsigned char *)"SUPPORTED_MCS_SET",
+	(unsigned char *)"EXT_HT_CAP_INFO",
+	(unsigned char *)"TX_BF_CAP",
+	(unsigned char *)"AS_CAP",
+	(unsigned char *)"HT_INFO_FIELD1",
+	(unsigned char *)"HT_INFO_FIELD2",
+	(unsigned char *)"HT_INFO_FIELD3",
+	(unsigned char *)"BASIC_MCS_SET",
+	(unsigned char *)"CURRENT_MCS_SET",
+	(unsigned char *)"GREENFIELD_CAPABILITY",
+	(unsigned char *)"VHT_MAX_MPDU_LENGTH",
+	(unsigned char *)"VHT_SUPPORTED_CHAN_WIDTH_SET",
+	(unsigned char *)"VHT_LDPC_CODING_CAP",
+	(unsigned char *)"VHT_SHORT_GI_80MHZ",
+	(unsigned char *)"VHT_SHORT_GI_160_AND_80_PLUS_80MHZ",
+	(unsigned char *)"VHT_TXSTBC",
+	(unsigned char *)"VHT_RXSTBC",
+	(unsigned char *)"VHT_SU_BEAMFORMER_CAP",
+	(unsigned char *)"VHT_SU_BEAMFORMEE_CAP",
+	(unsigned char *)"VHT_CSN_BEAMFORMEE_ANT_SUPPORTED",
+	(unsigned char *)"VHT_NUM_SOUNDING_DIMENSIONS",
+	(unsigned char *)"VHT_MU_BEAMFORMER_CAP",
+	(unsigned char *)"VHT_MU_BEAMFORMEE_CAP",
+	(unsigned char *)"VHT_TXOP_PS",
+	(unsigned char *)"VHT_HTC_VHTC_CAP",
+	(unsigned char *)"VHT_AMPDU_LEN_EXPONENT",
+	(unsigned char *)"VHT_LINK_ADAPTATION_CAP",
+	(unsigned char *)"VHT_RX_ANT_PATTERN",
+	(unsigned char *)"VHT_TX_ANT_PATTERN",
+	(unsigned char *)"VHT_RX_MCS_MAP",
+	(unsigned char *)"VHT_TX_MCS_MAP",
+	(unsigned char *)"VHT_RX_HIGHEST_SUPPORTED_DATA_RATE",
+	(unsigned char *)"VHT_TX_HIGHEST_SUPPORTED_DATA_RATE",
+	(unsigned char *)"VHT_CHANNEL_WIDTH",
+	(unsigned char *)"VHT_CHANNEL_CENTER_FREQ_SEGMENT1",
+	(unsigned char *)"VHT_CHANNEL_CENTER_FREQ_SEGMENT2",
+	(unsigned char *)"VHT_BASIC_MCS_SET",
+	(unsigned char *)"VHT_MU_MIMO_CAP_STA_COUNT",
+	(unsigned char *)"VHT_SS_UNDER_UTIL",
+	(unsigned char *)"VHT_40MHZ_UTILIZATION",
+	(unsigned char *)"VHT_80MHZ_UTILIZATION",
+	(unsigned char *)"VHT_160MHZ_UTILIZATION",
+	(unsigned char *)"MAX_AMSDU_LENGTH",
+	(unsigned char *)"MPDU_DENSITY",
+	(unsigned char *)"NUM_BUFF_ADVERT",
+	(unsigned char *)"MAX_RX_AMPDU_FACTOR",
+	(unsigned char *)"SHORT_GI_20MHZ",
+	(unsigned char *)"SHORT_GI_40MHZ",
+	(unsigned char *)"RIFS_ENABLED",
+	(unsigned char *)"MAX_PS_POLL",
+	(unsigned char *)"NUM_BEACON_PER_RSSI_AVERAGE",
+	(unsigned char *)"RSSI_FILTER_PERIOD",
+	(unsigned char *)"MIN_RSSI_THRESHOLD",
+	(unsigned char *)"NTH_BEACON_FILTER",
+	(unsigned char *)"BROADCAST_FRAME_FILTER_ENABLE",
+	(unsigned char *)"SCAN_IN_POWERSAVE",
+	(unsigned char *)"IGNORE_DTIM",
+	(unsigned char *)"WOWLAN_UCAST_PATTERN_FILTER_ENABLE",
+	(unsigned char *)"WOWLAN_CHANNEL_SWITCH_ENABLE",
+	(unsigned char *)"WOWLAN_DEAUTH_ENABLE",
+	(unsigned char *)"WOWLAN_DISASSOC_ENABLE",
+	(unsigned char *)"WOWLAN_MAX_MISSED_BEACON",
+	(unsigned char *)"WOWLAN_MAX_SLEEP_PERIOD",
+	(unsigned char *)"BA_TIMEOUT",
+	(unsigned char *)"BA_THRESHOLD_HIGH",
+	(unsigned char *)"MAX_BA_BUFFERS",
+	(unsigned char *)"MAX_BA_SESSIONS",
+	(unsigned char *)"BA_AUTO_SETUP",
+	(unsigned char *)"ADDBA_REQ_DECLINE",
+	(unsigned char *)"DEL_ALL_RX_BA_SESSIONS_2_4_G_BTC",
+	(unsigned char *)"BG_SCAN_CHANNEL_LIST",
+	(unsigned char *)"MAX_MEDIUM_TIME",
+	(unsigned char *)"MAX_MPDUS_IN_AMPDU",
+	(unsigned char *)"IBSS_AUTO_BSSID",
+	(unsigned char *)"PROBE_REQ_ADDNIE_FLAG",
+	(unsigned char *)"PROBE_REQ_ADDNIE_DATA",
+	(unsigned char *)"PROBE_RSP_ADDNIE_FLAG",
+	(unsigned char *)"PROBE_RSP_ADDNIE_DATA1",
+	(unsigned char *)"PROBE_RSP_ADDNIE_DATA2",
+	(unsigned char *)"PROBE_RSP_ADDNIE_DATA3",
+	(unsigned char *)"ASSOC_RSP_ADDNIE_FLAG",
+	(unsigned char *)"ASSOC_RSP_ADDNIE_DATA",
+	(unsigned char *)"PROBE_REQ_ADDNP2PIE_FLAG",
+	(unsigned char *)"PROBE_REQ_ADDNP2PIE_DATA",
+	(unsigned char *)"PROBE_RSP_BCN_ADDNIE_FLAG",
+	(unsigned char *)"PROBE_RSP_BCN_ADDNIE_DATA",
+	(unsigned char *)"WPS_ENABLE",
+	(unsigned char *)"WPS_STATE",
+	(unsigned char *)"WPS_PROBE_REQ_FLAG",
+	(unsigned char *)"WPS_VERSION",
+	(unsigned char *)"WPS_REQUEST_TYPE",
+	(unsigned char *)"WPS_CFG_METHOD",
+	(unsigned char *)"WPS_UUID",
+	(unsigned char *)"WPS_PRIMARY_DEVICE_CATEGORY",
+	(unsigned char *)"WPS_PIMARY_DEVICE_OUI",
+	(unsigned char *)"WPS_DEVICE_SUB_CATEGORY",
+	(unsigned char *)"WPS_ASSOCIATION_STATE",
+	(unsigned char *)"WPS_CONFIGURATION_ERROR",
+	(unsigned char *)"WPS_DEVICE_PASSWORD_ID",
+	(unsigned char *)"WPS_ASSOC_METHOD",
+	(unsigned char *)"LOW_GAIN_OVERRIDE",
+	(unsigned char *)"ENABLE_PHY_AGC_LISTEN_MODE",
+	(unsigned char *)"RPE_POLLING_THRESHOLD",
+	(unsigned char *)"RPE_AGING_THRESHOLD_FOR_AC0_REG",
+	(unsigned char *)"RPE_AGING_THRESHOLD_FOR_AC1_REG",
+	(unsigned char *)"RPE_AGING_THRESHOLD_FOR_AC2_REG",
+	(unsigned char *)"RPE_AGING_THRESHOLD_FOR_AC3_REG",
+	(unsigned char *)"NO_OF_ONCHIP_REORDER_SESSIONS",
+	(unsigned char *)"SINGLE_TID_RC",
+	(unsigned char *)"RRM_ENABLED",
+	(unsigned char *)"RRM_OPERATING_CHAN_MAX",
+	(unsigned char *)"RRM_NON_OPERATING_CHAN_MAX",
+	(unsigned char *)"TX_PWR_CTRL_ENABLE",
+	(unsigned char *)"MCAST_BCAST_FILTER_SETTING",
+	(unsigned char *)"BTC_DHCP_BT_SLOTS_TO_BLOCK",
+	(unsigned char *)"DYNAMIC_PS_POLL_VALUE",
+	(unsigned char *)"PS_NULLDATA_AP_RESP_TIMEOUT",
+	(unsigned char *)"TELE_BCN_WAKEUP_EN",
+	(unsigned char *)"TELE_BCN_TRANS_LI",
+	(unsigned char *)"TELE_BCN_TRANS_LI_IDLE_BCNS",
+	(unsigned char *)"TELE_BCN_MAX_LI",
+	(unsigned char *)"TELE_BCN_MAX_LI_IDLE_BCNS",
+	(unsigned char *)"BTC_A2DP_DHCP_BT_SUB_INTERVALS",
+	(unsigned char *)"INFRA_STA_KEEP_ALIVE_PERIOD",
+	(unsigned char *)"ASSOC_STA_LIMIT",
+	(unsigned char *)"SAP_CHANNEL_SELECT_START_CHANNEL",
+	(unsigned char *)"SAP_CHANNEL_SELECT_END_CHANNEL",
+	(unsigned char *)"SAP_CHANNEL_SELECT_OPERATING_BAND",
+	(unsigned char *)"AP_DATA_AVAIL_POLL_PERIOD",
+	(unsigned char *)"ENABLE_CLOSE_LOOP",
+	(unsigned char *)"ENABLE_LTE_COEX",
+	(unsigned char *)"AP_KEEP_ALIVE_TIMEOUT",
+	(unsigned char *)"GO_KEEP_ALIVE_TIMEOUT",
+	(unsigned char *)"ENABLE_MC_ADDR_LIST",
+	(unsigned char *)"ENABLE_UC_FILTER",
+	(unsigned char *)"ENABLE_LPWR_IMG_TRANSITION",
+	(unsigned char *)"ENABLE_MCC_ADAPTIVE_SCHED",
+	(unsigned char *)"DISABLE_LDPC_WITH_TXBF_AP",
+	(unsigned char *)"AP_LINK_MONITOR_TIMEOUT",
+	(unsigned char *)"TDLS_QOS_WMM_UAPSD_MASK",
+	(unsigned char *)"TDLS_BUF_STA_ENABLED",
+	(unsigned char *)"TDLS_PUAPSD_INACT_TIME",
+	(unsigned char *)"TDLS_RX_FRAME_THRESHOLD",
 };
 
 
diff --git a/CORE/MAC/src/cfg/cfgUtil/cfg.txt b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
index 7240b7d..2d7fa87 100644
--- a/CORE/MAC/src/cfg/cfgUtil/cfg.txt
+++ b/CORE/MAC/src/cfg/cfgUtil/cfg.txt
@@ -4498,3 +4498,50 @@
 V    RW    NP
 HAL
 1    255    3
+
+*
+*TDLS Station's UAPSD MASK Configuration
+*
+*
+*
+WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK  I   4   7
+V    RW    NP
+LIM
+0    15    0
+V    RW    NP
+LIM
+0    15   0
+*
+*TDLS Stations Buffer STA Capability
+*
+*
+*
+WNI_CFG_TDLS_BUF_STA_ENABLED  I   4   7
+V    RW    NP
+LIM
+0    1    0
+V    RW    NP
+LIM
+0    1    0
+*TDLS Stations PUAPSD Inactivity Timer
+*
+*
+*
+WNI_CFG_TDLS_PUAPSD_INACT_TIME  I   4   7
+V    RW    NP
+LIM
+0    10    0
+V    RW    NP
+LIM
+0    10    0
+*TDLS Stations PUAPSD RX Frame Threshold
+*
+*
+*
+WNI_CFG_TDLS_RX_FRAME_THRESHOLD  I   4   7
+V    RW    NP
+LIM
+10   20    10
+V    RW    NP
+LIM
+10   20    10
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 7dc0cf9..4f0fb91 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -568,6 +568,12 @@
 #ifdef WLAN_FEATURE_11W
 #define SIR_HAL_EXCLUDE_UNENCRYPTED_IND    (SIR_HAL_ITC_MSG_TYPES_BEGIN + 196)
 #endif
+#ifdef FEATURE_WLAN_TDLS
+/// PE <-> HAL TDLS messages
+#define SIR_HAL_TDLS_LINK_ESTABLISH_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 197)
+#define SIR_HAL_TDLS_LINK_ESTABLISH_REQ_RSP (SIR_HAL_ITC_MSG_TYPES_BEGIN + 198)
+#define SIR_HAL_TDLS_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 199)
+#endif
 
 #define SIR_HAL_MSG_TYPES_END              (SIR_HAL_ITC_MSG_TYPES_BEGIN + 0xFF)
 // CFG message types
diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c
index e458129..a0ba77a 100644
--- a/CORE/MAC/src/pe/lim/limApi.c
+++ b/CORE/MAC/src/pe/lim/limApi.c
@@ -621,7 +621,18 @@
       limLog(pMac, LOGP, FL("cfg get disableLDPCWithTxbfAP failed"));
       return eSIR_FAILURE;
    }
-
+#ifdef FEATURE_WLAN_TDLS
+   if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_BUF_STA_ENABLED,(tANI_U32 *) &pMac->lim.gLimTDLSBufStaEnabled) != eSIR_SUCCESS)
+   {
+       limLog(pMac, LOGP, FL("cfg get LimTDLSBufStaEnabled failed"));
+       return eSIR_FAILURE;
+   }
+   if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK,(tANI_U32 *) &pMac->lim.gLimTDLSUapsdMask) != eSIR_SUCCESS)
+   {
+       limLog(pMac, LOGP, FL("cfg get LimTDLSUapsdMask failed"));
+       return eSIR_FAILURE;
+   }
+#endif
    return eSIR_SUCCESS;
 }
 
diff --git a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
index cf7b4b0..235bb3e 100644
--- a/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
+++ b/CORE/MAC/src/pe/lim/limProcessMessageQueue.c
@@ -1202,6 +1202,7 @@
         case eWNI_SME_TDLS_SEND_MGMT_REQ:
         case eWNI_SME_TDLS_ADD_STA_REQ:
         case eWNI_SME_TDLS_DEL_STA_REQ:
+        case eWNI_SME_TDLS_LINK_ESTABLISH_REQ:
 #endif
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
         case eWNI_SME_TDLS_DISCOVERY_START_REQ:
@@ -1349,7 +1350,41 @@
             limMsg->bodyptr = NULL;
          }
             break;
+#ifdef FEATURE_WLAN_TDLS
+        case SIR_HAL_TDLS_IND:
+        {
+            tSirTdlsInd  *pTdlsInd = (tpSirTdlsInd)limMsg->bodyptr ;
+            tpDphHashNode pStaDs = NULL ;
+            tpPESession psessionEntry = NULL;
+            tANI_U8             sessionId;
+            if((psessionEntry = peFindSessionByStaId(pMac,pTdlsInd->staIdx,&sessionId))== NULL)
+            {
+               limLog(pMac, LOG1, FL("session does not exist for given bssId\n"));
+               palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
+               limMsg->bodyptr = NULL;
+               return;
+            }
+            if ((pStaDs = dphGetHashEntry(pMac, pTdlsInd->assocId, &psessionEntry->dph.dphHashTable)) == NULL)
+            {
+               limLog(pMac, LOG1, FL("pStaDs Does not exist for given staId\n"));
+               palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
+               limMsg->bodyptr = NULL;
+               return;
+            }
 
+            if ((STA_ENTRY_TDLS_PEER == pStaDs->staType))
+            {
+                limLog(pMac, LOGE,
+                       FL("received TDLS Indication from the Firmware with Reason Code %d "),
+                       pTdlsInd->reasonCode);
+                limSendSmeTDLSDelStaInd(pMac, pStaDs, psessionEntry,
+                                        /*pTdlsInd->reasonCode*/eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE);
+            }
+            palFreeMemory(pMac->hHdd, (tANI_U8 *)limMsg->bodyptr);
+            limMsg->bodyptr = NULL;
+         }
+         break;
+#endif
         case SIR_HAL_P2P_NOA_ATTR_IND:
             {
                 tpPESession psessionEntry = &pMac->lim.gpSession[0];  
@@ -1888,6 +1923,14 @@
 #endif
         }
         break;
+#ifdef FEATURE_WLAN_TDLS
+        case WDA_SET_TDLS_LINK_ESTABLISH_REQ_RSP:
+        {
+            /*TODO Sunil , See how do you enhance this , Reason Code ???*/
+            limSendSmeTdlsLinkEstablishReqRsp(pMac, 0 , NULL, NULL, eSIR_SUCCESS ) ;
+            break;
+        }
+#endif
     default:
         vos_mem_free((v_VOID_t*)limMsg->bodyptr);
         limMsg->bodyptr = NULL;
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index ae2c512..3196621 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -5406,6 +5406,9 @@
         case eWNI_SME_TDLS_DEL_STA_REQ:
             limProcessSmeTdlsDelStaReq(pMac, pMsgBuf);
             break;
+        case eWNI_SME_TDLS_LINK_ESTABLISH_REQ:
+            limProcesSmeTdlsLinkEstablishReq(pMac, pMsgBuf);
+            break;
 #endif
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
         case eWNI_SME_TDLS_DISCOVERY_START_REQ:
diff --git a/CORE/MAC/src/pe/lim/limProcessTdls.c b/CORE/MAC/src/pe/lim/limProcessTdls.c
index 73f3762..cb15591 100644
--- a/CORE/MAC/src/pe/lim/limProcessTdls.c
+++ b/CORE/MAC/src/pe/lim/limProcessTdls.c
@@ -1,44 +1,23 @@
 /*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
+  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+  *
+  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+  *
+  *
+  * Permission to use, copy, modify, and/or distribute this software for
+  * any purpose with or without fee is hereby granted, provided that the
+  * above copyright notice and this permission notice appear in all
+  * copies.
+  *
+  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+  * PERFORMANCE OF THIS SOFTWARE.
+*/
 /*===========================================================================
 
                       limProcessTdls.c 
@@ -49,10 +28,9 @@
 
   Are listed for each API below.
 
-
-  Copyright (c) 2010 QUALCOMM Incorporated.
+  Copyright (c) 2010 Qualcomm Technologies, Inc. 
   All Rights Reserved.
-  Qualcomm Confidential and Proprietary
+  Qualcomm Technologies Confidential and Proprietary
 ===========================================================================*/
 
 /*===========================================================================
@@ -1199,10 +1177,10 @@
 
 tSirRetStatus limSendTdlsLinkSetupReqFrame(tpAniSirGlobal pMac,
             tSirMacAddr peerMac, tANI_U8 dialog, tpPESession psessionEntry,
-            tANI_U8 *addIe, tANI_U16 addIeLen) 
+            tANI_U8 *addIe, tANI_U16 addIeLen)
 {
     tDot11fTDLSSetupReq    tdlsSetupReq ;
-    tANI_U16            caps = 0 ;            
+    tANI_U16            caps = 0 ;
     tANI_U32            status = 0 ;
     tANI_U32            nPayload = 0 ;
     tANI_U32            nBytes = 0 ;
@@ -1217,12 +1195,12 @@
 //  As of now, we hardcoded to max channel bonding of dot11Mode (i.e HT80 for 11ac/HT40 for 11n)
 //  uint32 tdlsChannelBondingMode;
 
-    /* 
+    /*
      * The scheme here is to fill out a 'tDot11fProbeRequest' structure
      * and then hand it off to 'dot11fPackProbeRequest' (for
      * serialization).  We start by zero-initializing the structure:
      */
-    palZeroMemory( pMac->hHdd, ( tANI_U8* )&tdlsSetupReq, 
+    palZeroMemory( pMac->hHdd, ( tANI_U8* )&tdlsSetupReq,
                                       sizeof( tDot11fTDLSSetupReq ) );
     tdlsSetupReq.Category.category = SIR_MAC_ACTION_TDLS ;
     tdlsSetupReq.Action.action     = SIR_MAC_TDLS_SETUP_REQ ;
@@ -1244,9 +1222,9 @@
     swapBitField16(caps, ( tANI_U16* )&tdlsSetupReq.Capabilities );
 
     /* populate supported rate IE */
-    PopulateDot11fSuppRates( pMac, POPULATE_DOT11F_RATES_OPERATIONAL, 
+    PopulateDot11fSuppRates( pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
                               &tdlsSetupReq.SuppRates, psessionEntry );
-   
+
     /* Populate extended supported rates */
     PopulateDot11fExtSuppRates( pMac, POPULATE_DOT11F_RATES_OPERATIONAL,
                                 &tdlsSetupReq.ExtSuppRates, psessionEntry );
@@ -1254,10 +1232,10 @@
     /* Populate extended supported rates */
     PopulateDot11fTdlsExtCapability( pMac, &tdlsSetupReq.ExtCap );
 
-   /* 
+   /*
      * TODO: we need to see if we have to support conditions where we have
      * EDCA parameter info element is needed a) if we need different QOS
-     * parameters for off channel operations or QOS is not supported on 
+     * parameters for off channel operations or QOS is not supported on
      * AP link and we wanted to QOS on direct link.
      */
     /* Populate QOS info, needed for Peer U-APSD session */
@@ -1266,11 +1244,11 @@
     tdlsSetupReq.QOSCapsStation.present = 1;
     tdlsSetupReq.QOSCapsStation.max_sp_length = 0;
     tdlsSetupReq.QOSCapsStation.qack = 0;
-    tdlsSetupReq.QOSCapsStation.acbe_uapsd = 0;
-    tdlsSetupReq.QOSCapsStation.acbk_uapsd = 0;
-    tdlsSetupReq.QOSCapsStation.acvi_uapsd = 0;
-    tdlsSetupReq.QOSCapsStation.acvo_uapsd = 0;
-    
+    tdlsSetupReq.QOSCapsStation.acbe_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x08) >> 3) ;
+    tdlsSetupReq.QOSCapsStation.acbk_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x04)>> 2);
+    tdlsSetupReq.QOSCapsStation.acvi_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x02)>> 1);
+    tdlsSetupReq.QOSCapsStation.acvo_uapsd = (pMac->lim.gLimTDLSUapsdMask & 0x01);
+
 
     /*
      * we will always try to init TDLS link with 11n capabilities
@@ -1338,10 +1316,10 @@
         }
 #endif
     }
-    /* 
+    /*
      * now we pack it.  First, how much space are we going to need?
      */
-    status = dot11fGetPackedTDLSSetupReqSize( pMac, &tdlsSetupReq, 
+    status = dot11fGetPackedTDLSSetupReqSize( pMac, &tdlsSetupReq,
                                                               &nPayload);
     if ( DOT11F_FAILED( status ) )
     {
@@ -1362,7 +1340,7 @@
      * This frame is going out from PE as data frames with special ethertype
      * 89-0d.
      * 8 bytes of RFC 1042 header
-     */ 
+     */
 
 
     nBytes = nPayload + ((IS_QOS_ENABLED(psessionEntry))
@@ -1386,28 +1364,28 @@
     /* zero out the memory */
     palZeroMemory( pMac->hHdd, pFrame, nBytes );
 
-    /* 
+    /*
      * IE formation, memory allocation is completed, Now form TDLS discovery
      * request frame
      */
 
     /* fill out the buffer descriptor */
 
-    header_offset = limPrepareTdlsFrameHeader(pMac, pFrame, 
+    header_offset = limPrepareTdlsFrameHeader(pMac, pFrame,
                      LINK_IDEN_ADDR_OFFSET(tdlsSetupReq), TDLS_LINK_AP, TDLS_INITIATOR, TID_AC_BK, psessionEntry) ;
 
 #ifdef FEATURE_WLAN_TDLS_NEGATIVE
     if(pMac->lim.gLimTdlsNegativeBehavior & LIM_TDLS_NEGATIVE_WRONG_BSSID_IN_SETUP_REQ)
     {
         tdlsSetupReq.LinkIdentifier.bssid[4] = 0xde;
-        tdlsSetupReq.LinkIdentifier.bssid[5] = 0xad; 
-        VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR, 
+        tdlsSetupReq.LinkIdentifier.bssid[5] = 0xad;
+        VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
         ("TDLS negative running: wrong BSSID %02x:%02x:%02x:%02x:%02x:%02x in TDLS Setup Req"), \
-        tdlsSetupReq.LinkIdentifier.bssid[0], 
-        tdlsSetupReq.LinkIdentifier.bssid[1], 
-        tdlsSetupReq.LinkIdentifier.bssid[2], 
-        tdlsSetupReq.LinkIdentifier.bssid[3], 
-        tdlsSetupReq.LinkIdentifier.bssid[4], 
+        tdlsSetupReq.LinkIdentifier.bssid[0],
+        tdlsSetupReq.LinkIdentifier.bssid[1],
+        tdlsSetupReq.LinkIdentifier.bssid[2],
+        tdlsSetupReq.LinkIdentifier.bssid[3],
+        tdlsSetupReq.LinkIdentifier.bssid[4],
         tdlsSetupReq.LinkIdentifier.bssid[5]);
     }
 #endif
@@ -1415,7 +1393,7 @@
             __func__, tdlsSetupReq.VHTCaps.supportedChannelWidthSet, tdlsSetupReq.VHTCaps.rxMCSMap,
             tdlsSetupReq.VHTCaps.txMCSMap, tdlsSetupReq.VHTCaps.txSupDataRate );
 
-    status = dot11fPackTDLSSetupReq( pMac, &tdlsSetupReq, pFrame 
+    status = dot11fPackTDLSSetupReq( pMac, &tdlsSetupReq, pFrame
                                + header_offset, nPayload, &nPayload );
 
     if ( DOT11F_FAILED( status ) )
@@ -1432,7 +1410,7 @@
                                "Discovery Request (0x%08x).") );
     }
 
-    //Copy the additional IE. 
+    //Copy the additional IE.
     //TODO : addIe is added at the end of the frame. This means it doesnt
     //follow the order. This should be ok, but we should consider changing this
     //if there is any IOT issue.
@@ -1471,7 +1449,7 @@
 
 tSirRetStatus limSendTdlsTeardownFrame(tpAniSirGlobal pMac,
             tSirMacAddr peerMac, tANI_U16 reason, tANI_U8 responder, tpPESession psessionEntry,
-            tANI_U8 *addIe, tANI_U16 addIeLen) 
+            tANI_U8 *addIe, tANI_U16 addIeLen)
 {
     tDot11fTDLSTeardown teardown ;
     tANI_U32            status = 0 ;
@@ -1484,22 +1462,22 @@
 #ifndef NO_PAD_TDLS_MIN_8023_SIZE
     tANI_U32            padLen = 0;
 #endif
-    /* 
+    /*
      * The scheme here is to fill out a 'tDot11fProbeRequest' structure
      * and then hand it off to 'dot11fPackProbeRequest' (for
      * serialization).  We start by zero-initializing the structure:
      */
-    palZeroMemory( pMac->hHdd, ( tANI_U8* )&teardown, 
+    palZeroMemory( pMac->hHdd, ( tANI_U8* )&teardown,
                                       sizeof( tDot11fTDLSTeardown ) );
     teardown.Category.category = SIR_MAC_ACTION_TDLS ;
     teardown.Action.action     = SIR_MAC_TDLS_TEARDOWN ;
     teardown.Reason.code       = reason ;
 
-    PopulateDot11fLinkIden( pMac, psessionEntry, &teardown.LinkIdentifier, 
+    PopulateDot11fLinkIden( pMac, psessionEntry, &teardown.LinkIdentifier,
                                                 peerMac, (responder == TRUE) ? TDLS_RESPONDER : TDLS_INITIATOR) ;
 
 
-    /* 
+    /*
      * now we pack it.  First, how much space are we going to need?
      */
     status = dot11fGetPackedTDLSTeardownSize( pMac, &teardown, &nPayload);
@@ -1522,7 +1500,7 @@
      * This frame is going out from PE as data frames with special ethertype
      * 89-0d.
      * 8 bytes of RFC 1042 header
-     */ 
+     */
 
 
     nBytes = nPayload + ((IS_QOS_ENABLED(psessionEntry))
@@ -1563,28 +1541,28 @@
     /* zero out the memory */
     palZeroMemory( pMac->hHdd, pFrame, nBytes );
 
-    /* 
+    /*
      * IE formation, memory allocation is completed, Now form TDLS discovery
      * request frame
      */
 
     /* fill out the buffer descriptor */
 
-    header_offset = limPrepareTdlsFrameHeader(pMac, pFrame, 
-                     LINK_IDEN_ADDR_OFFSET(teardown), 
-                          (reason == eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE) 
+    header_offset = limPrepareTdlsFrameHeader(pMac, pFrame,
+                     LINK_IDEN_ADDR_OFFSET(teardown),
+                          (reason == eSIR_MAC_TDLS_TEARDOWN_PEER_UNREACHABLE)
                               ? TDLS_LINK_AP : TDLS_LINK_DIRECT,
                               (responder == TRUE) ? TDLS_RESPONDER : TDLS_INITIATOR,
                               TID_AC_VI, psessionEntry) ;
 
-    status = dot11fPackTDLSTeardown( pMac, &teardown, pFrame 
+    status = dot11fPackTDLSTeardown( pMac, &teardown, pFrame
                                + header_offset, nPayload, &nPayload );
 
     if ( DOT11F_FAILED( status ) )
     {
         limLog( pMac, LOGE, FL("Failed to pack a TDLS Teardown req \
                                                (0x%08x)."), status );
-        palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT, 
+        palPktFree( pMac->hHdd, HAL_TXRX_FRM_802_11_MGMT,
                                    ( void* ) pFrame, ( void* ) pPacket );
         return eSIR_FAILURE;
     }
@@ -1594,10 +1572,10 @@
                                "Teardown Request (0x%08x).") );
     }
 #if 0
-    if(pMac->hal.pCBackFnTxComp == NULL) 
+    if(pMac->hal.pCBackFnTxComp == NULL)
     {
         pMac->hal.pCBackFnTxComp = (tpCBackFnTxComp)limTdlsTeardownTxComplete;
-        if(TX_SUCCESS != tx_timer_activate(&pMac->hal.txCompTimer)) 
+        if(TX_SUCCESS != tx_timer_activate(&pMac->hal.txCompTimer))
         {
             status = eHAL_STATUS_FAILURE;
             return status;
@@ -1610,12 +1588,12 @@
         return status ;
     }
 #endif
- 
+
     if( addIeLen != 0 )
     {
     LIM_LOG_TDLS(VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR, ("Copy Additional Ie Len = %d"),
             addIeLen ));
-       palCopyMemory( pMac->hHdd, pFrame + header_offset + nPayload, addIe, addIeLen ); 
+       palCopyMemory( pMac->hHdd, pFrame + header_offset + nPayload, addIe, addIeLen );
     }
 
 #ifndef NO_PAD_TDLS_MIN_8023_SIZE
@@ -1646,7 +1624,7 @@
                             HAL_TXRX_FRM_802_11_DATA,
                             ANI_TXDIR_TODS,
                             TID_AC_VI,
-                            limTxComplete, pFrame, 
+                            limTxComplete, pFrame,
                             limMgmtTXComplete,
                             HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME );
     if ( ! HAL_STATUS_SUCCESS ( halstatus ) )
@@ -1736,10 +1714,10 @@
     tdlsSetupRsp.QOSCapsStation.present = 1;
     tdlsSetupRsp.QOSCapsStation.max_sp_length = 0;
     tdlsSetupRsp.QOSCapsStation.qack = 0;
-    tdlsSetupRsp.QOSCapsStation.acbe_uapsd = 1;
-    tdlsSetupRsp.QOSCapsStation.acbk_uapsd = 1;
-    tdlsSetupRsp.QOSCapsStation.acvi_uapsd = 1;
-    tdlsSetupRsp.QOSCapsStation.acvo_uapsd = 1;
+    tdlsSetupRsp.QOSCapsStation.acbe_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x08) >> 3);
+    tdlsSetupRsp.QOSCapsStation.acbk_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x04) >> 2);
+    tdlsSetupRsp.QOSCapsStation.acvi_uapsd = ((pMac->lim.gLimTDLSUapsdMask & 0x02) >> 1);
+    tdlsSetupRsp.QOSCapsStation.acvo_uapsd = (pMac->lim.gLimTDLSUapsdMask & 0x01);
 
     wlan_cfgGetInt(pMac,WNI_CFG_DOT11_MODE,&selfDot11Mode);
 
@@ -5110,7 +5088,7 @@
                                         tDot11fIEExtCap *extCapability)
 {
     extCapability->TDLSPeerPSMSupp = PEER_PSM_SUPPORT ;
-    extCapability->TDLSPeerUAPSDBufferSTA = PEER_BUFFER_STA_SUPPORT ;
+    extCapability->TDLSPeerUAPSDBufferSTA = pMac->lim.gLimTDLSBufStaEnabled;
     extCapability->TDLSChannelSwitching = CH_SWITCH_SUPPORT ;
     extCapability->TDLSSupport = TDLS_SUPPORT ;
     extCapability->TDLSProhibited = TDLS_PROHIBITED ;
@@ -5315,6 +5293,38 @@
 }
 
 /*
+ * Send Response to Link Establish Request to SME
+ */
+void limSendSmeTdlsLinkEstablishReqRsp(tpAniSirGlobal pMac,
+                    tANI_U8 sessionId, tSirMacAddr peerMac, tDphHashNode   *pStaDs,
+                    tANI_U8 status)
+{
+        tSirMsgQ  mmhMsg = {0} ;
+
+        tSirTdlsLinkEstablishReqRsp *pTdlsLinkEstablishReqRsp = NULL ;
+
+        if(eHAL_STATUS_SUCCESS != palAllocateMemory(pMac->hHdd,(void * *) &pTdlsLinkEstablishReqRsp,
+                (sizeof(tSirTdlsLinkEstablishReqRsp))))
+    {
+        PELOGE(limLog(pMac, LOGE, FL("Failed to allocate memory"));)
+            return ;
+    }
+    pTdlsLinkEstablishReqRsp->statusCode = status ;
+    if( peerMac )
+        {
+            palCopyMemory(pMac->hHdd, pTdlsLinkEstablishReqRsp->peerMac, peerMac, sizeof(tSirMacAddr));
+        }
+        pTdlsLinkEstablishReqRsp->sessionId = sessionId;
+    mmhMsg.type = eWNI_SME_TDLS_LINK_ESTABLISH_RSP ;
+        mmhMsg.bodyptr = pTdlsLinkEstablishReqRsp;
+    mmhMsg.bodyval = 0;
+    limSysProcessMmhMsgApi(pMac, &mmhMsg, ePROT);
+    return ;
+
+
+}
+
+/*
  * Once link is teardown, send Del Peer Ind to SME
  */
 static eHalStatus limSendSmeTdlsDelStaRsp(tpAniSirGlobal pMac, 
@@ -5490,6 +5500,99 @@
     return eSIR_SUCCESS;
 }
 
+
+/*
+ * Process Link Establishment Request from SME .
+ */
+tSirRetStatus limProcesSmeTdlsLinkEstablishReq(tpAniSirGlobal pMac,
+                                                           tANI_U32 *pMsgBuf)
+{
+    /* get all discovery request parameters */
+    tSirTdlsLinkEstablishReq *pTdlsLinkEstablishReq = (tSirTdlsLinkEstablishReq*) pMsgBuf ;
+    tpPESession psessionEntry;
+    tANI_U8      sessionId;
+    tpTdlsLinkEstablishParams pMsgTdlsLinkEstablishReq;
+    tSirMsgQ msg;
+    tANI_U16 peerIdx = 0 ;
+    tpDphHashNode pStaDs = NULL ;
+
+    VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_INFO,
+            ("Send Mgmt Recieved\n")) ;
+
+    if((psessionEntry = peFindSessionByBssid(pMac, pTdlsLinkEstablishReq->bssid, &sessionId))
+            == NULL)
+    {
+        VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
+                "PE Session does not exist for given sme sessionId %d\n",
+                pTdlsLinkEstablishReq->sessionId);
+        limSendSmeTdlsLinkEstablishReqRsp(pMac, pTdlsLinkEstablishReq->sessionId, pTdlsLinkEstablishReq->peerMac,
+             NULL, eSIR_FAILURE) ;
+        return eSIR_FAILURE;
+    }
+
+    /* check if we are in proper state to work as TDLS client */
+    if (psessionEntry->limSystemRole != eLIM_STA_ROLE)
+    {
+        VOS_TRACE(VOS_MODULE_ID_PE, VOS_TRACE_LEVEL_ERROR,
+                "TDLS Link Establish Request received in wrong system Role %d\n",
+                psessionEntry->limSystemRole);
+        goto lim_tdls_link_establish_error;
+    }
+
+    /*
+     * if we are still good, go ahead and check if we are in proper state to
+     * do TDLS discovery req/rsp/....frames.
+     */
+    if ((psessionEntry->limSmeState != eLIM_SME_ASSOCIATED_STATE) &&
+            (psessionEntry->limSmeState != eLIM_SME_LINK_EST_STATE))
+    {
+
+        limLog(pMac, LOGE, "TDLS Link Establish Request received in invalid LIMsme \
+                state (%d)\n", psessionEntry->limSmeState);
+        goto lim_tdls_link_establish_error;
+    }
+    /*TODO Sunil , TDLSPeer Entry has the STA ID , Use it */
+    pStaDs = dphLookupHashEntry(pMac, pTdlsLinkEstablishReq->peerMac, &peerIdx,
+                                &psessionEntry->dph.dphHashTable) ;
+    if ( NULL == pStaDs )
+    {
+        limLog( pMac, LOGE, FL( "pStaDs is NULL \n" ));
+        goto lim_tdls_link_establish_error;
+
+    }
+    if ( eHAL_STATUS_SUCCESS != palAllocateMemory(
+                  pMac->hHdd, (void **) &pMsgTdlsLinkEstablishReq, sizeof( tTdlsLinkEstablishParams )))
+    {
+        limLog( pMac, LOGE,
+                     FL( "Unable to allocate memory TDLS Link Establish Request \n" ));
+        return eSIR_MEM_ALLOC_FAILED;
+    }
+
+    palZeroMemory( pMac->hHdd, (tANI_U8 *)pMsgTdlsLinkEstablishReq, sizeof(tpTdlsLinkEstablishParams));
+
+    pMsgTdlsLinkEstablishReq->sta_idx = pStaDs->staIndex;
+    pMsgTdlsLinkEstablishReq->is_responder = pTdlsLinkEstablishReq->isResponder;
+    pMsgTdlsLinkEstablishReq->uapsd_queues = pTdlsLinkEstablishReq->uapsdQueues;
+    pMsgTdlsLinkEstablishReq->max_sp = pTdlsLinkEstablishReq->maxSp;
+    pMsgTdlsLinkEstablishReq->is_bufsta = pTdlsLinkEstablishReq->isBufSta;
+    msg.type = WDA_SET_TDLS_LINK_ESTABLISH_REQ;
+    msg.reserved = 0;
+    msg.bodyptr = pMsgTdlsLinkEstablishReq;
+    msg.bodyval = 0;
+    if(eSIR_SUCCESS != wdaPostCtrlMsg(pMac, &msg))
+    {
+        limLog(pMac, LOGE, FL("halPostMsgApi failed\n"));
+        goto lim_tdls_link_establish_error;
+    }
+    return eSIR_SUCCESS;
+lim_tdls_link_establish_error:
+     limSendSmeTdlsLinkEstablishReqRsp(pMac, psessionEntry->smeSessionId, pTdlsLinkEstablishReq->peerMac,
+                                       NULL, eSIR_FAILURE) ;
+
+    return eSIR_SUCCESS;
+}
+
+
 /* Delete all the TDLS peer connected before leaving the BSS */
 tSirRetStatus limDeleteTDLSPeers(tpAniSirGlobal pMac, tpPESession psessionEntry)
 {
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
index 3ef5351..bb7ac66 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.h
@@ -1,44 +1,23 @@
 /*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * Copyright (c) 2012, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
+  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+  *
+  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+  *
+  *
+  * Permission to use, copy, modify, and/or distribute this software for
+  * any purpose with or without fee is hereby granted, provided that the
+  * above copyright notice and this permission notice appear in all
+  * copies.
+  *
+  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+  * PERFORMANCE OF THIS SOFTWARE.
+*/
 /*
  * Airgo Networks, Inc proprietary. All rights reserved.
  * This file limSendSmeRspMessages.h contains the definitions for
@@ -124,6 +103,9 @@
 void limSendSmeTdlsDisRsp(tpAniSirGlobal pMac, tSirResultCodes statusCode, tANI_U16 msgType);
 void limSendSmeTdlsLinkStartRsp(tpAniSirGlobal pMac, tSirResultCodes statusCode, tSirMacAddr peerMac, tANI_U16 msgType);
 void limSendSmeTdlsTeardownRsp(tpAniSirGlobal pMac, tSirResultCodes statusCode, tSirMacAddr peerMac, tANI_U16 msgType);
+void limSendSmeTdlsLinkEstablishReqRsp(tpAniSirGlobal pMac,
+                                       tANI_U8 sessionId, tSirMacAddr peerMac, tDphHashNode   *pStaDs,
+                                       tANI_U8 status);
 #endif
 
 #endif /* __LIM_SEND_SME_RSP_H */
diff --git a/CORE/MAC/src/pe/lim/limTypes.h b/CORE/MAC/src/pe/lim/limTypes.h
index 00bff88..8f86cf9 100644
--- a/CORE/MAC/src/pe/lim/limTypes.h
+++ b/CORE/MAC/src/pe/lim/limTypes.h
@@ -739,6 +739,8 @@
                                                            tANI_U32 *pMsgBuf);
 tSirRetStatus limProcessSmeTdlsAddStaReq(tpAniSirGlobal pMac, 
                                                            tANI_U32 *pMsgBuf);
+tSirRetStatus limProcesSmeTdlsLinkEstablishReq(tpAniSirGlobal pMac,
+                                                           tANI_U32 *pMsgBuf);
 tSirRetStatus limProcessSmeTdlsDelStaReq(tpAniSirGlobal pMac, 
                                                            tANI_U32 *pMsgBuf);
 void limSendSmeTDLSDeleteAllPeerInd(tpAniSirGlobal pMac, tpPESession psessionEntry);
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 4b8b869..4708ae3 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -555,6 +555,7 @@
     eCSR_ROAM_RESULT_DELETE_TDLS_PEER,
     eCSR_ROAM_RESULT_TEARDOWN_TDLS_PEER_IND,
     eCSR_ROAM_RESULT_DELETE_ALL_TDLS_PEER_IND,
+    eCSR_ROAM_RESULT_LINK_ESTABLISH_REQ_RSP,
 #ifdef FEATURE_WLAN_TDLS_OXYGEN_DISAPPEAR_AP
     eCSR_ROAM_RESULT_TDLS_DISAPPEAR_AP_IND,
 #endif
@@ -1330,6 +1331,16 @@
 } tCsrRoamRemoveKey;
 
 #ifdef FEATURE_WLAN_TDLS
+
+typedef struct tagCsrLinkEstablishParams
+{
+    tSirMacAddr peerMac;
+    tANI_U8 uapsdQueues;
+    tANI_U8 maxSp;
+    tANI_U8 isBufSta;
+    tANI_U8 isResponder;
+}tCsrTdlsLinkEstablishParams;
+
 typedef struct tagCsrTdlsSendMgmt
 {
         tSirMacAddr peerMac;
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index 1a4ee23..c885744 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -132,6 +132,15 @@
   tANI_U8 len;
 } tTdlsSendMgmtCmdInfo;
 
+typedef struct TdlsLinkEstablishInfo
+{
+  tSirMacAddr peerMac;
+  tANI_U8 uapsdQueues;
+  tANI_U8 maxSp;
+  tANI_U8 isBufSta;
+  tANI_U8 isResponder;
+} tTdlsLinkEstablishCmdInfo;
+
 typedef struct TdlsAddStaInfo
 {
   eTdlsAddOper tdlsAddOper;
@@ -184,6 +193,7 @@
     //tEnterPeerUAPSDInfo enterUapsdInfo ;
     //tExitPeerUAPSDinfo  exitUapsdInfo ;
 #endif
+    tTdlsLinkEstablishCmdInfo tdlsLinkEstablishCmdInfo;
     tTdlsSendMgmtCmdInfo tdlsSendMgmtCmdInfo;
     tTdlsAddStaCmdInfo   tdlsAddStaCmdInfo;
     tTdlsDelStaCmdInfo   tdlsDelStaCmdInfo;
@@ -293,10 +303,15 @@
 tANI_BOOLEAN csrRoamGetConcurrencyConnectStatusForBmps(tpAniSirGlobal pMac);
 #ifdef FEATURE_WLAN_TDLS
 eHalStatus csrTdlsSendMgmtReq(tHalHandle hHal, tANI_U8 sessionId, tCsrTdlsSendMgmt *tdlsSendMgmt);
+VOS_STATUS csrTdlsSendLinkEstablishParams(tHalHandle hHal,
+                                          tANI_U8 sessionId,
+                                          tSirMacAddr peerMac,
+                                          tCsrTdlsLinkEstablishParams *tdlsLinkEstablishParams);
 eHalStatus csrTdlsAddPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac);
 eHalStatus csrTdlsChangePeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac, tCsrStaParams *pstaParams);
 eHalStatus csrTdlsDelPeerSta(tHalHandle hHal, tANI_U8 sessionId, tSirMacAddr peerMac);
 eHalStatus csrTdlsProcessCmd(tpAniSirGlobal pMac,tSmeCmd *pCommand );
+eHalStatus csrTdlsProcessLinkEstablish( tpAniSirGlobal pMac, tSmeCmd *cmd );
 eHalStatus tdlsMsgProcessor(tpAniSirGlobal pMac,v_U16_t msg_type,
                                                            void *pMsgBuf);
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
diff --git a/CORE/SME/inc/smeInternal.h b/CORE/SME/inc/smeInternal.h
index f37ce4b..24c7f6e 100644
--- a/CORE/SME/inc/smeInternal.h
+++ b/CORE/SME/inc/smeInternal.h
@@ -91,6 +91,7 @@
     eSmeCommandTdlsSendMgmt, 
     eSmeCommandTdlsAddPeer, 
     eSmeCommandTdlsDelPeer, 
+    eSmeCommandTdlsLinkEstablish,
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
     eSmeCommandTdlsDiscovery,
     eSmeCommandTdlsLinkSetup,
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 052983e..b76959a 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2714,6 +2714,21 @@
     -------------------------------------------------------------------------*/
 tANI_U8 sme_IsFeatureSupportedByFW(tANI_U8 featEnumValue);
 #ifdef FEATURE_WLAN_TDLS
+
+/* ---------------------------------------------------------------------------
+    \fn sme_SendTdlsLinkEstablishParams
+    \brief  API to send TDLS Link Establishment Parameters.
+
+    \param  peerMac - peer's Mac Adress.
+    \param  tdlsLinkEstablishParams - TDLS Peer Link Establishment Parameters
+    \- return VOS_STATUS_SUCCES
+    -------------------------------------------------------------------------*/
+
+VOS_STATUS sme_SendTdlsLinkEstablishParams(tHalHandle hHal,
+                                                   tANI_U8 sessionId,
+                                                   tSirMacAddr peerMac,
+                                                   tCsrTdlsLinkEstablishParams *tdlsLinkEstablishParams);
+
 /* ---------------------------------------------------------------------------
     \fn sme_SendTdlsMgmtFrame
     \brief  API to send TDLS management frames.
diff --git a/CORE/SME/src/csr/csrTdlsProcess.c b/CORE/SME/src/csr/csrTdlsProcess.c
index 684627d..44a8404 100644
--- a/CORE/SME/src/csr/csrTdlsProcess.c
+++ b/CORE/SME/src/csr/csrTdlsProcess.c
@@ -237,6 +237,46 @@
 
     return status ;
 }
+/*
+ * TDLS request API, called from HDD to Send Link Establishment Parameters
+ */
+VOS_STATUS csrTdlsSendLinkEstablishParams(tHalHandle hHal,
+                                                 tANI_U8 sessionId,
+                                                 tSirMacAddr peerMac,
+                                                 tCsrTdlsLinkEstablishParams *tdlsLinkEstablishParams)
+{
+    tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+    tSmeCmd *tdlsLinkEstablishCmd;
+    eHalStatus status = eHAL_STATUS_FAILURE ;
+    //If connected and in Infra. Only then allow this
+    if( CSR_IS_SESSION_VALID( pMac, sessionId ) &&
+        csrIsConnStateConnectedInfra( pMac, sessionId ) &&
+        (NULL != peerMac) )
+    {
+        tdlsLinkEstablishCmd = csrGetCommandBuffer(pMac) ;
+
+        if(tdlsLinkEstablishCmd)
+        {
+            tTdlsLinkEstablishCmdInfo *tdlsLinkEstablishCmdInfo =
+            &tdlsLinkEstablishCmd->u.tdlsCmd.u.tdlsLinkEstablishCmdInfo ;
+
+            tdlsLinkEstablishCmd->sessionId = sessionId;
+
+            palCopyMemory(pMac->hHdd, tdlsLinkEstablishCmdInfo->peerMac,
+                          peerMac, sizeof(tSirMacAddr));
+            tdlsLinkEstablishCmdInfo->isBufSta = tdlsLinkEstablishParams->isBufSta;
+            tdlsLinkEstablishCmdInfo->isResponder= tdlsLinkEstablishParams->isResponder;
+            tdlsLinkEstablishCmdInfo->maxSp= tdlsLinkEstablishParams->maxSp;
+            tdlsLinkEstablishCmdInfo->uapsdQueues= tdlsLinkEstablishParams->uapsdQueues;
+            tdlsLinkEstablishCmd->command = eSmeCommandTdlsLinkEstablish ;
+            tdlsLinkEstablishCmd->u.tdlsCmd.size = sizeof(tTdlsLinkEstablishCmdInfo) ;
+            smePushCommand(pMac, tdlsLinkEstablishCmd, FALSE) ;
+            status = eHAL_STATUS_SUCCESS ;
+        }
+    }
+
+    return status ;
+}
 
 /*
  * TDLS request API, called from HDD to add a TDLS peer
@@ -646,6 +686,15 @@
             }
         }
         break;
+        case eSmeCommandTdlsLinkEstablish:
+        {
+            status = csrTdlsProcessLinkEstablish( pMac, cmd );
+            if(HAL_STATUS_SUCCESS( status ) )
+            {
+               status = eANI_BOOLEAN_FALSE ;
+            }
+	}
+	break;
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
         case eSmeCommandTdlsDiscovery:
         {
@@ -761,6 +810,47 @@
     return status ; 
 }
 
+eHalStatus csrTdlsProcessLinkEstablish( tpAniSirGlobal pMac, tSmeCmd *cmd )
+{
+    tTdlsLinkEstablishCmdInfo *tdlsLinkEstablishCmdInfo = &cmd->u.tdlsCmd.u.tdlsLinkEstablishCmdInfo ;
+    tSirTdlsLinkEstablishReq *tdlsLinkEstablishReq = NULL ;
+    eHalStatus status = eHAL_STATUS_FAILURE;
+    tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, cmd->sessionId );
+
+    status = palAllocateMemory( pMac->hHdd, (void **)&tdlsLinkEstablishReq,
+            (sizeof(tSirTdlsLinkEstablishReq) ) );
+
+    if (!HAL_STATUS_SUCCESS( status ) )
+    {
+        smsLog( pMac, LOGE, FL("alloc failed \n") );
+        VOS_ASSERT(0) ;
+        return status ;
+    }
+    tdlsLinkEstablishReq->sessionId = cmd->sessionId;
+    //Using dialog as transactionId. This can be used to match response with request
+    tdlsLinkEstablishReq->transactionId = 0;
+    palCopyMemory(pMac->hHdd, tdlsLinkEstablishReq->peerMac,
+                  tdlsLinkEstablishCmdInfo->peerMac, sizeof(tSirMacAddr));
+    palCopyMemory(pMac->hHdd, tdlsLinkEstablishReq->bssid, pSession->pConnectBssDesc->bssId,
+                  sizeof (tSirMacAddr));
+    tdlsLinkEstablishReq->isBufSta = tdlsLinkEstablishCmdInfo->isBufSta;
+    tdlsLinkEstablishReq->isResponder= tdlsLinkEstablishCmdInfo->isResponder;
+    tdlsLinkEstablishReq->uapsdQueues= tdlsLinkEstablishCmdInfo->uapsdQueues;
+    tdlsLinkEstablishReq->maxSp= tdlsLinkEstablishCmdInfo->maxSp;
+
+
+    // Send the request to PE.
+    smsLog( pMac, LOGE, "sending TDLS Link Establish Request to PE \n" );
+    status = tdlsSendMessage(pMac, eWNI_SME_TDLS_LINK_ESTABLISH_REQ,
+                             (void *)tdlsLinkEstablishReq,
+                             sizeof(tSirTdlsLinkEstablishReq));
+    if (!HAL_STATUS_SUCCESS( status ) )
+    {
+        smsLog( pMac, LOGE, FL("Failed to send request to MAC\n"));
+    }
+    return status;
+}
+
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
 /*
  * Find specific TDLS peer (based on peer MAC address).
@@ -997,6 +1087,24 @@
 
             csrRoamCallCallback(pMac, pSirTdlsDelAllPeerInd->sessionId, &roamInfo,
                                 0, eCSR_ROAM_RESULT_MGMT_TX_COMPLETE_IND, 0);
+            break;
+        }
+        case eWNI_SME_TDLS_LINK_ESTABLISH_RSP:
+	{
+            tSirTdlsLinkEstablishReqRsp *linkEstablishReqRsp = (tSirTdlsLinkEstablishReqRsp *) pMsgBuf ;
+            tCsrRoamInfo roamInfo = {0} ;
+#if 0
+            palCopyMemory(pMac->hHdd, &roamInfo.peerMac, delStaRsp->peerMac,
+                                         sizeof(tSirMacAddr)) ;
+            roamInfo.staId = delStaRsp->staId ;
+            roamInfo.statusCode = delStaRsp->statusCode ;
+#endif
+            csrRoamCallCallback(pMac, linkEstablishReqRsp->sessionId, &roamInfo, 0,
+                         eCSR_ROAM_TDLS_STATUS_UPDATE,
+                               eCSR_ROAM_RESULT_LINK_ESTABLISH_REQ_RSP);
+            /* remove pending eSmeCommandTdlsLinkEstablish command */
+            csrTdlsRemoveSmeCmd(pMac, eSmeCommandTdlsLinkEstablish);
+            break;
         }
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
         case eWNI_SME_TDLS_DISCOVERY_START_RSP:
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index e97000a..a14ac58 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -789,6 +789,7 @@
                         case eSmeCommandTdlsSendMgmt:     
                         case eSmeCommandTdlsAddPeer:
                         case eSmeCommandTdlsDelPeer:
+                        case eSmeCommandTdlsLinkEstablish:
 #ifdef FEATURE_WLAN_TDLS_INTERNAL
                         case eSmeCommandTdlsDiscovery:
                         case eSmeCommandTdlsLinkSetup:
@@ -1716,6 +1717,7 @@
           case eWNI_SME_TDLS_DEL_STA_IND:
           case eWNI_SME_TDLS_DEL_ALL_PEER_IND:
           case eWNI_SME_MGMT_FRM_TX_COMPLETION_IND:
+          case eWNI_SME_TDLS_LINK_ESTABLISH_RSP:
 #ifdef FEATURE_WLAN_TDLS_OXYGEN_DISAPPEAR_AP
           case eWNI_SME_TDLS_AP_DISAPPEAR_IND:
 #endif
@@ -8071,6 +8073,33 @@
    return IS_FEATURE_SUPPORTED_BY_FW(featEnumValue);
 }
 #ifdef FEATURE_WLAN_TDLS
+
+/* ---------------------------------------------------------------------------
+    \fn sme_SendTdlsMgmtFrame
+    \brief  API to send TDLS management frames.
+
+    \param  peerMac - peer's Mac Adress.
+    \param  tdlsLinkEstablishParams - TDLS Peer Link Establishment Parameters
+    \- return VOS_STATUS_SUCCES
+    -------------------------------------------------------------------------*/
+VOS_STATUS sme_SendTdlsLinkEstablishParams(tHalHandle hHal,
+                                                   tANI_U8 sessionId,
+                                                   tSirMacAddr peerMac,
+                                                   tCsrTdlsLinkEstablishParams *tdlsLinkEstablishParams)
+{
+    eHalStatus          status    = eHAL_STATUS_SUCCESS;
+    tpAniSirGlobal      pMac      = PMAC_STRUCT(hHal);
+
+    status = sme_AcquireGlobalLock( &pMac->sme );
+
+    if ( HAL_STATUS_SUCCESS( status ) )
+    {
+        status = csrTdlsSendLinkEstablishParams(hHal, sessionId, peerMac, tdlsLinkEstablishParams) ;
+        sme_ReleaseGlobalLock( &pMac->sme );
+    }
+   return status ;
+}
+
 /* ---------------------------------------------------------------------------
     \fn sme_SendTdlsMgmtFrame
     \brief  API to send TDLS management frames.
diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c
index 3869fc5..0716816 100644
--- a/CORE/TL/src/wlan_qct_tl.c
+++ b/CORE/TL/src/wlan_qct_tl.c
@@ -10520,24 +10520,36 @@
 
   /*Set this flag in order to remember that this is a trigger enabled AC*/
   pTLCb->atlSTAClients[ucSTAId]->wUAPSDInfo[ucAC].ucSet = 1;
-  
-  TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
-             "WLAN TL:Enabling U-APSD in FW for STA: %d AC: %d SI: %d SPI: %d "
-             "DI: %d",
-             ucSTAId, ucAC, uServiceInt, uSuspendInt,
-             pTLCb->tlConfigInfo.uDelayedTriggerFrmInt));
 
-  /*Save all info for HAL*/
-  halUAPSDInfo.staidx         = ucSTAId; 
-  halUAPSDInfo.ac             = ucAC;   
-  halUAPSDInfo.up             = ucUP;   
-  halUAPSDInfo.srvInterval    = uServiceInt;  
-  halUAPSDInfo.susInterval    = uSuspendInt;
-  halUAPSDInfo.delayInterval  = pTLCb->tlConfigInfo.uDelayedTriggerFrmInt; 
+#ifdef FEATURE_WLAN_TDLS
+  if(pTLCb->atlSTAClients[ucSTAId]->wSTADesc.wSTAType != WLAN_STA_TDLS)
+#endif
+  {
+    if( 0 == uServiceInt )
+    {
+      TLLOGE(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR,
+               "WLAN TL:Invalid input params on WLANTL_EnableUAPSDForAC"
+               " SI: %d", uServiceInt ));
+      return VOS_STATUS_E_FAULT;
+    }
 
-  /*Notify HAL*/
-  vosStatus = WDA_EnableUapsdAcParams(pvosGCtx, ucSTAId, &halUAPSDInfo);
+    TLLOG2(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_HIGH,
+               "WLAN TL:Enabling U-APSD in FW for STA: %d AC: %d SI: %d SPI: %d "
+               "DI: %d",
+               ucSTAId, ucAC, uServiceInt, uSuspendInt,
+               pTLCb->tlConfigInfo.uDelayedTriggerFrmInt));
 
+    /*Save all info for HAL*/
+    halUAPSDInfo.staidx         = ucSTAId;
+    halUAPSDInfo.ac             = ucAC;
+    halUAPSDInfo.up             = ucUP;
+    halUAPSDInfo.srvInterval    = uServiceInt;
+    halUAPSDInfo.susInterval    = uSuspendInt;
+    halUAPSDInfo.delayInterval  = pTLCb->tlConfigInfo.uDelayedTriggerFrmInt;
+
+    /*Notify HAL*/
+    vosStatus = WDA_EnableUapsdAcParams(pvosGCtx, ucSTAId, &halUAPSDInfo);
+  }
   return vosStatus;
 
 }/*WLANTL_EnableUAPSDForAC*/
diff --git a/CORE/WDA/inc/legacy/halMsgApi.h b/CORE/WDA/inc/legacy/halMsgApi.h
index 98a8bbd..32a1755 100644
--- a/CORE/WDA/inc/legacy/halMsgApi.h
+++ b/CORE/WDA/inc/legacy/halMsgApi.h
@@ -1318,6 +1318,15 @@
    tANI_U8   psSelection;
 }tP2pPsParams, *tpP2pPsParams;
 
+typedef struct sTdlsLinkEstablishParams
+{
+   tANI_U16  sta_idx;
+   tANI_U8   is_responder;
+   tANI_U8   uapsd_queues;
+   tANI_U8   max_sp;
+   tANI_U8   is_bufsta;
+}tTdlsLinkEstablishParams, *tpTdlsLinkEstablishParams;
+
 static inline void halGetTxTSFtimer(tpAniSirGlobal pMac, 
                                                 tSirMacTimeStamp *pTime)
 {
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 8938dec..6443ebb 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1006,6 +1006,8 @@
 #define WDA_DEL_STA_SELF_REQ           SIR_HAL_DEL_STA_SELF_REQ
 
 #define WDA_SET_P2P_GO_NOA_REQ         SIR_HAL_SET_P2P_GO_NOA_REQ
+#define WDA_SET_TDLS_LINK_ESTABLISH_REQ SIR_HAL_TDLS_LINK_ESTABLISH_REQ
+#define WDA_SET_TDLS_LINK_ESTABLISH_REQ_RSP SIR_HAL_TDLS_LINK_ESTABLISH_REQ_RSP
 
 #define WDA_TX_COMPLETE_TIMEOUT_IND  (WDA_MSG_TYPES_END - 1)
 #define WDA_WLAN_SUSPEND_IND           SIR_HAL_WLAN_SUSPEND_IND
diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c
index 72ca23e..478863b 100644
--- a/CORE/WDA/src/wlan_qct_wda.c
+++ b/CORE/WDA/src/wlan_qct_wda.c
@@ -1478,6 +1478,61 @@
 
    tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
                             + sizeof(tHalCfg) + tlvStruct->length) ;
+#ifdef FEATURE_WLAN_TDLS
+   /* QWLAN_HAL_CFG_TDLS_PUAPSD_MASK  */
+   tlvStruct->type = QWLAN_HAL_CFG_TDLS_PUAPSD_MASK;
+   tlvStruct->length = sizeof(tANI_U32);
+   configDataValue = (tANI_U32 *)(tlvStruct + 1);
+   if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK,
+                                            configDataValue ) != eSIR_SUCCESS)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+               "Failed to get value for WNI_CFG_TDLS_QOS_WMM_UAPSD_MASK");
+      goto handle_failure;
+   }
+   tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
+                            + sizeof(tHalCfg) + tlvStruct->length) ;
+
+   /* QWLAN_HAL_CFG_TDLS_PUAPSD_BUFFER_STA_CAPABLE  */
+   tlvStruct->type = QWLAN_HAL_CFG_TDLS_PUAPSD_BUFFER_STA_CAPABLE;
+   tlvStruct->length = sizeof(tANI_U32);
+   configDataValue = (tANI_U32 *)(tlvStruct + 1);
+   if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_BUF_STA_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) ;
+   /* QWLAN_HAL_CFG_TDLS_PUAPSD_INACTIVITY_TIME */
+   tlvStruct->type = QWLAN_HAL_CFG_TDLS_PUAPSD_INACTIVITY_TIME;
+   tlvStruct->length = sizeof(tANI_U32);
+   configDataValue = (tANI_U32 *)(tlvStruct + 1);
+   if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_PUAPSD_INACT_TIME,
+                                            configDataValue ) != eSIR_SUCCESS)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+               "Failed to get value for WNI_CFG_TDLS_PUAPSD_INACT_TIME");
+      goto handle_failure;
+   }
+   tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
+                            + sizeof(tHalCfg) + tlvStruct->length) ;
+   /* QWLAN_HAL_CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_IN_SP */
+   tlvStruct->type = QWLAN_HAL_CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_IN_SP;
+   tlvStruct->length = sizeof(tANI_U32);
+   configDataValue = (tANI_U32 *)(tlvStruct + 1);
+   if(wlan_cfgGetInt(pMac, WNI_CFG_TDLS_RX_FRAME_THRESHOLD,
+                                            configDataValue ) != eSIR_SUCCESS)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+               "Failed to get value for WNI_CFG_TDLS_RX_FRAME_THRESHOLD");
+      goto handle_failure;
+   }
+   tlvStruct = (tHalCfg *)( (tANI_U8 *) tlvStruct
+                            + sizeof(tHalCfg) + tlvStruct->length) ;
+#endif
 
    wdiStartParams->usConfigBufferLen = (tANI_U8 *)tlvStruct - tlvStructStart ;
 #ifdef WLAN_DEBUG
@@ -6365,6 +6420,107 @@
    return CONVERT_WDI2VOS_STATUS(status);
 
 }
+
+#ifdef FEATURE_WLAN_TDLS
+/*
+ * FUNCTION: WDA_SetP2PGONOAReqParamsCallback
+ *  Free the memory. No need to send any response to PE in this case
+ */
+void WDA_SetTDLSLinkEstablishReqParamsCallback(WDI_Status status, void* pUserData)
+{
+   tWDA_ReqParams *pWdaParams = (tWDA_ReqParams *)pUserData;
+   tWDA_CbContext *pWDA = NULL;
+
+
+   VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+                                          "<------ %s " ,__func__);
+   if(NULL == pWdaParams)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+              "%s: pWdaParams received NULL", __func__);
+      VOS_ASSERT(0) ;
+      return ;
+   }
+   pWDA = (tWDA_CbContext *) pWdaParams->pWdaContext;
+
+   if(NULL == pWdaParams)
+   {
+      VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+              "%s: pWdaParams received NULL", __func__);
+      VOS_ASSERT(0) ;
+      return ;
+   }
+   /* send response to UMAC*/
+   WDA_SendMsg(pWDA, WDA_SET_TDLS_LINK_ESTABLISH_REQ_RSP, NULL , 0) ;
+
+   vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
+   vos_mem_free(pWdaParams->wdaMsgParam) ;
+   vos_mem_free(pWdaParams);
+   return ;
+}
+
+VOS_STATUS WDA_ProcessSetTdlsLinkEstablishReq(tWDA_CbContext *pWDA,
+                                              tTdlsLinkEstablishParams *pTdlsLinkEstablishParams)
+{
+    WDI_Status status = WDI_STATUS_SUCCESS ;
+    WDI_SetTDLSLinkEstablishReqParamsType *wdiSetTDLSLinkEstablishReqParam =
+                                      (WDI_SetTDLSLinkEstablishReqParamsType *)vos_mem_malloc(
+                                           sizeof(WDI_SetTDLSLinkEstablishReqParamsType)) ;
+    tWDA_ReqParams *pWdaParams = NULL;
+    VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO,
+               "------> %s " ,__func__);
+    if(NULL == wdiSetTDLSLinkEstablishReqParam)
+    {
+        VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                   "%s: VOS MEM Alloc Failure", __func__);
+        VOS_ASSERT(0);
+        return VOS_STATUS_E_NOMEM;
+    }
+    pWdaParams = (tWDA_ReqParams *)vos_mem_malloc(sizeof(tWDA_ReqParams)) ;
+    if(NULL == pWdaParams)
+    {
+        VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                   "%s: VOS MEM Alloc Failure", __func__);
+        vos_mem_free(pTdlsLinkEstablishParams);
+        vos_mem_free(wdiSetTDLSLinkEstablishReqParam);
+        VOS_ASSERT(0);
+        return VOS_STATUS_E_NOMEM;
+    }
+    wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uStaIdx =
+                                                  pTdlsLinkEstablishParams->sta_idx;
+    wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uIsResponder =
+                                                  pTdlsLinkEstablishParams->is_responder;
+    wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uUapsdQueues =
+                                                  pTdlsLinkEstablishParams->uapsd_queues;
+    wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uMaxSp =
+                                                  pTdlsLinkEstablishParams->max_sp;
+    wdiSetTDLSLinkEstablishReqParam->wdiTDLSLinkEstablishInfo.uIsBufSta =
+                                                  pTdlsLinkEstablishParams->is_bufsta;
+
+    wdiSetTDLSLinkEstablishReqParam->wdiReqStatusCB = NULL ;
+    /* Store msg pointer from PE, as this will be used for response */
+    pWdaParams->wdaMsgParam = (void *)pTdlsLinkEstablishParams ;
+    /* store Params pass it to WDI */
+    pWdaParams->wdaWdiApiMsgParam = (void *)wdiSetTDLSLinkEstablishReqParam ;
+    pWdaParams->pWdaContext = pWDA;
+
+    status = WDI_SetTDLSLinkEstablishReq(wdiSetTDLSLinkEstablishReqParam,
+                                         (WDI_SetTDLSLinkEstablishReqParamsRspCb)
+                                         WDA_SetTDLSLinkEstablishReqParamsCallback,
+                                         pWdaParams);
+    if(IS_WDI_STATUS_FAILURE(status))
+    {
+        VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                   "Failure in Set P2P GO NOA Req WDI API, free all the memory " );
+        vos_mem_free(pWdaParams->wdaWdiApiMsgParam) ;
+        vos_mem_free(pWdaParams->wdaMsgParam);
+        vos_mem_free(pWdaParams);
+    }
+    return CONVERT_WDI2VOS_STATUS(status);
+}
+#endif
+
+
 #ifdef WLAN_FEATURE_VOWIFI_11R
 /*
  * FUNCTION: WDA_AggrAddTSReqCallback
@@ -11005,6 +11161,13 @@
          break;
       }
 #endif
+#ifdef FEATURE_WLAN_TDLS
+      case WDA_SET_TDLS_LINK_ESTABLISH_REQ:
+      {
+          WDA_ProcessSetTdlsLinkEstablishReq(pWDA, (tTdlsLinkEstablishParams *)pMsg->bodyptr);
+          break;
+      }
+#endif
       default:
       {
          VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
@@ -11266,6 +11429,32 @@
           break;
       }
 
+#ifdef FEATURE_WLAN_TDLS
+      case WDI_TDLS_IND :
+      {
+          tSirTdlsInd  *pTdlsInd =
+             (tSirTdlsInd *)vos_mem_malloc(sizeof(tSirTdlsInd));
+
+          if (NULL == pTdlsInd)
+          {
+             VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR,
+                        "Memory allocation failure, "
+                        "WDI_TDLS_IND not forwarded");
+             break;
+          }
+          pTdlsInd->status            =
+                     wdiLowLevelInd->wdiIndicationData.wdiTdlsIndInfo.status;
+          pTdlsInd->assocId        =
+                     wdiLowLevelInd->wdiIndicationData.wdiTdlsIndInfo.assocId;
+          pTdlsInd->staIdx =
+                     wdiLowLevelInd->wdiIndicationData.wdiTdlsIndInfo.staIdx;
+          pTdlsInd->reasonCode    =
+                     wdiLowLevelInd->wdiIndicationData.wdiTdlsIndInfo.reasonCode;
+          WDA_SendMsg(pWDA, SIR_HAL_TDLS_IND,
+                                        (void *)pTdlsInd , 0) ;
+          break;
+      }
+#endif
       case WDI_P2P_NOA_ATTR_IND :
       {
          tSirP2PNoaAttr   *pP2pNoaAttr = 
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi.h b/CORE/WDI/CP/inc/wlan_qct_wdi.h
index 50416eb..d18d099 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi.h
@@ -390,6 +390,9 @@
   /* P2P_NOA_Start_Indication */
   WDI_P2P_NOA_START_IND,
 
+  /* TDLS_Indication */
+  WDI_TDLS_IND,
+
   WDI_MAX_IND
 }WDI_LowLevelIndEnumType;
 
@@ -551,6 +554,16 @@
   wpt_uint32      bssIdx;
 }WDI_P2pNoaStartIndType;
 
+/*---------------------------------------------------------------------------
+ *WDI_TdlsIndType
+ *-------------------------------------------------------------------------*/
+typedef struct
+{
+  wpt_uint16      status;
+  wpt_uint16      assocId;
+  wpt_uint16      staIdx;
+  wpt_uint16      reasonCode;
+}WDI_TdlsIndType;
 
 #ifdef WLAN_WAKEUP_EVENTS
 /*---------------------------------------------------------------------------
@@ -615,6 +628,8 @@
     /* P2P NOA ATTR Indication */
     WDI_P2pNoaAttrIndType        wdiP2pNoaAttrInfo;
     WDI_P2pNoaStartIndType       wdiP2pNoaStartInfo;
+    /* TDLS Indications */
+    WDI_TdlsIndType              wdiTdlsIndInfo;
 
 
 #ifdef FEATURE_WLAN_SCAN_PNO
@@ -3052,6 +3067,33 @@
   void*             pUserData;
 }WDI_SetP2PGONOAReqParamsType;
 
+typedef struct
+{
+    wpt_uint16 uStaIdx;
+    wpt_uint8  uIsResponder;
+    wpt_uint8  uUapsdQueues;
+    wpt_uint8  uMaxSp;
+    wpt_uint8  uIsBufSta;
+}WDI_SetTDLSLinkEstablishReqInfoType;
+/*---------------------------------------------------------------------------
+  WDI_SetTDLSLinkEstablishReqParamsType
+---------------------------------------------------------------------------*/
+typedef struct
+{
+  /*TDLS Link Establish Req*/
+  WDI_SetTDLSLinkEstablishReqInfoType  wdiTDLSLinkEstablishInfo;
+
+  /*Request status callback offered by UMAC - it is called if the current
+    req has returned PENDING as status; it delivers the status of sending
+    the message over the BUS */
+  WDI_ReqStatusCb   wdiReqStatusCB;
+
+  /*The user data passed in by UMAC, it will be sent back when the above
+    function pointer will be called */
+  void*             pUserData;
+}WDI_SetTDLSLinkEstablishReqParamsType;
+
+
 
 /*---------------------------------------------------------------------------
   WDI_SetAddSTASelfParamsType
@@ -5713,6 +5755,27 @@
 typedef void  (*WDI_SetP2PGONOAReqParamsRspCb)(WDI_Status   wdiStatus,
                                 void*        pUserData);
 
+/*---------------------------------------------------------------------------
+   WDI_SetTDLSLinkEstablishReqParamsRspCb
+
+   DESCRIPTION
+
+   This callback is invoked by DAL when it has received a TDLS Link Establish Req response from
+   the underlying device.
+
+   PARAMETERS
+
+    IN
+    wdiStatus:  response status received from HAL
+    pUserData:  user data
+
+
+
+  RETURN VALUE
+    The result code associated with performing the operation
+---------------------------------------------------------------------------*/
+typedef void  (*WDI_SetTDLSLinkEstablishReqParamsRspCb)(WDI_Status   wdiStatus,
+                                void*        pUserData);
 
 /*---------------------------------------------------------------------------
    WDI_SetPwrSaveCfgCb
@@ -7771,6 +7834,37 @@
   void*                            pUserData
 );
 
+/**
+ @brief WDI_SetTDLSLinkEstablishReq will be called when the
+        upper MAC wants to send TDLS Link Establish Request Parameters
+         Upon the call of this API the WLAN DAL will
+        pack and send the TDLS Link Establish Request  message to the
+        lower RIVA sub-system if DAL is in state STARTED.
+
+        In state BUSY this request will be queued. Request won't
+        be allowed in any other state.
+
+
+ @param pwdiTDLSLinkEstablishReqParams: TDLS Peer Parameters
+        for Link Establishment (Used for PUAPSD , TDLS Off Channel ...)
+
+        wdiTDLSLinkEstablishReqRspCb: callback for passing back the
+        response of the TDLS Link Establish request received
+        from the device
+
+        pUserData: user data will be passed back with the
+        callback
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_SetTDLSLinkEstablishReq
+(
+  WDI_SetTDLSLinkEstablishReqParamsType*    pwdiTDLSLinkEstablishReqParams,
+  WDI_SetTDLSLinkEstablishReqParamsRspCb    wdiTDLSLinkEstablishReqRspCb,
+  void*                            pUserData
+);
 
 /*======================================================================== 
  
diff --git a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
index b653813..50a77ee 100644
--- a/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
+++ b/CORE/WDI/CP/inc/wlan_qct_wdi_i.h
@@ -446,6 +446,9 @@
   /*WLAN DAL Set Tx Power Request*/
   WDI_SET_TX_POWER_REQ                          = 82,
   WDI_ROAM_SCAN_OFFLOAD_REQ                     = 83,
+
+  WDI_TDLS_LINK_ESTABLISH_REQ                   = 84,
+
   WDI_MAX_REQ,
 
   /*Send a suspend Indication down to HAL*/
@@ -712,6 +715,8 @@
 
   WDI_SET_TX_POWER_RESP                         = 81,
   WDI_ROAM_SCAN_OFFLOAD_RESP                    = 82,
+
+  WDI_TDLS_LINK_ESTABLISH_REQ_RESP              = 83,
   /*-------------------------------------------------------------------------
     Indications
      !! Keep these last in the enum if possible
@@ -759,6 +764,9 @@
   /* NOA Start Indication from FW to Host */
   WDI_HAL_P2P_NOA_START_IND            = WDI_HAL_IND_MIN + 12,
 
+  /* TDLS Indication from FW to Host */
+  WDI_HAL_TDLS_IND                     = WDI_HAL_IND_MIN + 13,
+
   WDI_MAX_RESP
 }WDI_ResponseEnumType; 
 
@@ -2221,6 +2229,23 @@
 );
 
 /**
+ @brief Process TDLS Link Establish Request function (called when Main FSM
+        allows it)
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessTdlsLinkEstablishReq
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+);
+
+/**
  @brief Process Enter IMPS Request function (called when 
         Main FSM allows it)
  
@@ -3407,6 +3432,23 @@
   WDI_EventInfoType*             pEventData
 );
 
+  /**
+ @brief Process TDLS Link Establish Req Rsp function (called when a response
+        is being received over the bus from HAL)
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessLinkEstablishReqRsp
+(
+  WDI_ControlBlockType*          pWDICtx,
+  WDI_EventInfoType*             pEventData
+);
+
 /**
  @brief Process Nv download(called when a response
         is being received over the bus from HAL)
@@ -4070,6 +4112,24 @@
 );
 
 /**
+*@brief Process Tdls Indication function (called when
+        an indication of this kind is being received over the
+        bus from HAL)
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessTdlsInd
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+);
+
+/**
 *@brief Process Noa Start Indication function (called when
         an indication of this kind is being received over the
         bus from HAL)
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi.c b/CORE/WDI/CP/src/wlan_qct_wdi.c
index 2884177..a113a8e 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi.c
@@ -359,6 +359,11 @@
 #else
   NULL,
 #endif /* WLAN_FEATURE_ROAM_SCAN_OFFLOAD */
+#ifdef FEATURE_WLAN_TDLS
+  WDI_ProcessTdlsLinkEstablishReq,       /* WDI_TDLS_LINK_ESTABLISH_REQ */
+#else
+ NULL,
+#endif
   /*-------------------------------------------------------------------------
     Indications
   -------------------------------------------------------------------------*/
@@ -542,6 +547,11 @@
 #else
     NULL,
 #endif
+#ifdef FEATURE_WLAN_TDLS
+  WDI_ProcessLinkEstablishReqRsp,       /*WDI_TDLS_LINK_ESTABLISH_REQ_RESP*/
+#else
+  NULL,
+#endif
   /*---------------------------------------------------------------------
     Indications
   ---------------------------------------------------------------------*/
@@ -573,6 +583,11 @@
   WDI_ProcessTxPerHitInd,               /* WDI_HAL_TX_PER_HIT_IND  */
 
   WDI_ProcessP2pNoaStartInd,             /* WDI_NOA_START_IND */
+#ifdef FEATURE_WLAN_TDLS
+  WDI_ProcessTdlsInd,                   /* WDI_HAL_TDLS_IND */
+#else
+  NULL,
+#endif
 };
 
 
@@ -829,6 +844,9 @@
     CASE_RETURN_STRING( WDI_RMV_STA_BCAST_KEY_REQ );
     CASE_RETURN_STRING( WDI_SET_MAX_TX_POWER_REQ );
     CASE_RETURN_STRING( WDI_P2P_GO_NOTICE_OF_ABSENCE_REQ );
+#ifdef FEATURE_WLAN_TDLS
+    CASE_RETURN_STRING( WDI_TDLS_LINK_ESTABLISH_REQ );
+#endif
     CASE_RETURN_STRING( WDI_ENTER_IMPS_REQ );
     CASE_RETURN_STRING( WDI_EXIT_IMPS_REQ );
     CASE_RETURN_STRING( WDI_ENTER_BMPS_REQ );
@@ -933,6 +951,10 @@
     CASE_RETURN_STRING( WDI_RMV_STA_BCAST_KEY_RESP );
     CASE_RETURN_STRING( WDI_SET_MAX_TX_POWER_RESP );
     CASE_RETURN_STRING( WDI_P2P_GO_NOTICE_OF_ABSENCE_RESP );
+#ifdef FEATURE_WLAN_TDLS
+    CASE_RETURN_STRING( WDI_TDLS_LINK_ESTABLISH_REQ_RESP );
+    CASE_RETURN_STRING( WDI_HAL_TDLS_IND );
+#endif
     CASE_RETURN_STRING( WDI_ENTER_IMPS_RESP );
     CASE_RETURN_STRING( WDI_EXIT_IMPS_RESP );
     CASE_RETURN_STRING( WDI_ENTER_BMPS_RESP );
@@ -5271,6 +5293,67 @@
 
 }/*WDI_SetP2PGONOAReq*/
 
+#ifdef FEATURE_WLAN_TDLS
+/**
+ @brief WDI_SetTDLSLinkEstablishReq will be called when the
+        upper MAC wants to send TDLS Link Establish Request Parameters
+         Upon the call of this API the WLAN DAL will
+        pack and send the TDLS Link Establish Request  message to the
+        lower RIVA sub-system if DAL is in state STARTED.
+
+        In state BUSY this request will be queued. Request won't
+        be allowed in any other state.
+
+
+ @param pwdiTDLSLinkEstablishReqParams: TDLS Peer Parameters
+        for Link Establishment (Used for PUAPSD , TDLS Off Channel ...)
+
+        wdiTDLSLinkEstablishReqRspCb: callback for passing back the
+        response of the TDLS Link Establish request received
+        from the device
+
+        pUserData: user data will be passed back with the
+        callback
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_SetTDLSLinkEstablishReq
+(
+  WDI_SetTDLSLinkEstablishReqParamsType*    pwdiTDLSLinkEstablishReqParams,
+  WDI_SetTDLSLinkEstablishReqParamsRspCb    wdiTDLSLinkEstablishReqRspCb,
+  void*                            pUserData
+)
+{
+  WDI_EventInfoType      wdiEventData;
+  /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+  /*------------------------------------------------------------------------
+    Sanity Check
+  ------------------------------------------------------------------------*/
+  if ( eWLAN_PAL_FALSE == gWDIInitialized )
+  {
+    WPAL_TRACE(eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_ERROR,
+              "WDI API call before module is initialized - Fail request");
+
+    return WDI_STATUS_E_NOT_ALLOWED;
+  }
+
+  /*------------------------------------------------------------------------
+    Fill in Event data and post to the Main FSM
+  ------------------------------------------------------------------------*/
+  wdiEventData.wdiRequest      = WDI_TDLS_LINK_ESTABLISH_REQ;
+  wdiEventData.pEventData      = pwdiTDLSLinkEstablishReqParams;
+  wdiEventData.uEventDataSize  = sizeof(*pwdiTDLSLinkEstablishReqParams);
+  wdiEventData.pCBfnc          = wdiTDLSLinkEstablishReqRspCb;
+  wdiEventData.pUserData       = pUserData;
+
+  return WDI_PostMainEvent(&gWDICb, WDI_REQUEST_EVENT, &wdiEventData);
+
+}/*WDI_SetTDLSLinkEstablishReq*/
+#endif
+
 /**
  @brief WDI_AddSTASelfReq will be called when the
         UMAC wanted to add STA self while opening any new session
@@ -12222,6 +12305,104 @@
                        WDI_P2P_GO_NOTICE_OF_ABSENCE_RESP);
 }/*WDI_ProcessP2PGONOAReq*/
 
+#ifdef FEATURE_WLAN_TDLS
+
+/**
+ @brief Process P2P Notice Of Absence Request function (called when Main FSM
+        allows it)
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessTdlsLinkEstablishReq
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+)
+{
+  WDI_SetTDLSLinkEstablishReqParamsType* pwdiTDLSLinkEstablishReqParams;
+  WDI_SetTDLSLinkEstablishReqParamsRspCb wdiTDLSLinkEstablishReqRspCb;
+  wpt_uint8*                             pSendBuffer         = NULL;
+  wpt_uint16                             usDataOffset        = 0;
+  wpt_uint16                             usSendSize          = 0;
+
+  tTDLSLinkEstablishedType               halSetTDLSLinkEstablishParams;
+  /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+  /*-------------------------------------------------------------------------
+    Sanity check
+  -------------------------------------------------------------------------*/
+  if (( NULL == pEventData ) ||
+      ( NULL == pEventData->pEventData) ||
+      ( NULL == pEventData->pCBfnc))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+                 "%s: Invalid parameters", __func__);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+  pwdiTDLSLinkEstablishReqParams =
+    (WDI_SetTDLSLinkEstablishReqParamsType*)pEventData->pEventData;
+  wdiTDLSLinkEstablishReqRspCb =
+    (WDI_SetTDLSLinkEstablishReqParamsRspCb)pEventData->pCBfnc;
+
+
+  /*-----------------------------------------------------------------------
+    Get message buffer
+  -----------------------------------------------------------------------*/
+  if (( WDI_STATUS_SUCCESS != WDI_GetMessageBuffer( pWDICtx,
+                        WDI_TDLS_LINK_ESTABLISH_REQ,
+                        sizeof(halSetTDLSLinkEstablishParams),
+                        &pSendBuffer, &usDataOffset, &usSendSize))||
+      ( usSendSize < (usDataOffset + sizeof(halSetTDLSLinkEstablishParams) )))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL,  eWLAN_PAL_TRACE_LEVEL_WARN,
+              "Unable to get send buffer in set P2P GO NOA REQ %x %x %x",
+     pEventData, pwdiTDLSLinkEstablishReqParams, wdiTDLSLinkEstablishReqRspCb);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+
+  halSetTDLSLinkEstablishParams.staIdx =
+                           pwdiTDLSLinkEstablishReqParams->wdiTDLSLinkEstablishInfo.uStaIdx;
+  halSetTDLSLinkEstablishParams.bIsResponder =
+                           pwdiTDLSLinkEstablishReqParams->wdiTDLSLinkEstablishInfo.uIsResponder;
+  halSetTDLSLinkEstablishParams.acVOUAPSDFlag =
+   (pwdiTDLSLinkEstablishReqParams->wdiTDLSLinkEstablishInfo.uUapsdQueues & 0x08) >> 3;
+  halSetTDLSLinkEstablishParams.acVIUAPSDFlag =
+   (pwdiTDLSLinkEstablishReqParams->wdiTDLSLinkEstablishInfo.uUapsdQueues & 0x04) >> 2;
+  halSetTDLSLinkEstablishParams.acBKUAPSDFlag =
+   (pwdiTDLSLinkEstablishReqParams->wdiTDLSLinkEstablishInfo.uUapsdQueues & 0x02) >> 1;
+  halSetTDLSLinkEstablishParams.acBEUAPSDFlag =
+   pwdiTDLSLinkEstablishReqParams->wdiTDLSLinkEstablishInfo.uUapsdQueues & 0x01;
+  halSetTDLSLinkEstablishParams.aAck = 0;
+  halSetTDLSLinkEstablishParams.maxServicePeriodLength = (pwdiTDLSLinkEstablishReqParams->wdiTDLSLinkEstablishInfo.uMaxSp & 0x03);
+  halSetTDLSLinkEstablishParams.moreDataAck = 0;
+  halSetTDLSLinkEstablishParams.TPUBufferStaSupport =  pwdiTDLSLinkEstablishReqParams->wdiTDLSLinkEstablishInfo.uIsBufSta;
+
+  wpalMemoryCopy( pSendBuffer+usDataOffset,
+                  &halSetTDLSLinkEstablishParams,
+                  sizeof(halSetTDLSLinkEstablishParams));
+
+  pWDICtx->wdiReqStatusCB     = pwdiTDLSLinkEstablishReqParams->wdiReqStatusCB;
+  pWDICtx->pReqStatusUserData = pwdiTDLSLinkEstablishReqParams->pUserData;
+
+  /*-------------------------------------------------------------------------
+    Send Update Probe Resp Template Request to HAL
+  -------------------------------------------------------------------------*/
+  return  WDI_SendMsg( pWDICtx, pSendBuffer, usSendSize,
+                       wdiTDLSLinkEstablishReqRspCb, pEventData->pUserData,
+                       WDI_TDLS_LINK_ESTABLISH_REQ_RESP);
+  return 0;
+}/*WDI_ProcessTdlsLinkEstablishReq*/
+
+
+#endif
+
 
 
 /**
@@ -17500,6 +17681,58 @@
 
   return WDI_STATUS_SUCCESS;
 }
+#ifdef FEATURE_WLAN_TDLS
+/**
+ @brief Process TDLS Link Establish Rsp function (called
+        when a response is being received over the bus from HAL)
+
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessLinkEstablishReqRsp
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+)
+{
+  WDI_Status       wdiStatus;
+  eHalStatus       halStatus;
+  WDI_SetTDLSLinkEstablishReqParamsRspCb   wdiTDLSLinkEstablishReqParamsRspCb;
+  /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+  /*-------------------------------------------------------------------------
+    Sanity check
+  -------------------------------------------------------------------------*/
+  if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+      ( NULL == pEventData->pEventData))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+                 "%s: Invalid parameters", __func__);
+     WDI_ASSERT(0);
+     return WDI_STATUS_E_FAILURE;
+  }
+
+  wdiTDLSLinkEstablishReqParamsRspCb = (WDI_SetTDLSLinkEstablishReqParamsRspCb)pWDICtx->pfncRspCB;
+
+  /*-------------------------------------------------------------------------
+    Extract response and send it to UMAC
+  -------------------------------------------------------------------------*/
+  wpalMemoryCopy( &halStatus,
+                  pEventData->pEventData,
+                  sizeof(halStatus));
+
+  wdiStatus   =   WDI_HAL_2_WDI_STATUS(halStatus);
+
+  /*Notify UMAC*/
+  wdiTDLSLinkEstablishReqParamsRspCb( wdiStatus, pWDICtx->pRspCBUserData);
+
+  return WDI_STATUS_SUCCESS;
+}/*WDI_ProcessLinkEstablishReqRsp*/
+#endif
 
 /**
  @brief Process P2P Group Owner Notice Of Absense Rsp function (called
@@ -19390,7 +19623,66 @@
 
   return WDI_STATUS_SUCCESS;
 }/*WDI_ProcessTxCompleteInd*/
+#ifdef FEATURE_WLAN_TDLS
+/**
+*@brief Process TDLS Indication function (called when
+        an indication of this kind is being received over the
+        bus from HAL)
 
+ @param  pWDICtx:         pointer to the WLAN DAL context
+         pEventData:      pointer to the event information structure
+
+ @see
+ @return Result of the function call
+*/
+WDI_Status
+WDI_ProcessTdlsInd
+(
+  WDI_ControlBlockType*  pWDICtx,
+  WDI_EventInfoType*     pEventData
+)
+{
+  WDI_LowLevelIndType  wdiInd;
+  tTdlsIndMsg       halTdlsIndMsg;
+  /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+  /*-------------------------------------------------------------------------
+  Sanity check
+ -------------------------------------------------------------------------*/
+  if (( NULL == pWDICtx ) || ( NULL == pEventData ) ||
+      ( NULL == pEventData->pEventData ))
+  {
+     WPAL_TRACE( eWLAN_MODULE_DAL_CTRL, eWLAN_PAL_TRACE_LEVEL_WARN,
+                 "%s: Invalid parameters", __func__);
+     WDI_ASSERT( 0 );
+     return WDI_STATUS_E_FAILURE;
+  }
+
+  /*-------------------------------------------------------------------------
+  Extract indication and send it to UMAC
+ -------------------------------------------------------------------------*/
+  wpalMemoryCopy( &halTdlsIndMsg.tdlsIndParams,
+                  pEventData->pEventData,
+                  sizeof(halTdlsIndMsg.tdlsIndParams) );
+
+  /*Fill in the indication parameters*/
+  wdiInd.wdiIndicationType = WDI_TDLS_IND;
+
+  wdiInd.wdiIndicationData.wdiTdlsIndInfo.status
+                          = halTdlsIndMsg.tdlsIndParams.status;
+
+  wdiInd.wdiIndicationData.wdiTdlsIndInfo.staIdx
+                          = halTdlsIndMsg.tdlsIndParams.staIdx;
+
+  wdiInd.wdiIndicationData.wdiTdlsIndInfo.reasonCode
+                          = halTdlsIndMsg.tdlsIndParams.reasonCode;
+
+  /*Notify UMAC*/
+  pWDICtx->wdiLowLevelIndCB( &wdiInd, pWDICtx->pIndUserData );
+
+  return WDI_STATUS_SUCCESS;
+}/*WDI_ProcessTdlsInd*/
+#endif
 /**
 *@brief Process Noa Start Indication function (called when
         an indication of this kind is being received over the
@@ -21727,6 +22019,10 @@
     return WLAN_HAL_SET_TX_POWER_REQ;
   case WDI_P2P_GO_NOTICE_OF_ABSENCE_REQ:
     return WLAN_HAL_SET_P2P_GONOA_REQ;
+#ifdef FEATURE_WLAN_TDLS
+  case WDI_TDLS_LINK_ESTABLISH_REQ:
+    return WLAN_HAL_TDLS_LINK_ESTABLISHED_REQ;
+#endif
   case WDI_ENTER_IMPS_REQ:
     return WLAN_HAL_ENTER_IMPS_REQ;
   case WDI_EXIT_IMPS_REQ:
@@ -21956,6 +22252,12 @@
     return WDI_SET_TX_POWER_RESP;
   case WLAN_HAL_SET_P2P_GONOA_RSP:
     return WDI_P2P_GO_NOTICE_OF_ABSENCE_RESP;
+#ifdef FEATURE_WLAN_TDLS
+  case WLAN_HAL_TDLS_LINK_ESTABLISHED_RSP:
+    return WDI_TDLS_LINK_ESTABLISH_REQ_RESP;
+  case WLAN_HAL_TDLS_IND:
+    return WDI_HAL_TDLS_IND;
+#endif
   case WLAN_HAL_ENTER_IMPS_RSP:
     return WDI_ENTER_IMPS_RESP;
   case WLAN_HAL_EXIT_IMPS_RSP:
diff --git a/CORE/WDI/CP/src/wlan_qct_wdi_dp.c b/CORE/WDI/CP/src/wlan_qct_wdi_dp.c
index a7e8ef5..3a53c48 100644
--- a/CORE/WDI/CP/src/wlan_qct_wdi_dp.c
+++ b/CORE/WDI/CP/src/wlan_qct_wdi_dp.c
@@ -924,16 +924,19 @@
             return VOS_STATUS_E_FAILURE;
         } */
 #ifdef WLAN_SOFTAP_VSTA_FEATURE
-       // if this is a Virtual Station then change the DPU Routing Flag so
+       // if this is a Virtual Station or statype is TDLS and trig enabled mask
+       // set then change the DPU Routing Flag so
        // that the frame will be routed to Firmware for queuing & transmit
-       if (IS_VSTA_IDX(ucStaId))
+       if (IS_VSTA_IDX(ucStaId) ||
+                 ((ucSTAType == WDI_STA_ENTRY_TDLS_PEER ) &&
+                  (ucTxFlag & WDI_TRIGGER_ENABLED_AC_MASK)))
        {
            pBd->dpuRF = BMUWQ_FW_DPU_TX;
        }
 #endif
 
-    } 
-    
+    }
+
     /*------------------------------------------------------------------------
        Over SDIO bus, SIF won't swap data bytes to/from data FIFO. 
        In order for MAC modules to recognize BD in Riva's default endian
@@ -947,7 +950,7 @@
        byte order */
     pBd->txBdSignature = uTxBdSignature ;
 #endif        
-    
+
     return wdiStatus;
 }/*WDI_FillTxBd*/
 
@@ -1032,10 +1035,10 @@
 /**
  @brief WDI_RxAmsduBdFix - fix for HW issue for AMSDU 
 
-  
+
  @param   pWDICtx:       Context to the WDI
           pBDHeader - pointer to the BD header
-  
+
  @return None
 */
 void 
diff --git a/firmware_bin/WCNSS_cfg.dat b/firmware_bin/WCNSS_cfg.dat
index a5ee46c..6e64517 100644
--- a/firmware_bin/WCNSS_cfg.dat
+++ b/firmware_bin/WCNSS_cfg.dat
Binary files differ
diff --git a/riva/inc/wlan_hal_cfg.h b/riva/inc/wlan_hal_cfg.h
index c9a319c..4b45abb 100644
--- a/riva/inc/wlan_hal_cfg.h
+++ b/riva/inc/wlan_hal_cfg.h
@@ -1,24 +1,23 @@
 /*
- * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
- *
- * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
- *
- *
- * Permission to use, copy, modify, and/or distribute this software for
- * any purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
+  * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
+  *
+  * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
+  *
+  *
+  * Permission to use, copy, modify, and/or distribute this software for
+  * any purpose with or without fee is hereby granted, provided that the
+  * above copyright notice and this permission notice appear in all
+  * copies.
+  *
+  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+  * PERFORMANCE OF THIS SOFTWARE.
+*/
 /*==========================================================================
  *
  *  @file:     wlan_hal_cfg.h
@@ -156,7 +155,11 @@
 #define QWLAN_HAL_CFG_AP_LINK_MONITOR_TIMEOUT           102
 #define QWLAN_HAL_CFG_BTC_DWELL_TIME_MULTIPLIER         103
 #define QWLAN_HAL_CFG_ENABLE_TDLS_OXYGEN_MODE           104
-#define QWLAN_HAL_CFG_MAX_PARAMS                        105
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_BUFFER_STA_CAPABLE    108
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_MASK                  109
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_INACTIVITY_TIME       110
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_IN_SP 111
+#define QWLAN_HAL_CFG_MAX_PARAMS                        112
 
 
 
@@ -757,6 +760,27 @@
 #define QWLAN_HAL_CFG_BTC_DWELL_TIME_MULTIPLIER_MAX    300
 #define QWLAN_HAL_CFG_BTC_DWELL_TIME_MULTIPLIER_DEF    300
 
+/* QWLAN_HAL_CFG_TDLS_PUAPSD_BUFFER_STA_CAPABLE */
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_BUFFER_STA_CAPABLE_MIN    0
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_BUFFER_STA_CAPABLE_MAX    1
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_BUFFER_STA_CAPABLE_DEF    0
+
+/* QWLAN_HAL_CFG_TDLS_PUAPSD_MASK */
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_MASK_MIN    0
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_MASK_MAX    0xf
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_MASK_DEF    0
+
+/* QWLAN_HAL_CFG_TDLS_PUAPSD_INACTIVITY_TIME */
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_INACTIVITY_TIME_MIN    0
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_INACTIVITY_TIME_MAX    10
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_INACTIVITY_TIME_DEF    0
+
+/* QWLAN_HAL_CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_IN_SP */
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_IN_SP_MIN    10
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_IN_SP_MAX    20
+#define QWLAN_HAL_CFG_TDLS_PUAPSD_RX_FRAME_THRESHOLD_IN_SP_DEF    10
+
+
 #endif //__WLAN_HAL_CFG_H__
 
 
diff --git a/riva/inc/wlan_hal_msg.h b/riva/inc/wlan_hal_msg.h
index 5878a2b..08503e5 100644
--- a/riva/inc/wlan_hal_msg.h
+++ b/riva/inc/wlan_hal_msg.h
@@ -376,6 +376,12 @@
    WLAN_ROAM_SCAN_OFFLOAD_RSP               = 192,
    WLAN_HAL_WIFI_PROXIMITY_REQ              = 193,
    WLAN_HAL_WIFI_PROXIMITY_RSP              = 194,
+   WLAN_HAL_TDLS_LINK_ESTABLISHED_REQ       = 198,
+   WLAN_HAL_TDLS_LINK_ESTABLISHED_RSP       = 199,
+   WLAN_HAL_TDLS_LINK_TEARDOWN_REQ          = 200,
+   WLAN_HAL_TDLS_LINK_TEARDOWN_RSP          = 201,
+   WLAN_HAL_TDLS_IND                        = 202,
+
   WLAN_HAL_MSG_MAX = WLAN_HAL_MSG_TYPE_MAX_ENUM_SIZE
 }tHalHostMsgType;
 
@@ -5994,6 +6000,110 @@
 }  tSetWifiProximityRspMsg, *tpSetWifiProxmityRspMsg;
 
 #endif
+#ifdef FEATURE_WLAN_TDLS
+/*---------------------------------------------------------------------------
+ * WLAN_HAL_TDLS_LINK_ESTABLISHED_REQ
+ *-------------------------------------------------------------------------*/
+typedef PACKED_PRE struct PACKED_POST
+{
+    /*STA Index*/
+    tANI_U16        staIdx;
+
+    /* if this is 1, self is initiator and peer is reponder */
+    tANI_U8                bIsResponder;
+
+    /* QoS Info */
+    tANI_U8        acVOUAPSDFlag:1;
+    tANI_U8        acVIUAPSDFlag:1;
+    tANI_U8        acBKUAPSDFlag:1;
+    tANI_U8        acBEUAPSDFlag:1;
+    tANI_U8        aAck:1;
+    tANI_U8        maxServicePeriodLength:2;
+    tANI_U8        moreDataAck:1;
+
+    /*TDLS Peer U-APSD Buffer STA Support*/
+    tANI_U8        TPUBufferStaSupport;
+
+}tTDLSLinkEstablishedType, *tpTDLSLinkEstablishedType;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    tHalMsgHeader               header;
+    tTDLSLinkEstablishedType    tdlsLinkEstablishedParams;
+} tTDLSLinkEstablishedReqMsg, *tpTDLSLinkEstablishedReqMsg;
+
+/*---------------------------------------------------------------------------
+ * WLAN_HAL_TDLS_LINK_ESTABLISHED_RSP
+ *-------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    tANI_U32   status;
+
+    /*STA Index*/
+    tANI_U16        staIdx;
+} tTDLSLinkEstablishedResp, *tpTDLSLinkEstablishedResp;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    tHalMsgHeader header;
+    tTDLSLinkEstablishedResp TDLSLinkEstablishedRespParams;
+}  tTDLSLinkEstablishedRespMsg,  *tpTDLSLinkEstablishedRespMsg;
+
+/*---------------------------------------------------------------------------
+ * WLAN_HAL_TDLS_LINK_TEARDOWN_REQ
+ *-------------------------------------------------------------------------*/
+typedef PACKED_PRE struct PACKED_POST
+{
+    /*STA Index*/
+    tANI_U16        staIdx;
+}tTDLSLinkTeardownType, *tpTDLSLinkTeardownType;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    tHalMsgHeader               header;
+    tTDLSLinkTeardownType    tdlsLinkTeardownParams;
+} tTDLSLinkTeardownReqMsg, *tpTDLSLinkTeardownReqMsg;
+
+/*---------------------------------------------------------------------------
+ * WLAN_HAL_TDLS_LINK_TEARDOWN_RSP
+ *-------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    tANI_U32   status;
+
+    /*STA Index*/
+    tANI_U16        staIdx;
+} tTDLSLinkTeardownResp, *tpTDLSLinkTeardownResp;
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    tHalMsgHeader header;
+    tTDLSLinkTeardownResp TDLSLinkTeardownRespParams;
+}  tTDLSLinkTeardownRespMsg,  *tpTDLSLinkTeardownRespMsg;
+
+/*---------------------------------------------------------------------------
+ *WLAN_HAL_TDLS_IND
+ *--------------------------------------------------------------------------*/
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    tANI_U16    assocId;
+    tANI_U16    staIdx;
+    tANI_U16    status;
+    tANI_U16    reasonCode;
+}tTdlsIndParams, *tpTdlsIndParams;
+
+
+typedef PACKED_PRE struct PACKED_POST
+{
+    tHalMsgHeader header;
+    tTdlsIndParams tdlsIndParams;
+}tTdlsIndMsg, *tpTdlsIndMsg;
+
+#endif
+
 #if defined(__ANI_COMPILER_PRAGMA_PACK_STACK)
 #pragma pack(pop)
 #elif defined(__ANI_COMPILER_PRAGMA_PACK)